diff options
| author | Christian Kolset <ckolset@colostate.edu> | 2026-07-27 17:34:30 -0600 |
|---|---|---|
| committer | Christian Kolset <ckolset@colostate.edu> | 2026-07-27 17:34:30 -0600 |
| commit | ee4965f4d4d1fc5d40be24b99341620e32386d40 (patch) | |
| tree | 0dbafaa8aee899895b974ade9c9a2c7b66918701 /api_layers/protocols/cml.py | |
| parent | c3f07a7ffa320aecb3fca5dd40e7644424bddfb5 (diff) | |
Enhance protocol layers: implement I/O locking for thread safety in serial communication
Diffstat (limited to 'api_layers/protocols/cml.py')
| -rw-r--r-- | api_layers/protocols/cml.py | 12 |
1 files changed, 8 insertions, 4 deletions
diff --git a/api_layers/protocols/cml.py b/api_layers/protocols/cml.py index 67be0d5..6bc85f0 100644 --- a/api_layers/protocols/cml.py +++ b/api_layers/protocols/cml.py @@ -73,9 +73,10 @@ class CMLLayer(BaseProtocol): frame = f"{cmd}\r".encode() else: frame = f"#{motor.address}{cmd}\r".encode() - self._ser.write(frame) - self._ser.flush() - resp = self._ser.readline().decode(errors="replace").strip() + with self._io_lock: + self._ser.write(frame) + self._ser.flush() + resp = self._ser.readline().decode(errors="replace").strip() return _parse_cml_response(resp) def _poll(self) -> Dict[str, float]: @@ -127,7 +128,10 @@ class CMLLayer(BaseProtocol): frame = f"{cmd}{data}\r".encode() else: frame = f"#{motor.address}{cmd}{data}\r".encode() - self._ser.write(frame) + with self._io_lock: + self._ser.write(frame) + self._ser.flush() + self._ser.readline() # discard echo-back so it doesn't desync the next poll read return True except Exception: return False |
