takeaki kubota / Mbed 2 deprecated sw_input_sample2

Dependencies:   BLE_API_Native_IRC mbed

Fork of sw_input_sample by takeaki kubota

Revision:
0:62a78063f1a9
Child:
1:2c34ba518eb3
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Mon Aug 04 11:11:06 2014 +0000
@@ -0,0 +1,155 @@
+#include "mbed.h"
+#include "SwDigital.h"
+#include "nRF51822n.h"
+
+nRF51822n   nrf;                               /* BLE radio driver */
+SwDigital sw(p2,p3,p4,p5);  // p2 : sw1 control LED1,LED2
+                        // p3 : sw2 control LED3,LED4
+enum{
+        sw1,
+        sw2,
+        sw3,
+        sw4
+    };
+
+/* LEDs for indication: */
+DigitalOut  oneSecondLed(LED1);        /* LED1 is toggled every second. */
+DigitalOut  advertisingStateLed(LED2); /* LED2 is on when we are advertising, otherwise off. */
+
+
+/* Health Thermometer Service */ 
+uint8_t             thermTempPayload[5] = { 0, 0, 0, 0, 0 };
+GattService         thermService (GattService::UUID_HEALTH_THERMOMETER_SERVICE);
+GattCharacteristic  thermTemp (GattCharacteristic::UUID_TEMPERATURE_MEASUREMENT_CHAR,
+                               5, 5, GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_INDICATE);
+
+/* Battery Level Service */
+uint8_t            batt = 100;     /* Battery level */
+uint8_t            read_batt = 0; /* Variable to hold battery level reads */
+GattService        battService ( GattService::UUID_BATTERY_SERVICE );
+GattCharacteristic battLevel   ( GattCharacteristic::UUID_BATTERY_LEVEL_CHAR, 1, 1,
+                                 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY |
+                                 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ);
+
+
+/* Advertising data and parameters */
+GapAdvertisingData   advData;
+GapAdvertisingData   scanResponse;
+GapAdvertisingParams advParams ( GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED );
+
+uint16_t             uuid16_list[] = {GattService::UUID_HEALTH_THERMOMETER_SERVICE,
+                                      GattService::UUID_BATTERY_SERVICE};
+
+uint32_t quick_ieee11073_from_float(float temperature);
+void updateServiceValues(int n);
+
+/**************************************************************************/
+/*!
+    @brief  This custom class can be used to override any GapEvents
+            that you are interested in handling on an application level.
+*/
+/**************************************************************************/
+class GapEventHandler : public GapEvents
+{
+    //virtual void onTimeout(void) {}   
+     
+    virtual void onConnected(void)
+    {
+        advertisingStateLed = 0;
+    }
+
+    /* When a client device disconnects we need to start advertising again. */
+    virtual void onDisconnected(void)
+    {
+        nrf.getGap().startAdvertising(advParams);
+        advertisingStateLed = 1;
+    }
+};
+
+/**************************************************************************/
+/*!
+    @brief  Program entry point
+*/
+/**************************************************************************/
+int main(void)
+{
+    
+    /* Setup blinky led */
+    oneSecondLed=1;
+    
+    /* Setup an event handler for GAP events i.e. Client/Server connection events. */
+    nrf.getGap().setEventHandler(new GapEventHandler());
+    
+    /* Initialise the nRF51822 */
+    nrf.init();
+
+    /* Make sure we get a clean start */
+    nrf.reset();    
+
+    /* Add BLE-Only flag and complete service list to the advertising data */
+    advData.addFlags(GapAdvertisingData::BREDR_NOT_SUPPORTED);
+    advData.addData(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS, 
+                   (uint8_t*)uuid16_list, sizeof(uuid16_list));
+    advData.addAppearance(GapAdvertisingData::GENERIC_THERMOMETER);
+    nrf.getGap().setAdvertisingData(advData, scanResponse);
+
+    /* Health Thermometer Service */
+    thermService.addCharacteristic(thermTemp);
+    nrf.getGattServer().addService(thermService);
+    
+    /* Add the Battery Level service */
+    battService.addCharacteristic(battLevel);
+    nrf.getGattServer().addService(battService);
+
+    /* Start advertising (make sure you've added all your data first) */
+    nrf.getGap().startAdvertising(advParams);
+//    advertisingStateLed = 1;
+
+    while(1)
+    {
+        sw.refreshEdgeData();
+
+        // tact action (sw level = on : led1 = on)
+        oneSecondLed = sw.checkLevel(sw1);
+
+        /* Now that we're live, update the battery level & temperature characteristics */
+        updateServiceValues(oneSecondLed.read());
+        //wait(0.1);
+    }
+}
+
+/**************************************************************************/
+/*!
+    @brief  Ticker callback to switch advertisingStateLed state
+*/
+/**************************************************************************/
+void updateServiceValues(int n)
+{
+      /* 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. Note that we need to convert to an ieee11073 format float. */
+      //float temperature = healthThemometer.read();
+      float temperature = 2.1*n;
+      uint32_t temp_ieee11073 = quick_ieee11073_from_float(temperature);
+      memcpy(thermTempPayload+1, &temp_ieee11073, 4);
+      nrf.getGattServer().updateValue(thermTemp.handle, thermTempPayload, sizeof(thermTempPayload));
+}
+
+/**
+ * @brief A very quick conversion between a float temperature and 11073-20601 FLOAT-Type.
+ * @param temperature The temperature as a float.
+ * @return The temperature in 11073-20601 FLOAT-Type format.
+ */
+uint32_t quick_ieee11073_from_float(float temperature)
+{
+    uint8_t  exponent = 0xFF; //exponent is -1
+    uint32_t mantissa = (uint32_t)(temperature*10);
+    
+    return ( ((uint32_t)exponent) << 24) | mantissa;
+}
\ No newline at end of file