Browse Source

添加大空间消毒机上位机

master
zhaohe 1 year ago
parent
commit
f78425586d
  1. 2
      CMakeLists.txt
  2. 2
      app_protocols/transmit_disfection_protocol
  3. 1
      src/app/transmit_disinfection/channel/transmit_disinfection_can_master.cpp
  4. 14
      src/app/transmit_disinfection/channel/transmit_disinfection_can_master.hpp
  5. 21
      src/app/transmit_disinfection/large_space_disinfection_machine.cpp
  6. 16
      src/app/transmit_disinfection/large_space_disinfection_machine.hpp
  7. 68
      src/app/transmit_disinfection/transmitdisinfection.cpp
  8. 8
      src/app/transmit_disinfection/transmitdisinfection.hpp
  9. 94
      src/app/transmit_disinfection/utils/tabbuilder.cpp
  10. 1
      src/app/transmit_disinfection/utils/tabbuilder.hpp
  11. 5
      src/db/ecode_info_mgr.hpp
  12. 3
      src/main.cpp
  13. 3
      src/protocol/zscanprotocol_com/zscanprotocol_com.hpp
  14. 1
      src/zqui/ui/z_function_list_box.cpp
  15. 1
      src/zqui/ui/zq_vtab_page.cpp

2
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)

2
app_protocols/transmit_disfection_protocol

@ -1 +1 @@
Subproject commit 2793d57d7d94a044240958a8084b345369c1ef7a
Subproject commit 57b758e6dd94aaedd42606bd27da98437090d6dc

1
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();

14
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);
};

21
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);
}

16
src/app/transmit_disinfection/large_space_disinfection_machine.hpp

@ -0,0 +1,16 @@
#pragma once
#include <QTabWidget>
#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

68
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() {}

8
src/app/transmit_disinfection/transmitdisinfection.hpp

@ -3,7 +3,10 @@
#include <QTabWidget>
#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

94
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();
}

1
src/app/transmit_disinfection/utils/tabbuilder.hpp

@ -17,6 +17,7 @@ class TabBuilder {
void buildLiquidCtrlBoardPumpCtrlTab(ProjID_t projectId); // 液路控制板-泵机页面
void buildPowerControlBoardTab(ProjID_t projectId); // 电源板测试
private:
};

5
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;
}

3
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 <winsock2.h>
//
@ -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"); });

3
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 {

1
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);

1
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) {

Loading…
Cancel
Save