SunTracker_BLE_Remote
Dependencies: BLE_API X_NUCLEO_IDB0XA1 X_NUCLEO_IKS01A1 mbed
Fork of SunTracker_BLE_Remote by
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.
Diff: main.cpp
- 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);