driver: rm data validation

- Data validation is done on Kirdy Server side
- Thus, remove duplicated logic
- Merge send_cmd and send_raw_cmd
This commit is contained in:
linuswck 2025-01-20 15:34:27 +08:00
parent cd3347798c
commit 76a19cb65a

View File

@ -20,6 +20,9 @@ class State(StrEnum):
connected = "connected" connected = "connected"
class CmdList: class CmdList:
class tec_set_i(StrEnum, settings=NoAlias):
_target = "tec_set_i"
tec_set_i = _dt.f32
class device(StrEnum, settings=NoAlias): class device(StrEnum, settings=NoAlias):
_target = "device_cmd" _target = "device_cmd"
SetIPSettings = _dt.ip_settings SetIPSettings = _dt.ip_settings
@ -168,17 +171,13 @@ class FilterConfig:
def _filter_type(self): def _filter_type(self):
return "Sinc3WithFineODR" return "Sinc3WithFineODR"
class InvalidDataType(Exception):
pass
class InvalidCmd(Exception): class InvalidCmd(Exception):
pass pass
class Device: class Device:
def __init__(self, send_cmd_handler, send_raw_cmd_handler): def __init__(self, send_cmd_handler):
self._cmd = CmdList.device self._cmd = CmdList.device
self._send_cmd = send_cmd_handler self._send_cmd = send_cmd_handler
self._send_raw_cmd = send_raw_cmd_handler
async def set_ip_settings(self, addr="192.168.1.128", port=1550, prefix_len=24, gateway="192.168.1.1"): async def set_ip_settings(self, addr="192.168.1.128", port=1550, prefix_len=24, gateway="192.168.1.1"):
""" """
@ -196,15 +195,14 @@ class Device:
if not(isinstance(port, int) and isinstance(prefix_len, int)): if not(isinstance(port, int) and isinstance(prefix_len, int)):
raise InvalidDataType raise InvalidDataType
return await self._send_raw_cmd( return await self._send_cmd(
self._cmd._target,
self._cmd.SetIPSettings,
{ {
"device_cmd": "SetIPSettings", "addr": [int(x) for x in addr],
"ip_settings": { "port": port,
"addr": [int(x) for x in addr], "prefix_len": prefix_len,
"port": port, "gateway": [int(x) for x in gateway],
"prefix_len": prefix_len,
"gateway": [int(x) for x in gateway],
}
} }
) )
@ -454,10 +452,10 @@ class Laser:
return await self._send_cmd(self._cmd._target, self._cmd.ClearAlarm) return await self._send_cmd(self._cmd._target, self._cmd.ClearAlarm)
class Thermostat: class Thermostat:
def __init__(self, send_cmd_handler, send_raw_cmd_handler): def __init__(self, send_cmd_handler):
self._cmd = CmdList.thermostat self._cmd = CmdList.thermostat
self.tec_set_i_cmd = CmdList.tec_set_i
self._send_cmd = send_cmd_handler self._send_cmd = send_cmd_handler
self._send_raw_cmd = send_raw_cmd_handler
async def set_power_on(self, on): async def set_power_on(self, on):
""" """
@ -504,12 +502,7 @@ class Thermostat:
or your newly set value will be overwritten by PID Controller Output or your newly set value will be overwritten by PID Controller Output
- i_out: A - i_out: A
""" """
if isinstance(i_out, float): await self._send_cmd(self.tec_set_i_cmd._target, self.tec_set_i_cmd.tec_set_i, i_out)
return await self._send_raw_cmd({"tec_set_i": i_out})
elif isinstance(i_out, int):
return await self._send_raw_cmd({"tec_set_i": float(i_out)})
else:
raise InvalidDataType
async def set_constant_current_control_mode(self): async def set_constant_current_control_mode(self):
""" """
@ -618,29 +611,33 @@ class Thermostat:
performs differently under different kinds of workload. Please verify the polling rate with performs differently under different kinds of workload. Please verify the polling rate with
the timestamp. the timestamp.
""" """
cmd = {}
cmd[self._cmd._target] = self._cmd.ConfigTempAdcFilter.name
if hasattr(filter_config, 'rate'): if hasattr(filter_config, 'rate'):
cmd[self._cmd.ConfigTempAdcFilter] = { return await self._send_cmd(
"filter_type": filter_config._filter_type(), self._cmd._target,
filter_config._odr_type: filter_config.rate, self._cmd.ConfigTempAdcFilter,
} {
"filter_type": filter_config._filter_type(),
filter_config._odr_type: filter_config.rate,
}
)
else: else:
cmd[self._cmd.ConfigTempAdcFilter] = { return await self._send_cmd(
"filter_type": filter_config._filter_type(), self._cmd._target,
filter_config._odr_type: filter_config, self._cmd.ConfigTempAdcFilter,
} {
"filter_type": filter_config._filter_type(),
return await self._send_raw_cmd(cmd) filter_config._odr_type: filter_config,
}
)
async def get_poll_interval(self): async def get_poll_interval(self):
return await self._send_cmd(self._cmd._target, self._cmd.GetPollInterval, msg_type="Interval") return await self._send_cmd(self._cmd._target, self._cmd.GetPollInterval, msg_type="Interval")
class Kirdy: class Kirdy:
def __init__(self): def __init__(self):
self.device = Device(self._send_cmd, self._send_raw_cmd) self.device = Device(self._send_cmd)
self.laser = Laser(self._send_cmd) self.laser = Laser(self._send_cmd)
self.thermostat = Thermostat(self._send_cmd, self._send_raw_cmd) self.thermostat = Thermostat(self._send_cmd)
self.hw_rev = None self.hw_rev = None
self._task_queue, self._int_msg_queue, self._report_queue = None, None, None self._task_queue, self._int_msg_queue, self._report_queue = None, None, None
@ -902,32 +899,19 @@ class Kirdy:
self._err_msg_sig.emit(msg['msg']) self._err_msg_sig.emit(msg['msg'])
return msg return msg
async def _send_raw_cmd(self, cmd, msg_type="Acknowledge", sig=None):
if self.connected():
async with self._lock:
self._writer.write(bytes(json.dumps(cmd), "UTF-8"))
await self._writer.drain()
msg = await asyncio.wait_for(self._int_msg_queue.get(), self._timeout)
return self._response_handling(msg, msg_type, sig)
else:
raise ConnectionError
async def _send_cmd(self, target, cmd, data=None, msg_type="Acknowledge", sig=None): async def _send_cmd(self, target, cmd, data=None, msg_type="Acknowledge", sig=None):
cmd_dict = {} cmd_dict = {}
cmd_dict[target] = cmd.name
if cmd == _dt.f32: if target == "tec_set_i":
if isinstance(data, float): cmd_dict[target] = float(data)
else:
cmd_dict[target] = cmd.name
if cmd != 'None':
if cmd == _dt.bool:
data = bool(data)
elif isinstance(data, int):
data = float(data)
cmd_dict[cmd] = data cmd_dict[cmd] = data
elif isinstance(data, int):
cmd_dict[cmd] = float(data)
elif cmd == _dt.bool:
if isinstance(data, bool):
cmd_dict[cmd] = data
else:
raise InvalidDataType
elif cmd == "None":
pass
if msg_type == 'Report': if msg_type == 'Report':
self._msg_queue_get_report = True self._msg_queue_get_report = True