Browse Source

添加调试页面

storage-in-realtime
zhaohe 12 months ago
parent
commit
3254f98104
  1. 15
      TESTCMD.md
  2. 3
      app_protocols/apperrorcode/apperrorcode.hpp
  3. 31736
      appdep/iflytop/core/basic/nlohmann/json.hpp
  4. 2
      appsrc/appbase/appbean/disinfection_record_csv_header.cpp
  5. 27
      appsrc/appbase/appbean/disinfection_record_csv_header.hpp
  6. 2
      appsrc/appbase/appbean/disinfection_state.hpp
  7. 1
      appsrc/appbase/appbean/setting_id.hpp
  8. 3
      appsrc/appbase/appbean/test_page_iterm.cpp
  9. 13
      appsrc/appbase/appbean/test_page_iterm.hpp
  10. 10
      appsrc/appbase/utils/zdictionary.hpp
  11. 17
      appsrc/baseservice/iflytop_front_end_service/iflytop_front_end_service.cpp
  12. 4
      appsrc/baseservice/iflytop_front_end_service/iflytop_front_end_service.hpp
  13. 106
      appsrc/service/disinfection_logs_service.cpp
  14. 171
      appsrc/service/test_page_mgr_service.cpp
  15. 10
      appsrc/service/test_page_mgr_service.hpp
  16. 86
      appsrc/service/testpage/test_page_item.hpp
  17. 204
      appsrc/service/testpage/test_page_processer.cpp
  18. 60
      appsrc/service/testpage/test_page_processer.hpp

15
TESTCMD.md

@ -0,0 +1,15 @@
# 测试指令
## 测试页面
### 读取配置
```json
{
"messageType": "Command",
"fnName": "getTestPageCfgInfo",
"className": "TestPageMgrService",
"messageId":"1234",
"timeStamp": 1234
}
```

3
app_protocols/apperrorcode/apperrorcode.hpp

@ -59,6 +59,9 @@ typedef enum {
//
kappe_file_operate_error = 10015,
kappe_missing_param = 10016,
kappe_param_num_err = 10017,
} apperror_t;
}

31736
appdep/iflytop/core/basic/nlohmann/json.hpp
File diff suppressed because it is too large
View File

2
appsrc/appbase/appbean/disinfection_record_csv_header.cpp

@ -0,0 +1,2 @@
#include "disinfection_record_csv_header.hpp"
DisinfectionRecordCSVHeader_ZENUM_IMPL;

27
appsrc/appbase/appbean/disinfection_record_csv_header.hpp

@ -0,0 +1,27 @@
#pragma once
#include "iflytop/core/components/zenum_template/zenum_template.hpp"
#define DisinfectionRecordCSVHeader_ZENUM_IMPL ZENUM_IMPL(DisinfectionRecordCSVHeader, DisinfectionRecordCSVHeader_LIST)
#define DisinfectionRecordCSVHeader_LIST(type, marco) /**/ \
marco(type, time) /**/ \
marco(type, state) /**/ \
marco(type, ho2o2_0) /**/ \
marco(type, ho2o2_1) /**/ \
marco(type, ho2o2_2) /**/ \
marco(type, temp_0) /**/ \
marco(type, temp_1) /**/ \
marco(type, temp_2) /**/ \
marco(type, rh_0) /**/ \
marco(type, rh_1) /**/ \
marco(type, rh_2) /**/ \
marco(type, rs_0) /**/ \
marco(type, rs_1) /**/ \
marco(type, rs_2) /**/ \
marco(type, dval) /**/ \
marco(type, nlog) /**/ \
marco(type, tlog) /**/ \
marco(type, remaindisinfectant) /**/ \
marco(type, pumpvel) /**/ \
marco(type, reamintime) /**/
ZENUM_DECLAR(DisinfectionRecordCSVHeader, DisinfectionRecordCSVHeader_LIST);

2
appsrc/appbase/appbean/disinfection_state.hpp

@ -1,3 +1,5 @@
#pragma once
#include "iflytop/core/components/zenum_template/zenum_template.hpp"

1
appsrc/appbase/appbean/setting_id.hpp

@ -1,3 +1,4 @@
#pragma once
#include "iflytop/core/components/zenum_template/zenum_template.hpp"
#define SettingId_ZENUM_IMPL ZENUM_IMPL(SettingId, SettingId_LIST)

3
appsrc/appbase/appbean/test_page_iterm.cpp

@ -0,0 +1,3 @@
#include "test_page_iterm.hpp"
TestPageItermType_ZENUM_IMPL

13
appsrc/appbase/appbean/test_page_iterm.hpp

@ -0,0 +1,13 @@
#pragma once
#include "iflytop/core/components/zenum_template/zenum_template.hpp"
#define TestPageItermType_ZENUM_IMPL ZENUM_IMPL(TestPageItermType, TestPageItermType_LIST)
#define TestPageItermType_LIST(type, marco) /**/ \
marco(type, button) /**/ \
marco(type, buttons) /**/ \
marco(type, state) /**/ \
marco(type, states) /**/ \
marco(type, placeHolder) /**/
ZENUM_DECLAR(TestPageItermType, TestPageItermType_LIST);

