Skip to content

Commit dc135ac

Browse files
authored
Merge branch 'main' into dev/convert-to-properties
2 parents 4530550 + cf51ea2 commit dc135ac

File tree

1 file changed

+31
-18
lines changed

1 file changed

+31
-18
lines changed

adafruit_vc0706.py

Lines changed: 31 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,13 @@
2727
"""
2828
from micropython import const
2929

30+
try:
31+
from typing import Optional, Literal
32+
import circuitpython_typing
33+
import busio
34+
except ImportError:
35+
pass
36+
3037
__version__ = "0.0.0-auto.0"
3138
__repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_VC0706.git"
3239

@@ -83,7 +90,7 @@ class VC0706:
8390
:param int buffer_size: Receive buffer size
8491
"""
8592

86-
def __init__(self, uart, *, buffer_size=100):
93+
def __init__(self, uart: busio.UART, *, buffer_size: int = 100) -> None:
8794
self._uart = uart
8895
self._buffer = bytearray(buffer_size)
8996
self._frame_ptr = 0
@@ -97,20 +104,20 @@ def __init__(self, uart, *, buffer_size=100):
97104
raise RuntimeError("Failed to get response from VC0706, check wiring!")
98105

99106
@property
100-
def version(self):
107+
def version(self) -> str:
101108
"""Return camera version byte string."""
102109
# Clear buffer to ensure the end of a string can be found.
103110
self._send_command(_GEN_VERSION, b"\x01")
104111
readlen = self._read_response(self._buffer, len(self._buffer))
105112
return str(self._buffer[:readlen], "ascii")
106113

107114
@property
108-
def baudrate(self):
115+
def baudrate(self) -> Literal[9600, 19200, 38400, 57600, 115200]:
109116
"""Return the currently configured baud rate."""
110117
return self._uart.baudrate
111118

112119
@baudrate.setter
113-
def baudrate(self, baud):
120+
def baudrate(self, baud: Literal[9600, 19200, 38400, 57600, 115200]) -> None:
114121
"""Set the baudrate to 9600, 19200, 38400, 57600, or 115200."""
115122
divider = None
116123
if baud == 9600:
@@ -130,7 +137,7 @@ def baudrate(self, baud):
130137
self._uart.baudrate = baud
131138

132139
@property
133-
def image_size(self):
140+
def image_size(self) -> int:
134141
"""Get the current image size, will return a value of IMAGE_SIZE_640x480,
135142
IMAGE_SIZE_320x240, or IMAGE_SIZE_160x120.
136143
"""
@@ -139,7 +146,7 @@ def image_size(self):
139146
return self._buffer[5]
140147

141148
@image_size.setter
142-
def image_size(self, size):
149+
def image_size(self, size: int) -> bool:
143150
"""Set the image size to a value of IMAGE_SIZE_640x480, IMAGE_SIZE_320x240, or
144151
IMAGE_SIZE_160x120.
145152
"""
@@ -153,8 +160,8 @@ def image_size(self, size):
153160
)
154161

155162
@property
156-
def frame_length(self):
157-
"""Return the length in bytes of the currently capture frame/picture."""
163+
def frame_length(self) -> int:
164+
"""Return the length in bytes of the currently captured frame/picture."""
158165
if not self._run_command(_GET_FBUF_LEN, b"\x01\x00", 9):
159166
return 0
160167
frame_length = self._buffer[5]
@@ -166,18 +173,18 @@ def frame_length(self):
166173
frame_length |= self._buffer[8]
167174
return frame_length
168175

169-
def take_picture(self):
176+
def take_picture(self) -> bool:
170177
"""Tell the camera to take a picture. Returns True if successful."""
171178
self._frame_ptr = 0
172179
return self._run_command(_FBUF_CTRL, bytes([0x1, _STOPCURRENTFRAME]), 5)
173180

174-
def resume_video(self):
181+
def resume_video(self) -> bool:
175182
"""Tell the camera to resume being a camera after the video has stopped
176183
(Such as what happens when a picture is taken).
177184
"""
178185
return self._run_command(_FBUF_CTRL, bytes([0x1, _RESUMEFRAME]), 5)
179186

180-
def read_picture_into(self, buf):
187+
def read_picture_into(self, buf: circuitpython_typing.WriteableBuffer) -> int:
181188
"""Read the next bytes of frame/picture data into the provided buffer.
182189
Returns the number of bytes written to the buffer (might be less than
183190
the size of the buffer). Buffer MUST be a multiple of 4 and 100 or
@@ -215,23 +222,25 @@ def read_picture_into(self, buf):
215222
return n
216223

217224
@property
218-
def motion_detected(self):
225+
def motion_detected(self) -> bool:
219226
"""Whether a gesture was detected"""
220227
self._read_response(self._buffer, len(self._buffer))
221228
if not self._verify_response(_COMM_MOTION_DETECTED):
222229
return False
223230
return True
224231

225232
@property
226-
def motion_detection(self):
233+
def motion_detection(self) -> bool:
227234
"""The gesture detection status"""
228235
return self._run_command(_COMM_MOTION_STATUS, bytes([0x00]), 6)
229236

230237
@motion_detection.setter
231-
def motion_detection(self, enabled):
238+
def motion_detection(self, enabled: bool) -> bool:
232239
return self._run_command(_COMM_MOTION_CTRL, bytes([0x01, enabled]), 5)
233240

234-
def _run_command(self, cmd, args, resplen, flush=True):
241+
def _run_command(
242+
self, cmd: int, args: bytes, resplen: int, flush: bool = True
243+
) -> bool:
235244
if flush:
236245
self._read_response(self._buffer, len(self._buffer))
237246
self._send_command(cmd, args)
@@ -241,18 +250,22 @@ def _run_command(self, cmd, args, resplen, flush=True):
241250
return False
242251
return True
243252

244-
def _read_response(self, result, numbytes):
253+
def _read_response(
254+
self, result: circuitpython_typing.WriteableBuffer, numbytes: int
255+
) -> Optional[int]:
245256
return self._uart.readinto(memoryview(result)[0:numbytes])
246257

247-
def _verify_response(self, cmd):
258+
def _verify_response(self, cmd: int) -> bool:
248259
return (
249260
self._buffer[0] == 0x76
250261
and self._buffer[1] == _SERIAL
251262
and self._buffer[2] == cmd & 0xFF
252263
and self._buffer[3] == 0x00
253264
)
254265

255-
def _send_command(self, cmd, args=None):
266+
def _send_command(
267+
self, cmd: int, args: Optional[circuitpython_typing.ReadableBuffer] = None
268+
) -> None:
256269
self._command_header[0] = 0x56
257270
self._command_header[1] = _SERIAL
258271
self._command_header[2] = cmd & 0xFF

0 commit comments

Comments
 (0)