diff --git a/.vscode/settings.json b/.vscode/settings.json index c0703da..898dd71 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -97,7 +97,8 @@ "qtextbrowser": "cpp", "qchartview": "cpp", "qgroupbox": "cpp", - "qmenubar": "cpp" + "qmenubar": "cpp", + "qwidget": "cpp" }, "files.autoGuessEncoding": false, } \ No newline at end of file diff --git a/disinfection_iflytop_can_protocol b/disinfection_iflytop_can_protocol index c01f84e..702ffbc 160000 --- a/disinfection_iflytop_can_protocol +++ b/disinfection_iflytop_can_protocol @@ -1 +1 @@ -Subproject commit c01f84e2ad44f02f615ceec55762e9eda995c0a1 +Subproject commit 702ffbcb82fa62e2cef6621ac49ede8f913273c8 diff --git a/iflytop_canbus/iflytop_canbus_master.cpp b/iflytop_canbus/iflytop_canbus_master.cpp index c091a19..1164966 100644 --- a/iflytop_canbus/iflytop_canbus_master.cpp +++ b/iflytop_canbus/iflytop_canbus_master.cpp @@ -253,3 +253,19 @@ int IflytopCanbusMaster::pump_get_subic_reg(int boardid, int subid, int regadd) callcmd2(boardid, kcmd_pump_get_subic_reg, subid, regadd, DEFUALT_OVERTIME); return *(int32_t *)m_receipt_frame->params; } +void IflytopCanbusMaster::pump_ping(int32_t boardid) { callcmd1(boardid, kcmd_pump_ping, boardid, DEFUALT_OVERTIME); } + +void IflytopCanbusMaster::pingAllBoard() { + m_txindex++; + if (m_txindex < 200) m_txindex = 200; + + zcanbus_packet_t *frame = (zcanbus_packet_t *)m_txbuf; + frame->ptype = kcmd; + frame->index = m_txindex; + frame->function_id = kcmd_heart_ping; + int32_t val = 0xabcd; + + memcpy(frame->params, &val, 4); + sendframe(1, 0xff, (uint8_t *)frame, 4 + sizeof(zcanbus_packet_t)); + return; +} diff --git a/iflytop_canbus/iflytop_canbus_master.hpp b/iflytop_canbus/iflytop_canbus_master.hpp index 80ac767..7f102e1 100644 --- a/iflytop_canbus/iflytop_canbus_master.hpp +++ b/iflytop_canbus/iflytop_canbus_master.hpp @@ -15,6 +15,7 @@ #include "disinfection_iflytop_can_protocol/iflytop_canbus_protocol.hpp" #include "idatachannel.hpp" #include "waveshare_can.hpp" + namespace iflytop { using namespace std; @@ -97,6 +98,8 @@ class IflytopCanbusMaster { ack_read_board_info_data_t readboardinfo(int to); ack_sysinfo_t readsysinfo(int to); ask_taskinfo_t readtaskinfo(int to, int32_t taskoff); + void clear_reset_flag(int32_t to) { callcmd0(to, kcmd_clear_reset_flag); } + void pingAllBoard(); void pump_rotate(int boardid, int subid, int rpm); void pump_stop(int boardid, int subid); @@ -105,6 +108,19 @@ class IflytopCanbusMaster { void pump_set_subic_reg(int boardid, int subid, int regadd, int val); int pump_get_subic_reg(int boardid, int subid, int regadd); + void pump_ping(int32_t boardid); + + // 喷液MINI真空泵 + void sl_mini_ac_ctrl(int boardid, int onoff) { callcmd1(boardid, kcmd_sl_mini_ac_ctrl, onoff); } + // 气密性测试MINI真空泵 + void atta_mini_air_compressor_ctrl(int boardid, int onoff) { callcmd1(boardid, kcmd_atta_mini_air_compressor_ctrl, onoff); } + + // + int32_t pressure_sensor_bus_read_data(int boardid, int subid) { + callcmd0(boardid, kcmd_pressure_sensor_bus_read_data); + return *(int32_t *)m_rxReceiptContext.receipt; + } + void pressure_sensor_bus_set_report_period_ms(int boardid, int periodms) { callcmd1(boardid, kcmd_pressure_sensor_bus_set_report_period_ms, periodms); } private: void sendframe(int32_t from, int32_t to, uint8_t *frame, size_t len); diff --git a/libzqt/zui/zqui.cpp b/libzqt/zui/zqui.cpp index daa6152..6934c11 100644 --- a/libzqt/zui/zqui.cpp +++ b/libzqt/zui/zqui.cpp @@ -25,7 +25,7 @@ void ZQUI::instructionPreviewClear() { if (m_instructionPreviewClear) m_instructionPreviewClear(); } -void ZQUI::reportPreviewShow(const char *fmt, ...) { +void ZQUI::rshow(const char *fmt, ...) { va_list args; va_start(args, fmt); char buf[1024] = {0}; diff --git a/libzqt/zui/zqui.hpp b/libzqt/zui/zqui.hpp index 20bb247..d8ed620 100644 --- a/libzqt/zui/zqui.hpp +++ b/libzqt/zui/zqui.hpp @@ -54,7 +54,7 @@ class ZQUI : public QObject { void doinui(std::function dowhat); void ishow(const char *fmt, ...); - void reportPreviewShow(const char *fmt, ...); + void rshow(const char *fmt, ...); void blockDataUploadPreviewShow(const char *fmt, ...); void rawDataPreviewShow(const char *fmt, ...); void instructionPreviewClear(); diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 90153c2..54fcf3c 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -226,6 +226,7 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWi } else if (type == kreport) { ZQUI::ins()->rawDataPreviewShow("[REPORT ] [%d->%d],%s", from, to, zhex2str(hex, hexlen).c_str()); // } + processReportPacket(type, from, to, hex, hexlen); }); } MainWindow::~MainWindow() { delete ui; } @@ -234,79 +235,146 @@ void MainWindow::processException(const zexception &e) { // ZQUI::ins()->ishow("%s", e.what()); } int32_t MainWindow::getDeviceId() { return PublicState_DeviceIDVal; } -void MainWindow::constructAppUI() { + +void MainWindow::constructPumpControlUI(ZQFunctionListBox *box, int targetDeviceId) { + // ZQFunctionListBox *box = new ZQFunctionListBox(tab, "泵机指令", 4); + + box->newFunc("pump_rotate", {"subid", "rpm"}, [this, targetDeviceId](int argn, const char **args) { // + IflytopCanbusMaster::ins()->pump_rotate(targetDeviceId, atoi(args[0]), atoi(args[1])); + }); + + box->newFunc("pump_stop", {"subid"}, [this, targetDeviceId](int argn, const char **args) { // + IflytopCanbusMaster::ins()->pump_stop(targetDeviceId, atoi(args[0])); + }); + + box->newFunc("pump_set_ihold_irun_idelay", {"subid", "ihold", "irun", "idelay"}, [this, targetDeviceId](int argn, const char **args) { // + IflytopCanbusMaster::ins()->pump_set_ihold_irun_idelay(targetDeviceId, atoi(args[0]), atoi(args[1]), atoi(args[2]), atoi(args[3])); + }); + + box->newFunc("pump_set_acc", {"subid", "acc"}, [this, targetDeviceId](int argn, const char **args) { // + IflytopCanbusMaster::ins()->pump_set_acc(targetDeviceId, atoi(args[0]), atoi(args[1])); + }); + + box->newFunc("pump_set_subic_reg", {"subid", "regadd", "val"}, [this, targetDeviceId](int argn, const char **args) { // + IflytopCanbusMaster::ins()->pump_set_subic_reg(targetDeviceId, atoi(args[0]), atoi(args[1]), atoi(args[2])); + }); + + box->newFunc("pump_get_subic_reg", {"subid", "regadd"}, [this, targetDeviceId](int argn, const char **args) { // + int val = IflytopCanbusMaster::ins()->pump_get_subic_reg(targetDeviceId, atoi(args[0]), atoi(args[1])); + ZQUI::ins()->ishow("val:%x", val); + }); + + box->newFunc("pump_get_subic_reg", {"subid", "regadd"}, [this, targetDeviceId](int argn, const char **args) { // + int val = IflytopCanbusMaster::ins()->pump_get_subic_reg(targetDeviceId, atoi(args[0]), atoi(args[1])); + ZQUI::ins()->ishow("val:%x", val); + }); +} + +void MainWindow::constructCommonOperationTab() { /*********************************************************************************************************************** * 模块操作 * ***********************************************************************************************************************/ + ZQVTabPage *tab = new ZQVTabPage(ui->buttonTabWidget, "通用接口"); + // static { - ZQVTabPage *tab = new ZQVTabPage(ui->buttonTabWidget, "基础方法"); - // static - - // ack_read_board_info_data_t readboardinfo(int to); - // ack_sysinfo_t readsysinfo(int to); - // ask_taskinfo_t readtaskinfo(int to,int32_t taskoff); - - { - ZQFunctionListBox *box = new ZQFunctionListBox(tab, "通用方法", 4); - box->newFunc("读板卡信息", {}, [this](int argn, const char **args) { // - ack_read_board_info_data_t ack = IflytopCanbusMaster::ins()->readboardinfo(getDeviceId()); - ZQUI::ins()->ishow("boardType :%s(%d)", BoardTypeToString(ack.boardType), ack.boardType); - ZQUI::ins()->ishow("projectId :%s(%d)", ProjectIDToString(ack.projectId), ack.projectId); - ZQUI::ins()->ishow("protcol_version :%d", ack.protcol_version); - ZQUI::ins()->ishow("software_version :%d", ack.software_version); - ZQUI::ins()->ishow("hardware_version :%d", ack.hardware_version); - }); - - box->newFunc("读内存信息", {}, [this](int argn, const char **args) { // - ack_sysinfo_t ack = IflytopCanbusMaster::ins()->readsysinfo(getDeviceId()); - ask_taskinfo_t task[20]; - for (int i = 0; i < ack.taskNum; i++) { - task[i] = IflytopCanbusMaster::ins()->readtaskinfo(getDeviceId(), i); - } - ZQUI::ins()->ishow("=========================== sys info ==========================="); - ZQUI::ins()->ishow("total_heap_size :%d", ack.total_heap_size); - ZQUI::ins()->ishow("free_heap_size :%d", ack.free_heap_size); - ZQUI::ins()->ishow("sysHasRun :%d", ack.sysHasRun); - ZQUI::ins()->ishow("="); - - ZQUI::ins()->ishow("=========================== task info ==========================="); - ZQUI::ins()->ishow("taskoff name state stackRemainSize priority"); - for (int i = 0; i < ack.taskNum; i++) { - ZQUI::ins()->ishow("%d %10s %c %d %d", i, task[i].taskName, task[i].state, task[i].stackRemindSize, task[i].priority); - } - ZQUI::ins()->ishow("="); - }); - } + ZQFunctionListBox *box = new ZQFunctionListBox(tab, "通用方法", 4); + box->newFunc("读板卡信息", {"id"}, [this](int argn, const char **args) { // + ack_read_board_info_data_t ack = IflytopCanbusMaster::ins()->readboardinfo(atoi(args[0])); + ZQUI::ins()->ishow("boardType :%s(%d)", BoardTypeToString(ack.boardType), ack.boardType); + ZQUI::ins()->ishow("projectId :%s(%d)", ProjectIDToString(ack.projectId), ack.projectId); + ZQUI::ins()->ishow("protcol_version :%d", ack.protcol_version); + ZQUI::ins()->ishow("software_version :%d", ack.software_version); + ZQUI::ins()->ishow("hardware_version :%d", ack.hardware_version); + }); + + box->newFunc("读内存信息", {"id"}, [this](int argn, const char **args) { // + ack_sysinfo_t ack = IflytopCanbusMaster::ins()->readsysinfo(atoi(args[0])); + ask_taskinfo_t task[20]; + for (int i = 0; i < ack.taskNum; i++) { + task[i] = IflytopCanbusMaster::ins()->readtaskinfo(atoi(args[0]), i); + } + ZQUI::ins()->ishow("=========================== sys info ==========================="); + ZQUI::ins()->ishow("total_heap_size :%d", ack.total_heap_size); + ZQUI::ins()->ishow("free_heap_size :%d", ack.free_heap_size); + ZQUI::ins()->ishow("sysHasRun :%d", ack.sysHasRun); + ZQUI::ins()->ishow("="); + + ZQUI::ins()->ishow("=========================== task info ==========================="); + ZQUI::ins()->ishow("taskoff name state stackRemainSize priority"); + for (int i = 0; i < ack.taskNum; i++) { + ZQUI::ins()->ishow("%d %10s %c %d %d", i, task[i].taskName, task[i].state, task[i].stackRemindSize, task[i].priority); + } + ZQUI::ins()->ishow("="); + }); - { - ZQFunctionListBox *box = new ZQFunctionListBox(tab, "泵机指令", 4); + box->newFunc("PingAllBoard", {}, [this](int argn, const char **args) { // + IflytopCanbusMaster::ins()->pingAllBoard(); + }); - box->newFunc("pump_rotate", {"subid", "rpm"}, [this](int argn, const char **args) { // - IflytopCanbusMaster::ins()->pump_rotate(getDeviceId(), atoi(args[0]), atoi(args[1])); - }); + box->newFunc("clear_reset_flag", {"id"}, [this](int argn, const char **args) { // + IflytopCanbusMaster::ins()->clear_reset_flag(atoi(args[0])); + }); + } +} - box->newFunc("pump_stop", {"subid"}, [this](int argn, const char **args) { // - IflytopCanbusMaster::ins()->pump_stop(getDeviceId(), atoi(args[0])); - }); +void MainWindow::constructDrawBarDisinfectionBoxTab() { // - box->newFunc("pump_set_ihold_irun_idelay", {"subid", "ihold", "irun", "idelay"}, [this](int argn, const char **args) { // - IflytopCanbusMaster::ins()->pump_set_ihold_irun_idelay(getDeviceId(), atoi(args[0]), atoi(args[1]), atoi(args[2]), atoi(args[3])); - }); + ZQVTabPage *tab = new ZQVTabPage(ui->buttonTabWidget, "消毒拉杆箱"); - box->newFunc("pump_set_acc", {"subid", "acc"}, [this](int argn, const char **args) { // - IflytopCanbusMaster::ins()->pump_set_acc(getDeviceId(), atoi(args[0]), atoi(args[1])); - }); + { + ZQFunctionListBox *box = new ZQFunctionListBox(tab, "MINI功率控制板", 4); + constructPumpControlUI(box, kFixBoardId_LiquidCtrl); + // 喷液MINI真空泵 + box->newFunc("喷液MINI真空泵控制", {"onoff"}, [this](int argn, const char **args) { // + IflytopCanbusMaster::ins()->sl_mini_ac_ctrl(kFixBoardId_LiquidCtrl, atoi(args[0])); + }); + // 气密性测试MINI真空泵 + box->newFunc("气密性测试MINI真空泵", {"onoff"}, [this](int argn, const char **args) { // + IflytopCanbusMaster::ins()->atta_mini_air_compressor_ctrl(kFixBoardId_LiquidCtrl, atoi(args[0])); + }); + // 压力传感器总线 + box->newFunc("压力传感器总线-读数据", {"subid"}, [this](int argn, const char **args) { // + int32_t val = IflytopCanbusMaster::ins()->pressure_sensor_bus_read_data( // + kFixBoardId_LiquidCtrl, atoi(args[0])); + ZQUI::ins()->ishow("val:%d", val); + }); + box->newFunc("压力传感器总线-设置上报周期", {"periodms"}, [this](int argn, const char **args) { // + IflytopCanbusMaster::ins()->pressure_sensor_bus_set_report_period_ms( // + kFixBoardId_LiquidCtrl, atoi(args[0])); + }); + } +} - box->newFunc("pump_set_subic_reg", {"subid", "regadd", "val"}, [this](int argn, const char **args) { // - IflytopCanbusMaster::ins()->pump_set_subic_reg(getDeviceId(), atoi(args[0]), atoi(args[1]), atoi(args[2])); - }); +void MainWindow::constructAppUI() { + // + constructCommonOperationTab(); + constructDrawBarDisinfectionBoxTab(); +} - box->newFunc("pump_get_subic_reg", {"subid", "regadd"}, [this](int argn, const char **args) { // - int val = IflytopCanbusMaster::ins()->pump_get_subic_reg(getDeviceId(), atoi(args[0]), atoi(args[1])); - ZQUI::ins()->ishow("val:%d", val); - }); +void MainWindow::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; + ZQUI::ins()->rshow("[Heat ][FROM:%03d] HeatIndex:%x ToardType:%s flag:%x", // + from, ack->heartIndex, BoardTypeToString(ack->boardType), ack->flag); + + } else if (frame->function_id == kreport_exception_error) { + report_exeception_data_t *ack = (report_exeception_data_t *)frame->params; + ZQUI::ins()->rshow("[Exception][FROM:%03d] subid:%x ecode:%s", // + from, ack->subid, ErrorCodeToString(ack->ecode)); + } 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)); } + ZQUI::ins()->rshow(info.toStdString().c_str()); } } diff --git a/src/mainwindow.h b/src/mainwindow.h index 6485d5f..eaf93d3 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -35,10 +35,14 @@ #include #include +#include "iflytop_canbus/iflytop_canbus_master.hpp" #include "logger.hpp" #include "qfunction.hpp" #include "zexception.hpp" #include "zqthread.hpp" +#include "zui/z_function_list_box.hpp" +#include "zui/zq_vtab_page.hpp" + QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; @@ -74,7 +78,7 @@ class MainWindow : public QMainWindow { std::unique_ptr m_thread; - bool m_testState = false; + bool m_testState = false; std::unique_ptr m_testThread; public: @@ -92,7 +96,7 @@ class MainWindow : public QMainWindow { void on_clearPreview_clicked(); -signals: + signals: void doinui_signal(QFunction); private: @@ -104,7 +108,6 @@ signals: void blockDataUploadPreviewShow(QString info); void rawDataPreviewShow(QString info); - void displayInfo(bool suc, QString info); private: @@ -122,5 +125,13 @@ signals: void endAllocNewTab(QWidget *tab); int32_t getDeviceId(); + + private: + void constructPumpControlUI(iflytop::ZQFunctionListBox *box , int targetDeviceId); + + void constructCommonOperationTab(); + void constructDrawBarDisinfectionBoxTab(); + + void processReportPacket(packet_type_t type, uint8_t from, uint8_t to, uint8_t *hex, uint32_t hexlen); }; #endif // MAINWINDOW_H