High level Bluetooth Low Energy API and radio abstraction layer
Fork of BLE_API by
Revision 31:2c94f0501807, committed 2014-04-01
- Comitter:
- bogdanm
- Date:
- Tue Apr 01 11:04:56 2014 +0100
- Parent:
- 30:9614522cf932
- Child:
- 32:874ec944b552
- Commit message:
- Synchronized with git revision fdcc1e387426ce216bc17175b73bcd5f4aececff
Changed in this revision
--- a/GapAdvertisingData.cpp Fri Jan 17 14:25:29 2014 +0000 +++ b/GapAdvertisingData.cpp Tue Apr 01 11:04:56 2014 +0100 @@ -34,6 +34,7 @@ { memset(_payload, 0, GAP_ADVERTISING_DATA_MAX_PAYLOAD); _payloadLen = 0; + _appearance = GENERIC_TAG; } /**************************************************************************/ @@ -119,6 +120,7 @@ /**************************************************************************/ ble_error_t GapAdvertisingData::addAppearance(Appearance appearance) { + _appearance = appearance; return addData(GapAdvertisingData::APPEARANCE, (uint8_t*)&appearance, 2); } @@ -210,7 +212,7 @@ /**************************************************************************/ uint8_t * GapAdvertisingData::getPayload(void) { - return _payload; + return (_payloadLen > 0) ? _payload : NULL; } /**************************************************************************/ @@ -224,3 +226,15 @@ { return _payloadLen; } + +/**************************************************************************/ +/*! + \brief Returns the 16-bit appearance value for this device + + \returns The 16-bit appearance value +*/ +/**************************************************************************/ +uint16_t GapAdvertisingData::getAppearance(void) +{ + return (uint16_t)_appearance; +}
--- a/GapAdvertisingData.h Fri Jan 17 14:25:29 2014 +0000 +++ b/GapAdvertisingData.h Tue Apr 01 11:04:56 2014 +0100 @@ -195,16 +195,18 @@ virtual ~GapAdvertisingData(void); ble_error_t addData(DataType, uint8_t *, uint8_t); - ble_error_t addAppearance(Appearance appearance = UNKNOWN); + ble_error_t addAppearance(Appearance appearance = GENERIC_TAG); ble_error_t addFlags(Flags flag = LE_GENERAL_DISCOVERABLE); ble_error_t addTxPower(int8_t txPower); void clear(void); uint8_t * getPayload(void); uint8_t getPayloadLen(void); + uint16_t getAppearance(void); private: - uint8_t _payload[GAP_ADVERTISING_DATA_MAX_PAYLOAD]; - uint8_t _payloadLen; + uint8_t _payload[GAP_ADVERTISING_DATA_MAX_PAYLOAD]; + uint8_t _payloadLen; + uint16_t _appearance; }; #endif
--- a/GattCharacteristic.cpp Fri Jan 17 14:25:29 2014 +0000 +++ b/GattCharacteristic.cpp Tue Apr 01 11:04:56 2014 +0100 @@ -52,7 +52,7 @@ memcpy(&properties, &props, 1); lenMin = minLen; lenMax = maxLen; - handle = 0; +// handle = 0; } /**************************************************************************/
--- a/GattCharacteristic.h Fri Jan 17 14:25:29 2014 +0000 +++ b/GattCharacteristic.h Tue Apr 01 11:04:56 2014 +0100 @@ -21,6 +21,7 @@ #include "blecommon.h" #include "UUID.h" +#include "ble_gatts.h" /* ToDo: Update to use 16-bit or 128-bit UUIDs! */ /**************************************************************************/ @@ -31,6 +32,78 @@ class GattCharacteristic { public: + enum + { + UUID_BATTERY_LEVEL_STATE_CHAR = 0x2A1B, + UUID_BATTERY_POWER_STATE_CHAR = 0x2A1A, + UUID_REMOVABLE_CHAR = 0x2A3A, + UUID_SERVICE_REQUIRED_CHAR = 0x2A3B, + UUID_ALERT_CATEGORY_ID_CHAR = 0x2A43, + UUID_ALERT_CATEGORY_ID_BIT_MASK_CHAR = 0x2A42, + UUID_ALERT_LEVEL_CHAR = 0x2A06, + UUID_ALERT_NOTIFICATION_CONTROL_POINT_CHAR = 0x2A44, + UUID_ALERT_STATUS_CHAR = 0x2A3F, + UUID_BATTERY_LEVEL_CHAR = 0x2A19, + UUID_BLOOD_PRESSURE_FEATURE_CHAR = 0x2A49, + UUID_BLOOD_PRESSURE_MEASUREMENT_CHAR = 0x2A35, + UUID_BODY_SENSOR_LOCATION_CHAR = 0x2A38, + UUID_BOOT_KEYBOARD_INPUT_REPORT_CHAR = 0x2A22, + UUID_BOOT_KEYBOARD_OUTPUT_REPORT_CHAR = 0x2A32, + UUID_BOOT_MOUSE_INPUT_REPORT_CHAR = 0x2A33, + UUID_CURRENT_TIME_CHAR = 0x2A2B, + UUID_DATE_TIME_CHAR = 0x2A08, + UUID_DAY_DATE_TIME_CHAR = 0x2A0A, + UUID_DAY_OF_WEEK_CHAR = 0x2A09, + UUID_DST_OFFSET_CHAR = 0x2A0D, + UUID_EXACT_TIME_256_CHAR = 0x2A0C, + UUID_FIRMWARE_REVISION_STRING_CHAR = 0x2A26, + UUID_GLUCOSE_FEATURE_CHAR = 0x2A51, + UUID_GLUCOSE_MEASUREMENT_CHAR = 0x2A18, + UUID_GLUCOSE_MEASUREMENT_CONTEXT_CHAR = 0x2A34, + UUID_HARDWARE_REVISION_STRING_CHAR = 0x2A27, + UUID_HEART_RATE_CONTROL_POINT_CHAR = 0x2A39, + UUID_HEART_RATE_MEASUREMENT_CHAR = 0x2A37, + UUID_HID_CONTROL_POINT_CHAR = 0x2A4C, + UUID_HID_INFORMATION_CHAR = 0x2A4A, + UUID_IEEE_REGULATORY_CERTIFICATION_DATA_LIST_CHAR = 0x2A2A, + UUID_INTERMEDIATE_CUFF_PRESSURE_CHAR = 0x2A36, + UUID_INTERMEDIATE_TEMPERATURE_CHAR = 0x2A1E, + UUID_LOCAL_TIME_INFORMATION_CHAR = 0x2A0F, + UUID_MANUFACTURER_NAME_STRING_CHAR = 0x2A29, + UUID_MEASUREMENT_INTERVAL_CHAR = 0x2A21, + UUID_MODEL_NUMBER_STRING_CHAR = 0x2A24, + UUID_UNREAD_ALERT_CHAR = 0x2A45, + UUID_NEW_ALERT_CHAR = 0x2A46, + UUID_PNP_ID_CHAR = 0x2A50, + UUID_PROTOCOL_MODE_CHAR = 0x2A4E, + UUID_RECORD_ACCESS_CONTROL_POINT_CHAR = 0x2A52, + UUID_REFERENCE_TIME_INFORMATION_CHAR = 0x2A14, + UUID_REPORT_CHAR = 0x2A4D, + UUID_REPORT_MAP_CHAR = 0x2A4B, + UUID_RINGER_CONTROL_POINT_CHAR = 0x2A40, + UUID_RINGER_SETTING_CHAR = 0x2A41, + UUID_SCAN_INTERVAL_WINDOW_CHAR = 0x2A4F, + UUID_SCAN_REFRESH_CHAR = 0x2A31, + UUID_SERIAL_NUMBER_STRING_CHAR = 0x2A25, + UUID_SOFTWARE_REVISION_STRING_CHAR = 0x2A28, + UUID_SUPPORTED_NEW_ALERT_CATEGORY_CHAR = 0x2A47, + UUID_SUPPORTED_UNREAD_ALERT_CATEGORY_CHAR = 0x2A48, + UUID_SYSTEM_ID_CHAR = 0x2A23, + UUID_TEMPERATURE_MEASUREMENT_CHAR = 0x2A1C, + UUID_TEMPERATURE_TYPE_CHAR = 0x2A1D, + UUID_TIME_ACCURACY_CHAR = 0x2A12, + UUID_TIME_SOURCE_CHAR = 0x2A13, + UUID_TIME_UPDATE_CONTROL_POINT_CHAR = 0x2A16, + UUID_TIME_UPDATE_STATE_CHAR = 0x2A17, + UUID_TIME_WITH_DST_CHAR = 0x2A11, + UUID_TIME_ZONE_CHAR = 0x2A0E, + UUID_TX_POWER_LEVEL_CHAR = 0x2A07, + UUID_CSC_FEATURE_CHAR = 0x2A5C, + UUID_CSC_MEASUREMENT_CHAR = 0x2A5B, + UUID_RSC_FEATURE_CHAR = 0x2A54, + UUID_RSC_MEASUREMENT_CHAR = 0x2A53, + }; + /**************************************************************************/ /*! \brief Standard GATT characteristic presentation format unit types. @@ -236,7 +309,7 @@ uint16_t uuid; /* Characteristic UUID */ uint16_t lenMin; /* Minimum length of the value */ uint16_t lenMax; /* Maximum length of the value */ - uint8_t handle; + uint16_t handle; uint8_t properties; private:
--- a/GattService.cpp Fri Jan 17 14:25:29 2014 +0000 +++ b/GattService.cpp Tue Apr 01 11:04:56 2014 +0100 @@ -104,7 +104,7 @@ /* ToDo: Make sure this characteristic UUID doesn't already exist */ /* ToDo: Basic validation */ - characteristics[characteristicCount] = characteristic; + characteristics[characteristicCount] = &characteristic; characteristicCount++; return BLE_ERROR_NONE;
--- a/GattService.h Fri Jan 17 14:25:29 2014 +0000 +++ b/GattService.h Tue Apr 01 11:04:56 2014 +0100 @@ -40,10 +40,31 @@ UUID primaryServiceID; uint8_t characteristicCount; - GattCharacteristic characteristics[BLE_SERVICE_MAX_CHARACTERISTICS]; - uint8_t handle; - + GattCharacteristic* characteristics[BLE_SERVICE_MAX_CHARACTERISTICS]; + uint16_t handle; + ble_error_t addCharacteristic(GattCharacteristic &); + + enum { + UUID_ALERT_NOTIFICATION_SERVICE = 0x1811, + UUID_BATTERY_SERVICE = 0x180F, + UUID_BLOOD_PRESSURE_SERVICE = 0x1810, + UUID_CURRENT_TIME_SERVICE = 0x1805, + UUID_CYCLING_SPEED_AND_CADENCE = 0x1816, + UUID_DEVICE_INFORMATION_SERVICE = 0x180A, + UUID_GLUCOSE_SERVICE = 0x1808, + UUID_HEALTH_THERMOMETER_SERVICE = 0x1809, + UUID_HEART_RATE_SERVICE = 0x180D, + UUID_HUMAN_INTERFACE_DEVICE_SERVICE = 0x1812, + UUID_IMMEDIATE_ALERT_SERVICE = 0x1802, + UUID_LINK_LOSS_SERVICE = 0x1803, + UUID_NEXT_DST_CHANGE_SERVICE = 0x1807, + UUID_PHONE_ALERT_STATUS_SERVICE = 0x180E, + UUID_REFERENCE_TIME_UPDATE_SERVICE = 0x1806, + UUID_RUNNING_SPEED_AND_CADENCE = 0x1814, + UUID_SCAN_PARAMETERS_SERVICE = 0x1813, + UUID_TX_POWER_SERVICE = 0x1804 + }; }; #endif
--- a/blecommon.h Fri Jan 17 14:25:29 2014 +0000 +++ b/blecommon.h Tue Apr 01 11:04:56 2014 +0100 @@ -17,6 +17,11 @@ #ifndef __BLE_COMMON_H__ #define __BLE_COMMON_H__ +#define NRF51 +#define DEBUG_NRF_USER +#define BLE_STACK_SUPPORT_REQD +#define BOARD_PCA10001 + #ifdef __cplusplus extern "C" { #endif
--- a/hw/BLEDevice.h Fri Jan 17 14:25:29 2014 +0000 +++ b/hw/BLEDevice.h Tue Apr 01 11:04:56 2014 +0100 @@ -34,6 +34,7 @@ public: virtual Gap& getGap() = 0; virtual GattServer& getGattServer() = 0; + virtual ble_error_t init() = 0; virtual ble_error_t reset(void) = 0; };
--- a/hw/Gap.h Fri Jan 17 14:25:29 2014 +0000 +++ b/hw/Gap.h Tue Apr 01 11:04:56 2014 +0100 @@ -21,6 +21,7 @@ #include "blecommon.h" #include "GapAdvertisingData.h" #include "GapAdvertisingParams.h" +#include "GapEvents.h" /**************************************************************************/ /*! @@ -31,40 +32,45 @@ /**************************************************************************/ class Gap { - protected: - FunctionPointer m_callback_event; - + private: + GapEvents *m_pEventHandler; + public: - /******************************************************************/ - /*! - \brief - Identifies GAP events generated by the radio HW when an event - callback occurs - */ - /******************************************************************/ - typedef enum gap_event_e - { - GAP_EVENT_ADVERTISING_STARTED = 1, - GAP_EVENT_CONNECTED = 2, - GAP_EVENT_DISCONNECTED = 3 - } gapEvent_t; + /* These functions must be defined in the sub-class */ + virtual ble_error_t setAdvertisingData(GapAdvertisingData &, GapAdvertisingData &) = 0; + virtual ble_error_t startAdvertising(GapAdvertisingParams &) = 0; + virtual ble_error_t stopAdvertising(void) = 0; + virtual ble_error_t disconnect(void) = 0; + + /* Describes the current state of the device (more than one bit can be set) */ + typedef struct GapState_s + { + unsigned advertising : 1; /**< The device is current advertising */ + unsigned connected : 1; /**< The peripheral is connected to a central device */ + } GapState_t; - /* These functions must be defined in the sub-class */ - virtual ble_error_t setAdvertising(GapAdvertisingParams &, GapAdvertisingData &, GapAdvertisingData &) = 0; - virtual ble_error_t startAdvertising(void) = 0; - virtual ble_error_t stopAdvertising(void) = 0; - - uint16_t state; /* Initialising, Advertising, Scanning, Connected, etc. ... more than one bit can be set at a time! */ - - /* Event callback */ - void attach(void (*function)(void)) { - m_callback_event.attach( function ); - } - - template<typename T> - void attach(T *object, void (T::*member)(void)) { - m_callback_event.attach( object, member ); - } + /* Event callback handlers */ + void setEventHandler(GapEvents *pEventHandler) {m_pEventHandler = pEventHandler;} + void handleEvent(GapEvents::gapEvent_e type) { + if (NULL == m_pEventHandler) + return; + switch(type) { + case GapEvents::GAP_EVENT_TIMEOUT: + state.advertising = 0; + m_pEventHandler->onTimeout(); + break; + case GapEvents::GAP_EVENT_CONNECTED: + state.connected = 1; + m_pEventHandler->onConnected(); + break; + case GapEvents::GAP_EVENT_DISCONNECTED: + state.connected = 0; + m_pEventHandler->onDisconnected(); + break; + } + } + + GapState_t state; }; #endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hw/GapEvents.h Tue Apr 01 11:04:56 2014 +0100 @@ -0,0 +1,71 @@ +/* mbed Microcontroller Library + * Copyright (c) 2006-2013 ARM Limited + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __GAP_EVENTS_H__ +#define __GAP_EVENTS_H__ + +#include "blecommon.h" +#include "mbed.h" + +/**************************************************************************/ +/*! + \brief + The base class used to abstract away the callback events that can be + triggered with the GAP. +*/ +/**************************************************************************/ +class GapEvents { + public: + /******************************************************************/ + /*! + \brief + Identifies GAP events generated by the radio HW when an event + callback occurs + */ + /******************************************************************/ + typedef enum gapEvent_e + { + GAP_EVENT_TIMEOUT = 1, /**< Advertising timed out before a connection was established */ + GAP_EVENT_CONNECTED = 2, /**< A connection was established with a central device */ + GAP_EVENT_DISCONNECTED = 3 /**< A connection was closed or lost with a central device */ + } gapEvent_t; + + /******************************************************************/ + /*! + \brief + Advertising timed out before a connection was established + */ + /******************************************************************/ + virtual void onTimeout(void) {} + + /******************************************************************/ + /*! + \brief + A connection was established with a central device + */ + /******************************************************************/ + virtual void onConnected(void) {} + + /******************************************************************/ + /*! + \brief + A connection was closed or lost with a central device + */ + /******************************************************************/ + virtual void onDisconnected(void) {} +}; + +#endif
--- a/hw/GattServer.h Fri Jan 17 14:25:29 2014 +0000 +++ b/hw/GattServer.h Tue Apr 01 11:04:56 2014 +0100 @@ -17,10 +17,10 @@ #ifndef __GATT_SERVER_H__ #define __GATT_SERVER_H__ +#include "mbed.h" #include "blecommon.h" -#include "UUID.h" #include "GattService.h" -#include "mbed.h" +#include "GattServerEvents.h" /**************************************************************************/ /*! @@ -31,48 +31,46 @@ /**************************************************************************/ class GattServer { - protected: - FunctionPointer m_callback_event; + private: + GattServerEvents *m_pEventHandler; public: - /******************************************************************/ - /*! - \brief - Identifies GATT events generated by the radio HW when an event - callback occurs - */ - /******************************************************************/ - typedef enum gatt_event_e - { - GATT_EVENT_DATA_SENT = 1, /* Fired when a msg was successfully sent out */ - GATT_EVENT_DATA_WRITTEN = 2, /* Client wrote data to Server (separate into char and descriptor writes?) */ - GATT_EVENT_UPDATES_ENABLED = 3, /* Notify/Indicate Enabled in CCCD */ - GATT_EVENT_UPDATES_DISABLED = 4, /* Notify/Indicate Disnabled in CCCD */ - GATT_EVENT_CONFIRMATION_RECEIVED = 5 /* Response received from Indicate message */ - } gattEvent_t; - /* These functions must be defined in the sub-class */ virtual ble_error_t addService(GattService &) = 0; - virtual ble_error_t readValue(uint8_t, uint8_t[], uint16_t) = 0; - virtual ble_error_t updateValue(uint8_t, uint8_t[], uint16_t) = 0; - + virtual ble_error_t readValue(uint16_t, uint8_t[], uint16_t) = 0; + virtual ble_error_t updateValue(uint16_t, uint8_t[], uint16_t, bool localOnly = false) = 0; + // ToDo: For updateValue, check the CCCD to see if the value we are // updating has the notify or indicate bits sent, and if BOTH are set // be sure to call sd_ble_gatts_hvx() twice with notify then indicate! // Strange use case, but valid and must be covered! + /* Event callback handlers */ + void setEventHandler(GattServerEvents *pEventHandler) {m_pEventHandler = pEventHandler;} + void handleEvent(GattServerEvents::gattEvent_e type, uint16_t charHandle) { + if (NULL == m_pEventHandler) + return; + switch(type) { + case GattServerEvents::GATT_EVENT_DATA_SENT: + m_pEventHandler->onDataSent(charHandle); + break; + case GattServerEvents::GATT_EVENT_DATA_WRITTEN: + m_pEventHandler->onDataWritten(charHandle); + break; + case GattServerEvents::GATT_EVENT_UPDATES_ENABLED: + m_pEventHandler->onUpdatesEnabled(charHandle); + break; + case GattServerEvents::GATT_EVENT_UPDATES_DISABLED: + m_pEventHandler->onUpdatesDisabled(charHandle); + break; + case GattServerEvents::GATT_EVENT_CONFIRMATION_RECEIVED: + m_pEventHandler->onConfirmationReceived(charHandle); + break; + } + } + uint8_t serviceCount; uint8_t characteristicCount; - - /* Event callback */ - void attach(void (*function)(void)) { - m_callback_event.attach( function ); - } - - template<typename T> - void attach(T *object, void (T::*member)(void)) { - m_callback_event.attach( object, member ); - } }; #endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hw/GattServerEvents.h Tue Apr 01 11:04:56 2014 +0100 @@ -0,0 +1,91 @@ +/* mbed Microcontroller Library + * Copyright (c) 2006-2013 ARM Limited + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __GATT_SERVER_EVENTS_H__ +#define __GATT_SERVER_EVENTS_H__ + +#include "blecommon.h" +#include "mbed.h" + +/**************************************************************************/ +/*! + \brief + The base class used to abstract away the callback events that can be + triggered with the GATT Server. +*/ +/**************************************************************************/ +class GattServerEvents { + public: + /******************************************************************/ + /*! + \brief + Identifies GATT events generated by the radio HW when an event + callback occurs + */ + /******************************************************************/ + typedef enum gattEvent_e + { + GATT_EVENT_DATA_SENT = 1, /**< Fired when a msg was successfully sent out (notify only?) */ + GATT_EVENT_DATA_WRITTEN = 2, /**< Client wrote data to Server (separate into char and descriptor writes?) */ + GATT_EVENT_UPDATES_ENABLED = 3, /**< Notify/Indicate Enabled in CCCD */ + GATT_EVENT_UPDATES_DISABLED = 4, /**< Notify/Indicate Disabled in CCCD */ + GATT_EVENT_CONFIRMATION_RECEIVED = 5 /**< Response received from Indicate message */ + } gattEvent_t; + + /******************************************************************/ + /*! + \brief + A message was successfully transmitted + */ + /******************************************************************/ + virtual void onDataSent(uint16_t charHandle) {} + + /******************************************************************/ + /*! + \brief + The GATT client (the phone, tablet, etc.) wrote data to a + characteristic or descriptor on the GATT Server (the peripheral + device). + */ + /******************************************************************/ + virtual void onDataWritten(uint16_t charHandle) {} + + /******************************************************************/ + /*! + \brief + A Notify or Indicate flag was enabled in the CCCD + */ + /******************************************************************/ + virtual void onUpdatesEnabled(uint16_t charHandle) {} + + /******************************************************************/ + /*! + \brief + A Notify or Indicate flag was disabled in the CCCD + */ + /******************************************************************/ + virtual void onUpdatesDisabled(uint16_t charHandle) {} + + /******************************************************************/ + /*! + \brief + A confirmation response was received from an Indicate message + */ + /******************************************************************/ + virtual void onConfirmationReceived(uint16_t charHandle) {} +}; + +#endif
--- a/hw/nRF51822s/nRF51822s.cpp Fri Jan 17 14:25:29 2014 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,91 +0,0 @@ -/* mbed Microcontroller Library - * Copyright (c) 2006-2013 ARM Limited - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "mbed.h" -#include "nRF51822s.h" - -/**************************************************************************/ -/*! - @brief UART callback function -*/ -/**************************************************************************/ -void nRF51822s::uartCallback(void) -{ - /* ToDo: Check responses and set a flag for success/error/etc. */ - - /* Read serial to clear the RX interrupt */ - uart.getc(); -} - -/**************************************************************************/ -/*! - @brief Constructor -*/ -/**************************************************************************/ -nRF51822s::nRF51822s(PinName tx, PinName rx, PinName rts, PinName cts) : uart(tx, rx), gap(uart), gattServer(uart) -{ - /* Setup the nRF UART interface */ - uart.baud(9600); - - /* Echo data on the debug CDC port */ - uart.attach(this, &nRF51822s::uartCallback); - - /* Add flow control for UART (required by the nRF51822) */ - uart.set_flow_control(RawSerial::RTSCTS, rts, cts); -} - -/**************************************************************************/ -/*! - @brief Destructor -*/ -/**************************************************************************/ -nRF51822s::~nRF51822s(void) -{ -} - -/**************************************************************************/ -/*! - @brief Resets the BLE HW, removing any existing services and - characteristics - - @returns ble_error_t - - @retval BLE_ERROR_NONE - Everything executed properly - - @section EXAMPLE - - @code - - @endcode -*/ -/**************************************************************************/ -ble_error_t nRF51822s::reset(void) -{ - wait(0.5); - - /* Command ID = 0x0005, No payload */ - uart.printf("10 05 00 00\r\n"); - - /* Reset the service and characteristic counters */ - //serviceCount = 0; - //characteristicCount = 0; - - /* Wait for the radio to come back up */ - wait(1); - - return BLE_ERROR_NONE; -}
--- a/hw/nRF51822s/nRF51822s.h Fri Jan 17 14:25:29 2014 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,51 +0,0 @@ -/* mbed Microcontroller Library - * Copyright (c) 2006-2013 ARM Limited - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef __NRF51822_H__ -#define __NRF51822_H__ - -#include "mbed.h" -#include "blecommon.h" -#include "hw/BLEDevice.h" -#include "hw/nRF51822s/nRF51Gap.h" -#include "hw/nRF51822s/nRF51GattServer.h" - -/**************************************************************************/ -/*! - \brief - -*/ -/**************************************************************************/ -class nRF51822s : public BLEDevice -{ - protected: - RawSerial uart; - nRF51Gap gap; - nRF51GattServer gattServer; - - public: - nRF51822s(PinName, PinName, PinName, PinName); - virtual ~nRF51822s(void); - - virtual Gap& getGap() { return gap; }; - virtual GattServer& getGattServer() { return gattServer; }; - virtual ble_error_t reset(void); - - private: - void uartCallback(void); -}; - -#endif
--- a/hw/nRF51822s/nRF51Gap.cpp Fri Jan 17 14:25:29 2014 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,255 +0,0 @@ -/* mbed Microcontroller Library - * Copyright (c) 2006-2013 ARM Limited - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "nRF51Gap.h" -#include "mbed.h" - -/**************************************************************************/ -/*! - @brief Constructor -*/ -/**************************************************************************/ -nRF51Gap::nRF51Gap(RawSerial &serial) : Gap(), uart(serial) -{ - /* ToDo: Reset the service and characteristic counters */ - /* ToDo: Set state variable to an appropriate value */ -} - -/**************************************************************************/ -/*! - @brief Destructor -*/ -/**************************************************************************/ -nRF51Gap::~nRF51Gap(void) -{ -} - -/**************************************************************************/ -/*! - @brief Sets the advertising parameters and payload for the device - - @param[in] params - Basic advertising details, including the advertising - delay, timeout and how the device should be advertised - @params[in] advData - The primary advertising data payload - @params[in] scanResponse - The optional Scan Response payload if the advertising - type is set to \ref GapAdvertisingParams::ADV_SCANNABLE_UNDIRECTED - in \ref GapAdveritinngParams - - @returns \ref ble_error_t - - @retval BLE_ERROR_NONE - Everything executed properly - - @retval BLE_ERROR_BUFFER_OVERFLOW - The proposed action would cause a buffer overflow. All - advertising payloads must be <= 31 bytes, for example. - - @retval BLE_ERROR_NOT_IMPLEMENTED - A feature was requested that is not yet supported in the - nRF51 firmware or hardware. - - @retval BLE_ERROR_PARAM_OUT_OF_RANGE - One of the proposed values is outside the valid range. - - @section EXAMPLE - - @code - - @endcode -*/ -/**************************************************************************/ -ble_error_t nRF51Gap::setAdvertising(GapAdvertisingParams & params, GapAdvertisingData & advData, GapAdvertisingData & scanResponse) -{ - uint8_t len = 0; - uint8_t *buffer; - - /* Make sure we support the advertising type */ - if (params.getAdvertisingType() == GapAdvertisingParams::ADV_CONNECTABLE_DIRECTED) - { - /* ToDo: This requires a propery security implementation, etc. */ - return BLE_ERROR_NOT_IMPLEMENTED; - } - - /* Check interval range */ - if (params.getAdvertisingType() == GapAdvertisingParams::ADV_NON_CONNECTABLE_UNDIRECTED) - { - /* Min delay is slightly longer for unconnectable devices */ - if ((params.getInterval() < GAP_ADV_PARAMS_INTERVAL_MIN_NONCON) || - (params.getInterval() > GAP_ADV_PARAMS_INTERVAL_MAX)) - { - return BLE_ERROR_PARAM_OUT_OF_RANGE; - } - } - else - { - if ((params.getInterval() < GAP_ADV_PARAMS_INTERVAL_MIN) || - (params.getInterval() > GAP_ADV_PARAMS_INTERVAL_MAX)) - { - return BLE_ERROR_PARAM_OUT_OF_RANGE; - } - } - - /* Check timeout is zero for Connectable Directed */ - if ((params.getAdvertisingType() == GapAdvertisingParams::ADV_CONNECTABLE_DIRECTED) && - (params.getTimeout() != 0)) - { - /* Timeout must be 0 with this type, although we'll never get here */ - /* since this isn't implemented yet anyway */ - return BLE_ERROR_PARAM_OUT_OF_RANGE; - } - - /* Check timeout for other advertising types */ - if ((params.getAdvertisingType() != GapAdvertisingParams::ADV_CONNECTABLE_DIRECTED) && - (params.getTimeout() > GAP_ADV_PARAMS_TIMEOUT_MAX)) - { - return BLE_ERROR_PARAM_OUT_OF_RANGE; - } - - /* Make sure we don't exceed the advertising payload length */ - if (advData.getPayloadLen() > GAP_ADVERTISING_DATA_MAX_PAYLOAD) - { - return BLE_ERROR_BUFFER_OVERFLOW; - } - - /* Check the scan response payload limits */ - if ((params.getAdvertisingType() == GapAdvertisingParams::ADV_SCANNABLE_UNDIRECTED)) - { - /* Check if we're within the upper limit */ - if (advData.getPayloadLen() > GAP_ADVERTISING_DATA_MAX_PAYLOAD) - { - return BLE_ERROR_BUFFER_OVERFLOW; - } - /* Make sure we have a payload! */ - if (advData.getPayloadLen() == 0) - { - return BLE_ERROR_PARAM_OUT_OF_RANGE; - } - } - - /* ToDo: Perform some checks on the payload, for example the Scan Response can't */ - /* contains a flags AD type, etc. */ - - /* ToDo: Refactor these actions into separate private functions */ - - /* 1.) Send advertising params, Command IDs = 0x000C, 0x000D, 0x000E */ - /* A.) Command ID = 0x000C, Advertising Interval, uint16_t */ - uart.printf("10 0C 00 02 %02X %02X\r\n", (uint8_t)(params.getInterval() & 0xFF), - (uint8_t)(params.getInterval() >> 8)); - /* ToDo: Check response */ - wait(0.5); - - /* B.) Command ID = 0x000D, Advertising Timeout, uint16_t */ - uart.printf("10 0D 00 02 %02X %02X\r\n", (uint8_t)(params.getTimeout() & 0xFF), - (uint8_t)(params.getTimeout() >> 8)); - /* ToDo: Check response */ - wait(0.5); - - /* C.) Command ID = 0x000E, Advertising Type, uint8_t */ - uart.printf("10 0E 00 01 %02X\r\n", (uint8_t)(params.getAdvertisingType())); - /* ToDo: Check response */ - wait(0.5); - - /* 2.) Send advertising data, Command ID = 0x000A */ - len = advData.getPayloadLen(); - buffer = advData.getPayload(); - uart.printf("10 0A 00 %02X", len); - for (uint16_t i = 0; i < len; i++) - { - uart.printf(" %02X", buffer[i]); - } - uart.printf("\r\n"); - - /* ToDo: Check response */ - wait(0.1); - - /* 3.) Send scan response data, Command ID = 0x000B */ - if ((params.getAdvertisingType() == GapAdvertisingParams::ADV_SCANNABLE_UNDIRECTED)) - { - len = scanResponse.getPayloadLen(); - buffer = scanResponse.getPayload(); - uart.printf("10 0B 00 %02X", len); - for (uint16_t i = 0; i < len; i++) - { - uart.printf(" %02X", buffer[i]); - } - uart.printf("\r\n"); - - /* ToDo: Check response */ - wait(0.1); - } - - return BLE_ERROR_NONE; -} - -/**************************************************************************/ -/*! - @brief Starts the BLE HW, initialising any services that were - added before this function was called. - - @note All services must be added before calling this function! - - @returns ble_error_t - - @retval BLE_ERROR_NONE - Everything executed properly - - @section EXAMPLE - - @code - - @endcode -*/ -/**************************************************************************/ -ble_error_t nRF51Gap::startAdvertising(void) -{ - /* Command ID = 0x0003, No payload */ - uart.printf("10 03 00 00\r\n"); - - /* ToDo: Check response */ - wait(0.5); - - return BLE_ERROR_NONE; -} - -/**************************************************************************/ -/*! - @brief Stops the BLE HW and disconnects from any devices - - @returns ble_error_t - - @retval BLE_ERROR_NONE - Everything executed properly - - @section EXAMPLE - - @code - - @endcode -*/ -/**************************************************************************/ -ble_error_t nRF51Gap::stopAdvertising(void) -{ - /* Command ID = 0x0004, No payload */ - uart.printf("10 04 00 00\r\n"); - - /* ToDo: Check response */ - wait(0.1); - - return BLE_ERROR_NONE; -}
--- a/hw/nRF51822s/nRF51Gap.h Fri Jan 17 14:25:29 2014 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,47 +0,0 @@ -/* mbed Microcontroller Library - * Copyright (c) 2006-2013 ARM Limited - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef __NRF51822_GAP_H__ -#define __NRF51822_GAP_H__ - -#include "mbed.h" -#include "blecommon.h" -#include "GapAdvertisingParams.h" -#include "GapAdvertisingData.h" -#include "hw/Gap.h" - -/**************************************************************************/ -/*! - \brief - -*/ -/**************************************************************************/ -class nRF51Gap : public Gap -{ - public: - nRF51Gap(RawSerial &); - virtual ~nRF51Gap(void); - - /* Functions that must be implemented from Gap */ - virtual ble_error_t setAdvertising(GapAdvertisingParams &, GapAdvertisingData &, GapAdvertisingData &); - virtual ble_error_t startAdvertising(void); - virtual ble_error_t stopAdvertising(void); - - private: - RawSerial& uart; -}; - -#endif
--- a/hw/nRF51822s/nRF51GattServer.cpp Fri Jan 17 14:25:29 2014 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,197 +0,0 @@ -/* mbed Microcontroller Library - * Copyright (c) 2006-2013 ARM Limited - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "nRF51GattServer.h" -#include "mbed.h" - -/* ToDo: Convert to Singleton! */ - -/**************************************************************************/ -/*! - @brief Constructor -*/ -/**************************************************************************/ -nRF51GattServer::nRF51GattServer(RawSerial &serial): GattServer(), uart(serial) -{ - /* Reset the service and characteristic counters */ - serviceCount = 0; - characteristicCount = 0; -} - -/**************************************************************************/ -/*! - @brief Destructor -*/ -/**************************************************************************/ -nRF51GattServer::~nRF51GattServer(void) -{ -} - -/**************************************************************************/ -/*! - @brief Adds a new service to the GATT table on the peripheral - - @returns ble_error_t - - @retval BLE_ERROR_NONE - Everything executed properly - - @section EXAMPLE - - @code - - @endcode -*/ -/**************************************************************************/ -ble_error_t nRF51GattServer::addService(GattService & service) -{ - /* ToDo: Make sure we don't overflow the array, etc. */ - /* ToDo: Make sure this service UUID doesn't already exist (?) */ - /* ToDo: Basic validation */ - - /* Add the service to the nRF51 */ - if (service.primaryServiceID.type == UUID::UUID_TYPE_SHORT) - { - /* 16-bit BLE UUID */ - uart.printf("10 01 00 04 01 02 %02X %02X\r\n", - service.primaryServiceID.value & 0xFF, - service.primaryServiceID.value >> 8); - } - else - { - /* 128-bit Custom UUID */ - uart.printf("10 01 00 12 01 10 %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X\r\n", - service.primaryServiceID.base[0], - service.primaryServiceID.base[1], - service.primaryServiceID.base[2], - service.primaryServiceID.base[3], - service.primaryServiceID.base[4], - service.primaryServiceID.base[5], - service.primaryServiceID.base[6], - service.primaryServiceID.base[7], - service.primaryServiceID.base[8], - service.primaryServiceID.base[9], - service.primaryServiceID.base[10], - service.primaryServiceID.base[11], - service.primaryServiceID.base[12], - service.primaryServiceID.base[13], - service.primaryServiceID.base[14], - service.primaryServiceID.base[15]); - } - - /* ToDo: Check response */ - wait(0.1); - - /* Add characteristics to the service */ - for (uint8_t i = 0; i < service.characteristicCount; i++) - { - /* Command ID = 0x0002 */ - uart.printf("10 02 00 0F 01 02 %02X %02X 04 02 %02X %02X 05 02 %02X %02X 03 01 %02X\r\n", - service.characteristics[i].uuid & 0xFF, - service.characteristics[i].uuid >> 8, - service.characteristics[i].lenMin & 0xFF, - service.characteristics[i].lenMin >> 8, - service.characteristics[i].lenMax & 0xFF, - service.characteristics[i].lenMax >> 8, - service.characteristics[i].properties); - - /* ToDo: Check response */ - wait(0.1); - - /* Update the characteristic handle */ - service.characteristics[i].handle = characteristicCount; - characteristicCount++; - } - - /* Update the service handle */ - service.handle = serviceCount; - serviceCount++; - - return BLE_ERROR_NONE; -} - -/**************************************************************************/ -/*! - @brief Reads the value of a characteristic, based on the service - and characteristic index fields - - @param[in] charHandle - The handle of the GattCharacteristic to read from - @param[in] buffer - Buffer to hold the the characteristic's value - (raw byte array in LSB format) - @param[in] len - The number of bytes read into the buffer - - @returns ble_error_t - - @retval BLE_ERROR_NONE - Everything executed properly - - @section EXAMPLE - - @code - - @endcode -*/ -/**************************************************************************/ -ble_error_t nRF51GattServer::readValue(uint8_t charHandle, uint8_t buffer[], uint16_t len) -{ - /* ToDo */ - - return BLE_ERROR_NONE; -} - -/**************************************************************************/ -/*! - @brief Updates the value of a characteristic, based on the service - and characteristic index fields - - @param[in] charHandle - The handle of the GattCharacteristic to write to - @param[in] buffer - Data to use when updating the characteristic's value - (raw byte array in LSB format) - @param[in] len - The number of bytes in buffer - - @returns ble_error_t - - @retval BLE_ERROR_NONE - Everything executed properly - - @section EXAMPLE - - @code - - @endcode -*/ -/**************************************************************************/ -ble_error_t nRF51GattServer::updateValue(uint8_t charHandle, uint8_t buffer[], uint16_t len) -{ - /* Command ID = 0x0006, Payload = Characteristic ID, Value */ - uart.printf("10 06 00 %02X %02X", len + 1, charHandle); - for (uint16_t i = 0; i<len; i++) - { - uart.printf(" %02X", buffer[i]); - } - uart.printf("\r\n"); - - /* ToDo: Check response */ - wait(0.1); - - return BLE_ERROR_NONE; -}
--- a/hw/nRF51822s/nRF51GattServer.h Fri Jan 17 14:25:29 2014 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,49 +0,0 @@ -/* mbed Microcontroller Library - * Copyright (c) 2006-2013 ARM Limited - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef __NRF51822_GATT_SERVER_H__ -#define __NRF51822_GATT_SERVER_H__ - -#include "mbed.h" -#include "blecommon.h" -#include "GattService.h" -#include "hw/GattServer.h" - -/**************************************************************************/ -/*! - \brief - -*/ -/**************************************************************************/ -class nRF51GattServer : public GattServer -{ - public: - nRF51GattServer(RawSerial &); - virtual ~nRF51GattServer(void); - - /* Functions that must be implemented from GattServer */ - virtual ble_error_t addService(GattService &); - virtual ble_error_t readValue(uint8_t, uint8_t[], uint16_t); - virtual ble_error_t updateValue(uint8_t, uint8_t[], uint16_t); - - /* nRF51 Functions */ - void uartCallback(void); - - private: - RawSerial& uart; -}; - -#endif