Skip to content

Commit

Permalink
working on CPB now
Browse files Browse the repository at this point in the history
  • Loading branch information
dhalbert committed May 6, 2020
1 parent 89ff7dc commit 431f2e4
Show file tree
Hide file tree
Showing 16 changed files with 112 additions and 57 deletions.
5 changes: 2 additions & 3 deletions adafruit_ble_adafruit/accelerometer_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,11 +33,10 @@

from adafruit_ble.attributes import Attribute
from adafruit_ble.characteristics import Characteristic, StructCharacteristic
from adafruit_ble_adafruit.adafruit_service import AdafruitService

from .adafruit_service import AdafruitService


class AccelerometerService(AdafruitService):
class AccelerometerService(AdafruitService): # pylint: disable=too-few-public-methods
"""Accelerometer values."""

uuid = AdafruitService.adafruit_service_uuid(0x200)
Expand Down
88 changes: 67 additions & 21 deletions adafruit_ble_adafruit/addressable_pixel_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,13 +31,55 @@
__version__ = "0.0.0-auto.0"
__repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_BLE_Adafruit.git"

from collections import namedtuple
import struct

import _bleio

from adafruit_ble.attributes import Attribute
from adafruit_ble.characteristics import Characteristic
from adafruit_ble.characteristics import Characteristic, ComplexCharacteristic
from adafruit_ble.characteristics.int import Uint8Characteristic
from adafruit_ble_adafruit.adafruit_service import AdafruitService

PixelValues = namedtuple("PixelValues", ("start", "write_now", "data"),)
"""Namedtuple for pixel data and instructions.
* start
start writing data into buffer at this byte number (byte, not pixel)
* write_now
``True`` if data should be written to pixels now.
``False`` if write should not happen immediately.
* data
sequence of bytes of data for all pixels, in proper color order for type of pixel
"""


class _PixelPacket(ComplexCharacteristic):
"""
start: uint16: start writing data into buffer at this byte number (byte, not pixel)
flags: uint8: bit 0: 0 = don't write to pixels yet
1 = write entire buffer to pixels now
data: raw array of data for all pixels, in proper color order for type of pixel
"""

uuid = AdafruitService.adafruit_service_uuid(0x903)

from .adafruit_service import AdafruitService
def __init__(self, length):
super().__init__(
properties=Characteristic.WRITE,
read_perm=Attribute.NO_ACCESS,
max_length=length,
)

def bind(self, service):
"""Binds the characteristic to the given Service."""
bound_characteristic = super().bind(service)
return _bleio.PacketBuffer(bound_characteristic, buffer_size=1)


class AddressablePixelService(AdafruitService):
Expand All @@ -54,28 +96,32 @@ class AddressablePixelService(AdafruitService):
uuid=AdafruitService.adafruit_service_uuid(0x902),
properties=(Characteristic.READ | Characteristic.WRITE),
)
"""0 = WS2812 (NeoPixel), 800kHz
1 = SPI (APA102: DotStar)
"""
pixel_data = Characteristic(
uuid=AdafruitService.adafruit_service_uuid(0x903),
properties=Characteristic.WRITE,
write_perm=Attribute.NO_ACCESS,
)
"""\
start: uint16: start writing data into buffer at this byte number (byte, not pixel)
flags: uint8: bit 0: 0 = don't write to pixels yet
1 = write entire buffer to pixels now
data: raw array of data for all pixels, in proper color order for type of pixel
0 = WS2812 (NeoPixel), 800kHz
1 = SPI (APA102: DotStar)
"""

def __init__(self, length, service=None):
# Delay creation of _pixel_packet until length is given.
self.__class__._pixel_packet = _PixelPacket(length + 3)
super().__init__(service=service)
self._pixel_packet_buf = None
self._buf_length = length

@property
def parsed_pixel_data(self):
def values(self):
"""Return a tuple (start, write_now, data) corresponding to the
different parts of ``pixel_data``.
different parts of ``_pixel_packet``.
"""
pixel_data = self.pixel_data
start = struct.unpack_from("<H", pixel_data)
write_now = bool(pixel_data[2] & 0x1)
data = memoryview(pixel_data)[3:]
return (start, write_now, data)
if self._pixel_packet_buf is None:
self._pixel_packet_buf = bytearray(
self._pixel_packet.packet_size # pylint: disable=no-member
)
buf = self._pixel_packet_buf
if self._pixel_packet.readinto(buf) == 0: # pylint: disable=no-member
# No new values available
return None

