SunTracker_BLE_Remote

Dependencies:   BLE_API X_NUCLEO_IDB0XA1 X_NUCLEO_IKS01A1 mbed

Fork of SunTracker_BLE_Remote by ST Expansion SW Team

This application is the BLE Remote Control for the SunTracker demo application that you can find here.
Please refer to that page for further information.

Revision:
5:5e62f661a7ab
Parent:
4:17f96ffc073a
Child:
6:ce0e5024e3fa
--- a/main.cpp	Wed Mar 16 19:17:57 2016 +0000
+++ b/main.cpp	Mon Mar 21 10:19:21 2016 +0000
@@ -4,7 +4,7 @@
  * @author  Fabio Brembilla
  * @version V2.0.0
  * @date    March, 2016
- * @brief   SunTracker + BLE (Client) + RemoteControl Vertical Application
+ * @brief   SunTracker + BLE (Client) Vertical Application
  *          This application use IKS01A1, IDB0XA1 expansion boards
  ******************************************************************************
  * @attention
@@ -54,6 +54,8 @@
 
 /* BlueTooth -----------------------------------------------------------------*/
 
+#include "Utils.h" // Need for STORE_LE_16 and STORE_LE_32
+
 #define SCAN_INT  0x30 // 30 ms = 48 * 0.625 ms
 #define SCAN_WIND 0x30 // 30 ms = 48 * 0.625 ms
 
@@ -67,8 +69,33 @@
 DiscoveredCharacteristic position_bleCharacteristic;
 DiscoveredCharacteristic sunpanel_bleCharacteristic;
 
-uint8_t value_write = 1;
-int32_t value_read = 0;
+#define SIZEOF_CONTROL_DATA_LEN     2
+#define DIFFERENCE_DATA_LEN         2
+// 1 byte   0xFF     8 bit      int8
+// 2 byte   0xFFFF   16 bit     int16
+
+uint8_t value_write[SIZEOF_CONTROL_DATA_LEN];
+int16_t value_read = 0;
+uint8_t value_write_diff[DIFFERENCE_DATA_LEN];
+
+/* Variables ------------------------------------------------------------------*/
+
+enum {
+  IDLE = 0,
+  READ_BUT  = 1,
+  READ_DIF  = 2,
+  READ_POS  = 3,
+  READ_SUN  = 4,
+  WRITE_BUT = 5,
+  WRITE_DIF = 6
+};
+int trigger_Op = IDLE;
+bool trigger_button = false;
+
+int8_t display=0;      // Shown on Display: 0 = Motor Speed, 1 = Solar Panel Value, 2 = Manual Control [--> Receive BLE]
+int16_t diff=0;        // Babybear or Accelerometer difference [--> Receive BLE]
+int16_t pos=0;         // Motor Position [--> Receive BLE]
+int16_t measure=0;     // ADC Value from SunPanel [--> Receive BLE]
 
 /* Initializations ------------------------------------------------------------*/
 
@@ -82,7 +109,7 @@
 MotionSensor *accelerometer;
 
 int32_t acc_data[3];    // Accelerometer difference
-int32_t diff=0;         // Accelerometer difference
+int16_t acc_diff=0;     // Accelerometer difference
 #endif
 
 InterruptIn mybutton(USER_BUTTON);
@@ -91,7 +118,7 @@
 
 void User_Button_Pressed(void)
 {
-    userbutton_bleCharacteristic.write(1, &value_write);
+    trigger_button = true;
 }
 
 /* Bluetooth CallBack ---------------------------------------------------------*/
