netmon-multinode/MultiNode/Configurator.py
2022-04-24 14:54:40 +02:00

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")