@@ -63,10 +63,9 @@ class Orbiter(AsyncComm):
6363
6464 HEADER :Final [bytes ] = b'\xFF \xFF '
6565 EVENT :Final [bytes ] = b'\x00 '
66- CMD_INIT :Final [bytes ] = b'\x01 '
6766 CMD_SYNC :Final [bytes ] = b'\x00 '
6867
69- __slots__ = [ 'send_timeout' , '_connected' , '_new_readings_available ' , '_BT' , '_ET' , '_IT' , '_DT' , '_air' , '_drum' , '_damper' ,
68+ __slots__ = [ 'send_timeout' , '_connected' , '_ACK_received ' , '_BT' , '_ET' , '_IT' , '_DT' , '_air' , '_drum' , '_damper' ,
7069 '_heater' , '_sound' , '_RoR' , '_master_control' , '_SERIAL' , '_FW_VERSION' , '_PCB_VERSION' , '_DASHBOARD_STATUS' , '_MODEL' , '_MODEL_NUM' ,
7170 'isRoaster_Roasting' ]
7271
@@ -82,7 +81,7 @@ def __init__(self, serial:'SerialSettings',
8281
8382 # current readings
8483 self ._connected :int = 0 # connection status (0:disconnected, 1:connected)
85- self ._new_readings_available :asyncio .Event = asyncio .Event ()
84+ self ._ACK_received :asyncio .Event = asyncio .Event ()
8685 #-
8786 self ._BT :float = - 1 # bean temperature
8887 self ._ET :float = - 1 # environmental temperature
@@ -116,9 +115,8 @@ def setLogging(self, b:bool) -> None:
116115 # getBT triggers fetching a complete set of new readings
117116 # time is the preheat/roasting/cooling time in seconds send along the sync command to the machine
118117 def getBT (self , time :int = 0 ) -> float :
119- if not self ._new_readings_available .is_set ():
118+ if not self ._ACK_received .is_set (): # only send if no sync command is currently send
120119 self .send_sync_await (time )
121- self ._new_readings_available .clear ()
122120 return self ._BT
123121 def getET (self ) -> float :
124122 return self ._ET
@@ -178,7 +176,7 @@ async def read_msg(self, stream: asyncio.StreamReader|IteratorReader) -> None:
178176 # check for the second header byte
179177 if await stream .readexactly (1 ) == self .HEADER [1 :2 ]:
180178 cmd = await stream .readexactly (1 )
181- if cmd [0 ] == 0 : # sync data (total 28 bytes)
179+ if cmd [0 ] == 0 : # sync data ACK (total 28 bytes)
182180 if self ._logging :
183181 _log .debug ('Orbiter CMD sync data' )
184182 data = await stream .readexactly (25 )
@@ -207,7 +205,7 @@ async def read_msg(self, stream: asyncio.StreamReader|IteratorReader) -> None:
207205 self ._damper = data [21 ]
208206 self ._sound = data [22 ]
209207 self ._master_control = data [23 ]
210- self ._new_readings_available .set ()
208+ self ._ACK_received .set ()
211209 else :
212210 _log .debug ('Orbiter CRC failed: %s != %s' , compute_crc (cmd [0 :1 ] + data [:24 ]), data [24 ])
213211 except Exception as e : # pylint: disable=broad-except
@@ -237,6 +235,7 @@ async def read_msg(self, stream: asyncio.StreamReader|IteratorReader) -> None:
237235 _log .debug ('Orbiter MODEL_NUM: %s' , self ._MODEL_NUM )
238236 _log .debug ('Orbiter _sound: %s' , self ._sound )
239237 _log .debug ('Orbiter _master_control: %s' , self ._master_control )
238+ self ._ACK_received .set ()
240239 else :
241240 _log .debug ('Orbiter CRC failed: %s != %s' , compute_crc (cmd [0 :1 ] + data [:24 ]), data [24 ])
242241 except Exception as e : # pylint: disable=broad-except
@@ -257,24 +256,15 @@ def create_msg(self, cmd:bytes, data:bytes, param:bytes, time:int) -> bytes:
257256 return self .HEADER + payload + crc .to_bytes (1 , 'little' )
258257
259258 # data byte order: LSB last (little-endian); eg. data=b'\x07\x00' equals 7
260- def send_msg (self , cmd :bytes , data :bytes = b'\x00 \x00 ' , param :bytes = b'\x00 ' , time :int = 0 ) -> None :
261- # send via socket
262- self .send (self .create_msg (cmd , data , param , time ))
263-
264- def send_msg_await (self , event :asyncio .Event , timeout :float , cmd :bytes , data :bytes = b'\x00 \x00 ' , param :bytes = b'\x00 ' , time :int = 0 ) -> None :
265- # send via socket
266- self .send_await (self .create_msg (cmd , data , param , time ), event , timeout )
259+ def send_msg_await (self , cmd :bytes , data :bytes = b'\x00 \x00 ' , param :bytes = b'\x00 ' , time :int = 0 ) -> None :
260+ # send via socket using a request/response pattern (serialize=True) awaiting a response that sets the _ACK_received event
261+ # ensuring a 100ms delay between those request/response pairs
262+ self .send_await (self .create_msg (cmd , data , param , time ), self ._ACK_received , self .send_timeout , serialize = True , delay = 0.1 )
267263
268264 #
269265
270- def send_init (self ) -> None :
271- self .send_msg (self .CMD_INIT )
272-
273- def send_sync (self ) -> None :
274- self .send_msg (self .CMD_SYNC )
275-
276266 def send_sync_await (self , time :int ) -> None :
277- self .send_msg_await (self ._new_readings_available , self . send_timeout , self . CMD_SYNC , time = time )
267+ self .send_msg_await (self .CMD_SYNC , time = time )
278268
279269 #
280270
@@ -672,7 +662,7 @@ def main() -> None:
672662 for _ in range (4 ):
673663 print ('>>> hallo' )
674664 val :int = 7
675- orbiter .send_msg (b'\x0D ' , val .to_bytes (2 , 'little' )) # set power to 7
665+ orbiter .send_msg_await (b'\x0D ' , val .to_bytes (2 , 'little' )) # set power to 7
676666 time .sleep (1 )
677667 print ('BT' , orbiter .getBT ())
678668 time .sleep (1 )
0 commit comments