Skip to content

Commit 4c219e2

Browse files
authored
Merge branch 'RaspberryPiFoundation:main' into main
2 parents 0e627fd + eeffd9d commit 4c219e2

23 files changed

+597
-114
lines changed

.github/workflows/python-app.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,10 @@ jobs:
1616

1717
steps:
1818
- uses: actions/checkout@v2
19-
- name: Set up Python 3.7
19+
- name: Set up Python 3.9
2020
uses: actions/setup-python@v2
2121
with:
22-
python-version: 3.7
22+
python-version: 3.9
2323
- name: Install dependencies
2424
run: |
2525
python -m pip install --upgrade pip

.pre-commit-config.yaml

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
repos:
2+
- repo: https://github.com/PyCQA/flake8
3+
rev: 6.0.0
4+
hooks:
5+
- id: flake8
6+
additional_dependencies: [
7+
'flake8-bugbear>=22.10.27',
8+
'flake8-comprehensions>=3.10',
9+
'flake8-debugger',
10+
'flake8-docstrings>=1.6.0',
11+
'flake8-isort>=5.0',
12+
'flake8-pylint',
13+
'flake8-rst-docstrings',
14+
'flake8-string-format',
15+
'gpiozero',
16+
'pyserial'
17+
]

CHANGELOG.md

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,49 @@
11
# Change Log
22

3+
## 0.5.12
4+
5+
### Added
6+
7+
* Ability to set custom device interval for callbacks
8+
9+
### Changed
10+
11+
* New firmware with mitigation for motor disconnecting and selrate command
12+
13+
### Removed
14+
15+
n/a
16+
17+
## 0.5.11
18+
19+
### Added
20+
21+
* Expose release property to allow motor to hold position
22+
* Updated documentation
23+
24+
### Changed
25+
26+
n/a
27+
28+
### Removed
29+
30+
n/a
31+
32+
## 0.5.10
33+
34+
### Added
35+
36+
* Support for 88008 motor
37+
* get_distance support for ColourDistanceSensor
38+
39+
### Changed
40+
41+
* Use debug log level for logging
42+
43+
### Removed
44+
45+
n/a
46+
347
## 0.5.9
448

549
### Added

VERSION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
0.5.9
1+
0.5.12

buildhat/color.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -210,4 +210,4 @@ def wait_for_new_color(self):
210210

211211
def on(self):
212212
"""Turn on the sensor and LED"""
213-
self._write(f"port {self.port} ; plimit 1 ; set -1\r")
213+
self.reverse()

buildhat/colordistance.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -199,4 +199,4 @@ def wait_for_new_color(self):
199199

200200
def on(self):
201201
"""Turn on the sensor and LED"""
202-
self._write(f"port {self.port} ; plimit 1 ; set -1\r")
202+
self.reverse()

buildhat/data/firmware.bin

1.22 KB
Binary file not shown.

buildhat/data/signature.bin

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1 @@
1-
�cF��̠�m���㰶v t�?�#��Y�FxQ
2-
�H�|#9�J��49����M�G� $dIӛ
1+
Q#�E]��]-.T~�駶�e[yE�V}A5�L��}���A�$I!�u�9Nzw`��l�@eK��;�{E�

buildhat/data/version

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1643737936
1+
1674818421

buildhat/devices.py

Lines changed: 51 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import os
44
import sys
55
import weakref
6+
from concurrent.futures import Future
67

