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.

Committer:
fabiombed
Date:
Mon Mar 21 10:19:21 2016 +0000
Revision:
5:5e62f661a7ab
Parent:
4:17f96ffc073a
Child:
6:ce0e5024e3fa
Update CLIENT

Who changed what in which revision?

UserRevisionLine numberNew contents of line
fabiombed 4:17f96ffc073a 1 /**
fabiombed 4:17f96ffc073a 2 ******************************************************************************
fabiombed 4:17f96ffc073a 3 * @file main.cpp
fabiombed 4:17f96ffc073a 4 * @author Fabio Brembilla
fabiombed 4:17f96ffc073a 5 * @version V2.0.0
fabiombed 4:17f96ffc073a 6 * @date March, 2016
fabiombed 5:5e62f661a7ab 7 * @brief SunTracker + BLE (Client) Vertical Application
fabiombed 4:17f96ffc073a 8 * This application use IKS01A1, IDB0XA1 expansion boards
fabiombed 4:17f96ffc073a 9 ******************************************************************************
fabiombed 4:17f96ffc073a 10 * @attention
apalmieri 0:2e972e7d3f64 11 *
fabiombed 4:17f96ffc073a 12 * <h2><center>&copy; COPYRIGHT(c) 2016 STMicroelectronics</center></h2>
apalmieri 0:2e972e7d3f64 13 *
fabiombed 4:17f96ffc073a 14 * Redistribution and use in source and binary forms, with or without modification,
fabiombed 4:17f96ffc073a 15 * are permitted provided that the following conditions are met:
fabiombed 4:17f96ffc073a 16 * 1. Redistributions of source code must retain the above copyright notice,
fabiombed 4:17f96ffc073a 17 * this list of conditions and the following disclaimer.
fabiombed 4:17f96ffc073a 18 * 2. Redistributions in binary form must reproduce the above copyright notice,
fabiombed 4:17f96ffc073a 19 * this list of conditions and the following disclaimer in the documentation
fabiombed 4:17f96ffc073a 20 * and/or other materials provided with the distribution.
fabiombed 4:17f96ffc073a 21 * 3. Neither the name of STMicroelectronics nor the names of its contributors
fabiombed 4:17f96ffc073a 22 * may be used to endorse or promote products derived from this software
fabiombed 4:17f96ffc073a 23 * without specific prior written permission.
apalmieri 0:2e972e7d3f64 24 *
fabiombed 4:17f96ffc073a 25 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
fabiombed 4:17f96ffc073a 26 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
fabiombed 4:17f96ffc073a 27 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
fabiombed 4:17f96ffc073a 28 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
fabiombed 4:17f96ffc073a 29 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
fabiombed 4:17f96ffc073a 30 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
fabiombed 4:17f96ffc073a 31 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
fabiombed 4:17f96ffc073a 32 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
fabiombed 4:17f96ffc073a 33 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
fabiombed 4:17f96ffc073a 34 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
fabiombed 4:17f96ffc073a 35 *
fabiombed 4:17f96ffc073a 36 ******************************************************************************
apalmieri 0:2e972e7d3f64 37 */
fabiombed 4:17f96ffc073a 38
fabiombed 4:17f96ffc073a 39 /* Define --------------------------------------------------------------------*/
fabiombed 4:17f96ffc073a 40
fabiombed 4:17f96ffc073a 41 #define Sensors //IKS01A1 Option
fabiombed 4:17f96ffc073a 42
fabiombed 4:17f96ffc073a 43 /* Includes ------------------------------------------------------------------*/
fabiombed 4:17f96ffc073a 44
apalmieri 0:2e972e7d3f64 45 #include "mbed.h"
apalmieri 0:2e972e7d3f64 46 #include "ble/BLE.h"
apalmieri 0:2e972e7d3f64 47 #include "ble/DiscoveredCharacteristic.h"
apalmieri 0:2e972e7d3f64 48 #include "ble/DiscoveredService.h"
apalmieri 0:2e972e7d3f64 49
fabiombed 4:17f96ffc073a 50 #ifdef Sensors
fabiombed 4:17f96ffc073a 51 #include "DevI2C.h"
fabiombed 4:17f96ffc073a 52 #include "x_nucleo_iks01a1.h"
fabiombed 4:17f96ffc073a 53 #endif
fabiombed 4:17f96ffc073a 54
fabiombed 4:17f96ffc073a 55 /* BlueTooth -----------------------------------------------------------------*/
fabiombed 4:17f96ffc073a 56
fabiombed 5:5e62f661a7ab 57 #include "Utils.h" // Need for STORE_LE_16 and STORE_LE_32
fabiombed 5:5e62f661a7ab 58
apalmieri 0:2e972e7d3f64 59 #define SCAN_INT 0x30 // 30 ms = 48 * 0.625 ms
apalmieri 0:2e972e7d3f64 60 #define SCAN_WIND 0x30 // 30 ms = 48 * 0.625 ms
apalmieri 0:2e972e7d3f64 61
fabiombed 4:17f96ffc073a 62 const Gap::Address_t BLE_address_BE = {0xFF, 0xEE, 0xDD, 0xCC, 0xBB, 0xAA}; // CLIENT address
fabiombed 4:17f96ffc073a 63 const Gap::Address_t BLE_peer_address_BE = {0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF}; // SERVER address (must be the same of SERVER)
fabiombed 4:17f96ffc073a 64 //const Gap::Address_t BLE_address_BE = {0xCC, 0x00, 0x00, 0xE1, 0x80, 0x02}; // CLIENT address
fabiombed 4:17f96ffc073a 65 //const Gap::Address_t BLE_peer_address_BE = {0xFD, 0x66, 0x05, 0x13, 0xBE, 0xBA}; // SERVER address (must be the same of SERVER)
apalmieri 0:2e972e7d3f64 66
fabiombed 4:17f96ffc073a 67 DiscoveredCharacteristic userbutton_bleCharacteristic;
fabiombed 4:17f96ffc073a 68 DiscoveredCharacteristic difference_bleCharacteristic;
fabiombed 4:17f96ffc073a 69 DiscoveredCharacteristic position_bleCharacteristic;
fabiombed 4:17f96ffc073a 70 DiscoveredCharacteristic sunpanel_bleCharacteristic;
fabiombed 4:17f96ffc073a 71
fabiombed 5:5e62f661a7ab 72 #define SIZEOF_CONTROL_DATA_LEN 2
fabiombed 5:5e62f661a7ab 73 #define DIFFERENCE_DATA_LEN 2
fabiombed 5:5e62f661a7ab 74 // 1 byte 0xFF 8 bit int8
fabiombed 5:5e62f661a7ab 75 // 2 byte 0xFFFF 16 bit int16
fabiombed 5:5e62f661a7ab 76
fabiombed 5:5e62f661a7ab 77 uint8_t value_write[SIZEOF_CONTROL_DATA_LEN];
fabiombed 5:5e62f661a7ab 78 int16_t value_read = 0;
fabiombed 5:5e62f661a7ab 79 uint8_t value_write_diff[DIFFERENCE_DATA_LEN];
fabiombed 5:5e62f661a7ab 80
fabiombed 5:5e62f661a7ab 81 /* Variables ------------------------------------------------------------------*/
fabiombed 5:5e62f661a7ab 82
fabiombed 5:5e62f661a7ab 83 enum {
fabiombed 5:5e62f661a7ab 84 IDLE = 0,
fabiombed 5:5e62f661a7ab 85 READ_BUT = 1,
fabiombed 5:5e62f661a7ab 86 READ_DIF = 2,
fabiombed 5:5e62f661a7ab 87 READ_POS = 3,
fabiombed 5:5e62f661a7ab 88 READ_SUN = 4,
fabiombed 5:5e62f661a7ab 89 WRITE_BUT = 5,
fabiombed 5:5e62f661a7ab 90 WRITE_DIF = 6
fabiombed 5:5e62f661a7ab 91 };
fabiombed 5:5e62f661a7ab 92 int trigger_Op = IDLE;
fabiombed 5:5e62f661a7ab 93 bool trigger_button = false;
fabiombed 5:5e62f661a7ab 94
fabiombed 5:5e62f661a7ab 95 int8_t display=0; // Shown on Display: 0 = Motor Speed, 1 = Solar Panel Value, 2 = Manual Control [--> Receive BLE]
fabiombed 5:5e62f661a7ab 96 int16_t diff=0; // Babybear or Accelerometer difference [--> Receive BLE]
fabiombed 5:5e62f661a7ab 97 int16_t pos=0; // Motor Position [--> Receive BLE]
fabiombed 5:5e62f661a7ab 98 int16_t measure=0; // ADC Value from SunPanel [--> Receive BLE]
fabiombed 4:17f96ffc073a 99
fabiombed 4:17f96ffc073a 100 /* Initializations ------------------------------------------------------------*/
fabiombed 4:17f96ffc073a 101
fabiombed 4:17f96ffc073a 102 #ifdef Sensors
apalmieri 0:2e972e7d3f64 103
fabiombed 4:17f96ffc073a 104 // Initializing I2C bus
fabiombed 4:17f96ffc073a 105 DevI2C dev_i2c(D14, D15);
fabiombed 4:17f96ffc073a 106
fabiombed 4:17f96ffc073a 107 // Initializing Sensors Component IKS01A1
fabiombed 4:17f96ffc073a 108 static X_NUCLEO_IKS01A1 *mems;
fabiombed 4:17f96ffc073a 109 MotionSensor *accelerometer;
apalmieri 0:2e972e7d3f64 110
fabiombed 4:17f96ffc073a 111 int32_t acc_data[3]; // Accelerometer difference
fabiombed 5:5e62f661a7ab 112 int16_t acc_diff=0; // Accelerometer difference
fabiombed 4:17f96ffc073a 113 #endif
fabiombed 4:17f96ffc073a 114
fabiombed 4:17f96ffc073a 115 InterruptIn mybutton(USER_BUTTON);
fabiombed 4:17f96ffc073a 116
fabiombed 4:17f96ffc073a 117 /* User_Button_Pressed -------------------------------------------------------*/
fabiombed 4:17f96ffc073a 118
fabiombed 4:17f96ffc073a 119 void User_Button_Pressed(void)
apalmieri 0:2e972e7d3f64 120 {
fabiombed 5:5e62f661a7ab 121 trigger_button = true;
apalmieri 0:2e972e7d3f64 122 }
apalmieri 0:2e972e7d3f64 123
fabiombed 4:17f96ffc073a 124 /* Bluetooth CallBack ---------------------------------------------------------*/
fabiombed 4:17f96ffc073a 125
fabiombed 4:17f96ffc073a 126 void advertisementCallback(const Gap::AdvertisementCallbackParams_t *params)
fabiombed 4:17f96ffc073a 127 {
fabiombed 4:17f96ffc073a 128 if (params->peerAddr[0] != BLE_peer_address_BE[0]) // return if miss the server MAC address
fabiombed 4:17f96ffc073a 129 {
fabiombed 4:17f96ffc073a 130 printf("Missing Expected MAC Address");
fabiombed 4:17f96ffc073a 131 return; // exit from advertisementCallback
apalmieri 0:2e972e7d3f64 132 }
apalmieri 0:2e972e7d3f64 133
fabiombed 4:17f96ffc073a 134 // printf("adv peerAddr[%02x %02x %02x %02x %02x %02x] rssi %d, isScanResponse %u, AdvertisementType %u\r\n",
fabiombed 4:17f96ffc073a 135 // params->peerAddr[5], params->peerAddr[4], params->peerAddr[3], params->peerAddr[2], params->peerAddr[1], params->peerAddr[0],
fabiombed 4:17f96ffc073a 136 // params->rssi, params->isScanResponse, params->type);
fabiombed 4:17f96ffc073a 137
fabiombed 4:17f96ffc073a 138 printf("Found Expected MAC Address: isScanResponse %u, AdvertisementType %u\r\n",params->isScanResponse, params->type);
apalmieri 0:2e972e7d3f64 139
fabiombed 4:17f96ffc073a 140 if(!params->isScanResponse)
fabiombed 4:17f96ffc073a 141 {
apalmieri 0:2e972e7d3f64 142 BLE::Instance().gap().connect(params->peerAddr, Gap::ADDR_TYPE_PUBLIC, NULL, NULL);
apalmieri 0:2e972e7d3f64 143 }
apalmieri 0:2e972e7d3f64 144 }
apalmieri 0:2e972e7d3f64 145
fabiombed 4:17f96ffc073a 146 void serviceDiscoveryCallback(const DiscoveredService *service)
fabiombed 4:17f96ffc073a 147 {
fabiombed 4:17f96ffc073a 148 printf("Start Service Discovery\r\n");
fabiombed 4:17f96ffc073a 149 /*
fabiombed 4:17f96ffc073a 150 if (service->getUUID().shortOrLong() == UUID::UUID_TYPE_SHORT)
fabiombed 4:17f96ffc073a 151 {
apalmieri 0:2e972e7d3f64 152 printf("S UUID-%x attrs[%u %u]\r\n", service->getUUID().getShortUUID(), service->getStartHandle(), service->getEndHandle());
fabiombed 4:17f96ffc073a 153 }
fabiombed 4:17f96ffc073a 154 else
fabiombed 4:17f96ffc073a 155 {
apalmieri 0:2e972e7d3f64 156 printf("S UUID-");
apalmieri 0:2e972e7d3f64 157 const uint8_t *longUUIDBytes = service->getUUID().getBaseUUID();
fabiombed 4:17f96ffc073a 158 for (unsigned i = 0; i < UUID::LENGTH_OF_LONG_UUID; i++)
fabiombed 4:17f96ffc073a 159 {
apalmieri 0:2e972e7d3f64 160 printf("%02X", longUUIDBytes[i]);
apalmieri 0:2e972e7d3f64 161 }
apalmieri 0:2e972e7d3f64 162 printf(" attrs[%u %u]\r\n", service->getStartHandle(), service->getEndHandle());
apalmieri 0:2e972e7d3f64 163 }
fabiombed 4:17f96ffc073a 164 */
apalmieri 0:2e972e7d3f64 165 }
fabiombed 4:17f96ffc073a 166
fabiombed 4:17f96ffc073a 167 void characteristicDiscoveryCallback(const DiscoveredCharacteristic *characteristicP)
fabiombed 4:17f96ffc073a 168 {
fabiombed 4:17f96ffc073a 169 if (characteristicP->getUUID().getShortUUID() == 0xA001)
fabiombed 4:17f96ffc073a 170 {
fabiombed 4:17f96ffc073a 171 userbutton_bleCharacteristic = *characteristicP;
fabiombed 4:17f96ffc073a 172 printf("Found 0xA001 Characteristic\r\n");
fabiombed 4:17f96ffc073a 173 }
fabiombed 4:17f96ffc073a 174
fabiombed 4:17f96ffc073a 175 if (characteristicP->getUUID().getShortUUID() == 0xB001)
fabiombed 4:17f96ffc073a 176 {
fabiombed 4:17f96ffc073a 177 difference_bleCharacteristic = *characteristicP;
fabiombed 4:17f96ffc073a 178 printf("Found 0xB001 Characteristic\r\n");
fabiombed 4:17f96ffc073a 179 }
fabiombed 4:17f96ffc073a 180
fabiombed 4:17f96ffc073a 181 if (characteristicP->getUUID().getShortUUID() == 0xB002)
fabiombed 4:17f96ffc073a 182 {
fabiombed 4:17f96ffc073a 183 position_bleCharacteristic = *characteristicP;
fabiombed 4:17f96ffc073a 184 printf("Found 0xB002 Characteristic\r\n");
fabiombed 4:17f96ffc073a 185 }
fabiombed 4:17f96ffc073a 186
fabiombed 4:17f96ffc073a 187 if (characteristicP->getUUID().getShortUUID() == 0xB003)
fabiombed 4:17f96ffc073a 188 {
fabiombed 4:17f96ffc073a 189 sunpanel_bleCharacteristic = *characteristicP;
fabiombed 4:17f96ffc073a 190 printf("Found 0xB003 Characteristic\r\n");
apalmieri 0:2e972e7d3f64 191 }
apalmieri 0:2e972e7d3f64 192 }
apalmieri 0:2e972e7d3f64 193
fabiombed 4:17f96ffc073a 194 void discoveryTerminationCallback(Gap::Handle_t connectionHandle)
fabiombed 4:17f96ffc073a 195 {
fabiombed 4:17f96ffc073a 196 //printf("discoveryTerminationCallback for handle %u\r\n", connectionHandle);
fabiombed 4:17f96ffc073a 197 printf("Stop Service Discovery\r\n\r\n");
fabiombed 5:5e62f661a7ab 198
fabiombed 5:5e62f661a7ab 199 trigger_Op = READ_BUT;
apalmieri 0:2e972e7d3f64 200 }
apalmieri 0:2e972e7d3f64 201
fabiombed 4:17f96ffc073a 202 void onDataReadCallback(const GattReadCallbackParams *response)
fabiombed 4:17f96ffc073a 203 {
fabiombed 4:17f96ffc073a 204 // Read SERVER --> CLIENT
fabiombed 4:17f96ffc073a 205
fabiombed 5:5e62f661a7ab 206 /*
fabiombed 5:5e62f661a7ab 207 printf("response Handle %d\r\n", response->handle);
fabiombed 5:5e62f661a7ab 208 printf("userbutton Handle %d\r\n", userbutton_bleCharacteristic.getValueHandle());
fabiombed 5:5e62f661a7ab 209 printf("difference Handle %d\r\n", difference_bleCharacteristic.getValueHandle());
fabiombed 5:5e62f661a7ab 210 printf("position Handle %d\r\n", position_bleCharacteristic.getValueHandle());
fabiombed 5:5e62f661a7ab 211 printf("sunpanel Handle %d\r\n", sunpanel_bleCharacteristic.getValueHandle());
fabiombed 5:5e62f661a7ab 212
fabiombed 5:5e62f661a7ab 213 printf("onDataRead (data[0] %x)\r\n", response->data[0]);
fabiombed 5:5e62f661a7ab 214 printf("onDataRead (data[1] %x)\r\n\r\n", response->data[1]);
fabiombed 5:5e62f661a7ab 215 */
fabiombed 5:5e62f661a7ab 216
fabiombed 5:5e62f661a7ab 217 // Return original value after inverted with STORE_LE_16 to send by BLE
fabiombed 5:5e62f661a7ab 218 value_read = response->data[0] + (response->data[1]<<8);
fabiombed 5:5e62f661a7ab 219
fabiombed 4:17f96ffc073a 220 if (response->handle == userbutton_bleCharacteristic.getValueHandle())
fabiombed 5:5e62f661a7ab 221 {
fabiombed 5:5e62f661a7ab 222 display = value_read;
fabiombed 5:5e62f661a7ab 223 printf("\n\rReceive BLE Display %d\n\r", display);
fabiombed 5:5e62f661a7ab 224
fabiombed 5:5e62f661a7ab 225 trigger_Op = READ_DIF;
fabiombed 4:17f96ffc073a 226 }
fabiombed 4:17f96ffc073a 227
fabiombed 4:17f96ffc073a 228 if (response->handle == difference_bleCharacteristic.getValueHandle())
fabiombed 5:5e62f661a7ab 229 {
fabiombed 5:5e62f661a7ab 230 diff = value_read;
fabiombed 5:5e62f661a7ab 231 printf("Receive BLE Difference %d lux/mems\n\r", diff);
fabiombed 5:5e62f661a7ab 232
fabiombed 5:5e62f661a7ab 233 trigger_Op = READ_POS;
apalmieri 0:2e972e7d3f64 234 }
fabiombed 4:17f96ffc073a 235
fabiombed 4:17f96ffc073a 236 if (response->handle == position_bleCharacteristic.getValueHandle())
fabiombed 5:5e62f661a7ab 237 {
fabiombed 5:5e62f661a7ab 238 pos = value_read;
fabiombed 5:5e62f661a7ab 239 printf("Receive BLE Position %d\n\r", pos);
fabiombed 5:5e62f661a7ab 240
fabiombed 5:5e62f661a7ab 241 trigger_Op = READ_SUN;
fabiombed 4:17f96ffc073a 242 }
apalmieri 0:2e972e7d3f64 243
fabiombed 4:17f96ffc073a 244 if (response->handle == sunpanel_bleCharacteristic.getValueHandle())
fabiombed 5:5e62f661a7ab 245 {
fabiombed 5:5e62f661a7ab 246 measure = value_read;
fabiombed 5:5e62f661a7ab 247 printf("Receive BLE Sunpanel %d mV\n\r", measure);
fabiombed 4:17f96ffc073a 248
fabiombed 5:5e62f661a7ab 249 trigger_Op = WRITE_BUT;
fabiombed 4:17f96ffc073a 250 }
apalmieri 0:2e972e7d3f64 251 }
apalmieri 0:2e972e7d3f64 252
fabiombed 4:17f96ffc073a 253 void myonDataWriteCallback(const GattWriteCallbackParams *response)
fabiombed 4:17f96ffc073a 254 {
fabiombed 4:17f96ffc073a 255 // Write CLIENT --> SERVER
fabiombed 4:17f96ffc073a 256
fabiombed 5:5e62f661a7ab 257 //printf("myonDataWrite (data[0] %x)\n\r", response->data[0]);
fabiombed 5:5e62f661a7ab 258 //printf("myonDataWrite (data[1] %x)\n\r\n\r", response->data[1]);
fabiombed 5:5e62f661a7ab 259
fabiombed 5:5e62f661a7ab 260 // Return original value after inverted with STORE_LE_16 to send by BLE
fabiombed 5:5e62f661a7ab 261 value_read = response->data[0] + (response->data[1]<<8);
fabiombed 5:5e62f661a7ab 262
fabiombed 4:17f96ffc073a 263 if (response->handle == userbutton_bleCharacteristic.getValueHandle())
fabiombed 4:17f96ffc073a 264 {
fabiombed 5:5e62f661a7ab 265 printf("\r\n\r\nonDataWrite BUTTON (data %d)\r\n", value_read);
fabiombed 5:5e62f661a7ab 266
fabiombed 5:5e62f661a7ab 267 trigger_Op = READ_BUT;
fabiombed 5:5e62f661a7ab 268 }
fabiombed 5:5e62f661a7ab 269
fabiombed 5:5e62f661a7ab 270 if (response->handle == difference_bleCharacteristic.getValueHandle())
fabiombed 5:5e62f661a7ab 271 {
fabiombed 5:5e62f661a7ab 272 //printf("onDataWrite DIFF (data %d)\r\n", value_read);
fabiombed 5:5e62f661a7ab 273
fabiombed 5:5e62f661a7ab 274 trigger_Op = READ_BUT;
fabiombed 4:17f96ffc073a 275 }
apalmieri 0:2e972e7d3f64 276 }
apalmieri 0:2e972e7d3f64 277
apalmieri 0:2e972e7d3f64 278 /**
apalmieri 0:2e972e7d3f64 279 * This function is called when the ble initialization process has failled
apalmieri 0:2e972e7d3f64 280 */
apalmieri 0:2e972e7d3f64 281 void onBleInitError(BLE &ble, ble_error_t error)
apalmieri 0:2e972e7d3f64 282 {
apalmieri 0:2e972e7d3f64 283 /* Initialization error handling should go here */
fabiombed 5:5e62f661a7ab 284
fabiombed 5:5e62f661a7ab 285 printf("Inizialization Error\n\r");
apalmieri 0:2e972e7d3f64 286 }
apalmieri 0:2e972e7d3f64 287
fabiombed 4:17f96ffc073a 288 void connectionCallback(const Gap::ConnectionCallbackParams_t *params)
fabiombed 4:17f96ffc073a 289 {
fabiombed 4:17f96ffc073a 290 //uint16_t CONTROL_SERVICE_UUID = 0xA000;
fabiombed 4:17f96ffc073a 291 //uint16_t USERBUTTON_CHARACTERISTIC_UUID = 0xA001;
fabiombed 4:17f96ffc073a 292
fabiombed 4:17f96ffc073a 293 //uint16_t SENSORS_SERVICE_UUID = 0xB000;
fabiombed 4:17f96ffc073a 294 //uint16_t DIFFERENCE_CHARACTERISTIC_UUID = 0xB001;
fabiombed 4:17f96ffc073a 295 //uint16_t POSITION_CHARACTERISTIC_UUID = 0xB002;
fabiombed 4:17f96ffc073a 296 //uint16_t SUNPANEL_CHARACTERISTIC_UUID = 0xB003;
fabiombed 4:17f96ffc073a 297
fabiombed 4:17f96ffc073a 298 if (params->role == Gap::CENTRAL)
fabiombed 4:17f96ffc073a 299 {
fabiombed 4:17f96ffc073a 300 BLE &ble = BLE::Instance();
fabiombed 4:17f96ffc073a 301 ble.gattClient().onServiceDiscoveryTermination(discoveryTerminationCallback);
fabiombed 4:17f96ffc073a 302 // Discover all SERVICES and CHARACTERISTICS
fabiombed 4:17f96ffc073a 303 ble.gattClient().launchServiceDiscovery(params->handle, serviceDiscoveryCallback, characteristicDiscoveryCallback);
fabiombed 4:17f96ffc073a 304
fabiombed 5:5e62f661a7ab 305 // Works only for one characteristic, if you need to discover all characteristic, use the above command
fabiombed 4:17f96ffc073a 306 //ble.gattClient().launchServiceDiscovery(params->handle, serviceDiscoveryCallback, characteristicDiscoveryCallback, CONTROL_SERVICE_UUID, USERBUTTON_CHARACTERISTIC_UUID);
fabiombed 4:17f96ffc073a 307 //ble.gattClient().launchServiceDiscovery(params->handle, serviceDiscoveryCallback, characteristicDiscoveryCallback, SENSORS_SERVICE_UUID, DIFFERENCE_CHARACTERISTIC_UUID);
fabiombed 4:17f96ffc073a 308 //ble.gattClient().launchServiceDiscovery(params->handle, serviceDiscoveryCallback, characteristicDiscoveryCallback, SENSORS_SERVICE_UUID, POSITION_CHARACTERISTIC_UUID);
fabiombed 4:17f96ffc073a 309 //ble.gattClient().launchServiceDiscovery(params->handle, serviceDiscoveryCallback, characteristicDiscoveryCallback, SENSORS_SERVICE_UUID, SUNPANEL_CHARACTERISTIC_UUID);
fabiombed 4:17f96ffc073a 310 }
fabiombed 4:17f96ffc073a 311
fabiombed 4:17f96ffc073a 312 printf("Remote Connected\n\r");
fabiombed 4:17f96ffc073a 313 }
fabiombed 4:17f96ffc073a 314
fabiombed 4:17f96ffc073a 315 void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params)
fabiombed 4:17f96ffc073a 316 {
fabiombed 4:17f96ffc073a 317 (void)params;
fabiombed 5:5e62f661a7ab 318
fabiombed 4:17f96ffc073a 319 printf("Remote Disconnected\n\r");
fabiombed 4:17f96ffc073a 320 }
fabiombed 4:17f96ffc073a 321
apalmieri 0:2e972e7d3f64 322 /**
apalmieri 0:2e972e7d3f64 323 * Callback triggered when the ble initialization process has finished
apalmieri 0:2e972e7d3f64 324 */
apalmieri 0:2e972e7d3f64 325 void bleInitComplete(BLE::InitializationCompleteCallbackContext *params)
apalmieri 0:2e972e7d3f64 326 {
apalmieri 0:2e972e7d3f64 327 BLE& ble = params->ble;
apalmieri 0:2e972e7d3f64 328 ble_error_t error = params->error;
apalmieri 0:2e972e7d3f64 329
fabiombed 4:17f96ffc073a 330 if (error != BLE_ERROR_NONE)
fabiombed 4:17f96ffc073a 331 {
apalmieri 0:2e972e7d3f64 332 /* In case of error, forward the error handling to onBleInitError */
apalmieri 0:2e972e7d3f64 333 onBleInitError(ble, error);
apalmieri 0:2e972e7d3f64 334 return;
apalmieri 0:2e972e7d3f64 335 }
apalmieri 0:2e972e7d3f64 336
apalmieri 0:2e972e7d3f64 337 /* Ensure that it is the default instance of BLE */
fabiombed 4:17f96ffc073a 338 if(ble.getInstanceID() != BLE::DEFAULT_INSTANCE) { return; }
apalmieri 0:2e972e7d3f64 339
apalmieri 0:2e972e7d3f64 340 // Set BT Address
apalmieri 1:e0f4bcce540c 341 ble.gap().setAddress(BLEProtocol::AddressType::PUBLIC, BLE_address_BE);
apalmieri 0:2e972e7d3f64 342
apalmieri 0:2e972e7d3f64 343 ble.gap().onConnection(connectionCallback);
apalmieri 0:2e972e7d3f64 344 ble.onDisconnection(disconnectionCallback);
apalmieri 0:2e972e7d3f64 345
fabiombed 4:17f96ffc073a 346 ble.gattClient().onDataRead(onDataReadCallback);
fabiombed 4:17f96ffc073a 347 ble.gattClient().onDataWrite(myonDataWriteCallback);
apalmieri 0:2e972e7d3f64 348
apalmieri 0:2e972e7d3f64 349 ble.gap().setScanParams(SCAN_INT, SCAN_WIND);
apalmieri 0:2e972e7d3f64 350 ble.gap().startScan(advertisementCallback);
fabiombed 5:5e62f661a7ab 351
fabiombed 4:17f96ffc073a 352 // Main Loop
fabiombed 5:5e62f661a7ab 353 while (true) {
fabiombed 5:5e62f661a7ab 354
fabiombed 5:5e62f661a7ab 355 //if (!ble.gattClient().isServiceDiscoveryActive())
fabiombed 5:5e62f661a7ab 356 if (trigger_Op!=IDLE) // Wait until discoveryTerminationCallback
fabiombed 5:5e62f661a7ab 357 {
fabiombed 5:5e62f661a7ab 358
fabiombed 5:5e62f661a7ab 359 // At present ARM BLE_API don't support Enable/Disable Notify from Client
fabiombed 5:5e62f661a7ab 360 //userbutton_bleCharacteristic.notify();
fabiombed 5:5e62f661a7ab 361 //difference_bleCharacteristic.notify();
fabiombed 5:5e62f661a7ab 362 //position_bleCharacteristic.notify();
fabiombed 5:5e62f661a7ab 363 //sunpanel_bleCharacteristic.notify();
fabiombed 5:5e62f661a7ab 364
fabiombed 5:5e62f661a7ab 365 // Don't run more ble .read or .write in the same loop
fabiombed 5:5e62f661a7ab 366 // because the callback is an interrupt and it doesn't work correctly if overloaded
fabiombed 5:5e62f661a7ab 367
fabiombed 5:5e62f661a7ab 368 if (display == 0 || display == 1)
fabiombed 5:5e62f661a7ab 369 { if (trigger_Op == WRITE_DIF) trigger_Op = READ_BUT; } // if Display 0 or 1, skip WRITE_DIF
fabiombed 5:5e62f661a7ab 370
fabiombed 5:5e62f661a7ab 371 if (display == 2)
fabiombed 5:5e62f661a7ab 372 { if (trigger_Op == READ_DIF) trigger_Op = WRITE_BUT; } // if Display 2, skip READ_DIF, READ_POS, READ_SUN
fabiombed 5:5e62f661a7ab 373
fabiombed 5:5e62f661a7ab 374 switch(trigger_Op)
fabiombed 4:17f96ffc073a 375 {
fabiombed 5:5e62f661a7ab 376 case READ_BUT:
fabiombed 4:17f96ffc073a 377 userbutton_bleCharacteristic.read();
fabiombed 5:5e62f661a7ab 378 trigger_Op = IDLE;
fabiombed 5:5e62f661a7ab 379 break;
fabiombed 5:5e62f661a7ab 380 case READ_DIF:
fabiombed 4:17f96ffc073a 381 difference_bleCharacteristic.read();
fabiombed 5:5e62f661a7ab 382 trigger_Op = IDLE;
fabiombed 5:5e62f661a7ab 383 break;
fabiombed 5:5e62f661a7ab 384 case READ_POS:
fabiombed 4:17f96ffc073a 385 position_bleCharacteristic.read();
fabiombed 5:5e62f661a7ab 386 trigger_Op = IDLE;
fabiombed 5:5e62f661a7ab 387 break;
fabiombed 5:5e62f661a7ab 388 case READ_SUN:
fabiombed 4:17f96ffc073a 389 sunpanel_bleCharacteristic.read();
fabiombed 5:5e62f661a7ab 390 trigger_Op = IDLE;
fabiombed 5:5e62f661a7ab 391 break;
fabiombed 5:5e62f661a7ab 392 case WRITE_BUT:
fabiombed 5:5e62f661a7ab 393 if (trigger_button == true)
fabiombed 5:5e62f661a7ab 394 {
fabiombed 5:5e62f661a7ab 395 memset (value_write, 0, SIZEOF_CONTROL_DATA_LEN);
fabiombed 5:5e62f661a7ab 396 STORE_LE_16(value_write, 1234);
fabiombed 5:5e62f661a7ab 397 userbutton_bleCharacteristic.write(SIZEOF_CONTROL_DATA_LEN, value_write);
fabiombed 5:5e62f661a7ab 398 trigger_Op = IDLE;
fabiombed 5:5e62f661a7ab 399 trigger_button = false;
fabiombed 5:5e62f661a7ab 400 } else {
fabiombed 5:5e62f661a7ab 401 #ifdef Sensors
fabiombed 5:5e62f661a7ab 402 trigger_Op = WRITE_DIF;
fabiombed 5:5e62f661a7ab 403 #else
fabiombed 5:5e62f661a7ab 404 trigger_Op = READ_BUT;
fabiombed 5:5e62f661a7ab 405 #endif
fabiombed 5:5e62f661a7ab 406 }
fabiombed 5:5e62f661a7ab 407 break;
fabiombed 5:5e62f661a7ab 408 case WRITE_DIF:
fabiombed 5:5e62f661a7ab 409 #ifdef Sensors
fabiombed 5:5e62f661a7ab 410 accelerometer->Get_X_Axes(acc_data);
fabiombed 5:5e62f661a7ab 411 acc_diff = acc_data[0];
fabiombed 5:5e62f661a7ab 412 //printf("Send BLE Difference %d lux/mems\n\r", acc_diff);
fabiombed 5:5e62f661a7ab 413
fabiombed 5:5e62f661a7ab 414 memset (value_write_diff, 0, DIFFERENCE_DATA_LEN);
fabiombed 5:5e62f661a7ab 415 STORE_LE_16(value_write_diff, acc_diff);
fabiombed 5:5e62f661a7ab 416 difference_bleCharacteristic.write(DIFFERENCE_DATA_LEN, value_write_diff);
fabiombed 5:5e62f661a7ab 417 trigger_Op = IDLE;
fabiombed 5:5e62f661a7ab 418 #else
fabiombed 5:5e62f661a7ab 419 trigger_Op = READ_BUT;
fabiombed 5:5e62f661a7ab 420 #endif
fabiombed 5:5e62f661a7ab 421 break;
fabiombed 5:5e62f661a7ab 422 default:
fabiombed 5:5e62f661a7ab 423 break;
fabiombed 4:17f96ffc073a 424 }
fabiombed 4:17f96ffc073a 425
apalmieri 0:2e972e7d3f64 426 }
fabiombed 4:17f96ffc073a 427 ble.waitForEvent();
apalmieri 0:2e972e7d3f64 428 }
apalmieri 0:2e972e7d3f64 429 }
apalmieri 0:2e972e7d3f64 430
fabiombed 5:5e62f661a7ab 431 /* Ticker --------------------------------------------------------------------*/
fabiombed 5:5e62f661a7ab 432 /*
fabiombed 5:5e62f661a7ab 433 void ticker_Callback(void)
fabiombed 5:5e62f661a7ab 434 {
fabiombed 5:5e62f661a7ab 435
fabiombed 5:5e62f661a7ab 436 }
fabiombed 5:5e62f661a7ab 437 */
fabiombed 4:17f96ffc073a 438 /* Main ----------------------------------------------------------------------*/
fabiombed 4:17f96ffc073a 439
apalmieri 0:2e972e7d3f64 440 int main(void)
apalmieri 0:2e972e7d3f64 441 {
fabiombed 4:17f96ffc073a 442 printf("\r\n\r\nSunTracker Remote Control\r\n\r\n");
fabiombed 4:17f96ffc073a 443
fabiombed 4:17f96ffc073a 444 #ifdef Sensors
fabiombed 4:17f96ffc073a 445 // Initializing Sensors Component
fabiombed 4:17f96ffc073a 446 mems=X_NUCLEO_IKS01A1::Instance(&dev_i2c);
fabiombed 4:17f96ffc073a 447 accelerometer = mems->GetAccelerometer();
fabiombed 4:17f96ffc073a 448 printf("Init Sensors OK\r\n");
fabiombed 4:17f96ffc073a 449 #endif
fabiombed 5:5e62f661a7ab 450
fabiombed 5:5e62f661a7ab 451 //Ticker ticker;
fabiombed 5:5e62f661a7ab 452 //ticker.attach(ticker_Callback, 1); // every 1 second
fabiombed 4:17f96ffc073a 453
fabiombed 4:17f96ffc073a 454 mybutton.fall(&User_Button_Pressed);
fabiombed 4:17f96ffc073a 455
apalmieri 0:2e972e7d3f64 456 BLE::Instance().init(bleInitComplete);
fabiombed 4:17f96ffc073a 457 }