diff --git a/.vscode/settings.json b/.vscode/settings.json index 5edd88f..b53a518 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -111,7 +111,8 @@ "xtr1common": "cpp", "xtree": "cpp", "xutility": "cpp", - "qformlayout": "cpp" + "qformlayout": "cpp", + "qvariant": "cpp" }, "files.autoGuessEncoding": false, } \ No newline at end of file diff --git a/p_lusterinc_xsync - 快捷方式.lnk b/p_lusterinc_xsync - 快捷方式.lnk new file mode 100644 index 0000000..99d751c Binary files /dev/null and b/p_lusterinc_xsync - 快捷方式.lnk differ diff --git a/src/app/syncbox16ch/syncbox16ch.cpp b/src/app/syncbox16ch/syncbox16ch.cpp index 3639a7d..7d3f48a 100644 --- a/src/app/syncbox16ch/syncbox16ch.cpp +++ b/src/app/syncbox16ch/syncbox16ch.cpp @@ -7,51 +7,35 @@ using namespace iflytop; using namespace syncbox16chsdk; +#define TAG "SyncBox16CH" -typedef enum { - // 自定义 - koutput_pluse_type_custom, - // 方波 - koutput_pluse_type_square_wave, -} OutputPluseType_t; - -static OutputPluseType_t outputPluseTypeStr2Enum(QString str) { - if (str == "自定义") { - return koutput_pluse_type_custom; - } else if (str == "方波") { - return koutput_pluse_type_square_wave; - } else { - return koutput_pluse_type_custom; - } -} - -static QString outputPluseType2Str(OutputPluseType_t type) { - switch (type) { - case koutput_pluse_type_custom: - return "自定义"; - case koutput_pluse_type_square_wave: - return "方波"; - default: - return "自定义"; - } -} +#define SDK SyncBox16ChSDK::ins() SyncBox16CH::SyncBox16CH(QWidget *parent) : QWidget(parent), ui(new Ui::SyncBox16CH) { ui->setupUi(this); + ZLOGI(TAG,"Hello"); { // // ui->StateGB->hide(); ui->OutputModeVal->addItems(QStringListValueOf(WorkModeStrList())); - ui->OutputPluseTypeVal->addItem(outputPluseType2Str(koutput_pluse_type_custom)); - ui->OutputPluseTypeVal->addItem(outputPluseType2Str(koutput_pluse_type_square_wave)); + // ui->OutputPluseTypeVal->addItem(outputPluseType2Str(koutput_pluse_type_custom)); + // ui->OutputPluseTypeVal->addItem(outputPluseType2Str(koutput_pluse_type_square_wave)); ui->OutputPluseWidthVal->setText("1"); ui->OutputPluseNumVal->setText("1"); ui->OutputPluseFreqVal->setText("1000"); } + SDK->getCmder()->regStateCbFn([this](bool connect) { + if (connect) { + ZQUI::ins()->setDeviceConnectedStatus(true); + } else { + ZQUI::ins()->setDeviceConnectedStatus(false); + } + }); + SDK->initialize(); - ZQUI::ins()->mainW()->setVersionInfo(1, "APP_VERSION", "1.0.0"); + // ZQUI::ins()->mainW()->setVersionInfo(1, "APP_VERSION", "1.0.0"); } SyncBox16CH::~SyncBox16CH() { delete ui; } @@ -59,8 +43,8 @@ SyncBox16CH::~SyncBox16CH() { delete ui; } void SyncBox16CH::on_OutputModeVal_currentIndexChanged(const QString &arg1) { onModeChange(); } void SyncBox16CH::on_OutputPluseTypeVal_currentIndexChanged(const QString &arg1) { onModeChange(); } void SyncBox16CH::onModeChange() { - WorkMode_t outputMode = syncbox16chsdk::WorkModeValueOf(ui->OutputModeVal->currentText().toStdString().c_str()); - OutputPluseType_t outputPluseType = outputPluseTypeStr2Enum(ui->OutputPluseTypeVal->currentText()); + WorkMode_t outputMode = syncbox16chsdk::WorkModeValueOf(ui->OutputModeVal->currentText().toStdString().c_str()); + // OutputPluseType_t outputPluseType = outputPluseTypeStr2Enum(ui->OutputPluseTypeVal->currentText()); // kWorkMode_extCpyMode, // kWorkMode_extTriMode, @@ -79,28 +63,38 @@ void SyncBox16CH::onModeChange() { // 脉冲频率 ui->OutputPluseFreqTag->hide(); ui->OutputPluseFreqVal->hide(); - } else if (outputMode == kWorkMode_manualTriMode || outputMode == kWorkMode_extTriMode) { + } else if (outputMode == kWorkMode_manualTriMode) { // 脉冲数量 ui->OutputPluseNumVal->show(); ui->OutputPluseNumTag->show(); // 脉冲宽度 - if (outputPluseType == koutput_pluse_type_custom) { - ui->OutputPluseWidthVal->show(); - ui->OutputPluseWidthTag->show(); - } else if (outputPluseType == koutput_pluse_type_square_wave) { - ui->OutputPluseWidthVal->hide(); - ui->OutputPluseWidthTag->hide(); - } - // 脉冲类型 - ui->OutputPluseTypeVal->show(); - ui->OutputPluseTypeTag->show(); + ui->OutputPluseWidthVal->show(); + ui->OutputPluseWidthTag->show(); // 脉冲频率 ui->OutputPluseFreqTag->show(); ui->OutputPluseFreqVal->show(); + } else if (outputMode == kWorkMode_extTriMode) { + // 脉冲数量 + ui->OutputPluseNumVal->show(); + ui->OutputPluseNumTag->show(); + // 脉冲宽度 + ui->OutputPluseWidthVal->show(); + ui->OutputPluseWidthTag->show(); + // 脉冲频率 + ui->OutputPluseFreqTag->hide(); + ui->OutputPluseFreqVal->hide(); } } void SyncBox16CH::on_SendButton_clicked() { ICLEAR(); - ISHOW("on send button"); + + WorkMode_t outputMode = syncbox16chsdk::WorkModeValueOf(ui->OutputModeVal->currentText()); + uint32_t outputPluseWidthUs = zstr2int(ui->OutputPluseWidthVal->text()); + uint32_t outputPluseNum = zstr2int(ui->OutputPluseNumVal->text()); + + if (outputMode == kWorkMode_extTriMode && outputPluseNum == 0) { + ISHOW_ERROR("外部触发模式下,脉冲数量不能为0"); + return; + } } diff --git a/src/app/syncbox16ch/syncbox16ch.ui b/src/app/syncbox16ch/syncbox16ch.ui index 46707b6..990b398 100644 --- a/src/app/syncbox16ch/syncbox16ch.ui +++ b/src/app/syncbox16ch/syncbox16ch.ui @@ -187,7 +187,7 @@ - 脉冲数量 + 脉冲数量(0:无限脉冲) diff --git a/src/app/syncbox16ch/syncbox16ch_sdk.cpp b/src/app/syncbox16ch/syncbox16ch_sdk.cpp index af9c58d..e06a898 100644 --- a/src/app/syncbox16ch/syncbox16ch_sdk.cpp +++ b/src/app/syncbox16ch/syncbox16ch_sdk.cpp @@ -17,8 +17,9 @@ enummap_iterm_t output_mode_enummap[] = { }; const char* WorkModeToStr(uint32_t mode) { return EnumMapValue2Str(output_mode_enummap, mode); } -WorkMode_t WorkModeValueOf(const char* str) { return (WorkMode_t)EnumMapStr2Value(output_mode_enummap, str); } +WorkMode_t WorkModeValueOf(const char* str) { return (WorkMode_t)EnumMapStr2Value(output_mode_enummap, str); } list WorkModeStrList() { return EnumMapStrList(output_mode_enummap); } +WorkMode_t WorkModeValueOf(QString str) { return WorkModeValueOf(str.toStdString().c_str()); } } // namespace syncbox16chsdk } // namespace iflytop @@ -28,4 +29,8 @@ list WorkModeStrList() { return EnumMapStrList(output_mode_enummap); } ***********************************************************************************************************************/ using namespace iflytop; using namespace syncbox16chsdk; -void SyncBox16ChSDK::initialize() { ZFPGACommander::ins()->initialize(); } +void SyncBox16ChSDK::initialize() { + ZFPGACommander::ins()->initialize(); + + +} diff --git a/src/app/syncbox16ch/syncbox16ch_sdk.hpp b/src/app/syncbox16ch/syncbox16ch_sdk.hpp index 88001bb..9657393 100644 --- a/src/app/syncbox16ch/syncbox16ch_sdk.hpp +++ b/src/app/syncbox16ch/syncbox16ch_sdk.hpp @@ -15,6 +15,20 @@ #include "protocol/zfpga_commander/zfpga_commander.hpp" #include "zfpga_basic_protocol/zaf_protocol.h" #include "zfpga_basic_protocol/zaf_regs.hpp" +// + +#include +#include +#include +#include +#include +#include +#include +#include +#include +// + +#define REGADDOFF__FPGA_APP 0x1020 namespace iflytop { namespace syncbox16chsdk { @@ -26,14 +40,21 @@ typedef enum { kWorkMode_manualTriMode, } WorkMode_t; -typedef struct { +typedef enum { + kreg_app = REGADDOFF__FPGA_APP, + kreg_workmode = REGADDOFF__FPGA_APP + 1, + kreg_pluse_gen_num = REGADDOFF__FPGA_APP + 2, + kreg_pluse_pluse_width = REGADDOFF__FPGA_APP + 3, } reg_t; const char* WorkModeToStr(uint32_t mode); WorkMode_t WorkModeValueOf(const char* str); +WorkMode_t WorkModeValueOf(QString str); list WorkModeStrList(); class SyncBox16ChSDK { + unique_ptr m_thread; + public: static SyncBox16ChSDK* ins() { static SyncBox16ChSDK cmder; @@ -47,6 +68,8 @@ class SyncBox16ChSDK { void setPluseFreq(uint32_t freq); void setPluseGeneratorMode(); + ZFPGACommander* getCmder() { return ZFPGACommander::ins(); } + public: }; } // namespace syncbox16chsdk diff --git a/src/protocol/zfpga_commander/zfpga_commander.cpp b/src/protocol/zfpga_commander/zfpga_commander.cpp index 5bdd60b..31664b2 100644 --- a/src/protocol/zfpga_commander/zfpga_commander.cpp +++ b/src/protocol/zfpga_commander/zfpga_commander.cpp @@ -10,10 +10,12 @@ using namespace iflytop; -#define TAG "Syncbox16ch" +#define TAG "ZFPGACommander" QTSerialChannel *serial_ch; +#define DEBUG + #define PACKET_LEN(__packet) (sizeof(zaf_packet_header_t) + (__packet->ndata) * sizeof(uint32_t) + 1 /*checksum*/ + 2 /*tail*/) #define DO_CMD(exptr) \ { \ @@ -21,6 +23,16 @@ QTSerialChannel *serial_ch; if (ecode != kaf_ec_success) return ecode; \ } +static string hex2str(uint8_t *hex, size_t len) { + string str; + for (size_t i = 0; i < len; i++) { + char buf[3]; + sprintf(buf, "%02X", hex[i]); + str += buf; + } + return str; +} + void ZFPGACommander::initialize() { // serial_ch = &ChannelMgr::ins()->serialCh; @@ -38,7 +50,7 @@ void ZFPGACommander::initialize() { m_thread.reset(new thread([this]() { uint32_t last_rx_cnt = 0; uint8_t rx_process_cache[1024]; - uint32_t rx_process_cache_len; + uint32_t rx_process_cache_len = 0; while (true) { this_thread::sleep_for(chrono::milliseconds(4)); @@ -62,10 +74,38 @@ void ZFPGACommander::initialize() { last_rx_cnt = m_rxlen; } })); + m_online_detect_thread.reset(new thread([this]() { + while (true) { + this_thread::sleep_for(chrono::milliseconds(500)); + bool tostate = false; + if (ping()) { + tostate = true; + } else { + tostate = false; + } + + if (tostate != isconnected) { + if (tostate) { + ZLOGI(TAG, "device connected."); + } else { + ZLOGI(TAG, "device disconnected."); + } + isconnected = tostate; + if (m_stateCbFn) m_stateCbFn(isconnected); + } + } + })); } -void ZFPGACommander::regRawDataListener(binary_cb_t cb) {} +void ZFPGACommander::regRawDataListener(binary_cb_t cb) { m_raw_data_cb = cb; } +void ZFPGACommander::regStateCbFn(StateCbFn_t cbfn) { this->m_stateCbFn = cbfn; } + +bool ZFPGACommander::chIsOn() { return serial_ch->isOpen(); } void ZFPGACommander::processRxData(uint8_t *rx, uint32_t rxlen) { +#ifdef DEBUG + ZLOGI(TAG, "RX %s", hex2str((uint8_t *)rx, rxlen).c_str()); +#endif + for (uint32_t i = 0; i < rxlen; i++) { zaf_packet_header_t *header = (zaf_packet_header_t *)(&rx[i]); uint8_t *packetu8 = &rx[i]; @@ -141,6 +181,9 @@ void ZFPGACommander::sendPacket(zaf_packet_header_t *packet, uint32_t len, uint3 if (m_raw_data_cb) { m_raw_data_cb(kuart_raw_tx, (uint8_t *)packet, PACKET_LEN(packet)); } +#ifdef DEBUG + ZLOGI(TAG, "TX %s", hex2str((uint8_t *)packet, len).c_str()); +#endif serial_ch->send((uint8_t *)packet, len); for (size_t i = 0; i < overtime; i++) { { @@ -281,13 +324,12 @@ void ZFPGACommander::readFPGAVersion(Version &version) { } void ZFPGACommander::readStm32Version(Version &version) { uint32_t version32; - readReg(kreg_software_version, version32, 100); + readReg(kreg_software_version, version32, 10); } bool ZFPGACommander::ping() { try { - Version version; - readStm32Version(version); + callcmd(kzaf_cmd_ping, 10); } catch (const std::exception &e) { return false; } diff --git a/src/protocol/zfpga_commander/zfpga_commander.hpp b/src/protocol/zfpga_commander/zfpga_commander.hpp index 5005ba8..f36aa68 100644 --- a/src/protocol/zfpga_commander/zfpga_commander.hpp +++ b/src/protocol/zfpga_commander/zfpga_commander.hpp @@ -24,7 +24,7 @@ typedef enum { kuart_raw_rx, } uart_message_type_t; -typedef function device_state_cb_t; +typedef function StateCbFn_t; typedef function binary_cb_t; @@ -74,12 +74,16 @@ class ZFPGACommander { unique_ptr m_thread; + unique_ptr m_online_detect_thread; + ZFPGARxReceiptContext m_rxReceiptContext; mutex m_rxReceiptContext_lock; mutex m_tx_lock; binary_cb_t m_raw_data_cb; - uint16_t txindex = 0; + StateCbFn_t m_stateCbFn; + uint16_t txindex = 0; + bool isconnected = false; map m_reginfoMap; @@ -91,6 +95,8 @@ class ZFPGACommander { void initialize(); void regRawDataListener(binary_cb_t cb); + void regStateCbFn(StateCbFn_t cbfn); + bool chIsOn(); public: void writeReg(uint32_t regadd, uint32_t regvalue, uint32_t ®backvalue, int32_t overtime_ms); diff --git a/src/qtutils/qtutils.hpp b/src/qtutils/qtutils.hpp index 66a4979..42b0ae3 100644 --- a/src/qtutils/qtutils.hpp +++ b/src/qtutils/qtutils.hpp @@ -26,4 +26,22 @@ namespace iflytop { using namespace std; QStringList QStringListValueOf(list strlist); +static inline const uint32_t zstr2int(QString str) { + // 如果0x开头,??16进制转换 + // 如果0b开头,??2进制转换 + // 否则??10进制转换 + // 去除掉str中_ + str.remove("_"); + + if (str.startsWith("0x")) { + return str.toUInt(nullptr, 16); + } else if (str.startsWith("0b")) { + // remove 0b + str.remove(0, 2); + return str.toUInt(nullptr, 2); + } else { + return str.toUInt(nullptr, 10); + } +} + } // namespace iflytop \ No newline at end of file diff --git a/src/zqui/zqui/mainwindow.cpp b/src/zqui/zqui/mainwindow.cpp index d66202c..7fa5415 100644 --- a/src/zqui/zqui/mainwindow.cpp +++ b/src/zqui/zqui/mainwindow.cpp @@ -28,6 +28,7 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWi void MainWindow::buildUI() { QTSerialChannel *serialch = &ChannelMgr::ins()->serialCh; + serialch->init(); /** * @brief 指令串口UI @@ -38,6 +39,9 @@ void MainWindow::buildUI() { ui->serialBaudrateCB->addItem("500000"); ui->serialBaudrateCB->addItem("2000000"); ui->serialBaudrateCB->setCurrentIndex(0); + ui->serialRefreshKey->hide(); + + connect(ui->serialRefreshKey, &QPushButton::clicked, this, [=](bool check) { fillinSerialPort(); }); connect(ui->serialOpenKey, &QPushButton::clicked, this, [=](bool check) { // 打开串口 @@ -99,8 +103,9 @@ void MainWindow::fillinSerialPort() { // int curIndex = ui->serialPortCB->currentIndex(); ui->serialPortCB->clear(); const auto infos = QSerialPortInfo::availablePorts(); + for (const QSerialPortInfo &info : infos) { - if (info.isBusy()) continue; + // if (info.isBusy()) continue; ui->serialPortCB->addItem(info.portName()); } } diff --git a/src/zqui/zqui/mainwindow.ui b/src/zqui/zqui/mainwindow.ui index 5475939..5911e5c 100644 --- a/src/zqui/zqui/mainwindow.ui +++ b/src/zqui/zqui/mainwindow.ui @@ -685,34 +685,41 @@ background-color: rgb(245, 245, 245); 端口 - - + + - 波特率 + 串口号 - - + + + + QComboBox::AdjustToContents + + + + + + + + - 串口号 + 波特率 - + 打开 - - - - - - - QComboBox::AdjustToContents + + + + 刷新 diff --git a/src/zqui/zqui/zqui.cpp b/src/zqui/zqui/zqui.cpp index 33404a7..1475e96 100644 --- a/src/zqui/zqui/zqui.cpp +++ b/src/zqui/zqui/zqui.cpp @@ -26,8 +26,7 @@ void ZQUI::iShow(const char *fmt, ...) { va_end(args); QString text(buf); - doinui([this,text](){ pmainW->iShow(text); }); - + doinui([this, text]() { pmainW->iShow(text); }); } void ZQUI::iRawShow(const char *fmt, ...) { va_list args; @@ -37,7 +36,7 @@ void ZQUI::iRawShow(const char *fmt, ...) { va_end(args); QString text(buf); pmainW->iShow(text); - doinui([this,text](){ pmainW->iShow(text); }); + doinui([this, text]() { pmainW->iShow(text); }); } void ZQUI::iClear() { pmainW->iClear(); } @@ -48,8 +47,7 @@ void ZQUI::reportShow(const char *fmt, ...) { vsnprintf(buf, sizeof(buf), fmt, args); va_end(args); QString text(buf); - doinui([this,text](){ pmainW->reportShow(text); }); - + doinui([this, text]() { pmainW->reportShow(text); }); } void ZQUI::reportClear() { pmainW->reportClear(); } @@ -60,8 +58,7 @@ void ZQUI::binaryShow(const char *fmt, ...) { vsnprintf(buf, sizeof(buf), fmt, args); va_end(args); QString text(buf); - doinui([this,text](){ pmainW->binaryShow(text); }); - + doinui([this, text]() { pmainW->binaryShow(text); }); } void ZQUI::binaryClear() { pmainW->binaryClear(); } @@ -112,4 +109,6 @@ void ZQUI::doinui_slot(QFunction func) { if (func.get()) func.get()(); } -void ZQUI::setDeviceConnectedStatus(bool connect) { pmainW->setConnectedStatus(connect); } +void ZQUI::setDeviceConnectedStatus(bool connect) { + DOINUI(([this, connect]() { pmainW->setConnectedStatus(connect); })); +} diff --git a/src/zqui/zqui/zqui.hpp b/src/zqui/zqui/zqui.hpp index be25c28..02c7bb7 100644 --- a/src/zqui/zqui/zqui.hpp +++ b/src/zqui/zqui/zqui.hpp @@ -34,6 +34,7 @@ #include #include +#include "../base/logger.hpp" #include "mainwindow.h" #include "zqui/base/QFunction.hpp" @@ -78,9 +79,10 @@ class ZQUI : public QObject { void doinui_signal(QFunction); }; -#define ISHOW(fmt, ...) ZQUI::ins()->iShow(fmt, ##__VA_ARGS__) -#define IRSHOW(fmt, ...) ZQUI::ins()->iRawShow(fmt, ##__VA_ARGS__) -#define ICLEAR() ZQUI::ins()->iClear() +#define ISHOW(fmt, ...) ZQUI::ins()->iShow(fmt, ##__VA_ARGS__) +#define ISHOW_ERROR(fmt, ...) ZQUI::ins()->iShow("错误: ", fmt, ##__VA_ARGS__) +#define IRSHOW(fmt, ...) ZQUI::ins()->iRawShow(fmt, ##__VA_ARGS__) +#define ICLEAR() ZQUI::ins()->iClear() #define RSHOW(fmt, ...) ZQUI::ins()->reportShow(fmt, ##__VA_ARGS__) #define RCLEAR() ZQUI::ins()->reportClear() @@ -88,4 +90,4 @@ class ZQUI : public QObject { #define BSHOW(fmt, ...) ZQUI::ins()->binaryShow(fmt, ##__VA_ARGS__) #define BCLEAR() ZQUI::ins()->binaryClear() -#define DOINUI(fn) ZQUI::ins()->doinui(fn) \ No newline at end of file +#define DOINUI(fn) ZQUI::ins()->doinui(fn) diff --git a/zfpga_basic_protocol b/zfpga_basic_protocol index 9e7042b..e3db34b 160000 --- a/zfpga_basic_protocol +++ b/zfpga_basic_protocol @@ -1 +1 @@ -Subproject commit 9e7042b03742e5d8985b977f4457cbaf2b04c909 +Subproject commit e3db34bff7e93791f78fc1c8d6fa6333561f1037