MBED code for Xbee unit running on chase car
Dependencies: CUER_CAN XBeeLib mbed
CAN_Parser_Telemetry.cpp@15:6e5910216c39, 2017-09-26 (annotated)
- 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?
User | Revision | Line number | New 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 |