@@ -9,13 +9,14 @@ class AdamConnectionError(RuntimeError):
99 pass
1010
1111
12- ADAM_PORT = 1025
12+ DEFAULT_ADAM_PORT = 1025
1313ADAM_CONNECTION_TIMEOUT = 0.1
1414
1515
1616@asynccontextmanager
1717async def adam_socket_context (
1818 ip : str ,
19+ port : int = DEFAULT_ADAM_PORT ,
1920) -> AsyncIterator [socket .socket ]:
2021 adam_sock = socket .socket (socket .AF_INET , socket .SOCK_DGRAM )
2122
@@ -26,35 +27,39 @@ async def adam_socket_context(
2627 adam_sock .setblocking (False )
2728
2829 try :
29- await loop .sock_connect (adam_sock , (ip , ADAM_PORT ))
30+ await loop .sock_connect (adam_sock , (ip , port ))
3031 yield adam_sock
3132
32- # TODO: are these right now that this is async?
33- except (TimeoutError , OSError , asyncio .TimeoutError ):
33+ except OSError :
3434 raise AdamConnectionError (f"Could not connect to ADAM at { ip } " )
3535
3636 finally :
3737 adam_sock .close ()
3838
3939
40- async def _adam_send_and_receive (message : str , ip : str ) -> str :
41- async with adam_socket_context (ip ) as adam_socket :
42- loop = asyncio .get_running_loop ()
40+ async def _adam_send_and_receive (message : str , adam_socket : socket .socket ) -> str :
41+ loop = asyncio .get_running_loop ()
4342
43+ try :
4444 await asyncio .wait_for (
4545 loop .sock_sendall (adam_socket , message .encode ("ascii" )),
4646 ADAM_CONNECTION_TIMEOUT ,
4747 )
4848 adam_out = await asyncio .wait_for (
4949 loop .sock_recv (adam_socket , 100 ), ADAM_CONNECTION_TIMEOUT
5050 )
51+ except asyncio .TimeoutError :
52+ raise AdamConnectionError ("ADAM connection timed out" )
5153
52- response = adam_out .decode ().strip ()
53- return response
54+ response = adam_out .decode ().strip ()
55+ return response
5456
5557
5658async def set_adam_digital_out (
57- ip : str , model : Literal ["6052" ] | Literal ["6317" ], pin : int , value : bool
59+ socket : socket .socket ,
60+ model : Literal ["6052" ] | Literal ["6317" ],
61+ pin : int ,
62+ value : bool ,
5863) -> None :
5964 if model == "6052" :
6065 command = f"#011{ pin :x} 0{ int (value )} \r "
@@ -63,20 +68,20 @@ async def set_adam_digital_out(
6368 else :
6469 assert_never (model )
6570
66- response = await _adam_send_and_receive (command , ip )
71+ response = await _adam_send_and_receive (command , socket )
6772 assert response [:3 ] == ">01" , response [:3 ]
6873
6974
70- async def get_adam_digital_inputs (ip : str ) -> list [bool ]:
71- response = await _adam_send_and_receive ("$016\r " , ip )
75+ async def get_adam_digital_inputs (socket : socket . socket ) -> list [bool ]:
76+ response = await _adam_send_and_receive ("$016\r " , socket )
7277 assert response [:3 ] == "!01" , f"Unexpected response: { response } "
7378
7479 binary_string = "" .join (f"{ int (char , 16 ):0>4b} " for char in response [3 :])
7580 return [char == "1" for char in binary_string ][::- 1 ]
7681
7782
78- async def get_adam_analog_inputs (ip : str ) -> list [float ]:
79- response = await _adam_send_and_receive ("#01\r " , ip )
83+ async def get_adam_analog_inputs (socket : socket . socket ) -> list [float ]:
84+ response = await _adam_send_and_receive ("#01\r " , socket )
8085
8186 assert response [:3 ] == ">01" , response
8287 response_data = response [3 :]
@@ -89,8 +94,8 @@ async def get_adam_analog_inputs(ip: str) -> list[float]:
8994 ]
9095
9196
92- async def get_adam_model (ip : str ) -> str :
93- response = await _adam_send_and_receive ("$01M\r " , ip )
97+ async def get_adam_model (socket : socket . socket ) -> str :
98+ response = await _adam_send_and_receive ("$01M\r " , socket )
9499
95100 assert response [:3 ] == "!01" , f"Unexpected response: { response } "
96101
0 commit comments