summaryrefslogtreecommitdiff
path: root/api_layers/protocols/cml.py
diff options
context:
space:
mode:
authorChristian Kolset <ckolset@colostate.edu>2026-07-27 17:34:30 -0600
committerChristian Kolset <ckolset@colostate.edu>2026-07-27 17:34:30 -0600
commitee4965f4d4d1fc5d40be24b99341620e32386d40 (patch)
tree0dbafaa8aee899895b974ade9c9a2c7b66918701 /api_layers/protocols/cml.py
parentc3f07a7ffa320aecb3fca5dd40e7644424bddfb5 (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.py12
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