diff --git a/CMakeLists.txt b/CMakeLists.txt index 7cf09f6..5dbbe02 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -16,7 +16,7 @@ find_package(QT NAMES Qt6 Qt5 COMPONENTS Widgets REQUIRED) find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Widgets SerialPort Charts Concurrent REQUIRED) include_directories(libxsync/include) -include_directories(src) +include_directories(src) include_directories(./) include_directories(./app_protocols/) include_directories(libzqt) diff --git a/app_protocols/transmit_disfection_protocol b/app_protocols/transmit_disfection_protocol index 2793d57..57b758e 160000 --- a/app_protocols/transmit_disfection_protocol +++ b/app_protocols/transmit_disfection_protocol @@ -1 +1 @@ -Subproject commit 2793d57d7d94a044240958a8084b345369c1ef7a +Subproject commit 57b758e6dd94aaedd42606bd27da98437090d6dc diff --git a/src/app/transmit_disinfection/channel/transmit_disinfection_can_master.cpp b/src/app/transmit_disinfection/channel/transmit_disinfection_can_master.cpp index cd92ddf..7eda4af 100644 --- a/src/app/transmit_disinfection/channel/transmit_disinfection_can_master.cpp +++ b/src/app/transmit_disinfection/channel/transmit_disinfection_can_master.cpp @@ -4,7 +4,6 @@ using namespace iflytop; using namespace zscanprotocol; using namespace transmit_disfection_protocol; -#define DEFUALT_OVERTIME 30 void TransmitDisinfectionCanMaster::initialize(QTSerialChannel *ch) { m_com = new ZSCanProtocolCom(); diff --git a/src/app/transmit_disinfection/channel/transmit_disinfection_can_master.hpp b/src/app/transmit_disinfection/channel/transmit_disinfection_can_master.hpp index 4fd0280..e09aed4 100644 --- a/src/app/transmit_disinfection/channel/transmit_disinfection_can_master.hpp +++ b/src/app/transmit_disinfection/channel/transmit_disinfection_can_master.hpp @@ -16,6 +16,7 @@ #include "protocol/zscanprotocol_com/zscanprotocol_com.hpp" #include "transmit_disfection_protocol/transmit_disfection_protocol.hpp" #include "zqui/zqui/zqui.hpp" +#define DEFUALT_OVERTIME 30 namespace iflytop { using namespace std; @@ -35,6 +36,8 @@ class TransmitDisinfectionCanMaster { return m_instance; } + ZSCanProtocolCom *getCanProtocolCom() { return m_com; } + public: ack_read_board_info_data_t readboardinfo(int to); @@ -43,6 +46,15 @@ class TransmitDisinfectionCanMaster { void clear_reset_flag(int to); void pingAllBoard(); + void h2o2SensorReadCalibrationDate(int boardid, int32_t *year, int32_t *month, int32_t *day) { // + auto ret = m_com->callcmd0(boardid, kfn_h2o2_sensor_read_calibration_date); + *year = ret->getContent(0); + *month = ret->getContent(1); + *day = ret->getContent(2); + } + int h2o2SensorReadSubIcErrorcode(int boardid) { return m_com->callcmd0(boardid, kfn_h2o2_sensor_read_sub_ic_errorcode, DEFUALT_OVERTIME)->getContent(0); } + uint8_t *h2o2SensorReadSubIcReg(int boardid, int reg, int num) { return m_com->callcmd2(boardid, kfn_h2o2_sensor_read_sub_ic_reg, reg, num)->getByte(); } + /*********************************************************************************************************************** * PUMP * ***********************************************************************************************************************/ @@ -82,7 +94,7 @@ class TransmitDisinfectionCanMaster { int evaporationTankWSReadState(int boardid); int bottomWSReadState(int boardid); - int32_t psBusReadData(int boardid, int subid); + int32_t psBusReadData(int boardid, int subid); ack_psbus_scan_t psBusScan(int boardid); }; diff --git a/src/app/transmit_disinfection/large_space_disinfection_machine.cpp b/src/app/transmit_disinfection/large_space_disinfection_machine.cpp new file mode 100644 index 0000000..12341d4 --- /dev/null +++ b/src/app/transmit_disinfection/large_space_disinfection_machine.cpp @@ -0,0 +1,21 @@ +#include "large_space_disinfection_machine.hpp" + +#include "dep.hpp" +#include "utils/utils.hpp" + +using namespace iflytop; +using namespace zscanprotocol; +using namespace transmit_disfection_protocol; +using namespace app_transmit_disinfection; +using namespace std; + +/*********************************************************************************************************************** + * UTILS * + ***********************************************************************************************************************/ + +LargeSpaceDisinfectionMachine::LargeSpaceDisinfectionMachine(QWidget *parent) : TransmitDisinfection(parent) { + TabBuilder tabBuilder(this); + tabBuilder.buildLiquidCtrlBoardTab(ksmall_space_disinfection_machine); + tabBuilder.buildLiquidCtrlBoardPumpCtrlTab(ksmall_space_disinfection_machine); + tabBuilder.buildPowerControlBoardTab(ksmall_space_disinfection_machine); +} diff --git a/src/app/transmit_disinfection/large_space_disinfection_machine.hpp b/src/app/transmit_disinfection/large_space_disinfection_machine.hpp new file mode 100644 index 0000000..d5d80ab --- /dev/null +++ b/src/app/transmit_disinfection/large_space_disinfection_machine.hpp @@ -0,0 +1,16 @@ +#pragma once +#include + +#include "transmitdisinfection.hpp" +#include "zqui/zqui.hpp" + +namespace iflytop { +class LargeSpaceDisinfectionMachine : public TransmitDisinfection { + Q_OBJECT + + public: + explicit LargeSpaceDisinfectionMachine(QWidget *parent = nullptr); +}; +IMPL_APPBUILDER("大空间消毒机", LargeSpaceDisinfectionMachine) + +} // namespace iflytop diff --git a/src/app/transmit_disinfection/transmitdisinfection.cpp b/src/app/transmit_disinfection/transmitdisinfection.cpp index d6efcdf..c2255c7 100644 --- a/src/app/transmit_disinfection/transmitdisinfection.cpp +++ b/src/app/transmit_disinfection/transmitdisinfection.cpp @@ -9,6 +9,15 @@ using namespace transmit_disfection_protocol; using namespace app_transmit_disinfection; using namespace std; +static const char *fmt(const char *fmt, ...) { + va_list args; + va_start(args, fmt); + static char buf[1024] = {0}; + vsnprintf(buf, sizeof(buf), fmt, args); + va_end(args); + return buf; +} + #define CAN_MASTER TransmitDisinfectionCanMaster::ins() /*********************************************************************************************************************** @@ -29,6 +38,65 @@ TransmitDisinfection::TransmitDisinfection(QWidget *parent) : QTabWidget(parent) ZQUI::ins()->mainW()->setSerialDefaultBaudrate("2000000"); ErrorCodeInitializer().regErrorcodeInfo(); + + CAN_MASTER->getCanProtocolCom()->regOnRawData([this](packet_type_t type, uint8_t from, uint8_t to, uint8_t *hex, uint32_t hexlen) { + if (type == kcmd) { + zcanbus_packet_t *frame = (zcanbus_packet_t *)hex; + BSHOW("[CMD ] [%d->%d],%s", from, to, zhex2str(hex, hexlen).c_str()); // + } else if (type == kerror_receipt) { + BSHOW("[E-RECEIPT] [%d->%d],%s", from, to, zhex2str(hex, hexlen).c_str()); // + } else if (type == kreceipt) { + BSHOW("[RECEIPT ] [%d->%d],%s", from, to, zhex2str(hex, hexlen).c_str()); // + } else if (type == kreport) { + BSHOW("[REPORT ] [%d->%d],%s", from, to, zhex2str(hex, hexlen).c_str()); // + } + processReportPacket(type, from, to, hex, hexlen); + }); +} + +void TransmitDisinfection::processReportPacket(packet_type_t type, uint8_t from, uint8_t to, uint8_t *hex, uint32_t hexlen) { + if (type != kreport) { + return; + } + zcanbus_packet_t *frame = (zcanbus_packet_t *)hex; + + if (frame->function_id == kreport_heatpacket_pong) { + report_heatpacket_data_t *ack = (report_heatpacket_data_t *)frame->params; + RSHOW("[Heat ][FROM:%03d] HeatIndex:%x ToardType:%s flag:%x", from, ack->heartIndex, BoardTypeId2Str(ack->boardType), ack->flag); + } + // + else if (frame->function_id == kreport_exception_error) { + report_exeception_data_t *ack = (report_exeception_data_t *)frame->params; + RSHOW("[Exception][FROM:%03d] subid:%x ecode:%s", from, ack->subid, EcodeInfoMgr::ins().getEcodeInfo(ack->ecode).c_str()); + } + // + else if (frame->function_id == kreport_pressure_data) { + report_pressure_data_t *ack = (report_pressure_data_t *)frame->params; + QString info; + info.append(fmt("[Pressure][FROM:%03d](%d)", from, ack->sensorDataNum)); + for (int i = 0; i < ack->sensorDataNum; i++) { + info.append(fmt(" %d:%d,", ack->data[i].subid, ack->data[i].pressureVal)); + } + RSHOW(info.toStdString().c_str()); + } + // + else if (frame->function_id == kreport_h2o2_sensor_data) { + report_h2o2_data_t *ack = (report_h2o2_data_t *)frame->params; + QString info; + info.append(fmt("[H2O2 ][FROM:%03d] err:%d h2o2:%d (x10ppm),hum:%d (x10),temp:%d (x10),sat:%d (x10)", // + from, ack->sensor_error, ack->h2o2, ack->humid, ack->temp, ack->saturation)); + RSHOW(info.toStdString().c_str()); + } + // + else if (frame->function_id == kreport_evaporation_bin_water_sensor) { + report_water_sensor_state_t *ack = (report_water_sensor_state_t *)frame->params; + RSHOW("[蒸发仓内水浸][FROM:%03d] (%d)", from, ack->state); + } + // + else if (frame->function_id == kreport_device_bottom_water_sensor) { + report_water_sensor_state_t *ack = (report_water_sensor_state_t *)frame->params; + RSHOW("[设备底部水浸][FROM:%03d] (%d)", from, ack->state); + } } TransmitDisinfection::~TransmitDisinfection() {} diff --git a/src/app/transmit_disinfection/transmitdisinfection.hpp b/src/app/transmit_disinfection/transmitdisinfection.hpp index 9d5b2b6..1188d1e 100644 --- a/src/app/transmit_disinfection/transmitdisinfection.hpp +++ b/src/app/transmit_disinfection/transmitdisinfection.hpp @@ -3,7 +3,10 @@ #include #include "zqui/zqui.hpp" +#include "zscanprotocol/zscanprotocol.hpp" +namespace iflytop { +using namespace zscanprotocol; class TransmitDisinfection : public QTabWidget { Q_OBJECT @@ -11,7 +14,8 @@ class TransmitDisinfection : public QTabWidget { explicit TransmitDisinfection(QWidget *parent = nullptr); ~TransmitDisinfection(); - public: - + private: + void processReportPacket(packet_type_t type, uint8_t from, uint8_t to, uint8_t *hex, uint32_t hexlen); }; +} // namespace iflytop diff --git a/src/app/transmit_disinfection/utils/tabbuilder.cpp b/src/app/transmit_disinfection/utils/tabbuilder.cpp index de85a1e..b537beb 100644 --- a/src/app/transmit_disinfection/utils/tabbuilder.cpp +++ b/src/app/transmit_disinfection/utils/tabbuilder.cpp @@ -10,7 +10,7 @@ using namespace transmit_disfection_protocol; static void readBoardInfo(int deviceId) { ack_read_board_info_data_t ack = CAN_MASTER->readboardinfo(deviceId); - ISHOW("boardType :%s(%d)", BoardTypeToString(ack.boardType), ack.boardType); + ISHOW("boardType :%s(%d)", BoardTypeId2Str(ack.boardType), ack.boardType); ISHOW("projectId :%s(%d)", ProjectIDToString(ack.projectId), ack.projectId); ISHOW("protcol_version :%d", ack.protcol_version); ISHOW("software_version :%d", ack.software_version); @@ -41,13 +41,17 @@ static void readSysInfo(int deviceId) { void TabBuilder::buildLiquidCtrlBoardTab(ProjID_t projectId) { ZQVTabPage *tab = new ZQVTabPage(fathertab, "液路板"); { - ZQFunctionListBox *box = new ZQFunctionListBox(tab, "通用", 2); + ZQFunctionListBox *box = new ZQFunctionListBox(tab, "通用", 4); box->newSubButton("读取板卡信息", [this](int argn, const char **args) { readBoardInfo(kFixBoardId_LiquidCtrl); }); box->newSubButton("读取系统信息", [this](int argn, const char **args) { readSysInfo(kFixBoardId_LiquidCtrl); }); } - { - ZQFunctionListBox *box = new ZQFunctionListBox(tab, "压力传感器总线", 2); + ZQFunctionListBox *box = new ZQFunctionListBox(tab, "警报灯", 4); + box->newFunc("报警灯控制", {"r", "g", "b", "w"}, // + [this](int argn, const char **args) { CAN_MASTER->warningLightSetState(kFixBoardId_LiquidCtrl, atoi(args[0]), atoi(args[1]), atoi(args[2]), atoi(args[3])); }); + } + { + ZQFunctionListBox *box = new ZQFunctionListBox(tab, "压力传感器总线", 4); box->newFunc("读数据", {"subid"}, // [this](int argn, const char **args) { int32_t val = CAN_MASTER->psBusReadData(kFixBoardId_LiquidCtrl, atoi(args[0])); @@ -61,10 +65,25 @@ void TabBuilder::buildLiquidCtrlBoardTab(ProjID_t projectId) { } }); } + + { + ZQFunctionListBox *box = new ZQFunctionListBox(tab, "水浸", 4); + box->newFunc("读取-蒸发桶水浸传感器-状态", {}, // + [this](int argn, const char **args) { + int state = CAN_MASTER->evaporationTankWSReadState(kFixBoardId_LiquidCtrl); + ISHOW("state:%d", state); + }); + box->newFunc("读取-设备底部水浸传感器-状态", {}, // + [this](int argn, const char **args) { + int state = CAN_MASTER->bottomWSReadState(kFixBoardId_LiquidCtrl); + ISHOW("state:%d", state); + }); + } + tab->addSpacer(); } void TabBuilder::buildLiquidCtrlBoardPumpCtrlTab(ProjID_t projectId) { - ZQVTabPage *tab = new ZQVTabPage(fathertab, "泵机控制(液路板)"); + ZQVTabPage *tab = new ZQVTabPage(fathertab, "液路板-泵机控制"); ZQFunctionListBox *box = new ZQFunctionListBox(tab, "泵机控制", 6); box->newFunc("pumpRotate", {"subid", "rpm"}, [](int argn, const char **args) { // @@ -97,12 +116,67 @@ void TabBuilder::buildLiquidCtrlBoardPumpCtrlTab(ProjID_t projectId) { }); tab->addSpacer(); } +// + +static void buildH2O2Box(ZQVTabPage *tab, ProjID_t projectId, int32_t did) { + ZQFunctionListBox *box = new ZQFunctionListBox(tab, "H2O2", 4); + + box->newFunc("H2O2传感器读取校准日期", {}, [did](int argn, const char **args) { + int32_t year, month, day; + CAN_MASTER->h2o2SensorReadCalibrationDate(did, &year, &month, &day); + ISHOW("year:%d,month:%d,day:%d", year, month, day); + }); + box->newFunc("H2O2传感器读取IC错误码", {}, [did](int argn, const char **args) { + int val = CAN_MASTER->h2o2SensorReadSubIcErrorcode(did); + ISHOW("val:%d", val); + }); + box->newFunc("H2O2传感器读取IC寄存器", {"reg", "num"}, [did](int argn, const char **args) { + uint8_t *val = CAN_MASTER->h2o2SensorReadSubIcReg(did, atoi(args[0]), atoi(args[1])); + ISHOW("val:%s", zhex2str(val, atoi(args[1]) * 2).c_str()); + }); +} + void TabBuilder::buildPowerControlBoardTab(ProjID_t projectId) { - ZQVTabPage *tab = new ZQVTabPage(fathertab, "功率板"); { - ZQFunctionListBox *box = new ZQFunctionListBox(tab, "通用", 2); - box->newSubButton("读取板卡信息", [this](int argn, const char **args) { readBoardInfo(kFixBoardId_LiquidCtrl); }); - box->newSubButton("读取系统信息", [this](int argn, const char **args) { readSysInfo(kFixBoardId_LiquidCtrl); }); + ZQVTabPage *tab = new ZQVTabPage(fathertab, "功率板"); + { + ZQFunctionListBox *box = new ZQFunctionListBox(tab, "通用", 4); + box->newSubButton("读取板卡信息", [this](int argn, const char **args) { readBoardInfo(kFixBoardId_PowerControl); }); + box->newSubButton("读取系统信息", [this](int argn, const char **args) { readSysInfo(kFixBoardId_PowerControl); }); + } + { + ZQFunctionListBox *box = new ZQFunctionListBox(tab, "控制", 4); + + box->newFunc("风机控制", {"power"}, [this](int argn, const char **args) { CAN_MASTER->blowerCtrl(kFixBoardId_PowerControl, atoi(args[0])); }); + box->newFunc("风机安全阀控制", {"valve_state"}, [this](int argn, const char **args) { CAN_MASTER->blowerCtrlSafeValve(kFixBoardId_PowerControl, atoi(args[0])); }); + box->newFunc("风机读取电流", {}, [this](int argn, const char **args) { + int val = CAN_MASTER->blowerReadElectricCurrent(kFixBoardId_PowerControl); + ISHOW("val:%d", val); + }); + box->newFunc("空压机控制", {"power"}, [this](int argn, const char **args) { CAN_MASTER->airCompressorCtrl(kFixBoardId_PowerControl, atoi(args[0])); }); + box->newFunc("空压机安全阀控制", {"valve_state"}, [this](int argn, const char **args) { CAN_MASTER->airCompressorCtrlSafeValve(kFixBoardId_PowerControl, atoi(args[0])); }); + box->newFunc("空压机读取电流", {}, [this](int argn, const char **args) { + int val = CAN_MASTER->airCompressorReadElectricCurrent(kFixBoardId_PowerControl); + ISHOW("val:%d", val); + }); + box->newFunc("加热器控制", {"power"}, [this](int argn, const char **args) { CAN_MASTER->heaterCtrl(kFixBoardId_PowerControl, atoi(args[0])); }); + box->newFunc("加热器安全阀控制", {"valve_state"}, [this](int argn, const char **args) { CAN_MASTER->heaterCtrlSafeValve(kFixBoardId_PowerControl, atoi(args[0])); }); + box->newFunc("加热器读取电流", {}, [this](int argn, const char **args) { + int val = CAN_MASTER->heaterReadElectricCurrent(kFixBoardId_PowerControl); + ISHOW("val:%d", val); + }); + box->newFunc("加热器读取温度数据", {}, [this](int argn, const char **args) { + int val = CAN_MASTER->heaterReadTemperatureData(kFixBoardId_PowerControl); + ISHOW("val:%d", val); + }); + } + + tab->addSpacer(); + } + + { + ZQVTabPage *tab = new ZQVTabPage(fathertab, "功率板-H2O2"); + buildH2O2Box(tab, projectId, kFixBoardId_PowerControl); + tab->addSpacer(); } - tab->addSpacer(); } diff --git a/src/app/transmit_disinfection/utils/tabbuilder.hpp b/src/app/transmit_disinfection/utils/tabbuilder.hpp index 622e6cc..6deba75 100644 --- a/src/app/transmit_disinfection/utils/tabbuilder.hpp +++ b/src/app/transmit_disinfection/utils/tabbuilder.hpp @@ -17,6 +17,7 @@ class TabBuilder { void buildLiquidCtrlBoardPumpCtrlTab(ProjID_t projectId); // 液路控制板-泵机页面 void buildPowerControlBoardTab(ProjID_t projectId); // 电源板测试 + private: }; diff --git a/src/db/ecode_info_mgr.hpp b/src/db/ecode_info_mgr.hpp index 067a0b9..df939a6 100644 --- a/src/db/ecode_info_mgr.hpp +++ b/src/db/ecode_info_mgr.hpp @@ -25,6 +25,11 @@ class EcodeInfoMgr { public: static EcodeInfoMgr& ins() { static EcodeInfoMgr instance; + static bool inited = false; + if (!inited) { + instance.regPublicEcode(); + inited = true; + } return instance; } diff --git a/src/main.cpp b/src/main.cpp index 9b72193..b3db678 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -22,6 +22,7 @@ #include "zqui/zqui/zqui.hpp" // #include "app/transmit_disinfection/little_space_disinfection_machine.hpp" +#include "app/transmit_disinfection/large_space_disinfection_machine.hpp" // #include // @@ -43,6 +44,8 @@ int main(int argc, char* argv[]) { QApplication a(argc, argv); REG_APP(LittleSpaceDisinfectionMachine); + REG_APP(LargeSpaceDisinfectionMachine); + ZQUI::ins()->initialize(); DOINUI([]() { ZQUI::ins()->mainW()->setVersionInfo(1, "APP_VERSION", "1.0.0"); }); diff --git a/src/protocol/zscanprotocol_com/zscanprotocol_com.hpp b/src/protocol/zscanprotocol_com/zscanprotocol_com.hpp index 0a9f39d..5727a33 100644 --- a/src/protocol/zscanprotocol_com/zscanprotocol_com.hpp +++ b/src/protocol/zscanprotocol_com/zscanprotocol_com.hpp @@ -40,7 +40,8 @@ class Receipt { size_t receiptLen; zcanbus_packet_t *getPacket() { return (zcanbus_packet_t *)receipt; } - int32_t getContent(int index) { return getPacket()->params[index]; } + int32_t getContent(int index) { return getPacket()->params[index]; } + uint8_t *getByte() { return (uint8_t *)getPacket()->params; } }; class CanPacketRxBuffer { diff --git a/src/zqui/ui/z_function_list_box.cpp b/src/zqui/ui/z_function_list_box.cpp index f37f082..b038532 100644 --- a/src/zqui/ui/z_function_list_box.cpp +++ b/src/zqui/ui/z_function_list_box.cpp @@ -4,7 +4,6 @@ using namespace iflytop; using namespace std; ZQFunctionListBox::ZQFunctionListBox(QWidget *parent, const QString &title, int column) : QGroupBox(parent) { // - // Box init this->setTitle(title); QGridLayout *layout = new QGridLayout(this); diff --git a/src/zqui/ui/zq_vtab_page.cpp b/src/zqui/ui/zq_vtab_page.cpp index 096e743..9917c7b 100644 --- a/src/zqui/ui/zq_vtab_page.cpp +++ b/src/zqui/ui/zq_vtab_page.cpp @@ -9,6 +9,7 @@ ZQVTabPage::ZQVTabPage(QTabWidget *fathertab, const QString &zh_name) : QWidget( this->setLayout(verticalLayout); m_layout = verticalLayout; + fathertab->setUsesScrollButtons(true); fathertab->insertTab(fathertab->count(), this, zh_name); } void ZQVTabPage::addBox(QGroupBox *box) {