diff --git a/CMakeLists.txt b/CMakeLists.txt index 154c2e9..e651a24 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -47,6 +47,9 @@ set(PROJECT_SOURCES src/tab/step_motor_ctrl_tab.cpp src/tab/module_opera_tab.cpp + src/tab/board_ext_tab.cpp + src/tab/mini_servo_tab.cpp + a8000_protocol/api/apibasic/errorcode.cpp ) diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index b603979..9c7b48b 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -21,6 +21,8 @@ #include "zui/zui.hpp" // +#include "tab/board_ext_tab.hpp" +#include "tab/mini_servo_tab.hpp" #include "tab/module_opera_tab.hpp" #include "tab/step_motor_ctrl_tab.hpp" @@ -282,11 +284,21 @@ void MainWindow::processException(const zexception &e) { // int32_t MainWindow::getDeviceId() { return PublicState_DeviceIDVal; } void MainWindow::constructAppUI() { - ModuleOperaTab::inst()->construct(ui->buttonTabWidget); + ModuleOperaTab::inst()->construct(ui->moduleOpera); + BoardExtTab::inst()->construct(ui->buttonTabWidget); StepMotorCtrlTab::inst()->construct(ui->buttonTabWidget); StepMotorCtrlTab::inst()->constructRegTab(ui->buttonTabWidget); + + MiniServoTab::inst()->construct(ui->buttonTabWidget); } void MainWindow::on_PublicState_ConfirmKey_clicked() {} void MainWindow::on_PublicState_DeviceID_textChanged() { PublicState_DeviceIDVal = ui->PublicState_DeviceID->toPlainText().toInt(); } + +void MainWindow::on_clearPreview_clicked() { + doinui_signal(QFunction([this]() { ui->instructionPreview->clear(); })); + doinui_signal(QFunction([this]() { ui->reportPreview->clear(); })); + doinui_signal(QFunction([this]() { ui->uploadDataPreview->clear(); })); + doinui_signal(QFunction([this]() { ui->rawDataPreview->clear(); })); +} diff --git a/src/mainwindow.h b/src/mainwindow.h index 5e77fff..7a47f5d 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -92,6 +92,8 @@ class MainWindow : public QMainWindow { void on_PublicState_DeviceID_textChanged(); + void on_clearPreview_clicked(); + signals: void doinui_signal(QFunction); diff --git a/src/mainwindow.ui b/src/mainwindow.ui index 718a440..040a4c5 100644 --- a/src/mainwindow.ui +++ b/src/mainwindow.ui @@ -853,14 +853,17 @@ QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical { - - - <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> -<html><head><meta name="qrichtext" content="1" /><style type="text/css"> -p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'SimSun'; font-size:9pt; font-weight:400; font-style:normal;"> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html> + + + + 0 + 0 + + + + + diff --git a/src/tab/board_ext_tab.cpp b/src/tab/board_ext_tab.cpp new file mode 100644 index 0000000..d541833 --- /dev/null +++ b/src/tab/board_ext_tab.cpp @@ -0,0 +1,66 @@ +#include "board_ext_tab.hpp" + +#include "iflytop_canbus/iflytop_canbus_master.hpp" +#include "logger.hpp" +#include "qt_serial_datachannel.hpp" +#include "zexception.hpp" +#include "zui/z_function_list_box.hpp" +#include "zui/z_reg_table_list_box.hpp" +#include "zui/zq_vtab_page.hpp" +// +#include "./mainwindow.h" +#include "zui\zqui.hpp" +// +using namespace iflytop; +using namespace std; + +extern Ui::MainWindow *main_ui; + +extern int getDeviceId(); + +BoardExtTab *BoardExtTab::inst() { + static BoardExtTab *ins = new BoardExtTab(); + return ins; +} + +void BoardExtTab::construct(QTabWidget *fathertab) { + ZQVTabPage *tab = new ZQVTabPage(fathertab, "板载扩展资源"); + /*********************************************************************************************************************** + * 模块操作 * + ***********************************************************************************************************************/ + { + ZQFunctionListBox *box = new ZQFunctionListBox(tab, "方法", 4); + + box->newFunc("读取IO", {"ioindex"}, [this](int argn, const char **args) { + int32_t status = 0; + ICM->callcmd1(getDeviceId(), kboard_read_ext_io, atoi(args[0])); + ZQUI::ins()->ishow("Status:%d", ICM->getAck(0)); + }); + + box->newFunc("写入IO", {"ioindex"}, [this](int argn, const char **args) { ICM->callcmd1(getDeviceId(), kboard_write_ext_io, atoi(args[0])); }); + } + + /*********************************************************************************************************************** + * 寄存器操作 * + ***********************************************************************************************************************/ + { + ZRegTableList *tableBox = new ZRegTableList(tab, "寄存器操作"); + tableBox->initializeRegOperation( + [this](int32_t add, int32_t val) { // + ICM->writereg(getDeviceId(), add, val); + return true; + }, + [this](int32_t add, int32_t *val) { // + ICM->readreg(getDeviceId(), add, val); + return true; + }); + + tableBox->addReg("mod-version", kreg_module_version, ZRegItem::krw | ZRegItem::kdec); + tableBox->addReg("mod-type", kreg_module_type, ZRegItem::krw | ZRegItem::kdec); + tableBox->addReg("mod-status", kreg_module_status, ZRegItem::krw | ZRegItem::kdec); + tableBox->addReg("mod-errorcode", kreg_module_errorcode, ZRegItem::krw | ZRegItem::kdec); + tableBox->addSpacer(); + } + + tab->addSpacer(); +} diff --git a/src/tab/board_ext_tab.hpp b/src/tab/board_ext_tab.hpp new file mode 100644 index 0000000..966e888 --- /dev/null +++ b/src/tab/board_ext_tab.hpp @@ -0,0 +1,43 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +// +#include + +namespace iflytop { +using namespace std; + +class BoardExtTab { + public: + static BoardExtTab *inst(); + + void construct(QTabWidget *fathertab); +}; +} // namespace iflytop diff --git a/src/tab/mini_servo_tab.cpp b/src/tab/mini_servo_tab.cpp new file mode 100644 index 0000000..d542dcb --- /dev/null +++ b/src/tab/mini_servo_tab.cpp @@ -0,0 +1,79 @@ +#include "mini_servo_tab.hpp" + +#include "iflytop_canbus/iflytop_canbus_master.hpp" +#include "logger.hpp" +#include "qt_serial_datachannel.hpp" +#include "zexception.hpp" +#include "zui/z_function_list_box.hpp" +#include "zui/z_reg_table_list_box.hpp" +#include "zui/zq_vtab_page.hpp" +// +#include "./mainwindow.h" +#include "zui\zqui.hpp" +// +using namespace iflytop; +using namespace std; + +extern Ui::MainWindow *main_ui; + +extern int getDeviceId(); + +MiniServoTab *MiniServoTab::inst() { + static MiniServoTab *ins = new MiniServoTab(); + return ins; +} + +void MiniServoTab::construct(QTabWidget *fathertab) { + ZQVTabPage *tab = new ZQVTabPage(fathertab, "舵机"); + /*********************************************************************************************************************** + * 模块操作 * + ***********************************************************************************************************************/ + { + ZQFunctionListBox *box = new ZQFunctionListBox(tab, "方法", 4); + + box->newFunc("使能", {"enable"}, [this](int argn, const char **args) { ICM->callcmd1(getDeviceId(), kmini_servo_enable, atoi(args[0])); }); + box->newFunc("读取位置", {}, [this](int argn, const char **args) { + ICM->callcmd0(getDeviceId(), kmini_servo_read_pos); + ZQUI::ins()->ishow("Position:%d", ICM->getAck(0)); + }); + box->newFunc("激活配置", {}, [this](int argn, const char **args) { ICM->callcmd0(getDeviceId(), kmini_servo_active_cfg); }); + box->newFunc("停止", {"breakstop"}, [this](int argn, const char **args) { ICM->callcmd1(getDeviceId(), kmini_servo_stop, atoi(args[0])); }); + box->newFunc("旋转", {"direction"}, [this](int argn, const char **args) { ICM->callcmd1(getDeviceId(), kmini_servo_rotate, atoi(args[0])); }); + box->newFunc("移动到", {"position"}, [this](int argn, const char **args) { ICM->callcmd1(getDeviceId(), kmini_servo_move_to, atoi(args[0])); }); + box->newFunc("设置中点", {}, [this](int argn, const char **args) { ICM->callcmd0(getDeviceId(), kmini_servo_set_mid_point); }); + box->newFunc("读取IO状态", {"ioindex"}, [this](int argn, const char **args) { + ICM->callcmd1(getDeviceId(), kmini_servo_read_io_state, atoi(args[0])); + ZQUI::ins()->ishow("IO:%d", ICM->getAck(0)); + }); + } + + /*********************************************************************************************************************** + * 寄存器操作 * + ***********************************************************************************************************************/ + { + ZRegTableList *tableBox = new ZRegTableList(tab, "寄存器操作"); + tableBox->initializeRegOperation( + [this](int32_t add, int32_t val) { // + ICM->writereg(getDeviceId(), add, val); + return true; + }, + [this](int32_t add, int32_t *val) { // + ICM->readreg(getDeviceId(), add, val); + return true; + }); + + tableBox->addReg("mod-version", kreg_module_version, ZRegItem::krw | ZRegItem::kdec); + tableBox->addReg("mod-type", kreg_module_type, ZRegItem::krw | ZRegItem::kdec); + tableBox->addReg("mod-status", kreg_module_status, ZRegItem::krw | ZRegItem::kdec); + tableBox->addReg("mod-errorcode", kreg_module_errorcode, ZRegItem::krw | ZRegItem::kdec); + + tableBox->addReg("pos", kreg_mini_servo_pos, ZRegItem::krw | ZRegItem::kdec); + tableBox->addReg("limit-velocity", kreg_mini_servo_limit_velocity, ZRegItem::krw | ZRegItem::kdec); + tableBox->addReg("limit-torque", kreg_mini_servo_limit_torque, ZRegItem::krw | ZRegItem::kdec); + tableBox->addReg("protective-torque", kreg_mini_servo_protective_torque, ZRegItem::krw | ZRegItem::kdec); + + tableBox->addSpacer(); + } + + tab->addSpacer(); +} diff --git a/src/tab/mini_servo_tab.hpp b/src/tab/mini_servo_tab.hpp new file mode 100644 index 0000000..7f164f5 --- /dev/null +++ b/src/tab/mini_servo_tab.hpp @@ -0,0 +1,43 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +// +#include + +namespace iflytop { +using namespace std; + +class MiniServoTab { + public: + static MiniServoTab *inst(); + + void construct(QTabWidget *fathertab); +}; +} // namespace iflytop diff --git a/src/tab/module_opera_tab.cpp b/src/tab/module_opera_tab.cpp index 20e9793..45a9352 100644 --- a/src/tab/module_opera_tab.cpp +++ b/src/tab/module_opera_tab.cpp @@ -17,26 +17,77 @@ extern Ui::MainWindow *main_ui; extern int getDeviceId(); +// typedef enum { +// kuniversal_module = 0, // 通用模块 +// khbot_module = 1, // hbot模块 +// kmotor_module = 2, // 电机控制 +// ktemperature_ctrl_module = 3, // 温度控制 +// kfan_ctrl_module = 5, // 风扇控制 +// kcode_scaner = 6, // 风扇控制 +// kpipette_ctrl_module = 7, // 移液体枪控制 +// ka8000_optical_module = 8, // a8000光学模组 +// klaster_scaner_module = 9, // a8000光学模组 + +// ktmc_step_motor = 10, // 步进电机 +// kmini_servo_motor_module = 11, // 舵机 +// kboard = 12, // 舵机 +// } module_type_t; + +static const char *module_type2_str(int id) { + switch (id) { + case kuniversal_module: + return "通用模块"; + case khbot_module: + return "hbot模块"; + case kmotor_module: + return "电机控制"; + case ktemperature_ctrl_module: + return "温度控制"; + case kfan_ctrl_module: + return "风扇控制"; + case kcode_scaner: + return "风扇控制"; + case kpipette_ctrl_module: + return "移液体枪控制"; + case ka8000_optical_module: + return "a8000光学模组"; + case klaster_scaner_module: + return "a8000光学模组"; + // + case ktmc_step_motor: + return "步进电机"; + case kmini_servo_motor_module: + return "舵机"; + case kboard: + return "板子扩展"; + default: + return "未知模块"; + } +} ModuleOperaTab *ModuleOperaTab::inst() { static ModuleOperaTab *ins = new ModuleOperaTab(); return ins; } -void ModuleOperaTab::construct(QTabWidget *fathertab) { +void ModuleOperaTab::construct(QWidget *parent) { /*********************************************************************************************************************** * 模块操作 * ***********************************************************************************************************************/ // main_ui-> - ZQVTabPage *tab = new ZQVTabPage(fathertab, "模块操作"); + // ZQVTabPage *tab = new ZQVTabPage(fathertab, "模块操作"); { - ZQFunctionListBox *box = new ZQFunctionListBox(tab, "模块基础操作", 4); + ZQFunctionListBox *box = new ZQFunctionListBox(parent, "模块基础操作", 1); box->newFunc("扫描模块", {}, [this](int argn, const char **args) { // for (size_t i = 1; i < 255; i++) { try { IflytopCanbusMaster::ins()->ping(i); - ZQUI::ins()->ishow("module :%d isOnline", i); + + int moduleType; + IflytopCanbusMaster::ins()->readreg(i, kreg_module_type, &moduleType); + + ZQUI::ins()->ishow("module :%d isOnline type:%s", i, module_type2_str(moduleType)); } catch (const zexception &e) { if (e.ecode() != ke_overtime) { ZQUI::ins()->ishow("%s", e.what()); @@ -46,7 +97,19 @@ void ModuleOperaTab::construct(QTabWidget *fathertab) { } ZQUI::ins()->ishow("ScanModuleEnd"); }); + + box->newFunc("获取状态", {}, [this](int argn, const char **args) { + int32_t status = 0; + ICM->callcmd0(getDeviceId(), kmodule_get_status); + ZQUI::ins()->ishow("Status:%d", ICM->getAck(0)); + }); + box->newFunc("停止", {}, [this](int argn, const char **args) { ICM->callcmd0(getDeviceId(), kmodule_stop); }); + box->newFunc("获取错误", {}, [this](int argn, const char **args) { + ICM->callcmd0(getDeviceId(), kmodule_get_error); + ZQUI::ins()->ishow("Error:%d", ICM->getAck(0)); + }); + box->newFunc("清除错误", {}, [this](int argn, const char **args) { ICM->callcmd0(getDeviceId(), kmodule_clear_error); }); } - tab->addSpacer(); + // tab->addSpacer(); } diff --git a/src/tab/module_opera_tab.hpp b/src/tab/module_opera_tab.hpp index aa81294..78afeb1 100644 --- a/src/tab/module_opera_tab.hpp +++ b/src/tab/module_opera_tab.hpp @@ -38,6 +38,6 @@ class ModuleOperaTab { public: static ModuleOperaTab* inst(); - void construct(QTabWidget *fathertab); + void construct(QWidget *parent); }; } // namespace iflytop diff --git a/src/tab/step_motor_ctrl_tab.cpp b/src/tab/step_motor_ctrl_tab.cpp index 9338224..ed38e35 100644 --- a/src/tab/step_motor_ctrl_tab.cpp +++ b/src/tab/step_motor_ctrl_tab.cpp @@ -43,23 +43,8 @@ void StepMotorCtrlTab::construct(QTabWidget *fathertab) { { ZQFunctionListBox *box = new ZQFunctionListBox(tab, "方法", 4); - // kmodule_get_status = CMDID(1, 4), // para:{}, ack:{4} - // kmodule_stop = CMDID(1, 1), // para:{}, ack:{} - // kmodule_get_error = CMDID(1, 10), // para:{}, ack:{1} - // kmodule_clear_error = CMDID(1, 11), // para:{}, ack:{} - // kmodule_active_cfg = CMDID(1, 16), // para:{}, ack:{} - box->newFunc("M-获取状态", {}, [this](int argn, const char **args) { - int32_t status = 0; - ICM->callcmd0(getDeviceId(), kmodule_get_status); - ZQUI::ins()->ishow("Status:%d", ICM->getAck(0)); - }); - box->newFunc("M-停止", {}, [this](int argn, const char **args) { ICM->callcmd0(getDeviceId(), kmodule_stop); }); - box->newFunc("M-获取错误", {}, [this](int argn, const char **args) { - ICM->callcmd0(getDeviceId(), kmodule_get_error); - ZQUI::ins()->ishow("Error:%d", ICM->getAck(0)); - }); - box->newFunc("M-清除错误", {}, [this](int argn, const char **args) { ICM->callcmd0(getDeviceId(), kmodule_clear_error); }); + // box->newFunc("使能", {"enable"}, [this](int argn, const char **args) { ICM->step_motor_enable(getDeviceId(), atoi(args[0])); }); box->newFunc("读取位置", {}, [this](int argn, const char **args) {