return PixelValues(
struct.unpack_from("<H", buf)[0], bool(buf[2] & 0x1), buf[3:],
)
3 changes: 1 addition & 2 deletions adafruit_ble_adafruit/barometric_pressure_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,7 @@
from adafruit_ble.attributes import Attribute
from adafruit_ble.characteristics import Characteristic
from adafruit_ble.characteristics.float import FloatCharacteristic

from .adafruit_service import AdafruitService
from adafruit_ble_adafruit.adafruit_service import AdafruitService


class BarometricPressureService(AdafruitService):
Expand Down
3 changes: 1 addition & 2 deletions adafruit_ble_adafruit/button_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,7 @@
from adafruit_ble.attributes import Attribute
from adafruit_ble.characteristics import Characteristic
from adafruit_ble.characteristics.int import Uint32Characteristic

from .adafruit_service import AdafruitService
from adafruit_ble_adafruit.adafruit_service import AdafruitService


class ButtonService(AdafruitService):
Expand Down
3 changes: 1 addition & 2 deletions adafruit_ble_adafruit/color_sensor.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,7 @@

from adafruit_ble.attributes import Attribute
from adafruit_ble.characteristics import Characteristic, StructCharacteristic

from .adafruit_service import AdafruitService
from adafruit_ble_adafruit.adafruit_service import AdafruitService


class ColorSensorService(AdafruitService):
Expand Down
7 changes: 3 additions & 4 deletions adafruit_ble_adafruit/gesture_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,12 +33,11 @@
from adafruit_ble.attributes import Attribute
from adafruit_ble.characteristics import Characteristic
from adafruit_ble.characteristics.int import Uint8Characteristic
from adafruit_ble_adafruit.adafruit_service import AdafruitService

from .adafruit_service import AdafruitService


class ButtonService(AdafruitService):
"""Status of buttons and switches on the board."""
class GestureService(AdafruitService):
"""Gesture sensor."""

UP = 1 # pylint: disable=invalid-name
"""swipe up"""
Expand Down
3 changes: 1 addition & 2 deletions adafruit_ble_adafruit/gyroscope_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,7 @@

from adafruit_ble.attributes import Attribute
from adafruit_ble.characteristics import Characteristic, StructCharacteristic

from .adafruit_service import AdafruitService
from adafruit_ble_adafruit.adafruit_service import AdafruitService


class GyroscopeService(AdafruitService):
Expand Down
3 changes: 1 addition & 2 deletions adafruit_ble_adafruit/humidity_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,8 +35,7 @@
from adafruit_ble.attributes import Attribute
from adafruit_ble.characteristics import Characteristic
from adafruit_ble.characteristics.float import FloatCharacteristic

from .adafruit_service import AdafruitService
from adafruit_ble_adafruit.adafruit_service import AdafruitService


class HumidityService(AdafruitService):
Expand Down
3 changes: 1 addition & 2 deletions adafruit_ble_adafruit/light_sensor_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,7 @@
from adafruit_ble.attributes import Attribute
from adafruit_ble.characteristics import Characteristic
from adafruit_ble.characteristics.float import FloatCharacteristic

from .adafruit_service import AdafruitService
from adafruit_ble_adafruit.adafruit_service import AdafruitService


class LightSensorService(AdafruitService):
Expand Down
3 changes: 1 addition & 2 deletions adafruit_ble_adafruit/magnetometer_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,7 @@

from adafruit_ble.attributes import Attribute
from adafruit_ble.characteristics import Characteristic, StructCharacteristic

from .adafruit_service import AdafruitService
from adafruit_ble_adafruit.adafruit_service import AdafruitService


class MagnetometerService(AdafruitService):
Expand Down
3 changes: 1 addition & 2 deletions adafruit_ble_adafruit/microphone_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,7 @@
from adafruit_ble.attributes import Attribute
from adafruit_ble.characteristics import Characteristic
from adafruit_ble.characteristics.int import Uint8Characteristic

