Application running on nRF51822 PCA10001
Dependencies: BLE_API MMA8652 nRF51822 mbed-src
Diff: main.cpp
- Revision:
- 0:90c13be263a0
- Child:
- 1:1c52fb502f6b
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Tue Jul 22 14:54:44 2014 +0000 @@ -0,0 +1,189 @@ +/******************************************************************************* +* Title : System Initialization +* Filename : main.cpp +* Author : Richard Osterloh +* Origin Date : 22/07/2014 +* Version : 1.0.0 +* Compiler : mbed compiler +* Target : Nordic nRF51822 +* Notes : None +*******************************************************************************/ +/*************** MODULE REVISION LOG ****************************************** +* +* Date Software Version Initials Description +* 22/07/2014 1.0.0 RO Module Created. +* +*******************************************************************************/ +/** \file main.cpp + * \brief This module contains the + */ +/****************************************************************************** +* Includes +*******************************************************************************/ +#include "mbed.h" +#include "BLEDevice.h" +#include "nRF51822n.h" +//#include "MMA8652.h" + +/****************************************************************************** +* Module Preprocessor Constants +*******************************************************************************/ +#define NEED_CONSOLE_OUTPUT 0 /* Set this if you need debug messages on the console; + * it will have an impact on code-size and power consumption. */ +#if NEED_CONSOLE_OUTPUT +Serial pc(USBTX, USBRX); +#define DEBUG(...) { pc.printf(__VA_ARGS__); } +#else +#define DEBUG(...) /* nothing */ +#endif /* #if NEED_CONSOLE_OUTPUT */ + +/****************************************************************************** +* Module Preprocessor Macros +*******************************************************************************/ + +/****************************************************************************** +* Module Typedefs +*******************************************************************************/ + +/****************************************************************************** +* Module Variable Definitions +*******************************************************************************/ +nRF51822n nrf; +BLEDevice ble; +DigitalOut oneSecondLed(LED1); /* LED1 is toggled every second. */ +DigitalOut advertisingStateLed(LED2); /* LED2 is on when we are advertising, otherwise off. */ +//MMA8652 acc1(I2C_SDA0, I2C_SCL0); + +const static char DEVICE_NAME[] = "Buddi Blueband"; + +// https://developer.bluetooth.org/gatt/services/Pages/ServiceViewer.aspx?u=org.bluetooth.service.device_information.xml +// Manufacturer Name String +static char vendor[] = "Buddi Ltd."; +GattCharacteristic vendorChar(GattCharacteristic::UUID_MANUFACTURER_NAME_STRING_CHAR, (uint8_t *)vendor, sizeof(vendor), sizeof(vendor), + GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ); +// Model Number String +static char model[] = "BlueBand"; +GattCharacteristic modelChar(GattCharacteristic::UUID_MODEL_NUMBER_STRING_CHAR, (uint8_t *)model, sizeof(model), sizeof(model), + GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ); +// Serial Number String +static char serial[] = "1234567890"; +GattCharacteristic serialChar(GattCharacteristic::UUID_SERIAL_NUMBER_STRING_CHAR, (uint8_t *)serial, sizeof(serial), sizeof(serial), + GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ); +// Hardware Revision String +static char hwversion[] = "Hardware: 0"; +GattCharacteristic hwChar(GattCharacteristic::UUID_HARDWARE_REVISION_STRING_CHAR, (uint8_t *)hwversion, sizeof(hwversion), sizeof(hwversion), + GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ); +// Firmware Revision String +static char fwversion[] = "Firmware: 0001"; +GattCharacteristic fwChar(GattCharacteristic::UUID_FIRMWARE_REVISION_STRING_CHAR, (uint8_t *)fwversion, sizeof(fwversion), sizeof(fwversion), + GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ); +// Software Revision String +static char swversion[] = "Build: 0001"; +GattCharacteristic swChar(GattCharacteristic::UUID_SOFTWARE_REVISION_STRING_CHAR, (uint8_t *)swversion, sizeof(swversion), sizeof(swversion), + GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ); +// System ID +static char systemId = 'A'; +GattCharacteristic systemID(GattCharacteristic::UUID_SYSTEM_ID_CHAR, (uint8_t *)systemId, sizeof(systemId), sizeof(systemId), + GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ); +GattCharacteristic *devInfoChars[] = {&vendorChar, &modelChar, &serialChar, &hwChar, &fwChar, &swChar, &systemID }; +GattService devInfoService(GattService::UUID_DEVICE_INFORMATION_SERVICE, devInfoChars, sizeof(devInfoChars) / sizeof(GattCharacteristic *)); + +// https://developer.bluetooth.org/gatt/services/Pages/ServiceViewer.aspx?u=org.bluetooth.service.battery_service.xml +static uint8_t batteryLevel = 100; +GattCharacteristic batteryPercentage(GattCharacteristic::UUID_BATTERY_LEVEL_CHAR, (uint8_t *)batteryLevel, sizeof(batteryLevel), sizeof(batteryLevel), + GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY); +GattCharacteristic *batteryChars[] = {&batteryPercentage }; +GattService batteryService(GattService::UUID_BATTERY_SERVICE, batteryChars, sizeof(batteryChars) / sizeof(GattCharacteristic *)); + +static const uint16_t uuid16_list[] = {GattService::UUID_DEVICE_INFORMATION_SERVICE, + GattService::UUID_BATTERY_SERVICE}; + +/****************************************************************************** +* Function Prototypes +*******************************************************************************/ + +/****************************************************************************** +* Function Definitions +*******************************************************************************/ +void timeoutCallback(void) +{ + DEBUG("Timeout!\r\n"); +} + +void connectionCallback(void) +{ + DEBUG("Connection\n\r"); + advertisingStateLed = 0; +} + +void disconnectionCallback(void) +{ + DEBUG("Disconnected!\r\n"); + DEBUG("Restarting the advertising process\r\n"); + ble.startAdvertising(); + advertisingStateLed = 1; +} + +/** + * Triggered periodically by the 'ticker' interrupt + */ +void periodicCallback(void) +{ + oneSecondLed = !oneSecondLed; /* Do blinky on LED1 while we're waiting for BLE events */ + + if (ble.getGapState().connected) { + /* Update the battery measurement */ + batteryLevel--; + if (batteryLevel == 1) { + batteryLevel = 100; + } + ble.updateCharacteristicValue(batteryPercentage.getHandle(), &batteryLevel, sizeof(batteryLevel)); + } +} + +int main(void) +{ + //float acc_data[3]; + //int16_t acc_raw[3]; + + oneSecondLed = 1; + Ticker ticker; + ticker.attach(periodicCallback, 1); + /* + DEBUG("MMA8652 Acc = %X\r\n", acc1.getWhoAmI()); + acc1.ReadXYZ(acc_data); + acc1.ReadXYZraw(acc_raw); + DEBUG("MMA8652 Acc: X:%1.3f Y:%1.3f Z:%1.3f (Raw X:%3d Y:%3d Z:%3d)\r\n", acc_data[0], acc_data[1], acc_data[2], acc_raw[0], acc_raw[1], acc_raw[2]); + */ + DEBUG("Initialising the nRF51822\r\n"); + ble.init(); /* Initialise the nRF51822 */ + //ble.onTimeout(timeoutCallback); + ble.onConnection(connectionCallback); + ble.onDisconnection(disconnectionCallback); + //ble.onDataSent(GattServer::ServerEventCallback_t callback); + //ble.onDataWritten(GattServer::EventCallback_t callback); + //ble.onUpdatesEnabled(GattServer::EventCallback_t callback); + //ble.onUpdatesDisabled(GattServer::EventCallback_t callback); + //ble.onConfirmationReceived(GattServer::EventCallback_t callback); + + /* setup advertising */ + ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE); + ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS, (uint8_t*)uuid16_list, sizeof(uuid16_list)); + ble.accumulateAdvertisingPayload(GapAdvertisingData::GENERIC_WATCH); + ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME)); + //ble.accumulateAdvertisingPayload(GapAdvertisingData::SHORTENED_LOCAL_NAME, (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME)); + //ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_128BIT_SERVICE_IDS, + // (const uint8_t *)uart_base_uuid_rev, sizeof(uart_base_uuid)); + + ble.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED); + ble.setAdvertisingInterval(160); /* 100ms; in multiples of 0.625ms. */ + ble.startAdvertising(); + advertisingStateLed = 1; + + ble.addService(devInfoService); + ble.addService(batteryService); + + while (true) { + ble.waitForEvent(); + } +}