93 lines
2.8 KiB
Python
93 lines
2.8 KiB
Python
import serial, struct
|
|
from glob import glob
|
|
|
|
port = serial.Serial(port=glob("/dev/serial/by-id/usb-Arduino_LLC_Arduino_Zero_*-if00")[0], baudrate=115200)
|
|
|
|
port.write(b"c")
|
|
config_info = {val.split(b":")[0] : int(val.split(b":")[1]) for val in port.read_until(b"END\r\n").split(b"\r\n")[:-2]}
|
|
mn_config_size = config_info[b"MNConfiguration"]
|
|
mn_cfgmem_size = config_info[b"CFGMEM"]
|
|
n_devices = config_info[b"N_DEVICES"]
|
|
mn_device_size = config_info[b"Device"]
|
|
mn_analog_input_size = config_info[b"AnalogInput"]
|
|
|
|
print(config_info)
|
|
port.write(b"r")
|
|
config = port.read(mn_config_size)
|
|
print(config)
|
|
port.write(b"R")
|
|
cfgmem = port.read(mn_cfgmem_size)
|
|
print(cfgmem)
|
|
|
|
modem_frequency = struct.unpack("<f", config[0:4])[0]
|
|
modem_power = config[4]
|
|
|
|
client_address = int.from_bytes(config[5:7], byteorder="little")
|
|
server_address = int.from_bytes(config[7:9], byteorder="little")
|
|
|
|
sensor_update_interval = int.from_bytes(config[9:13], byteorder="little")
|
|
device_update_interval = int.from_bytes(config[13:17], byteorder="little")
|
|
jitter = int.from_bytes(config[17:21], byteorder="little")
|
|
pointers = list(config[21 : 21 + n_devices])
|
|
|
|
modem_frequency = 868.0
|
|
modem_power = 0
|
|
client_address = 0x1234
|
|
server_address = 0x0001
|
|
|
|
# In ms
|
|
sensor_update_interval = 3000
|
|
device_update_interval = 7000
|
|
jitter = 1000
|
|
|
|
|
|
def pack_device():
|
|
data = struct.pack("<bbb", 0, 0xFF, 0xFF)
|
|
assert len(data) == mn_device_size
|
|
return data
|
|
|
|
def pack_analog_input(sensor_type, pin, min_threshold, max_threshold, multiplier, offset, is_current):
|
|
data = struct.pack("<bbbffff?", 1, sensor_type, pin, min_threshold, max_threshold, multiplier, offset, is_current)
|
|
assert len(data) == mn_analog_input_size
|
|
return data
|
|
|
|
|
|
cfgmem = list(cfgmem)
|
|
|
|
cfgmem_pointer = 0x0
|
|
pointer_counter = 0
|
|
|
|
def add_to_config(entry):
|
|
global cfgmem_pointer, pointer_counter
|
|
cfgmem[cfgmem_pointer : cfgmem_pointer + len(entry)] = entry
|
|
pointers[pointer_counter] = cfgmem_pointer
|
|
cfgmem_pointer += len(entry)
|
|
pointer_counter += 1
|
|
assert cfgmem_pointer < 256
|
|
|
|
add_to_config(pack_analog_input(1, 15, -1000, 1000, 1, 0, False))
|
|
add_to_config(pack_analog_input(2, 16, 3.8, 20.5, 1, 0, True))
|
|
|
|
config = list(config)
|
|
|
|
config[0:4] = struct.pack("<f", modem_frequency)
|
|
config[4] = modem_power
|
|
config[5:7] = int.to_bytes(client_address, 2, byteorder="little")
|
|
config[7:9] = int.to_bytes(server_address, 2, byteorder="little")
|
|
config[9:13] = int.to_bytes(sensor_update_interval, 4, byteorder="little")
|
|
config[13:17] = int.to_bytes(device_update_interval, 4, byteorder="little")
|
|
config[17:21] = int.to_bytes(jitter, 4, byteorder="little")
|
|
config[21 : 21 + n_devices] = pointers
|
|
|
|
port.write(b"W")
|
|
port.write(bytearray(cfgmem))
|
|
|
|
port.write(b"w")
|
|
port.write(bytearray(config))
|
|
|
|
server_key = 0x2e29b257521dc792
|
|
client_key = 0x0#0x7ed64cce5b5d8e85
|
|
port.write(b"k")
|
|
port.write(struct.pack("<QQ", client_key, server_key))
|
|
|
|
#port.write(b"s") |