forked from gary/BCU
2
0
Fork 0
BCU/app/stm32fxxx_app/protocol/protocol_mqtt_bcu.c

1056 lines
30 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/******************************************************************************
* @file protocol_mqtt_bcu.c
* @brief protocol_mqtt_bcu
* @version V1.0
* @author Gary
* @copyright
******************************************************************************/
#include "protocol_mqtt_bcu.h"
#include "iso_check.h"
#include "soc_calculate.h"
#include "sop_calculate.h"
#include "version_manager.h"
#include "dido_manager.h"
#include "fault_manager.h"
#include "flash_manager.h"
#include "comm_manager.h"
#include "hv_adc_manager.h"
#include "eeprom_manager.h"
#include "signal_manager.h"
#include "statistic_manager.h"
#include "bmu_manager.h"
#include "protocol_comm.h"
uint32_t bms_get_baseInfo(uint16_t input)
{
uint32_t tmp;
uint16_t bms_stu = 0;
if(bms_get_run_status() == kRunStatus_Init)
{
bms_stu = 0;
}
else if(bms_get_run_status() == kRunStatus_Standby)
{
bms_stu |= 0x1;
}
else if(bms_get_run_status() == kRunStatus_Chg)
{
bms_stu |= 0x2;
}
else if(bms_get_run_status() == kRunStatus_Dis)
{
bms_stu |= 0x3;
}
if(bms_get_signal(kSignalIdx_ForbidChg) == kSignalStatus_High)
{
bms_stu |= 0x10;
}
if(bms_get_signal(kSignalIdx_ForbidDis) == kSignalStatus_High)
{
bms_stu |= 0x20;
}
switch(input)
{
case 1:
tmp = bms_get_statistic_data(kStatisticData_TotalVolt);
return tmp;
case 2:
tmp = bms_get_show_current();
return tmp;
case 3:
tmp = bms_get_soc() / 100;
return tmp;
case 4:
tmp = bms_get_soh() / 100;
return tmp;
case 5:
tmp = bms_get_soc() / 100;
return tmp;
case 6:
tmp = get_eeprom_data(kEep_RatedTotalVolt,kEepromDataType_Full);
return tmp;
case 7:
tmp = get_eeprom_data(kEep_RatedCapacity,kEepromDataType_Full);
return tmp;
case 8:
tmp = (uint32_t)bms_get_soc()*get_eeprom_data(kEep_RatedCapacity, kEepromDataType_Full)/10000;
return tmp;
case 9:
tmp = get_eeprom_data(kEep_RatedCapacity, kEepromDataType_Full)*get_eeprom_data(kEep_RatedTotalVolt, kEepromDataType_Full)/10000;
return tmp;
case 10:
tmp = (uint32_t)bms_get_soc() * get_eeprom_data(kEep_RatedCapacity, kEepromDataType_Full)/10000*get_eeprom_data(kEep_RatedTotalVolt, kEepromDataType_Full)/10000;
return tmp;
case 11:
tmp = bms_get_bmu_num();
return tmp;
case 12:
tmp = bms_get_bmu_online_num();
return tmp;
case 13:
tmp = get_eeprom_data(kEep_CellNum, kEepromDataType_Full);
return tmp;
case 14:
tmp = bms_get_statistic_data(kStatisticData_OnlineCellNum);
return tmp;
case 15:
tmp = get_eeprom_data(kEep_TempNum, kEepromDataType_Full);
return tmp;
case 16:
tmp = bms_get_statistic_data(kStatisticData_OnlineTempNum);
return tmp;
case 17:
tmp = bms_get_sop_data(kSopData_DisCur);
return tmp;
case 18:
tmp = (uint32_t)bms_get_sop_data(kSopData_DisCur)*get_eeprom_data(kEep_RatedTotalVolt, kEepromDataType_Full)/10000;
return tmp;
case 19:
tmp = bms_get_sop_data(kSopData_ChgCur);
return tmp;
case 20:
tmp = (uint32_t)bms_get_sop_data(kSopData_ChgCur)*get_eeprom_data(kEep_RatedTotalVolt, kEepromDataType_Full)/10000;
return tmp;
case 21:
tmp = bms_get_iso_data(kIsoData_PosRes);
return tmp;
case 22:
tmp = bms_get_iso_data(kIsoData_NegRes);
return tmp;
case 23:
tmp = bms_get_statistic_data(kStatisticData_AvgVolt);
return tmp;
case 24:
tmp = bms_get_statistic_data(kStatisticData_VoltDiff);
return tmp;
case 25:
tmp = bms_get_statistic_data(kStatisticData_MaxVolt);
return tmp;
case 26:
tmp = bms_get_statistic_data(kStatisticData_MaxVoltBmuIdx) + 1;
return tmp;
case 27:
tmp = bms_get_statistic_data(kStatisticData_MaxVoltIdx) + 1;
return tmp;
case 28:
tmp = bms_get_statistic_data(kStatisticData_MinVolt);
return tmp;
case 29:
tmp = bms_get_statistic_data(kStatisticData_MinVoltBmuIdx) + 1;
return tmp;
case 30:
tmp = bms_get_statistic_data(kStatisticData_MinVoltIdx) + 1;
return tmp;
case 31:
tmp = bms_get_statistic_data(kStatisticData_AvgTemp);
return tmp;
case 32:
tmp = bms_get_statistic_data(kStatisticData_TempDiff);
return tmp;
case 33:
tmp = bms_get_statistic_data(kStatisticData_MaxTemp);
return tmp;
case 34:
tmp = bms_get_statistic_data(kStatisticData_MaxTempBmuIdx) + 1;
return tmp;
case 35:
tmp = bms_get_statistic_data(kStatisticData_MaxTempIdx) + 1;
return tmp;
case 36:
tmp = bms_get_statistic_data(kStatisticData_MinTemp);
return tmp;
case 37:
tmp = bms_get_statistic_data(kStatisticData_MinTempBmuIdx) + 1;
return tmp;
case 38:
tmp = bms_get_statistic_data(kStatisticData_MinTempIdx) + 1;
return tmp;
case 39:
tmp = (uint16_t)bms_get_cumulate_data(kCumulateData_DayChgCap);
return tmp;
case 40:
tmp = (uint16_t)bms_get_cumulate_data(kCumulateData_DayChgEnergy);
return tmp;
case 41:
tmp = (uint16_t)bms_get_cumulate_data(kCumulateData_DayDisCap);
return tmp;
case 42:
tmp = (uint16_t)bms_get_cumulate_data(kCumulateData_DayDisEnergy);
return tmp;
case 43:
tmp = (uint16_t)bms_get_cumulate_data(kCumulateData_DayChgTime);
return tmp;
case 44:
tmp = (uint16_t)bms_get_cumulate_data(kCumulateData_DayDisTime);
return tmp;
case 45:
tmp = bms_get_cumulate_data(kCumulateData_AccChgCap);
return tmp;
case 46:
tmp = bms_get_cumulate_data(kCumulateData_AccChgEnergy);
return tmp;
case 47:
tmp = bms_get_cumulate_data(kCumulateData_AccDisCap);
return tmp;
case 48:
tmp = bms_get_cumulate_data(kCumulateData_AccDisEnergy);
return tmp;
case 49:
tmp = bms_get_cumulate_data(kCumulateData_AccChgTime);
return tmp;
case 50:
tmp = bms_get_cumulate_data(kCumulateData_AccDisTime);
return tmp;
case 51:
tmp = bms_stu;
return tmp;
default:
return 0;
}
}
uint32_t bms_get_fault_level_1(uint16_t input)
{
uint32_t tmp = 0;
switch(input)
{
case 1:
if (KIT_GET_BIT_32(bms_get_fault_single_bit(0, kFaultLevel_First), 2)) //һ<><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѹ
{
tmp = 1;
}
else
{
tmp = 0;
}
return tmp;
case 2:
if (KIT_GET_BIT_32(bms_get_fault_single_bit(0, kFaultLevel_First), 3)) //һ<><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿѹ
{
tmp = 1;
}
else
{
tmp = 0;
}
return tmp;
case 3:
if (KIT_GET_BIT_32(bms_get_fault_single_bit(0, kFaultLevel_First), 4)) //һ<><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
tmp = 1;
}
else
{
tmp = 0;
}
return tmp;
case 4:
if (KIT_GET_BIT_32(bms_get_fault_single_bit(0, kFaultLevel_First), 5)) //һ<><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
tmp = 1;
}
else
{
tmp = 0;
}
return tmp;
case 5:
if (KIT_GET_BIT_32(bms_get_fault_single_bit(0, kFaultLevel_First), 6)) //һ<><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9>
{
tmp = 1;
}
else
{
tmp = 0;
}
return tmp;
case 6:
if (bms_get_run_status() == kRunStatus_Chg)
{
if (KIT_GET_BIT_32(bms_get_fault_single_bit(0, kFaultLevel_First), 8)) //һ<><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
tmp = 1;
}
else
{
tmp = 0;
}
}
return tmp;
case 7:
if (bms_get_run_status() == kRunStatus_Dis)
{
if (KIT_GET_BIT_32(bms_get_fault_single_bit(0, kFaultLevel_First), 8)) //һ<><D2BB><EFBFBD>ŵ<EFBFBD><C5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
tmp = 1;
}
else
{
tmp = 0;
}
}
return tmp;
case 8:
if (KIT_GET_BIT_32(bms_get_fault_single_bit(0, kFaultLevel_First), 14)) //һ<><D2BB>SOC<4F><43><EFBFBD><EFBFBD>
{
tmp = 1;
}
else
{
tmp = 0;
}
return tmp;
case 9:
tmp = 0; //һ<><D2BB>SOC<4F><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
return tmp;
case 10:
if (KIT_GET_BIT_32(bms_get_fault_single_bit(0, kFaultLevel_First), 15)) //һ<><D2BB><EFBFBD><EFBFBD>Ե<EFBFBD><D4B5><EFBFBD><EFBFBD>
{
tmp = 1;
}
else
{
tmp = 0;
}
return tmp;
case 11:
if (KIT_GET_BIT_32(bms_get_fault_single_bit(0, kFaultLevel_First), 0)) //һ<><D2BB><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9>ѹ--<2D><><EFBFBD>˹<EFBFBD>ѹ
{
tmp = 1;
}
else
{
tmp = 0;
}
return tmp;
case 12:
if (KIT_GET_BIT_32(bms_get_fault_single_bit(0, kFaultLevel_First), 1)) //һ<><D2BB><EFBFBD><EFBFBD>ѹǷѹ--<2D><><EFBFBD><EFBFBD>Ƿѹ
{
tmp = 1;
}
else
{
tmp = 0;
}
case 13:
if (KIT_GET_BIT_32(bms_get_fault_single_bit(1, kFaultLevel_First), 12)) //1<><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
tmp = 1;
}
else
{
tmp = 0;
}
return tmp;
case 14:
if (KIT_GET_BIT_32(bms_get_fault_single_bit(0, kFaultLevel_First), 9)) //<2F><>ѹ<EFBFBD>
{
tmp = 1;
}
else
{
tmp = 0;
}
return tmp;
case 15:
tmp = get_eeprom_data(kEep_TempNum, kEepromDataType_Full);
return tmp;
case 16:
tmp = bms_get_statistic_data(kStatisticData_OnlineTempNum);
break;
default:
return 0;
}
}
uint32_t bms_get_fault_level_2(uint16_t input)
{
uint32_t tmp = 0;
switch(input)
{
case 1:
if (KIT_GET_BIT_32(bms_get_fault_single_bit(0, kFaultLevel_Second), 2)) //2<><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѹ
{
tmp = 1;
}
else
{
tmp = 0;
}
return tmp;
case 2:
if (KIT_GET_BIT_32(bms_get_fault_single_bit(0, kFaultLevel_Second), 3)) //2<><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿѹ
{
tmp = 1;
}
else
{
tmp = 0;
}
return tmp;
case 3:
if (KIT_GET_BIT_32(bms_get_fault_single_bit(0, kFaultLevel_Second), 4)) //2<><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
tmp = 1;
}
else
{
tmp = 0;
}
return tmp;
case 4:
if (KIT_GET_BIT_32(bms_get_fault_single_bit(0, kFaultLevel_Second), 5)) //2<><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
tmp = 1;
}
else
{
tmp = 0;
}
return tmp;
case 5:
if (KIT_GET_BIT_32(bms_get_fault_single_bit(0, kFaultLevel_Second), 6)) //2<><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9>
{
tmp = 1;
}
else
{
tmp = 0;
}
return tmp;
case 6:
if (bms_get_run_status() == kRunStatus_Chg)
{
if (KIT_GET_BIT_32(bms_get_fault_single_bit(0, kFaultLevel_Second), 8)) //2<><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
tmp = 1;
}
else
{
tmp = 0;
}
}
return tmp;
case 7:
if (bms_get_run_status() == kRunStatus_Dis)
{
if (KIT_GET_BIT_32(bms_get_fault_single_bit(0, kFaultLevel_Second), 8)) //2<><32><EFBFBD>ŵ<EFBFBD><C5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
tmp = 1;
}
else
{
tmp = 0;
}
}
return tmp;
case 8:
if (KIT_GET_BIT_32(bms_get_fault_single_bit(0, kFaultLevel_Second), 14)) //2<><32>SOC<4F><43><EFBFBD><EFBFBD>
{
tmp = 1;
}
else
{
tmp = 0;
}
return tmp;
case 9:
tmp = 0; //һ<><D2BB>SOC<4F><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
return tmp;
case 10:
if (KIT_GET_BIT_32(bms_get_fault_single_bit(0, kFaultLevel_Second), 15)) //2<><32><EFBFBD><EFBFBD>Ե<EFBFBD><D4B5><EFBFBD><EFBFBD>
{
tmp = 1;
}
else
{
tmp = 0;
}
return tmp;
case 11:
if (KIT_GET_BIT_32(bms_get_fault_single_bit(0, kFaultLevel_Second), 0)) //2<><32><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9>ѹ--<2D><><EFBFBD>˹<EFBFBD>ѹ
{
tmp = 1;
}
else
{
tmp = 0;
}
return tmp;
case 12:
if (KIT_GET_BIT_32(bms_get_fault_single_bit(0, kFaultLevel_Second), 1)) //2<><32><EFBFBD><EFBFBD>ѹǷѹ--<2D><><EFBFBD><EFBFBD>Ƿѹ
{
tmp = 1;
}
else
{
tmp = 0;
}
case 13:
if (KIT_GET_BIT_32(bms_get_fault_single_bit(1, kFaultLevel_Second), 12)) //2<><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
tmp = 1;
}
else
{
tmp = 0;
}
return tmp;
case 14:
tmp = bms_get_statistic_data(kStatisticData_OnlineCellNum);
return tmp;
case 15:
tmp = get_eeprom_data(kEep_TempNum, kEepromDataType_Full);
return tmp;
case 16:
tmp = bms_get_statistic_data(kStatisticData_OnlineTempNum);
break;
default:
return 0;
}
}
uint32_t bms_get_fault_level_3(uint16_t input)
{
uint32_t tmp = 0;
switch(input)
{
case 1:
if (KIT_GET_BIT_32(bms_get_fault_single_bit(0, kFaultLevel_Third), 2)) //3<><33><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѹ
{
tmp = 1;
}
else
{
tmp = 0;
}
return tmp;
case 2:
if (KIT_GET_BIT_32(bms_get_fault_single_bit(0, kFaultLevel_Third), 3)) //3<><33><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿѹ
{
tmp = 1;
}
else
{
tmp = 0;
}
return tmp;
case 3:
if (KIT_GET_BIT_32(bms_get_fault_single_bit(0, kFaultLevel_Third), 4)) //3<><33><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
tmp = 1;
}
else
{
tmp = 0;
}
return tmp;
case 4:
if (KIT_GET_BIT_32(bms_get_fault_single_bit(0, kFaultLevel_Third), 5)) //3<><33><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
tmp = 1;
}
else
{
tmp = 0;
}
return tmp;
case 5:
if (KIT_GET_BIT_32(bms_get_fault_single_bit(0, kFaultLevel_Third), 6)) //3<><33><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9>
{
tmp = 1;
}
else
{
tmp = 0;
}
return tmp;
case 6:
if (bms_get_run_status() == kRunStatus_Chg)
{
if (KIT_GET_BIT_32(bms_get_fault_single_bit(0, kFaultLevel_Third), 8)) //3<><33><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
tmp = 1;
}
else
{
tmp = 0;
}
}
return tmp;
case 7:
if (bms_get_run_status() == kRunStatus_Dis)
{
if (KIT_GET_BIT_32(bms_get_fault_single_bit(0, kFaultLevel_Third), 8)) //3<><33><EFBFBD>ŵ<EFBFBD><C5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
tmp = 1;
}
else
{
tmp = 0;
}
}
return tmp;
case 8:
if (KIT_GET_BIT_32(bms_get_fault_single_bit(0, kFaultLevel_Third), 14)) //3<><33>SOC<4F><43><EFBFBD><EFBFBD>
{
tmp = 1;
}
else
{
tmp = 0;
}
return tmp;
case 9:
tmp = 0; //һ<><D2BB>SOC<4F><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
return tmp;
case 10:
if (KIT_GET_BIT_32(bms_get_fault_single_bit(0, kFaultLevel_Third), 15)) //3<><33><EFBFBD><EFBFBD>Ե<EFBFBD><D4B5><EFBFBD><EFBFBD>
{
tmp = 1;
}
else
{
tmp = 0;
}
return tmp;
case 11:
if (KIT_GET_BIT_32(bms_get_fault_single_bit(0, kFaultLevel_Third), 0)) //3<><33><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9>ѹ--<2D><><EFBFBD>˹<EFBFBD>ѹ
{
tmp = 1;
}
else
{
tmp = 0;
}
return tmp;
case 12:
if (KIT_GET_BIT_32(bms_get_fault_single_bit(0, kFaultLevel_Third), 1)) //3<><33><EFBFBD><EFBFBD>ѹǷѹ--<2D><><EFBFBD><EFBFBD>Ƿѹ
{
tmp = 1;
}
else
{
tmp = 0;
}
case 13:
if (KIT_GET_BIT_32(bms_get_fault_single_bit(1, kFaultLevel_Third), 12)) //3<><33><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
tmp = 1;
}
else
{
tmp = 0;
}
return tmp;
case 14:
if (KIT_GET_BIT_32(bms_get_fault_single_bit(1, kFaultLevel_Third), 0)) //<2F>̵<EFBFBD><CCB5><EFBFBD>ճ<EFBFBD><D5B3>
{
tmp = 1;
}
else
{
tmp = 0;
}
case 15:
if (KIT_GET_BIT_32(bms_get_fault_single_bit(2, kFaultLevel_Third), 9)) //<2F><><EFBFBD>޹<EFBFBD><DEB9><EFBFBD>
{
tmp = 1;
}
else
{
tmp = 0;
}
case 16:
if (KIT_GET_BIT_32(bms_get_fault_single_bit(1, kFaultLevel_Third), 1)) //Ԥ<><D4A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
tmp = 1;
}
else
{
tmp = 0;
}
case 17:
if (KIT_GET_BIT_32(bms_get_fault_single_bit(2, kFaultLevel_Third), 10)) //<2F><>·<EFBFBD><C2B7><EFBFBD><EFBFBD>
{
tmp = 1;
}
else
{
tmp = 0;
}
default:
return 0;
}
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EBB0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
const devPointMap bms_points[] = {
{"BCU_2", 0, 0, bms_get_total_alarm}, // <20>ܸ澯
{"BCU_3", 0, 0, bms_get_total_fault}, // <20>ܹ<EFBFBD><DCB9><EFBFBD>
{"BCU_4", 0, 1, bms_get_fault_level_1}, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѹ<EFBFBD>һ<E6BEAF><D2BB>
{"BCU_5", 0, 2, bms_get_fault_level_1}, // <20><><EFBFBD><EFBFBD>Ƿѹ<C7B7>һ<E6BEAF><D2BB>
{"BCU_6", 0, 3, bms_get_fault_level_1}, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¸һ<E6BEAF><D2BB>
{"BCU_7", 0, 4, bms_get_fault_level_1}, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¸һ<E6BEAF><D2BB>
{"BCU_8", 0, 5, bms_get_fault_level_1}, // <20><><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD>һ<E6BEAF><D2BB>
{"BCU_9", 0, 6, bms_get_fault_level_1}, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<E6BEAF><D2BB>
{"BCU_10", 0, 7, bms_get_fault_level_1}, // <20>ŵ<EFBFBD><C5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<E6BEAF><D2BB>
{"BCU_11", 0, 8, bms_get_fault_level_1}, // SOC<4F><43><EFBFBD>͸澯һ<E6BEAF><D2BB>
{"BCU_12", 0, 9, bms_get_fault_level_1}, // SOC<4F><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<E6BEAF><D2BB>
{"BCU_13", 0, 10, bms_get_fault_level_1}, // <20><>Ե<EFBFBD><D4B5><EFBFBD>͸澯һ<E6BEAF><D2BB>
{"BCU_14", 0, 1, bms_get_fault_level_2}, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѹ<EFBFBD><EFBFBD><E6BEAF><EFBFBD><EFBFBD>
{"BCU_15", 0, 2, bms_get_fault_level_2}, // <20><><EFBFBD><EFBFBD>Ƿѹ<C7B7><EFBFBD><E6BEAF><EFBFBD><EFBFBD>
{"BCU_16", 0, 3, bms_get_fault_level_2}, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¸<C2B8><E6BEAF><EFBFBD><EFBFBD>
{"BCU_17", 0, 4, bms_get_fault_level_2}, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¸<C2B8><E6BEAF><EFBFBD><EFBFBD>
{"BCU_18", 0, 5, bms_get_fault_level_2}, // <20><><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><E6BEAF><EFBFBD><EFBFBD>
{"BCU_19", 0, 6, bms_get_fault_level_2}, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E6BEAF><EFBFBD><EFBFBD>
{"BCU_20", 0, 7, bms_get_fault_level_2}, // <20>ŵ<EFBFBD><C5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E6BEAF><EFBFBD><EFBFBD>
{"BCU_21", 0, 8, bms_get_fault_level_2}, // SOC<4F><43><EFBFBD>͸澯<CDB8><E6BEAF><EFBFBD><EFBFBD>
{"BCU_22", 0, 9, bms_get_fault_level_2}, // SOC<4F><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E6BEAF><EFBFBD><EFBFBD>
{"BCU_23", 0, 10, bms_get_fault_level_2}, // <20><>Ե<EFBFBD><D4B5><EFBFBD>͸澯<CDB8><E6BEAF><EFBFBD><EFBFBD>
{"BCU_24", 0, 1, bms_get_fault_level_3}, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѹ<EFBFBD><EFBFBD><E6BEAF><EFBFBD><EFBFBD>
{"BCU_25", 0, 2, bms_get_fault_level_3}, // <20><><EFBFBD><EFBFBD>Ƿѹ<C7B7><EFBFBD><E6BEAF><EFBFBD><EFBFBD>
{"BCU_26", 0, 3, bms_get_fault_level_3}, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¸<C2B8><E6BEAF><EFBFBD><EFBFBD>
{"BCU_27", 0, 4, bms_get_fault_level_3}, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¸<C2B8><E6BEAF><EFBFBD><EFBFBD>
{"BCU_28", 0, 5, bms_get_fault_level_3}, // <20><><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><E6BEAF><EFBFBD><EFBFBD>
{"BCU_29", 0, 6, bms_get_fault_level_3}, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E6BEAF><EFBFBD><EFBFBD>
{"BCU_30", 0, 7, bms_get_fault_level_3}, // <20>ŵ<EFBFBD><C5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E6BEAF><EFBFBD><EFBFBD>
{"BCU_31", 0, 8, bms_get_fault_level_3}, // SOC<4F><43><EFBFBD>͸澯<CDB8><E6BEAF><EFBFBD><EFBFBD>
{"BCU_32", 0, 9, bms_get_fault_level_3}, // SOC<4F><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E6BEAF><EFBFBD><EFBFBD>
{"BCU_33", 0, 10, bms_get_fault_level_3}, // <20><>Ե<EFBFBD><D4B5><EFBFBD>͸澯<CDB8><E6BEAF><EFBFBD><EFBFBD>
{"BCU_34", 0, 0, NULL}, // <20><>о<EFBFBD>¶ȼ<C2B6><C8BC>޸澯
{"BCU_35", 0, 0, NULL}, // <20><>о<EFBFBD><D0BE>ѹ<EFBFBD><D1B9><EFBFBD>޸澯
{"BCU_36", 0, 0, NULL}, // <20>ؼ价<D8BC><E4BBB7>1<EFBFBD><31><EFBFBD>
{"BCU_37", 0, 0, NULL}, // <20>ؼ价<D8BC><E4BBB7>2<EFBFBD><32><EFBFBD>
{"BCU_38", 0, 0, NULL}, // <20>ؼ价<D8BC><E4BBB7>3<EFBFBD><33><EFBFBD>
{"BCU_39", 0, 0, NULL}, // <20>ؼ<EFBFBD><D8BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD>
{"BCU_40", 0, 0, NULL}, // <20>ؼ<EFBFBD><D8BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2<EFBFBD><32><EFBFBD>
{"BCU_41", 0, 0, NULL}, // <20>ؼ<EFBFBD><D8BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>3<EFBFBD><33><EFBFBD>
{"BCU_42", 1, 11, bms_get_fault_level_1}, // <20><><EFBFBD>˹<EFBFBD>ѹ1<D1B9><31><EFBFBD>
{"BCU_43", 1, 11, bms_get_fault_level_2}, // <20><><EFBFBD>˹<EFBFBD>ѹ2<D1B9><32><EFBFBD>
{"BCU_44", 1, 11, bms_get_fault_level_3}, // <20><><EFBFBD>˹<EFBFBD>ѹ3<D1B9><33><EFBFBD>
{"BCU_45", 1, 12, bms_get_fault_level_1}, // <20><><EFBFBD><EFBFBD>Ƿѹ1<D1B9><31><EFBFBD>
{"BCU_46", 1, 12, bms_get_fault_level_2}, // <20><><EFBFBD><EFBFBD>Ƿѹ2<D1B9><32><EFBFBD>
{"BCU_47", 1, 12, bms_get_fault_level_3}, // <20><><EFBFBD><EFBFBD>Ƿѹ3<D1B9><33><EFBFBD>
{"BCU_48", 1, 13, bms_get_fault_level_1}, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD>
{"BCU_49", 1, 13, bms_get_fault_level_2}, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2<EFBFBD><32><EFBFBD>
{"BCU_50", 1, 13, bms_get_fault_level_3}, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>3<EFBFBD><33><EFBFBD>
{"BCU_51", 1, 0, NULL}, // AFE<46>¸<EFBFBD><C2B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{"BCU_52", 1, 0, NULL}, // AFE<46><45>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD>
{"BCU_53", 1, 0, NULL}, // <20><><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>ͨ<EFBFBD>Ÿ澯
{"BCU_54", 1, 0, NULL}, // <20><><EFBFBD><EFBFBD>ͨѶ<CDA8>
{"BCU_55", 1, 14, bms_get_fault_level_3}, // <20>̵<EFBFBD><CCB5><EFBFBD>ճ<EFBFBD><D5B3><EFBFBD>
{"BCU_56", 1, 15, bms_get_fault_level_3}, // <20><><EFBFBD>ؼ<EFBFBD><D8BC>޹<EFBFBD><DEB9><EFBFBD>
{"BCU_57", 1, 0, NULL}, // <20><>˿<EFBFBD><CBBF><EFBFBD><EFBFBD>
{"BCU_58", 1, 0, NULL}, // <20><>·<EFBFBD><C2B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{"BCU_59", 1, 0, NULL}, // <20>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD>
{"BCU_60", 1, 0, NULL}, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E8B1B8><EFBFBD><EFBFBD>
{"BCU_61", 1, 0, NULL}, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{"BCU_62", 1, 0, NULL}, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{"BCU_63", 1, 0, NULL}, // AFE<46><45><EFBFBD><EFBFBD>
{"BCU_64", 1, 14, bms_get_fault_level_1}, // <20><>ѹ<EFBFBD>
{"BCU_65", 1, 16, bms_get_fault_level_3}, // Ԥ<><D4A4><EFBFBD>
{"BCU_66", 1, 17, bms_get_fault_level_3}, // <20><>·<EFBFBD><C2B7><EFBFBD><EFBFBD>
{"BCU_67", 1, 1, bms_get_baseInfo}, // <20><>ѹ
{"BCU_68", 1, 2, bms_get_baseInfo}, // <20>ܵ<EFBFBD><DCB5><EFBFBD>
{"BCU_69", 1, 3, bms_get_baseInfo}, // SOC
{"BCU_70", 1, 4, bms_get_baseInfo}, // SOH
{"BCU_71", 1, 5, bms_get_baseInfo}, // SOE
{"BCU_72", 1, 6, bms_get_baseInfo}, // <20><EFBFBD><EEB6A8>ѹ
{"BCU_73", 1, 7, bms_get_baseInfo}, // <20><EFBFBD><EEB6A8><EFBFBD><EFBFBD>
{"BCU_74", 1, 8, bms_get_baseInfo}, // ʣ<><CAA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{"BCU_75", 1, 9, bms_get_baseInfo}, // <20><EFBFBD><EEB6A8><EFBFBD><EFBFBD>
{"BCU_76", 1, 10, bms_get_baseInfo}, // ʣ<><CAA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{"BCU_77", 1, 11, bms_get_baseInfo}, // <20>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD><EFBFBD>(BMU)
{"BCU_78", 1, 12, bms_get_baseInfo}, // <20><><EFBFBD>ߴӻ<DFB4><D3BB><EFBFBD><EFBFBD><EFBFBD>(BMU)
{"BCU_79", 1, 13, bms_get_baseInfo}, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{"BCU_80", 1, 14, bms_get_baseInfo}, // <20><><EFBFBD>ߵ<EFBFBD><DFB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{"BCU_81", 1, 15, bms_get_baseInfo}, // <20>¸<EFBFBD><C2B8><EFBFBD><EFBFBD><EFBFBD>
{"BCU_82", 2, 16, bms_get_baseInfo}, // <20><><EFBFBD><EFBFBD><EFBFBD>¸<EFBFBD><C2B8><EFBFBD><EFBFBD><EFBFBD>
{"BCU_83", 2, 17, bms_get_baseInfo}, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ŵ<EFBFBD><C5B5><EFBFBD><EFBFBD><EFBFBD>
{"BCU_84", 2, 18, bms_get_baseInfo}, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ŵ繦<C5B5><E7B9A6>
{"BCU_85", 2, 19, bms_get_baseInfo}, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{"BCU_86", 2, 20, bms_get_baseInfo}, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E7B9A6>
{"BCU_87", 2, 21, bms_get_baseInfo}, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ե<EFBFBD><D4B5>ֵ
{"BCU_88", 2, 22, bms_get_baseInfo}, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ե<EFBFBD><D4B5>ֵ
{"BCU_89", 2, 23, bms_get_baseInfo}, // <20><><EFBFBD><EFBFBD>ƽ<EFBFBD><C6BD><EFBFBD><EFBFBD>ѹ
{"BCU_90", 2, 24, bms_get_baseInfo}, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9>
{"BCU_91", 2, 25, bms_get_baseInfo}, // <20><><EFBFBD>ߵ<EFBFBD><DFB5><EFBFBD><EFBFBD><EFBFBD>ѹ
{"BCU_92", 2, 26, bms_get_baseInfo}, // <20><><EFBFBD>ߵ<EFBFBD><DFB5><EFBFBD><EFBFBD><EFBFBD>ѹ<EFBFBD>ӻ<EFBFBD><D3BB><EFBFBD>
{"BCU_93", 2, 27, bms_get_baseInfo}, // <20><><EFBFBD>ߵ<EFBFBD><DFB5><EFBFBD><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD>
{"BCU_94", 2, 28, bms_get_baseInfo}, // <20><><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD><EFBFBD>ѹ
{"BCU_95", 2, 29, bms_get_baseInfo}, // <20><><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD><EFBFBD>ѹ<EFBFBD>ӻ<EFBFBD><D3BB><EFBFBD>
{"BCU_96", 2, 30, bms_get_baseInfo}, // <20><><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD>
{"BCU_97", 2, 31, bms_get_baseInfo}, // <20><><EFBFBD><EFBFBD>ƽ<EFBFBD><C6BD><EFBFBD><EFBFBD>
{"BCU_98", 2, 32, bms_get_baseInfo}, // <20><><EFBFBD><EFBFBD><EFBFBD>²<EFBFBD>
{"BCU_99", 2, 33, bms_get_baseInfo}, // <20><><EFBFBD>ߵ<EFBFBD><DFB5><EFBFBD><EFBFBD><EFBFBD>
{"BCU_100", 2, 34, bms_get_baseInfo}, // <20><><EFBFBD>ߵ<EFBFBD><DFB5><EFBFBD><EFBFBD>¶ȴӻ<C8B4><D3BB><EFBFBD>
{"BCU_101", 2, 35, bms_get_baseInfo}, // <20><><EFBFBD>ߵ<EFBFBD><DFB5><EFBFBD><EFBFBD>¶ȱ<C2B6><C8B1><EFBFBD>
{"BCU_102", 2, 36, bms_get_baseInfo}, // <20><><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD><EFBFBD>
{"BCU_103", 2, 37, bms_get_baseInfo}, // <20><><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD>¶ȴӻ<C8B4><D3BB><EFBFBD>
{"BCU_104", 2, 38, bms_get_baseInfo}, // <20><><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD>¶ȱ<C2B6><C8B1><EFBFBD>
{"BCU_105", 2, 39, bms_get_baseInfo}, // <20>ճ<EFBFBD><D5B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{"BCU_106", 2, 40, bms_get_baseInfo}, // <20>ճ<EFBFBD><D5B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{"BCU_107", 2, 41, bms_get_baseInfo}, // <20>շŵ<D5B7><C5B5><EFBFBD><EFBFBD><EFBFBD>
{"BCU_108", 2, 42, bms_get_baseInfo}, // <20>շŵ<D5B7><C5B5><EFBFBD><EFBFBD><EFBFBD>
{"BCU_109", 2, 43, bms_get_baseInfo}, // <20>ճ<EFBFBD><D5B3><EFBFBD>ʱ<EFBFBD><CAB1>
{"BCU_110", 2, 44, bms_get_baseInfo}, // <20>շŵ<D5B7>ʱ<EFBFBD><CAB1>
{"BCU_111", 2, 45, bms_get_baseInfo}, // <20>ۼƳ<DBBC><C6B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{"BCU_112", 2, 46, bms_get_baseInfo}, // <20>ۼƳ<DBBC><C6B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{"BCU_113", 2, 47, bms_get_baseInfo}, // <20>ۼƷŵ<C6B7><C5B5><EFBFBD><EFBFBD><EFBFBD>
{"BCU_114", 2, 48, bms_get_baseInfo}, // <20>ۼƷŵ<C6B7><C5B5><EFBFBD><EFBFBD><EFBFBD>
{"BCU_115", 2, 49, bms_get_baseInfo}, // <20>ۼƳ<DBBC><C6B3><EFBFBD>ʱ<EFBFBD><CAB1>
{"BCU_116", 2, 50, bms_get_baseInfo}, // <20>ۼƷŵ<C6B7>ʱ<EFBFBD><CAB1>
{"BCU_117", 2, 51, bms_get_baseInfo}, // BCU<43><55><EFBFBD><EFBFBD>״̬
};
const int bms_point_count = sizeof(bms_points) / sizeof(bms_points[0]);
/*
const char* key; // JSON <20>еļ<D0B5><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> "BCU_"<22><><EFBFBD><EFBFBD><E6B2BB><EFBFBD><EFBFBD><EFBFBD>֣<EFBFBD><D6A3><EFBFBD><EFBFBD>ݺ<EFBFBD><DDBA><EFBFBD>ͨ<EFBFBD><CDA8>BCU_pointId<49><64><EFBFBD><EFBFBD>
uint16_t pointId; // <20><><EFBFBD>ڼ<EFBFBD>¼<EFBFBD><C2BC>ʼ<EFBFBD>IJ<EFBFBD><C4B2><EFBFBD><EFBFBD>ţ<EFBFBD><C5A3><EFBFBD>bcuģ<75><C4A3>
uint16_t startCellIndex; // <20><>ʼ<EFBFBD>ĵ<EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD>ţ<EFBFBD><C5A3><EFBFBD><EFBFBD>Σ<EFBFBD>
uint16_t endCellIndex; // <20><><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD>ţ<EFBFBD><C5A3><EFBFBD><EFBFBD>Σ<EFBFBD>
uint32_t (*get_val)(uint16_t); // <20><>Ӧֵ<D3A6>Ļ<EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
*/
const devCellPointMap bms_volt_points[] =
{
{"BCU_", 191, 0, 39, bms_get_cell_volt}, // 1<><31>~40<34>ŵ<EFBFBD><C5B5>ص<EFBFBD>ѹ
{"BCU_", 191, 40, 79, bms_get_cell_volt}, // 41<34><31>~80<38>ŵ<EFBFBD><C5B5>ص<EFBFBD>ѹ
{"BCU_", 191, 80, 119, bms_get_cell_volt}, // 81<38><31>~120<32>ŵ<EFBFBD><C5B5>ص<EFBFBD>ѹ
{"BCU_", 191, 120, 159, bms_get_cell_volt}, // 121<32><31>~160<36>ŵ<EFBFBD><C5B5>ص<EFBFBD>ѹ
{"BCU_", 191, 160, 199, bms_get_cell_volt}, // 161<36><31>~200<30>ŵ<EFBFBD><C5B5>ص<EFBFBD>ѹ
{"BCU_", 191, 200, 239, bms_get_cell_volt}, // 201<30><31>~240<34>ŵ<EFBFBD><C5B5>ص<EFBFBD>ѹ
{"BCU_", 191, 240, 279, bms_get_cell_volt}, // 241<34><31>~280<38>ŵ<EFBFBD><C5B5>ص<EFBFBD>ѹ
{"BCU_", 191, 280, 319, bms_get_cell_volt}, // 281<38><31>~320<32>ŵ<EFBFBD><C5B5>ص<EFBFBD>ѹ
{"BCU_", 191, 320, 359, bms_get_cell_volt}, // 321<32><31>~360<36>ŵ<EFBFBD><C5B5>ص<EFBFBD>ѹ
{"BCU_", 191, 360, 399, bms_get_cell_volt}, // 361<36><31>~400<30>ŵ<EFBFBD><C5B5>ص<EFBFBD>ѹ
};
const devCellPointMap bms_temp_points[] =
{
{"BCU_", 611, 0, 39, bms_get_cell_temp}, // 1<><31>~40<34>ŵ<EFBFBD><C5B5><EFBFBD><EFBFBD><EFBFBD>
{"BCU_", 611, 40, 79, bms_get_cell_temp}, // 41<34><31>~80<38>ŵ<EFBFBD><C5B5><EFBFBD><EFBFBD><EFBFBD>
{"BCU_", 611, 80, 99, bms_get_cell_temp}, // 81<38><31>~100<30>ŵ<EFBFBD><C5B5><EFBFBD><EFBFBD><EFBFBD>
};
const int bms_volt_count = sizeof(bms_volt_points) / sizeof(devCellPointMap);
const int bms_temp_count = sizeof(bms_temp_points) / sizeof(devCellPointMap);
void protocol_build_json(uint16_t groupId)
{
int val = 0;
cJSON* root = cJSON_CreateObject();
cJSON_AddNumberToObject(root, "timeStamp", drv_rtc_get_tick());
// devData <20><><EFBFBD><EFBFBD>
cJSON* devDataArr = cJSON_CreateArray();
cJSON_AddItemToObject(root, "devData", devDataArr);
// <20><><EFBFBD><EFBFBD>ÿһ<C3BF><D2BB><EFBFBD><EFBFBD><E8B1B8>
cJSON* deviceObj = cJSON_CreateObject();
cJSON_AddItemToArray(devDataArr, deviceObj);
cJSON_AddStringToObject(deviceObj, "devType", "4");
cJSON_AddStringToObject(deviceObj, "devName", "BCU");
cJSON_AddStringToObject(deviceObj, "devId", "001");
cJSON_AddStringToObject(deviceObj, "sn", "SN123456");
// <20><><EFBFBD><EFBFBD> data <20><><EFBFBD><EFBFBD>
cJSON* dataObj = cJSON_CreateObject();
cJSON_AddItemToObject(deviceObj, "data", dataObj);
for (int i = 0; i < bms_point_count; ++i)
{
const devPointMap* point = &bms_points[i];
if(point->groupId == groupId)
{
if (bms_points[i].get_val != NULL)
{
val = point->get_val(point->input);
}
else
{
val = 0; // Ĭ<><C4AC>ֵ
}
}
cJSON_AddNumberToObject(dataObj, point->key, val);
}
// תΪ JSON <20>ַ<EFBFBD><D6B7><EFBFBD>
char* json_str = cJSON_PrintUnformatted(root);
if (json_str)
{
drv_mqtt_publish(json_str, strlen(json_str));
cJSON_free(json_str);
}
cJSON_Delete(root);
}
void protocol_build_volt_json(uint8_t i)
{
const devCellPointMap* item = &bms_volt_points[i];
int val = 0;
char key[10] = {0};
cJSON* root = cJSON_CreateObject();
cJSON_AddNumberToObject(root, "timeStamp", drv_rtc_get_tick());
// devData <20><><EFBFBD><EFBFBD>
cJSON* devDataArr = cJSON_CreateArray();
cJSON_AddItemToObject(root, "devData", devDataArr);
// <20><><EFBFBD><EFBFBD>ÿһ<C3BF><D2BB><EFBFBD><EFBFBD><E8B1B8>
cJSON* deviceObj = cJSON_CreateObject();
cJSON_AddItemToArray(devDataArr, deviceObj);
cJSON_AddStringToObject(deviceObj, "devType", "4");
cJSON_AddStringToObject(deviceObj, "devName", "BCU");
cJSON_AddStringToObject(deviceObj, "devId", "001");
cJSON_AddStringToObject(deviceObj, "sn", "SN123456");
// <20><><EFBFBD><EFBFBD> data <20><><EFBFBD><EFBFBD>
cJSON* dataObj = cJSON_CreateObject();
cJSON_AddItemToObject(deviceObj, "data", dataObj);
for (int i = item->startCellIndex; i <= item->endCellIndex; ++i)
{
sprintf(key,"%s%d",item->key,item->pointId + i);
if (item->get_val != NULL)
{
val = item->get_val(i);
}
else
{
val = 0; // Ĭ<><C4AC>ֵ
}
cJSON_AddNumberToObject(dataObj, key, val);
}
// תΪ JSON <20>ַ<EFBFBD><D6B7><EFBFBD>
char* json_str = cJSON_PrintUnformatted(root);
if (json_str)
{
drv_mqtt_publish(json_str, strlen(json_str));
cJSON_free(json_str);
}
cJSON_Delete(root);
}
void protocol_build_temp_json(uint8_t i)
{
const devCellPointMap* item = &bms_temp_points[i];
int val = 0;
char key[10] = {0};
cJSON* root = cJSON_CreateObject();
cJSON_AddNumberToObject(root, "timeStamp", drv_rtc_get_tick());
// devData <20><><EFBFBD><EFBFBD>
cJSON* devDataArr = cJSON_CreateArray();
cJSON_AddItemToObject(root, "devData", devDataArr);
// <20><><EFBFBD><EFBFBD>ÿһ<C3BF><D2BB><EFBFBD><EFBFBD><E8B1B8>
cJSON* deviceObj = cJSON_CreateObject();
cJSON_AddItemToArray(devDataArr, deviceObj);
cJSON_AddStringToObject(deviceObj, "devType", "4");
cJSON_AddStringToObject(deviceObj, "devName", "BCU");
cJSON_AddStringToObject(deviceObj, "devId", "001");
cJSON_AddStringToObject(deviceObj, "sn", "SN123456");
// <20><><EFBFBD><EFBFBD> data <20><><EFBFBD><EFBFBD>
cJSON* dataObj = cJSON_CreateObject();
cJSON_AddItemToObject(deviceObj, "data", dataObj);
for (int i = item->startCellIndex; i <= item->endCellIndex; ++i)
{
sprintf(key,"%s%d",item->key,item->pointId + i);
if (item->get_val != NULL)
{
val = item->get_val(i);
}
else
{
val = 0; // Ĭ<><C4AC>ֵ
}
cJSON_AddNumberToObject(dataObj, key, val);
}
// תΪ JSON <20>ַ<EFBFBD><D6B7><EFBFBD>
char* json_str = cJSON_PrintUnformatted(root);
if (json_str)
{
drv_mqtt_publish(json_str, strlen(json_str));
cJSON_free(json_str);
}
cJSON_Delete(root);
}
void publish_all_bms_groups(void)
{
uint8_t max_group = 0;
uint8_t i = 0;
for (i = 0; i < bms_point_count; i++)
{
if (bms_points[i].groupId > max_group)
{
max_group = bms_points[i].groupId;
}
}
for (uint8_t g = 0; g <= max_group; g++)
{
protocol_build_json(g);
}
for (i = 0; i < bms_volt_count; i++)
{
protocol_build_volt_json(i);
}
for (i = 0; i < bms_temp_count; i++)
{
protocol_build_temp_json(i);
}
}
void mqtt_publish_bms_data(uint32_t basetime)
{
static uint32_t mqtt_cycle_tick = 0;
static uint8_t groupMax = 0;
mqtt_cycle_tick += basetime;
if(mqtt_cycle_tick > 60000)
{
mqtt_cycle_tick = 0;
publish_all_bms_groups();
}
}