Code to run on the charger board (used to charge the car from the mains).

Dependencies:   mbed CUER_CAN

CANParserCharger.cpp

Committer:
DasSidG
Date:
2017-07-30
Revision:
5:756fae795d37
Parent:
3:a7626dffb64a
Child:
7:70cf5bff23f9

File content as of revision 5:756fae795d37:

// Here are the functions to generate the CAN messages
#include "CANParserCharger.h"
#include "mbed.h"
#include "CAN_IDs.h"


using namespace CAN_IDs;

void get_max_min_voltage(CANMessage msg, float &_min_cell_voltage, float &_max_cell_voltage) {
    CAN_Data data;
    data.importCANData(msg);
    
    _min_cell_voltage = (float) data.get_u16(0);
    _max_cell_voltage = (float) data.get_u16(1);
}    

void get_battery_status(CANMessage msg, bool &error) { //note using extended battery pack status
    CAN_Data data;
    data.importCANData(msg);
    
    error = data.getLower_uLong() > 0;
    //ignore the rest of the status as we don't care
}

void get_charger_VI_info(CANMessage msg, float &_charger_voltage, float &_charger_current, uint8_t &_charger_status) {
    CAN_Data data;
    data.importCANData(msg);
    
    _charger_voltage = data.get_u16(0)*100.0;
    _charger_current = data.get_u16(1)*100.0;
    _charger_status = data.get_u8(4);
}

void check_precharge_status (CANMessage msg, bool &_precharge_ready) {
    CAN_Data data;
    data.importCANData(msg);
    
    if(data.get_u8(1) == 4) _precharge_ready = true;
    else _precharge_ready = false;
}

CANMessage generate_charger_control_msg(float _desired_voltage, float _desired_current, uint8_t _charger_control) {
    CANMessage msg;
    msg.format = CANExtended; //the charger uses the extended CAN frame format
    msg.len = 8;
    msg.id = CHARGER_VI_CONTROL_ID;
    CAN_Data data;
    data.set_u16(0, (uint16_t) (_desired_voltage/100));
    data.set_u16(1, (uint16_t) (_desired_current/100));
    data.set_u8(4, _charger_control);
    data.set_u8(5,0);
    data.set_u8(6,0);
    data.set_u8(7,0);
    
    for(int i=0; i<8; i++) {
        msg.data[i] = data.get_u8(i);
    }
    
    return msg;
}

CANMessage generate_charger_info_msg(float _charger_voltage, float _charger_current, uint8_t _charger_status) {
    CANMessage msg;
    msg.len = 8;
    msg.id = CHARGER_ID;
    CAN_Data data;
    data.set_u16(0, (uint16_t) (_charger_voltage/100));
    data.set_u16(1, (uint16_t) (_charger_current/100));
    data.set_u8(4, _charger_status);
    data.set_u8(5,0);
    data.set_u8(6,0);
    data.set_u8(7,0);
    
    for(int i=0; i<8; i++) {
        msg.data[i] = data.get_u8(i);
    }
    
    return msg;
}

CANMessage generate_charging_finished_msg() {
    CANMessage msg;
    msg.len = 8;
    msg.id = BMS_BASE_ID + EEPROM_RESET_ID;
    
    CAN_Data data;
    data.setLowerFloat(PACK_CAPACITY); //42 is the pack capacity in Ah
    data.setUpperFloat(100); //100% as fully charged
    
    for(int i=0; i<8; i++) {
        msg.data[i] = data.get_u8(i);
    }
    return msg;    
}