@@ -168,45 +195,58 @@
 {
     //printf("discoveryTerminationCallback for handle %u\r\n", connectionHandle);
     printf("Stop Service Discovery\r\n\r\n");
+    
+    trigger_Op = READ_BUT;
 }
 
 void onDataReadCallback(const GattReadCallbackParams *response)
 {
     // Read SERVER --> CLIENT
     
+    /*
+    printf("response Handle %d\r\n", response->handle);
+    printf("userbutton Handle %d\r\n", userbutton_bleCharacteristic.getValueHandle());
+    printf("difference Handle %d\r\n", difference_bleCharacteristic.getValueHandle());
+    printf("position Handle %d\r\n", position_bleCharacteristic.getValueHandle());
+    printf("sunpanel Handle %d\r\n", sunpanel_bleCharacteristic.getValueHandle());
+    
+    printf("onDataRead (data[0] %x)\r\n", response->data[0]);
+    printf("onDataRead (data[1] %x)\r\n\r\n", response->data[1]);   
+    */
+    
+    // Return original value after inverted with STORE_LE_16 to send by BLE
+    value_read = response->data[0] + (response->data[1]<<8);    
+    
     if (response->handle == userbutton_bleCharacteristic.getValueHandle())
-    {                 
-        printf("onDataRead userbutton (data[0] %x)\r\n", response->data[0]);
-        printf("onDataRead userbutton (data[1] %x)\r\n", response->data[1]);
-        printf("onDataRead userbutton (data[2] %x)\r\n", response->data[2]);
-        printf("onDataRead userbutton (data[3] %x)\r\n\r\n", response->data[3]);
+    {     
+        display = value_read;         
+        printf("\n\rReceive BLE Display %d\n\r", display);
+        
+        trigger_Op = READ_DIF;
     }
     
     if (response->handle == difference_bleCharacteristic.getValueHandle())
-    {         
-        printf("onDataRead difference (data[0] %x)\r\n", response->data[0]);
-        printf("onDataRead difference (data[1] %x)\r\n", response->data[1]);
-        printf("onDataRead difference (data[2] %x)\r\n", response->data[2]);
-        printf("onDataRead difference (data[3] %x)\r\n\r\n", response->data[3]);
+    {    
+        diff = value_read;      
+        printf("Receive BLE Difference %d lux/mems\n\r", diff);
+        
+        trigger_Op = READ_POS;
     }
     
     if (response->handle == position_bleCharacteristic.getValueHandle())
-    {          
-        printf("onDataRead position (data[0] %x)\r\n", response->data[0]);
-        printf("onDataRead position (data[1] %x)\r\n", response->data[1]);
-        printf("onDataRead position (data[2] %x)\r\n", response->data[2]);
-        printf("onDataRead position (data[3] %x)\r\n\r\n", response->data[3]);
+    {   
+        pos = value_read;
+        printf("Receive BLE Position %d\n\r", pos);
+        
+        trigger_Op = READ_SUN;
     }
     
     if (response->handle == sunpanel_bleCharacteristic.getValueHandle())
-    {            
-        printf("onDataRead sunpanel (data[0] %x)\r\n", response->data[0]);
-        printf("onDataRead sunpanel (data[1] %x)\r\n", response->data[1]);
-        printf("onDataRead sunpanel (data[2] %x)\r\n", response->data[2]);
-        printf("onDataRead sunpanel (data[3] %x)\r\n", response->data[3]);
+    {   
+        measure = value_read;         
+        printf("Receive BLE Sunpanel %d mV\n\r", measure);
         
-        value_read = response->data[0]+response->data[1]+response->data[2]+response->data[3];       
-        printf("onDataRead sunpanel (data %d)\r\n\r\n", value_read);
+        trigger_Op = WRITE_BUT;
     }
 }
 
@@ -214,12 +254,24 @@
 {
     // Write CLIENT --> SERVER
 
+    //printf("myonDataWrite (data[0] %x)\n\r", response->data[0]);
+    //printf("myonDataWrite (data[1] %x)\n\r\n\r", response->data[1]);
+
+    // Return original value after inverted with STORE_LE_16 to send by BLE
+    value_read = response->data[0] + (response->data[1]<<8);
+
     if (response->handle == userbutton_bleCharacteristic.getValueHandle())
     {
-        printf("myonDataWrite userbutton (data[0] %x)\n\r", response->data[0]);
-        printf("myonDataWrite userbutton (data[1] %x)\n\r", response->data[1]);
-        printf("myonDataWrite userbutton (data[2] %x)\n\r", response->data[2]);
-        printf("myonDataWrite userbutton (data[3] %x)\n\r\n\r", response->data[3]);
+        printf("\r\n\r\nonDataWrite BUTTON (data %d)\r\n", value_read);
+        
+        trigger_Op = READ_BUT; 
+    }
+    
+    if (response->handle == difference_bleCharacteristic.getValueHandle())
+    {        
+        //printf("onDataWrite DIFF (data %d)\r\n", value_read);
+        
+        trigger_Op = READ_BUT;  
     }
 }
 
@@ -229,6 +281,8 @@
 void onBleInitError(BLE &ble, ble_error_t error) 
 { 
     /* Initialization error handling should go here */ 
+    
+    printf("Inizialization Error\n\r");
 }
 
 void connectionCallback(const Gap::ConnectionCallbackParams_t *params)
@@ -248,6 +302,7 @@
         // Discover all SERVICES and CHARACTERISTICS
         ble.gattClient().launchServiceDiscovery(params->handle, serviceDiscoveryCallback, characteristicDiscoveryCallback);
         
+        // Works only for one characteristic, if you need to discover all characteristic, use the above command
         //ble.gattClient().launchServiceDiscovery(params->handle, serviceDiscoveryCallback, characteristicDiscoveryCallback, CONTROL_SERVICE_UUID, USERBUTTON_CHARACTERISTIC_UUID);  
         //ble.gattClient().launchServiceDiscovery(params->handle, serviceDiscoveryCallback, characteristicDiscoveryCallback, SENSORS_SERVICE_UUID, DIFFERENCE_CHARACTERISTIC_UUID);
         //ble.gattClient().launchServiceDiscovery(params->handle, serviceDiscoveryCallback, characteristicDiscoveryCallback, SENSORS_SERVICE_UUID, POSITION_CHARACTERISTIC_UUID);
@@ -260,6 +315,7 @@
 void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params)
 {
     (void)params;
+    
     printf("Remote Disconnected\n\r");
 }
 
@@ -292,35 +348,93 @@
 
     ble.gap().setScanParams(SCAN_INT, SCAN_WIND);
     ble.gap().startScan(advertisementCallback);
-    
-    static int INTLOOP=0;
-    
+            
     // Main Loop
-    while (true) {
-        if (!ble.gattClient().isServiceDiscoveryActive()) // Until try to discover service don't enter
-        {       
-            INTLOOP++;
-            if (INTLOOP==2000)
+    while (true) {  
+    
+        //if (!ble.gattClient().isServiceDiscoveryActive())
+        if (trigger_Op!=IDLE) // Wait until discoveryTerminationCallback
+        {   
+        
+            // At present ARM BLE_API don't support Enable/Disable Notify from Client
+            //userbutton_bleCharacteristic.notify(); 
+            //difference_bleCharacteristic.notify();
+            //position_bleCharacteristic.notify();
+            //sunpanel_bleCharacteristic.notify();
+            
+            // Don't run more ble .read or .write in the same loop
+            // because the callback is an interrupt and it doesn't work correctly if overloaded
+          
+            if (display == 0 || display == 1)
+            { if (trigger_Op == WRITE_DIF) trigger_Op = READ_BUT; } // if Display 0 or 1, skip WRITE_DIF
+            
+            if (display == 2)
+            { if (trigger_Op == READ_DIF) trigger_Op = WRITE_BUT; } // if Display 2, skip READ_DIF, READ_POS, READ_SUN
+            
+            switch(trigger_Op)
             {
-                printf("\n\r");
+            case READ_BUT:
                 userbutton_bleCharacteristic.read();
+                trigger_Op = IDLE;
+                break;
+            case READ_DIF:
                 difference_bleCharacteristic.read();
+                trigger_Op = IDLE;
+                break;
+            case READ_POS:
                 position_bleCharacteristic.read();
+                trigger_Op = IDLE;
+                break;
+            case READ_SUN:
                 sunpanel_bleCharacteristic.read();
-                INTLOOP=0;
+                trigger_Op = IDLE;
+                break;
+            case WRITE_BUT:
+                if (trigger_button == true)
+                {
+                    memset (value_write, 0, SIZEOF_CONTROL_DATA_LEN); 
+                    STORE_LE_16(value_write, 1234);
+                    userbutton_bleCharacteristic.write(SIZEOF_CONTROL_DATA_LEN, value_write);
+                    trigger_Op = IDLE;
+                    trigger_button = false;
+                } else {
+                    #ifdef Sensors
+                    trigger_Op = WRITE_DIF;
+                    #else
+                    trigger_Op = READ_BUT;
+                    #endif
+                }
+                break;                                 
+            case WRITE_DIF:    
+                #ifdef Sensors             
+                accelerometer->Get_X_Axes(acc_data);
+                acc_diff = acc_data[0];
+                //printf("Send BLE Difference %d lux/mems\n\r", acc_diff);
+                 
+                memset (value_write_diff, 0, DIFFERENCE_DATA_LEN);
+                STORE_LE_16(value_write_diff, acc_diff);
+                difference_bleCharacteristic.write(DIFFERENCE_DATA_LEN, value_write_diff);
+                trigger_Op = IDLE;
+                #else
+                trigger_Op = READ_BUT;
+                #endif
+                break;
+            default:
+                break;
             }
             
-        #ifdef Sensors    
-            accelerometer->Get_X_Axes(acc_data);
-            diff = acc_data[0];
-            //printf("Send BLE Difference %d lux/mems\n\r", diff);
-        #endif
-                 
         }
         ble.waitForEvent();
     }
 }
 
+/* Ticker --------------------------------------------------------------------*/
+/*
+void ticker_Callback(void)
+{
+
+}
+*/
 /* Main ----------------------------------------------------------------------*/
 
 int main(void)
@@ -333,6 +447,9 @@
     accelerometer = mems->GetAccelerometer();
     printf("Init Sensors OK\r\n");
     #endif
+        
+    //Ticker ticker;
+    //ticker.attach(ticker_Callback, 1); // every 1 second
     
     mybutton.fall(&User_Button_Pressed);