CAN to BLE translator - and back

Dependencies:   BLE_API CANnucleo X_NUCLEO_IDB0XA1 mbed

main.cpp

Committer:
filippomontano
Date:
2016-04-07
Revision:
0:345c72cbcd60
Child:
1:43ff0e4d56cc
Child:
2:bfe8810290ac

File content as of revision 0:345c72cbcd60:

#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;
}