Reading SenseAir LP8 CO2 sensor over bluetooth low energy

Dependencies:   BLE_API mbed nRF51822

Revision:
0:ee3787c8e209
Child:
1:b512a405b584
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Fri Apr 21 13:26:06 2017 +0000
@@ -0,0 +1,123 @@
+#include "mbed.h"
+#include "BLE.h"
+#include "LP8_Service.h"
+#include "LP8.h"
+
+//setup ble stack
+BLE             ble;                                                                    //BLE object
+
+// Pins and timers needed for lp8 communication
+DigitalIn       RDY(P0_8);                                                              //
+DigitalOut      VBB(P0_5);
+DigitalOut      VBB_EN(P0_4);                                                        //
+Serial          Device(P0_9, P0_11);                                                    //tx, rx
+DigitalOut      led1(P0_19, 1);                                                         //board led
+Timer           lp8Wait;                                                                //timer for sensor communication
+
+
+
+//Sensor and ble Configuration parameters
+#define     SENSOR_TIMER                        10.0                                    //lp8 polling interval (seconds)
+#define     BLE_ADV_INTERVAL                    500                                     //advertisment interval (milliseconds)
+
+
+
+//device name and uuid list setup
+const static char       DEVICE_NAME[] = "SenseAir LP8";
+static const uint16_t   uuid16_list[] = {LP8_Service::LP8_SERVICE_UUID};
+
+
+//check for sensor triggering and uppdating Gatt Server
+bool                    triggerSensor = false;                                          //check for sensor polling
+LP8_Service             *lp8ServicePtr;                                                 //pointer to lp8 service object
+
+
+
+//****************************   ble functions      *******************************
+//****************************                      *******************************
+// on Disconnect, Restart BroadCasting
+void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params)
+{
+    //reset I/O pin, necessary?
+//    VBB_EN.write ( 1 );
+    
+    //restart broadcast
+    ble.gap().startAdvertising();
+}
+//timer function callback function
+void triggerSensorPollingInterupt()
+{
+    triggerSensor = true;
+};
+
+
+
+//main 
+int main(void)
+{
+    led1 = 1;      //turn off led                                                                
+    
+    Ticker lp8Timer;                                                                    //timer object for sensor polling interupts
+    lp8Timer.attach(&triggerSensorPollingInterupt, SENSOR_TIMER);                       //trigger sensor reading every X.Y sec
+    
+    ble.init();
+    ble.gap().onDisconnection(disconnectionCallback);                                   //do callback if disconnection occurs
+
+
+    int                     co2Value = 400;                                             //initial CO2 value
+    bool                    initCheck = true;                                           //check for init sensor state or lost state
+    bool                    successCheck = false;
+    
+//setup LP8 peripheral communication 
+    LP8               lp8(Device, VBB, VBB_EN, RDY, lp8Wait);
+     
+     
+//setup for GattService
+/* Setup Gatt server */
+    LP8_Service      lp8Service(ble, co2Value);                                         //pass in ble object and initial co2 value
+    lp8ServicePtr     = &lp8Service;                                                    //set pointer to "real" lp8 service object
+
+
+/* setup advertising parameters */
+    ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE);            //general bluetooth information(only support for ble
+    ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS, (uint8_t *)uuid16_list, sizeof(uuid16_list)); //service list
+    ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME));
+    ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
+    ble.gap().setAdvertisingInterval(BLE_ADV_INTERVAL);                 /* advertising interval in ms. */
+    ble.gap().startAdvertising();                                       //start broadcast
+    
+        /* SpinWait for initialization to complete. This is necessary because the
+     * BLE object is used in the main loop below. */
+    while (ble.hasInitialized()  == false) { /* spin loop */ }
+
+
+
+//start the loop    
+    while ( true ) 
+    {
+        if(triggerSensor && ble.gap().getState().connected )                            //trigger when timer interupts ticks and there is an established connection
+        {
+            if ( initCheck ) {
+                successCheck = lp8.lp8Init();
+                
+//                if ( successCheck ) {
+                    initCheck = false;
+//                    led1 = 0;       //turn on led 
+//                }
+            }
+            else {
+                lp8.lp8Talk();
+                led1 = 0;   //on when talking
+            }
+            
+            //reset sensor status
+            triggerSensor = false;
+            //update gattServer with new CO2 value
+            lp8ServicePtr->updateCo2Value( lp8.getValue() );
+        }
+        
+        else { ble.waitForEvent(); }                //ble save energy
+    }
+    
+};
+