CAN to BLE translator - and back

Dependencies:   BLE_API CANnucleo X_NUCLEO_IDB0XA1 mbed

Committer:
filippomontano
Date:
Fri Apr 08 14:39:43 2016 +0000
Revision:
6:f85bc6e59111
Parent:
5:9f30eba41c77
Child:
7:b834d20f9aa1
BLE to CAN --- OK with BLE disconnect!

Who changed what in which revision?

UserRevisionLine numberNew contents of line
filippomontano 0:345c72cbcd60 1 #include "mbed.h"
filippomontano 0:345c72cbcd60 2 #include "ble/BLE.h"
filippomontano 0:345c72cbcd60 3 #include "CAN.h"
filippomontano 0:345c72cbcd60 4
filippomontano 3:5bce2e8d2797 5 #define TARGET_NUCLEO_F072RB 1
filippomontano 0:345c72cbcd60 6 #define LED_PIN PA_5
filippomontano 0:345c72cbcd60 7
filippomontano 3:5bce2e8d2797 8 #define BLE_GATT_CHAR_PROPERTIES_NOTIFY 0x10
filippomontano 3:5bce2e8d2797 9
filippomontano 6:f85bc6e59111 10 uint8_t CANId2BLESlot(unsigned int id);
filippomontano 6:f85bc6e59111 11 unsigned int BLESlot2CANId(uint8_t id);
filippomontano 6:f85bc6e59111 12 void onMsgReceived(void);
filippomontano 6:f85bc6e59111 13 void initCAN(void);
filippomontano 6:f85bc6e59111 14
filippomontano 6:f85bc6e59111 15 void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params);
filippomontano 3:5bce2e8d2797 16 void writeCharCallback(const GattWriteCallbackParams *params);
filippomontano 3:5bce2e8d2797 17 void bleInitComplete(BLE::InitializationCompleteCallbackContext *params);
filippomontano 3:5bce2e8d2797 18 void onBleInitError(BLE &ble, ble_error_t error);
filippomontano 3:5bce2e8d2797 19 void initBLE(void);
filippomontano 0:345c72cbcd60 20
filippomontano 5:9f30eba41c77 21 void periodicCallback(void);
filippomontano 5:9f30eba41c77 22 static volatile bool triggerSensorPolling = false;
filippomontano 5:9f30eba41c77 23
filippomontano 6:f85bc6e59111 24 Ticker ticker;
filippomontano 0:345c72cbcd60 25
filippomontano 3:5bce2e8d2797 26 DigitalOut led(LED_PIN),CAN_show(PC_12);
filippomontano 3:5bce2e8d2797 27
filippomontano 3:5bce2e8d2797 28
filippomontano 3:5bce2e8d2797 29 const static char DEVICE_NAME[] = "STNucleo - RGM - FM";
filippomontano 3:5bce2e8d2797 30 static const uint16_t uuid16_list[] = {0xFFFF};
filippomontano 3:5bce2e8d2797 31
filippomontano 0:345c72cbcd60 32 //const unsigned int RX_ID = 0x10;
filippomontano 0:345c72cbcd60 33 //const unsigned int TX_ID = 0x11;
filippomontano 0:345c72cbcd60 34
filippomontano 0:345c72cbcd60 35 char shareddata[64][8]= { };
filippomontano 6:f85bc6e59111 36
filippomontano 6:f85bc6e59111 37 uint8_t canWrPointer= 255;
filippomontano 6:f85bc6e59111 38 uint8_t canRdPointer= 255;
filippomontano 6:f85bc6e59111 39 uint8_t bleWrPointerA= 255;
filippomontano 6:f85bc6e59111 40 uint8_t bleRdPointerA= 255;
filippomontano 6:f85bc6e59111 41 uint8_t bleWrPointerB= 255;
filippomontano 6:f85bc6e59111 42 uint8_t bleRdPointerB= 255;
filippomontano 6:f85bc6e59111 43
filippomontano 6:f85bc6e59111 44 const uint8_t firstBleRdPointer=1;
filippomontano 6:f85bc6e59111 45 const uint8_t lastBleRdPointer=14;
filippomontano 3:5bce2e8d2797 46
filippomontano 6:f85bc6e59111 47 const uint8_t firstCanRdPointer=62;
filippomontano 6:f85bc6e59111 48 const uint8_t lastCanRdPointer=63;
filippomontano 6:f85bc6e59111 49
filippomontano 6:f85bc6e59111 50 uint8_t canRdLastPointer= 255; // puntatore per sapere che cosa ho mandato per ultimo. a runtime devo andare a modificarlo per sapere al ciclo dopo cosa ho già mandato
filippomontano 6:f85bc6e59111 51 uint8_t bleRdLastPointer= 255; // puntatore per sapere che cosa ho mandato per ultimo. a runtime devo andare a modificarlo per sapere al ciclo dopo cosa ho già mandato
filippomontano 6:f85bc6e59111 52
filippomontano 6:f85bc6e59111 53 Timer timerA; //questo contatoro serve solo per dire: appena è passato un po' di tempo -> esegui
filippomontano 6:f85bc6e59111 54
filippomontano 6:f85bc6e59111 55 //CAN can(PB_8, PB_9); // CAN Rx pin name, CAN Tx pin name
filippomontano 6:f85bc6e59111 56 CANMessage rxMsg;
filippomontano 6:f85bc6e59111 57 CANMessage txMsg;
filippomontano 0:345c72cbcd60 58
filippomontano 3:5bce2e8d2797 59 BLE ble;
filippomontano 3:5bce2e8d2797 60
filippomontano 3:5bce2e8d2797 61 uint16_t customServiceUUID = 0xA000; // service UUID
filippomontano 3:5bce2e8d2797 62 uint16_t readCharUUID = 0xA001; // read characteristic UUID
filippomontano 3:5bce2e8d2797 63 uint16_t writeCharUUID = 0xA002; // write characteristic UUID
filippomontano 3:5bce2e8d2797 64
filippomontano 3:5bce2e8d2797 65 static uint8_t readValue[128] = {0};
filippomontano 3:5bce2e8d2797 66
filippomontano 3:5bce2e8d2797 67
filippomontano 3:5bce2e8d2797 68
filippomontano 3:5bce2e8d2797 69 ReadOnlyArrayGattCharacteristic<uint8_t, sizeof(readValue)> readChar(readCharUUID, readValue, BLE_GATT_CHAR_PROPERTIES_NOTIFY , NULL,0); //aggiunto il BLE_GATT_CHAR_PROPERTIES_NOTIFY => appena arriva lo rimanda
filippomontano 3:5bce2e8d2797 70
filippomontano 3:5bce2e8d2797 71 static uint8_t writeValue[128] = {0};
filippomontano 3:5bce2e8d2797 72 WriteOnlyArrayGattCharacteristic<uint8_t, sizeof(writeValue)> writeChar(writeCharUUID, writeValue);
filippomontano 3:5bce2e8d2797 73
filippomontano 3:5bce2e8d2797 74 GattCharacteristic *characteristics[] = {&readChar, &writeChar};
filippomontano 3:5bce2e8d2797 75 GattService customService(customServiceUUID, characteristics, sizeof(characteristics) / sizeof(GattCharacteristic *));
filippomontano 3:5bce2e8d2797 76 uint8_t retry=1;
filippomontano 3:5bce2e8d2797 77 uint8_t readdata[20]= {};
filippomontano 3:5bce2e8d2797 78 char symbol=' ';
filippomontano 0:345c72cbcd60 79 volatile bool CANmsgAvailable = false;
filippomontano 3:5bce2e8d2797 80 volatile bool BLExmit = false;
filippomontano 3:5bce2e8d2797 81 float stopTimer=2.0;
filippomontano 6:f85bc6e59111 82
filippomontano 0:345c72cbcd60 83 int main()
filippomontano 0:345c72cbcd60 84 {
filippomontano 6:f85bc6e59111 85 uint8_t j=0,k=firstBleRdPointer;
filippomontano 3:5bce2e8d2797 86 // printf("\r\nBoard started\r\n");
filippomontano 0:345c72cbcd60 87 led = 1; // turn LED on
filippomontano 6:f85bc6e59111 88 CAN_show=1;
filippomontano 6:f85bc6e59111 89
filippomontano 6:f85bc6e59111 90 bleRdLastPointer=lastBleRdPointer;
filippomontano 6:f85bc6e59111 91 BLE::Instance().init(bleInitComplete);
filippomontano 6:f85bc6e59111 92 CAN can(PA_11, PA_12); // CAN Rx pin name, CAN Tx pin name
filippomontano 6:f85bc6e59111 93 CAN_show=0;
filippomontano 3:5bce2e8d2797 94
filippomontano 6:f85bc6e59111 95 //canRdLastPointer=lastCanRdPointer;
filippomontano 6:f85bc6e59111 96 can.frequency(500000); // set bit rate to 500kbps as S018
filippomontano 6:f85bc6e59111 97 printf("\r\nCAN started at 500kbps\r\n");
filippomontano 6:f85bc6e59111 98 timerA.start();
filippomontano 6:f85bc6e59111 99 can.attach(&onMsgReceived, CAN::RxIrq); // attach 'CAN receive-complete' interrupt handler
filippomontano 3:5bce2e8d2797 100
filippomontano 3:5bce2e8d2797 101
filippomontano 3:5bce2e8d2797 102 while(true) {
filippomontano 5:9f30eba41c77 103 // if(ble.getGapState().connected) {
filippomontano 6:f85bc6e59111 104 if(triggerSensorPolling && ble.getGapState().connected) {
filippomontano 6:f85bc6e59111 105 triggerSensorPolling=false;
filippomontano 6:f85bc6e59111 106 // printf("^");
filippomontano 6:f85bc6e59111 107 } else {
filippomontano 6:f85bc6e59111 108 // printf("v");
filippomontano 6:f85bc6e59111 109 ble.waitForEvent();
filippomontano 5:9f30eba41c77 110 }
filippomontano 6:f85bc6e59111 111
filippomontano 5:9f30eba41c77 112 if(ble.gap().getState().connected) {
filippomontano 3:5bce2e8d2797 113 stopTimer=0.2;
filippomontano 3:5bce2e8d2797 114 symbol='!';
filippomontano 3:5bce2e8d2797 115 } else {
filippomontano 3:5bce2e8d2797 116 stopTimer=3;
filippomontano 6:f85bc6e59111 117 // ble.waitForEvent();
filippomontano 3:5bce2e8d2797 118 symbol='.';
filippomontano 3:5bce2e8d2797 119 }
filippomontano 3:5bce2e8d2797 120
filippomontano 3:5bce2e8d2797 121 if(timerA.read()>=stopTimer) {
filippomontano 5:9f30eba41c77 122 // BLExmit=ble.getGapState().connected;
filippomontano 5:9f30eba41c77 123 BLExmit=ble.gap().getState().connected;
filippomontano 0:345c72cbcd60 124 timerA.stop();
filippomontano 0:345c72cbcd60 125 timerA.reset();
filippomontano 0:345c72cbcd60 126 led=!led.read();
filippomontano 3:5bce2e8d2797 127 printf("%c\r\n",symbol);
filippomontano 0:345c72cbcd60 128 timerA.start();
filippomontano 3:5bce2e8d2797 129
filippomontano 0:345c72cbcd60 130 }
filippomontano 6:f85bc6e59111 131 if(CANmsgAvailable) {
filippomontano 6:f85bc6e59111 132 CANmsgAvailable = false; // reset flag for next use
filippomontano 6:f85bc6e59111 133 can.read(rxMsg); // read message into Rx message storage
filippomontano 6:f85bc6e59111 134 j=CANId2BLESlot(rxMsg.id);
filippomontano 6:f85bc6e59111 135 if(j!=bleRdPointerA && j!=bleRdPointerB) {
filippomontano 6:f85bc6e59111 136
filippomontano 6:f85bc6e59111 137 for(int i = 0; i < rxMsg.len; i++) {
filippomontano 6:f85bc6e59111 138 shareddata[j][i]=rxMsg.data[i];
filippomontano 6:f85bc6e59111 139 // printf(" %x", rxMsg.data[i]);
filippomontano 6:f85bc6e59111 140 }
filippomontano 6:f85bc6e59111 141 // printf("#");
filippomontano 6:f85bc6e59111 142
filippomontano 6:f85bc6e59111 143 }
filippomontano 6:f85bc6e59111 144 }
filippomontano 3:5bce2e8d2797 145 if(BLExmit) {
filippomontano 3:5bce2e8d2797 146 BLExmit=false;
filippomontano 3:5bce2e8d2797 147 retry++;
filippomontano 5:9f30eba41c77 148 if(retry==0xff) ble.gap().startAdvertising();
filippomontano 6:f85bc6e59111 149 printf ("%x ",retry);
filippomontano 3:5bce2e8d2797 150 printf("@");
filippomontano 3:5bce2e8d2797 151 k++;
filippomontano 6:f85bc6e59111 152 if(k>lastBleRdPointer)
filippomontano 6:f85bc6e59111 153 k=firstBleRdPointer;
filippomontano 3:5bce2e8d2797 154 readValue[0]=k;
filippomontano 3:5bce2e8d2797 155 for(int i=1; i<8; i++) {
filippomontano 3:5bce2e8d2797 156 readValue[i]=shareddata[k][i];
filippomontano 0:345c72cbcd60 157 }
filippomontano 5:9f30eba41c77 158 for(int i=0; i<8; i++) {
filippomontano 5:9f30eba41c77 159 printf ("%x",readValue[i]);
filippomontano 5:9f30eba41c77 160 }
filippomontano 3:5bce2e8d2797 161 ble.updateCharacteristicValue(readChar.getValueHandle(), readValue,9);
filippomontano 0:345c72cbcd60 162 }
filippomontano 0:345c72cbcd60 163 }
filippomontano 0:345c72cbcd60 164 }
filippomontano 3:5bce2e8d2797 165
filippomontano 3:5bce2e8d2797 166 void bleInitComplete(BLE::InitializationCompleteCallbackContext *params)
filippomontano 0:345c72cbcd60 167 {
filippomontano 3:5bce2e8d2797 168 BLE& ble = params->ble;
filippomontano 3:5bce2e8d2797 169 ble_error_t error = params->error;
filippomontano 3:5bce2e8d2797 170
filippomontano 3:5bce2e8d2797 171 if (error != BLE_ERROR_NONE) {
filippomontano 3:5bce2e8d2797 172 onBleInitError(ble, error);
filippomontano 3:5bce2e8d2797 173 return;
filippomontano 3:5bce2e8d2797 174 }
filippomontano 3:5bce2e8d2797 175
filippomontano 3:5bce2e8d2797 176 if (ble.getInstanceID() != BLE::DEFAULT_INSTANCE) {
filippomontano 3:5bce2e8d2797 177 return;
filippomontano 3:5bce2e8d2797 178 }
filippomontano 5:9f30eba41c77 179
filippomontano 3:5bce2e8d2797 180 ble.gap().onDisconnection(disconnectionCallback);
filippomontano 3:5bce2e8d2797 181
filippomontano 3:5bce2e8d2797 182 /* Setup primary service. */
filippomontano 3:5bce2e8d2797 183
filippomontano 3:5bce2e8d2797 184 /* Setup advertising. */
filippomontano 3:5bce2e8d2797 185 printf("Setup of Advertising\r\n");
filippomontano 3:5bce2e8d2797 186 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE);
filippomontano 3:5bce2e8d2797 187 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS, (uint8_t *)uuid16_list, sizeof(uuid16_list));
filippomontano 3:5bce2e8d2797 188 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME));
filippomontano 3:5bce2e8d2797 189 ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
filippomontano 3:5bce2e8d2797 190 ble.gap().setAdvertisingInterval(1000);// 1000ms
filippomontano 3:5bce2e8d2797 191 ble.gap().startAdvertising();
filippomontano 3:5bce2e8d2797 192 ble.onDataWritten(writeCharCallback);
filippomontano 3:5bce2e8d2797 193 ble.addService(customService);
filippomontano 5:9f30eba41c77 194 ticker.detach();
filippomontano 5:9f30eba41c77 195 ticker.attach(periodicCallback, 1); // blink LED every second
filippomontano 3:5bce2e8d2797 196
filippomontano 3:5bce2e8d2797 197 printf("Starting Loop\r\n");
filippomontano 6:f85bc6e59111 198
filippomontano 6:f85bc6e59111 199
filippomontano 3:5bce2e8d2797 200 }
filippomontano 3:5bce2e8d2797 201 void onBleInitError(BLE &ble, ble_error_t error)
filippomontano 3:5bce2e8d2797 202 {
filippomontano 3:5bce2e8d2797 203 (void)ble;
filippomontano 3:5bce2e8d2797 204 (void)error;
filippomontano 3:5bce2e8d2797 205 printf(" ### BLE init error ###\r\n");
filippomontano 3:5bce2e8d2797 206
filippomontano 3:5bce2e8d2797 207
filippomontano 3:5bce2e8d2797 208 /* Initialization error handling should go here */
filippomontano 0:345c72cbcd60 209 }
filippomontano 6:f85bc6e59111 210 void onMsgReceived(void)
filippomontano 6:f85bc6e59111 211 {
filippomontano 6:f85bc6e59111 212 CANmsgAvailable = true;
filippomontano 6:f85bc6e59111 213 }
filippomontano 6:f85bc6e59111 214 uint8_t CANId2BLESlot(unsigned int id)
filippomontano 0:345c72cbcd60 215 {
filippomontano 6:f85bc6e59111 216 uint8_t retval=0;
filippomontano 6:f85bc6e59111 217 switch(id) {
filippomontano 6:f85bc6e59111 218 case 0x313:
filippomontano 6:f85bc6e59111 219 retval=1;
filippomontano 6:f85bc6e59111 220 break;
filippomontano 6:f85bc6e59111 221 case 0x314:
filippomontano 6:f85bc6e59111 222 retval=2;
filippomontano 6:f85bc6e59111 223 break;
filippomontano 6:f85bc6e59111 224 case 0x310:
filippomontano 6:f85bc6e59111 225 retval=3;
filippomontano 6:f85bc6e59111 226 break;
filippomontano 6:f85bc6e59111 227 case 0x315:
filippomontano 6:f85bc6e59111 228 retval=4;
filippomontano 6:f85bc6e59111 229 break;
filippomontano 6:f85bc6e59111 230 case 0x111:
filippomontano 6:f85bc6e59111 231 retval=5;
filippomontano 6:f85bc6e59111 232 break;
filippomontano 6:f85bc6e59111 233 case 0x112:
filippomontano 6:f85bc6e59111 234 retval=6;
filippomontano 6:f85bc6e59111 235 break;
filippomontano 6:f85bc6e59111 236 case 0x400:
filippomontano 6:f85bc6e59111 237 retval=7;
filippomontano 6:f85bc6e59111 238 break;
filippomontano 6:f85bc6e59111 239 case 0x450:
filippomontano 6:f85bc6e59111 240 retval=8;
filippomontano 6:f85bc6e59111 241 break;
filippomontano 6:f85bc6e59111 242 case 0x451:
filippomontano 6:f85bc6e59111 243 retval=9;
filippomontano 6:f85bc6e59111 244 break;
filippomontano 6:f85bc6e59111 245 case 0x452:
filippomontano 6:f85bc6e59111 246 retval=10;
filippomontano 6:f85bc6e59111 247 break;
filippomontano 6:f85bc6e59111 248 case 0x453:
filippomontano 6:f85bc6e59111 249 retval=11;
filippomontano 6:f85bc6e59111 250 break;
filippomontano 6:f85bc6e59111 251 case 0x454:
filippomontano 6:f85bc6e59111 252 retval=12;
filippomontano 6:f85bc6e59111 253 break;
filippomontano 6:f85bc6e59111 254 case 0x455:
filippomontano 6:f85bc6e59111 255 retval=13;
filippomontano 6:f85bc6e59111 256 break;
filippomontano 6:f85bc6e59111 257 default:
filippomontano 6:f85bc6e59111 258 retval=0;
filippomontano 6:f85bc6e59111 259 break;
filippomontano 6:f85bc6e59111 260 }
filippomontano 6:f85bc6e59111 261 return retval;
filippomontano 6:f85bc6e59111 262 }
filippomontano 6:f85bc6e59111 263 unsigned int BLESlot2CANId(uint8_t id)
filippomontano 6:f85bc6e59111 264 {
filippomontano 6:f85bc6e59111 265 unsigned int retval=0;
filippomontano 6:f85bc6e59111 266 switch(id) {
filippomontano 6:f85bc6e59111 267 case 63:
filippomontano 6:f85bc6e59111 268 retval=0x303;
filippomontano 6:f85bc6e59111 269 break;
filippomontano 6:f85bc6e59111 270 case 62:
filippomontano 6:f85bc6e59111 271 retval=0x304;
filippomontano 6:f85bc6e59111 272 break;
filippomontano 6:f85bc6e59111 273 default:
filippomontano 6:f85bc6e59111 274 retval=0x0;
filippomontano 6:f85bc6e59111 275 break;
filippomontano 6:f85bc6e59111 276 }
filippomontano 6:f85bc6e59111 277 return retval;
filippomontano 6:f85bc6e59111 278 }
filippomontano 5:9f30eba41c77 279
filippomontano 6:f85bc6e59111 280 void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params)
filippomontano 6:f85bc6e59111 281 {
filippomontano 6:f85bc6e59111 282 (void)params;
filippomontano 6:f85bc6e59111 283 printf("\r\nTarget loss... wait for reconnection \r\n");
filippomontano 6:f85bc6e59111 284
filippomontano 6:f85bc6e59111 285 BLE::Instance().gap().startAdvertising(); // restart advertising
filippomontano 0:345c72cbcd60 286 }
filippomontano 6:f85bc6e59111 287
filippomontano 3:5bce2e8d2797 288 void writeCharCallback(const GattWriteCallbackParams *params)
filippomontano 3:5bce2e8d2797 289 {
filippomontano 3:5bce2e8d2797 290
filippomontano 3:5bce2e8d2797 291 uint8_t j=0;
filippomontano 3:5bce2e8d2797 292
filippomontano 3:5bce2e8d2797 293 // check to see what characteristic was written, by handle
filippomontano 6:f85bc6e59111 294 if(params->handle == writeChar.getValueHandle()) {
filippomontano 3:5bce2e8d2797 295 BLESlot2CANId(params->data[0]);
filippomontano 3:5bce2e8d2797 296 printf("\n\r Data received: length = %d, data = ",params->len);
filippomontano 3:5bce2e8d2797 297 if(canRdPointer != j && canRdPointer != j+1) {
filippomontano 3:5bce2e8d2797 298 bleWrPointerA=j;
filippomontano 3:5bce2e8d2797 299 bleWrPointerB=j+1;
filippomontano 3:5bce2e8d2797 300 for(int x=0; x < 9; x++) {
filippomontano 3:5bce2e8d2797 301 printf("%c",params->data[x]);
filippomontano 3:5bce2e8d2797 302 shareddata[j][x]=params->data[x];
filippomontano 3:5bce2e8d2797 303 }
filippomontano 3:5bce2e8d2797 304 for(int x=9; x < 18; x++) {
filippomontano 3:5bce2e8d2797 305 printf("%c",params->data[x]);
filippomontano 3:5bce2e8d2797 306 shareddata[j+1][x-9]=params->data[x];
filippomontano 3:5bce2e8d2797 307 }
filippomontano 3:5bce2e8d2797 308 bleWrPointerA=255;
filippomontano 3:5bce2e8d2797 309 bleWrPointerB=255;
filippomontano 3:5bce2e8d2797 310 }
filippomontano 6:f85bc6e59111 311 }
filippomontano 3:5bce2e8d2797 312 }
filippomontano 6:f85bc6e59111 313 void periodicCallback(void)
filippomontano 6:f85bc6e59111 314 {
filippomontano 6:f85bc6e59111 315 if(!ble.getGapState().connected) {
filippomontano 6:f85bc6e59111 316 printf("? ");
filippomontano 6:f85bc6e59111 317 ticker.attach(periodicCallback, 1); // blink LED every 5 second
filippomontano 6:f85bc6e59111 318 } else
filippomontano 6:f85bc6e59111 319 ticker.attach(periodicCallback, 0.1); // blink LED every second
filippomontano 6:f85bc6e59111 320
filippomontano 6:f85bc6e59111 321 triggerSensorPolling = true;
filippomontano 6:f85bc6e59111 322 }