From 481171d9ea2655a0d2bf6800b6ccc0a88994e9a9 Mon Sep 17 00:00:00 2001 From: zhaojingkui <1553836110@qq.com> Date: Fri, 12 Sep 2025 11:35:17 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BA=86xc=E5=A3=B0=E7=BA=B3?= =?UTF-8?q?=E7=9A=84=E4=B8=8A=E7=94=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vscode/settings.json | 3 +- CMakeLists.txt | 2 +- bin/pPowerManger.moos | 2 + data/msg/uPower_currentState_st.json | 48 +- data/msg/uPower_disSysState_st.json | 11 +- data/msg/uPower_equState_fb.json | 124 ++-- data/msg/uPower_fcsState_st.json | 2 +- data/msg/uPower_liBatState_st.json | 2 +- data/msg/uPower_secdistState_cmd.json | 66 +- .../uExternComm_setOpCondition_cmd.json | 2 +- download.sh | 2 + src/pPowerManger/CMakeLists.txt | 1 + src/pPowerManger/LowerCommManager.cpp | 34 +- src/pPowerManger/LowerCommManager.h | 3 + src/pPowerManger/PowerManger.cpp | 54 +- src/pPowerManger/PowerManger.h | 3 +- src/pPowerManger/UpperCommManager.cpp | 22 + src/pPowerManger/UpperCommManager.h | 3 +- src/pPowerManger/fsm/InitState.cpp | 1 + src/pPowerManger/fsm/Lifting.cpp | 90 +++ src/pPowerManger/fsm/PowerManagerFsm.cpp | 27 + src/pPowerManger/fsm/PowerManagerFsm.hpp | 13 + src/pPowerManger/fsm/ShoreBasedReady.cpp | 22 +- src/pPowerManger/fsm/StandbyState.cpp | 1 + src/pPowerManger/httpserver/data.h | 72 ++ src/pPowerManger/httpserver/httpserver.cpp | 24 + src/pPowerManger/httpserver/index.h | 46 +- src/pPowerManger/pPowerManger.moos | 2 + src/pPowerManger/pmSysvariable.h | 13 +- src/pPowerManger/sqlit3/SQLite.cpp | 54 +- src/pPowerManger/sqlit3/SQLite.h | 1 - src/pPowerManger/systemData.h | 33 +- .../upmsg/uDetect_xcVoltage_cmd.h | 63 ++ .../upmsg/uDetect_zdpVoltage_cmd.h | 58 ++ src/pPowerManger/upmsg/uDevice_thruster_st.h | 0 src/pPowerManger/upmsg/upmsg_definitions.cpp | 6 + test/CMakeLists.txt | 47 +- test/disSysTest/PowerManagerApp copy.py | 74 +- test/disSysTest/PowerManagerApp.py | 6 +- test/disSysTest/ccuMsg.py | 636 ++++++++++++++++++ test/disSysTest/ccuWin.py | 213 ++++++ test/until/compile_test.sh | 15 + test/until/testSqlitdb.cpp | 316 +++++++++ 43 files changed, 1921 insertions(+), 296 deletions(-) create mode 100755 download.sh create mode 100644 src/pPowerManger/fsm/Lifting.cpp create mode 100644 src/pPowerManger/upmsg/uDetect_xcVoltage_cmd.h create mode 100644 src/pPowerManger/upmsg/uDetect_zdpVoltage_cmd.h create mode 100644 src/pPowerManger/upmsg/uDevice_thruster_st.h create mode 100644 src/pPowerManger/upmsg/upmsg_definitions.cpp create mode 100644 test/disSysTest/ccuMsg.py create mode 100644 test/disSysTest/ccuWin.py create mode 100755 test/until/compile_test.sh create mode 100644 test/until/testSqlitdb.cpp diff --git a/.vscode/settings.json b/.vscode/settings.json index c60ca08..5e608f3 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -86,7 +86,8 @@ "stack": "cpp", "cstdbool": "cpp", "version": "cpp", - "unordered_set": "cpp" + "unordered_set": "cpp", + "ranges": "cpp" }, "C_Cpp.errorSquiggles": "disabled", "marscode.chatLanguage": "cn", diff --git a/CMakeLists.txt b/CMakeLists.txt index 7f7a91c..068914a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -103,4 +103,4 @@ ENDIF( ${WIN32} ) # Add Subdirectories #======================================================================= ADD_SUBDIRECTORY( src ) -# ADD_SUBDIRECTORY( test ) +ADD_SUBDIRECTORY( test ) diff --git a/bin/pPowerManger.moos b/bin/pPowerManger.moos index dbdbca8..afd3d78 100644 --- a/bin/pPowerManger.moos +++ b/bin/pPowerManger.moos @@ -4,4 +4,6 @@ ProcessConfig = pPowerManger { AppTick = 4 CommsTick = 4 + log_level = INFO + log_file = ./logfile.log } \ No newline at end of file diff --git a/data/msg/uPower_currentState_st.json b/data/msg/uPower_currentState_st.json index 41648bf..68d961a 100644 --- a/data/msg/uPower_currentState_st.json +++ b/data/msg/uPower_currentState_st.json @@ -1,47 +1 @@ -{ - "HVABFTDev123Cur_uint16": 0, - "HVABactCur_uint16": 0, - "HVABbowRudCur_uint16": 0, - "HVABbusBCur_uint16": 0, - "HVABbusBVol_uint16": 0, - "HVABmastSteGeaCur_uint16": 0, - "HVABopenWaterCur_uint16": 0, - "HVABxczCur_uint16": 0, - "HVBBCCUCur_uint16": 0, - "HVBBFCSSecurSysCur_uint16": 0, - "HVBBbatInsCur_uint16": 0, - "HVBBbowLowVolDisBoxCur_uint16": 0, - "HVBBdcC1InsCur_uint16": 0, - "HVBBemer2BusVol_uint16": 0, - "HVBBemerBatCur_uint16": 0, - "HVBBinsBusVol_uint16": 0, - "HVBBplcCur_uint16": 0, - "HVBBreservedCur1_uint16": 0, - "HVBBreservedCur2_uint16": 0, - "HVBBunit4Cur_uint16": 0, - "HVBFTDev45Cur_uint16": 0, - "HVBbatGroupCur_uint16": 0, - "HVBbowHVolDisBoxCur_uint16": 0, - "HVBbusACur_uint16": 0, - "HVBbusAVol_uint16": 0, - "HVBdcDc5Cur_uint16": 0, - "HVBfbCur_uint16": 0, - "HVBmotorCur_uint16": 0, - "HVBpowerBusCur_uint16": 0, - "HVBpowerBusVol_uint16": 0, - "HVBreservedCur1_uint16": 0, - "HVBreservedCur2_uint16": 0, - "HVBreservedCur3_uint16": 0, - "HVBsternRud1Cur_uint16": 0, - "HVBsternRud2Cur_uint16": 0, - "HVBtyzCur_uint16": 0, - "LVBBbowPZDevCur_uint16": 0, - "LVBBemerBatCur_uint16": 0, - "LVBBemerBusVol_uint16": 0, - "LVBBinsBusCur_uint16": 0, - "LVBBunit1Cur_uint16": 0, - "LVBBunit2Cur_uint16": 0, - "LVBBunit3Cur_uint16": 0, - "LVBBunit5Cur_uint16": 0, - "LVBinsBusVol_uint16": 0 -} \ No newline at end of file +{"uPower_currentState_st":{"HVABFTDev123Cur_uint16":0,"HVABactCur_uint16":0,"HVABbowRudCur_uint16":0,"HVABbusBCur_uint16":0,"HVABbusBVol_uint16":0,"HVABmastSteGeaCur_uint16":0,"HVABopenWaterCur_uint16":0,"HVABxczCur_uint16":0,"HVBBCCUCur_uint16":0,"HVBBFCSSecurSysCur_uint16":0,"HVBBbatInsCur_uint16":0,"HVBBbowLowVolDisBoxCur_uint16":0,"HVBBdcC1InsCur_uint16":0,"HVBBemer2BusVol_uint16":0,"HVBBemerBatCur_uint16":0,"HVBBinsBusVol_uint16":0,"HVBBplcCur_uint16":0,"HVBBreservedCur1_uint16":0,"HVBBreservedCur2_uint16":0,"HVBBunit4Cur_uint16":0,"HVBFTDev45Cur_uint16":0,"HVBbatGroupCur_uint16":0,"HVBbowHVolDisBoxCur_uint16":0,"HVBbusACur_uint16":0,"HVBbusAVol_uint16":0,"HVBdcDc5Cur_uint16":0,"HVBfbCur_uint16":0,"HVBmotorCur_uint16":0,"HVBpowerBusCur_uint16":0,"HVBpowerBusVol_uint16":0,"HVBreservedCur1_uint16":0,"HVBreservedCur2_uint16":0,"HVBreservedCur3_uint16":0,"HVBsternRud1Cur_uint16":0,"HVBsternRud2Cur_uint16":0,"HVBtyzCur_uint16":0,"LVBBbowPZDevCur_uint16":0,"LVBBemerBatCur_uint16":0,"LVBBemerBusVol_uint16":0,"LVBBinsBusCur_uint16":0,"LVBBunit1Cur_uint16":0,"LVBBunit2Cur_uint16":0,"LVBBunit3Cur_uint16":0,"LVBBunit5Cur_uint16":0,"LVBinsBusVol_uint16":0}} diff --git a/data/msg/uPower_disSysState_st.json b/data/msg/uPower_disSysState_st.json index ed8e1bf..62af903 100644 --- a/data/msg/uPower_disSysState_st.json +++ b/data/msg/uPower_disSysState_st.json @@ -1,10 +1 @@ -{ - "HVolABusBreaker_unit16": 0, - "HVolBBusBreaker_unit16": 0, - "HVolBusBreaker_uint16": 0, - "LVolBusBreaker_uint16": 0, - "faultCode_array": - [ - 0 - ] -} \ No newline at end of file +{"uPower_disSysState_st":{"HVolABusBreaker_uint16":0,"HVolBBusBreaker_uint16":0,"HVolBusBreaker_uint16":0,"LVolBusBreaker_uint16":0,"faultCode_array":[1,2,3,4,5,6,7,8,9,13,14,15,16,17,18,19,20,21,22,25,26,27,28,29,33,34,35,36,37,38,39,40,41,42,44,45]}} diff --git a/data/msg/uPower_equState_fb.json b/data/msg/uPower_equState_fb.json index c204907..6a2672e 100644 --- a/data/msg/uPower_equState_fb.json +++ b/data/msg/uPower_equState_fb.json @@ -1,65 +1,65 @@ {"uPower_equState_fb":{ - "DVL_uni8" : 0, - "USBL_uni8" : 0, - "bowCover1_uni8" : 0, - "bowCover2_uni8" : 0, - "bowCover3_uni8" : 0, - "bowCover4_uni8" : 0, - "bowCover5_uni8" : 0, - "bowCover6_uni8" : 0, - "bowRudderDeploy_uni8" : 0, - "bowRudderServo1_uni8" : 0, - "bowRudderServo2_uni8" : 0, - "bowThrow_uni8" : 0, - "bowWaterInet1_uni8" : 0, - "bowWaterInet2_uni8" : 0, - "bowWaterInet3_uni8" : 0, - "bowWaterInet4_uni8" : 0, - "bowWaterInet5_uni8" : 0, - "bowWaterInet6_uni8" : 0, - "bowWaterInet7_uni8" : 0, - "bowWaterInet8_uni8" : 0, - "buoyage_uni8" : 0, - "buoyancyAdjust1_uni8" : 0, - "buoyancyAdjust2_uni8" : 0, - "buoyancyAdjust3_uni8" : 0, - "buoyancyAdjust4_uni8" : 0, - "buoyancyAdjust5_uni8" : 0, - "commMast_uni8" : 0, - "ctd1_uni8" : 0, - "ctd2_uni8" : 0, - "depth1_uni8" : 0, - "depth2_uni8" : 0, - "depth3_uni8" : 0, - "electSensor_uni8" : 0, - "forwardSonar_uni8" : 0, - "inputWaterSensor1_uni8" : 0, - "inputWaterSensor2_uni8" : 0, - "inputWaterSensor3_uni8" : 0, - "ins_uni8" : 0, - "launchControler_uni8" : 0, - "lowFreqSonar_uni8" : 0, - "mastLiftingServo_uni8" : 0, - "ntp_uni8" : 0, - "overDeep1_uni8" : 0, - "overDeep2_uni8" : 0, - "photoSensor_uni8" : 0, - "sideSonar_uni8" : 0, - "singleBeamSonar1_uni8" : 0, - "singleBeamSonar2_uni8" : 0, - "singleBeamSonar3_uni8" : 0, - "singleBeamSonar4_uni8" : 0, - "singleBeamSonar5_uni8" : 0, - "singleBeamSonar6_uni8" : 0, - "singleBeamSonar7_uni8" : 0, - "singleBeamSonar8_uni8" : 0, - "soundVeloc_uni8" : 0, - "sternRudderServo1_uni8" : 0, - "sternRudderServo2_uni8" : 0, - "sternRudderServo3_uni8" : 0, - "sternRudderServo4_uni8" : 0, - "sternThrow_uni8" : 0, - "thruster_uni8" : 0, - "waterInject_uni8" : 0 + "DVL_uint8" : 0, + "USBL_uint8" : 0, + "bowCover1_uint8" : 0, + "bowCover2_uint8" : 0, + "bowCover3_uint8" : 0, + "bowCover4_uint8" : 0, + "bowCover5_uint8" : 0, + "bowCover6_uint8" : 0, + "bowRudderDeploy_uint8" : 0, + "bowRudderServo1_uint8" : 0, + "bowRudderServo2_uint8" : 0, + "bowThrow_uint8" : 0, + "bowWaterInet1_uint8" : 0, + "bowWaterInet2_uint8" : 0, + "bowWaterInet3_uint8" : 0, + "bowWaterInet4_uint8" : 0, + "bowWaterInet5_uint8" : 0, + "bowWaterInet6_uint8" : 0, + "bowWaterInet7_uint8" : 0, + "bowWaterInet8_uint8" : 0, + "buoyage_uint8" : 0, + "buoyancyAdjust1_uint8" : 0, + "buoyancyAdjust2_uint8" : 0, + "buoyancyAdjust3_uint8" : 0, + "buoyancyAdjust4_uint8" : 0, + "buoyancyAdjust5_uint8" : 0, + "commDev_uint8" : 0, + "ctd1_uint8" : 0, + "ctd2_uint8" : 0, + "depth1_uint8" : 0, + "depth2_uint8" : 0, + "depth3_uint8" : 0, + "electSensor_uint8" : 0, + "forwardSonar_uint8" : 0, + "inputWaterSensor1_uint8" : 0, + "inputWaterSensor2_uint8" : 0, + "inputWaterSensor3_uint8" : 0, + "ins_uint8" : 1, + "launchControler_uint8" : 0, + "lowFreqSonar_uint8" : 0, + "mastLiftingServo_uint8" : 0, + "ntp_uint8" : 1, + "overDeep1_uint8" : 0, + "overDeep2_uint8" : 0, + "photoSensor_uint8" : 0, + "sideSonar_uint8" : 0, + "singleBeamSonar1_uint8" : 0, + "singleBeamSonar2_uint8" : 0, + "singleBeamSonar3_uint8" : 0, + "singleBeamSonar4_uint8" : 0, + "singleBeamSonar5_uint8" : 0, + "singleBeamSonar6_uint8" : 0, + "singleBeamSonar7_uint8" : 0, + "singleBeamSonar8_uint8" : 0, + "soundVeloc_uint8" : 0, + "sternRudderServo1_uint8" : 0, + "sternRudderServo2_uint8" : 0, + "sternRudderServo3_uint8" : 0, + "sternRudderServo4_uint8" : 0, + "sternThrow_uint8" : 0, + "thruster_uint8" : 0, + "waterInject_uint8" : 0 } } diff --git a/data/msg/uPower_fcsState_st.json b/data/msg/uPower_fcsState_st.json index ec747fa..46bb393 100644 --- a/data/msg/uPower_fcsState_st.json +++ b/data/msg/uPower_fcsState_st.json @@ -1 +1 @@ -null \ No newline at end of file +{"uPower_fcsState_st":{"backpressure1_fp32":0.0,"backpressure2_fp32":0.0,"ch4oConcent1_fp32":0.0,"ch4oConcent2_fp32":0.0,"ch4o_fp32":0.0,"excTemp_fp32":0.0,"faultCode1_uint16":0,"faultCode2_uint16":0,"faultCode3_uint16":0,"faultCode4_uint16":0,"fcCommState_uint8":0,"fcuCurIns_fp32":0.0,"fcuCurPower_fp32":0.0,"fcuCur_fp32":0.0,"fcuFaultLeve_uint8":0,"fcuOutIns_fp32":0.0,"fcuOutPower_fp32":0.0,"fcuState_uint8":0,"fcuVolIns_fp32":0.0,"fcuVolPower_fp32":0.0,"fcuVol_fp32":0.0,"flameDet_uint8":0,"h2Concent1_fp32":0.0,"h2Concent2_fp32":0.0,"o2Concent1_fp32":0.0,"o2Concent2_fp32":0.0,"o2Level_fp32":0.0,"o2_fp32":0.0,"powLimit_fp32":0.0,"powerGen_fp32":0.0}} diff --git a/data/msg/uPower_liBatState_st.json b/data/msg/uPower_liBatState_st.json index ec747fa..3bd0d02 100644 --- a/data/msg/uPower_liBatState_st.json +++ b/data/msg/uPower_liBatState_st.json @@ -1 +1 @@ -null \ No newline at end of file +{"uPower_liBatState_st":{"insBatCurElect_uint16":0.0,"insBatLimit_uint16":0.0,"insBatSoc_uint8":0,"insBatTotalElect_uint16":0.0,"insChargeState_uint8":0,"insCommState_uint8":0,"insCurSocHold1_uint8":0,"insCurSocHold2_uint8":0,"insCurSocHold3_uint8":0,"insCurrent_uint16":0.0,"insFaultCode_uint8":0,"insLinkVol_uint16":0.0,"insNegRelayState_uint8":0,"insNegRes_uint16":0.0,"insPackVol_uint16":0.0,"insPosRelayState_uint8":0,"insPosRes_uint16":0.0,"powBatCurElect_uint16":0,"powBatSoc_uint8":0,"powBatTotalElect_uint16":0.0,"powChargeState_uint8":0,"powCommState_uint8":0,"powCurSocHold1_uint8":0,"powCurSocHold2_uint8":0,"powCurSocHold3_uint8":0,"powCurToInsLimit1_uint8":0.0,"powCurToInsLimit2_uint8":0.0,"powCur_uint16":0.0,"powFaultCode_uint8":0,"powLinkVol_uint16":0.0,"powNegRelayState_uint8":0,"powNegRes_uint16":0.0,"powPosRelayState_uint8":0,"powPosRes_uint16":0.0,"powerBatLimit_uint16":0,"powerPackVol_uint16":0.0}} diff --git a/data/msg/uPower_secdistState_cmd.json b/data/msg/uPower_secdistState_cmd.json index 9d0b439..712affc 100644 --- a/data/msg/uPower_secdistState_cmd.json +++ b/data/msg/uPower_secdistState_cmd.json @@ -1,65 +1 @@ -{"uPower_secdistState_cmd":{ - "DVL_uni8" : 0, - "USBL_uni8" : 0, - "bowCover1_uni8" : 0, - "bowCover2_uni8" : 0, - "bowCover3_uni8" : 0, - "bowCover4_uni8" : 0, - "bowCover5_uni8" : 0, - "bowCover6_uni8" : 0, - "bowRudderDeploy_uni8" : 0, - "bowRudderServo1_uni8" : 0, - "bowRudderServo2_uni8" : 0, - "bowThrow_uni8" : 0, - "bowWaterInet1_uni8" : 0, - "bowWaterInet2_uni8" : 0, - "bowWaterInet3_uni8" : 0, - "bowWaterInet4_uni8" : 0, - "bowWaterInet5_uni8" : 0, - "bowWaterInet6_uni8" : 0, - "bowWaterInet7_uni8" : 0, - "bowWaterInet8_uni8" : 0, - "buoyage_uni8" : 0, - "buoyancyAdjust1_uni8" : 0, - "buoyancyAdjust2_uni8" : 0, - "buoyancyAdjust3_uni8" : 0, - "buoyancyAdjust4_uni8" : 0, - "buoyancyAdjust5_uni8" : 0, - "commMast_uni8" : 1, - "ctd1_uni8" : 1, - "ctd2_uni8" : 1, - "depth1_uni8" : 1, - "depth2_uni8" : 1, - "depth3_uni8" : 1, - "electSensor_uni8" : 0, - "forwardSonar_uni8" : 0, - "inputWaterSensor1_uni8" : 1, - "inputWaterSensor2_uni8" : 1, - "inputWaterSensor3_uni8" : 1, - "ins_uni8" : 1, - "launchControler_uni8" : 0, - "lowFreqSonar_uni8" : 0, - "mastLiftingServo_uni8" : 0, - "ntp_uni8" : 1, - "overDeep1_uni8" : 1, - "overDeep2_uni8" : 1, - "photoSensor_uni8" : 0, - "sideSonar_uni8" : 0, - "singleBeamSonar1_uni8" : 0, - "singleBeamSonar2_uni8" : 1, - "singleBeamSonar3_uni8" : 0, - "singleBeamSonar4_uni8" : 0, - "singleBeamSonar5_uni8" : 0, - "singleBeamSonar6_uni8" : 0, - "singleBeamSonar7_uni8" : 0, - "singleBeamSonar8_uni8" : 0, - "soundVeloc_uni8" : 1, - "sternRudderServo1_uni8" : 0, - "sternRudderServo2_uni8" : 0, - "sternRudderServo3_uni8" : 0, - "sternRudderServo4_uni8" : 0, - "sternThrow_uni8" : 0, - "thruster_uni8" : 0, - "waterInject_uni8" : 0 -} -} +{"uPower_secdistState_cmd":{"ADCP_uint8":2,"DVL_uint8":2,"USBL_uint8":2,"bowCover1_uint8":2,"bowCover2_uint8":2,"bowCover3_uint8":2,"bowCover4_uint8":2,"bowCover5_uint8":2,"bowCover6_uint8":2,"bowRudderDeploy_uint8":2,"bowRudderServo_uint8":2,"bowThrow_uint8":2,"bowWaterInet1_uint8":2,"bowWaterInet2_uint8":2,"bowWaterInet3_uint8":2,"bowWaterInet4_uint8":2,"bowWaterInet5_uint8":2,"bowWaterInet6_uint8":2,"bowWaterInet7_uint8":2,"bowWaterInet8_uint8":2,"buoyage_uint8":2,"buoyancyAdjust1_uint8":2,"buoyancyAdjust2_uint8":2,"buoyancyAdjust3_uint8":2,"buoyancyAdjust4_uint8":2,"buoyancyAdjust5_uint8":2,"commDevStern_uint8":2,"commDev_uint8":1,"ctd1_uint8":1,"ctd2_uint8":1,"depth1_uint8":1,"depth2_uint8":1,"depth3_uint8":1,"dragSonar_uint8":2,"electSensor_uint8":2,"forwardSonar_uint8":2,"haulingMachine_uint8":2,"inOutLetWater1_uint8":1,"inOutLetWater2_uint8":1,"inOutLetWater3_uint8":1,"launchControler_uint8":2,"lowFreqSonar_uint8":2,"mainINS_uint8":1,"mastLiftingServo_uint8":2,"photoSensor_uint8":2,"secINS_uint8":1,"sideSonar_uint8":2,"singleBeamSonar1_uint8":2,"singleBeamSonar2_uint8":2,"singleBeamSonar3_uint8":2,"singleBeamSonar4_uint8":2,"singleBeamSonar5_uint8":2,"singleBeamSonar6_uint8":2,"singleBeamSonar7_uint8":2,"singleBeamSonar8_uint8":2,"soundVeloc_uint8":1,"sternRudderServo1_uint8":2,"sternRudderServo2_uint8":2,"sternRudderServo3_uint8":2,"sternRudderServo4_uint8":2,"sternThrow_uint8":2,"thruster_uint8":2,"waterInject_uint8":2}} diff --git a/data/testmsg/uExternComm_setOpCondition_cmd.json b/data/testmsg/uExternComm_setOpCondition_cmd.json index 6c4e59c..5f5ea7a 100644 --- a/data/testmsg/uExternComm_setOpCondition_cmd.json +++ b/data/testmsg/uExternComm_setOpCondition_cmd.json @@ -1,3 +1,3 @@ { - "state_uint8" : 1 + "state_uint8" : 12 } \ No newline at end of file diff --git a/download.sh b/download.sh new file mode 100755 index 0000000..b2c89dc --- /dev/null +++ b/download.sh @@ -0,0 +1,2 @@ +scp root@192.168.0.223:/root/work/moos_ws/moos-ivp-extend/missions/union_test/power_data.db ./data/power_data.db +scp root@192.168.0.223:/root/work/moos_ws/moos-ivp-extend/missions/union_test/pPowerManger.log ./data/pPowerManger.log diff --git a/src/pPowerManger/CMakeLists.txt b/src/pPowerManger/CMakeLists.txt index 9c9bf37..7645c5e 100644 --- a/src/pPowerManger/CMakeLists.txt +++ b/src/pPowerManger/CMakeLists.txt @@ -63,6 +63,7 @@ SET(SRC LowerCommManager.cpp UpperCommManager.cpp # loguru.cpp + upmsg/upmsg_definitions.cpp ) ADD_EXECUTABLE(pPowerManger ${SRC}) diff --git a/src/pPowerManger/LowerCommManager.cpp b/src/pPowerManger/LowerCommManager.cpp index 4d289cc..0a3d8d9 100644 --- a/src/pPowerManger/LowerCommManager.cpp +++ b/src/pPowerManger/LowerCommManager.cpp @@ -77,17 +77,37 @@ bool LowerCommManager::initUdpComm(){ } void LowerCommManager::processPeriodicTasks() { sendCcuCommand(m_pm->m_CcuColCmd); - // cout << "send ccu command" << endl; + m_pm->m_db->insertData(m_pm->m_CcuColCmd); //延时5ms usleep(5000); - // sendDisSysCommand(m_pm->m_targetDisBreakerState); - // if(m_pm->m_systemData->device_common_status.dis_hv_c1.isTimeout) - // { - - // } + if(m_pm->m_systemData->device_common_status.dis_hv_c1.isTimeout ) + { + disHighVolBusCmd clr1{}; + m_udpComm->sendDisSysCmd(clr1); + MOOSPause(200); + } + if(m_pm->m_systemData->device_common_status.dis_lv_c1.isTimeout ) + { + disHighBVolBusCmd clr3{}; + m_udpComm->sendDisSysCmd(clr3); + MOOSPause(200); + } m_udpComm->clearMsgQueue(); } - +void LowerCommManager::operate_hold() +{ + disHighVolBusCmd clr1{}; + disHighAVolBusCmd clr2{}; + disHighBVolBusCmd clr3{}; + disLowBusCmd clr4{}; + m_udpComm->sendDisSysCmd(clr1); + MOOSPause(200); + m_udpComm->sendDisSysCmd(clr2); + MOOSPause(200); + m_udpComm->sendDisSysCmd(clr3); + MOOSPause(200); + m_udpComm->sendDisSysCmd(clr4); +} bool LowerCommManager::sendCcuCommand(const ccuColCmd cmd){ // m_pm->m_db->insertCcuSysCmd(cmd); if(!m_udpComm->sendCcuColCmd(cmd)) diff --git a/src/pPowerManger/LowerCommManager.h b/src/pPowerManger/LowerCommManager.h index ebf5f9c..646dff4 100644 --- a/src/pPowerManger/LowerCommManager.h +++ b/src/pPowerManger/LowerCommManager.h @@ -80,6 +80,9 @@ public: bool operate_LVA_reservedCircuit1_Breaker(char opt); bool operate_LVA_reservedCircuit2_Breaker(char opt); bool operate_LVA_mergencyLithiumBatteryGroup1Circuit_Breaker(char opt); + + //保持指令 + void operate_hold(); //================================复合管控器操作函数==================================== // 发送CCU控制命令 bool sendCcuCommand(const ccuColCmd cmd); diff --git a/src/pPowerManger/PowerManger.cpp b/src/pPowerManger/PowerManger.cpp index f59a60b..e6816ae 100644 --- a/src/pPowerManger/PowerManger.cpp +++ b/src/pPowerManger/PowerManger.cpp @@ -21,6 +21,12 @@ bool _FsmCB(void * pParam) return pMe->FsmLoop(); } +bool _CommCB(void * pParam) +{ + PowerManger* pMe = (PowerManger* )pParam; + return pMe->commLoop(); +} + //--------------------------------------------------------- // Constructor() @@ -78,6 +84,7 @@ PowerManger::PowerManger() PowerManger::~PowerManger() { + m_commThread.Stop(); delete m_db; delete m_lowerCommManager; delete m_upperCommManager; @@ -154,12 +161,12 @@ bool PowerManger::Iterate() // 更新系统数据 m_systemData->updateCommonStatus(); // m_CcuColCmd.heartbeat - if (m_ticker++ % 5 == 0) - { - m_CcuColCmd.heartbeat++; - m_lowerCommManager->processPeriodicTasks(); - m_upperCommManager->processPeriodicTasks(); - } + // if (m_ticker++ % 5 == 0) + // { + // m_CcuColCmd.heartbeat++; + // m_lowerCommManager->processPeriodicTasks(); + // m_upperCommManager->processPeriodicTasks(); + // } return(true); } @@ -203,6 +210,10 @@ bool PowerManger::OnStartUp() PowerManagerFsm::start(); InitEvent initEvent; PowerManagerFsm::dispatch(initEvent); + + //初始化通信线程 + m_commThread.Initialise(_CommCB,this); + m_commThread.Start(); return(true); } @@ -224,6 +235,9 @@ void PowerManger::registerVariables() Register(DB_TO_PM_SETPMSYS,0); Register(DB_TO_PM_SETDEVSWITCH,0); Register(DB_TO_PM_TASKSTOP,0); + + Register(uDetect_xcVoltage_cmd::key,0); + Register(uDetect_zdpVoltage_cmd::key,0); } @@ -249,20 +263,6 @@ bool PowerManger::buildReport() bool PowerManger::FsmLoop() { - //状态机循环 - // while (!m_FsmThread.IsQuitRequested()) - // { - // // // 检查故障并触发事件 - // // if(int error = checkError()) { - // // m_fsm.triggerFaultEvent(error); - // // } else { - // // // 自动状态转换由状态机内部处理 - // // MOOSPause(1000); - // // } - - // //延时1s - // usleep(1000000); - // } return true; } @@ -278,7 +278,6 @@ int PowerManger::checkError() // m_pmCurrentState.ccustate.fcuGZ_3L != 0 || // m_pmCurrentState.ccustate.insEmergencyStatusWord != 0) return 0; - //2.检查断路器状态 } void PowerManger::printState(const std::string& stateName, const std::string& desp){ @@ -360,6 +359,19 @@ unsigned char PowerManger::getFaultLevel() return maxLevel; } +bool PowerManger::commLoop() +{ + while(!m_commThread.IsQuitRequested()) + { + m_CcuColCmd.heartbeat++; + m_lowerCommManager->processPeriodicTasks(); + m_upperCommManager->processPeriodicTasks(); + // 延时1秒 + usleep(1000000); + } + return true; +} + void PowerManger::injectFault(unsigned type,unsigned int faultCode){ LOG_F(INFO, "注入故障: %d %d", type, faultCode); TestEvent testEvent("故障注入测试",type,faultCode); diff --git a/src/pPowerManger/PowerManger.h b/src/pPowerManger/PowerManger.h index 51059b3..29a0918 100644 --- a/src/pPowerManger/PowerManger.h +++ b/src/pPowerManger/PowerManger.h @@ -124,7 +124,7 @@ class PowerManger : public AppCastingMOOSApp void initControlCmd(); public: - // CMOOSThread m_FsmThread; + CMOOSThread m_commThread; LowerCommManager* m_lowerCommManager; UpperCommManager* m_upperCommManager; @@ -136,6 +136,7 @@ class PowerManger : public AppCastingMOOSApp bool FSM_RUN_IS_OK = true; //================================================================================== + bool commLoop(); int checkError(); bool sendNotification(const std::string& key, const std::string& value) { diff --git a/src/pPowerManger/UpperCommManager.cpp b/src/pPowerManger/UpperCommManager.cpp index 38e7e4f..ce90039 100644 --- a/src/pPowerManger/UpperCommManager.cpp +++ b/src/pPowerManger/UpperCommManager.cpp @@ -153,6 +153,28 @@ bool UpperCommManager::processUpperMsg(const string& key, const string& strJson) LOG_F(WARNING, "task stop error:%s", strJson.c_str()); return false; } + } + else if(key == uDetect_xcVoltage_cmd::key) + { + uDetect_xcVoltage_cmd xcCmd; + xcCmd.fromJsonString(strJson); + SideSonarCmd sideSonarCmd; + sideSonarCmd.xcHighVoltageAdd = xcCmd.xcHighVoltageAdd_int32; + sideSonarCmd.xcLowVoltageAdd = xcCmd.xcLowVoltageAdd_int32; + PowerManagerFsm::dispatch(sideSonarCmd); + return true; + } + else if(key == uDetect_zdpVoltage_cmd::key) + { + uDetect_zdpVoltage_cmd zdpCmd; + zdpCmd.fromJsonString(strJson); + + DevCmdExt devCmdExt; + devCmdExt.id = DeviceId::lowFreqSonar; + devCmdExt.cmd = zdpCmd.zdpVoltageAdd_int32; + PowerManagerFsm::dispatch(devCmdExt); + LOG_F(INFO, "set dev switch success"); + return true; }; LOG_F(WARNING, "Unknown key: %s", key.c_str()); return false; diff --git a/src/pPowerManger/UpperCommManager.h b/src/pPowerManger/UpperCommManager.h index 0d49614..7981035 100644 --- a/src/pPowerManger/UpperCommManager.h +++ b/src/pPowerManger/UpperCommManager.h @@ -25,7 +25,8 @@ #include "upmsg/uExternComm_setPowerSystem.h" #include "upmsg/uPower_equState.h" #include "upmsg/uPower_sysState.h" - +#include "upmsg/uDetect_zdpVoltage_cmd.h" +#include "upmsg/uDetect_xcVoltage_cmd.h" #define _DEBUG using namespace std; diff --git a/src/pPowerManger/fsm/InitState.cpp b/src/pPowerManger/fsm/InitState.cpp index 09f74d8..5cdd3ac 100644 --- a/src/pPowerManger/fsm/InitState.cpp +++ b/src/pPowerManger/fsm/InitState.cpp @@ -5,5 +5,6 @@ void InitState::entry() { PowerManagerFsm::entry(); LOG_F(INFO, "进入初始化状态"); pm->initControlCmd(); + pm->m_lowerCommManager->operate_hold(); transit(); } \ No newline at end of file diff --git a/src/pPowerManger/fsm/Lifting.cpp b/src/pPowerManger/fsm/Lifting.cpp new file mode 100644 index 0000000..709a4f0 --- /dev/null +++ b/src/pPowerManger/fsm/Lifting.cpp @@ -0,0 +1,90 @@ +#include "PowerManagerFsm.hpp" + +void Lifting::entry() { + PowerManagerFsm::entry(); + pm->workCondition = WorkCondition::CHANING; + //1. 关闭所有水声设备 + LOG_F(INFO,"前视声纳关机指令"); + pm->sendNotification("uExternComm_frontSonarControl_cmd","0"); + MOOSPause(10000); + for(auto iter : underWterDevices) + { + pm->m_driver.setDeviceState(pm->m_subDisSysCmd, static_cast(iter), 0); + } + //2. 关闭动力电设备 + //2.1 断开所有艏部高压断路器 + pm->m_lowerCommManager->operate_HVA_actuatorCircuit_Breaker(0); + MOOSPause(3); + pm->m_lowerCommManager->operate_HVA_bowFTDevice123Circuit_Breaker(0); + MOOSPause(3); + pm->m_lowerCommManager->operate_HVA_bowRudderControlBoxCircuit_Breaker(0); + MOOSPause(3); + pm->m_lowerCommManager->operate_HVA_mastSteeringGearControlBoxCircuit_Breaker(0); + MOOSPause(3); + pm->m_lowerCommManager->operate_HVA_openWaterCoverStartCylinderCircuit_Breaker(0); + MOOSPause(3); + pm->m_lowerCommManager->operate_HVA_xczCircuit_Breaker(0); + MOOSPause(3); + //2.2 断开所有艉部高压设备断路器 + pm->m_lowerCommManager->operate_HV_propulsionMotor_Breaker(0); + MOOSPause(3); + pm->m_lowerCommManager->operate_HV_sternFt45_Breaker(0); + MOOSPause(3); + pm->m_lowerCommManager->operate_HV_sternRudder1_Breaker(0); + MOOSPause(3); + pm->m_lowerCommManager->operate_HV_sternRudder2_Breaker(0); + MOOSPause(3); + pm->m_lowerCommManager->operate_HV_fbReserved_Breaker(0); + MOOSPause(3); + pm->m_lowerCommManager->operate_HV_tyzReserved_Breaker(0); + MOOSPause(3); + pm->m_lowerCommManager->operate_HV_reserved_Breaker(0); + MOOSPause(3); + pm->m_lowerCommManager->operate_HV_dcDc5_Breaker(0); + MOOSPause(3); + pm->m_lowerCommManager->operate_HV_coolingSystem_Breaker(0); + MOOSPause(3); + + //2.5 断开动力电断路器 + pm->m_lowerCommManager->operate_HV_bowHighVoltageBox_Breaker(0); + MOOSPause(3); + pm->m_lowerCommManager->operate_HV_dcDc5_Breaker(0); + MOOSPause(3); + pm->m_lowerCommManager->operate_HV_coolingSystem_Breaker(0); + MOOSPause(3); + pm->m_lowerCommManager->operate_HV_dcDc5Module_Breaker(0); + MOOSPause(3); + pm->m_lowerCommManager->operate_HV_powerLithiumBattery_Breaker(0); + //3. 关闭燃料电池 + //4. 关闭动力锂电池 + MOOSPause(3); + { + int count=0; + while (!(pm->m_systemData->dyn_pos_relay_status == 0x02 && pm->m_systemData->dyn_neg_relay_status == 0x02)) + { + LOG_F(INFO,"动力锂电池下电中..."); + MOOSPause(3); + if(count>10) + { + LOG_F(INFO, "动力锂电池无下电反馈"); + break; + } + count++; + } + } + LOG_F(INFO, "动力锂电池已下电"); + pm->workCondition = WorkCondition::LIFT_MODE; + LOG_F(INFO, "WorkCondition %d", pm->workCondition); +} + +void Lifting::react(MasterCommandEvent const &) { + PowerManagerFsm::handelPowerCmd(); + PowerManagerFsm::handleModCmd(); + PowerManagerFsm::handleWorkCmd(); +} + +void Lifting::react(DevCmdExt const &e) +{ + LOG_F(INFO, "DevCmdExt 执行"); + PowerManagerFsm::react(e); +} \ No newline at end of file diff --git a/src/pPowerManger/fsm/PowerManagerFsm.cpp b/src/pPowerManger/fsm/PowerManagerFsm.cpp index bc3ef82..8e2337d 100644 --- a/src/pPowerManger/fsm/PowerManagerFsm.cpp +++ b/src/pPowerManger/fsm/PowerManagerFsm.cpp @@ -718,6 +718,30 @@ void PowerManagerFsm::handleFBSystemCmd(int id, int cmd) } } +void PowerManagerFsm::react(SideSonarCmd const &e) +{ + LOG_F(INFO, "处理探测模块舷侧声纳指令"); + if(e.xcHighVoltageAdd == 1) + { + pm->m_lowerCommManager->operate_HVA_xczCircuit_Breaker(1); + pm->m_upperCommManager->processPeriodicTasks(); + } + else if(e.xcHighVoltageAdd == 2) + { + pm->m_lowerCommManager->operate_HVA_xczCircuit_Breaker(0); + pm->m_upperCommManager->processPeriodicTasks(); + } + + if(e.xcLowVoltageAdd == 1) + { + pm->m_driver.setDeviceState(pm->m_subDisSysCmd, DeviceId::sideSonar, (unsigned char)1); + } + else if(e.xcLowVoltageAdd == 2) + { + pm->m_driver.setDeviceState(pm->m_subDisSysCmd, DeviceId::sideSonar, (unsigned char)0); + } +} + void PowerManagerFsm::handleSideSonarCmd(int id, int cmd) { if(id == DeviceId::sideSonar) @@ -2516,6 +2540,7 @@ void PowerManagerFsm::react(FaultEvent const &e) sensorSystemFault(e); } + void PowerManagerFsm::handelPowerCmd(){ switch (pm->m_msCmd.powerCMD) { @@ -2765,6 +2790,8 @@ void PowerManagerFsm::handleWorkCmd(){ LOG_F(INFO, "收到上位机控制指令:DJ模式"); transit(); break; + case 12: + LOG_F(INFO, "收到上位机控制指令:起吊准备"); default: break; } diff --git a/src/pPowerManger/fsm/PowerManagerFsm.hpp b/src/pPowerManger/fsm/PowerManagerFsm.hpp index 2ff3ab4..436a867 100644 --- a/src/pPowerManger/fsm/PowerManagerFsm.hpp +++ b/src/pPowerManger/fsm/PowerManagerFsm.hpp @@ -44,6 +44,12 @@ struct DevCmdExt : tinyfsm::Event { DevCmdExt() : id(0), cmd(0) {}; DevCmdExt(int id, int cmd) : id(id), cmd(cmd) {}; }; +struct SideSonarCmd : tinyfsm::Event { + int xcLowVoltageAdd; + int xcHighVoltageAdd; + SideSonarCmd() : xcLowVoltageAdd(0),xcHighVoltageAdd(0) {}; + SideSonarCmd(int xcLowVoltageAdd,int xcHighVoltageAdd) : xcLowVoltageAdd(xcLowVoltageAdd),xcHighVoltageAdd(xcHighVoltageAdd) {}; +}; //==================测试事件================================ struct TestEvent : tinyfsm::Event { std::string eventName; @@ -94,6 +100,8 @@ public: virtual void react(FaultEvent const &e); virtual void react(TaskStopEvent const &e); virtual void react(CycleTriggeredEvent const &e); + virtual void react(SideSonarCmd const &e); + //测试事件 virtual void react(TestEvent const &); @@ -282,5 +290,10 @@ public: void react(MasterCommandEvent const &) override; }; +class Lifting : public PowerManagerFsm { +public: + void entry() override; + void react(MasterCommandEvent const &) override; +}; #endif // POWER_MANAGER_FSM_HPP \ No newline at end of file diff --git a/src/pPowerManger/fsm/ShoreBasedReady.cpp b/src/pPowerManger/fsm/ShoreBasedReady.cpp index 8b8648c..0d9bc1b 100644 --- a/src/pPowerManger/fsm/ShoreBasedReady.cpp +++ b/src/pPowerManger/fsm/ShoreBasedReady.cpp @@ -17,14 +17,14 @@ void ShoreBasedReady::entry() { pm->m_CcuColCmd.powerBatCmd = BatteryCommand::Start; //1.2 闭合动力电断路器 pm->m_lowerCommManager->operate_HV_powerLithiumBattery_Breaker(1); - MOOSPause(3); + MOOSPause(100); pm->m_lowerCommManager->operate_HV_dcDc5Module_Breaker(1); - MOOSPause(3); + MOOSPause(100); pm->m_lowerCommManager->operate_HV_dcDc5_Breaker(1); pm->m_lowerCommManager->operate_HV_coolingSystem_Breaker(1); - MOOSPause(10); + MOOSPause(100); pm->m_lowerCommManager->operate_HV_bowHighVoltageBox_Breaker(1); - MOOSPause(3); + MOOSPause(100); //2. 启动动力电设备 unsigned char cmd = 1; //2.0 艉舵 @@ -44,7 +44,7 @@ void ShoreBasedReady::entry() { pm->m_driver.setDeviceState(pm->m_subDisSysCmd, DeviceId::bowCover5, (unsigned char)cmd); pm->m_driver.setDeviceState(pm->m_subDisSysCmd, DeviceId::bowCover6, (unsigned char)cmd); pm->m_upperCommManager->processPeriodicTasks(); - MOOSPause(3); + MOOSPause(100); pm->m_lowerCommManager->operate_HVA_actuatorCircuit_Breaker(1); //2.2 敞水电缸 pm->m_driver.setDeviceState(pm->m_subDisSysCmd, DeviceId::bowWaterInet1, (unsigned char)cmd); @@ -56,36 +56,36 @@ void ShoreBasedReady::entry() { pm->m_driver.setDeviceState(pm->m_subDisSysCmd, DeviceId::bowWaterInet7, (unsigned char)cmd); pm->m_driver.setDeviceState(pm->m_subDisSysCmd, DeviceId::bowWaterInet8, (unsigned char)cmd); pm->m_upperCommManager->processPeriodicTasks(); - MOOSPause(3); + MOOSPause(100); pm->m_lowerCommManager->operate_HVA_openWaterCoverStartCylinderCircuit_Breaker(1); //2.3 艏舵 pm->m_driver.setDeviceState(pm->m_subDisSysCmd, DeviceId::bowRudderDeploy, (unsigned char)cmd); pm->m_driver.setDeviceState(pm->m_subDisSysCmd, DeviceId::bowRudderServo1, (unsigned char)cmd); pm->m_upperCommManager->processPeriodicTasks(); - MOOSPause(3); + MOOSPause(100); pm->m_lowerCommManager->operate_HVA_bowRudderControlBoxCircuit_Breaker(1); //2.4 桅杆舵机 pm->m_driver.setDeviceState(pm->m_subDisSysCmd, DeviceId::mastLiftingServo, (unsigned char)cmd); pm->m_upperCommManager->processPeriodicTasks(); - MOOSPause(3); + MOOSPause(100); pm->m_lowerCommManager->operate_HVA_mastSteeringGearControlBoxCircuit_Breaker(1); //2.5 艏部浮调机构 pm->m_driver.setDeviceState(pm->m_subDisSysCmd, DeviceId::buoyancyAdjust1, (unsigned char)cmd); pm->m_driver.setDeviceState(pm->m_subDisSysCmd, DeviceId::buoyancyAdjust2, (unsigned char)cmd); pm->m_driver.setDeviceState(pm->m_subDisSysCmd, DeviceId::buoyancyAdjust3, (unsigned char)cmd); pm->m_upperCommManager->processPeriodicTasks(); - MOOSPause(3); + MOOSPause(100); pm->m_lowerCommManager->operate_HVA_bowFTDevice123Circuit_Breaker(1); //2.6 艉部浮调机构 pm->m_driver.setDeviceState(pm->m_subDisSysCmd, DeviceId::buoyancyAdjust4, (unsigned char)cmd); pm->m_driver.setDeviceState(pm->m_subDisSysCmd, DeviceId::buoyancyAdjust5, (unsigned char)cmd); pm->m_upperCommManager->processPeriodicTasks(); - MOOSPause(3); + MOOSPause(100); pm->m_lowerCommManager->operate_HV_sternFt45_Breaker(1); //2.7 推进电机 pm->m_driver.setDeviceState(pm->m_subDisSysCmd, DeviceId::thruster, (unsigned char)cmd); pm->m_upperCommManager->processPeriodicTasks(); - MOOSPause(3); + MOOSPause(100); pm->m_lowerCommManager->operate_HV_propulsionMotor_Breaker(1); pm->workCondition = WorkCondition::SHORE_BASED_READY; LOG_F(INFO, "进入岸基备航状态"); diff --git a/src/pPowerManger/fsm/StandbyState.cpp b/src/pPowerManger/fsm/StandbyState.cpp index 25c2541..0943696 100644 --- a/src/pPowerManger/fsm/StandbyState.cpp +++ b/src/pPowerManger/fsm/StandbyState.cpp @@ -5,6 +5,7 @@ void StandbyState::entry() { PowerManagerFsm::entry(); pm->workCondition = WorkCondition::STANDBY; pm->m_driver.getSTANDBYTable(&pm->m_subDisSysCmd); + pm->m_lowerCommManager->operate_hold(); LOG_F(INFO, "WorkCondition %d", pm->workCondition); } void StandbyState::react(StandbyEvent const &) { diff --git a/src/pPowerManger/httpserver/data.h b/src/pPowerManger/httpserver/data.h index 22ed19e..b47275d 100644 --- a/src/pPowerManger/httpserver/data.h +++ b/src/pPowerManger/httpserver/data.h @@ -891,6 +891,44 @@ const std::string DATA_HTML = R"( + +
+
+
+ 应急电池1总电压: + 正在加载... +
+
+ 应急电池1总电流: + 正在加载... +
+
+ 应急电池1最高温度: + 正在加载... +
+
+ 应急电池1故障字: + 正在加载... +
+
+ 应急电池2总电压: + 正在加载... +
+
+ 应急电池2总电流: + 正在加载... +
+
+ 应急电池2最高温度: + 正在加载... +
+
+ 应急电池2故障字: + 正在加载... +
+
+
+
@@ -1682,6 +1720,40 @@ if (data.power_a_bus_status) { if (data.timestamp !== undefined) { document.getElementById('timestamp').textContent = new Date(data.timestamp).toLocaleString(); } + + // 应急电池数据 + if (data.emergency_battery1 && data.emergency_battery1.voltage !== undefined) { + document.getElementById('emergency-battery1-voltage').textContent = + data.emergency_battery1.voltage.toFixed(2) + ' V'; + } + if (data.emergency_battery1 && data.emergency_battery1.current !== undefined) { + document.getElementById('emergency-battery1-current').textContent = + data.emergency_battery1.current.toFixed(2) + ' A'; + } + if (data.emergency_battery1 && data.emergency_battery1.max_temp !== undefined) { + document.getElementById('emergency-battery1-max-temp').textContent = + data.emergency_battery1.max_temp.toFixed(1) + ' °C'; + } + if (data.emergency_battery1 && data.emergency_battery1.fault_word !== undefined) { + document.getElementById('emergency-battery1-fault-word').textContent = + '0x' + data.emergency_battery1.fault_word.toString(16).toUpperCase(); + } + if (data.emergency_battery2 && data.emergency_battery2.voltage !== undefined) { + document.getElementById('emergency-battery2-voltage').textContent = + data.emergency_battery2.voltage.toFixed(2) + ' V'; + } + if (data.emergency_battery2 && data.emergency_battery2.current !== undefined) { + document.getElementById('emergency-battery2-current').textContent = + data.emergency_battery2.current.toFixed(2) + ' A'; + } + if (data.emergency_battery2 && data.emergency_battery2.max_temp !== undefined) { + document.getElementById('emergency-battery2-max-temp').textContent = + data.emergency_battery2.max_temp.toFixed(1) + ' °C'; + } + if (data.emergency_battery2 && data.emergency_battery2.fault_word !== undefined) { + document.getElementById('emergency-battery2-fault-word').textContent = + '0x' + data.emergency_battery2.fault_word.toString(16).toUpperCase(); + } } // 充放电状态文本转换 diff --git a/src/pPowerManger/httpserver/httpserver.cpp b/src/pPowerManger/httpserver/httpserver.cpp index e3d54c2..e570b9f 100644 --- a/src/pPowerManger/httpserver/httpserver.cpp +++ b/src/pPowerManger/httpserver/httpserver.cpp @@ -579,6 +579,30 @@ void HttpServer::pushSystemData() { j["power_bus_status"]["reservedCurrent3"] = Json::Value(m_systemData->power_bus_status.reservedCurrent3); // 预留电流3 j["power_bus_status"]["coolWaterPressure"] = Json::Value(m_systemData->power_bus_status.coolWaterPressure); // 冷却水压力 + + //应急电池信息 + j["emergency_battery1"]["voltage"] = Json::Value(m_systemData->emergency_battery1_voltage); // 应急电池1总电压 [V] + j["emergency_battery1"]["current"] = Json::Value(m_systemData->emergency_battery1_current); // 应急电池1总电流 [A] + j["emergency_battery1"]["max_temp"] = Json::Value(m_systemData->emergency_battery1_max_temp); // 应急电池1最高温度 [°C] + j["emergency_battery1"]["fault_word"] = Json::Value(m_systemData->emergency_battery1_fault_word); // 应急电池1故障字 + + j["emergency_battery2"]["voltage"] = Json::Value(m_systemData->emergency_battery2_voltage); // 应急电池2总电压 [V] + j["emergency_battery2"]["current"] = Json::Value(m_systemData->emergency_battery2_current); // 应急电池2总电流 [A] + j["emergency_battery2"]["max_temp"] = Json::Value(m_systemData->emergency_battery2_max_temp); // 应急电池2最高温度 [°C] + j["emergency_battery2"]["fault_word"] = Json::Value(m_systemData->emergency_battery2_fault_word); // 应急电池2故障字 + + + //应急电池 + // emergency_battery1_voltage = data.emergency_battery1_voltage * 0.1; + // emergency_battery1_current = data.emergency_battery1_current * 0.05; + // emergency_battery1_max_temp = data.emergency_battery1_max_temp * 0.1; + // emergency_battery1_fault_word = data.emergency_battery1_fault_word; + // emergency_battery2_voltage = data.emergency_battery2_voltage * 0.1; + // emergency_battery2_current = data.emergency_battery2_current * 0.05; + // emergency_battery2_max_temp = data.emergency_battery2_max_temp * 0.1; + // emergency_battery2_fault_word = data.emergency_battery2_fault_word; + + // union { // unsigned char lowFaultWord; // struct { diff --git a/src/pPowerManger/httpserver/index.h b/src/pPowerManger/httpserver/index.h index 3ed38eb..6e12a0f 100644 --- a/src/pPowerManger/httpserver/index.h +++ b/src/pPowerManger/httpserver/index.h @@ -540,6 +540,11 @@ body { animation: alarm-pulse 2s infinite ease-in-out; } +.emergency-battery-card { + + /* 移除特殊宽度限制,使用标准电池卡片样式 */ +} + @keyframes alarm-pulse { 0% { border-color: #f87171; /* light red */ @@ -774,6 +779,26 @@ body {
+ +
+

应急电池1状态

+
+
总电压:-V
+
总电流:-A
+
最高温度:-°C
+
故障字:-
+
+
+ +
+

应急电池2状态

+
+
总电压:-V
+
总电流:-A
+
最高温度:-°C
+
故障字:-
+
+
电池报警状态
@@ -1094,6 +1119,20 @@ body { updateWithDebounce('h2-concentration1', data.h2_concentration1, 0); updateWithDebounce('h2-concentration2', data.h2_concentration2, 0); + // 更新应急电池数据 + if (data.emergency_battery1) { + updateWithDebounce('emergency-battery1-voltage', data.emergency_battery1.voltage, 2); + updateWithDebounce('emergency-battery1-current', data.emergency_battery1.current, 2); + updateWithDebounce('emergency-battery1-max-temp', data.emergency_battery1.max_temp, 1); + updateStatusWithDebounce('emergency-battery1-fault-word', data.emergency_battery1.fault_word, getFaultWordText); + } + if (data.emergency_battery2) { + updateWithDebounce('emergency-battery2-voltage', data.emergency_battery2.voltage, 2); + updateWithDebounce('emergency-battery2-current', data.emergency_battery2.current, 2); + updateWithDebounce('emergency-battery2-max-temp', data.emergency_battery2.max_temp, 1); + updateStatusWithDebounce('emergency-battery2-fault-word', data.emergency_battery2.fault_word, getFaultWordText); + } + // 更新电池报警状态 updateWithDebounce('dyn-alarm-flag1', data.dyn_alarm_flag1, 0); updateWithDebounce('dyn-alarm-flag2', data.dyn_alarm_flag2, 0); @@ -1516,6 +1555,11 @@ body { return commands[cmd] || '未知指令'; } + function getFaultWordText(faultWord) { + if (faultWord === undefined || faultWord === null) return '-'; + return '0x' + faultWord.toString(16).toUpperCase().padStart(4, '0'); + } + function updateCcuControlData(data) { if (data.ccuColCmd) { const ccuData = data.ccuColCmd; @@ -1812,4 +1856,4 @@ body { )"; -#endif // HTTP_SERVER_INDEX_H +#endif // HTTP_SERVER_INDEX_H \ No newline at end of file diff --git a/src/pPowerManger/pPowerManger.moos b/src/pPowerManger/pPowerManger.moos index dbdbca8..2de7531 100644 --- a/src/pPowerManger/pPowerManger.moos +++ b/src/pPowerManger/pPowerManger.moos @@ -4,4 +4,6 @@ ProcessConfig = pPowerManger { AppTick = 4 CommsTick = 4 + log_level = INFO + log_file = /path/to/your/logfile.log } \ No newline at end of file diff --git a/src/pPowerManger/pmSysvariable.h b/src/pPowerManger/pmSysvariable.h index c023be8..612f852 100644 --- a/src/pPowerManger/pmSysvariable.h +++ b/src/pPowerManger/pmSysvariable.h @@ -51,7 +51,16 @@ typedef struct ccuState uint16_t ch3oh_concentration1; // 舱室甲醇气体浓度1,单位:0.01% LEL uint16_t ch3oh_concentration2; // 舱室甲醇气体浓度2,单位:0.01% LEL - uint16_t reserved1[10]; // 保留字段,地址范围35~52,共18个uint16_t,协议预留 + uint16_t reserved1[2]; // 保留字段前2个元素 + uint16_t emergency_battery1_voltage; // 应急电池1总电压 [V] + uint16_t emergency_battery1_current; // 应急电池1总电流 [A] + uint16_t emergency_battery1_max_temp; // 应急电池1最高温度 [°C] + uint16_t emergency_battery1_fault_word; // 应急电池1故障字 + uint16_t emergency_battery2_voltage; // 应急电池2总电压 [V] + uint16_t emergency_battery2_current; // 应急电池2总电流 [A] + uint16_t emergency_battery2_max_temp; // 应急电池2最高温度 [°C] + uint16_t emergency_battery2_fault_word; // 应急电池2故障字 + uint16_t cabin_ox_concentration; // 仪表舱内氧气浓度 [%] uint16_t cabin_temperature; // 仪表舱内温度 [°C] uint16_t cabin_humidity; // 仪表舱内湿度 [%RH] @@ -632,7 +641,7 @@ namespace WorkCondition { UNDERWATER_RECON = 9, // 水下侦查 SURFACE_RECON = 10, // 水面侦查 DJ_MODE = 11, // DJ模式 - DEBUG_MODE = 12 // 调试模式 + LIFT_MODE = 12 // 调试模式 }; }; diff --git a/src/pPowerManger/sqlit3/SQLite.cpp b/src/pPowerManger/sqlit3/SQLite.cpp index 71f60c8..ccdb383 100644 --- a/src/pPowerManger/sqlit3/SQLite.cpp +++ b/src/pPowerManger/sqlit3/SQLite.cpp @@ -3,13 +3,17 @@ #include #include "../logc/loguru.hpp" -SQLite::SQLite(const std::string& dbPath) -{ - if (sqlite3_open(dbPath.c_str(), &m_db) != SQLITE_OK) { - LOG_F(WARNING, "Can't open database: %s", sqlite3_errmsg(m_db)); +SQLite::SQLite(const std::string& dbPath) { + try { + if (sqlite3_open(dbPath.c_str(), &m_db) != SQLITE_OK) { + LOG_F(ERROR, "无法打开数据库: %s", sqlite3_errmsg(m_db)); + m_db = nullptr; + } + m_dbPath = dbPath; + } catch (...) { + LOG_F(ERROR, "SQLite构造函数发生异常"); m_db = nullptr; } - m_dbPath = dbPath; } SQLite::~SQLite() @@ -71,9 +75,15 @@ bool SQLite::createTable() o2_concentration2 INTEGER, ch3oh_concentration1 INTEGER, ch3oh_concentration2 INTEGER, - reserved1_1 INTEGER, reserved1_2 INTEGER, reserved1_3 INTEGER, reserved1_4 INTEGER, - reserved1_5 INTEGER, reserved1_6 INTEGER, reserved1_7 INTEGER, reserved1_8 INTEGER, - reserved1_9 INTEGER, reserved1_10 INTEGER, + reserved1_1 INTEGER, reserved1_2 INTEGER, + emergency_battery1_voltage INTEGER, + emergency_battery1_current INTEGER, + emergency_battery1_max_temp INTEGER, + emergency_battery1_fault_word INTEGER, + emergency_battery2_voltage INTEGER, + emergency_battery2_current INTEGER, + emergency_battery2_max_temp INTEGER, + emergency_battery2_fault_word INTEGER, cabin_ox_concentration INTEGER, cabin_temperature INTEGER, cabin_humidity INTEGER, @@ -269,7 +279,7 @@ bool SQLite::createTable() workCondition INTEGER, fcuCmd INTEGER, fcuPowerEfficiency INTEGER, - fcuInsEfficiency INTEGER, + insChargeEnable INTEGER, insBatCmd INTEGER, powerBatCmd INTEGER, powerBatEfficiency INTEGER, @@ -375,8 +385,9 @@ bool SQLite::insertData(const ccuState data) { h2_concentration1, h2_concentration2, h2_concentration3, o2_concentration1, o2_concentration2, ch3oh_concentration1, ch3oh_concentration2, - reserved1_1, reserved1_2, reserved1_3, reserved1_4, reserved1_5, - reserved1_6, reserved1_7, reserved1_8, reserved1_9, reserved1_10, + reserved1_1, reserved1_2, + emergency_battery1_voltage, emergency_battery1_current, emergency_battery1_max_temp, emergency_battery1_fault_word, + emergency_battery2_voltage, emergency_battery2_current, emergency_battery2_max_temp, emergency_battery2_fault_word, cabin_ox_concentration, cabin_temperature, cabin_humidity, cabin_pressure, power_cabin_ox_concentration, power_cabin_temperature, power_cabin_humidity, power_cabin_pressure, @@ -417,7 +428,9 @@ bool SQLite::insertData(const ccuState data) { ?, ?, ?, ?, ?, ?, ?, ?, ?, - ?, ?, ?, ?, ?, + ?, ?, + ?, ?, ?, ?, + ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, @@ -430,8 +443,6 @@ bool SQLite::insertData(const ccuState data) { ?, ?, ?, ?, ?, ?, - ?, ?, - ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, @@ -443,7 +454,7 @@ bool SQLite::insertData(const ccuState data) { ?, ?, ?, ?, ?, ?, ?, - ?, ? + ? ); )"; @@ -497,7 +508,16 @@ bool SQLite::insertData(const ccuState data) { BIND_16(data.ch3oh_concentration1); BIND_16(data.ch3oh_concentration2); - for (int i = 0; i < 10; ++i) BIND_16(data.reserved1[i]); + for (int i = 0; i < 2; ++i) BIND_16(data.reserved1[i]); + + BIND_16(data.emergency_battery1_voltage); + BIND_16(data.emergency_battery1_current); + BIND_16(data.emergency_battery1_max_temp); + BIND_16(data.emergency_battery1_fault_word); + BIND_16(data.emergency_battery2_voltage); + BIND_16(data.emergency_battery2_current); + BIND_16(data.emergency_battery2_max_temp); + BIND_16(data.emergency_battery2_fault_word); BIND_16(data.cabin_ox_concentration); BIND_16(data.cabin_temperature); @@ -626,8 +646,6 @@ bool SQLite::insertData(const ccuColCmd cmd) { if (!success) { std::cerr << "执行插入失败: " << sqlite3_errmsg(m_db) << std::endl; } - - sqlite3_finalize(stmt); return success; } diff --git a/src/pPowerManger/sqlit3/SQLite.h b/src/pPowerManger/sqlit3/SQLite.h index aac5c2c..14e95fa 100644 --- a/src/pPowerManger/sqlit3/SQLite.h +++ b/src/pPowerManger/sqlit3/SQLite.h @@ -33,5 +33,4 @@ public: }; - #endif diff --git a/src/pPowerManger/systemData.h b/src/pPowerManger/systemData.h index 20f0a2f..c58fca1 100644 --- a/src/pPowerManger/systemData.h +++ b/src/pPowerManger/systemData.h @@ -205,6 +205,16 @@ public: unsigned char insfaultCode; + //应急电池 + double emergency_battery1_voltage; // 应急电池1总电压 [V] + double emergency_battery1_current; // 应急电池1总电流 [A] + double emergency_battery1_max_temp; // 应急电池1最高温度 [°C] + uint16_t emergency_battery1_fault_word; // 应急电池1故障字 + double emergency_battery2_voltage; // 应急电池2总电压 [V] + double emergency_battery2_current; // 应急电池2总电流 [A] + double emergency_battery2_max_temp; // 应急电池2最高温度 [°C] + uint16_t emergency_battery2_fault_word; // 应急电池2故障字 + // MOOSD 状态 bool moosd_status; //配电系统状态 @@ -522,15 +532,15 @@ public: }; ~SystemData(){}; - void updateCommonStatus(double time_out=3){ + void updateCommonStatus(double time_out=10){ //更新时间 double currentTime = MOOSTime(); //判断是否超时 - device_common_status.ccu_status.isTimeout = (currentTime - device_common_status.ccu_status.lastUpdateTime) > time_out; - device_common_status.dis_hv_c1.isTimeout = (currentTime - device_common_status.dis_hv_c1.lastUpdateTime) > time_out; - device_common_status.dis_hv_c2.isTimeout = (currentTime - device_common_status.dis_hv_c2.lastUpdateTime) > time_out; - device_common_status.dis_lv_c1.isTimeout = (currentTime - device_common_status.dis_lv_c1.lastUpdateTime) > time_out; - device_common_status.dis_lv_c2.isTimeout = (currentTime - device_common_status.dis_lv_c2.lastUpdateTime) > time_out; + device_common_status.ccu_status.isTimeout = abs(currentTime - device_common_status.ccu_status.lastUpdateTime) > time_out; + device_common_status.dis_hv_c1.isTimeout = abs(currentTime - device_common_status.dis_hv_c1.lastUpdateTime) > time_out; + device_common_status.dis_hv_c2.isTimeout = abs(currentTime - device_common_status.dis_hv_c2.lastUpdateTime) > time_out; + device_common_status.dis_lv_c1.isTimeout = abs(currentTime - device_common_status.dis_lv_c1.lastUpdateTime) > time_out; + device_common_status.dis_lv_c2.isTimeout = abs(currentTime - device_common_status.dis_lv_c2.lastUpdateTime) > time_out; }; void updateSystemData(ccuState data){ @@ -695,6 +705,17 @@ public: water_leak_status_from_dynbat = (data.dyn_water_leak_status >> 4) & 0x0F; // 00 正常,01 异常漏水 dcdc_status_from_insbat = (data.ins_water_leak_dcdc_status) & 0x0F; // 00 正常,01 故障 + + //应急电池 + emergency_battery1_voltage = data.emergency_battery1_voltage * 0.1; + emergency_battery1_current = data.emergency_battery1_current * 0.05; + emergency_battery1_max_temp = data.emergency_battery1_max_temp * 0.1; + emergency_battery1_fault_word = data.emergency_battery1_fault_word; + emergency_battery2_voltage = data.emergency_battery2_voltage * 0.1; + emergency_battery2_current = data.emergency_battery2_current * 0.05; + emergency_battery2_max_temp = data.emergency_battery2_max_temp * 0.1; + emergency_battery2_fault_word = data.emergency_battery2_fault_word; + //心跳计数器 heartbeat = data.heartbeat; } diff --git a/src/pPowerManger/upmsg/uDetect_xcVoltage_cmd.h b/src/pPowerManger/upmsg/uDetect_xcVoltage_cmd.h new file mode 100644 index 0000000..f0ac9a5 --- /dev/null +++ b/src/pPowerManger/upmsg/uDetect_xcVoltage_cmd.h @@ -0,0 +1,63 @@ +/* json 格式 XC阵控制软件→复合能源管控系统 +{ + "xcLowVoltageAdd_int32 " : XX //命令类型:“无命令”0,“申请仪表上电”1,“申请仪表断电”2;类型:int + "xcHighVoltageAdd_int32 " : XX, //命令类型:“无命令”0,“申请高压上电”1,“申请高压断电”2;类型:int +} +*/ +#ifndef UDETECT_XCVOLTAGE_CMD_H +#define UDETECT_XCVOLTAGE_CMD_H +#include "../logc/loguru.hpp" +#include "json/json.h" +#include +#include + +class uDetect_xcVoltage_cmd +{ +private: + /* data */ +public: + uDetect_xcVoltage_cmd(){}; + ~uDetect_xcVoltage_cmd(){}; + + int xcLowVoltageAdd_int32; + int xcHighVoltageAdd_int32; + + static std::string key; + + std::string toJsonString() + { + Json::Value j; + j["xcLowVoltageAdd_int32"] = xcLowVoltageAdd_int32; + j["xcHighVoltageAdd_int32"] = xcHighVoltageAdd_int32; + + Json::StreamWriterBuilder builder; + builder.settings_["indentation"] = ""; + return Json::writeString(builder, j); + } + bool fromJsonString(std::string jsonString) + { + Json::CharReaderBuilder readerBuilder; + std::unique_ptr reader(readerBuilder.newCharReader()); + Json::Value j; + std::string errors; + + bool parsingSuccessful = reader->parse(jsonString.c_str(), jsonString.c_str() + jsonString.length(), &j, &errors); + if (!parsingSuccessful) { + LOG_F(ERROR, "Failed to parse JSON: %s", errors.c_str()); + return false; + } + + if (j.isMember("xcLowVoltageAdd_int32") && j.isMember("xcHighVoltageAdd_int32")) { + xcLowVoltageAdd_int32 = j["xcLowVoltageAdd_int32"].asInt(); + xcHighVoltageAdd_int32 = j["xcHighVoltageAdd_int32"].asInt(); + LOG_F(INFO, "xcLowVoltageAdd_int32: %d", xcLowVoltageAdd_int32); + LOG_F(INFO, "xcHighVoltageAdd_int32: %d", xcHighVoltageAdd_int32); + LOG_F(INFO, "jsonString: %s", jsonString.c_str()); + return true; + } + LOG_F(ERROR, "JSON does not contain required fields"); + return false; + } +}; + +#endif diff --git a/src/pPowerManger/upmsg/uDetect_zdpVoltage_cmd.h b/src/pPowerManger/upmsg/uDetect_zdpVoltage_cmd.h new file mode 100644 index 0000000..6aa7953 --- /dev/null +++ b/src/pPowerManger/upmsg/uDetect_zdpVoltage_cmd.h @@ -0,0 +1,58 @@ +/* json 格式 XC阵控制软件→复合能源管控系统 +{ + "zdpVoltageAdd_int32 " : XX //命令类型:“无命令”0,“申请仪表上电”1,“申请仪表断电”2;类型:int +} +*/ +#ifndef UDETECT_ZDPVOLTAGE_CMD_H +#define UDETECT_ZDPVOLTAGE_CMD_H +#include "../logc/loguru.hpp" +#include "json/json.h" +#include +#include + +class uDetect_zdpVoltage_cmd +{ +private: + /* data */ +public: + uDetect_zdpVoltage_cmd(){}; + ~uDetect_zdpVoltage_cmd(){}; + + int zdpVoltageAdd_int32; + + static std::string key; + + std::string toJsonString() + { + Json::Value j; + j["zdpVoltageAdd_int32"] = zdpVoltageAdd_int32; + + Json::StreamWriterBuilder builder; + builder.settings_["indentation"] = ""; + return Json::writeString(builder, j); + } + bool fromJsonString(std::string jsonString) + { + Json::CharReaderBuilder readerBuilder; + std::unique_ptr reader(readerBuilder.newCharReader()); + Json::Value j; + std::string errors; + + bool parsingSuccessful = reader->parse(jsonString.c_str(), jsonString.c_str() + jsonString.length(), &j, &errors); + if (!parsingSuccessful) { + LOG_F(ERROR, "Failed to parse JSON: %s", errors.c_str()); + return false; + } + + if (j.isMember("zdpVoltageAdd_int32")) { + zdpVoltageAdd_int32 = j["zdpVoltageAdd_int32"].asInt(); + LOG_F(INFO, "zdpVoltageAdd_int32: %d", zdpVoltageAdd_int32); + LOG_F(INFO, "jsonString: %s", jsonString.c_str()); + return true; + } + LOG_F(ERROR, "JSON does not contain required fields"); + return false; + } +}; + +#endif diff --git a/src/pPowerManger/upmsg/uDevice_thruster_st.h b/src/pPowerManger/upmsg/uDevice_thruster_st.h new file mode 100644 index 0000000..e69de29 diff --git a/src/pPowerManger/upmsg/upmsg_definitions.cpp b/src/pPowerManger/upmsg/upmsg_definitions.cpp new file mode 100644 index 0000000..a0f16c3 --- /dev/null +++ b/src/pPowerManger/upmsg/upmsg_definitions.cpp @@ -0,0 +1,6 @@ +#include "uDetect_zdpVoltage_cmd.h" +#include "uDetect_xcVoltage_cmd.h" + +// 定义静态成员变量 +std::string uDetect_zdpVoltage_cmd::key = "uDetect_zdpVoltage_cmd"; +std::string uDetect_xcVoltage_cmd::key = "uDetect_xcVoltage_cmd"; diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 372bd7f..0cac9fb 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -1,44 +1,29 @@ cmake_minimum_required(VERSION 3.10) -project(SQLiteDBTest) +project(H100PowerMangerTests) # 设置 C++ 标准 set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED ON) -#############################################SQLiteDBTest#################################################################### -# 查找 SQLiteDB 项目库 -find_library(SQLiteDB_LIB NAMES SQLiteDB PATHS /home/zjk/project/H100/H100PowerManger/lib) -if(NOT SQLiteDB_LIB) - message(FATAL_ERROR "SQLiteDB library not found!") -endif() -# 查找 Catch2 测试框架 -find_package(Catch2 REQUIRED) -# 添加测试可执行文件 -add_executable(SQLiteDBTest SQLiteDBTest.cpp) -# 链接库文件(注意顺序:先项目库后系统库) -target_link_libraries(SQLiteDBTest - ${SQLiteDB_LIB} # 项目SQLiteDB库 - Catch2::Catch2WithMain # 测试框架 - sqlite3 - jsoncpp +################################################SQLiteTest#################################################################### +# 添加 SQLite 测试可执行文件(不使用第三方测试库) +add_executable(SQLiteTest + until/testSqlitdb.cpp + ${CMAKE_SOURCE_DIR}/src/pPowerManger/sqlit3/SQLite.cpp + ${CMAKE_SOURCE_DIR}/src/pPowerManger/sqlit3/sqlite3.c + ${CMAKE_SOURCE_DIR}/src/pPowerManger/logc/loguru.cpp ) -################################################udpCommTest#################################################################### -# 查找 udpComm 项目库 -find_library(UDPCOMM_LIB NAMES UDPComm PATHS /home/zjk/project/H100/H100PowerManger/lib) -if(NOT UDPCOMM_LIB) - message(FATAL_ERROR "udpComm library not found!") -endif() +# 包含目录 +target_include_directories(SQLiteTest PRIVATE + ${CMAKE_SOURCE_DIR}/src/pPowerManger + ${CMAKE_SOURCE_DIR}/src/pPowerManger/sqlit3 +) -# 添加 udpComm 测试可执行文件 -add_executable(udpCommTest udpCommTest.cpp) - -# 链接库文件(注意顺序:先项目库后系统库) -target_link_libraries(udpCommTest - ${UDPCOMM_LIB} # 项目udpComm库 - ${MOOS_LIBRARIES} - Catch2::Catch2WithMain # 测试框架 +# 链接库文件 +target_link_libraries(SQLiteTest + pthread ) ################################################PowerMangerTest#################################################################### diff --git a/test/disSysTest/PowerManagerApp copy.py b/test/disSysTest/PowerManagerApp copy.py index c582489..2f07607 100644 --- a/test/disSysTest/PowerManagerApp copy.py +++ b/test/disSysTest/PowerManagerApp copy.py @@ -70,13 +70,13 @@ class PowerManagerApp: # 高压配电板端口 self.disSysPortC1 = 6000 - # self.disSysHostC1 = '192.168.1.154' - self.disSysHostC1 = '127.0.0.1' + self.disSysHostC1 = '192.168.1.154' + # self.disSysHostC1 = '127.0.0.1' # 仪表配电板端口 self.disSysPortC2 = 6000 - # self.disSysHostC2 = '192.168.1.158' - self.disSysHostC2 = '127.0.0.1' + self.disSysHostC2 = '192.168.1.158' + # self.disSysHostC2 = '127.0.0.1' # 数据库配置 self.db = DB(os.path.join(os.path.dirname(__file__), 'test.db')) @@ -419,6 +419,8 @@ class PowerManagerApp: menubar.add_cascade(label="配电操作", menu=dis_options_menu) menubar.add_command(label="DCDC状态", command=lambda: self.show_popup_window("DCDC状态")) + menubar.add_command(label="复合管控面板", command=lambda: self.show_compound_control_window("复合管控面板")) + menubar.add_command(label="软件说明", command=lambda: self.show_help_window("程序说明")) # 配置菜单栏 self.root.config(menu=menubar) @@ -1826,6 +1828,70 @@ class PowerManagerApp: close_button = ttk.Button(popup, text="关闭", command=popup.destroy) close_button.pack(pady=10) + def show_compound_control_window(self, title): + """创建并显示弹出窗口""" + popup = tk.Toplevel(self.root) + popup.title(title) + frame = ttk.Frame(popup) + popup.geometry("600x400") + popup.resizable(True, True) + frame.pack(fill="both", expand=True, padx=5, pady=5) + + def show_help_window(self, title): + """显示程序说明弹窗""" + popup = tk.Toplevel(self.root) + popup.title(title) + popup.geometry("600x400") + popup.resizable(True, True) + + # 创建文本框和滚动条 + frame = ttk.Frame(popup) + frame.pack(fill="both", expand=True, padx=10, pady=10) + + text_widget = tk.Text(frame, wrap="word", font=("Microsoft YaHei", 10)) + scrollbar = ttk.Scrollbar(frame, orient="vertical", command=text_widget.yview) + text_widget.configure(yscrollcommand=scrollbar.set) + + text_widget.pack(side="left", fill="both", expand=True) + scrollbar.pack(side="right", fill="y") + + # 程序说明内容 + help_text = """H100动力管理系统程序说明 + + 版本:v1.0 + + 功能概述: + 1. 高压母线状态监控 - 实时显示动力母线电压、电流及断路器状态 + 2. 高压A母线状态监控 - 监控汇流排B电压电流及断路器状态 + 3. 仪表主母线状态监控 - 显示仪表母线电压电流及配电状态 + 4. 仪表母线状态监控 - 监控应急电源系统状态 + 5. 配电指令控制 - 支持远程断路器合分操作 + 6. 数据记录 - 所有状态数据自动保存到SQLite数据库 + 7. 模拟模式 - 支持离线模拟测试 + + 通信协议: + - 采用UDP协议与分布式系统通信 + - 消息ID范围:0x0001-0x0008 + - 支持实时状态反馈和指令下发 + + 操作说明: + 1. 主界面显示各母线实时状态 + 2. 通过菜单栏可打开各配电控制面板 + 3. 断路器状态:黄色=合闸,黑色=分闸,红色=故障 + 4. 启用模拟模式可进行离线测试 + + 注意事项: + - 操作前请确认系统连接正常 + - 重要操作需双重确认 + - 定期检查数据库存储状态""" + + text_widget.insert("1.0", help_text) + text_widget.config(state="disabled") # 设置为只读 + + # 关闭按钮 + close_btn = ttk.Button(popup, text="关闭", command=popup.destroy) + close_btn.pack(pady=10) + if __name__ == "__main__": root = tk.Tk() app = PowerManagerApp(root) diff --git a/test/disSysTest/PowerManagerApp.py b/test/disSysTest/PowerManagerApp.py index 0c778d2..777a01e 100644 --- a/test/disSysTest/PowerManagerApp.py +++ b/test/disSysTest/PowerManagerApp.py @@ -59,8 +59,8 @@ class PowerManagerApp: # self.udp_control_host = "127.0.0.1" # 下位机端口 - # self.udp_ip = "127.0.0.1" - self.udp_ip = "192.168.0.140" + self.udp_ip = "127.0.0.1" + # self.udp_ip = "192.168.0.140" self.udp_port = 7000 self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) self.sock.bind((self.udp_ip, self.udp_port)) @@ -1666,4 +1666,4 @@ if __name__ == "__main__": root.protocol("WM_DELETE_WINDOW", app.on_closing) print('start') root.mainloop() - print('end') + print('end') \ No newline at end of file diff --git a/test/disSysTest/ccuMsg.py b/test/disSysTest/ccuMsg.py new file mode 100644 index 0000000..f3b91e6 --- /dev/null +++ b/test/disSysTest/ccuMsg.py @@ -0,0 +1,636 @@ +import struct +import datetime + +class msg_ccUFbMsg: + def __init__(self): + # 消息头 + self.start1 = 0x20 + self.start2 = 0x20 + self.id = 0x0051 # CCU_STATE_FB_ID + self.length = 0 + self.checkCode = 0x00 + + # CCU状态数据 - 根据ccuState结构体定义 + self.fc_mode = 0x00 + self.fc_status = 0x00 + self.fc_fault_level = 0x00 + + self.output_power_limit = 0 + self.total_generation_time = 0 + self.total_generation_power = 0 + self.fault_level_1 = 0 + self.fault_level_2 = 0 + self.fault_level_3 = 0 + self.fault_level_4 = 0 + + self.hydrogen_capacity = 0 + self.liquid_oxygen_capacity = 0 + + self.palladium_temp = 0 + self.main_pipe_pressure = 0 + self.aux_pipe_pressure = 0 + + self.cabin_pressure1 = 0 + self.cabin_pressure2 = 0 + self.cabin_temp1 = 0 + self.cabin_temp2 = 0 + self.cabin_humidity1 = 0 + self.cabin_humidity2 = 0 + + self.flame_detector1 = 0x00 + self.flame_detector2 = 0x00 + + self.h2_concentration1 = 0 + self.h2_concentration2 = 0 + self.h2_concentration3 = 0 + self.o2_concentration1 = 0 + self.o2_concentration2 = 0 + self.ch3oh_concentration1 = 0 + self.ch3oh_concentration2 = 0 + + self.reserved1 = [0, 0] + self.emergency_battery1_voltage = 0 + self.emergency_battery1_current = 0 + self.emergency_battery1_max_temp = 0 + self.emergency_battery1_fault_word = 0 + self.emergency_battery2_voltage = 0 + self.emergency_battery2_current = 0 + self.emergency_battery2_max_temp = 0 + self.emergency_battery2_fault_word = 0 + + self.cabin_ox_concentration = 0 + self.cabin_temperature = 0 + self.cabin_humidity = 0 + self.cabin_pressure = 0 + + self.power_cabin_ox_concentration = 0 + self.power_cabin_temperature = 0 + self.power_cabin_humidity = 0 + self.power_cabin_pressure = 0 + self.reserved2 = [0] + + self.dyn_alarm_flag = [0] * 6 + self.ins_alarm_flag = [0] * 6 + + self.ins_relay_status1 = 0x00 + self.ins_relay_status2 = 0x00 + self.dyn_relay_status1 = 0x00 + self.dyn_relay_status2 = 0x00 + + self.ins_max_discharge_power = 0 + self.dyn_max_discharge_power = 0 + + self.ins_soc = 0 + self.dyn_soc = 0 + + self.ins_total_energy = 0 + self.dyn_total_energy = 0 + + self.ins_power_input = 0 + self.dyn_power_input = 0 + + self.ins_charge_status = 0x00 + self.dyn_charge_status = 0x00 + + self.ins_voltage_link = 0 + self.ins_voltage_pack = 0 + self.ins_current = 0 + self.ins_resistance_pos = 0 + self.ins_resistance_neg = 0 + + self.dyn_voltage_link = 0 + self.dyn_voltage_pack = 0 + self.dyn_current = 0 + self.dyn_resistance_pos = 0 + self.dyn_resistance_neg = 0 + + self.ins_emergency_status = 0x00 + self.dyn_emergency_status = 0x00 + + self.reserved3 = [0] * 2 + + self.ins_soc_threshold1 = 0 + self.ins_soc_threshold2 = 0 + self.ins_soc_threshold3 = 0 + self.dyn_soc_threshold1 = 0 + self.dyn_soc_threshold2 = 0 + self.dyn_soc_threshold3 = 0 + + self.ins_power_limit1 = 0 + self.ins_power_limit2 = 0 + self.dyn_power_limit1 = 0 + self.dyn_power_limit2 = 0 + + self.device_online_flag1 = 0 + self.device_online_flag2 = 0 + + self.dyn_charge_level = 0x00 + self.dyn_water_leak_status = 0x00 + self.ins_water_leak_dcdc_status = 0x00 + self.reserved4 = 0x00 + self.heartbeat = 0 + + def pack(self): + """打包消息为字节数据""" + # 重置校验码 + self.checkCode = 0x00 + + # 打包消息头 + data = struct.pack(' +#include +#include +#include +#include "../../src/pPowerManger/sqlit3/SQLite.h" + +// 简单的测试框架 +#define TEST_CASE(name) void test_##name() +#define RUN_TEST(name) \ + std::cout << "Running test: " << #name << std::endl; \ + test_##name(); \ + std::cout << "Test " << #name << " passed!" << std::endl + +// 测试数据生成函数 +ccuState createTestCcuState() { + ccuState state = {}; + + // 填充一些测试数据 + state.fc_mode = 2; // 自动模式 + state.fc_status = 6; // 运行状态 + state.fc_fault_level = 0; // 无故障 + + state.output_power_limit = 15000; + state.total_generation_time = 100; + state.total_generation_power = 50000; + + state.hydrogen_capacity = 80; + state.liquid_oxygen_capacity = 75; + + state.palladium_temp = 450; + state.main_pipe_pressure = 1000; + state.aux_pipe_pressure = 800; + + state.cabin_pressure1 = 1013; + state.cabin_pressure2 = 1012; + state.cabin_temp1 = 2500; + state.cabin_temp2 = 2490; + state.cabin_humidity1 = 6000; + state.cabin_humidity2 = 6100; + + state.flame_detector1 = 0; + state.flame_detector2 = 0; + + state.h2_concentration1 = 50; + state.h2_concentration2 = 48; + state.h2_concentration3 = 52; + state.o2_concentration1 = 2100; + state.o2_concentration2 = 2090; + + state.emergency_battery1_voltage = 480; + state.emergency_battery1_current = 25; + state.emergency_battery1_max_temp = 35; + + state.ins_soc = 85; + state.dyn_soc = 90; + + state.heartbeat = 12345; + + return state; +} + +ccuColCmd createTestCcuColCmd() { + ccuColCmd cmd = {}; + cmd.fcmode = 2; + cmd.fcuCmd = 2; + cmd.fcuPowerEfficiency = 80; + cmd.insChargeEnable = 1; + cmd.insBatCmd = 1; + cmd.powerBatCmd = 1; + cmd.powerBatEfficiency = 85; + cmd.heartbeat = 123; // 修复unsigned char溢出警告 + cmd.masterState = 1; + return cmd; +} + +disHighVolBusState createTestDisHighVolBusState() { + disHighVolBusState state = {}; + state.fuelCellCircuitBreaker = 0x55; + state.powerLithiumBatteryCircuitBreaker = 0x55; + state.propulsionMotorCircuitBreaker = 0x55; + state.powerBusVoltage = 4800; + state.dcDc5ModuleCurrent = 100; + state.powerBusCurrent = 500; + state.busbarAVoltage = 4750; + return state; +} + +disHighAVolBusState createTestDisHighAVolBusState() { + disHighAVolBusState state = {}; + state.bowFTDevice123CircuitBreaker = 0x55; + state.actuatorCircuitBreaker = 0x55; + state.busbarBVoltage = 4800; + state.busbarBCurrent = 200; + return state; +} + +disLowMainBusState createTestDisLowMainBusState() { + disLowMainBusState state = {}; + state.lithiumBatteryGroupInstrumentCircuitBreaker = 0x55; + state.bowLowVoltageDistributionBoxCircuitBreaker = 0x55; + state.instrumentBusbarVoltage = 480; + state.bowLowVoltageDistributionBoxCurrent = 50; + return state; +} + +disLowBusState createTestDisLowBusState() { + disLowBusState state = {}; + state.unit1CircuitBreaker = 0x55; + state.unit2CircuitBreaker = 0x55; + state.instrumentBusbarVoltage = 480; + state.instrumentBusbarCurrent = 100; + return state; +} + +disHighVolBusCmd createTestDisHighVolBusCmd() { + disHighVolBusCmd cmd = {}; + cmd.fuelCellCircuitBreaker = 0x55; + cmd.powerLithiumBatteryCircuitBreaker = 0x55; + cmd.propulsionMotorCircuitBreaker = 0x55; + cmd.dcdc5Module = 1; + cmd.coolingSystem = 1; + return cmd; +} + +disHighAVolBusCmd createTestDisHighAVolBusCmd() { + disHighAVolBusCmd cmd = {}; + cmd.bowFTDevice123CircuitBreaker = 0x55; + cmd.actuatorCircuitBreaker = 0x55; + return cmd; +} + +disLowMainBusCmd createTestDisLowMainBusCmd() { + disLowMainBusCmd cmd = {}; + cmd.lithiumBatteryGroupInstrumentCircuitBreaker = 0x55; + cmd.bowLowVoltageDistributionBoxCircuitBreaker = 0x55; + return cmd; +} + +disLowBusCmd createTestDisLowBusCmd() { + disLowBusCmd cmd = {}; + cmd.unit1CircuitBreaker = 0x55; + cmd.unit2CircuitBreaker = 0x55; + return cmd; +} + +// 测试用例 +TEST_CASE(constructor_and_destructor) { + // 测试正常构造 + SQLite db(":memory:"); + assert(db.m_dbPath == ":memory:"); + + // 测试无效路径 + SQLite invalidDb("/invalid/path/test.db"); + // 这里应该检查数据库是否成功打开,但由于是内存数据库,我们主要测试构造函数不崩溃 +} + +TEST_CASE(create_table) { + SQLite db(":memory:"); + + // 测试创建默认表 + bool result = db.createTable(); + assert(result == true); + + // 测试创建自定义表 + result = db.createTable("test_table", "id INTEGER PRIMARY KEY, name TEXT"); + assert(result == true); +} + +TEST_CASE(insert_ccu_state) { + SQLite db(":memory:"); + db.createTable(); + + ccuState state = createTestCcuState(); + bool result = db.insertData(state); + assert(result == true); +} + +TEST_CASE(insert_ccu_col_cmd) { + SQLite db(":memory:"); + db.createTable(); + + ccuColCmd cmd = createTestCcuColCmd(); + bool result = db.insertData(cmd); + assert(result == true); +} + +TEST_CASE(insert_dis_high_vol_bus_state) { + SQLite db(":memory:"); + db.createTable(); + + disHighVolBusState state = createTestDisHighVolBusState(); + bool result = db.insertData(state); + assert(result == true); +} + +TEST_CASE(insert_dis_high_a_vol_bus_state) { + SQLite db(":memory:"); + db.createTable(); + + disHighAVolBusState state = createTestDisHighAVolBusState(); + bool result = db.insertData(state); + assert(result == true); +} + +TEST_CASE(insert_dis_low_main_bus_state) { + SQLite db(":memory:"); + db.createTable(); + + disLowMainBusState state = createTestDisLowMainBusState(); + bool result = db.insertData(state); + assert(result == true); +} + +TEST_CASE(insert_dis_low_bus_state) { + SQLite db(":memory:"); + db.createTable(); + + disLowBusState state = createTestDisLowBusState(); + bool result = db.insertData(state); + assert(result == true); +} + +TEST_CASE(insert_dis_high_vol_bus_cmd) { + SQLite db(":memory:"); + db.createTable(); + + disHighVolBusCmd cmd = createTestDisHighVolBusCmd(); + bool result = db.insertData(cmd); + assert(result == true); +} + +TEST_CASE(insert_dis_high_a_vol_bus_cmd) { + SQLite db(":memory:"); + db.createTable(); + + disHighAVolBusCmd cmd = createTestDisHighAVolBusCmd(); + bool result = db.insertData(cmd); + assert(result == true); +} + +TEST_CASE(insert_dis_low_main_bus_cmd) { + SQLite db(":memory:"); + db.createTable(); + + disLowMainBusCmd cmd = createTestDisLowMainBusCmd(); + bool result = db.insertData(cmd); + assert(result == true); +} + +TEST_CASE(insert_dis_low_bus_cmd) { + SQLite db(":memory:"); + db.createTable(); + + disLowBusCmd cmd = createTestDisLowBusCmd(); + bool result = db.insertData(cmd); + assert(result == true); +} + +TEST_CASE(multiple_inserts) { + SQLite db(":memory:"); + db.createTable(); + + // 插入多种类型的数据 + ccuState state = createTestCcuState(); + assert(db.insertData(state) == true); + + ccuColCmd cmd = createTestCcuColCmd(); + assert(db.insertData(cmd) == true); + + disHighVolBusState busState = createTestDisHighVolBusState(); + assert(db.insertData(busState) == true); +} + +TEST_CASE(invalid_database) { + // 测试无效数据库路径 + SQLite db("/invalid/path/test.db"); + + // 尝试创建表应该失败 + bool result = db.createTable(); + assert(result == false); + + // 尝试插入数据应该失败 + ccuState state = createTestCcuState(); + result = db.insertData(state); + assert(result == false); +} + +int main() { + std::cout << "Starting SQLite database tests..." << std::endl; + + try { + RUN_TEST(constructor_and_destructor); + RUN_TEST(create_table); + RUN_TEST(insert_ccu_state); + RUN_TEST(insert_ccu_col_cmd); + RUN_TEST(insert_dis_high_vol_bus_state); + RUN_TEST(insert_dis_high_a_vol_bus_state); + RUN_TEST(insert_dis_low_main_bus_state); + RUN_TEST(insert_dis_low_bus_state); + RUN_TEST(insert_dis_high_vol_bus_cmd); + RUN_TEST(insert_dis_high_a_vol_bus_cmd); + RUN_TEST(insert_dis_low_main_bus_cmd); + RUN_TEST(insert_dis_low_bus_cmd); + RUN_TEST(multiple_inserts); + RUN_TEST(invalid_database); + + std::cout << "\nAll tests passed successfully!" << std::endl; + return 0; + } catch (const std::exception& e) { + std::cerr << "Test failed with exception: " << e.what() << std::endl; + return 1; + } catch (...) { + std::cerr << "Test failed with unknown exception" << std::endl; + return 1; + } +}