Skip to content

Commit 4fbd036

Browse files
chore: more flexible interface
1 parent feefcfd commit 4fbd036

File tree

1 file changed

+22
-17
lines changed

1 file changed

+22
-17
lines changed

adam_modbus/interface.py

Lines changed: 22 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,14 @@ class AdamConnectionError(RuntimeError):
99
pass
1010

1111

12-
ADAM_PORT = 1025
12+
DEFAULT_ADAM_PORT = 1025
1313
ADAM_CONNECTION_TIMEOUT = 0.1
1414

1515

1616
@asynccontextmanager
1717
async 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

5658
async 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

Comments
 (0)