diff --git a/commands.cpp b/commands.cpp index d1c188d43..f495c0b9e 100755 --- a/commands.cpp +++ b/commands.cpp @@ -724,6 +724,9 @@ void Commands::processPacket(QByteArray data) val.wh_cnt_dis_total = vb.vbPopFrontDouble32Auto(); } + val.fault_code = vb.vbPopFrontUint8(); + val.op_state = vb.vbPopFrontUint8(); + val.updateTimeStamp(); emit bmsValuesRx(val); @@ -2672,6 +2675,63 @@ QString Commands::faultToStr(mc_fault_code fault) return "Unknown fault"; } +QString Commands::bmsFaultToStr(bms_fault_code fault) +{ + switch (fault) { + case BMS_FAULT_CODE_NONE: return "NONE"; + case BMS_FAULT_CODE_PACK_OVER_VOLTAGE: return "PACK_OVER_VOLTAGE"; + case BMS_FAULT_CODE_PACK_UNDER_VOLTAGE: return "PACK_UNDER_VOLTAGE"; + case BMS_FAULT_CODE_LOAD_OVER_VOLTAGE: return "LOAD_OVER_VOLTAGE"; + case BMS_FAULT_CODE_LOAD_UNDER_VOLTAGE: return "LOAD_UNDER_VOLTAGE"; + case BMS_FAULT_CODE_CHARGER_OVER_VOLTAGE: return "CHARGER_OVER_VOLTAGE"; + case BMS_FAULT_CODE_CHARGER_UNDER_VOLTAGE: return "CHARGER_UNDER_VOLTAGE"; + case BMS_FAULT_CODE_CELL_HARD_OVER_VOLTAGE: return "CELL_HARD_OVER_VOLTAGE"; + case BMS_FAULT_CODE_CELL_HARD_UNDER_VOLTAGE: return "CELL_HARD_UNDER_VOLTAGE"; + case BMS_FAULT_CODE_CELL_SOFT_OVER_VOLTAGE: return "CELL_SOFT_OVER_VOLTAGE"; + case BMS_FAULT_CODE_CELL_SOFT_UNDER_VOLTAGE: return "CELL_SOFT_UNDER_VOLTAGE"; + case BMS_FAULT_CODE_MAX_UVP_OVP_ERRORS: return "MAX_UVP_OVP_ERRORS"; + case BMS_FAULT_CODE_MAX_UVT_OVT_ERRORS: return "MAX_UVT_OVT_ERRORS"; + case BMS_FAULT_CODE_OVER_CURRENT: return "OVER_CURRENT"; + case BMS_FAULT_CODE_OVER_TEMP_BMS: return "OVER_TEMP_BMS"; + case BMS_FAULT_CODE_UNDER_TEMP_BMS: return "UNDER_TEMP_BMS"; + case BMS_FAULT_CODE_DISCHARGE_OVER_TEMP_CELLS: return "DISCHARGE_OVER_TEMP_CELLS"; + case BMS_FAULT_CODE_DISCHARGE_UNDER_TEMP_CELLS: return "DISCHARGE_UNDER_TEMP_CELLS"; + case BMS_FAULT_CODE_CHARGE_OVER_TEMP_CELLS: return "CHARGE_OVER_TEMP_CELLS"; + case BMS_FAULT_CODE_CHARGE_UNDER_TEMP_CELLS: return "CHARGE_UNDER_TEMP_CELLS"; + case BMS_FAULT_CODE_PRECHARGE_TIMEOUT: return "PRECHARGE_TIMEOUT"; + case BMS_FAULT_CODE_DISCHARGE_RETRY: return "DISCHARGE_RETRY"; + case BMS_FAULT_CODE_CHARGE_RETRY: return "CHARGE_RETRY"; + case BMS_FAULT_CODE_CAN_DELAYED_POWER_DOWN: return "CAN_DELAYED_POWER_DOWN"; + case BMS_FAULT_CODE_NOT_USED_TIMEOUT: return "NOT_USED_TIMEOUT"; + case BMS_FAULT_CODE_CHARGER_DISCONNECT: return "CHARGER_DISCONNECT"; + case BMS_FAULT_CODE_CHARGER_CURRENT_THRESHOLD_TIMEOUT: return "CHARGER_CURRENT_THRESHOLD_TIMEOUT"; + } + return "Unknown BMS fault"; + +} + +QString Commands::bmsOpStateToStr(bms_op_state opState) +{ + switch (opState) { + case BMS_OP_STATE_UNKNOWN: return "UNKNOWN"; + case BMS_OP_STATE_INIT: return "INIT"; + case BMS_OP_STATE_CHARGING: return "CHARGING"; + case BMS_OP_STATE_PRE_CHARGE: return "PRE_CHARGE"; + case BMS_OP_STATE_LOAD_ENABLED: return "LOAD_ENABLED"; + case BMS_OP_STATE_BATTERY_DEAD: return "BATTERY_DEAD"; + case BMS_OP_STATE_IDLE: return "IDLE"; + case BMS_OP_STATE_EXTERNAL: return "EXTERNAL"; + case BMS_OP_STATE_ERROR: return "ERROR"; + case BMS_OP_STATE_ERROR_PRECHARGE: return "ERROR_PRECHARGE"; + case BMS_OP_STATE_BALANCING: return "BALANCING"; + case BMS_OP_STATE_CHARGED: return "CHARGED"; + case BMS_OP_STATE_FORCEON: return "FORCEON"; + + } + return "Unknown fault"; + +} + QByteArray Commands::bmReadMemWait(uint32_t addr, quint16 size, int timeoutMs) { bmReadMem(addr, size); diff --git a/commands.h b/commands.h index e60ec7933..826dca8a6 100644 --- a/commands.h +++ b/commands.h @@ -57,6 +57,8 @@ class Commands : public QObject void setLimitedCompatibilityCommands(QVector compatibilityCommands); Q_INVOKABLE static QString faultToStr(mc_fault_code fault); + Q_INVOKABLE static QString bmsFaultToStr(bms_fault_code fault); + Q_INVOKABLE static QString bmsOpStateToStr(bms_op_state opState); Q_INVOKABLE QByteArray bmReadMemWait(uint32_t addr, quint16 size, int timeoutMs = 3000); Q_INVOKABLE int bmWriteMemWait(uint32_t addr, QByteArray data, int timeoutMs = 3000); diff --git a/datatypes.h b/datatypes.h index 4f2a3680c..c129efec4 100644 --- a/datatypes.h +++ b/datatypes.h @@ -121,6 +121,52 @@ typedef enum { FAULT_CODE_ENCODER_FAULT } mc_fault_code; +typedef enum { + BMS_FAULT_CODE_NONE = 0, + BMS_FAULT_CODE_PACK_OVER_VOLTAGE, + BMS_FAULT_CODE_PACK_UNDER_VOLTAGE, + BMS_FAULT_CODE_LOAD_OVER_VOLTAGE, + BMS_FAULT_CODE_LOAD_UNDER_VOLTAGE, + BMS_FAULT_CODE_CHARGER_OVER_VOLTAGE, + BMS_FAULT_CODE_CHARGER_UNDER_VOLTAGE, + BMS_FAULT_CODE_CELL_HARD_OVER_VOLTAGE, + BMS_FAULT_CODE_CELL_HARD_UNDER_VOLTAGE, + BMS_FAULT_CODE_CELL_SOFT_OVER_VOLTAGE, + BMS_FAULT_CODE_CELL_SOFT_UNDER_VOLTAGE, + BMS_FAULT_CODE_MAX_UVP_OVP_ERRORS, + BMS_FAULT_CODE_MAX_UVT_OVT_ERRORS, + BMS_FAULT_CODE_OVER_CURRENT, + BMS_FAULT_CODE_OVER_TEMP_BMS, + BMS_FAULT_CODE_UNDER_TEMP_BMS, + BMS_FAULT_CODE_DISCHARGE_OVER_TEMP_CELLS, + BMS_FAULT_CODE_DISCHARGE_UNDER_TEMP_CELLS, + BMS_FAULT_CODE_CHARGE_OVER_TEMP_CELLS, + BMS_FAULT_CODE_CHARGE_UNDER_TEMP_CELLS, + BMS_FAULT_CODE_PRECHARGE_TIMEOUT, + BMS_FAULT_CODE_DISCHARGE_RETRY, + BMS_FAULT_CODE_CHARGE_RETRY, + BMS_FAULT_CODE_CAN_DELAYED_POWER_DOWN, + BMS_FAULT_CODE_NOT_USED_TIMEOUT, + BMS_FAULT_CODE_CHARGER_DISCONNECT, + BMS_FAULT_CODE_CHARGER_CURRENT_THRESHOLD_TIMEOUT +} bms_fault_state; + +typedef enum { + BMS_OP_STATE_UNKNOWN = 0, + BMS_OP_STATE_INIT, // 1 + BMS_OP_STATE_CHARGING, // 2 + BMS_OP_STATE_PRE_CHARGE, // 3 + BMS_OP_STATE_LOAD_ENABLED, // 4 + BMS_OP_STATE_BATTERY_DEAD, // 5 + BMS_OP_STATE_IDLE, // 6 + BMS_OP_STATE_EXTERNAL, // 7 + BMS_OP_STATE_ERROR, // 8 + BMS_OP_STATE_ERROR_PRECHARGE, // 9 + BMS_OP_STATE_BALANCING, // 10 + BMS_OP_STATE_CHARGED, // 11 + BMS_OP_STATE_FORCEON, // 12 +} bms_op_state; + typedef enum { DISP_POS_MODE_NONE = 0, DISP_POS_MODE_INDUCTANCE, @@ -736,6 +782,8 @@ struct BMS_VALUES { Q_PROPERTY(double wh_cnt_chg_total MEMBER wh_cnt_chg_total) Q_PROPERTY(double ah_cnt_dis_total MEMBER ah_cnt_dis_total) Q_PROPERTY(double wh_cnt_dis_total MEMBER wh_cnt_dis_total) + Q_PROPERTY(int fault_code MEMBER fault_code) + Q_PROPERTY(int op_state MEMBER op_state) public: BMS_VALUES() { @@ -755,6 +803,8 @@ struct BMS_VALUES { wh_cnt_chg_total = 0.0; ah_cnt_dis_total = 0.0; wh_cnt_dis_total = 0.0; + fault_code = 0; + op_state = 0.0; updateTime = -1; } @@ -793,6 +843,8 @@ struct BMS_VALUES { double wh_cnt_chg_total; double ah_cnt_dis_total; double wh_cnt_dis_total; + int fault_code; + int op_state; qint64 updateTime; }; diff --git a/pages/pagebms.cpp b/pages/pagebms.cpp index e590337c5..abcc18627 100644 --- a/pages/pagebms.cpp +++ b/pages/pagebms.cpp @@ -131,6 +131,8 @@ void PageBms::bmsValuesRx(BMS_VALUES val) ui->valTable->item(13, 0)->setText(QString("%1 Wh").arg(val.wh_cnt_chg_total, 0, 'f', 3)); ui->valTable->item(14, 0)->setText(QString("%1 Ah").arg(val.ah_cnt_dis_total, 0, 'f', 3)); ui->valTable->item(15, 0)->setText(QString("%1 Wh").arg(val.wh_cnt_dis_total, 0, 'f', 3)); + ui->valTable->item(16, 0)->setText(Commands::bmsFaultToStr(bms_fault_code(val.fault_code))); + ui->valTable->item(17, 0)->setText(Commands::bmsOpStateToStr(bms_op_state(val.op_state))); } void PageBms::reloadCellBars(int cells) diff --git a/pages/pagebms.ui b/pages/pagebms.ui index fc9045050..f2fd05b8c 100644 --- a/pages/pagebms.ui +++ b/pages/pagebms.ui @@ -162,6 +162,16 @@ Wh Discharge Total + + + Fault Code + + + + + Operational State + + Value @@ -247,6 +257,16 @@ + + + + + + + + + +