- 新增 pCCU 复合管控器程序(src/pCCU):FC/PM 双链路(UDP)、协议编解码器 (FcProtocol/PmProtocol/Frame/Message/MessageRegistry)、快照与落库(DbStore)、 内置 WebServer;挂入 src/CMakeLists.txt 与板卡 mission(h100.moos) - 惯导/深度数据:新增 uDevice_insData 消息解析,接入 UpperCommManager, pPowerMangerHost 注册监视,UpmsgTest 覆盖 - pPowerMangerHost 设备控制页增强(web/index.html) - 部署/运维脚本改为 4 个 systemd 服务(moosdb/pPowerManger/pPowerMangerHost/pCCU): deploy/clean-data/fetch-data 同步适配 - 协议文档:归档 0824 控制主机与复合管控器通信协议 xlsx 及关联 docx,移除旧 md - 测试:新增 pccu 单元/集成测试与 disSysTest Python 配电仿真 - 清理:移除未使用的 CCU 状态调试打印 coutMsg;.gitignore 补充编译产物/临时文件忽略
135 lines
5.0 KiB
C++
135 lines
5.0 KiB
C++
//=======================================================================
|
|
// UpmsgTest: 上位机/外部通信 JSON 消息解析与序列化往返
|
|
// 仅链接现有 upmsg/*.h + upmsg_definitions.cpp。
|
|
// 注意:部分 upmsg 头文件未包含 json/loguru/pmSysvariable,需先包含。
|
|
//=======================================================================
|
|
#include <gtest/gtest.h>
|
|
#include "json/json.h"
|
|
#include "logc/loguru.hpp"
|
|
#include "pmSysvariable.h"
|
|
#include "upmsg/uPower_sysState.h"
|
|
#include "upmsg/uExternComm_setOpMode.h"
|
|
#include "upmsg/uExternComm_setOpCondition.h"
|
|
#include "upmsg/uExternComm_setPowerSystem.h"
|
|
#include "upmsg/uExternComm_setDeviceSwitch.h"
|
|
#include "upmsg/uPlan_taskStart.h"
|
|
#include "upmsg/uPlan_planStop.h"
|
|
#include "upmsg/uDetect_xcVoltage_cmd.h"
|
|
#include "upmsg/uDetect_zdpVoltage_cmd.h"
|
|
#include "upmsg/uDevice_insData.h"
|
|
|
|
TEST(UpmsgTest, PowerSysStateParse)
|
|
{
|
|
uPower_sysStateMsg msg;
|
|
MSControlCmd cmd;
|
|
EXPECT_TRUE(msg.parseControlCmdFromJson(cmd, R"({"powerCMD":1,"modCMD":2,"workCMD":5})"));
|
|
EXPECT_EQ(cmd.powerCMD, 1u);
|
|
EXPECT_EQ(cmd.modCMD, 2u);
|
|
EXPECT_EQ(cmd.workCMD, 5u);
|
|
// 缺字段 → false
|
|
EXPECT_FALSE(msg.parseControlCmdFromJson(cmd, R"({"powerCMD":1})"));
|
|
// 非法 JSON → false
|
|
EXPECT_FALSE(msg.parseControlCmdFromJson(cmd, "{bad json"));
|
|
}
|
|
|
|
TEST(UpmsgTest, SetOpMode)
|
|
{
|
|
uExternComm_setOpModeMsg msg;
|
|
EXPECT_EQ(msg.getSetOpMode("uExternComm_setOpMode_cmd", R"({"state_uint8":1})"), 1);
|
|
EXPECT_EQ(msg.getSetOpMode("uExternComm_setOpMode_cmd", R"({})"), -1);
|
|
EXPECT_EQ(msg.getSetOpMode("wrong_key", R"({"state_uint8":1})"), 0); // key 不匹配 → 0
|
|
}
|
|
|
|
TEST(UpmsgTest, SetOpCondition)
|
|
{
|
|
uExternComm_setOpConditionMsg msg;
|
|
EXPECT_EQ(msg.getSetOpCondition("uExternComm_setOpCondition_cmd", R"({"state_uint8":7})"), 7);
|
|
EXPECT_EQ(msg.getSetOpCondition("uExternComm_setOpCondition_cmd", R"({})"), -1);
|
|
}
|
|
|
|
TEST(UpmsgTest, SetPowerSystem)
|
|
{
|
|
uExternComm_setPowerSystemMsg msg;
|
|
EXPECT_EQ(msg.getSetPMSys("uExternComm_setPowerSystem_cmd", R"({"powerCmd_uint8":4})"), 4);
|
|
EXPECT_EQ(msg.getSetPMSys("uExternComm_setPowerSystem_cmd", R"({})"), -1);
|
|
}
|
|
|
|
TEST(UpmsgTest, SetDeviceSwitch)
|
|
{
|
|
uExternComm_setDeviceSwitchMsg msg;
|
|
DeviceSwitchCmd c = msg.getSetDevSwitch("uExternComm_setDeviceSwitch_cmd",
|
|
R"({"id_uint8":53,"cmd_uint8":1})");
|
|
EXPECT_EQ(c.id, 53);
|
|
EXPECT_EQ(c.cmd, 1);
|
|
// 空对象 → id=-1
|
|
DeviceSwitchCmd c2 = msg.getSetDevSwitch("uExternComm_setDeviceSwitch_cmd", R"({})");
|
|
EXPECT_EQ(c2.id, -1);
|
|
}
|
|
|
|
TEST(UpmsgTest, TaskStart)
|
|
{
|
|
uPlan_taskStartMsg msg;
|
|
MissionState m = msg.getMission("uPlan_taskStart_st",
|
|
R"({"taskType_str":"sail","balanceEnabled_bool":true,"bowRudderUnfold_bool":false})");
|
|
EXPECT_EQ(m.type, (int)TaskType::SAIL);
|
|
EXPECT_TRUE(m.enableBuoyancyAdjustment);
|
|
EXPECT_FALSE(m.enableBowRudder);
|
|
}
|
|
|
|
TEST(UpmsgTest, TaskStop)
|
|
{
|
|
uPlan_planStopMsg msg;
|
|
EXPECT_TRUE(msg.getTaskStop("uPlan_planStop_st", R"({"op_int32":1})"));
|
|
EXPECT_FALSE(msg.getTaskStop("uPlan_planStop_st", R"({"op_int32":0})"));
|
|
EXPECT_FALSE(msg.getTaskStop("uPlan_planStop_st", R"({})"));
|
|
}
|
|
|
|
TEST(UpmsgTest, XcVoltageRoundTrip)
|
|
{
|
|
uDetect_xcVoltage_cmd cmd;
|
|
cmd.xcLowVoltageAdd_int32 = 1;
|
|
cmd.xcHighVoltageAdd_int32 = 2;
|
|
std::string json = cmd.toJsonString();
|
|
uDetect_xcVoltage_cmd cmd2;
|
|
EXPECT_TRUE(cmd2.fromJsonString(json));
|
|
EXPECT_EQ(cmd2.xcLowVoltageAdd_int32, 1);
|
|
EXPECT_EQ(cmd2.xcHighVoltageAdd_int32, 2);
|
|
EXPECT_FALSE(cmd2.fromJsonString("{bad json"));
|
|
}
|
|
|
|
TEST(UpmsgTest, ZdpVoltageRoundTrip)
|
|
{
|
|
uDetect_zdpVoltage_cmd cmd;
|
|
cmd.zdpVoltageAdd_int32 = 2;
|
|
std::string json = cmd.toJsonString();
|
|
uDetect_zdpVoltage_cmd cmd2;
|
|
EXPECT_TRUE(cmd2.fromJsonString(json));
|
|
EXPECT_EQ(cmd2.zdpVoltageAdd_int32, 2);
|
|
}
|
|
|
|
TEST(UpmsgTest, InsDataParse)
|
|
{
|
|
uDevice_insDataMsg msg;
|
|
InsDataState st;
|
|
EXPECT_EQ(msg.parseMsg("uDevice_insData_st",
|
|
R"({"headingAngle_int32":1200,"rollAngle_int32":-50,"pitchAngle_int32":30,"depth_int32":1500,
|
|
"headingAngularVelocity_int32":10,"rollAngularVelocity_int32":-1,"longAngularVelocity_int32":2,
|
|
"lon_int32":113123,"lat_int32":22123,"northSpeed_int16":12,"eastSpeed_int16":-3,"zSpeed_int16":1})",
|
|
st), 1);
|
|
EXPECT_EQ(st.headingAngle_int32, 1200);
|
|
EXPECT_EQ(st.rollAngle_int32, -50);
|
|
EXPECT_EQ(st.pitchAngle_int32, 30);
|
|
EXPECT_EQ(st.depth_int32, 1500);
|
|
EXPECT_EQ(st.headingAngularVelocity_int32, 10);
|
|
EXPECT_EQ(st.northSpeed_int16, 12);
|
|
// key 不匹配 → 0
|
|
EXPECT_EQ(msg.parseMsg("wrong_key", R"({"headingAngle_int32":1})", st), 0);
|
|
// 非法 JSON → -1
|
|
EXPECT_EQ(msg.parseMsg("uDevice_insData_st", "{bad json", st), -1);
|
|
// 缺字段 → 解析成功但保持缺省值
|
|
InsDataState st2;
|
|
EXPECT_EQ(msg.parseMsg("uDevice_insData_st", R"({"headingAngle_int32":99})", st2), 1);
|
|
EXPECT_EQ(st2.headingAngle_int32, 99);
|
|
EXPECT_EQ(st2.depth_int32, 0);
|
|
}
|