Skip to content

Commit cd702d2

Browse files
committed
Split large measurements and simplify complex example.
1 parent f110a81 commit cd702d2

File tree

2 files changed

+41
-53
lines changed

2 files changed

+41
-53
lines changed

adafruit_ble_broadcastnet.py

Lines changed: 33 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -55,19 +55,21 @@
5555

5656
_ble = adafruit_ble.BLERadio()
5757
_sequence_number = 0
58-
def broadcast(measurement, *, broadcast_time=0.1):
58+
def broadcast(measurement, *, broadcast_time=0.1, extended=False):
59+
"""Broadcasts the given measurement for the given broadcast time. If extended is False and the
60+
measurement would be too long, it will be split into multiple measurements for transmission."""
5961
global _sequence_number
60-
measurement.sequence_number = _sequence_number
61-
_ble.start_advertising(measurement, scan_response=None)
62-
time.sleep(broadcast_time)
63-
_ble.stop_advertising()
64-
_sequence_number = (_sequence_number + 1) % 256
62+
for submeasurement in measurement.split(252 if extended else 31):
63+
submeasurement.sequence_number = _sequence_number
64+
_ble.start_advertising(submeasurement, scan_response=None)
65+
time.sleep(broadcast_time)
66+
_ble.stop_advertising()
67+
_sequence_number = (_sequence_number + 1) % 256
6568

6669
device_address = "{:02x}{:02x}{:02x}{:02x}{:02x}{:02x}".format(*_ble._adapter.address.address_bytes)
6770

6871
_MANUFACTURING_DATA_ADT = const(0xff)
6972
_ADAFRUIT_COMPANY_ID = const(0x0822)
70-
_SENSOR_DATA_ID = const(0x0002)
7173

7274
class AdafruitSensorMeasurement(Advertisement):
7375
"""Broadcast a single RGB color."""
@@ -167,3 +169,27 @@ def __str__(self):
167169
if value is not None:
168170
parts.append("{}={}".format(attr, str(value)))
169171
return "<{} {} >".format(self.__class__.__name__, " ".join(parts))
172+
173+
def split(self, max_packet_size=31):
174+
current_size = 8 # baseline for mfg data and sequence number
175+
if current_size + len(self.manufacturer_data) < max_packet_size:
176+
yield self
177+
return
178+
179+
original_data = self.manufacturer_data.data
180+
submeasurement = None
181+
for key in original_data:
182+
value = original_data[key]
183+
entry_size = 2 + len(value)
184+
if not submeasurement or current_size + entry_size > max_packet_size:
185+
if submeasurement:
186+
yield submeasurement
187+
submeasurement = self.__class__()
188+
current_size = 8
189+
submeasurement.manufacturer_data.data[key] = value
190+
current_size += entry_size
191+
192+
if submeasurement:
193+
yield submeasurement
194+
195+
return

examples/ble_broadcastnet_multisensor.py

Lines changed: 8 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -31,51 +31,13 @@
3131
# Barometric pressure sensor:
3232
bmp280 = adafruit_bmp280.Adafruit_BMP280_I2C(i2c)
3333

34-
last_sht31d_temperature = None
35-
last_sht31d_relative_humidity = None
36-
last_bmp280_temperature = None
37-
last_bmp280_pressure = None
38-
last_lsm6ds_acceleration = None
39-
last_lis3mdl_magnetic = None
40-
4134
while True:
4235
measurement = adafruit_ble_broadcastnet.AdafruitSensorMeasurement()
43-
44-
# Handle the two temperature measurements. We must always provide both because they split into
45-
# feeds based on the position in the field.
46-
sht31d_temperature = round(sht31d.temperature, 0)
47-
bmp280_temperature = round(bmp280.temperature, 0)
48-
if (sht31d_temperature != last_sht31d_temperature or
49-
bmp280_temperature != last_bmp280_temperature):
50-
measurement.temperature = (sht31d_temperature, bmp280_temperature)
51-
last_sht31d_temperature = sht31d_temperature
52-
last_bmp280_temperature = bmp280_temperature
53-
54-
# Relative humidity, rounded to the nearest whole integer.
55-
sht31d_relative_humidity = round(sht31d.relative_humidity, 0)
56-
if sht31d_relative_humidity != last_sht31d_relative_humidity:
57-
measurement.relative_humidity = sht31d_relative_humidity
58-
last_sht31d_relative_humidity = sht31d_relative_humidity
59-
60-
# Pressure, round to one decimal place.
61-
bmp280_pressure = round(bmp280.pressure, 1)
62-
if bmp280_pressure != last_bmp280_pressure:
63-
measurement.pressure = bmp280_pressure
64-
last_bmp280_pressure = bmp280_pressure
65-
66-
# Acceleration, each axis rounded to one decimal place.
67-
lsm6ds_acceleration = tuple([round(axis, 1) for axis in lsm6ds.acceleration])
68-
if lsm6ds_acceleration != last_lsm6ds_acceleration:
69-
measurement.acceleration = lsm6ds_acceleration
70-
last_lsm6ds_acceleration = lsm6ds_acceleration
71-
72-
# Magnetic, each axis rounded to two decimal places.
73-
lis3mdl_magnetic = tuple([round(axis, 2) for axis in lis3mdl.magnetic])
74-
if lis3mdl_magnetic != last_lis3mdl_magnetic:
75-
measurement.magnetic = lis3mdl_magnetic
76-
last_lis3mdl_magnetic = lis3mdl_magnetic
77-
78-
if measurement:
79-
print(measurement)
80-
adafruit_ble_broadcastnet.broadcast(measurement)
81-
time.sleep(10)
36+
measurement.temperature = (sht31d.temperature, bmp280.temperature)
37+
measurement.relative_humidity = sht31d.relative_humidity
38+
measurement.pressure = bmp280.pressure
39+
measurement.acceleration = lsm6ds.acceleration
40+
measurement.magnetic = lis3mdl.magnetic
41+
print(measurement)
42+
adafruit_ble_broadcastnet.broadcast(measurement)
43+
time.sleep(60)

0 commit comments

Comments
 (0)