Application running on nRF51822 PCA10001

Dependencies:   BLE_API MMA8652 nRF51822 mbed-src

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();
+    }
+}