MBED code for Xbee module running on solar car
Dependencies: XBeeLib mbed CUER_CAN
Fork of XBee802_Send_Data by
CAN_Parser_Telemetry.cpp@14:e625e467e257, 2017-10-07 (annotated)
- 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?
User | Revision | Line number | New 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 | } |