/*
 * File:   types.h
 * Author: hamilton
 *
 * Created on May 7, 2026
 */

/* Structures that match the message data contents described in "UW_Harbor_CAN_v2.dbc" */

#ifndef TYPES_H
#define	TYPES_H

struct BES_Data {   // CANID = 0x00015a00 = 88576
    unsigned int BES_Temperature : 8;  //  Scaling:  deg F = data*1 - 55 
    unsigned int BES_Hydrogen_percent : 16;  //  .01% per bit.  Not sure why this is here as there's no Hydrogen Sensor that i know of.
    unsigned int BES_Overvoltage : 1;  //
    unsigned int BES_TC_issue : 1;   //
    unsigned int BES_RH_Issue : 1;  //
    unsigned int BES_H2_OOR : 1;  //
    unsigned int BES_Temp_issue : 1;      // 
    unsigned int BES_Undervoltage : 1;  // 
    unsigned int BES_Sensor_Replacement : 1;  //
    unsigned int BES_Low_power : 1;  //
    unsigned int BES_Voltage : 8;   //   .2V per bit
    unsigned int BES_Humidity : 8;  // .5 Percent per bit
    unsigned int BES_Rolling_Counter : 4;  // 0->15
};

struct BMS_Data_1 {  // CANID = 0x00015600 = 87552
    unsigned int Max_Cell_Voltage : 16;  // 0.1V per bit (0V -> 65.54V)
    unsigned int Min_Cell_Voltage : 16;  // 0.1V per bit (0V -> 65.54V)
    signed int Max_Cell_Temp : 8;  //  1 deg per bit (-127C -> 128C) 
    signed int Min_Cell_Temp : 8;  //  1 deg per bit (-127C -> 128C) 
    unsigned int MsgCntr : 4;  // 0->15
};

struct mHvdmCtrl {  // CANID = 0x00015400 = 87040
    unsigned int HvCtrl_Cmd_ID : 8;  // Multiplexed data in this message, more understanding needed, this may be a CAN message that the battery system recieves to activate various contactors, etc.
};

struct BMS_SOC_SOH_Curr_Lmts {  // CANID = 0x00015200 = 86528
    unsigned int SOC : 16;  //  0.01% per bit (0-100%)
    unsigned int SOH : 16;  //  0.01% per bit (0-100%)
    signed int Charge_Current_Lmt : 12;  // 0.1 Amps per bit (0A - 409.5A) 
    signed int DischargeCurrent_Lmt : 12;  // 0.1 Amps per bit (0A - 409.5A) 
    unsigned int MsgCntr : 4;  // 0->15
};

struct BMS_Status_V_I {  // CANID = 0x00015000 = 86016
    unsigned int BMS_Status : 8;  //  bitfield
    unsigned int Pack_Voltage : 16;  // 0.1V per bit. 
    signed int Pack_Current : 32;  //  0.01A per bit.
    unsigned int Cell_Balancing_State : 1;  // Cell_Balancing_Active = 1, Not_Active = 0
    unsigned int MsgCntr : 4;  // 0->15
};

struct mHvdmStat2 {  // CANID = 0x00014e00 = 85504
    unsigned int SwVer : 16;  //  
    unsigned int MvVOlt : 12;  // 0.05V per bit. 
    unsigned int MsgCntr : 4;  // 0->15
    unsigned int MsgCrc : 8;  // J1850 CRC
};

struct mHvdmStat1 {  // CANID = 0x00014c00 = 84992
    unsigned int HVIsoPos  : 16;  //  Isolation Resistance.  1 kOhm per bit
    unsigned int HVIsoNeg  : 16;  //  Isolation Resistance.  1 kOhm per bit
    unsigned int Flt_Can_MAIN : 2;  //  CAN NetCom fault flag
    unsigned int Flt_Internal : 1;  //  Internal HVDM fault
    unsigned int Flt_HVIso : 2;  //  HV Isolation Monitoring Status
    unsigned int Flt_CAN_HVIso : 1;  // CAN Communication fault with internal Iso monitor 
    unsigned int Flt_24vHigh : 1;  //  24V Measurement too high fault
    unsigned int Flt_24vLow : 1;  //  24V Measurement too low fault
    unsigned int ShtdwnRdy : 1;  //  HVDM Shutdown ready flag
    unsigned int HVPDU_Mode : 3;  //  HVPDU Operating Mode
    unsigned int MsgCntr : 4;  // 0->15
    unsigned int MsgCrc : 8;  // J1850 CRC
};

struct mHvdmMgaStat2 {  // CANID = 0x00014a00 = 84480
    signed int HvCurrPosMax  : 12;  //  HV Branch Maximum Positive 1bit = 1mA
    signed int HvCurrNegMax  : 12;  //  HV Branch Maximum Negative 1bit = 1mA
    unsigned int HvVoltOutMax  : 8;  //  HV Branch max output voltage detected, 4V per bit.
    unsigned int HvRlyCount : 16;  //  Total number of time HV Branch Relay opened
    unsigned int MsgCntr : 4;  // 0->15
};

