MBED code for Xbee unit running on chase car

Dependencies:   CUER_CAN XBeeLib mbed

Committer:
ItsJustZi
Date:
Tue Sep 26 12:09:13 2017 +0000
Revision:
15:6e5910216c39
Parent:
14:842201fb6e10
Attempt to increase frequency of CAN packets sent to CANAlyzer by increasing time between xbee callbacks which are blocking functions

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ItsJustZi 12:c492d4bc45cd 1 #include "CAN_Parser_Telemetry.h"
ItsJustZi 12:c492d4bc45cd 2 #define DEBUG 1
ItsJustZi 12:c492d4bc45cd 3
ItsJustZi 12:c492d4bc45cd 4 using namespace CAN_IDs;
ItsJustZi 12:c492d4bc45cd 5
ItsJustZi 12:c492d4bc45cd 6 CAN can(CAN_READ_PIN, CAN_WRITE_PIN); //Create a CAN object to handle CAN comms
ItsJustZi 12:c492d4bc45cd 7
ItsJustZi 12:c492d4bc45cd 8 //Software buffer for receiving CAN messages
ItsJustZi 12:c492d4bc45cd 9 CANMessage buffer[CAN_BUFFER_SIZE]; //CAN receive buffer
ItsJustZi 12:c492d4bc45cd 10 bool safe_to_write[CAN_BUFFER_SIZE]; //Semaphore bit indicating that it's safe to write to the software buffer
ItsJustZi 12:c492d4bc45cd 11 bool CAN_data_sent;
ItsJustZi 12:c492d4bc45cd 12 int acceptedCANIDs[CAN_BUFFER_SIZE];
ItsJustZi 12:c492d4bc45cd 13
ItsJustZi 12:c492d4bc45cd 14 void CAN_Init()
ItsJustZi 12:c492d4bc45cd 15 {
ItsJustZi 12:c492d4bc45cd 16 printf("In CAN init \r\n");
ItsJustZi 12:c492d4bc45cd 17 //Initialise CAN buffer
ItsJustZi 12:c492d4bc45cd 18 for(int i=0; i<CAN_BUFFER_SIZE; i++) {
ItsJustZi 12:c492d4bc45cd 19 buffer[i].id = BLANK_ID;
ItsJustZi 12:c492d4bc45cd 20 //("%d",buffer[i].id);
ItsJustZi 12:c492d4bc45cd 21 safe_to_write[i]= true;
ItsJustZi 12:c492d4bc45cd 22 }
ItsJustZi 12:c492d4bc45cd 23
ItsJustZi 12:c492d4bc45cd 24 //Initialise CAN stuff, attach CAN interrupt handlers
ItsJustZi 12:c492d4bc45cd 25 can.frequency(CAN_BIT_RATE); //set transmission rate to agreed bit rate (ELEC-006)
ItsJustZi 12:c492d4bc45cd 26 can.reset(); // (FUNC-018)
ItsJustZi 12:c492d4bc45cd 27 can.attach(&interruptHandler, CAN::RxIrq); //receive interrupt handler
ItsJustZi 12:c492d4bc45cd 28 can.attach(&CANDataSentCallback, CAN::TxIrq); //send interrupt handler
ItsJustZi 12:c492d4bc45cd 29 }
ItsJustZi 12:c492d4bc45cd 30
ItsJustZi 12:c492d4bc45cd 31 void interruptHandler()
ItsJustZi 12:c492d4bc45cd 32 {
ItsJustZi 12:c492d4bc45cd 33 //printf("Interrupt Handler called \r\n");
ItsJustZi 12:c492d4bc45cd 34 CANMessage msg;
ItsJustZi 12:c492d4bc45cd 35 can.read(msg);
ItsJustZi 12:c492d4bc45cd 36 //if(DEBUG) printf("id %d incoming \r\n", msg.id);
ItsJustZi 12:c492d4bc45cd 37 if(idAccepted(msg.id)) {
ItsJustZi 12:c492d4bc45cd 38 for(int i=0; i<CAN_BUFFER_SIZE; i++) {
ItsJustZi 12:c492d4bc45cd 39 //printf("In idAccepted loop");
ItsJustZi 12:c492d4bc45cd 40 if((buffer[i].id == msg.id || buffer[i].id==BLANK_ID) && safe_to_write[i]) {
ItsJustZi 12:c492d4bc45cd 41 //("id %d added to buffer \r\n", msg.id);
ItsJustZi 12:c492d4bc45cd 42 buffer[i] = msg;
ItsJustZi 12:c492d4bc45cd 43 //printf("%x \r\n", msg.id);
ItsJustZi 12:c492d4bc45cd 44 //return required so that only first blank buffer entry is converted to incoming message ID each time new message ID is encountered
ItsJustZi 12:c492d4bc45cd 45 return;
ItsJustZi 12:c492d4bc45cd 46 }
ItsJustZi 12:c492d4bc45cd 47 }
ItsJustZi 12:c492d4bc45cd 48 }
ItsJustZi 12:c492d4bc45cd 49 }
ItsJustZi 12:c492d4bc45cd 50
ItsJustZi 12:c492d4bc45cd 51 bool idAccepted(int id)
ItsJustZi 12:c492d4bc45cd 52 {
ItsJustZi 12:c492d4bc45cd 53 for (int i=0; i<CAN_BUFFER_SIZE; i++) {
ItsJustZi 12:c492d4bc45cd 54 if (id==acceptedCANIDs[i]) {
ItsJustZi 12:c492d4bc45cd 55 //printf("idAccepted \r\n");
ItsJustZi 12:c492d4bc45cd 56 return true;
ItsJustZi 12:c492d4bc45cd 57 }
ItsJustZi 12:c492d4bc45cd 58 }
ItsJustZi 12:c492d4bc45cd 59 return false;
ItsJustZi 12:c492d4bc45cd 60 }
ItsJustZi 12:c492d4bc45cd 61
ItsJustZi 12:c492d4bc45cd 62 bool can_send(CANMessage msg)
ItsJustZi 12:c492d4bc45cd 63 {
ItsJustZi 12:c492d4bc45cd 64 Timer t;
ItsJustZi 12:c492d4bc45cd 65 CAN_data_sent = false;
ItsJustZi 12:c492d4bc45cd 66 t.start();
ItsJustZi 12:c492d4bc45cd 67 can.write(msg);
ItsJustZi 12:c492d4bc45cd 68 //printf("CAN message sent with id %x \r\n", msg.id);
ItsJustZi 12:c492d4bc45cd 69 while(!CAN_data_sent && t.read_ms() < CAN_TIMEOUT_MS);
ItsJustZi 12:c492d4bc45cd 70 if (t.read_ms() > CAN_TIMEOUT_MS) return false;
ItsJustZi 12:c492d4bc45cd 71 else return true;
ItsJustZi 12:c492d4bc45cd 72 }
ItsJustZi 12:c492d4bc45cd 73
ItsJustZi 12:c492d4bc45cd 74 void CANDataSentCallback(void)
ItsJustZi 12:c492d4bc45cd 75 {
ItsJustZi 12:c492d4bc45cd 76 CAN_data_sent = true;
ItsJustZi 12:c492d4bc45cd 77 }
ItsJustZi 12:c492d4bc45cd 78
ItsJustZi 12:c492d4bc45cd 79 void CANIDsListUpdater(void)
ItsJustZi 12:c492d4bc45cd 80 {
ItsJustZi 12:c492d4bc45cd 81 acceptedCANIDs[0]= MOTOR_CONTROLLER_BASE_ID + MOTOR_STATUS_ID;
ItsJustZi 12:c492d4bc45cd 82 acceptedCANIDs[1]= MOTOR_CONTROLLER_BASE_ID + MOTOR_VELOCITY_ID;
ItsJustZi 12:c492d4bc45cd 83 acceptedCANIDs[2]= BMS_BASE_ID + BATTERY_SOC_ID;
ItsJustZi 12:c492d4bc45cd 84 acceptedCANIDs[3]= BMS_BASE_ID + BATTERY_VI_ID;
ItsJustZi 12:c492d4bc45cd 85 acceptedCANIDs[4]= BMS_BASE_ID + BATTERY_STATUS_ID;
ItsJustZi 14:842201fb6e10 86 acceptedCANIDs[5]= BCU_STATUS_ID;
ItsJustZi 14:842201fb6e10 87 acceptedCANIDs[5]= BMS_BASE_ID + IVTA_ID;
ItsJustZi 14:842201fb6e10 88 acceptedCANIDs[6]= BMS_BASE_ID + MAX_MIN_VOLTAGE;
ItsJustZi 14:842201fb6e10 89 acceptedCANIDs[7]= DRIVER_CONTROLS_BASE_ID + MOTOR_DRIVE_CMD;
ItsJustZi 14:842201fb6e10 90 acceptedCANIDs[8]= DRIVER_CONTROLS_BASE_ID + MOTOR_POWER_CMD;
ItsJustZi 14:842201fb6e10 91 acceptedCANIDs[9]= 0x40B; //motor controller heatsink and motor temp
ItsJustZi 14:842201fb6e10 92 acceptedCANIDs[10]=AMBIENT_TEMP_ID;
ItsJustZi 14:842201fb6e10 93 acceptedCANIDs[11]=0x404; //motor controller phase currents
ItsJustZi 14:842201fb6e10 94 acceptedCANIDs[12]=CHARGER_ID;
ItsJustZi 12:c492d4bc45cd 95 }
ItsJustZi 12:c492d4bc45cd 96
ItsJustZi 12:c492d4bc45cd 97 CANMessage generateCANPackets(const uint8_t *xbeeData)
ItsJustZi 12:c492d4bc45cd 98 {
ItsJustZi 12:c492d4bc45cd 99 CANMessage msg;
ItsJustZi 12:c492d4bc45cd 100 msg.id=(uint16_t)xbeeData[0]+((uint16_t)(xbeeData[1])<<8);
ItsJustZi 15:6e5910216c39 101 //for (int i=0; i<10; i++) {
ItsJustZi 15:6e5910216c39 102 //if (DEBUG) printf("byte %d is %x \r\n", i, xbeeData[i]);
ItsJustZi 15:6e5910216c39 103 //}
ItsJustZi 15:6e5910216c39 104 //if (DEBUG) printf("CAN ID is %x \r\n", msg.id);
ItsJustZi 12:c492d4bc45cd 105 msg.len = 8;
ItsJustZi 12:c492d4bc45cd 106 //CAN_Data data;
ItsJustZi 12:c492d4bc45cd 107 for (int i=0; i<8; i++) {
ItsJustZi 12:c492d4bc45cd 108 msg.data[i]=xbeeData[i+2];
ItsJustZi 12:c492d4bc45cd 109 }
ItsJustZi 12:c492d4bc45cd 110 return msg;
ItsJustZi 12:c492d4bc45cd 111 }
ItsJustZi 12:c492d4bc45cd 112
ItsJustZi 12:c492d4bc45cd 113