Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of BLE_API by
Revision 23:f19c60478e1b, committed 2014-01-07
- Comitter:
- ktownsend
- Date:
- Tue Jan 07 19:58:06 2014 +0000
- Parent:
- 22:260313bcf4d0
- Child:
- 24:12eb3f19e9a4
- Commit message:
- Added GattService example
Changed in this revision
--- a/GattCharacteristic.cpp Tue Jan 07 10:54:02 2014 +0000
+++ b/GattCharacteristic.cpp Tue Jan 07 19:58:06 2014 +0000
@@ -36,6 +36,7 @@
memcpy(&properties, &props, 1);
lenMin = minLen;
lenMax = maxLen;
+ handle = 0;
}
/**************************************************************************/
--- a/GattCharacteristic.h Tue Jan 07 10:54:02 2014 +0000
+++ b/GattCharacteristic.h Tue Jan 07 19:58:06 2014 +0000
@@ -9,7 +9,7 @@
private:
public:
- GattCharacteristic(uint16_t uuid, uint16_t minLen, uint16_t maxLen, uint8_t properties);
+ GattCharacteristic(uint16_t uuid=0, uint16_t minLen=1, uint16_t maxLen=1, uint8_t properties=0);
virtual ~GattCharacteristic(void);
uint16_t uuid; /* Characteristic UUID */
--- a/GattService.cpp Tue Jan 07 10:54:02 2014 +0000
+++ b/GattService.cpp Tue Jan 07 19:58:06 2014 +0000
@@ -23,7 +23,6 @@
{
primaryServiceID.update(base_uuid);
characteristicCount = 0;
- memset(&characteristics, 0, sizeof(serialisedChar_t) * BLE_SERVICE_MAX_CHARACTERISTICS);
handle = 0;
}
@@ -46,7 +45,6 @@
{
primaryServiceID.update( ble_uuid );
characteristicCount = 0;
- memset(&characteristics, 0, sizeof(serialisedChar_t) * BLE_SERVICE_MAX_CHARACTERISTICS);
handle = 0;
}
@@ -61,17 +59,11 @@
/**************************************************************************/
/*!
- @brief Adds a GattCharacterisic to the service, serialising the
- essential data for the characteristic.
+ @brief Adds a GattCharacterisic to the service.
- @note The GattService does not store a reference to the source
- GattCharacteristic, only a serialised version of the key
- properties required to create the characteristic on the
- target radio board.
-
- @note This function will update the .handle field in the
- GattCharacteristic to indicate where this characteristic was
- stored in the GattService's characteristic array.
+ @note This function will not update the .handle field in the
+ GattCharacteristic. This value is updated when the parent
+ service is added via the radio driver.
@param[in] characteristic
The GattCharacteristic object describing the characteristic
@@ -94,22 +86,8 @@
/* ToDo: Make sure we don't overflow the array, etc. */
/* ToDo: Make sure this characteristic UUID doesn't already exist */
/* ToDo: Basic validation */
-
- serialisedChar_t c;
-
- /* Serialise the source GattCharacteristic */
- memcpy(&c.id, &characteristic.uuid, 2);
- memcpy(&c.lenMin, &characteristic.lenMin, 2);
- memcpy(&c.lenMax, &characteristic.lenMax, 2);
- memcpy(&c.properties, &characteristic.properties, 2);
- memset(&c.reserved, 0, 1);
-
- /* Insert the serialised object into the buffer */
- memcpy(&characteristics[characteristicCount], &c, sizeof(serialisedChar_t));
-
- /* Update the handle value */
- characteristic.handle = characteristicCount;
-
+
+ characteristics[characteristicCount] = characteristic;
characteristicCount++;
return BLE_ERROR_NONE;
--- a/GattService.h Tue Jan 07 10:54:02 2014 +0000
+++ b/GattService.h Tue Jan 07 19:58:06 2014 +0000
@@ -12,22 +12,13 @@
private:
public:
- typedef struct
- {
- uint16_t id;
- uint16_t lenMin;
- uint16_t lenMax;
- uint8_t properties;
- uint8_t reserved;
- } serialisedChar_t;
-
GattService(uint8_t[16]); /* 128-bit Base UUID */
GattService(uint16_t); /* 16-bit BLE UUID */
virtual ~GattService(void);
UUID primaryServiceID;
uint8_t characteristicCount;
- serialisedChar_t characteristics[BLE_SERVICE_MAX_CHARACTERISTICS];
+ GattCharacteristic characteristics[BLE_SERVICE_MAX_CHARACTERISTICS];
uint8_t handle;
ble_error_t addCharacteristic(GattCharacteristic &);
--- a/hw/bleradio.h Tue Jan 07 10:54:02 2014 +0000
+++ b/hw/bleradio.h Tue Jan 07 19:58:06 2014 +0000
@@ -35,14 +35,15 @@
} radioEvent_t;
uint8_t serviceCount;
-
+ uint8_t characteristicCount;
+
/* ToDo: Force constructor with event handler callback */
/* These functions must be defined in the sub-class */
virtual ble_error_t setAdvertising(GapAdvertisingParams &, GapAdvertisingData &, GapAdvertisingData &) = 0;
virtual ble_error_t addService(GattService &) = 0;
- virtual ble_error_t readCharacteristic(GattService &, GattCharacteristic &, uint8_t[], uint16_t) = 0;
- virtual ble_error_t writeCharacteristic(GattService &, GattCharacteristic &, uint8_t[], uint16_t) = 0;
+ virtual ble_error_t readCharacteristic(uint8_t, uint8_t[], uint16_t) = 0;
+ virtual ble_error_t writeCharacteristic(uint8_t, uint8_t[], uint16_t) = 0;
virtual ble_error_t start(void) = 0;
virtual ble_error_t stop(void) = 0;
virtual ble_error_t reset(void) = 0;
--- a/hw/nrf51822.cpp Tue Jan 07 10:54:02 2014 +0000
+++ b/hw/nrf51822.cpp Tue Jan 07 19:58:06 2014 +0000
@@ -30,8 +30,9 @@
/* Add flow control for UART (required by the nRF51822) */
uart.set_flow_control(RawSerial::RTSCTS, p30, p29);
- /* Reset the service counter */
+ /* Reset the service and characteristic counters */
serviceCount = 0;
+ characteristicCount = 0;
}
/**************************************************************************/
@@ -263,8 +264,8 @@
{
/* 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].id & 0xFF,
- service.characteristics[i].id >> 8,
+ 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,
@@ -273,9 +274,13 @@
/* ToDo: Check response */
wait(0.1);
- }
+
+ /* Update the characteristic handle */
+ service.characteristics[i].handle = characteristicCount;
+ characteristicCount++;
+ }
- /* Update the service index value */
+ /* Update the service handle */
service.handle = serviceCount;
serviceCount++;
@@ -287,10 +292,8 @@
@brief Reads the value of a characteristic, based on the service
and characteristic index fields
- @param[in] service
- The GattService to read from
- @param[in] characteristic
- The GattCharacteristic to read from
+ @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)
@@ -309,7 +312,7 @@
@endcode
*/
/**************************************************************************/
-ble_error_t nRF51822::readCharacteristic(GattService &service, GattCharacteristic &characteristic, uint8_t buffer[], uint16_t len)
+ble_error_t nRF51822::readCharacteristic(uint8_t charHandle, uint8_t buffer[], uint16_t len)
{
/* ToDo */
@@ -320,11 +323,9 @@
/*!
@brief Updates the value of a characteristic, based on the service
and characteristic index fields
-
- @param[in] service
- The GattService to write to
- @param[in] characteristic
- The GattCharacteristic to write to
+
+ @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)
@@ -343,10 +344,10 @@
@endcode
*/
/**************************************************************************/
-ble_error_t nRF51822::writeCharacteristic(GattService &service, GattCharacteristic &characteristic, uint8_t buffer[], uint16_t len)
+ble_error_t nRF51822::writeCharacteristic(uint8_t charHandle, uint8_t buffer[], uint16_t len)
{
- /* Command ID = 0x0006, Payload = Service ID, Characteristic ID, Value */
- uart.printf("10 06 00 %02X %02X %02X", len + 2, characteristic.handle, service.handle);
+ /* 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]);
@@ -438,8 +439,9 @@
/* Command ID = 0x0005, No payload */
uart.printf("10 05 00 00\r\n");
- /* Reset the service counter */
+ /* Reset the service and characteristic counters */
serviceCount = 0;
+ characteristicCount = 0;
/* Wait for the radio to come back up */
wait(1);
--- a/hw/nrf51822.h Tue Jan 07 10:54:02 2014 +0000
+++ b/hw/nrf51822.h Tue Jan 07 19:58:06 2014 +0000
@@ -22,8 +22,8 @@
/* Functions that mus be implemented from BLERadio */
virtual ble_error_t setAdvertising(GapAdvertisingParams &, GapAdvertisingData &, GapAdvertisingData &);
virtual ble_error_t addService(GattService &);
- virtual ble_error_t readCharacteristic(GattService &, GattCharacteristic &, uint8_t[], uint16_t);
- virtual ble_error_t writeCharacteristic(GattService &, GattCharacteristic &, uint8_t[], uint16_t);
+ virtual ble_error_t readCharacteristic(uint8_t, uint8_t[], uint16_t);
+ virtual ble_error_t writeCharacteristic(uint8_t, uint8_t[], uint16_t);
virtual ble_error_t start(void);
virtual ble_error_t stop(void);
virtual ble_error_t reset(void);
--- a/main.cpp Tue Jan 07 10:54:02 2014 +0000
+++ b/main.cpp Tue Jan 07 19:58:06 2014 +0000
@@ -9,14 +9,13 @@
void startBeacon(void)
{
+ ble_error_t error;
GapAdvertisingParams advParams ( GapAdvertisingParams::ADV_NON_CONNECTABLE_UNDIRECTED );
GapAdvertisingData advData;
GapAdvertisingData scanResponse;
uint8_t iBeaconPayload[25] = { 0x4C, 0x00, 0x02, 0x15, 0xE2, 0x0A, 0x39, 0xF4, 0x73, 0xF5, 0x4B, 0xC4, 0xA1, 0x2F, 0x17, 0xD1, 0xAD, 0x07, 0xA9, 0x61, 0x00, 0x00, 0x00, 0x00, 0xC8 };
- /* ToDo: Check error conditions in a shared ASSERT with debug output via printf */
- ble_error_t error;
/* iBeacon includes the FLAG and MSD fields */
error = advData.addFlags(GapAdvertisingData::BREDR_NOT_SUPPORTED);
@@ -25,6 +24,31 @@
error = radio.reset();
error = radio.setAdvertising(advParams, advData, scanResponse);
error = radio.start();
+
+ /* Hang around here for a while */
+ while(1)
+ {
+ }
+}
+
+void startBatteryService(void)
+{
+ ble_error_t error;
+ GattService battService ( 0x180F );
+ GattCharacteristic battLevel ( 0x2A19, 1, 1, 0x10 | 0x02);
+
+ error = radio.reset();
+ error = battService.addCharacteristic(battLevel);
+ error = radio.addService(battService);
+ error = radio.start();
+
+ uint8_t batt = 72;
+ error = radio.writeCharacteristic(battLevel.handle, (uint8_t*)&batt, sizeof(batt));
+
+ /* Hang around here for a while */
+ while(1)
+ {
+ }
}
int main()
@@ -32,7 +56,8 @@
/* Give the radio some time to boot up and settle */
wait(2);
- startBeacon();
+ // startBeacon();
+ startBatteryService();
while(1);
}
