This repository is for Bluetooth Asia 2018 developer training, peripheral session.

Dependencies:   microbit

Fork of BluetoothAsiaPeripheral by Kaiser Ren

peripheral_src.txt

Committer:
krenbluetoothsig
Date:
2018-07-31
Revision:
8:d3d0c0ac4ce9
Parent:
6:f296b217bb4c

File content as of revision 8:d3d0c0ac4ce9:

./microbit/microbit-dal/inc/bluetooth/MicroBitAnimationService.h

    // TODO: memory for our Animation characteristics.
    uint8_t   animation_type_buffer[1];
    uint8_t   animation_status_buffer[1];
    uint8_t   animation_control_buffer[1];
ctrl+S then ctrl+B

    // TODO: handles on this service's characterisitics.
    GattAttribute::Handle_t animationTypeCharacteristicHandle;
    GattAttribute::Handle_t animationStatusCharacteristicHandle;
    GattAttribute::Handle_t animationControlCharacteristicHandle;
ctrl+S then ctrl+B


./microbit/microbit-dal/source/bluetooth/MicroBitAnimationService.cpp
    // TODO: Three GattCharacteristic objects. UUID, valuePTR, length, max length, properties.
    GattCharacteristic  animationTypeCharacteristic(
        MicroBitAnimationServiceAnimationTypeCharacteristicUUID, 
        (uint8_t *)animation_type_buffer, 
        1, 
        1,
        GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE);
        
    GattCharacteristic  animationStatusCharacteristic(
        MicroBitAnimationServiceAnimationStatusCharacteristicUUID, 
        (uint8_t *)animation_status_buffer, 
        1, 
        1,
        GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY);

    GattCharacteristic  animationControlCharacteristic(
        MicroBitAnimationServiceAnimationControlCharacteristicUUID, 
        (uint8_t *)animation_control_buffer, 
        1, 
        1,
        GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE);
ctrl+S then ctrl+B

    // TODO: initialise characteristic value buffers.
    animation_type_buffer[0]    = 0x00;
    animation_status_buffer[0]  = 0x00;
    animation_control_buffer[0] = 0x00;
ctrl+S then ctrl+B

    // TODO: create GattService containing the three characteristics
    // create an array of our characteristics so we can pass them to the service when we create it
    GattCharacteristic *characteristics[] = {&animationTypeCharacteristic, &animationStatusCharacteristic, &animationControlCharacteristic};

    // create the animation service and specify its characteristics. 3rd arg is the number of characteristics.
    GattService         service(MicroBitAnimationServiceUUID, characteristics, sizeof(characteristics) / sizeof(GattCharacteristic *));
ctrl+S then ctrl+B

    // TODO: add the service to the Bluetooth attribute table
    ble.addService(service);
ctrl+S then ctrl+B

    // TODO: take a note of the handles of our new characteristics now that they're in the attribute table
    animationTypeCharacteristicHandle = animationTypeCharacteristic.getValueHandle();
    animationStatusCharacteristicHandle = animationStatusCharacteristic.getValueHandle();
    animationControlCharacteristicHandle = animationControlCharacteristic.getValueHandle();
ctrl+S then ctrl+B

    // TODO: register a callback function for when a characteristic is written to
    ble.onDataWritten(this, &MicroBitAnimationService::onDataWritten);
ctrl+S then ctrl+B

/**
  * Callback. Invoked when any of our attributes are written to
  */
void MicroBitAnimationService::onDataWritten(const GattWriteCallbackParams *params)
{
   
    // TODO: handle write to animation type characteristic
    if (params->handle == animationTypeCharacteristicHandle && params->len == 1) {
        uint8_t *value = (uint8_t *)params->data;
        uint16_t event_value = static_cast<uint16_t>(value[0]);
        MicroBitEvent evt(ANIMATION_TYPE_EVENT, event_value);
        return;
    }

    // TODO: handle write to animation control characteristic
    if (params->handle == animationControlCharacteristicHandle && params->len == 1) {
        uint8_t *value = (uint8_t *)params->data;
        uint16_t event_value = static_cast<uint16_t>(value[0]);
        MicroBitEvent evt(ANIMATION_CONTROL_EVENT, event_value);
        return;
    }
}
ctrl+S then ctrl+B

void MicroBitAnimationService::animationStatusUpdate(MicroBitEvent e)
{
    // TODO: notify connected client of change to the animation status characteristic
    if (ble.getGapState().connected)
    {
        animation_status_buffer[0] = e.value;
        ble.gattServer().notify(animationStatusCharacteristicHandle,(uint8_t *)animation_status_buffer, 1);
    }
}
ctrl+S then ctrl+B