78
from .exc import DeviceError
89
from .serinterface import BuildHAT
@@ -57,7 +58,9 @@ def __init__(self, port):
5758
Device._setup()
5859
self._simplemode = -1
5960
self._combimode = -1
61+
self._modestr = ""
6062
self._typeid = self._conn.typeid
63+
self._interval = 10
6164
if (
6265
self._typeid in Device._device_names
6366
and Device._device_names[self._typeid][0] != type(self).__name__ # noqa: W503
@@ -185,7 +188,7 @@ def isconnected(self):
185188

186189
def reverse(self):
187190
"""Reverse polarity"""
188-
self._write(f"port {self.port} ; plimit 1 ; set -1\r")
191+
self._write(f"port {self.port} ; port_plimit 1 ; set -1\r")
189192

190193
def get(self):
191194
"""Extract information from device
@@ -194,18 +197,11 @@ def get(self):
194197
:raises DeviceError: Occurs if device not in valid mode
195198
"""
196199
self.isconnected()
197-
idx = -1
198-
if self._simplemode != -1:
199-
idx = self._simplemode
200-
elif self._combimode != -1:
201-
idx = self._combimode
202-
else:
200+
if self._simplemode == -1 and self._combimode == -1:
203201
raise DeviceError("Not in simple or combimode")
204-
self._write(f"port {self.port} ; selonce {idx}\r")
205-
# wait for data
206-
with Device._instance.portcond[self.port]:
207-
Device._instance.portcond[self.port].wait()
208-
return self._conn.data
202+
ftr = Future()
203+
self._hat.portftr[self.port].append(ftr)
204+
return ftr.result()
209205

210206
def mode(self, modev):
211207
"""Set combimode or simple mode
@@ -214,18 +210,32 @@ def mode(self, modev):
214210
"""
215211
self.isconnected()
216212
if isinstance(modev, list):
217-
self._combimode = 0
218213
modestr = ""
219214
for t in modev:
220215
modestr += f"{t[0]} {t[1]} "
221-
self._write(f"port {self.port} ; combi {self._combimode} {modestr}\r")
216+
if self._simplemode == -1 and self._combimode == 0 and self._modestr == modestr:
217+
return
218+
self._write(f"port {self.port}; select\r")
219+
self._combimode = 0
220+
self._write((f"port {self.port} ; combi {self._combimode} {modestr} ; "
221+
f"select {self._combimode} ; "
222+
f"selrate {self._interval}\r"))
222223
self._simplemode = -1
224+
self._modestr = modestr
225+
self._conn.combimode = 0
226+
self._conn.simplemode = -1
223227
else:
228+
if self._combimode == -1 and self._simplemode == int(modev):
229+
return
224230
# Remove combi mode
225231
if self._combimode != -1:
226232
self._write(f"port {self.port} ; combi {self._combimode}\r")
233+
self._write(f"port {self.port}; select\r")
227234
self._combimode = -1
228235
self._simplemode = int(modev)
236+
self._write(f"port {self.port} ; select {int(modev)} ; selrate {self._interval}\r")
237+
self._conn.combimode = -1
238+
self._conn.simplemode = int(modev)
229239

230240
def select(self):
231241
"""Request data from mode
@@ -239,11 +249,11 @@ def select(self):
239249
idx = self._combimode
240250
else:
241251
raise DeviceError("Not in simple or combimode")
242-
self._write(f"port {self.port} ; select {idx}\r")
252+
self._write(f"port {self.port} ; select {idx} ; selrate {self._interval}\r")
243253

244254
def on(self):
245255
"""Turn on sensor"""
246-
self._write(f"port {self.port} ; plimit 1 ; on\r")
256+
self._write(f"port {self.port} ; port_plimit 1 ; on\r")
247257

248258
def off(self):
249259
"""Turn off sensor"""
@@ -274,3 +284,28 @@ def callback(self, func):
274284
self._conn.callit = None
275285
else:
276286
self._conn.callit = weakref.WeakMethod(func)
287+
288+
@property
289+
def interval(self):
290+
"""Interval between data points in milliseconds
291+
292+
:getter: Gets interval
293+
:setter: Sets interval
294+
:return: Device interval
295+
:rtype: int
296+
"""
297+
return self._interval
298+
299+
@interval.setter
300+
def interval(self, value):
301+
"""Interval between data points in milliseconds
302+
303+
:param value: Interval
304+
:type value: int
305+
:raises DeviceError: Occurs if invalid interval passed
306+
"""
307+
if isinstance(value, int) and value >= 0 and value <= 1000000000:
308+
self._interval = value
309+
self._write(f"port {self.port} ; selrate {self._interval}\r")
310+
else:
311+
raise DeviceError("Invalid interval")

buildhat/hat.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
"""HAT handling functionality"""
22

3+
from concurrent.futures import Future
4+
35
from .devices import Device
46

57

@@ -45,11 +47,10 @@ def get_vin(self):
4547
:return: Voltage on the input power jack
4648
:rtype: float
4749
"""
50+
ftr = Future()
51+
Device._instance.vinftr.append(ftr)
4852
Device._instance.write(b"vin\r")
49-
with Device._instance.vincond:
50-
Device._instance.vincond.wait()
51-
52-
return Device._instance.vin
53+
return ftr.result()
5354

5455
def _set_led(self, intmode):
5556
if isinstance(intmode, int) and intmode >= -1 and intmode <= 3:

buildhat/light.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,4 +30,12 @@ def brightness(self, brightness):
3030
"""
3131
if not (brightness >= 0 and brightness <= 100):
3232
raise LightError("Need brightness arg, of 0 to 100")
33-
self._write(f"port {self.port} ; on ; plimit {brightness / 100.0}\r")
33+
if brightness > 0:
34+
self._write(f"port {self.port} ; on ; set {brightness / 100.0}\r")
35+
else:
36+
self.off()
37+
38+
def off(self):
39+
"""Turn off lights"""
40+
# Using coast to turn off DIY lights completely
41+
self._write(f"port {self.port} ; coast\r")

0 commit comments

Comments
 (0)