Files
H100PowerManger/src/bck/pPowerManger/upmsg/uDevice_secdistState.h
T
2026-01-19 21:52:26 +08:00

531 lines
25 KiB
C++

#ifndef UDEVICE_SECDISTSTATE_H
#define UDEVICE_SECDISTSTATE_H
#include <string>
#include <json/json.h>
#include "../driver.h"
#include "../logc/loguru.hpp"
#include <cstring>
class uDevice_secdistStateMsg
{
private:
/* data */
public:
uDevice_secdistStateMsg(){};
~uDevice_secdistStateMsg(){};
std::string key_fb = "uDevice_secdistState_st";
std::string key_cmd = "uPower_secdistState_cmd";
struct DeviceSecdistState
{
// UNIT1
u_int8_t bowCover1;
u_int8_t bowCover2;
u_int8_t bowCover3;
u_int8_t bowCover4;
u_int8_t bowCover5;
u_int8_t bowCover6;
u_int8_t singleBeamSonar1;
u_int8_t singleBeamSonar2;
u_int8_t singleBeamSonar3;
u_int8_t singleBeamSonar4;
u_int8_t singleBeamSonar5;
u_int8_t singleBeamSonar6;
u_int8_t forwardSonar;
u_int8_t depth3;
u_int8_t soundVeloc;
u_int8_t bowRudderServo;
u_int8_t bowRudderDeploy;
u_int8_t ctd1;
u_int8_t waterInject;
// UNIT2
u_int8_t sideSonar;
u_int8_t bowWaterInet1;
u_int8_t bowWaterInet2;
u_int8_t bowWaterInet3;
u_int8_t bowWaterInet4;
u_int8_t bowWaterInet5;
u_int8_t bowWaterInet6;
u_int8_t bowWaterInet7;
u_int8_t bowWaterInet8;
u_int8_t launchControler;
u_int8_t electSensor;
u_int8_t lowFreqSonar;
// UNIT3
u_int8_t buoyancyAdjust1;
u_int8_t buoyancyAdjust2;
u_int8_t buoyancyAdjust3;
u_int8_t USBL;
u_int8_t depth1;
u_int8_t commDev;
u_int8_t mastLiftingServo;
u_int8_t DVL;
u_int8_t ADCP;
u_int8_t inOutLetWater1;
u_int8_t inOutLetWater2;
// UNIT4
u_int8_t singleBeamSonar7;
u_int8_t singleBeamSonar8;
u_int8_t buoyage;
u_int8_t bowThrow;
u_int8_t depth2;
u_int8_t thruster;
u_int8_t dragSonar;
u_int8_t haulingMachine;
u_int8_t buoyancyAdjust4;
u_int8_t buoyancyAdjust5;
u_int8_t sternRudderServo1;
u_int8_t sternRudderServo2;
u_int8_t sternRudderServo3;
u_int8_t sternRudderServo4;
u_int8_t ctd2;
u_int8_t commDevStern;
u_int8_t inOutLetWater3;
// UNIT5
u_int8_t secINS;
u_int8_t photoSensor;
u_int8_t sternThrow;
u_int8_t mainINS;
} deviceSecdistState;
bool parseSecdistStateFromJson(DeviceSecdistState &state, const std::string &strJson){
Json::Value root;
Json::CharReaderBuilder readerBuilder;
std::unique_ptr<Json::CharReader> reader(readerBuilder.newCharReader());
std::string errors;
if(!reader->parse(strJson.c_str(), strJson.c_str() + strJson.length(), &root, &errors)){
LOG_F(ERROR, "Failed to parse JSON: %s", errors.c_str());
return false;
}
auto checkField = [&root](const std::string& field) -> bool {
if(!root.isMember(field) || !root[field].isUInt()) {
// std::cerr << "Missing or invalid field: " << field << std::endl;
// LOG_F(ERROR, "Missing or invalid field: %s", field.c_str());
return false;
}
return true;
};
bool ok = true;
// UNIT1
if(!checkField("bowCover1_uint8")) ok=false; state.bowCover1 = root["bowCover1_uint8"].asUInt();
if(!checkField("bowCover2_uint8")) ok=false; state.bowCover2 = root["bowCover2_uint8"].asUInt();
if(!checkField("bowCover3_uint8")) ok=false; state.bowCover3 = root["bowCover3_uint8"].asUInt();
if(!checkField("bowCover4_uint8")) ok=false; state.bowCover4 = root["bowCover4_uint8"].asUInt();
if(!checkField("bowCover5_uint8")) ok=false; state.bowCover5 = root["bowCover5_uint8"].asUInt();
if(!checkField("bowCover6_uint8")) ok=false; state.bowCover6 = root["bowCover6_uint8"].asUInt();
if(!checkField("singleBeamSonar1_uint8")) ok=false; state.singleBeamSonar1 = root["singleBeamSonar1_uint8"].asUInt();
if(!checkField("singleBeamSonar2_uint8")) ok=false; state.singleBeamSonar2 = root["singleBeamSonar2_uint8"].asUInt();
if(!checkField("singleBeamSonar3_uint8")) ok=false; state.singleBeamSonar3 = root["singleBeamSonar3_uint8"].asUInt();
if(!checkField("singleBeamSonar4_uint8")) ok=false; state.singleBeamSonar4 = root["singleBeamSonar4_uint8"].asUInt();
if(!checkField("singleBeamSonar5_uint8")) ok=false; state.singleBeamSonar5 = root["singleBeamSonar5_uint8"].asUInt();
if(!checkField("singleBeamSonar6_uint8")) ok=false; state.singleBeamSonar6 = root["singleBeamSonar6_uint8"].asUInt();
if(!checkField("forwardSonar_uint8")) ok=false; state.forwardSonar = root["forwardSonar_uint8"].asUInt();
if(!checkField("depth3_uint8")) ok=false; state.depth3 = root["depth3_uint8"].asUInt();
if(!checkField("soundVeloc_uint8")) ok=false; state.soundVeloc = root["soundVeloc_uint8"].asUInt();
if(!checkField("bowRudderServo_uint8")) ok=false; state.bowRudderServo = root["bowRudderServo_uint8"].asUInt();
if(!checkField("bowRudderDeploy_uint8")) ok=false; state.bowRudderDeploy = root["bowRudderDeploy_uint8"].asUInt();
if(!checkField("ctd1_uint8")) ok=false; state.ctd1 = root["ctd1_uint8"].asUInt();
if(!checkField("waterInject_uint8")) ok=false; state.waterInject = root["waterInject_uint8"].asUInt();
// UNIT2
if(!checkField("sideSonar_uint8")) ok=false; state.sideSonar = root["sideSonar_uint8"].asUInt();
if(!checkField("bowWaterInet1_uint8")) ok=false; state.bowWaterInet1 = root["bowWaterInet1_uint8"].asUInt();
if(!checkField("bowWaterInet2_uint8")) ok=false; state.bowWaterInet2 = root["bowWaterInet2_uint8"].asUInt();
if(!checkField("bowWaterInet3_uint8")) ok=false; state.bowWaterInet3 = root["bowWaterInet3_uint8"].asUInt();
if(!checkField("bowWaterInet4_uint8")) ok=false; state.bowWaterInet4 = root["bowWaterInet4_uint8"].asUInt();
if(!checkField("bowWaterInet5_uint8")) ok=false; state.bowWaterInet5 = root["bowWaterInet5_uint8"].asUInt();
if(!checkField("bowWaterInet6_uint8")) ok=false; state.bowWaterInet6 = root["bowWaterInet6_uint8"].asUInt();
if(!checkField("bowWaterInet7_uint8")) ok=false; state.bowWaterInet7 = root["bowWaterInet7_uint8"].asUInt();
if(!checkField("bowWaterInet8_uint8")) ok=false; state.bowWaterInet8 = root["bowWaterInet8_uint8"].asUInt();
if(!checkField("launchControler_uint8")) ok=false; state.launchControler = root["launchControler_uint8"].asUInt();
if(!checkField("electSensor_uint8")) ok=false; state.electSensor = root["electSensor_uint8"].asUInt();
if(!checkField("lowFreqSonar_uint8")) ok=false; state.lowFreqSonar = root["lowFreqSonar_uint8"].asUInt();
// UNIT3
if(!checkField("buoyancyAdjust1_uint8")) ok=false; state.buoyancyAdjust1 = root["buoyancyAdjust1_uint8"].asUInt();
if(!checkField("buoyancyAdjust2_uint8")) ok=false; state.buoyancyAdjust2 = root["buoyancyAdjust2_uint8"].asUInt();
if(!checkField("buoyancyAdjust3_uint8")) ok=false; state.buoyancyAdjust3 = root["buoyancyAdjust3_uint8"].asUInt();
if(!checkField("USBL_uint8")) ok=false; state.USBL = root["USBL_uint8"].asUInt();
if(!checkField("depth1_uint8")) ok=false; state.depth1 = root["depth1_uint8"].asUInt();
if(!checkField("commDev_uint8")) ok=false; state.commDev = root["commDev_uint8"].asUInt();
if(!checkField("mastLiftingServo_uint8")) ok=false; state.mastLiftingServo = root["mastLiftingServo_uint8"].asUInt();
if(!checkField("DVL_uint8")) ok=false; state.DVL = root["DVL_uint8"].asUInt();
if(!checkField("ADCP_uint8")) ok=false; state.ADCP = root["ADCP_uint8"].asUInt();
if(!checkField("inOutLetWater1_uint8")) ok=false; state.inOutLetWater1 = root["inOutLetWater1_uint8"].asUInt();
if(!checkField("inOutLetWater2_uint8")) ok=false; state.inOutLetWater2 = root["inOutLetWater2_uint8"].asUInt();
// UNIT4
if(!checkField("singleBeamSonar7_uint8")) ok=false; state.singleBeamSonar7 = root["singleBeamSonar7_uint8"].asUInt();
if(!checkField("singleBeamSonar8_uint8")) ok=false; state.singleBeamSonar8 = root["singleBeamSonar8_uint8"].asUInt();
if(!checkField("buoyage_uint8")) ok=false; state.buoyage = root["buoyage_uint8"].asUInt();
if(!checkField("bowThrow_uint8")) ok=false; state.bowThrow = root["bowThrow_uint8"].asUInt();
if(!checkField("depth2_uint8")) ok=false; state.depth2 = root["depth2_uint8"].asUInt();
if(!checkField("thruster_uint8")) ok=false; state.thruster = root["thruster_uint8"].asUInt();
if(!checkField("dragSonar_uint8")) ok=false; state.dragSonar = root["dragSonar_uint8"].asUInt();
if(!checkField("haulingMachine_uint8")) ok=false; state.haulingMachine = root["haulingMachine_uint8"].asUInt();
if(!checkField("buoyancyAdjust4_uint8")) ok=false; state.buoyancyAdjust4 = root["buoyancyAdjust4_uint8"].asUInt();
if(!checkField("buoyancyAdjust5_uint8")) ok=false; state.buoyancyAdjust5 = root["buoyancyAdjust5_uint8"].asUInt();
if(!checkField("sternRudderServo1_uint8")) ok=false; state.sternRudderServo1 = root["sternRudderServo1_uint8"].asUInt();
if(!checkField("sternRudderServo2_uint8")) ok=false; state.sternRudderServo2 = root["sternRudderServo2_uint8"].asUInt();
if(!checkField("sternRudderServo3_uint8")) ok=false; state.sternRudderServo3 = root["sternRudderServo3_uint8"].asUInt();
if(!checkField("sternRudderServo4_uint8")) ok=false; state.sternRudderServo4 = root["sternRudderServo4_uint8"].asUInt();
if(!checkField("ctd2_uint8")) ok=false; state.ctd2 = root["ctd2_uint8"].asUInt();
if(!checkField("commDevStern_uint8")) ok=false; state.commDevStern = root["commDevStern_uint8"].asUInt();
if(!checkField("inOutLetWater3_uint8")) ok=false; state.inOutLetWater3 = root["inOutLetWater3_uint8"].asUInt();
// UNIT5
if(!checkField("secINS_uint8")) ok=false; state.secINS = root["secINS_uint8"].asUInt();
if(!checkField("photoSensor_uint8")) ok=false; state.photoSensor = root["photoSensor_uint8"].asUInt();
if(!checkField("sternThrow_uint8")) ok=false; state.sternThrow = root["sternThrow_uint8"].asUInt();
if(!checkField("mainINS_uint8")) ok=false; state.mainINS = root["mainINS_uint8"].asUInt();
//不检查字段缺失
ok = true;
return ok;
};
std::string buildSecdistStateToJson(DeviceSecdistState &state){
Json::Value root;
// UNIT1
root["bowCover1_uint8"] = state.bowCover1;
root["bowCover2_uint8"] = state.bowCover2;
root["bowCover3_uint8"] = state.bowCover3;
root["bowCover4_uint8"] = state.bowCover4;
root["bowCover5_uint8"] = state.bowCover5;
root["bowCover6_uint8"] = state.bowCover6;
root["singleBeamSonar1_uint8"] = state.singleBeamSonar1;
root["singleBeamSonar2_uint8"] = state.singleBeamSonar2;
root["singleBeamSonar3_uint8"] = state.singleBeamSonar3;
root["singleBeamSonar4_uint8"] = state.singleBeamSonar4;
root["singleBeamSonar5_uint8"] = state.singleBeamSonar5;
root["singleBeamSonar6_uint8"] = state.singleBeamSonar6;
root["forwardSonar_uint8"] = state.forwardSonar;
root["depth3_uint8"] = state.depth3;
root["soundVeloc_uint8"] = state.soundVeloc;
root["bowRudderServo_uint8"] = state.bowRudderServo;
root["bowRudderDeploy_uint8"] = state.bowRudderDeploy;
root["ctd1_uint8"] = state.ctd1;
root["waterInject_uint8"] = state.waterInject;
// UNIT2
root["sideSonar_uint8"] = state.sideSonar;
root["bowWaterInet1_uint8"] = state.bowWaterInet1;
root["bowWaterInet2_uint8"] = state.bowWaterInet2;
root["bowWaterInet3_uint8"] = state.bowWaterInet3;
root["bowWaterInet4_uint8"] = state.bowWaterInet4;
root["bowWaterInet5_uint8"] = state.bowWaterInet5;
root["bowWaterInet6_uint8"] = state.bowWaterInet6;
root["bowWaterInet7_uint8"] = state.bowWaterInet7;
root["bowWaterInet8_uint8"] = state.bowWaterInet8;
root["launchControler_uint8"] = state.launchControler;
root["electSensor_uint8"] = state.electSensor;
root["lowFreqSonar_uint8"] = state.lowFreqSonar;
// UNIT3
root["buoyancyAdjust1_uint8"] = state.buoyancyAdjust1;
root["buoyancyAdjust2_uint8"] = state.buoyancyAdjust2;
root["buoyancyAdjust3_uint8"] = state.buoyancyAdjust3;
root["USBL_uint8"] = state.USBL;
root["depth1_uint8"] = state.depth1;
root["commDev_uint8"] = state.commDev;
root["mastLiftingServo_uint8"] = state.mastLiftingServo;
root["DVL_uint8"] = state.DVL;
root["ADCP_uint8"] = state.ADCP;
root["inOutLetWater1_uint8"] = state.inOutLetWater1;
root["inOutLetWater2_uint8"] = state.inOutLetWater2;
// UNIT4
root["singleBeamSonar7_uint8"] = state.singleBeamSonar7;
root["singleBeamSonar8_uint8"] = state.singleBeamSonar8;
root["buoyage_uint8"] = state.buoyage;
root["bowThrow_uint8"] = state.bowThrow;
root["depth2_uint8"] = state.depth2;
root["thruster_uint8"] = state.thruster;
root["dragSonar_uint8"] = state.dragSonar;
root["haulingMachine_uint8"] = state.haulingMachine;
root["buoyancyAdjust4_uint8"] = state.buoyancyAdjust4;
root["buoyancyAdjust5_uint8"] = state.buoyancyAdjust5;
root["sternRudderServo1_uint8"] = state.sternRudderServo1;
root["sternRudderServo2_uint8"] = state.sternRudderServo2;
root["sternRudderServo3_uint8"] = state.sternRudderServo3;
root["sternRudderServo4_uint8"] = state.sternRudderServo4;
root["ctd2_uint8"] = state.ctd2;
root["commDevStern_uint8"] = state.commDevStern;
root["inOutLetWater3_uint8"] = state.inOutLetWater3;
// UNIT5
root["secINS_uint8"] = state.secINS;
root["photoSensor_uint8"] = state.photoSensor;
root["sternThrow_uint8"] = state.sternThrow;
root["mainINS_uint8"] = state.mainINS;
Json::StreamWriterBuilder writerBuilder;
writerBuilder.settings_["indentation"] = ""; // 紧凑格式,无缩进
return Json::writeString(writerBuilder, root);
};
bool converFromDriverTable(DeviceSecdistState &state,const DriverTable &driver){
// UNIT1
state.bowCover1 = driver.bowCover1;
state.bowCover2 = driver.bowCover2;
state.bowCover3 = driver.bowCover3;
state.bowCover4 = driver.bowCover4;
state.bowCover5 = driver.bowCover5;
state.bowCover6 = driver.bowCover6;
state.singleBeamSonar1 = driver.singleBeamSonar1;
state.singleBeamSonar2 = driver.singleBeamSonar2;
state.singleBeamSonar3 = driver.singleBeamSonar3;
state.singleBeamSonar4 = driver.singleBeamSonar4;
state.singleBeamSonar5 = driver.singleBeamSonar5;
state.singleBeamSonar6 = driver.singleBeamSonar6;
state.forwardSonar = driver.forwardSonar;
state.depth3 = driver.depth3;
state.soundVeloc = driver.soundVeloc;
state.bowRudderServo = driver.bowRudderServo1;
state.bowRudderDeploy = driver.bowRudderDeploy;
state.ctd1 = driver.ctd1;
state.waterInject = driver.waterInject;
// UNIT2
state.sideSonar = driver.sideSonar;
state.bowWaterInet1 = driver.bowWaterInet1;
state.bowWaterInet2 = driver.bowWaterInet2;
state.bowWaterInet3 = driver.bowWaterInet3;
state.bowWaterInet4 = driver.bowWaterInet4;
state.bowWaterInet5 = driver.bowWaterInet5;
state.bowWaterInet6 = driver.bowWaterInet6;
state.bowWaterInet7 = driver.bowWaterInet7;
state.bowWaterInet8 = driver.bowWaterInet8;
state.launchControler = driver.launchControler;
state.electSensor = driver.electSensor;
state.lowFreqSonar = driver.lowFreqSonar;
// UNIT3
state.buoyancyAdjust1 = driver.buoyancyAdjust1;
state.buoyancyAdjust2 = driver.buoyancyAdjust2;
state.buoyancyAdjust3 = driver.buoyancyAdjust3;
state.USBL = driver.USBL;
state.depth1 = driver.depth1;
state.commDev = driver.commMast;
state.mastLiftingServo = driver.mastLiftingServo;
state.DVL = driver.DVL;
state.ADCP = driver.DVL; // Assuming ADCP is same as DVL
//出入水传感器1、2共用一个继电器
state.inOutLetWater1 = driver.inputWaterSensor1;
state.inOutLetWater2 = driver.inputWaterSensor1;
// state.inOutLetWater2 = driver.inputWaterSensor2;
// UNIT4
state.singleBeamSonar7 = driver.singleBeamSonar7;
state.singleBeamSonar8 = driver.singleBeamSonar8;
state.buoyage = driver.buoyage;
state.bowThrow = driver.bowThrow;
state.depth2 = driver.depth2;
state.thruster = driver.thruster;
state.haulingMachine = 2; // No corresponding field in DriverTable
state.buoyancyAdjust4 = driver.buoyancyAdjust4;
state.buoyancyAdjust5 = driver.buoyancyAdjust5;
state.sternRudderServo1 = driver.sternRudderServo1;
state.sternRudderServo2 = driver.sternRudderServo2;
state.sternRudderServo3 = driver.sternRudderServo3;
state.sternRudderServo4 = driver.sternRudderServo4;
state.ctd2 = driver.ctd2;
state.commDevStern = 2; // No corresponding field in DriverTable
state.inOutLetWater3 = driver.inputWaterSensor3;
// UNIT5
state.secINS = driver.ins;
state.photoSensor = driver.photoSensor;
state.sternThrow = driver.sternThrow;
state.mainINS = driver.ins;
// 未映射字段
// driver.overDeep1
// driver.overDeep2
// driver.ntp
state.dragSonar = 2; // Assuming dragSonar is same as lowFreqSonar
return true;
};
bool converToDriverTable(const DeviceSecdistState &state, DriverTable &driver){
// UNIT1
driver.bowCover1 = state.bowCover1;
driver.bowCover2 = state.bowCover2;
driver.bowCover3 = state.bowCover3;
driver.bowCover4 = state.bowCover4;
driver.bowCover5 = state.bowCover5;
driver.bowCover6 = state.bowCover6;
driver.singleBeamSonar1 = state.singleBeamSonar1;
driver.singleBeamSonar2 = state.singleBeamSonar2;
driver.singleBeamSonar3 = state.singleBeamSonar3;
driver.singleBeamSonar4 = state.singleBeamSonar4;
driver.singleBeamSonar5 = state.singleBeamSonar5;
driver.singleBeamSonar6 = state.singleBeamSonar6;
driver.forwardSonar = state.forwardSonar;
driver.depth3 = state.depth3;
driver.soundVeloc = state.soundVeloc;
driver.bowRudderServo1 = state.bowRudderServo;
driver.bowRudderServo2 = state.bowRudderServo;
driver.bowRudderDeploy = state.bowRudderDeploy;
driver.ctd1 = state.ctd1;
driver.waterInject = state.waterInject;
// UNIT2
driver.sideSonar = state.sideSonar;
driver.bowWaterInet1 = state.bowWaterInet1;
driver.bowWaterInet2 = state.bowWaterInet2;
driver.bowWaterInet3 = state.bowWaterInet3;
driver.bowWaterInet4 = state.bowWaterInet4;
driver.bowWaterInet5 = state.bowWaterInet5;
driver.bowWaterInet6 = state.bowWaterInet6;
driver.bowWaterInet7 = state.bowWaterInet7;
driver.bowWaterInet8 = state.bowWaterInet8;
driver.launchControler = state.launchControler;
driver.electSensor = state.electSensor;
driver.lowFreqSonar = state.lowFreqSonar;
// UNIT3
driver.buoyancyAdjust1 = state.buoyancyAdjust1;
driver.buoyancyAdjust2 = state.buoyancyAdjust2;
driver.buoyancyAdjust3 = state.buoyancyAdjust3;
driver.USBL = state.USBL;
driver.depth1 = state.depth1;
driver.commMast = state.commDev;
driver.ntp = 1;
driver.mastLiftingServo = state.mastLiftingServo;
driver.DVL = state.DVL;
driver.inputWaterSensor1 = state.inOutLetWater1;
driver.inputWaterSensor2 = state.inOutLetWater2;
driver.overDeep1 = (state.depth1 == 1) ? 1 : 0;
driver.overDeep2 = (state.depth2 == 1 || state.depth3 == 1) ? 1 : 0;
// UNIT4
driver.singleBeamSonar7 = state.singleBeamSonar7;
driver.singleBeamSonar8 = state.singleBeamSonar8;
driver.buoyage = state.buoyage;
driver.bowThrow = state.bowThrow;
driver.depth2 = state.depth2;
driver.thruster = state.thruster;
driver.buoyancyAdjust4 = state.buoyancyAdjust4;
driver.buoyancyAdjust5 = state.buoyancyAdjust5;
driver.sternRudderServo1 = state.sternRudderServo1;
driver.sternRudderServo2 = state.sternRudderServo2;
driver.sternRudderServo3 = state.sternRudderServo3;
driver.sternRudderServo4 = state.sternRudderServo4;
driver.ctd2 = state.ctd2;
driver.inputWaterSensor3 = state.inOutLetWater3;
// UNIT5
driver.ins = state.secINS | state.mainINS;
driver.photoSensor = state.photoSensor;
driver.sternThrow = state.sternThrow;
return true;
}
std::string buildMsg(DriverTable &driver){
DeviceSecdistState s;
converFromDriverTable(s,driver);
// std::cout << (int)s.depth1 << std::endl;
// std::cout << buildSecdistStateToJson(s) << std::endl;
return buildSecdistStateToJson(s);
};
bool parseMsg(const std::string &strJson,DriverTable &driver){
DeviceSecdistState s;
if(!parseSecdistStateFromJson(s,strJson)){
LOG_F(WARNING, "parseSecdistStateFromJson failed");
return false;
}
converToDriverTable(s,driver);
return true;
};
std::string buildMsg(DriverTable driver, DriverTable driver_state){
DeviceSecdistState s;
DriverTable driverCopy = driver;
for (size_t i = 0; i < sizeof(DriverTable); ++i) {
unsigned char* driverCopyPtr = reinterpret_cast<unsigned char*>(&driverCopy) + i;
unsigned char* statePtr = reinterpret_cast<unsigned char*>(&driver_state) + i;
if (*driverCopyPtr == *statePtr) {
*driverCopyPtr = 2;
}
}
converFromDriverTable(s, driverCopy);
// std::cout << (int)s.depth1 << std::endl;
// std::cout << buildSecdistStateToJson(s) << std::endl;
return buildSecdistStateToJson(s);
};
std::string buildMsg(DriverTable driver, DriverTable driver_state, unsigned int nCheck){
static size_t callCount = 0; // 静态变量,记录函数调用次数
DeviceSecdistState s;
DriverTable driverCopy = driver;
if (nCheck > 0 && callCount % nCheck == 0)
{
for (size_t i = 0; i < sizeof(DriverTable); ++i) {
unsigned char* driverCopyPtr = reinterpret_cast<unsigned char*>(&driverCopy) + i;
unsigned char* statePtr = reinterpret_cast<unsigned char*>(&driver_state) + i;
if (*driverCopyPtr == *statePtr) {
*driverCopyPtr = 2;
}
}
}
else {
memset(&driverCopy, 2, sizeof(DriverTable));
}
callCount ++;
converFromDriverTable(s, driverCopy);
// std::cout << (int)s.depth1 << std::endl;
// std::cout << buildSecdistStateToJson(s) << std::endl;
return buildSecdistStateToJson(s);
};
static DriverTable fault_state;
std::string buildMsg(DriverTable driver, DriverTable driver_state, DriverTable &driver_fault_state){
static size_t f_callCount = 0; // 静态变量,记录函数调用次数
unsigned int nCheck = 10;
DeviceSecdistState s;
DriverTable driverCopy = driver;
for (size_t i = 0; i < sizeof(DriverTable); ++i)
{
unsigned char* driverCopyPtr = reinterpret_cast<unsigned char*>(&driverCopy) + i;
unsigned char* statePtr = reinterpret_cast<unsigned char*>(&driver_state) + i;
unsigned char* faultStatePtr = reinterpret_cast<unsigned char*>(&driver_fault_state) + i;
unsigned char* faultState = reinterpret_cast<unsigned char*>(&fault_state) + i;
if (*driverCopyPtr == *statePtr)
{
*driverCopyPtr = 2;
*faultStatePtr = 0;
*faultState = 0;
}
else
{
*faultState = *faultState + 1;
if(*faultState >= 5)
{
//只有开启失败才计入故障
if(*driverCopyPtr == 1)
*faultStatePtr = 1;
*faultState = 5;
}
}
}
f_callCount ++;
converFromDriverTable(s, driverCopy);
return buildSecdistStateToJson(s);
};
};
#endif