An example BLE Health Thermometer using the mbed BLE API and Nordic NRF51822
Dependencies: BLE_API_Native_blog TMP102 mbed
Revision 2:f11df1469db2, committed 2014-02-23
- Comitter:
- donalm
- Date:
- Sun Feb 23 14:39:55 2014 +0000
- Parent:
- 1:0b759b99a902
- Commit message:
- Some tidy up while writing the blog.
Changed in this revision
main.cpp | Show annotated file Show diff for this revision Revisions of this file |
diff -r 0b759b99a902 -r f11df1469db2 main.cpp --- a/main.cpp Sun Feb 23 12:53:35 2014 +0000 +++ b/main.cpp Sun Feb 23 14:39:55 2014 +0000 @@ -21,18 +21,10 @@ nRF51822n nrf; /* BLE radio driver */ TMP102 healthThemometer(p22, p20, 0x90); /* The TMP102 connected to our board */ -/* LEDs and serial output for debug: */ -DigitalOut led1(LED1); -DigitalOut led2(LED2); -Serial pc(USBTX,USBRX); - +/* LEDs for indication: */ +DigitalOut oneSecondLed(LED1); /* LED1 is toggled every second. */ +DigitalOut advertisingStateLed(LED2); /* LED2 is on when we are advertising, otherwise off. */ -/* Device Information service */ -uint8_t manufacturerName[4] = { 'm', 'b', 'e', 'd' }; -GattService deviceInformationService ( GattService::UUID_DEVICE_INFORMATION_SERVICE ); -GattCharacteristic deviceManufacturer ( GattCharacteristic::UUID_MANUFACTURER_NAME_STRING_CHAR, - sizeof(manufacturerName), sizeof(manufacturerName), - GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ); /* Health Thermometer Service */ uint8_t thermTempPayload[5] = { 0, 0, 0, 0, 0 }; @@ -53,6 +45,7 @@ GapAdvertisingData advData; GapAdvertisingData scanResponse; GapAdvertisingParams advParams ( GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED ); + uint16_t uuid16_list[] = {GattService::UUID_HEALTH_THERMOMETER_SERVICE, GattService::UUID_BATTERY_SERVICE}; @@ -67,59 +60,18 @@ /**************************************************************************/ class GapEventHandler : public GapEvents { - virtual void onTimeout(void) - { - pc.printf("Advertising Timeout!\n\r"); - // Restart the advertising process with a much slower interval, - // only start advertising again after a button press, etc. - } - + //virtual void onTimeout(void) {} + virtual void onConnected(void) { - pc.printf("Connected!\n\r"); + advertisingStateLed = 0; } + /* When a client device disconnects we need to start advertising again. */ virtual void onDisconnected(void) { - pc.printf("Disconnected!\n\r"); - pc.printf("Restarting the advertising process\n\r"); nrf.getGap().startAdvertising(advParams); - } -}; - -/**************************************************************************/ -/*! - @brief This custom class can be used to override any GattServerEvents - that you are interested in handling on an application level. -*/ -/**************************************************************************/ -class GattServerEventHandler : public GattServerEvents -{ - //virtual void onDataSent(void) {} - //virtual void onDataWritten(void) {} - - virtual void onUpdatesEnabled(uint16_t charHandle) - { - if (charHandle == thermTemp.handle) - { - pc.printf("Temperature indication enabled\n\r"); - } - } - - virtual void onUpdatesDisabled(uint16_t charHandle) - { - if (charHandle == thermTemp.handle) - { - pc.printf("Temperature indication disabled\n\r"); - } - } - - virtual void onConfirmationReceived(uint16_t charHandle) - { - if (charHandle == thermTemp.handle) - { - pc.printf("Temperature indication received\n\r"); - } + advertisingStateLed = 1; } }; @@ -130,18 +82,14 @@ /**************************************************************************/ int main(void) { - pc.baud(115200); + + /* Setup blinky led */ + oneSecondLed=1; - /* Setup blinky: led1 is toggled in main, led2 is toggled via Ticker */ - led1=1; - led2=0; - - /* Setup the local GAP/GATT event handlers */ + /* Setup an event handler for GAP events i.e. Client/Server connection events. */ nrf.getGap().setEventHandler(new GapEventHandler()); - nrf.getGattServer().setEventHandler(new GattServerEventHandler()); - + /* Initialise the nRF51822 */ - pc.printf("Initialising the nRF51822\n\r"); nrf.init(); /* Make sure we get a clean start */ @@ -164,41 +112,36 @@ /* Start advertising (make sure you've added all your data first) */ nrf.getGap().startAdvertising(advParams); - - /* Now that we're live, update the battery level characteristic, and */ - /* change the device manufacturer characteristic to 'mbed' */ - nrf.getGattServer().updateValue(battLevel.handle, (uint8_t*)&batt, sizeof(batt)); - nrf.getGattServer().updateValue(deviceManufacturer.handle, manufacturerName, sizeof(manufacturerName)); - nrf.getGattServer().updateValue(thermTemp.handle, thermTempPayload, sizeof(thermTempPayload)); - + advertisingStateLed = 1; for (;;) { + /* Now that we're live, update the battery level & temperature characteristics */ + updateServiceValues(); wait(1); - updateServiceValues(); } } /**************************************************************************/ /*! - @brief Ticker callback to switch led2 state + @brief Ticker callback to switch advertisingStateLed state */ /**************************************************************************/ void updateServiceValues(void) { - /* Toggle the LEDs */ - led1 = !led1; - led2 = !led2; + /* Toggle the one second LEDs */ + oneSecondLed = !oneSecondLed; /* Update battery level */ nrf.getGattServer().updateValue(battLevel.handle, (uint8_t*)&batt, sizeof(batt)); + /* Decrement the battery level. */ + batt <=50 ? batt=100 : batt--;; - /* Update the temperature */ + /* Update the temperature. Note that we need to convert to an ieee11073 format float. */ float temperature = healthThemometer.read(); uint32_t temp_ieee11073 = quick_ieee11073_from_float(temperature); memcpy(thermTempPayload+1, &temp_ieee11073, 4); nrf.getGattServer().updateValue(thermTemp.handle, thermTempPayload, sizeof(thermTempPayload)); - printf("Temperature: %f Celsius\r\n", temperature); } /** @@ -212,4 +155,5 @@ uint32_t mantissa = (uint32_t)(temperature*10); return ( ((uint32_t)exponent) << 24) | mantissa; -} \ No newline at end of file +} +