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.
main.cpp@6:ce0e5024e3fa, 2016-04-12 (annotated)
- Committer:
- fabiombed
- Date:
- Tue Apr 12 09:23:43 2016 +0000
- Revision:
- 6:ce0e5024e3fa
- Parent:
- 5:5e62f661a7ab
- Child:
- 7:eb2215fe86b2
Updated Libraries. SunTracker BLE CLIENT working revision.
Who changed what in which revision?
User | Revision | Line number | New 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>© 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 | 6:ce0e5024e3fa | 130 | printf("Missing Expected MAC Address\n\r"); |
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 | 6:ce0e5024e3fa | 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 | } |