Has base BMU code but sends dummy temperature and voltage readings to test CAN

Dependencies:   CUER_CAN DS1820 LTC2943 LTC6804 mbed

Fork of BMS_BMUCore_Max by CUER

CANParserBMU.cpp

Committer:
lcockerton62
Date:
2016-12-30
Revision:
3:527790e4965a
Parent:
1:51477fe4851b
Child:
5:793afeef45dc

File content as of revision 3:527790e4965a:

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


using namespace CAN_IDs;

CANMessage createTemperatureTelemetry(uint8_t ID, uint32_t CMUSerialNumber, uint16_t PCBTemperature, uint16_t cellTemperature)
{
    CANMessage msg;
    msg.len = 8;
    msg.id = BMS_BASE_ID + ID; // for voltage 0x601 - 0x6EF
    CAN_Data data;

    data.setLower_uLong(CMUSerialNumber);
    data.set_u16(2, PCBTemperature);
    data.set_u16(3, cellTemperature);

    for (int i = 0; i<8; i++) {
        msg.data[i] = data.get_u8(i);
    }

    return msg;
}

CANMessage createVoltageTelemetry(int ID, uint16_t voltage[])
{
    CANMessage msg;
    msg.len = 8;
    msg.id = BMS_BASE_ID + ID; // for voltage 0x601 - 0x6EF @TODO
    CAN_Data data;

    data.set_u16(0, voltage[0]);
    data.set_u16(1, voltage[1]);
    data.set_u16(2, voltage[2]);
    data.set_u16(3, voltage[3]);

    for (int i = 0; i<8; i++) {
        msg.data[i] = data.get_u8(i);
    }

    return msg;
}

CANMessage createPackSOC(float SOC, float percentageCharge)
{
    CANMessage msg;
    msg.len = 8;
    msg.id = BMS_BASE_ID + BATTERY_SOC_ID;
    CAN_Data data;
    data.setLowerFloat(SOC);
    data.setUpperFloat(percentageCharge);
    for(int i=0; i<8; i++) {
        msg.data[i] = data.get_u8(i);
    }

    return msg;
}

CANMessage createPackBalanceSOC(float SOC, float percentageCharge)
{
    // @TODO - check is this being used?? section 5.4 trituim BMU CAN data sheet
    CANMessage msg;
    msg.len = 8;
    msg.id = BMS_BASE_ID + BATTERY_SOC_BASE_ID;

    CAN_Data data;
    data.setLowerFloat(SOC);
    data.setUpperFloat(percentageCharge);
    for(int i=0; i<8; i++) {
        msg.data[i] = data.get_u8(i);
    }

    return msg;
}

CANMessage createCellVoltageMAXMIN(pack_voltage_extremes max_voltage, pack_voltage_extremes min_voltage)
{
    //@TODO create a structure to store this data , so that the data is stored in the correct order
    CANMessage msg;
    msg.len = 8;
    msg.id = BMS_BASE_ID + MAX_MIN_VOLTAGE;

    CAN_Data data;
    data.set_u16(0,min_voltage.voltage);   //Min voltage
    data.set_u16(1,max_voltage.voltage);   //Max voltage
    data.set_u8(4,min_voltage.CMU_number);  //CMU number of lowest cell
    data.set_u8(5,min_voltage.cell_number);  //Cell number in CMU with lowest voltage
    data.set_u8(6,min_voltage.CMU_number);  //CMU number of maxiumum cell
    data.set_u8(7,min_voltage.cell_number);  //Cell number in CMU with highest voltage

    for(int i=0; i<8; i++) {
        msg.data[i] = data.get_u8(i);
    }

    return msg;
}

CANMessage createCellTemperatureMAXMIN(pack_temperature_extremes min_temperature, pack_temperature_extremes max_temperature)
{
    //@TODO create a structure to store this data , so that the data is stored in the correct order
    CANMessage msg;
    msg.len = 8;
    msg.id = BMS_BASE_ID + MAX_MIN_TEMPERATURE;

    CAN_Data data;
    data.set_u16(0,min_temperature.temperature);   //Min temperature
    data.set_u16(1,max_temperature.temperature);   //Max temperature
    data.set_u8(4,min_temperature.CMU_number);  //CMU number of lowest temperature cell
    data.set_u8(5,BLANK_DATA);  //Dummy data
    data.set_u8(6,max_temperature.CMU_number);  //CMU number of maxiumum temperature cell
    data.set_u8(7,BLANK_DATA);  //Dummy data

    for(int i=0; i<8; i++) {
        msg.data[i] = data.get_u8(i);
    }

    return msg;
}

CANMessage createBatteryVI(uint32_t batteryVoltage,uint32_t batteryCurrent)
{
    CANMessage msg;
    msg.len = 8;
    msg.id = BMS_BASE_ID + BATTERY_VI_ID;

    CAN_Data data;
    data.setLower_uLong(batteryVoltage);
    data.setHigher_uLong(batteryCurrent);

    for(int i=0; i<8; i++) {
        msg.data[i] = data.get_u8(i);
    }
    return msg;
}

CANMessage createBatteryPackStatus(uint16_t voltageThreshold[], uint8_t statusFlag,uint8_t BMS_CMU_Count,uint16_t BMS_Firmware_Build)
{
    CANMessage msg;
    msg.len = 8;
    msg.id = BMS_BASE_ID + BATTERY_PACK_STATUS_ID;

    CAN_Data data;
    data.set_u16(0,voltageThreshold[0]);
    data.set_u16(1,voltageThreshold[1]);
    data.set_16(3,BMS_Firmware_Build);
    data.set_u8(4,statusFlag);
    data.set_u8(5,BMS_CMU_Count);

    for(int i=0; i<8; i++) {
        msg.data[i] = data.get_u8(i);
    }
    return msg;
}

CANMessage createExtendedBatteryPackStatus(uint32_t status)
{
    CANMessage msg;
    msg.len = 8;
    msg.id = BMS_BASE_ID + BATTERY_STATUS_ID;

    CAN_Data data;
    data.setLower_uLong(status); //@TODO see the data sheet for this
    data.set_u8(4,0x00);//Hardware version random data @TODO check this
    data.set_u8(5,0x00);//Model ID @TODO check this
    data.set_u16(3,0x00); // Unused

    for(int i=0; i<8; i++) {
        msg.data[i] = data.get_u8(i);
    }
    return msg;
}

void convertFloatFloat(float lower, float upper, CANMessage& msg, bool littleEndian)
{
    // Code taken from driver_controls
    //two converters for lower and higher float
    float2byte convL;
    float2byte convH;
    convL.f = lower;
    convH.f = upper;
    if(littleEndian) {
        for(int i=0; i<4; i++) {
            msg.data[i] = convL.b[i];
            //offset for upper float
            msg.data[i+4]=convH.b[i];
        }
    } else {
        for(int i=0; i<4; i++) {
            /*
            * Subtract because output data is Big Endian
            * i.e. convL/H is LSB --> MSB
            * output is       MSB --> LSB
            */

            msg.data[4-i] = convL.b[i];
            msg.data[7-i] = convH.b[i];
        }
    }

}