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