CAN to BLE translator - and back

Dependencies:   BLE_API CANnucleo X_NUCLEO_IDB0XA1 mbed

Committer:
filippomontano
Date:
Fri Apr 08 12:21:07 2016 +0000
Revision:
3:5bce2e8d2797
Parent:
2:bfe8810290ac
Child:
4:8c2cd88d2545
CAN to BLE Now is working!!! - missing disconnection callback

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