struct mHvdmMgaStat1 {  // CANID = 0x00014800 = 83968
    unsigned int OpStat : 2;  // Operation Status: Stanby = 0, Active = 1, Pause = 2, Fault = 3
    unsigned int HvRlyStat : 2;  // Opened = 0, OpenPend = 1, PreCharge = 2, Closed = 3;
    signed int HvCurr : 12;  // 1 A per bit (-1024A -> 1024A)
    unsigned int HvVoltIn : 8;  // 4V per bit (0 -> 1018V)
    unsigned int HvVoltOut : 8;  // 4V per bit (0 -> 1018V)
    unsigned int Flt_HvCurrOOR : 1;  //  HV Current Measurement Out of Range Fault
    unsigned int Flt_HvCurrSnsr : 1;  // HV Current Sensor fault flag
    unsigned int Flt_HvVoltOOR : 1;  //  HV Voltage Measurement Out of Range Fault
    unsigned int Flt_HvRlyWeld : 1;  //  Relay stuck closed fault flag
    unsigned int Flt_HVCurrOvrld  : 1;  // HV Current Overload fault flag
    unsigned int Flt_HvPchrgShort : 1;  // HV precharge short circuit fault flag
    unsigned int Flt_HvPchrgOL : 1;  // HV precharge overload fault flag
    unsigned int Flt_HvFuse_MGA : 1;  // HV Fuse open fault flag
    unsigned int HVCurrOvrldStat : 2;  // Current overload status (Opened = 3, fuse range = 2, upper range = 1, lower range = 0)
    unsigned int MsgCntr : 4;  // 0->15
    unsigned int MsgCrc : 8;  // J1850 CRC
};

struct mHvdmExport2Stat2 {  // CANID = 0x00014600 = 83456
    signed int HvCurrPosMax  : 12;  //  HV Branch Maximum Positive 1bit = 1mA
    signed int HvCurrNegMax  : 12;  //  HV Branch Maximum Negative 1bit = 1mA
    unsigned int HvVoltOutMax  : 8;  //  HV Branch max output voltage detected, 4V per bit.
    unsigned int HvRlyCount : 16;  //  Total number of time HV Branch Relay opened
    unsigned int MsgCntr : 4;  // 0->15
};

struct mHvdmExport2Stat1 {  // CANID = 0x00014400 = 82944
    unsigned int OpStat : 2;  // Operation Status: Stanby = 0, Active = 1, Pause = 2, Fault = 3
    unsigned int HvRlyStat : 2;  // Opened = 0, OpenPend = 1, PreCharge = 2, Closed = 3;
    signed int HvCurr : 12;  // 1 A per bit (-1024A -> 1024A)
    unsigned int HvVoltIn : 8;  // 4V per bit (0 -> 1018V)
    unsigned int HvVoltOut : 8;  // 4V per bit (0 -> 1018V)
    unsigned int Flt_HvCurrOOR : 1;  //  HV Current Measurement Out of Range Fault
    unsigned int Flt_HvCurrSnsr : 1;  // HV Current Sensor fault flag
    unsigned int Flt_HvVoltOOR : 1;  //  HV Voltage Measurement Out of Range Fault
    unsigned int Flt_HvRlyWeld : 1;  //  Relay stuck closed fault flag
    unsigned int Flt_HVCurrOvrld  : 1;  // HV Current Overload fault flag
    unsigned int Flt_HvPchrgShort : 1;  // HV precharge short circuit fault flag
    unsigned int Flt_HvPchrgOL : 1;  // HV precharge overload fault flag
    unsigned int Flt_HvFuse_MGA : 1;  // HV Fuse open fault flag
    unsigned int HVCurrOvrldStat : 2;  // Current overload status (Opened = 3, fuse range = 2, upper range = 1, lower range = 0)
    unsigned int MsgCntr : 4;  // 0->15
    unsigned int MsgCrc : 8;  // J1850 CRC
};

struct mHvdmExport1Stat2 {  // CANID = 0x00014200 = 82432
    signed int HvCurrPosMax  : 12;  //  HV Branch Maximum Positive 1bit = 1mA
    signed int HvCurrNegMax  : 12;  //  HV Branch Maximum Negative 1bit = 1mA
    unsigned int HvVoltOutMax  : 8;  //  HV Branch max output voltage detected, 4V per bit.
    unsigned int HvRlyCount : 16;  //  Total number of time HV Branch Relay opened
    unsigned int MsgCntr : 4;  // 0->15
};

struct mHvdmExport1Stat1 {  // CANID = 0x00014000 = 81920
    unsigned int OpStat : 2;  // Operation Status: Stanby = 0, Active = 1, Pause = 2, Fault = 3
    unsigned int HvRlyStat : 2;  // Opened = 0, OpenPend = 1, PreCharge = 2, Closed = 3;
    signed int HvCurr : 12;  // 1 A per bit (-1024A -> 1024A)
    unsigned int HvVoltIn : 8;  // 4V per bit (0 -> 1018V)
    unsigned int HvVoltOut : 8;  // 4V per bit (0 -> 1018V)
    unsigned int Flt_HvCurrOOR : 1;  //  HV Current Measurement Out of Range Fault
    unsigned int Flt_HvCurrSnsr : 1;  // HV Current Sensor fault flag
    unsigned int Flt_HvVoltOOR : 1;  //  HV Voltage Measurement Out of Range Fault
    unsigned int Flt_HvRlyWeld : 1;  //  Relay stuck closed fault flag
    unsigned int Flt_HVCurrOvrld  : 1;  // HV Current Overload fault flag
    unsigned int Flt_HvPchrgShort : 1;  // HV precharge short circuit fault flag
    unsigned int Flt_HvPchrgOL : 1;  // HV precharge overload fault flag
    unsigned int Flt_HvFuse_MGA : 1;  // HV Fuse open fault flag
    unsigned int HVCurrOvrldStat : 2;  // Current overload status (Opened = 3, fuse range = 2, upper range = 1, lower range = 0)
    unsigned int MsgCntr : 4;  // 0->15
    unsigned int MsgCrc : 8;  // J1850 CRC
};


#endif	/* TYPES_H */

