diff --git a/CMakeLists.txt b/CMakeLists.txt index d4c8aae..acaca84 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -58,6 +58,7 @@ set(PROJECT_SOURCES a8000_protocol/api/apibasic/errorcode.cpp src/tab/pipette_ctrl_tab.cpp + src/basic/stm32_pin.cpp app.rc ) diff --git a/README.md b/README.md index 64697cc..c7d8e32 100644 --- a/README.md +++ b/README.md @@ -60,4 +60,22 @@ V4: +``` + +``` +ID地址: +0x080E0000 +10 :A +20 :14 +30 :1E +40 :28 +50 :32 +60 :3C +70 :46 +80 :50 +90 :5A +100:64 +110:6E +200:CB + ``` \ No newline at end of file diff --git a/a8000_protocol b/a8000_protocol index 8fa3934..6486ccf 160000 --- a/a8000_protocol +++ b/a8000_protocol @@ -1 +1 @@ -Subproject commit 8fa3934e833a116d68d4c32ebba8352ce1b8746f +Subproject commit 6486ccf75f3e6bd05c7454ff994d8c003d908227 diff --git a/src/basic/stm32_pin.cpp b/src/basic/stm32_pin.cpp new file mode 100644 index 0000000..5887a12 --- /dev/null +++ b/src/basic/stm32_pin.cpp @@ -0,0 +1,218 @@ +#include "stm32_pin.hpp" + +#include + +#include + +static inline const char* fmt(const char* format, ...) { + static char buf[1024]; + va_list args; + va_start(args, format); + vsprintf(buf, format, args); + va_end(args); + return buf; +} + + std::string stm32pin2str(Pin_t pin) { + switch (pin) { + case PA0: + return "PA0"; + case PA1: + return "PA1"; + case PA2: + return "PA2"; + case PA3: + return "PA3"; + case PA4: + return "PA4"; + case PA5: + return "PA5"; + case PA6: + return "PA6"; + case PA7: + return "PA7"; + case PA8: + return "PA8"; + case PA9: + return "PA9"; + case PA10: + return "PA10"; + case PA11: + return "PA11"; + case PA12: + return "PA12"; + case PA13: + return "PA13"; + case PA14: + return "PA14"; + case PA15: + return "PA15"; + case PB0: + return "PB0"; + case PB1: + return "PB1"; + case PB2: + return "PB2"; + case PB3: + return "PB3"; + case PB4: + return "PB4"; + case PB5: + return "PB5"; + case PB6: + return "PB6"; + case PB7: + return "PB7"; + case PB8: + return "PB8"; + case PB9: + return "PB9"; + case PB10: + return "PB10"; + case PB11: + return "PB11"; + case PB12: + return "PB12"; + case PB13: + return "PB13"; + case PB14: + return "PB14"; + case PB15: + return "PB15"; + case PC0: + return "PC0"; + case PC1: + return "PC1"; + case PC2: + return "PC2"; + case PC3: + return "PC3"; + case PC4: + return "PC4"; + case PC5: + return "PC5"; + case PC6: + return "PC6"; + case PC7: + return "PC7"; + case PC8: + return "PC8"; + case PC9: + return "PC9"; + case PC10: + return "PC10"; + case PC11: + return "PC11"; + case PC12: + return "PC12"; + case PC13: + return "PC13"; + case PC14: + return "PC14"; + case PC15: + return "PC15"; + case PD0: + return "PD0"; + case PD1: + return "PD1"; + case PD2: + return "PD2"; + case PD3: + return "PD3"; + case PD4: + return "PD4"; + case PD5: + return "PD5"; + case PD6: + return "PD6"; + case PD7: + return "PD7"; + case PD8: + return "PD8"; + case PD9: + return "PD9"; + case PD10: + return "PD10"; + case PD11: + return "PD11"; + case PD12: + return "PD12"; + case PD13: + return "PD13"; + case PD14: + return "PD14"; + case PD15: + return "PD15"; + + case PF0: + return "PF0"; + case PF1: + return "PF1"; + case PF2: + return "PF2"; + case PF3: + return "PF3"; + case PF4: + return "PF4"; + case PF5: + return "PF5"; + case PF6: + return "PF6"; + case PF7: + return "PF7"; + case PF8: + return "PF8"; + case PF9: + return "PF9"; + case PF10: + return "PF10"; + case PF11: + return "PF11"; + case PF12: + return "PF12"; + case PF13: + return "PF13"; + case PF14: + return "PF14"; + case PF15: + return "PF15"; + + case PG0: + return "PG0"; + case PG1: + return "PG1"; + case PG2: + return "PG2"; + case PG3: + return "PG3"; + case PG4: + return "PG4"; + case PG5: + return "PG5"; + case PG6: + return "PG6"; + case PG7: + return "PG7"; + case PG8: + return "PG8"; + case PG9: + return "PG9"; + case PG10: + return "PG10"; + case PG11: + return "PG11"; + case PG12: + return "PG12"; + case PG13: + return "PG13"; + case PG14: + return "PG14"; + case PG15: + return "PG15"; + case PinNull: + return "N/A"; + default: + return fmt("Unkonw(0x%x)", pin); + } + return fmt("Unkonw(0x%x)", pin); +} \ No newline at end of file diff --git a/src/basic/stm32_pin.hpp b/src/basic/stm32_pin.hpp new file mode 100644 index 0000000..17c3062 --- /dev/null +++ b/src/basic/stm32_pin.hpp @@ -0,0 +1,119 @@ +#pragma once +#include +typedef enum { + PinNull = 0, + PA0 = 0x10, + PA1, + PA2, + PA3, + PA4, + PA5, + PA6, + PA7, + PA8, + PA9, + PA10, + PA11, + PA12, + PA13, + PA14, + PA15, + PB0 = 0x20, + PB1, + PB2, + PB3, + PB4, + PB5, + PB6, + PB7, + PB8, + PB9, + PB10, + PB11, + PB12, + PB13, + PB14, + PB15, + PC0 = 0x30, + PC1, + PC2, + PC3, + PC4, + PC5, + PC6, + PC7, + PC8, + PC9, + PC10, + PC11, + PC12, + PC13, + PC14, + PC15, + PD0 = 0x40, + PD1, + PD2, + PD3, + PD4, + PD5, + PD6, + PD7, + PD8, + PD9, + PD10, + PD11, + PD12, + PD13, + PD14, + PD15, + PE0 = 0x50, + PE1, + PE2, + PE3, + PE4, + PE5, + PE6, + PE7, + PE8, + PE9, + PE10, + PE11, + PE12, + PE13, + PE14, + PE15, + PF0 = 0x60, + PF1, + PF2, + PF3, + PF4, + PF5, + PF6, + PF7, + PF8, + PF9, + PF10, + PF11, + PF12, + PF13, + PF14, + PF15, + PG0 = 0x70, + PG1, + PG2, + PG3, + PG4, + PG5, + PG6, + PG7, + PG8, + PG9, + PG10, + PG11, + PG12, + PG13, + PG14, + PG15, +} Pin_t; + +std::string stm32pin2str(Pin_t pin); \ No newline at end of file diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 8c0ce77..223786d 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -23,10 +23,12 @@ // #include "tab/board_ext_tab.hpp" #include "tab/code_scaner_tab.hpp" +#include "tab/fan_ctrl_tab.hpp" #include "tab/mini_servo_tab.hpp" #include "tab/module_opera_tab.hpp" -#include "tab/step_motor_ctrl_tab.hpp" #include "tab/pipette_ctrl_tab.hpp" +#include "tab/step_motor_ctrl_tab.hpp" +#include "tab/water_cooling_temperature_tab.hpp" #include "version.h" using namespace std; @@ -220,7 +222,6 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWi // VERSION - main_ui = ui; ui->setupUi(this); @@ -298,6 +299,9 @@ void MainWindow::constructAppUI() { MiniServoTab::inst()->construct(ui->buttonTabWidget); CodeScanerTab::inst()->construct(ui->buttonTabWidget); PipetteCtrlTab::inst()->construct(ui->buttonTabWidget); + + WaterCoolingTemperatureControlerTab::inst()->construct(ui->buttonTabWidget); + FanCtrlTab::inst()->construct(ui->buttonTabWidget); } void MainWindow::on_PublicState_ConfirmKey_clicked() {} diff --git a/src/tab/board_ext_tab.cpp b/src/tab/board_ext_tab.cpp index c70c359..adbc2bf 100644 --- a/src/tab/board_ext_tab.cpp +++ b/src/tab/board_ext_tab.cpp @@ -8,6 +8,7 @@ #include "zui/z_reg_table_list_box.hpp" #include "zui/zq_vtab_page.hpp" // +#include "../basic/stm32_pin.hpp" #include "./mainwindow.h" #include "zui\zqui.hpp" // @@ -37,18 +38,42 @@ void BoardExtTab::construct(QTabWidget *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", {}, [this](int argn, const char **args) { + int32_t portState = 0; + int32_t indexInStm32 = 0; + for (int i = 0; i < 10; i++) { + try { + ICM->callcmd1(getDeviceId(), kextboard_read_inio_index_in_stm32, i); + indexInStm32 = ICM->getAck(0); + ICM->callcmd1(getDeviceId(), kextboard_read_inio, i); + portState = ICM->getAck(0); + if (indexInStm32 == 0) break; + ZQUI::ins()->ishow("io%d(%s):%d", i, stm32pin2str((Pin_t)indexInStm32).c_str(), portState); + } catch (const std::exception &e) { + break; + } + } }); - box->newFunc("读取全部IO", {}, [this](int argn, const char **args) { - int32_t status = 0; - ICM->callcmd0(getDeviceId(), kboard_read_muti_io); - ZQUI::ins()->ishow("IOState:%s", hex2binstr(ICM->getAck(0))); + box->newFunc("读取全部输出IO", {}, [this](int argn, const char **args) { + int32_t portState = 0; + int32_t indexInStm32 = 0; + for (int i = 0; i < 10; i++) { + try { + ICM->callcmd1(getDeviceId(), kextboard_read_outio_index_in_stm32, i); + indexInStm32 = ICM->getAck(0); + ICM->callcmd1(getDeviceId(), kextboard_read_outio, i); + portState = ICM->getAck(0); + if (indexInStm32 == 0) break; + ZQUI::ins()->ishow("io%d(%s):%d", i, stm32pin2str((Pin_t)indexInStm32).c_str(), portState); + } catch (const std::exception &e) { + break; + } + } }); - box->newFunc("写入IO", {"ioindex", "iostate"}, [this](int argn, const char **args) { ICM->callcmd1(getDeviceId(), kboard_write_ext_io, atoi(args[0]), atoi(args[1])); }); + // stm32pin2str + + box->newFunc("写入IO", {"ioindex", "iostate"}, [this](int argn, const char **args) { ICM->callcmd1(getDeviceId(), kextboard_write_outio, atoi(args[0]), atoi(args[1])); }); } /*********************************************************************************************************************** diff --git a/src/tab/fan_ctrl_tab.cpp b/src/tab/fan_ctrl_tab.cpp index 2464c10..9002745 100644 --- a/src/tab/fan_ctrl_tab.cpp +++ b/src/tab/fan_ctrl_tab.cpp @@ -35,7 +35,7 @@ void FanCtrlTab::construct(QTabWidget *fathertab) { { ZQFunctionListBox *box = new ZQFunctionListBox(tab, "风扇控制", 4); - box->newFunc("控制风扇转速", {"speed"}, [this](int argn, const char **args) { ICM->callcmd0(getDeviceId(), kfan_controler_set_speed, atoi(args[0])); }); + box->newFunc("控制风扇转速", {"speed"}, [this](int argn, const char **args) { ICM->callcmd1(getDeviceId(), kfan_controler_set_speed, atoi(args[0])); }); } tab->addSpacer(); diff --git a/src/tab/step_motor_ctrl_tab.cpp b/src/tab/step_motor_ctrl_tab.cpp index 325879b..81f7922 100644 --- a/src/tab/step_motor_ctrl_tab.cpp +++ b/src/tab/step_motor_ctrl_tab.cpp @@ -8,6 +8,7 @@ #include "zui/z_reg_table_list_box.hpp" #include "zui/zq_vtab_page.hpp" // +#include "../basic/stm32_pin.hpp" #include "./mainwindow.h" #include "zui\zqui.hpp" // @@ -67,9 +68,21 @@ void StepMotorCtrlTab::construct(QTabWidget *fathertab) { ZQUI::ins()->ishow("Pos:%d", pos); }); box->newFunc("读取IO状态", {"ioindex"}, [this](int argn, const char **args) { - int32_t io = 0; - ICM->step_motor_read_io_state(getDeviceId(), atoi(args[0]), &io); - ZQUI::ins()->ishow("IO:%d", io); + int32_t portState = 0; + int32_t indexInStm32 = 0; + for (int i = 0; i < 10; i++) { + try { + ICM->callcmd1(getDeviceId(), kstep_motor_read_io_index_in_stm32, i); + indexInStm32 = ICM->getAck(0); + ICM->callcmd1(getDeviceId(), kstep_motor_read_io_state, i); + portState = ICM->getAck(0); + if (indexInStm32 == 0) break; + + ZQUI::ins()->ishow("io%d(%s):%d", i, stm32pin2str((Pin_t)indexInStm32).c_str(), portState); + } catch (const std::exception &e) { + break; + } + } }); box->newFunc("读取5130电机详细状态", {"ioindex"}, [this](int argn, const char **args) { ICM->callcmd0(getDeviceId(), kstep_motor_read_tmc5130_status); diff --git a/src/tab/water_cooling_temperature_tab.cpp b/src/tab/water_cooling_temperature_tab.cpp index dd83ec5..910ef71 100644 --- a/src/tab/water_cooling_temperature_tab.cpp +++ b/src/tab/water_cooling_temperature_tab.cpp @@ -36,12 +36,12 @@ void WaterCoolingTemperatureControlerTab::construct(QTabWidget *fathertab) { { ZQFunctionListBox *box = new ZQFunctionListBox(tab, "水冷温度控制器", 4); - box->newFunc("开始控温", {"temperature"}, [this](int argn, const char **args) { ICM->callcmd0(getDeviceId(), ktemp_controler_start_hearting, atoi(args[0])); }); + box->newFunc("开始控温", {"temperature"}, [this](int argn, const char **args) { ICM->callcmd1(getDeviceId(), ktemp_controler_start_hearting, atoi(args[0])); }); box->newFunc("停止控温", {}, [this](int argn, const char **args) { ICM->callcmd0(getDeviceId(), ktemp_controler_stop_hearting); }); - box->newFunc("测试-帕尔贴-控制功率", {"level[-100,100]"}, [this](int argn, const char **args) { ICM->callcmd0(getDeviceId(), ktemp_controler_set_peltier_power_level, atoi(args[0])); }); - box->newFunc("测试-水泵-控制转速", {"speed[0,100]"}, [this](int argn, const char **args) { ICM->callcmd0(getDeviceId(), ktemp_controler_set_pump_level, atoi(args[0])); }); - box->newFunc("测试-风扇-控制转速", {"speed[0,100]"}, [this](int argn, const char **args) { ICM->callcmd0(getDeviceId(), ktemp_controler_set_fan_level, atoi(args[0])); }); - box->newFunc("测试-日志-开关", {"enable[0,1]"}, [this](int argn, const char **args) { ICM->callcmd0(getDeviceId(), ktemp_controler_enable_log, atoi(args[0])); }); + box->newFunc("测试-帕尔贴-控制功率", {"level[-100,100]"}, [this](int argn, const char **args) { ICM->callcmd1(getDeviceId(), ktemp_controler_set_peltier_power_level, atoi(args[0])); }); + box->newFunc("测试-水泵-控制转速", {"speed[0,100]"}, [this](int argn, const char **args) { ICM->callcmd1(getDeviceId(), ktemp_controler_set_pump_level, atoi(args[0])); }); + box->newFunc("测试-风扇-控制转速", {"speed[0,100]"}, [this](int argn, const char **args) { ICM->callcmd1(getDeviceId(), ktemp_controler_set_fan_level, atoi(args[0])); }); + box->newFunc("测试-日志-开关", {"enable[0,1]"}, [this](int argn, const char **args) { ICM->callcmd1(getDeviceId(), ktemp_controler_enable_log, atoi(args[0])); }); } tab->addSpacer(); @@ -58,10 +58,19 @@ void WaterCoolingTemperatureControlerTab::construct(QTabWidget *fathertab) { return true; }); - tableBox->addReg("reg_pipette_pos_ul", kreg_pipette_pos_ul, ZRegItem::krw | ZRegItem::kdec); - tableBox->addReg("reg_pipette_capactitance_val", kreg_pipette_capactitance_val, ZRegItem::krw | ZRegItem::kdec); - tableBox->addReg("reg_pipette_tip_state", kreg_pipette_tip_state, ZRegItem::krw | ZRegItem::kdec); - tableBox->addReg("reg_pipette_limit_ul", kreg_pipette_limit_ul, ZRegItem::krw | ZRegItem::kdec); + tableBox->addReg("PID-Kd", kreg_water_cooling_tmp_controler_pid_kd, ZRegItem::krw | ZRegItem::kdec); + tableBox->addReg("PID-MaxOutput", kreg_water_cooling_tmp_controler_pid_max_output, ZRegItem::krw | ZRegItem::kdec); + tableBox->addReg("PID-MinOutput", kreg_water_cooling_tmp_controler_pid_min_output, ZRegItem::krw | ZRegItem::kdec); + tableBox->addReg("PID-MaxIntegral", kreg_water_cooling_tmp_controler_pid_max_integral, ZRegItem::krw | ZRegItem::kdec); + tableBox->addReg("PID-MinIntegral", kreg_water_cooling_tmp_controler_pid_min_integral, ZRegItem::krw | ZRegItem::kdec); + tableBox->addReg("PID-Interval", kreg_water_cooling_tmp_controler_pid_compute_interval, ZRegItem::krw | ZRegItem::kdec); + tableBox->addReg("PID-Target", kreg_water_cooling_tmp_controler_pid_target, ZRegItem::krw | ZRegItem::kdec); + tableBox->addReg("PID-NowOutput", kreg_water_cooling_tmp_controler_pid_nowoutput, ZRegItem::kr | ZRegItem::kdec); + tableBox->addReg("PID-FeedbackVal", kreg_water_cooling_tmp_controler_pid_feedbackval, ZRegItem::kr | ZRegItem::kdec); + tableBox->addReg("Temperature0", kreg_water_cooling_tmp_controler_temp0, ZRegItem::kr | ZRegItem::kdec); + tableBox->addReg("Temperature1", kreg_water_cooling_tmp_controler_temp1, ZRegItem::kr | ZRegItem::kdec); + tableBox->addReg("Temperature2", kreg_water_cooling_tmp_controler_temp2, ZRegItem::kr | ZRegItem::kdec); + tableBox->addReg("Temperature3", kreg_water_cooling_tmp_controler_temp3, ZRegItem::kr | ZRegItem::kdec); tableBox->addSpacer(); tab->addSpacer();