MBED code for Xbee module running on solar car

Dependencies:   XBeeLib mbed CUER_CAN

Fork of XBee802_Send_Data by Digi International Inc.

Committer:
ItsJustZi
Date:
Sat Oct 07 02:49:23 2017 +0000
Revision:
14:e625e467e257
Parent:
12:13762b16b300
Final working implementation of send data before modifying to meet MDH requirements

Who changed what in which revision?

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