Skip to content

Commit d2637d7

Browse files
authored
Merge pull request #97 from BiffoBear/shorter_socket_exit_timeout
Shorter socket exit timeout
2 parents 6581863 + b7c12e9 commit d2637d7

File tree

2 files changed

+28
-15
lines changed

2 files changed

+28
-15
lines changed

adafruit_wiznet5k/adafruit_wiznet5k.py

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -107,9 +107,9 @@
107107

108108
# Socket n Interrupt Register
109109
_SNIR_SEND_OK = const(0x10)
110-
_SNIR_TIMEOUT = const(0x08)
110+
SNIR_TIMEOUT = const(0x08)
111111
_SNIR_RECV = const(0x04)
112-
_SNIR_DISCON = const(0x02)
112+
SNIR_DISCON = const(0x02)
113113
_SNIR_CON = const(0x01)
114114

115115
_CH_SIZE = const(0x100)
@@ -883,7 +883,7 @@ def socket_open(self, socket_num: int, conn_mode: int = _SNMR_TCP) -> int:
883883
time.sleep(0.00025)
884884

885885
self._write_snmr(socket_num, conn_mode)
886-
self._write_snir(socket_num, 0xFF)
886+
self.write_snir(socket_num, 0xFF)
887887

888888
if self.src_port > 0:
889889
# write to socket source port
@@ -1104,7 +1104,7 @@ def socket_write(
11041104
return 0
11051105
time.sleep(0.01)
11061106

1107-
self._write_snir(socket_num, _SNIR_SEND_OK)
1107+
self.write_snir(socket_num, _SNIR_SEND_OK)
11081108
return ret
11091109

11101110
# Socket-Register Methods
@@ -1170,11 +1170,15 @@ def _read_snsr(self, sock: int) -> Optional[bytearray]:
11701170
"""Read Socket n Status Register."""
11711171
return self._read_socket(sock, _REG_SNSR)
11721172

1173+
def read_snir(self, sock: int) -> Optional[bytearray]:
1174+
"""Read Socket n Status Register."""
1175+
return self._read_socket(sock, _REG_SNIR)
1176+
11731177
def _write_snmr(self, sock: int, protocol: int) -> None:
11741178
"""Write to Socket n Mode Register."""
11751179
self._write_socket(sock, _REG_SNMR, protocol)
11761180

1177-
def _write_snir(self, sock: int, data: int) -> None:
1181+
def write_snir(self, sock: int, data: int) -> None:
11781182
"""Write to Socket n Interrupt Register."""
11791183
self._write_socket(sock, _REG_SNIR, data)
11801184

adafruit_wiznet5k/adafruit_wiznet5k_socket.py

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -245,16 +245,25 @@ def __enter__(self):
245245
def __exit__(self, exc_type, exc_val, exc_tb) -> None:
246246
_the_interface.release_socket(self._socknum)
247247
if self._sock_type == SOCK_STREAM:
248-
self._disconnect()
249-
stamp = time.monotonic()
250-
while self._status == wiznet5k.adafruit_wiznet5k.SNSR_SOCK_FIN_WAIT:
251-
if time.monotonic() - stamp > 1000:
252-
raise RuntimeError("Failed to disconnect socket")
253-
self.close()
254-
stamp = time.monotonic()
255-
while self._status != wiznet5k.adafruit_wiznet5k.SNSR_SOCK_CLOSED:
256-
if time.monotonic() - stamp > 1000:
257-
raise RuntimeError("Failed to close socket")
248+
_the_interface.write_snir(
249+
self._socknum, 0xFF
250+
) # Reset socket interrupt register.
251+
_the_interface.socket_disconnect(self._socknum)
252+
mask = (
253+
wiznet5k.adafruit_wiznet5k.SNIR_TIMEOUT
254+
| wiznet5k.adafruit_wiznet5k.SNIR_DISCON
255+
)
256+
while not _the_interface.read_snir(self._socknum)[0] & mask:
257+
pass
258+
_the_interface.write_snir(
259+
self._socknum, 0xFF
260+
) # Reset socket interrupt register.
261+
_the_interface.socket_close(self._socknum)
262+
while (
263+
_the_interface.socket_status(self._socknum)[0]
264+
!= wiznet5k.adafruit_wiznet5k.SNSR_SOCK_CLOSED
265+
):
266+
pass
258267

259268
# This works around problems with using a class method as a decorator.
260269
def _check_socket_closed(func): # pylint: disable=no-self-argument

0 commit comments

Comments
 (0)