Skip to content

Commit db2cc25

Browse files
committed
fix recv_into for larger fetches
1 parent 7e0796c commit db2cc25

File tree

1 file changed

+24
-32
lines changed

1 file changed

+24
-32
lines changed

adafruit_esp32spi/adafruit_esp32spi_socket.py

Lines changed: 24 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -161,44 +161,36 @@ def recv(self, bufsize=0):
161161
gc.collect()
162162
return ret
163163

164-
def recv_into(self, buffer, nbytes=0):
165-
"""Read some bytes from the connected remote address into a given buffer
164+
def recv_into(self, buffer, nbytes: int = 0):
165+
"""Read bytes from the connected remote address into a given buffer.
166166
167-
:param bytearray buffer: The buffer to read into
168-
:param int nbytes: (Optional) Number of bytes to receive default is 0,
169-
which will receive as many bytes as possible before filling the
167+
:param bytearray buffer: the buffer to read into
168+
:param int nbytes: maximum number of bytes to receive; if 0,
169+
receive as many bytes as possible before filling the
170170
buffer or timing out
171171
"""
172-
173172
if not 0 <= nbytes <= len(buffer):
174-
raise ValueError(
175-
"Can only read number of bytes between 0 and length of supplied buffer"
176-
)
177-
178-
stamp = time.monotonic()
179-
to_read = len(buffer)
180-
limit = 0 if nbytes == 0 else to_read - nbytes
181-
received = []
182-
while to_read > limit:
183-
# print("Bytes to read:", to_read)
184-
avail = self.available()
185-
if avail:
186-
stamp = time.monotonic()
187-
recv = _the_interface.socket_read(self._socknum, min(to_read, avail))
188-
received.append(recv)
189-
start = len(buffer) - to_read
190-
to_read -= len(recv)
191-
end = len(buffer) - to_read
192-
buffer[start:end] = bytearray(recv)
193-
gc.collect()
194-
elif received:
195-
# We've received some bytes but no more are available. So return
196-
# what we have.
173+
raise ValueError("nbytes must be 0 to len(buffer)")
174+
175+
last_read_time = time.monotonic()
176+
num_to_read = len(buffer) if nbytes == 0 else nbytes
177+
num_read = 0
178+
while num_read < num_to_read:
179+
num_avail = self.available()
180+
if num_avail > 0:
181+
last_read_time = time.monotonic()
182+
bytes_read = _the_interface.socket_read(
183+
self._socknum, min(num_to_read, num_avail)
184+
)
185+
buffer[num_read : num_read + len(bytes_read)] = bytes_read
186+
num_read += len(bytes_read)
187+
elif num_read > 0:
188+
# We got a message, but there are no more bytes to read, so we can stop.
197189
break
198-
if self._timeout > 0 and time.monotonic() - stamp > self._timeout:
190+
# No bytes yet, or more byte requested.
191+
if self._timeout > 0 and time.monotonic() - last_read_time > self._timeout:
199192
break
200-
gc.collect()
201-
return len(buffer) - to_read
193+
return num_read
202194

203195
def read(self, size=0):
204196
"""Read up to 'size' bytes from the socket, this may be buffered internally!

0 commit comments

Comments
 (0)