CAN to BLE translator - and back

Dependencies:   BLE_API CANnucleo X_NUCLEO_IDB0XA1 mbed

Revision:
0:345c72cbcd60
Child:
1:43ff0e4d56cc
Child:
2:bfe8810290ac
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Thu Apr 07 14:19:45 2016 +0000
@@ -0,0 +1,159 @@
+#include "mbed.h"
+#include "ble/BLE.h"
+#include "CAN.h"
+#define TARGET_NUCLEO_F072RB 1
+
+#define   LED_PIN   PA_5
+
+uint8_t CANId2BLESlot(unsigned int   id);
+unsigned int BLESlot2CANId(uint8_t   id);
+void onMsgReceived(void);
+void initCAN(void);
+
+DigitalOut      led(LED_PIN);
+
+
+//const unsigned int RX_ID = 0x10;
+//const unsigned int TX_ID = 0x11;
+
+char shareddata[64][8]= { };
+
+uint8_t canWrPointer= 255;
+uint8_t canRdPointer= 255;
+uint8_t bleWrPointerA= 255;
+uint8_t bleRdPointerA= 255;
+uint8_t bleWrPointerB= 255;
+uint8_t bleRdPointerB= 255;
+
+Timer           timerA, timerB; //questi due contatori servono solo per dire: appena è passato un po' di tempo -> esegui
+
+CAN             can(PB_8, PB_9);  // CAN Rx pin name, CAN Tx pin name
+CANMessage      rxMsg;
+CANMessage      txMsg;
+
+volatile bool   CANmsgAvailable = false;
+
+
+int main()
+{
+    uint8_t j=0;
+    printf("\r\nBoard started\r\n");
+    led = 1;       // turn LED on
+    initCAN();
+    timerA.start();
+    timerB.start();
+    while(1) {
+        if(timerA.read()>=1.0) {
+            timerA.stop();
+            timerA.reset();
+            led=!led.read();
+            timerA.start();
+        }
+        if(timerB.read()>=1.0) {
+            timerB.stop();
+            timerB.reset();
+            //led=!led.read();
+            timerB.start();
+        }
+        if(CANmsgAvailable) {
+            CANmsgAvailable = false;               // reset flag for next use
+            can.read(rxMsg);                    // read message into Rx message storage
+            j=CANId2BLESlot(rxMsg.id);
+            if(j!=bleRdPointerA && j!=bleRdPointerB) {
+                //write if BLE is not reading
+                canWrPointer=j;
+                printf("CAN message received:\r\n");
+                printf("  ID     = %#x -> %d \r\n", rxMsg.id, j);
+                //    printf("  Type   = %d\r\n", rxMsg.type);
+                //    printf("  Format = %d\r\n", rxMsg.format);
+                //    printf("  Length = %d\r\n", rxMsg.len);
+                printf("  Data   =");
+                for(int i = 0; i < rxMsg.len; i++) {
+                    shareddata[j][i]=rxMsg.data[i];
+                    printf(" %x", rxMsg.data[i]);
+                }
+                printf("\r\n");
+                canWrPointer=255;
+            }
+            else
+            {
+                 printf("CAN message %#x dropped because BLE read\r\n",rxMsg.id);
+            }
+        }
+    }
+}
+void initCAN(void)
+{
+    can.frequency(500000);                     // set bit rate to 500kbps as S018
+    can.attach(&onMsgReceived, CAN::RxIrq);     // attach 'CAN receive-complete' interrupt handler
+    printf("\r\nCAN started at 500kbps\r\n");
+}
+void onMsgReceived(void)
+{
+    CANmsgAvailable = true;
+}
+uint8_t CANId2BLESlot(unsigned int   id)
+{
+    uint8_t retval=0;
+    switch(id) {
+        case 0x313:
+            retval=1;
+            break;
+        case 0x314:
+            retval=2;
+            break;
+        case 0x310:
+            retval=3;
+            break;
+        case 0x315:
+            retval=4;
+            break;
+        case 0x111:
+            retval=5;
+            break;
+        case 0x112:
+            retval=6;
+            break;
+        case 0x400:
+            retval=7;
+            break;
+        case 0x450:
+            retval=8;
+            break;
+        case 0x451:
+            retval=9;
+            break;
+        case 0x452:
+            retval=10;
+            break;
+        case 0x453:
+            retval=11;
+            break;
+        case 0x454:
+            retval=12;
+            break;
+        case 0x455:
+            retval=13;
+            break;
+        default:
+            retval=0;
+            break;
+    }
+    return retval;
+}
+unsigned int BLESlot2CANId(uint8_t   id)
+{
+    unsigned int retval=0;
+    switch(id) {
+        case 63:
+            retval=0x303;
+            break;
+        case 62:
+            retval=0x304;
+            break;
+        default:
+            retval=0x0;
+            break;
+    }
+    return retval;
+}
\ No newline at end of file