CAN to BLE translator - and back
Dependencies: BLE_API CANnucleo X_NUCLEO_IDB0XA1 mbed
main.cpp@6:f85bc6e59111, 2016-04-08 (annotated)
- 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?
User | Revision | Line number | New 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 | } |