10
appsrc/appbase/utils/zdictionary.hpp

@ -21,20 +21,22 @@ class ZDictionary {
private:
/* data */
map<int, ZDictionaryIterm> m_dict;
map<string, ZDictionaryIterm> m_dict;
public:
void insert(int key, string chName) {
void insert(string key, string chName) {
ZDictionaryIterm iterm;
iterm.chName = chName;
m_dict[key] = iterm;
}
string getChName(int key) {
string getChName(string key) { return getChName(key, key); }
string getChName(string key, string defaultval) {
if (m_dict.find(key) != m_dict.end()) {
return m_dict[key].chName;
} else {
return fmt::format("unkownkey({})", key);
return defaultval;
}
}
};

17
appsrc/baseservice/iflytop_front_end_service/iflytop_front_end_service.cpp

@ -59,7 +59,7 @@ void IflytopFrontEndService::startListen() {
logger->info("IflytopFrontEndService startListen");
}
void IflytopFrontEndService::sendReport(json& report) {
void IflytopFrontEndService::sendReport(json reportType, json report) {
if (!m_initialized) {
logger->error("IflytopFrontEndService not initialized");
return;
@ -71,6 +71,7 @@ void IflytopFrontEndService::sendReport(json& report) {
report["timeStamp"] = duration_cast<milliseconds>(system_clock::now().time_since_epoch()).count();
report["messageId"] = UUID().toString();
report["messageType"] = "Report";
report["reportType"] = reportType;
logger->debug("uplink msg: {}", report.dump());
auto clients = m_reportServer->getClients();
@ -87,6 +88,20 @@ void IflytopFrontEndService::sendReport(json& report) {
}
}
void IflytopFrontEndService::sendClassReport(string fromclass, string fromfn, json& content) {
json report;
report["fromClass"] = fromclass;
report["fromFn"] = fromfn;
report["content"] = content;
sendReport("classReport", report);
}
void IflytopFrontEndService::sendPrompt(string message) {
json report;
report["content"]["message"] = message;
sendReport("prompt", report);
}
void IflytopFrontEndService::onMessageCallback(weak_ptr<WebSocket> webSocket, shared_ptr<ConnectionState> connectionState, const ix::WebSocketMessagePtr& msg) {
if (msg->type == ix::WebSocketMessageType::Open) {
logger->info("New connection");

4
appsrc/baseservice/iflytop_front_end_service/iflytop_front_end_service.hpp

@ -51,7 +51,9 @@ class IflytopFrontEndService : public enable_shared_from_this<IflytopFrontEndSer
public:
void initialize(string ip = "0.0.0.0");
void startListen();
void sendReport(json& report);
void sendReport(json reportType, json report);
void sendClassReport(string fromclass, string fromfn, json& content);
void sendPrompt(string message);
private:
void onMessageCallback(weak_ptr<WebSocket> webSocket, shared_ptr<ConnectionState> connectionState, const ix::WebSocketMessagePtr& msg);

106
appsrc/service/disinfection_logs_service.cpp

@ -13,36 +13,16 @@
#include <sstream>
#include <string>
#include <vector>
#include "appbase/appbean/disinfection_record_csv_header.hpp"
using namespace std;
using namespace iflytop;
typedef DisinfectionRecordCSVHeader CSVHeader;
/*******************************************************************************
* STRUCT *
*******************************************************************************/
typedef enum {
ktime,
kstate,
kho2o2_0,
kho2o2_1,
kho2o2_2,
ktemp_0,
ktemp_1,
ktemp_2,
krh_0,
krh_1,
krh_2,
krs_0,
krs_1,
krs_2,
kdval,
knlog,
ktlog,
kremaindisinfectant,
kpumpvel,
kreamintime,
} dm_record_csv_header_t;
#define LOG_STORGE_PATH "./disinfection_logs/"
#define EXPORT_PATH "/mnt/exportdata/Transmit/"
#define IF_ERROR_RETURN(x) \
@ -137,26 +117,26 @@ void DisinfectionLogsService::initialize() {
REGFN(DisinfectionLogsService, exportRecord);
REGFN(DisinfectionLogsService, printRecord);
m_csvHeaderDict.insert(ktime, "时间");
m_csvHeaderDict.insert(kstate, "设备状态");
m_csvHeaderDict.insert(kho2o2_0, "HO2O2-0");
m_csvHeaderDict.insert(kho2o2_1, "HO2O2-1");
m_csvHeaderDict.insert(kho2o2_2, "HO2O2-2");
m_csvHeaderDict.insert(ktemp_0, "T-0");
m_csvHeaderDict.insert(ktemp_1, "T-1");
m_csvHeaderDict.insert(ktemp_2, "T-2");
m_csvHeaderDict.insert(krh_0, "RH-0");
m_csvHeaderDict.insert(krh_1, "RH-1");
m_csvHeaderDict.insert(krh_2, "RH-2");
m_csvHeaderDict.insert(krs_0, "RS-0");
m_csvHeaderDict.insert(krs_1, "RS-1");
m_csvHeaderDict.insert(krs_2, "RS-2");
m_csvHeaderDict.insert(kdval, "D值");
m_csvHeaderDict.insert(knlog, "当前LOG");
m_csvHeaderDict.insert(ktlog, "目标LOG");
m_csvHeaderDict.insert(kremaindisinfectant, "消毒剂剩余量(g)");
m_csvHeaderDict.insert(kpumpvel, "喷液泵(g/min)");
m_csvHeaderDict.insert(kreamintime, "预计剩余时间");
m_csvHeaderDict.insert(CSVHeader::time, "时间");
m_csvHeaderDict.insert(CSVHeader::state, "设备状态");
m_csvHeaderDict.insert(CSVHeader::ho2o2_0, "HO2O2-0");
m_csvHeaderDict.insert(CSVHeader::ho2o2_1, "HO2O2-1");
m_csvHeaderDict.insert(CSVHeader::ho2o2_2, "HO2O2-2");
m_csvHeaderDict.insert(CSVHeader::temp_0, "T-0");
m_csvHeaderDict.insert(CSVHeader::temp_1, "T-1");
m_csvHeaderDict.insert(CSVHeader::temp_2, "T-2");
m_csvHeaderDict.insert(CSVHeader::rh_0, "RH-0");
m_csvHeaderDict.insert(CSVHeader::rh_1, "RH-1");
m_csvHeaderDict.insert(CSVHeader::rh_2, "RH-2");
m_csvHeaderDict.insert(CSVHeader::rs_0, "RS-0");
m_csvHeaderDict.insert(CSVHeader::rs_1, "RS-1");
m_csvHeaderDict.insert(CSVHeader::rs_2, "RS-2");
m_csvHeaderDict.insert(CSVHeader::dval, "D值");
m_csvHeaderDict.insert(CSVHeader::nlog, "当前LOG");
m_csvHeaderDict.insert(CSVHeader::tlog, "目标LOG");
m_csvHeaderDict.insert(CSVHeader::remaindisinfectant, "消毒剂剩余量(g)");
m_csvHeaderDict.insert(CSVHeader::pumpvel, "喷液泵(g/min)");
m_csvHeaderDict.insert(CSVHeader::reamintime, "预计剩余时间");
m_dmStateDict.insert(DisinfectionState::idle, "空闲");
m_dmStateDict.insert(DisinfectionState::preheat, "预热");
@ -200,37 +180,37 @@ void DisinfectionLogsService::dumpDisinfectionRecord(string sessionId, list<shar
auto projSetting = m_projectSettingMgr->getProjectSetting();
for (auto& s : snapshots) {
csv.addValue(m_csvHeaderDict.getChName(ktime), /******************/ tu_sys::fmt(s->time, "%Y-%m-%d %H:%M:%S"));
csv.addValue(m_csvHeaderDict.getChName(kstate), /*****************/ m_dmStateDict.getChName(s->state));
csv.addValue(m_csvHeaderDict.getChName(kho2o2_0), /***************/ formatSensorVal(s->h2o2[0]));
csv.addValue(m_csvHeaderDict.getChName(ktemp_0), /****************/ formatSensorVal(s->temp[0]));
csv.addValue(m_csvHeaderDict.getChName(krh_0), /******************/ formatSensorVal(s->rh[0]));
csv.addValue(m_csvHeaderDict.getChName(krs_0), /******************/ formatSensorVal(s->rs[0]));
csv.addValue(m_csvHeaderDict.getChName(CSVHeader::time), /******************/ tu_sys::fmt(s->time, "%Y-%m-%d %H:%M:%S"));
csv.addValue(m_csvHeaderDict.getChName(CSVHeader::state), /*****************/ m_dmStateDict.getChName(s->state));
csv.addValue(m_csvHeaderDict.getChName(CSVHeader::ho2o2_0), /***************/ formatSensorVal(s->h2o2[0]));
csv.addValue(m_csvHeaderDict.getChName(CSVHeader::temp_0), /****************/ formatSensorVal(s->temp[0]));
csv.addValue(m_csvHeaderDict.getChName(CSVHeader::rh_0), /******************/ formatSensorVal(s->rh[0]));
csv.addValue(m_csvHeaderDict.getChName(CSVHeader::rs_0), /******************/ formatSensorVal(s->rs[0]));
if (projSetting->extSensorNum >= 1) {
csv.addValue(m_csvHeaderDict.getChName(kho2o2_1), /***************/ formatSensorVal(s->h2o2[1]));
csv.addValue(m_csvHeaderDict.getChName(ktemp_1), /****************/ formatSensorVal(s->temp[1]));
csv.addValue(m_csvHeaderDict.getChName(krh_1), /******************/ formatSensorVal(s->rh[1]));
csv.addValue(m_csvHeaderDict.getChName(krs_1), /******************/ formatSensorVal(s->rs[1]));
csv.addValue(m_csvHeaderDict.getChName(CSVHeader::ho2o2_1), /***************/ formatSensorVal(s->h2o2[1]));
csv.addValue(m_csvHeaderDict.getChName(CSVHeader::temp_1), /****************/ formatSensorVal(s->temp[1]));
csv.addValue(m_csvHeaderDict.getChName(CSVHeader::rh_1), /******************/ formatSensorVal(s->rh[1]));
csv.addValue(m_csvHeaderDict.getChName(CSVHeader::rs_1), /******************/ formatSensorVal(s->rs[1]));
}
if (projSetting->extSensorNum >= 2) {
csv.addValue(m_csvHeaderDict.getChName(kho2o2_2), /***************/ formatSensorVal(s->h2o2[2]));
csv.addValue(m_csvHeaderDict.getChName(ktemp_2), /****************/ formatSensorVal(s->temp[2]));
csv.addValue(m_csvHeaderDict.getChName(krh_2), /******************/ formatSensorVal(s->rh[2]));
csv.addValue(m_csvHeaderDict.getChName(krs_2), /******************/ formatSensorVal(s->rs[2]));
csv.addValue(m_csvHeaderDict.getChName(CSVHeader::ho2o2_2), /***************/ formatSensorVal(s->h2o2[2]));
csv.addValue(m_csvHeaderDict.getChName(CSVHeader::temp_2), /****************/ formatSensorVal(s->temp[2]));
csv.addValue(m_csvHeaderDict.getChName(CSVHeader::rh_2), /******************/ formatSensorVal(s->rh[2]));
csv.addValue(m_csvHeaderDict.getChName(CSVHeader::rs_2), /******************/ formatSensorVal(s->rs[2]));
}
csv.addValue(m_csvHeaderDict.getChName(kdval), /******************/ fmt::format("{}", s->dval));
csv.addValue(m_csvHeaderDict.getChName(knlog), /******************/ fmt::format("{}", s->nlog));
csv.addValue(m_csvHeaderDict.getChName(ktlog), /******************/ fmt::format("{}", s->tlog));
csv.addValue(m_csvHeaderDict.getChName(CSVHeader::dval), /******************/ fmt::format("{}", s->dval));
csv.addValue(m_csvHeaderDict.getChName(CSVHeader::nlog), /******************/ fmt::format("{}", s->nlog));
csv.addValue(m_csvHeaderDict.getChName(CSVHeader::tlog), /******************/ fmt::format("{}", s->tlog));
// 拉杆箱消毒机没有消毒剂剩余量
if (projSetting->projectTypeInt != kdraw_bar_disinfection_box) {
csv.addValue(m_csvHeaderDict.getChName(kremaindisinfectant), /****/ fmt::format("{}", s->remainDisinfectant));
csv.addValue(m_csvHeaderDict.getChName(CSVHeader::remaindisinfectant), /****/ fmt::format("{}", s->remainDisinfectant));
}
csv.addValue(m_csvHeaderDict.getChName(kpumpvel), /***************/ fmt::format("{}", s->pumpVel));
csv.addValue(m_csvHeaderDict.getChName(kreamintime), /************/ fmt::format("{}", formattimeS(s->remainTime)));
csv.addValue(m_csvHeaderDict.getChName(CSVHeader::pumpvel), /***************/ fmt::format("{}", s->pumpVel));
csv.addValue(m_csvHeaderDict.getChName(CSVHeader::reamintime), /************/ fmt::format("{}", formattimeS(s->remainTime)));
}
system(fmt::format("mkdir -p {}", LOG_STORGE_PATH).c_str());

171
appsrc/service/test_page_mgr_service.cpp

@ -1,6 +1,13 @@
#include "test_page_mgr_service.hpp"
using namespace iflytop;
void TestPageMgrService::getTestPageCfgInfo(shared_ptr<MsgProcessContext> cxt) { cxt->content["items"] = m_testPageItemMgr.getPageCfgInfo(); }
void TestPageMgrService::onButton(shared_ptr<MsgProcessContext> cxt) { m_testPageItemMgr.processOnButton(cxt->params); }
void TestPageMgrService::readState(shared_ptr<MsgProcessContext> cxt) { cxt->content = m_testPageItemMgr.readState(); }
void TestPageMgrService::triggerOnePrompt(shared_ptr<MsgProcessContext> cxt) { GET_SERVICE(IflytopFrontEndService)->sendPrompt("测试Prompt"); }
void TestPageMgrService::startReportState(shared_ptr<MsgProcessContext> cxt) { m_testPageItemMgr.startReportState(1000); }
void TestPageMgrService::stopReportState(shared_ptr<MsgProcessContext> cxt) { m_testPageItemMgr.stopReportState(); }
void TestPageMgrService::initialize() {
GET_TO_SERVICE(m_db);
GET_TO_SERVICE(m_ds);
@ -9,106 +16,88 @@ void TestPageMgrService::initialize() {
REGFN(TestPageMgrService, onButton);
REGFN(TestPageMgrService, readState);
REGFN(TestPageMgrService, triggerOnePrompt);
}
REGFN(TestPageMgrService, startReportState);
REGFN(TestPageMgrService, stopReportState);
void TestPageMgrService::getTestPageCfgInfo(shared_ptr<MsgProcessContext> cxt) {
json content;
content["stateUpdatePeriod"] = 1000;
m_dict = make_shared<ZDictionary>();
m_dict->insert("pumpVel", "速度");
m_dict->insert("pumpDir", "方向");
m_dict->insert("sprayPumpCtrl", "喷液泵控制");
m_dict->insert("addDischargePumpCtrl", "加液泵控制");
m_dict->insert("airCompressorCtrl", "空压机控制");
m_dict->insert("blowerCtrl", "风机控制");
m_dict->insert("heatingCtrl", "加热片控制");
m_dict->insert("addingLiquid", "加液");
m_dict->insert("drainLiquid", "排液");
m_dict->insert("on", "打开");
m_dict->insert("off", "关闭");
m_dict->insert("AcCurrent", "空压机电流");
m_dict->insert("temperature", "温度");
m_dict->insert("current", "电流");
m_dict->insert("voltage", "电压");
m_dict->insert("heatingState", "加热片状态");
m_dict->insert("heatingTemperature", "加热片温度");
m_dict->insert("heatingCurrent", "加热片电流");
m_dict->insert("forward", "正转");
m_dict->insert("backward", "反转");
m_dict->insert("stop", "停止");
content["items"][0]["name"] = "addLiquidPumpCtrl";
content["items"][0]["displayName"] = "加液泵";
content["items"][0]["type"] = "button";
content["items"][0]["params"][0]["name"] = "vel";
content["items"][0]["params"][0]["displayName"] = "转速";
content["items"][0]["params"][0]["enumDisplayNames"][0] = "100";
content["items"][0]["params"][0]["enumDisplayNames"][1] = "200";
content["items"][0]["params"][0]["enum"][0] = "100";
content["items"][0]["params"][0]["enum"][1] = "200";
content["items"][0]["params"][0]["uint"] = "g/min";
content["items"][0]["params"][0]["default"] = "100";
m_testPageItemMgr.installDict(m_dict);
content["items"][0]["params"][1]["name"] = "direction";
content["items"][0]["params"][1]["displayName"] = "方向";
content["items"][0]["params"][1]["enumDisplayNames"][0] = "加液";
content["items"][0]["params"][1]["enumDisplayNames"][1] = "排液";
content["items"][0]["params"][1]["enum"][0] = "add";
content["items"][0]["params"][1]["enum"][1] = "remove";
content["items"][0]["params"][1]["default"] = "add";
// 喷液泵
m_testPageItemMgr.installParamType("pumpVel", "g/min", {"5", "10", "15"});
m_testPageItemMgr.insertButtons("sprayPumpCtrl", {"pumpVel"}, {"forward", "backward", "stop"}, [this](string buttonName, vector<string> param) { //
logger->info("sprayPumpCtrl on button.{} ({})", buttonName, param[0]);
});
content["items"][1]["name"] = "acCtrl";
content["items"][1]["displayName"] = "空压机";
content["items"][1]["type"] = "buttons";
content["items"][1]["buttons"][0] = "open";
content["items"][1]["buttons"][1] = "close";
content["items"][1]["buttonDisplayNames"][0] = "打开";
content["items"][1]["buttonDisplayNames"][1] = "关闭";
// 加液泵
m_testPageItemMgr.insertButtons("addDischargePumpCtrl", {}, {"addingLiquid", "drainLiquid"}, [this](string buttonName, vector<string> param) { //
logger->info("on addDischargePumpCtrl.{}", buttonName);
if (buttonName == "addingLiquid") {
} else if (buttonName == "drainLiquid") {
}
});
content["items"][2]["name"] = "acCurrent";
content["items"][2]["displayName"] = "空压机电流";
content["items"][2]["type"] = "state";
content["items"][2]["stateName"] = "acCurrent";
// 空压机
m_testPageItemMgr.insertButtons("airCompressorCtrl", {}, {"on", "off"}, [this](string buttonName, vector<string> param) { //
if (buttonName == "on") {
} else if (buttonName == "off") {
}
});
content["items"][3]["name"] = "pressureSensor";
content["items"][3]["displayName"] = "压力传感器";
content["items"][3]["type"] = "states";
content["items"][3]["displayNames"][0] = "压力计1";
content["items"][3]["displayNames"][1] = "压力计2";
content["items"][3]["displayNames"][2] = "压力计3";
content["items"][3]["stateNames"][0] = "pressure1";
content["items"][3]["stateNames"][1] = "pressure2";
content["items"][3]["stateNames"][2] = "pressure3";
// 空压机电流
m_testPageItemMgr.insertState("AcCurrent", [this](string stateName) { //
return "1.2";
});
content["items"][3]["stateNames"][2] = "pressure3";
// 风机
m_testPageItemMgr.insertButtons("blowerCtrl", {}, {"on", "off"}, [this](string buttonName, vector<string> param) { //
if (buttonName == "on") {
} else if (buttonName == "off") {
}
});
cxt->content = content;
}
void TestPageMgrService::onButton(shared_ptr<MsgProcessContext> cxt) {
/**
* @brief
*
* type name
* button itermName
* buttons itermName.button
*/
logger->info("onButton {}", cxt->cmd.dump(2));
string buttonName = cxt->cmd["params"]["buttonName"];
if (buttonName == "addLiquidPumpCtrl") {
string vel = cxt->cmd["params"]["vel"];
string direction = cxt->cmd["params"]["direction"];
logger->info("on addLiquidPumpCtrl vel:{} direction:{}", vel, direction);
} else if (buttonName == "acCtrl") {
string acCtrl = cxt->cmd["params"]["acCtrl"];
logger->info("on acCtrl:{}", acCtrl);
}
}
m_testPageItemMgr.insertState("blowerCurrent", [this](string stateName) { //
return "1.2";
});
void TestPageMgrService::readState(shared_ptr<MsgProcessContext> cxt) {
logger->info("readTestState {}", cxt->cmd.dump(2));
string stateName = cxt->cmd["params"]["stateName"];
if (stateName == "pressureSensor.pressure1") {
cxt->content["value"] = "100";
} else if (stateName == "pressureSensor.pressure2") {
cxt->content["value"] = "200";
} else if (stateName == "pressureSensor.pressure3") {
cxt->content["value"] = "300";
} else if (stateName == "acCurrent") {
cxt->content["value"] = "10";
}
}
// 加热片
m_testPageItemMgr.insertButtons("heatingCtrl", {}, {"on", "off"}, [this](string buttonName, vector<string> param) { //
if (buttonName == "on") {
} else if (buttonName == "off") {
}
});
void TestPageMgrService::triggerOnePrompt(shared_ptr<MsgProcessContext> cxt) {
// {
// "messageId":"1234",
// "timeStamp":1112312,
// "messageType":"Report",
// "eventType":"Prompt"
// "content":{
// "message":"测试提示信息"
// }
// }
m_testPageItemMgr.insertStates("heatingState", {"heatingTemperature", "heatingCurrent"}, [this](string stateName) { //
if (stateName == "temperature") {
return "25";
} else if (stateName == "current") {
return "1.2";
}
return "error";
});
json report;
report["eventType"] = "Prompt";
report["content"]["message"] = "测试提示信息.....";
GET_SERVICE(IflytopFrontEndService)->sendReport(report);
m_testPageItemMgr.onState.connect([this](json state) { //
GET_SERVICE(IflytopFrontEndService)->sendClassReport(thisClass.className, "onState", state);
});
}

10
appsrc/service/test_page_mgr_service.hpp

@ -9,8 +9,12 @@
#include <string>
#include <vector>
//
#include "appbase/appbean/test_page_iterm.hpp"
#include "baseservice/baseservice.hpp"
#include "testpage/test_page_processer.hpp"
namespace iflytop {
using namespace testpage;
class TestPageMgrService : public enable_shared_from_this<TestPageMgrService> {
THISCLASS(TestPageMgrService);
@ -19,6 +23,9 @@ class TestPageMgrService : public enable_shared_from_this<TestPageMgrService> {
unique_ptr<Thread> m_thread;
shared_ptr<ZDictionary> m_dict;
TestPageItemMgr m_testPageItemMgr;
public:
void initialize();
@ -26,6 +33,9 @@ class TestPageMgrService : public enable_shared_from_this<TestPageMgrService> {
void getTestPageCfgInfo(shared_ptr<MsgProcessContext> cxt);
void onButton(shared_ptr<MsgProcessContext> cxt);
void readState(shared_ptr<MsgProcessContext> cxt);
void startReportState(shared_ptr<MsgProcessContext> cxt);
void stopReportState(shared_ptr<MsgProcessContext> cxt);
void triggerOnePrompt(shared_ptr<MsgProcessContext> cxt);
private:

86
appsrc/service/testpage/test_page_item.hpp

@ -0,0 +1,86 @@
#pragma once
#include <fstream>
#include <iostream>
#include <list>
#include <map>
#include <memory>
#include <set>
#include <sstream>
#include <string>
#include <vector>
//
#include "appbase/appbean/test_page_iterm.hpp"
#include "baseservice/baseservice.hpp"
namespace iflytop {
namespace testpage {
typedef function<void(string buttonName, vector<string>)> onButton_t;
typedef function<string(string stateName)> readState_t;
class TestPageItem {
public:
TestPageItermType type;
string displayName;
string name;
TestPageItem(TestPageItermType t) : type(t) {}
virtual ~TestPageItem() {}
};
class Parameter {
public:
string name;
string displayName;
string uint;
vector<string> enums;
vector<string> enumDisplayNames;
NLOHMANN_DEFINE_TYPE_INTRUSIVE(Parameter, name, displayName, uint, enums, enumDisplayNames);
};
class Buttons : public TestPageItem {
public:
vector<Parameter> params;
vector<string> buttons;
vector<string> buttonDisplayNames;
onButton_t onButton;
Buttons() : TestPageItem(TestPageItermType::buttons) {}
NLOHMANN_DEFINE_TYPE_INTRUSIVE(Buttons, type, displayName, name, params, buttons, buttonDisplayNames);
};
// class Button : public TestPageItem {
// public:
// vector<Parameter> params;
// onButton_t onButton;
// Button() : TestPageItem(TestPageItermType::button) {}
// NLOHMANN_DEFINE_TYPE_INTRUSIVE(Button, type, displayName, name, params);
// };
class State : public TestPageItem {
public:
readState_t readState;
State() : TestPageItem(TestPageItermType::state) {}
NLOHMANN_DEFINE_TYPE_INTRUSIVE(State, type, displayName, name);
};
class States : public TestPageItem {
public:
vector<string> states;
vector<string> stateDisplayNames;
readState_t readState;
States() : TestPageItem(TestPageItermType::states) {}
NLOHMANN_DEFINE_TYPE_INTRUSIVE(States, type, displayName, name, states, stateDisplayNames);
};
// 换行
class PlaceHolder : public TestPageItem {
public:
PlaceHolder() : TestPageItem(TestPageItermType::placeHolder) {}
NLOHMANN_DEFINE_TYPE_INTRUSIVE(PlaceHolder, type, displayName, name);
};
} // namespace testpage
} // namespace iflytop

204
appsrc/service/testpage/test_page_processer.cpp

@ -0,0 +1,204 @@
#include "test_page_processer.hpp"
using namespace iflytop;
using namespace testpage;
#define TOJSON(typeClass, val) dynamic_pointer_cast<typeClass>(val) ? json(*dynamic_pointer_cast<typeClass>(val)) : json()
void TestPageItemMgr::initialize() {}
void TestPageItemMgr::installDict(shared_ptr<ZDictionary> dict) { this->dict = dict; }
void TestPageItemMgr::installParamType(string name, string uint, vector<string> enumItems, vector<string> displayNames) {
Parameter param;
param.name = name;
param.displayName = getDisplayVal(name);
param.uint = uint;
for (int i = 0; i < enumItems.size(); i++) {
param.enums.push_back(enumItems[i]);
if (displayNames.size() == 0) {
param.enumDisplayNames.push_back(getDisplayVal(enumItems[i]));
} else {
param.enumDisplayNames.push_back(displayNames[i]);
}
}
m_paramTypes[name] = param;
}
void TestPageItemMgr::insertButtons(string name, vector<string> params, vector<string> buttons, onButton_t onButton) {
shared_ptr<Buttons> item = make_shared<Buttons>();
item->name = name;
item->displayName = getDisplayVal(name);
item->buttons = buttons;
for (auto& p : params) {
Parameter para = getParamType(p);
item->params.push_back(para);
}
for (auto& b : buttons) {
item->buttonDisplayNames.push_back(getDisplayVal(b));
}
item->onButton = onButton;
insert(item);
}
// void TestPageItemMgr::insertButton(string name, vector<string> params, onButton_t onButton) {
// shared_ptr<Button> item = make_shared<Button>();
// item->name = name;
// for (auto& p : params) {
// Parameter para = getParamType(p);
// item->params.push_back(para);
// }
// item->onButton = onButton;
// insert(item);
// }
void TestPageItemMgr::insertState(string name, readState_t readState) {
shared_ptr<State> item = make_shared<State>();
item->name = name;
item->displayName = getDisplayVal(name);
item->readState = readState;
insert(item);
}
void TestPageItemMgr::insertStates(string name, vector<string> states, readState_t readStates) {
shared_ptr<States> item = make_shared<States>();
item->name = name;
item->displayName = getDisplayVal(name);
item->states = states;
item->readState = readStates;
// stateDisplayNames
for (auto& s : states) {
item->stateDisplayNames.push_back(getDisplayVal(s));
}
insert(item);
}
void TestPageItemMgr::insertPlaceHolder() {
shared_ptr<PlaceHolder> item = make_shared<PlaceHolder>();
item->name = "PlaceHolder";
insert(item);
}
string TestPageItemMgr::getDisplayVal(string name) {
if (!dict) return name;
string it = dict->getChName(name);
return it.empty() ? name : it;
}
Parameter TestPageItemMgr::getParamType(string name) {
auto it = m_paramTypes.find(name);
if (it == m_paramTypes.end()) {
THROW_APP_EXCEPTION(err::kappe_missing_param, "missing parameter %s", name.c_str());
}
return it->second;
}
void TestPageItemMgr::insert(shared_ptr<TestPageItem> item) { m_itemList.push_back(item); }
void TestPageItemMgr::processOnButton(json cmd) {
string itermName = cmd["itermName"];
string buttonName = cmd["buttonName"];
for (auto& it : m_itemList) {
shared_ptr<TestPageItem> item = it;
if (item->name != itermName) continue;
//
// if (item->type == TestPageItermType::button) {
// auto button = dynamic_pointer_cast<Button>(item);
// ZASSERT(button);
// ZASSERT(button->onButton);
// //
// if (button->name == buttonName) {
// button->onButton(buttonName, params);
// }
// }
//
// else
if (item->type == TestPageItermType::buttons) {
auto buttons = dynamic_pointer_cast<Buttons>(item);
ZASSERT(buttons);
ZASSERT(buttons->onButton);
vector<string> params;
for (auto& p : buttons->params) {
auto it = cmd.find(p.name);
if (it == cmd.end()) {
THROW_APP_EXCEPTION(err::kappe_missing_param, "missing parameter %s", p.name.c_str());
}
params.push_back(it->get<string>());
}
for (uint32_t i = 0; i < buttons->buttons.size(); i++) {
if (buttons->buttons[i] == buttonName) {
buttons->onButton(buttonName, params);
}
}
}
//
}
}
void TestPageItemMgr::startReportState(int interval) {
if (m_thread) m_thread->wake();
m_thread.reset(new Thread("TestPageItemMgr", [this, interval]() {
while (!m_thread->getExitFlag()) {
json state = readState();
onState(state);
m_thread->sleepForMs(interval * 1000);
}
}));
}
void TestPageItemMgr::stopReportState() {
if (m_thread) {
m_thread->wake();
m_thread->join();
}
}
json TestPageItemMgr::readState() {
json state;
for (auto& it : m_itemList) {
shared_ptr<TestPageItem> item = it;
// process state
if (item->type == TestPageItermType::state) {
//
shared_ptr<State> stateItem = dynamic_pointer_cast<State>(item);
ZASSERT(stateItem);
ZASSERT(stateItem->readState);
// read state
state[item->name][item->name] = stateItem->readState(item->name);
}
// process states
else if (item->type == TestPageItermType::states) {
//
shared_ptr<States> states = dynamic_pointer_cast<States>(item);
ZASSERT(states);
ZASSERT(states->readState);
// read state
for (uint32_t i = 0; i < states->states.size(); i++) {
state[item->name][states->states[i]] = states->readState(states->states[i]);
}
}
}
return state;
}
json TestPageItemMgr::getPageCfgInfo() {
json cfg;
for (auto& it : m_itemList) {
shared_ptr<TestPageItem> item = it;
json itemCfg;
if (item->type == TestPageItermType::button) {
// itemCfg = TOJSON(Button, item);
} else if (item->type == TestPageItermType::buttons) {
itemCfg = TOJSON(Buttons, item);
} else if (item->type == TestPageItermType::state) {
itemCfg = TOJSON(State, item);
} else if (item->type == TestPageItermType::states) {
itemCfg = TOJSON(States, item);
} else if (item->type == TestPageItermType::placeHolder) {
itemCfg = TOJSON(PlaceHolder, item);
}
cfg.push_back(itemCfg);
}
return cfg;
}

60
appsrc/service/testpage/test_page_processer.hpp

@ -0,0 +1,60 @@
#pragma once
#include <fstream>
#include <iostream>
#include <list>
#include <map>
#include <memory>
#include <set>
#include <sstream>
#include <string>
#include <vector>
//
#include "appbase/appbean/test_page_iterm.hpp"
#include "appbase/utils/zdictionary.hpp"
#include "baseservice/baseservice.hpp"
#include "test_page_item.hpp"
namespace iflytop {
namespace testpage {
class TestPageItemMgr {
THISCLASS(TestPageItemMgr);
private:
shared_ptr<ZDictionary> dict;
map<string, Parameter> m_paramTypes;
list<shared_ptr<TestPageItem>> m_itemList;
unique_ptr<Thread> m_thread;
public:
nod::signal<void(json state)> onState;
public:
void initialize();
void installDict(shared_ptr<ZDictionary> dict);
void installParamType(string name, string uint, vector<string> enumItems, vector<string> displayNames);
void installParamType(string name, string uint, vector<string> enumItems) { installParamType(name, uint, enumItems, {}); }
void insertButtons(string name, vector<string> buttons, vector<string> params, onButton_t onButton);
// void insertButton(string name, vector<string> params, onButton_t onButton);
void insertState(string name, readState_t readState);
void insertStates(string name, vector<string> states, readState_t readStates);
void insertPlaceHolder();
// ZDictionaryIterm
public:
void processOnButton(json cmd);
void startReportState(int interval);
void stopReportState();
json getPageCfgInfo();
json readState();
private:
void insert(shared_ptr<TestPageItem> item);
string getDisplayVal(string name);
Parameter getParamType(string name);
};
} // namespace testpage
} // namespace iflytop
Loading…
Cancel
Save