from .adafruit_service import AdafruitService
from adafruit_ble_adafruit.adafruit_service import AdafruitService


class MicrophoneService(AdafruitService):
Expand Down
5 changes: 2 additions & 3 deletions adafruit_ble_adafruit/proximity_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,11 +33,10 @@
from adafruit_ble.attributes import Attribute
from adafruit_ble.characteristics import Characteristic
from adafruit_ble.characteristics.int import Uint16Characteristic
from adafruit_ble_adafruit.adafruit_service import AdafruitService

from .adafruit_service import AdafruitService


class ButtonService(AdafruitService):
class ProximityService(AdafruitService):
"""Status of buttons and switches on the board."""

uuid = AdafruitService.adafruit_service_uuid(0xE00)
Expand Down
7 changes: 3 additions & 4 deletions adafruit_ble_adafruit/quaternion_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,12 +33,11 @@

from adafruit_ble.attributes import Attribute
from adafruit_ble.characteristics import Characteristic, StructCharacteristic
from adafruit_ble_adafruit.adafruit_service import AdafruitService

from .adafruit_service import AdafruitService


class AccelerometerService(AdafruitService):
"""Accelerometer values."""
class QuaternionService(AdafruitService):
"""Quaternion values."""

uuid = AdafruitService.adafruit_service_uuid(0xD00)
quaternion = StructCharacteristic(
Expand Down
2 changes: 1 addition & 1 deletion adafruit_ble_adafruit/temperature_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@
from adafruit_ble.attributes import Attribute
from adafruit_ble.characteristics import Characteristic
from adafruit_ble.characteristics.float import FloatCharacteristic
from .adafruit_service import AdafruitService
from adafruit_ble_adafruit.adafruit_service import AdafruitService


class TemperatureService(AdafruitService):
Expand Down
3 changes: 1 addition & 2 deletions adafruit_ble_adafruit/tone_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,8 +37,7 @@

from adafruit_ble.attributes import Attribute
from adafruit_ble.characteristics import Characteristic, ComplexCharacteristic

from .adafruit_service import AdafruitService
from adafruit_ble_adafruit.adafruit_service import AdafruitService


class _TonePacket(ComplexCharacteristic):
Expand Down
28 changes: 25 additions & 3 deletions examples/ble_adafruit_circuitplayground_bluefruit.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,12 @@

import time

import board
from digitalio import DigitalInOut
import neopixel_write

from micropython import const

from adafruit_ble import BLERadio

from adafruit_ble_adafruit.adafruit_service import AdafruitServerAdvertisement
Expand All @@ -19,8 +25,13 @@
accel_svc.measurement_period = 100
accel_last_update = 0

neopixel_svc = AddressablePixelService()

NEOPIXEL_BUF_LENGTH = const(30)
neopixel_svc = AddressablePixelService(NEOPIXEL_BUF_LENGTH)
neopixel_buf = bytearray(NEOPIXEL_BUF_LENGTH)
# Take over NeoPixel control from cp.
cp._pixels.deinit() # pylint: disable=protected-access
neopixel_out = DigitalInOut(board.NEOPIXEL)
neopixel_out.switch_to_output()

button_svc = ButtonService()
button_svc.set_pressed(cp.switch, cp.button_a, cp.button_b)
Expand Down Expand Up @@ -49,7 +60,7 @@
ble.stop_advertising()

while ble.connected:
now_msecs = time.monotonic_ns() // 10000000
now_msecs = time.monotonic_ns() // 1000000

if now_msecs - accel_last_update > accel_svc.measurement_period:
accel_svc.acceleration = cp.acceleration
Expand Down Expand Up @@ -81,3 +92,14 @@
else:
cp.stop_tone()
last_tone = tone

neopixel_values = neopixel_svc.values
if neopixel_values is not None:
start = neopixel_values.start
if start > NEOPIXEL_BUF_LENGTH:
continue
data = neopixel_values.data
data_len = min(len(data), NEOPIXEL_BUF_LENGTH - start)
neopixel_buf[start : start + data_len] = data[:data_len]
if neopixel_values.write_now:
neopixel_write.neopixel_write(neopixel_out, neopixel_buf)

0 comments on commit 431f2e4

Please sign in to comment.