You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

605 lines
29 KiB

#include "mainwindow.h"
#include <QDateTime>
#include <QMessageBox>
#include <QtConcurrent>
#include <QtSerialPort/QSerialPort>
#include <QtSerialPort/QSerialPortInfo>
#include "./ui_mainwindow.h"
#include "camera_light_src_timing_controller/qt_serial_datachannel.hpp"
#include "logger.hpp"
using namespace iflytop;
using namespace clst;
using namespace std;
static MainWindow *m_mainWindow;
static CLSTControler *m_clstc;
QTimer *timer;
#define TAG "MainWindow"
static const char *fmt(const char *fmt, ...) {
va_list args;
va_start(args, fmt);
static char buf[1024] = {0};
vsnprintf(buf, sizeof(buf), fmt, args);
va_end(args);
return buf;
}
static const uint32_t str2int(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);
}
}
// static QSerialPort G_SerialPort;
// static QThread G_SerialPortThread;
static QTDataChannel G_QTDataChannel;
static const QString zaferror_to_str(zaf_error_code_t value) {
if (value == kaf_ec_overtime) {
return "操作超时";
} else if (value == kaf_ec_device_notopen) {
return "设备未打开";
} else {
return "未知错误";
}
}
#define DO(action) \
{ \
zaf_error_code_t ecode = action; \
if (ecode != kaf_ec_success) { \
dumpLog("do %s fail,%s", #action, zaferror_to_str(ecode).toStdString().c_str()); \
return; \
} \
}
void MainWindow::log_output(QtMsgType type, const QMessageLogContext &context, const QString &msg) {
// QString text;
// text.append(msg);
}
// void MainWindow::append_log_slot(QString text) { ui->logbrowser->append(text); }
void MainWindow::doinui_slot(QFunction func) {
if (func.get()) func.get()();
}
void MainWindow::updatePage() {
{
float Freq;
uint32_t PluseCnt;
uint32_t SeqCtrlPluseCntMax;
Freq = ui->InterClk_Freq_Text->text().toFloat();
PluseCnt = ui->InterClk_PluseCnt_Text->text().toUInt();
SeqCtrlPluseCntMax = ui->InterClk_SeqCtrlPluseCntMax_Text->text().toUInt();
DO(m_clstc->InterClk_setFreq(Freq));
DO(m_clstc->InterClk_setPluseCnt(PluseCnt));
DO(m_clstc->InterClk_setSeqCtrlPluseCntMax(SeqCtrlPluseCntMax));
}
{
ExtTriggerSrcType src;
SigProcessMode mode;
TriggerEdge edge;
uint32_t coefficient;
uint32_t bias;
uint32_t division;
uint32_t multiplication;
#define UPDATE(index) \
src = ExtTriggerSrcType(ui->TriInX_SrcSelect_Val_##index->currentText().toStdString()); \
coefficient = ui->TriInX_FileterCoefficient_Val_##index->text().toUInt(); \
bias = ui->TriInX_FreqDetectBias_Val_##index->text().toUInt(); \
mode = SigProcessMode(ui->TriInX_Mode_Val_##index->currentText().toStdString()); \
edge = TriggerEdge(ui->TriInX_TriggerModeTriggerEdge_Val_##index->currentText().toStdString()); \
division = ui->TriInX_TriggerModeFreqDivision_Val_##index->text().toUInt(); \
multiplication = ui->TriInX_TriggerModeFreqMultiplication_Val_##index->text().toUInt(); \
DO(m_clstc->TriInX_setSrcSelect(index, src)); \
DO(m_clstc->TriInX_setFileterCoefficient(index, coefficient)); \
DO(m_clstc->TriInX_setFreqDetectBias(index, bias)); \
DO(m_clstc->TriInX_setMode(index, mode)); \
DO(m_clstc->TriInX_setTriggerModeTriggerEdge(index, edge)); \
DO(m_clstc->TriInX_setTriggerModeFreqDivision(index, division)); \
DO(m_clstc->TriInX_setTriggerModeFreqMultiplication(index, multiplication));
UPDATE(1);
UPDATE(2);
UPDATE(3);
UPDATE(4);
#undef UPDATE
}
{
InternalSig src;
uint32_t width;
uint32_t offset;
float duty;
float freq;
#define UPDATE(index) \
src = InternalSig(ui->LightSrcX_TriSrc_##index->currentText().toStdString()); \
width = ui->LightSrcX_TriggerModePluseWidth_##index->text().toUInt(); \
offset = ui->LightSrcX_TriggerModeFirstPluseOffset_##index->text().toUInt(); \
duty = ui->LightSrcX_LightIntensityDuty_##index->text().toFloat(); \
freq = ui->LightSrcX_LightDriverFreq_##index->text().toFloat(); \
DO(m_clstc->LightSrcX_setTriSrc(index, src)); \
DO(m_clstc->LightSrcX_setTriggerModePluseWidth(index, width)); \
DO(m_clstc->LightSrcX_setTriggerModeFirstPluseOffset(index, offset)); \
DO(m_clstc->LightSrcX_setLightIntensityDuty(index, duty)); \
DO(m_clstc->LightSrcX_setLightDriverFreq(index, freq));
UPDATE(1);
UPDATE(2);
UPDATE(3);
UPDATE(4);
}
}
void MainWindow::refreshReadonlyPage() {
zaf_error_code_t ecode;
if (!G_QTDataChannel.isOpen()) {
return;
}
{
float TriOutSignalFreq;
DO(m_clstc->InterClk_readTriOutSignalFreq(TriOutSignalFreq));
ui->InterClk_TriOutSignalFreq_Text->setText(QString::number(TriOutSignalFreq, 'f', 2));
}
{
float infreq;
float outfreq;
#define UPDATE(index) \
DO(m_clstc->TriInX_readInSignalFreq(index, infreq)); \
DO(m_clstc->TriInX_readOutSignalFreq(index, outfreq)); \
ui->TriInX_OutSignalFreq_Val_##index->setText(QString::number(outfreq, 'f', 2)); \
ui->TriInX_InSignalFreq_Val_##index->setText(QString::number(infreq, 'f', 2));
UPDATE(1);
UPDATE(2);
UPDATE(3);
UPDATE(4);
#undef UPDATE
}
// 刷新光源时序控制页面
{
float infreq;
float outfreq;
uint32_t state;
#define UPDATE(index) \
DO(m_clstc->LightSrcX_readInSigFreqDetect(index, infreq)); \
DO(m_clstc->LightSrcX_readOutSigFreqDetect(index, outfreq)); \
DO(m_clstc->LightSrcX_readLightSrcErrorState(index, state)); \
ui->LightSrcX_InSigFreqDetect_##index->setText(QString::number(infreq, 'f', 2)); \
ui->LightSrcX_OutSigFreqDetect_##index->setText(QString::number(outfreq, 'f', 2)); \
ui->LightSrcX_LightSrcErrorState_##index->setText(QString::number(state));
UPDATE(1);
UPDATE(2);
UPDATE(3);
UPDATE(4);
}
}
void MainWindow::refreshPage() {
/*******************************************************************************
* 刷新内部触发源页面 *
*******************************************************************************/
{
float Freq;
uint32_t PluseCnt;
uint32_t SeqCtrlPluseCntMax;
float TriOutSignalFreq;
DO(m_clstc->InterClk_getFreq(Freq));
DO(m_clstc->InterClk_getPluseCnt(PluseCnt));
DO(m_clstc->InterClk_getSeqCtrlPluseCntMax(SeqCtrlPluseCntMax));
DO(m_clstc->InterClk_readTriOutSignalFreq(TriOutSignalFreq));
ui->InterClk_Freq_Text->setText(QString::number(Freq, 'f', 2));
ui->InterClk_PluseCnt_Text->setText(QString::number(PluseCnt));
ui->InterClk_SeqCtrlPluseCntMax_Text->setText(QString::number(SeqCtrlPluseCntMax));
ui->InterClk_TriOutSignalFreq_Text->setText(QString::number(TriOutSignalFreq, 'f', 2));
}
/*******************************************************************************
* 刷新外部触发源页面 *
*******************************************************************************/
{
ExtTriggerSrcType src;
SigProcessMode mode;
TriggerEdge edge;
uint32_t coefficient;
uint32_t bias;
uint32_t division;
uint32_t multiplication;
float infreq;
float outfreq;
#define UPDATE(index) \
DO(m_clstc->TriInX_getSrcSelect(index, src)); \
DO(m_clstc->TriInX_getFileterCoefficient(index, coefficient)); \
DO(m_clstc->TriInX_getFreqDetectBias(index, bias)); \
DO(m_clstc->TriInX_getMode(index, mode)); \
DO(m_clstc->TriInX_getTriggerModeTriggerEdge(index, edge)); \
DO(m_clstc->TriInX_getTriggerModeFreqDivision(index, division)); \
DO(m_clstc->TriInX_getTriggerModeFreqMultiplication(index, multiplication)); \
DO(m_clstc->TriInX_readInSignalFreq(index, infreq)); \
DO(m_clstc->TriInX_readOutSignalFreq(index, outfreq)); \
ui->TriInX_SrcSelect_Val_##index->setCurrentText(QString::fromStdString(src.toString())); \
ui->TriInX_FileterCoefficient_Val_##index->setText(QString::number(coefficient)); \
ui->TriInX_FreqDetectBias_Val_##index->setText(QString::number(bias)); \
ui->TriInX_Mode_Val_##index->setCurrentText(QString::fromStdString(mode.toString())); \
ui->TriInX_OutSignalFreq_Val_##index->setText(QString::number(outfreq, 'f', 2)); \
ui->TriInX_InSignalFreq_Val_##index->setText(QString::number(infreq, 'f', 2)); \
ui->TriInX_TriggerModeFreqDivision_Val_##index->setText(QString::number(division)); \
ui->TriInX_TriggerModeFreqMultiplication_Val_##index->setText(QString::number(multiplication)); \
ui->TriInX_TriggerModeTriggerEdge_Val_##index->setCurrentText(QString::fromStdString(edge.toString()));
UPDATE(1);
UPDATE(2);
UPDATE(3);
UPDATE(4);
#undef UPDATE
}
// 刷新光源时序控制页面
{
InternalSig src;
uint32_t width;
uint32_t offset;
float duty;
float freq;
uint32_t state;
float infreq;
float outfreq;
#define UPDATE(index) \
DO(m_clstc->LightSrcX_getTriSrc(index, src)); \
DO(m_clstc->LightSrcX_getTriggerModePluseWidth(index, width)); \
DO(m_clstc->LightSrcX_getTriggerModeFirstPluseOffset(index, offset)); \
DO(m_clstc->LightSrcX_getLightIntensityDuty(index, duty)); \
DO(m_clstc->LightSrcX_getLightDriverFreq(index, freq)); \
DO(m_clstc->LightSrcX_readLightSrcErrorState(index, state)); \
DO(m_clstc->LightSrcX_readInSigFreqDetect(index, infreq)); \
DO(m_clstc->LightSrcX_readOutSigFreqDetect(index, outfreq)); \
ui->LightSrcX_TriSrc_##index->setCurrentText(QString::fromStdString(src.toString())); \
ui->LightSrcX_TriggerModePluseWidth_##index->setText(QString::number(width)); \
ui->LightSrcX_TriggerModeFirstPluseOffset_##index->setText(QString::number(offset)); \
ui->LightSrcX_LightIntensityDuty_##index->setText(QString::number(duty, 'f', 2)); \
ui->LightSrcX_LightDriverFreq_##index->setText(QString::number(freq, 'f', 2)); \
ui->LightSrcX_LightSrcErrorState_##index->setText(QString::number(state)); \
ui->LightSrcX_InSigFreqDetect_##index->setText(QString::number(infreq, 'f', 2)); \
ui->LightSrcX_OutSigFreqDetect_##index->setText(QString::number(outfreq, 'f', 2));
UPDATE(1);
UPDATE(2);
UPDATE(3);
UPDATE(4);
}
}
void MainWindow::constructUI() {
/*******************************************************************************
* serialPortCB *
*******************************************************************************/
const auto infos = QSerialPortInfo::availablePorts();
for (const QSerialPortInfo &info : infos) {
ui->serialPortCB->addItem(info.portName());
}
/*******************************************************************************
* 波特率填?? *
*******************************************************************************/
ui->serialBaudrateCB->addItem("9600");
ui->serialBaudrateCB->addItem("14400");
ui->serialBaudrateCB->addItem("19200");
ui->serialBaudrateCB->addItem("38400");
ui->serialBaudrateCB->addItem("57600");
ui->serialBaudrateCB->addItem("115200");
ui->serialBaudrateCB->setCurrentIndex(5);
/*******************************************************************************
* 刷新串口 *
*******************************************************************************/
connect(ui->serialPortRefreshKey, &QPushButton::clicked, this, [this](bool check) {
ui->serialPortCB->clear();
const auto infos = QSerialPortInfo::availablePorts();
for (const QSerialPortInfo &info : infos) {
ui->serialPortCB->addItem(info.portName());
}
});
/*******************************************************************************
* 打开串口 *
*******************************************************************************/
connect(ui->serialOpenKey, &QPushButton::clicked, this, [=](bool check) {
// 打开串口
if (ui->serialOpenKey->text() == "打开") {
G_QTDataChannel.setPortName(ui->serialPortCB->currentText().toStdString());
G_QTDataChannel.setBaudRate(ui->serialBaudrateCB->currentText().toInt());
G_QTDataChannel.setDataBits(QSerialPort::Data8);
G_QTDataChannel.setParity(QSerialPort::NoParity);
G_QTDataChannel.setFlowControl(QSerialPort::NoFlowControl);
G_QTDataChannel.setStopBits(QSerialPort::OneStop);
if (!G_QTDataChannel.open()) {
QMessageBox::about(NULL, "提示", "串口无法打开,串口不存在或已被占??");
return;
}
ui->serialOpenKey->setText("关闭");
// 下拉菜单控件使能
ui->serialBaudrateCB->setEnabled(false);
ui->serialPortCB->setEnabled(false);
ui->serialPortRefreshKey->setEnabled(false);
} else {
G_QTDataChannel.close();
ui->serialOpenKey->setText("打开");
ui->serialBaudrateCB->setEnabled(true);
ui->serialPortCB->setEnabled(true);
ui->serialPortRefreshKey->setEnabled(true);
}
});
/*******************************************************************************
* 刷新页面 *
*******************************************************************************/
connect(ui->refreshPageKey, &QPushButton::clicked, this, [=](bool check) { //
refreshPage();
dumpLog("刷新成功");
});
connect(ui->UpdateCfg_Key, &QPushButton::clicked, this, [=](bool check) { //
updatePage();
refreshPage();
dumpLog("提交成功");
});
/*******************************************************************************
* 保存配置 *
*******************************************************************************/
connect(ui->storageConfigKey, &QPushButton::clicked, this, [=](bool check) { //
DO(m_clstc->storageConfigs());
dumpLog("保存配置成功");
});
/*******************************************************************************
* 重启设备 *
*******************************************************************************/
connect(ui->rebootDeviceKey, &QPushButton::clicked, this, [=](bool check) { //
DO(m_clstc->reboot());
dumpLog("重启设备成功");
});
/*******************************************************************************
* 恢复出厂设置 *
*******************************************************************************/
connect(ui->factoryResetKey, &QPushButton::clicked, this, [=](bool check) { //
DO(m_clstc->factoryReset());
dumpLog("恢复出厂设置成功");
});
/*******************************************************************************
* 寄存器操?? *
*******************************************************************************/
ui->RegAdd->setText("0x00000000");
connect(ui->regReadKey, &QPushButton::clicked, this, [=](bool check) { //
uint32_t addr = str2int(ui->RegAdd->text());
uint32_t value = 0;
DO(m_clstc->reg_read(addr, value, 100));
ui->regReadbakVal->setText(fmt("0x%08X", value));
dumpLog(fmt("读取0x%04x成功", addr));
});
connect(ui->regWriteKey, &QPushButton::clicked, this, [=](bool check) { //
uint32_t addr = str2int(ui->RegAdd->text());
uint32_t value = str2int(ui->regWriteVal->text());
uint32_t readkbak = 0;
DO(m_clstc->reg_write(addr, value, readkbak, 100));
ui->regReadbakVal->setText(fmt("0x%04x", readkbak));
dumpLog(fmt("写入0x%08x成功", addr));
});
connect(ui->InterClk_trigger_Key, &QPushButton::clicked, this, [=](bool check) { //
DO(m_clstc->InterClk_trigger());
dumpLog(fmt("触发成功"));
});
connect(ui->InterClk_stop_Key, &QPushButton::clicked, this, [=](bool check) { //
DO(m_clstc->InterClk_stop());
dumpLog(fmt("停止触发成功"));
});
/*******************************************************************************
* 外部触发页面初始化 *
*******************************************************************************/
ui->TriInX_SrcSelect_Val_1->addItem(QString::fromStdString(ExtTriggerSrcType(ExtTriggerSrcType::DIFF_INPUT).toString()));
ui->TriInX_SrcSelect_Val_1->addItem(QString::fromStdString(ExtTriggerSrcType(ExtTriggerSrcType::OPTOCOUPLER_INPUT).toString()));
ui->TriInX_Mode_Val_1->addItem(QString::fromStdString(SigProcessMode(SigProcessMode::TRIGGER_MODE).toString()));
ui->TriInX_Mode_Val_1->addItem(QString::fromStdString(SigProcessMode(SigProcessMode::TRANSPARENT_MODE).toString()));
ui->TriInX_TriggerModeTriggerEdge_Val_1->addItem(QString::fromStdString(TriggerEdge(TriggerEdge::RISING).toString()));
ui->TriInX_TriggerModeTriggerEdge_Val_1->addItem(QString::fromStdString(TriggerEdge(TriggerEdge::FALLING).toString()));
ui->TriInX_SrcSelect_Val_2->addItem(QString::fromStdString(ExtTriggerSrcType(ExtTriggerSrcType::DIFF_INPUT).toString()));
ui->TriInX_SrcSelect_Val_2->addItem(QString::fromStdString(ExtTriggerSrcType(ExtTriggerSrcType::OPTOCOUPLER_INPUT).toString()));
ui->TriInX_Mode_Val_2->addItem(QString::fromStdString(SigProcessMode(SigProcessMode::TRIGGER_MODE).toString()));
ui->TriInX_Mode_Val_2->addItem(QString::fromStdString(SigProcessMode(SigProcessMode::TRANSPARENT_MODE).toString()));
ui->TriInX_TriggerModeTriggerEdge_Val_2->addItem(QString::fromStdString(TriggerEdge(TriggerEdge::RISING).toString()));
ui->TriInX_TriggerModeTriggerEdge_Val_2->addItem(QString::fromStdString(TriggerEdge(TriggerEdge::FALLING).toString()));
ui->TriInX_SrcSelect_Val_3->addItem(QString::fromStdString(ExtTriggerSrcType(ExtTriggerSrcType::DIFF_INPUT).toString()));
ui->TriInX_SrcSelect_Val_3->addItem(QString::fromStdString(ExtTriggerSrcType(ExtTriggerSrcType::OPTOCOUPLER_INPUT).toString()));
ui->TriInX_Mode_Val_3->addItem(QString::fromStdString(SigProcessMode(SigProcessMode::TRIGGER_MODE).toString()));
ui->TriInX_Mode_Val_3->addItem(QString::fromStdString(SigProcessMode(SigProcessMode::TRANSPARENT_MODE).toString()));
ui->TriInX_TriggerModeTriggerEdge_Val_3->addItem(QString::fromStdString(TriggerEdge(TriggerEdge::RISING).toString()));
ui->TriInX_TriggerModeTriggerEdge_Val_3->addItem(QString::fromStdString(TriggerEdge(TriggerEdge::FALLING).toString()));
ui->TriInX_SrcSelect_Val_4->addItem(QString::fromStdString(ExtTriggerSrcType(ExtTriggerSrcType::DIFF_INPUT).toString()));
ui->TriInX_SrcSelect_Val_4->addItem(QString::fromStdString(ExtTriggerSrcType(ExtTriggerSrcType::OPTOCOUPLER_INPUT).toString()));
ui->TriInX_Mode_Val_4->addItem(QString::fromStdString(SigProcessMode(SigProcessMode::TRIGGER_MODE).toString()));
ui->TriInX_Mode_Val_4->addItem(QString::fromStdString(SigProcessMode(SigProcessMode::TRANSPARENT_MODE).toString()));
ui->TriInX_TriggerModeTriggerEdge_Val_4->addItem(QString::fromStdString(TriggerEdge(TriggerEdge::RISING).toString()));
ui->TriInX_TriggerModeTriggerEdge_Val_4->addItem(QString::fromStdString(TriggerEdge(TriggerEdge::FALLING).toString()));
ui->TriInX_InSignalFreq_Val_1->setDisabled(true);
ui->TriInX_InSignalFreq_Val_2->setDisabled(true);
ui->TriInX_InSignalFreq_Val_3->setDisabled(true);
ui->TriInX_InSignalFreq_Val_4->setDisabled(true);
ui->TriInX_OutSignalFreq_Val_1->setDisabled(true);
ui->TriInX_OutSignalFreq_Val_2->setDisabled(true);
ui->TriInX_OutSignalFreq_Val_3->setDisabled(true);
ui->TriInX_OutSignalFreq_Val_4->setDisabled(true);
/*******************************************************************************
* 光源时序配置 *
*******************************************************************************/
QStringList LightSrcX_TriSrc_QStringList;
LightSrcX_TriSrc_QStringList.append(QString::fromStdString(InternalSig(InternalSig::LOGIC0).toString()));
LightSrcX_TriSrc_QStringList.append(QString::fromStdString(InternalSig(InternalSig::LOGIC1).toString()));
LightSrcX_TriSrc_QStringList.append(QString::fromStdString(InternalSig(InternalSig::INTERNAL_TRIGGER).toString()));
LightSrcX_TriSrc_QStringList.append(QString::fromStdString(InternalSig(InternalSig::INTERNAL_TRIGGER_I1).toString()));
LightSrcX_TriSrc_QStringList.append(QString::fromStdString(InternalSig(InternalSig::INTERNAL_TRIGGER_I2).toString()));
LightSrcX_TriSrc_QStringList.append(QString::fromStdString(InternalSig(InternalSig::INTERNAL_TRIGGER_I3).toString()));
LightSrcX_TriSrc_QStringList.append(QString::fromStdString(InternalSig(InternalSig::INTERNAL_TRIGGER_I4).toString()));
LightSrcX_TriSrc_QStringList.append(QString::fromStdString(InternalSig(InternalSig::EXT_TRIGGER_1).toString()));
LightSrcX_TriSrc_QStringList.append(QString::fromStdString(InternalSig(InternalSig::EXT_TRIGGER_1_I1).toString()));
LightSrcX_TriSrc_QStringList.append(QString::fromStdString(InternalSig(InternalSig::EXT_TRIGGER_1_I2).toString()));
LightSrcX_TriSrc_QStringList.append(QString::fromStdString(InternalSig(InternalSig::EXT_TRIGGER_1_I3).toString()));
LightSrcX_TriSrc_QStringList.append(QString::fromStdString(InternalSig(InternalSig::EXT_TRIGGER_1_I4).toString()));
LightSrcX_TriSrc_QStringList.append(QString::fromStdString(InternalSig(InternalSig::EXT_TRIGGER_2).toString()));
LightSrcX_TriSrc_QStringList.append(QString::fromStdString(InternalSig(InternalSig::EXT_TRIGGER_2_I1).toString()));
LightSrcX_TriSrc_QStringList.append(QString::fromStdString(InternalSig(InternalSig::EXT_TRIGGER_2_I2).toString()));
LightSrcX_TriSrc_QStringList.append(QString::fromStdString(InternalSig(InternalSig::EXT_TRIGGER_2_I3).toString()));
LightSrcX_TriSrc_QStringList.append(QString::fromStdString(InternalSig(InternalSig::EXT_TRIGGER_2_I4).toString()));
LightSrcX_TriSrc_QStringList.append(QString::fromStdString(InternalSig(InternalSig::EXT_TRIGGER_3).toString()));
LightSrcX_TriSrc_QStringList.append(QString::fromStdString(InternalSig(InternalSig::EXT_TRIGGER_3_I1).toString()));
LightSrcX_TriSrc_QStringList.append(QString::fromStdString(InternalSig(InternalSig::EXT_TRIGGER_3_I2).toString()));
LightSrcX_TriSrc_QStringList.append(QString::fromStdString(InternalSig(InternalSig::EXT_TRIGGER_3_I3).toString()));
LightSrcX_TriSrc_QStringList.append(QString::fromStdString(InternalSig(InternalSig::EXT_TRIGGER_3_I4).toString()));
LightSrcX_TriSrc_QStringList.append(QString::fromStdString(InternalSig(InternalSig::EXT_TRIGGER_4).toString()));
LightSrcX_TriSrc_QStringList.append(QString::fromStdString(InternalSig(InternalSig::EXT_TRIGGER_4_I1).toString()));
LightSrcX_TriSrc_QStringList.append(QString::fromStdString(InternalSig(InternalSig::EXT_TRIGGER_4_I2).toString()));
LightSrcX_TriSrc_QStringList.append(QString::fromStdString(InternalSig(InternalSig::EXT_TRIGGER_4_I3).toString()));
LightSrcX_TriSrc_QStringList.append(QString::fromStdString(InternalSig(InternalSig::EXT_TRIGGER_4_I4).toString()));
ui->LightSrcX_TriSrc_1->addItems(LightSrcX_TriSrc_QStringList);
ui->LightSrcX_TriSrc_2->addItems(LightSrcX_TriSrc_QStringList);
ui->LightSrcX_TriSrc_3->addItems(LightSrcX_TriSrc_QStringList);
ui->LightSrcX_TriSrc_4->addItems(LightSrcX_TriSrc_QStringList);
ui->LightSrcX_InSigFreqDetect_1->setDisabled(true);
ui->LightSrcX_InSigFreqDetect_2->setDisabled(true);
ui->LightSrcX_InSigFreqDetect_3->setDisabled(true);
ui->LightSrcX_InSigFreqDetect_4->setDisabled(true);
ui->LightSrcX_OutSigFreqDetect_1->setDisabled(true);
ui->LightSrcX_OutSigFreqDetect_2->setDisabled(true);
ui->LightSrcX_OutSigFreqDetect_3->setDisabled(true);
ui->LightSrcX_OutSigFreqDetect_4->setDisabled(true);
ui->LightSrcX_LightSrcErrorState_1->setDisabled(true);
ui->LightSrcX_LightSrcErrorState_2->setDisabled(true);
ui->LightSrcX_LightSrcErrorState_3->setDisabled(true);
ui->LightSrcX_LightSrcErrorState_4->setDisabled(true);
ui->LightSrcX_LightDriverFreq_1->setDisabled(true);
ui->LightSrcX_LightDriverFreq_2->setDisabled(true);
ui->LightSrcX_LightDriverFreq_3->setDisabled(true);
ui->LightSrcX_LightDriverFreq_4->setDisabled(true);
}
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) {
// G_SerialPort.moveToThread();
// QObject::connect(&G_SerialPortThread, &QThread::started, &G_SerialPort, &QSerialPort::open);
G_QTDataChannel.init();
CLSTControler::ins()->initialize(&G_QTDataChannel);
m_clstc = CLSTControler::ins();
ui->setupUi(this);
m_mainWindow = this;
qRegisterMetaType<int32_t>("int32_t");
qRegisterMetaType<uint32_t>("uint32_t");
qRegisterMetaType<function<void()>>("function<void()>");
qRegisterMetaType<QFunction>("QFunction");
// qInstallMessageHandler(log_output);
connect(this, SIGNAL(doinui_signal(QFunction)), this, SLOT(doinui_slot(QFunction)));
constructUI();
// 创建定时器
timer = new QTimer(this);
connect(timer, &QTimer::timeout, this, [this]() { refreshReadonlyPage(); });
timer->setInterval(1000); // 每隔一秒触发一次
timer->start();
// m_clstc->regRawDataListener([this](uart_message_type_t type, uint8_t *data, size_t len) {
// QString text;
// if (type == kuart_raw_tx) {
// text.append("TX: ");
// for (size_t i = 0; i < len; i++) {
// text.append(fmt("%02X ", data[i]));
// }
// } else if (type == kuart_raw_rx) {
// text.append("RX: ");
// for (size_t i = 0; i < len; i++) {
// text.append(fmt("%02X ", data[i]));
// }
// }
// emit doinui_signal(QFunction([this, text]() {
// if (ui->instructionPreview->document()->lineCount() > 100) {
// ui->instructionPreview->document()->clear();
// }
// ui->instructionPreview->append(text);
// }));
// });
}
void MainWindow::dumpLog(const char *fmt, ...) {
va_list args;
va_start(args, fmt);
char buf[1024] = {0};
vsnprintf(buf, sizeof(buf), fmt, args);
qDebug() << buf;
va_end(args);
QString text(buf);
QString info;
// zos_get_ticket
info.append(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss.zzz"));
info.append(" [Info]:");
info.append(text);
emit doinui_signal(QFunction([this, info]() {
if (ui->instructionPreview->document()->lineCount() > 100) {
ui->instructionPreview->document()->clear();
}
ui->instructionPreview->append(info);
}));
}
MainWindow::~MainWindow() { delete ui; }