Browse Source

init project

master
zhaohe 1 year ago
parent
commit
703e5141a4
  1. 6
      .gitmodules
  2. 23
      CMakeLists.txt
  3. 85
      CMakeLists.txt.user
  4. 1
      libxsync
  5. 824
      mainwindow.cpp
  6. 18
      mainwindow.h
  7. 654
      src/camera_light_src_timing_controller/clst_controler.cpp
  8. 177
      src/camera_light_src_timing_controller/clst_controler.hpp
  9. 57
      src/camera_light_src_timing_controller/clst_controler_sig_type.cpp
  10. 169
      src/camera_light_src_timing_controller/clst_controler_sig_type.hpp
  11. 155
      src/camera_light_src_timing_controller/qt_serial_datachannel.cpp
  12. 79
      src/camera_light_src_timing_controller/qt_serial_datachannel.hpp
  13. 1
      zaf_protocol

6
.gitmodules

@ -1,6 +0,0 @@
[submodule "libxsync"]
path = libxsync
url = zwsd@192.168.1.3:p_lusterinc/libxsync.git
[submodule "zaf_protocol"]
path = zaf_protocol
url = zwsd@192.168.1.3:p_camera_light_source_timing_controller/zaf_protocol.git

23
CMakeLists.txt

@ -1,6 +1,6 @@
cmake_minimum_required(VERSION 3.5)
project(CameraLightingController VERSION 0.1 LANGUAGES CXX)
project(electrocardiograph_upper VERSION 0.1 LANGUAGES CXX)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
@ -30,33 +30,22 @@ set(PROJECT_SOURCES
mainwindow.cpp
mainwindow.h
mainwindow.ui
src/camera_light_src_timing_controller/clst_controler.cpp
src/camera_light_src_timing_controller/qt_serial_datachannel.cpp
src/camera_light_src_timing_controller/clst_controler_sig_type.cpp
zaf_protocol/zaf_ecode.c
zaf_protocol/zaf_protocol.c
# libxsync/src/xsync_v2.cpp
# src/xsync_udp_factory_impl.cpp
# libxsync/src/xsync_v2_sig_type.cpp
# libxsync/src/xsync_utils.cpp
)
add_executable(CameraLightingController WIN32
add_executable(electrocardiograph_upper WIN32
${PROJECT_SOURCES}
)
target_link_options(CameraLightingController PRIVATE -static -static-libgcc -static-libstdc++)
target_link_options(electrocardiograph_upper PRIVATE -static -static-libgcc -static-libstdc++)
target_link_libraries(CameraLightingController PRIVATE Qt${QT_VERSION_MAJOR}::Widgets Qt${QT_VERSION_MAJOR}::SerialPort Qt${QT_VERSION_MAJOR}::Charts Qt${QT_VERSION_MAJOR}::Concurrent wsock32)
target_link_libraries(electrocardiograph_upper PRIVATE Qt${QT_VERSION_MAJOR}::Widgets Qt${QT_VERSION_MAJOR}::SerialPort Qt${QT_VERSION_MAJOR}::Charts Qt${QT_VERSION_MAJOR}::Concurrent wsock32)
set_target_properties(CameraLightingController PROPERTIES
set_target_properties(electrocardiograph_upper PROPERTIES
MACOSX_BUNDLE_GUI_IDENTIFIER my.example.com
MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION}
MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}
)
if(QT_VERSION_MAJOR EQUAL 6)
qt_finalize_executable(CameraLightingController)
qt_finalize_executable(electrocardiograph_upper)
endif()

85
CMakeLists.txt.user

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE QtCreatorProject>
<!-- Written by QtCreator 5.0.2, 2024-03-12T16:21:53. -->
<!-- Written by QtCreator 5.0.2, 2024-03-30T14:44:27. -->
<qtcreator>
<data>
<variable>EnvironmentId</variable>
@ -91,10 +91,10 @@
<variable>ProjectExplorer.Project.Target.0</variable>
<valuemap type="QVariantMap">
<value type="QString" key="DeviceType">Desktop</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Desktop Qt 5.12.12 MinGW 64-bit</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Desktop Qt 5.12.12 MinGW 64-bit</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">qt.qt5.51212.win64_mingw73_kit</value>
<value type="int" key="ProjectExplorer.Target.ActiveBuildConfiguration">2</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">桌面</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">桌面</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">{279fbe38-08ec-48da-8e68-edb9b8eaccb2}</value>
<value type="int" key="ProjectExplorer.Target.ActiveBuildConfiguration">0</value>
<value type="int" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
<value type="int" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0">
@ -106,8 +106,7 @@
-DCMAKE_PREFIX_PATH:STRING=%{Qt:QT_INSTALL_PREFIX}
-DCMAKE_C_COMPILER:STRING=%{Compiler:Executable:C}
-DCMAKE_CXX_COMPILER:STRING=%{Compiler:Executable:Cxx}</value>
<value type="QString" key="CMake.Source.Directory">D:/workspace/p_camera_light_source_timing_controller/camera_light_src_timing_controller_pc</value>
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">D:/workspace/p_camera_light_source_timing_controller/build-camera_light_src_timing_controller_pc-Desktop_Qt_5_12_12_MinGW_64_bit-Debug</value>
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">D:\workspace\nordic_wp\build-electrocardiograph_upper-unknown_279fbe-Debug</value>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.BuildTargets">
@ -144,22 +143,21 @@
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.CMakeBuildConfiguration</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.1">
<value type="QString" key="CMake.Build.Type">MinSizeRel</value>
<value type="QString" key="CMake.Build.Type">Release</value>
<value type="QString" key="CMake.Initial.Parameters">-GMinGW Makefiles
-DCMAKE_BUILD_TYPE:STRING=MinSizeRel
-DCMAKE_BUILD_TYPE:STRING=Release
-DCMAKE_PROJECT_INCLUDE_BEFORE:PATH=%{IDE:ResourcePath}/package-manager/auto-setup.cmake
-DQT_QMAKE_EXECUTABLE:STRING=%{Qt:qmakeExecutable}
-DCMAKE_PREFIX_PATH:STRING=%{Qt:QT_INSTALL_PREFIX}
-DCMAKE_C_COMPILER:STRING=%{Compiler:Executable:C}
-DCMAKE_CXX_COMPILER:STRING=%{Compiler:Executable:Cxx}</value>
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">D:\workspace\p_camera_light_source_timing_controller\build-camera_light_src_timing_controller_pc-Desktop_Qt_5_12_12_MinGW_64_bit-Minimum-Size-Release</value>
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">D:\workspace\nordic_wp\build-electrocardiograph_upper-unknown_279fbe-Release</value>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.BuildTargets">
<value type="QString">all</value>
</valuelist>
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Build</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.MakeStep</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
@ -173,7 +171,6 @@
<value type="QString">clean</value>
</valuelist>
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Build</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.MakeStep</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
@ -185,26 +182,25 @@
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.CustomParsers"/>
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Minimum Size Release</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Release</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.CMakeBuildConfiguration</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.2">
<value type="QString" key="CMake.Build.Type">Release</value>
<value type="QString" key="CMake.Build.Type">RelWithDebInfo</value>
<value type="QString" key="CMake.Initial.Parameters">-GMinGW Makefiles
-DCMAKE_BUILD_TYPE:STRING=Release
-DCMAKE_BUILD_TYPE:STRING=RelWithDebInfo
-DCMAKE_PROJECT_INCLUDE_BEFORE:PATH=%{IDE:ResourcePath}/package-manager/auto-setup.cmake
-DQT_QMAKE_EXECUTABLE:STRING=%{Qt:qmakeExecutable}
-DCMAKE_PREFIX_PATH:STRING=%{Qt:QT_INSTALL_PREFIX}
-DCMAKE_C_COMPILER:STRING=%{Compiler:Executable:C}
-DCMAKE_CXX_COMPILER:STRING=%{Compiler:Executable:Cxx}</value>
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">D:\workspace\p_camera_light_source_timing_controller\build-camera_light_src_timing_controller_pc-Desktop_Qt_5_12_12_MinGW_64_bit-Release</value>
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">D:\workspace\nordic_wp\build-electrocardiograph_upper-unknown_279fbe-RelWithDebInfo</value>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.BuildTargets">
<value type="QString">all</value>
</valuelist>
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Build</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.MakeStep</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
@ -218,7 +214,6 @@
<value type="QString">clean</value>
</valuelist>
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Build</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.MakeStep</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
@ -230,10 +225,53 @@
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.CustomParsers"/>
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Release</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Release with Debug Information</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.CMakeBuildConfiguration</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.3">
<value type="QString" key="CMake.Build.Type">MinSizeRel</value>
<value type="QString" key="CMake.Initial.Parameters">-GMinGW Makefiles
-DCMAKE_BUILD_TYPE:STRING=MinSizeRel
-DCMAKE_PROJECT_INCLUDE_BEFORE:PATH=%{IDE:ResourcePath}/package-manager/auto-setup.cmake
-DQT_QMAKE_EXECUTABLE:STRING=%{Qt:qmakeExecutable}
-DCMAKE_PREFIX_PATH:STRING=%{Qt:QT_INSTALL_PREFIX}
-DCMAKE_C_COMPILER:STRING=%{Compiler:Executable:C}
-DCMAKE_CXX_COMPILER:STRING=%{Compiler:Executable:Cxx}</value>
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">D:\workspace\nordic_wp\build-electrocardiograph_upper-unknown_279fbe-MinSizeRel</value>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.BuildTargets">
<value type="QString">all</value>
</valuelist>
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.MakeStep</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Build</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<valuelist type="QVariantList" key="CMakeProjectManager.MakeStep.BuildTargets">
<value type="QString">clean</value>
</valuelist>
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.MakeStep</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Clean</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.CustomParsers"/>
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Minimum Size Release</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.CMakeBuildConfiguration</value>
</valuemap>
<value type="int" key="ProjectExplorer.Target.BuildConfigurationCount">3</value>
<value type="int" key="ProjectExplorer.Target.BuildConfigurationCount">4</value>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.0">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">0</value>
@ -254,15 +292,12 @@
<valuelist type="QVariantList" key="CustomOutputParsers"/>
<value type="int" key="PE.EnvironmentAspect.Base">2</value>
<valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">CameraLightingController</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">CMakeProjectManager.CMakeRunConfiguration.CameraLightingController</value>
<value type="QString" key="ProjectExplorer.RunConfiguration.BuildKey">CameraLightingController</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.CustomExecutableRunConfiguration</value>
<value type="QString" key="ProjectExplorer.RunConfiguration.BuildKey"></value>
<value type="bool" key="RunConfiguration.UseCppDebugger">false</value>
<value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value>
<value type="bool" key="RunConfiguration.UseLibrarySearchPath">true</value>
<value type="bool" key="RunConfiguration.UseQmlDebugger">false</value>
<value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value>
<value type="QString" key="RunConfiguration.WorkingDirectory.default">D:/workspace/p_camera_light_source_timing_controller/build-camera_light_src_timing_controller_pc-Desktop_Qt_5_12_12_MinGW_64_bit-Release</value>
</valuemap>
<value type="int" key="ProjectExplorer.Target.RunConfigurationCount">1</value>
</valuemap>

1
libxsync

@ -1 +0,0 @@
Subproject commit 8f83a2bf5e1f987871e4342f032ae8c080aa4f07

824
mainwindow.cpp

@ -16,14 +16,7 @@ using namespace std;
static MainWindow *m_mainWindow;
static CLSTControler *m_clstc;
QTimer *timer0;
QTimer *timer1;
QTimer *timer2;
QTimer *timer3;
QTimer *checkConnectTimer0;
static bool m_connected = false;
ZQThread *m_zqthread;
ZQThread *m_zqthread;
#define TAG "MainWindow"
static const char *fmt(const char *fmt, ...) {
@ -35,800 +28,11 @@ static const char *fmt(const char *fmt, ...) {
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_NO_RET(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()); \
displayInfo(false, zaferror_to_str(ecode)); \
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()); \
displayInfo(false, zaferror_to_str(ecode)); \
return ecode; \
} \
}
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::log_output(QtMsgType type, const QMessageLogContext &context, const QString &msg) {}
void MainWindow::doinui_slot(QFunction func) {
if (func.get()) func.get()();
}
zaf_error_code_t 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;
uint32_t cnt;
// TriInX_setSequentialControlPluseCntMax
#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(); \
cnt = ui->TriInX_SequentialControlPluseCntMax_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)); \
DO(m_clstc->TriInX_setSequentialControlPluseCntMax(index, cnt));
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);
#undef UPDATE
}
{
SigProcessMode mode;
uint32_t offset;
uint32_t bindstate1;
uint32_t bindstate2;
uint32_t bindstate3;
uint32_t bindstate4;
InternalSig sig;
uint32_t reversal;
#define UPDATE(index) \
mode = SigProcessMode(ui->ShutterX_OutputCtrlMode_##index->currentText().toStdString()); \
offset = ui->ShutterX_LtEnOffset_##index->text().toUInt(); \
bindstate1 = ui->ShutterX_LtEnBind_val1_##index->checkState() == Qt::CheckState::Checked; \
bindstate2 = ui->ShutterX_LtEnBind_val2_##index->checkState() == Qt::CheckState::Checked; \
bindstate3 = ui->ShutterX_LtEnBind_val3_##index->checkState() == Qt::CheckState::Checked; \
bindstate4 = ui->ShutterX_LtEnBind_val4_##index->checkState() == Qt::CheckState::Checked; \
sig = InternalSig(ui->ShutterX_InSigSelect_##index->currentText().toStdString()); \
reversal = ui->ShutterX_OutPolarityReversal_##index->checkState() == Qt::CheckState::Checked; \
DO(m_clstc->ShutterX_setOutputCtrlMode(index, mode)); \
DO(m_clstc->ShutterX_setLtEnOffset(index, offset)); \
DO(m_clstc->ShutterX_setLtEnBind(index, 1, bindstate1)); \
DO(m_clstc->ShutterX_setLtEnBind(index, 2, bindstate2)); \
DO(m_clstc->ShutterX_setLtEnBind(index, 3, bindstate3)); \
DO(m_clstc->ShutterX_setLtEnBind(index, 4, bindstate4)); \
DO(m_clstc->ShutterX_setInSigSelect(index, sig)); \
DO(m_clstc->ShutterX_setOutPolarityReversal(index, reversal));
UPDATE(1);
UPDATE(2);
UPDATE(3);
UPDATE(4);
#undef UPDATE
}
return kaf_ec_success;
}
void MainWindow::refreshReadonlyPage0() {
zaf_error_code_t ecode;
if (!G_QTDataChannel.isOpen()) {
return;
}
{
float TriOutSignalFreq;
DO_NO_RET(m_clstc->InterClk_readTriOutSignalFreq(TriOutSignalFreq));
emit doinui_signal(QFunction([this, TriOutSignalFreq]() { //
ui->InterClk_TriOutSignalFreq_Text->setText(QString::number(TriOutSignalFreq, 'f', 2));
}));
}
}
void MainWindow::refreshReadonlyPage1() {
if (!G_QTDataChannel.isOpen()) {
return;
}
{
float infreq;
float outfreq;
#define UPDATE(index) \
DO_NO_RET(m_clstc->TriInX_readInSignalFreq(index, infreq)); \
DO_NO_RET(m_clstc->TriInX_readOutSignalFreq(index, outfreq)); \
{ \
emit doinui_signal(QFunction([this, infreq, 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
}
}
void MainWindow::refreshReadonlyPage2() {
if (!G_QTDataChannel.isOpen()) {
return;
}
// 刷新光源时序控制页面
{
float infreq;
float outfreq;
uint32_t state;
#define UPDATE(index) \
DO_NO_RET(m_clstc->LightSrcX_readInSigFreqDetect(index, infreq)); \
DO_NO_RET(m_clstc->LightSrcX_readOutSigFreqDetect(index, outfreq)); \
DO_NO_RET(m_clstc->LightSrcX_readLightSrcErrorState(index, state)); \
{ \
emit doinui_signal(QFunction([this, infreq, outfreq, 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);
#undef UPDATE
}
}
void MainWindow::refreshReadonlyPage3() {
if (!G_QTDataChannel.isOpen()) {
return;
}
}
bool MainWindow::checkConnected() {
if (!G_QTDataChannel.isOpen()) {
return false;
}
uint32_t val;
zaf_error_code_t ecode = m_clstc->reg_read(kreg_software_version, val);
if (ecode != kaf_ec_success) {
return false;
}
return true;
}
zaf_error_code_t 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;
uint32_t cnt;
// TriInX_setSequentialControlPluseCntMax
#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)); \
DO(m_clstc->TriInX_getSequentialControlPluseCntMax(index, cnt)); \
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())); \
ui->TriInX_SequentialControlPluseCntMax_Val_##index->setText(QString::number(cnt));
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);
#undef UPDATE
}
{
SigProcessMode mode;
uint32_t offset;
uint32_t bindstate1;
uint32_t bindstate2;
uint32_t bindstate3;
uint32_t bindstate4;
InternalSig sig;
uint32_t reversal;
// zaf_error_code_t ShutterX_setOutPolarityReversal(int32_t index, uint32_t reversal);
#define UPDATE(index) \
DO(m_clstc->ShutterX_getOutputCtrlMode(index, mode)); \
DO(m_clstc->ShutterX_getLtEnOffset(index, offset)); \
DO(m_clstc->ShutterX_getLtEnBind(index, 1, bindstate1)); \
DO(m_clstc->ShutterX_getLtEnBind(index, 2, bindstate2)); \
DO(m_clstc->ShutterX_getLtEnBind(index, 3, bindstate3)); \
DO(m_clstc->ShutterX_getLtEnBind(index, 4, bindstate4)); \
DO(m_clstc->ShutterX_getInSigSelect(index, sig)); \
DO(m_clstc->ShutterX_getOutPolarityReversal(index, reversal)); \
ui->ShutterX_OutputCtrlMode_##index->setCurrentText(QString::fromStdString(mode.toString())); \
ui->ShutterX_LtEnOffset_##index->setText(QString::number(offset)); \
ui->ShutterX_LtEnBind_val1_##index->setChecked(bindstate1 != 0 ? Qt::CheckState::Checked : Qt::CheckState::Unchecked); \
ui->ShutterX_LtEnBind_val2_##index->setChecked(bindstate2 != 0 ? Qt::CheckState::Checked : Qt::CheckState::Unchecked); \
ui->ShutterX_LtEnBind_val3_##index->setChecked(bindstate3 != 0 ? Qt::CheckState::Checked : Qt::CheckState::Unchecked); \
ui->ShutterX_LtEnBind_val4_##index->setChecked(bindstate4 != 0 ? Qt::CheckState::Checked : Qt::CheckState::Unchecked); \
ui->ShutterX_InSigSelect_##index->setCurrentText(QString::fromStdString(sig.toString())); \
ui->ShutterX_OutPolarityReversal_##index->setChecked(reversal != 0 ? Qt::CheckState::Checked : Qt::CheckState::Unchecked);
// ui->ShutterX_LtEnBind_val1_1->checkState()
UPDATE(1);
UPDATE(2);
UPDATE(3);
UPDATE(4);
#undef UPDATE
}
return kaf_ec_success;
}
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->addItem("500000");
ui->serialBaudrateCB->setCurrentIndex(6);
/*******************************************************************************
* *
*******************************************************************************/
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) { //
zaf_error_code_t ecode = refreshPage();
if (ecode != kaf_ec_success) return;
dumpLog("刷新成功");
displayInfo(true, "刷新成功");
QMessageBox::about(NULL, "消息", "刷新成功");
});
connect(ui->UpdateCfg_Key, &QPushButton::clicked, this, [=](bool check) { //
zaf_error_code_t ecode = updatePage();
if (ecode != kaf_ec_success) return;
ecode = refreshPage();
if (ecode != kaf_ec_success) return;
dumpLog("提交成功");
displayInfo(true, "提交成功");
QMessageBox::about(NULL, "消息", "提交成功");
});
/*******************************************************************************
* *
*******************************************************************************/
connect(ui->storageConfigKey, &QPushButton::clicked, this, [=](bool check) { //
DO(m_clstc->storageConfigs());
dumpLog("保存配置成功");
displayInfo(true, "保存配置成功");
QMessageBox::about(NULL, "消息", "保存配置成功");
});
/*******************************************************************************
* *
*******************************************************************************/
connect(ui->rebootDeviceKey, &QPushButton::clicked, this, [=](bool check) { //
DO_NO_RET(m_clstc->reboot());
dumpLog("重启设备成功");
displayInfo(true, "重启设备成功");
QMessageBox::about(NULL, "消息", "重启设备成功");
});
/*******************************************************************************
* *
*******************************************************************************/
connect(ui->factoryResetKey, &QPushButton::clicked, this, [=](bool check) { //
DO_NO_RET(m_clstc->factoryReset());
dumpLog("恢复出厂设置成功");
displayInfo(true, "恢复出厂设置成功");
QMessageBox::about(NULL, "消息", "恢复出厂设置成功");
});
/*******************************************************************************
* ?? *
*******************************************************************************/
ui->RegAdd->setText("0x00000000");
connect(ui->regReadKey, &QPushButton::clicked, this, [=](bool check) { //
uint32_t addr = str2int(ui->RegAdd->text());
uint32_t value = 0;
DO_NO_RET(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_NO_RET(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_NO_RET(m_clstc->InterClk_trigger());
dumpLog(fmt("触发成功"));
});
connect(ui->InterClk_stop_Key, &QPushButton::clicked, this, [=](bool check) { //
DO_NO_RET(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(false);
ui->LightSrcX_LightDriverFreq_2->setDisabled(false);
ui->LightSrcX_LightDriverFreq_3->setDisabled(false);
ui->LightSrcX_LightDriverFreq_4->setDisabled(false);
/*******************************************************************************
* *
*******************************************************************************/
ui->ShutterX_OutputCtrlMode_1->addItem(QString::fromStdString(SigProcessMode(SigProcessMode::TRANSPARENT_MODE).toString()));
ui->ShutterX_OutputCtrlMode_2->addItem(QString::fromStdString(SigProcessMode(SigProcessMode::TRANSPARENT_MODE).toString()));
ui->ShutterX_OutputCtrlMode_3->addItem(QString::fromStdString(SigProcessMode(SigProcessMode::TRANSPARENT_MODE).toString()));
ui->ShutterX_OutputCtrlMode_4->addItem(QString::fromStdString(SigProcessMode(SigProcessMode::TRANSPARENT_MODE).toString()));
ui->ShutterX_OutputCtrlMode_1->addItem(QString::fromStdString(SigProcessMode(SigProcessMode::BIND_MODE).toString()));
ui->ShutterX_OutputCtrlMode_2->addItem(QString::fromStdString(SigProcessMode(SigProcessMode::BIND_MODE).toString()));
ui->ShutterX_OutputCtrlMode_3->addItem(QString::fromStdString(SigProcessMode(SigProcessMode::BIND_MODE).toString()));
ui->ShutterX_OutputCtrlMode_4->addItem(QString::fromStdString(SigProcessMode(SigProcessMode::BIND_MODE).toString()));
ui->ShutterX_InSigSelect_1->addItems(LightSrcX_TriSrc_QStringList);
ui->ShutterX_InSigSelect_2->addItems(LightSrcX_TriSrc_QStringList);
ui->ShutterX_InSigSelect_3->addItems(LightSrcX_TriSrc_QStringList);
ui->ShutterX_InSigSelect_4->addItems(LightSrcX_TriSrc_QStringList);
ui->InterClk_TriOutSignalFreq_Text->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<float>("float");
qRegisterMetaType<function<void()>>("function<void()>");
qRegisterMetaType<QFunction>("QFunction");
// qInstallMessageHandler(log_output);
connect(this, SIGNAL(doinui_signal(QFunction)), this, SLOT(doinui_slot(QFunction)));
constructUI();
// 创建定时器
timer0 = new QTimer(this);
timer1 = new QTimer(this);
timer2 = new QTimer(this);
timer3 = new QTimer(this);
checkConnectTimer0 = new QTimer(this);
m_zqthread = new ZQThread("", [this]() {
while (true) {
static bool first = true;
bool connect = checkConnected();
if (m_connected != connect || first) {
first = false;
m_connected = connect;
emit doinui_signal(QFunction([this, connect]() {
if (connect) {
ui->DeviceConnectStateTB->setText("已连接");
ui->DeviceConnectStateTB->setStyleSheet("color: green");
displayInfo(true, "连接成功");
} else {
ui->DeviceConnectStateTB->setText("未连接");
ui->DeviceConnectStateTB->setStyleSheet("color: red");
}
if (m_connected) {
refreshPage();
}
}));
}
refreshReadonlyPage0();
refreshReadonlyPage1();
refreshReadonlyPage2();
refreshReadonlyPage3();
std::this_thread::sleep_for(std::chrono::milliseconds(1000));
}
});
m_zqthread->start();
// connect(timer0, &QTimer::timeout, this, [this]() { refreshReadonlyPage0(); });
// connect(timer1, &QTimer::timeout, this, [this]() { refreshReadonlyPage1(); });
// connect(timer2, &QTimer::timeout, this, [this]() { refreshReadonlyPage2(); });
// connect(timer3, &QTimer::timeout, this, [this]() { refreshReadonlyPage3(); });
// connect(checkConnectTimer0, &QTimer::timeout, this, [this]() { //
// static bool connected = false;
// bool connect = checkConnected();
// if (connect) {
// ui->DeviceConnectStateTB->setText("已连接");
// ui->DeviceConnectStateTB->setStyleSheet("color: green");
// } else {
// ui->DeviceConnectStateTB->setText("未连接");
// ui->DeviceConnectStateTB->setStyleSheet("color: red");
// }
// if (connected != connect) {
// connected = connect;
// if (connected) {
// refreshPage();
// }
// }
// });
// timer0->setInterval(1100); // 每隔一秒触发一次
// timer1->setInterval(1200); // 每隔一秒触发一次
// timer2->setInterval(900); // 每隔一秒触发一次
// timer3->setInterval(1000); // 每隔一秒触发一次
// checkConnectTimer0->setInterval(100);
// timer0->start();
// timer1->start();
// timer2->start();
// timer3->start();
// checkConnectTimer0->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);
@ -878,4 +82,28 @@ void MainWindow::displayInfo(bool suc, QString info) {
}));
}
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) {
/*******************************************************************************
* QT初始化 *
*******************************************************************************/
ui->setupUi(this);
m_mainWindow = this;
qRegisterMetaType<int32_t>("int32_t");
qRegisterMetaType<uint32_t>("uint32_t");
qRegisterMetaType<float>("float");
qRegisterMetaType<function<void()>>("function<void()>");
qRegisterMetaType<QFunction>("QFunction");
connect(this, SIGNAL(doinui_signal(QFunction)), this, SLOT(doinui_slot(QFunction)));
/*******************************************************************************
* *
*******************************************************************************/
constructUI();
}
MainWindow::~MainWindow() { delete ui; }
/*******************************************************************************
* UI相关构造 *
*******************************************************************************/
void MainWindow::constructUI() {}

18
mainwindow.h

@ -29,10 +29,10 @@
#include <vector>
//
#include "camera_light_src_timing_controller/clst_controler.hpp"
#include "logger.hpp"
#include "qfunction.hpp"
#include "zqthread.hpp"
#include "camera_light_src_timing_controller/clst_controler.hpp"
QT_BEGIN_NAMESPACE
namespace Ui {
@ -74,28 +74,16 @@ class MainWindow : public QMainWindow {
MainWindow(QWidget *parent = nullptr);
~MainWindow();
zaf_error_code_t refreshPage();
zaf_error_code_t updatePage();
void refreshReadonlyPage0();
void refreshReadonlyPage1();
void refreshReadonlyPage2();
void refreshReadonlyPage3();
bool checkConnected();
void constructUI();
private slots:
/**
* @brief UI方法
*/
void doinui_slot(QFunction);
signals:
void doinui_signal(QFunction);
private:
static void log_output(QtMsgType type, const QMessageLogContext &context, const QString &msg);
void constructUI();
void dumpLog(const char *fmt, ...);
void displayInfo(bool suc,QString info);
void displayInfo(bool suc, QString info);
};
#endif // MAINWINDOW_H

654
src/camera_light_src_timing_controller/clst_controler.cpp

@ -1,654 +0,0 @@
#include "clst_controler.hpp"
#include <stdlib.h>
#include <string.h>
#include "logger.hpp"
using namespace iflytop;
using namespace clst;
#define TAG "CLSTControler"
#define PACKET_LEN(__packet) (sizeof(zaf_packet_header_t) + (__packet->ndata) * sizeof(uint32_t) + 1 /*checksum*/ + 2 /*tail*/)
#define DO_CMD(exptr) \
{ \
zaf_error_code_t ecode = exptr; \
if (ecode != kaf_ec_success) return ecode; \
}
CLSTControler *CLSTControler::ins() {
static CLSTControler *ins = nullptr;
if (ins == nullptr) {
ins = new CLSTControler();
}
return ins;
}
void CLSTControler::initialize(IDataChannel *channel) { //
m_channel = channel;
m_channel->regRxListener([this](uint8_t *data, size_t len) {
{
lock_guard<mutex> lock(lock_);
if (len + m_rxlen > sizeof(m_rxcache)) {
m_rxlen = 0;
}
memcpy(m_rxcache + m_rxlen, data, len);
m_rxlen += len;
}
});
m_thread.reset(new thread([this]() {
uint32_t last_rx_cnt = 0;
uint8_t rx_process_cache[1024];
uint32_t rx_process_cache_len;
while (true) {
this_thread::sleep_for(chrono::milliseconds(4));
{
lock_guard<mutex> lock(lock_);
if (last_rx_cnt == m_rxlen && m_rxlen != 0) {
memcpy(rx_process_cache, m_rxcache, m_rxlen);
rx_process_cache_len = m_rxlen;
m_rxlen = 0;
last_rx_cnt = 0;
}
}
if (rx_process_cache_len != 0) {
processRxData(rx_process_cache, rx_process_cache_len);
memset(rx_process_cache, 0, sizeof(rx_process_cache));
rx_process_cache_len = 0;
}
last_rx_cnt = m_rxlen;
}
}));
}
void CLSTControler::regRawDataListener(raw_data_cb_t cb) { m_raw_data_cb = cb; }
void CLSTControler::processRxData(uint8_t *rx, uint32_t rxlen) {
/**
* @brief
* 1. findHeader
* 2. processRx
*
* :
* 5A 5A 02 00 01 00 01 00 01 00 01 00 00 00 06 A5 A5
*
*/
// ZLOGI(TAG, "processRxData %d", rxlen);
for (uint32_t i = 0; i < rxlen; i++) {
zaf_packet_header_t *header = (zaf_packet_header_t *)(&rx[i]);
uint8_t *packetu8 = &rx[i];
if (header->packet_header == PACKET_HEADER) {
uint8_t check = packetu8[header->ndata * 4 + sizeof(zaf_packet_header_t) + 0];
uint8_t tail0 = packetu8[header->ndata * 4 + sizeof(zaf_packet_header_t) + 1];
uint8_t tail1 = packetu8[header->ndata * 4 + sizeof(zaf_packet_header_t) + 2];
uint16_t tail = (tail1 << 8) | tail0;
uint8_t expectcheck = 0;
for (uint32_t j = 2; j < header->ndata * 4 + sizeof(zaf_packet_header_t); j++) {
expectcheck += packetu8[j];
}
if (tail == PACKET_TAIL) {
if (expectcheck == check) {
processRxPacket(header);
} else {
ZLOGE(TAG, "Rx packet check error %d != %d", expectcheck, check);
}
}
}
}
}
void CLSTControler::processRxPacket(zaf_packet_header_t *packet) {
//
// ZLOGI(TAG, "RX packet");
// ZLOGI(TAG, " type :%d", packet->packet_type);
// ZLOGI(TAG, " index :%d", packet->index);
// ZLOGI(TAG, " cmd :%d", packet->cmd);
// ZLOGI(TAG, " ndata :%d", packet->ndata);
// for (uint32_t i = 0; i < packet->ndata; i++) {
// ZLOGI(TAG, " data[%d]:%d", i, packet->data[i]);
// }
// ZLOGI(TAG, "Rx.....");
uint32_t packetlen = sizeof(zaf_packet_header_t) + packet->ndata * 4 + 3;
if (m_raw_data_cb) {
m_raw_data_cb(kuart_raw_rx, (uint8_t *)packet, packetlen);
}
if (packet->packet_type == kzaf_packet_type_receipt) {
lock_guard<mutex> lock(m_rxReceiptContext_lock);
if (m_rxReceiptContext.waittingForReceipt) {
if (m_rxReceiptContext.waittingIndex == packet->index) {
m_rxReceiptContext.receiptIsReady = true;
m_rxReceiptContext.receiptLen = PACKET_LEN(packet);
memcpy(m_rxReceiptContext.receipt, packet, PACKET_LEN(packet));
}
m_rxReceiptContext.waittingForReceipt = false;
}
}
}
bool CLSTControler::ping() {}
zaf_error_code_t CLSTControler::sendPacket(zaf_packet_header_t *packet, uint32_t len, uint32_t overtime) {
zaf_packet_header_t *rxpacket = (zaf_packet_header_t *)&m_rxReceiptContext.receipt[0];
{
lock_guard<mutex> lock(m_rxReceiptContext_lock);
m_rxReceiptContext.waittingIndex = packet->index;
m_rxReceiptContext.waittingForReceipt = true;
m_rxReceiptContext.receiptIsReady = false;
m_rxReceiptContext.receiptLen = 0;
}
if (!m_channel) {
return kaf_ec_device_notopen;
}
if (m_channel->isOpen() == false) {
return kaf_ec_device_notopen;
}
if (m_raw_data_cb) {
m_raw_data_cb(kuart_raw_tx, (uint8_t *)packet, PACKET_LEN(packet));
}
// ZLOGI(TAG, "Tx.....");
m_channel->send((uint8_t *)packet, len);
for (size_t i = 0; i < overtime; i++) {
{
lock_guard<mutex> lock(m_rxReceiptContext_lock);
// ZLOGI(TAG, "wait for ready %d", m_rxReceiptContext.receiptIsReady);
if (m_rxReceiptContext.receiptIsReady) {
if (rxpacket->data[0] != 0) {
return (zaf_error_code_t)rxpacket->data[0];
} else {
return kaf_ec_success;
}
}
}
this_thread::sleep_for(chrono::milliseconds(1));
}
return kaf_ec_overtime;
}
zaf_error_code_t CLSTControler::reg_write(uint32_t regadd, uint32_t regvalue, uint32_t &regbackvalue, int32_t overtime_ms) { //
lock_guard<mutex> lock(m_tx_lock);
uint8_t txdata[128] = {0};
zaf_packet_header_t *txpacket = (zaf_packet_header_t *)txdata;
zaf_packet_header_t *rxpacket = (zaf_packet_header_t *)&m_rxReceiptContext.receipt[0];
txpacket->packet_header = PACKET_HEADER;
txpacket->packet_type = kzaf_packet_type_cmd;
txpacket->index = ++txindex;
txpacket->cmd = kzaf_cmd_reg_write;
txpacket->ndata = 2;
txpacket->data[0] = regadd;
txpacket->data[1] = regvalue;
uint32_t txpacklen = PACKET_LEN(txpacket);
uint8_t checksum = 0;
for (int i = 2; i < txpacklen - 3; i++) {
checksum += txdata[i];
}
txdata[txpacklen - 3] = checksum;
txdata[txpacklen - 2] = PACKET_TAIL & 0xFF;
txdata[txpacklen - 1] = (PACKET_TAIL >> 8) & 0xFF;
zaf_error_code_t ecode = sendPacket(txpacket, txpacklen, overtime_ms);
if (ecode != kaf_ec_success) {
return ecode;
}
regbackvalue = rxpacket->data[1];
return kaf_ec_success;
}
uint32_t CLSTControler::reg_read_v2(uint32_t regadd) {
uint32_t regvalue = 0;
reg_read(regadd, regvalue, 30);
return regvalue;
}
zaf_error_code_t CLSTControler::reg_read(uint32_t regadd, uint32_t &regvalue, int32_t overtime_ms) {
lock_guard<mutex> lock(m_tx_lock);
uint8_t txdata[128] = {0};
zaf_packet_header_t *txpacket = (zaf_packet_header_t *)txdata;
zaf_packet_header_t *rxpacket = (zaf_packet_header_t *)&m_rxReceiptContext.receipt[0];
txpacket->packet_header = PACKET_HEADER;
txpacket->packet_type = kzaf_packet_type_cmd;
txpacket->index = ++txindex;
txpacket->cmd = kzaf_cmd_reg_read;
txpacket->ndata = 1;
txpacket->data[0] = regadd;
uint32_t txpacklen = PACKET_LEN(txpacket);
uint8_t checksum = 0;
for (int i = 2; i < txpacklen - 3; i++) {
checksum += txdata[i];
}
txdata[txpacklen - 3] = checksum;
txdata[txpacklen - 2] = PACKET_TAIL & 0xFF;
txdata[txpacklen - 1] = (PACKET_TAIL >> 8) & 0xFF;
zaf_error_code_t ecode = sendPacket(txpacket, txpacklen, overtime_ms);
if (ecode != kaf_ec_success) {
return ecode;
}
regvalue = rxpacket->data[1];
// ZLOGI(TAG, "RX packet");
// ZLOGI(TAG, " type :%d", rxpacket->packet_type);
// ZLOGI(TAG, " index :%d", rxpacket->index);
// ZLOGI(TAG, " cmd :%d", rxpacket->cmd);
// ZLOGI(TAG, " ndata :%d", rxpacket->ndata);
// for (uint32_t i = 0; i < rxpacket->ndata; i++) {
// ZLOGI(TAG, " data[%d]:%d", i, rxpacket->data[i]);
// }
// ZLOGI(TAG, "RX:%d", regvalue);
return kaf_ec_success;
}
zaf_error_code_t CLSTControler::factoryReset() {
lock_guard<mutex> lock(m_tx_lock);
uint8_t txdata[128] = {0};
zaf_packet_header_t *txpacket = (zaf_packet_header_t *)txdata;
zaf_packet_header_t *rxpacket = (zaf_packet_header_t *)&m_rxReceiptContext.receipt[0];
txpacket->packet_header = PACKET_HEADER;
txpacket->packet_type = kzaf_packet_type_cmd;
txpacket->index = ++txindex;
txpacket->cmd = kzaf_cmd_factory_reset;
txpacket->ndata = 0;
uint32_t txpacklen = PACKET_LEN(txpacket);
uint8_t checksum = 0;
for (int i = 2; i < txpacklen - 3; i++) {
checksum += txdata[i];
}
txdata[txpacklen - 3] = checksum;
txdata[txpacklen - 2] = PACKET_TAIL & 0xFF;
txdata[txpacklen - 1] = (PACKET_TAIL >> 8) & 0xFF;
zaf_error_code_t ecode = sendPacket(txpacket, txpacklen, 1500);
if (ecode != kaf_ec_success) return ecode;
return kaf_ec_success;
}
zaf_error_code_t CLSTControler::reboot() {
lock_guard<mutex> lock(m_tx_lock);
uint8_t txdata[128] = {0};
zaf_packet_header_t *txpacket = (zaf_packet_header_t *)txdata;
zaf_packet_header_t *rxpacket = (zaf_packet_header_t *)&m_rxReceiptContext.receipt[0];
txpacket->packet_header = PACKET_HEADER;
txpacket->packet_type = kzaf_packet_type_cmd;
txpacket->index = ++txindex;
txpacket->cmd = kzaf_cmd_reboot;
txpacket->ndata = 0;
uint32_t txpacklen = PACKET_LEN(txpacket);
uint8_t checksum = 0;
for (int i = 2; i < txpacklen - 3; i++) {
checksum += txdata[i];
}
txdata[txpacklen - 3] = checksum;
txdata[txpacklen - 2] = PACKET_TAIL & 0xFF;
txdata[txpacklen - 1] = (PACKET_TAIL >> 8) & 0xFF;
zaf_error_code_t ecode = sendPacket(txpacket, txpacklen, 100);
if (ecode != kaf_ec_success) return ecode;
return kaf_ec_success;
}
zaf_error_code_t CLSTControler::storageConfigs() {
lock_guard<mutex> lock(m_tx_lock);
uint8_t txdata[128] = {0};
zaf_packet_header_t *txpacket = (zaf_packet_header_t *)txdata;
zaf_packet_header_t *rxpacket = (zaf_packet_header_t *)&m_rxReceiptContext.receipt[0];
txpacket->packet_header = PACKET_HEADER;
txpacket->packet_type = kzaf_packet_type_cmd;
txpacket->index = ++txindex;
txpacket->cmd = kzaf_cmd_storage_cfg;
txpacket->ndata = 0;
uint32_t txpacklen = PACKET_LEN(txpacket);
uint8_t checksum = 0;
for (int i = 2; i < txpacklen - 3; i++) {
checksum += txdata[i];
}
txdata[txpacklen - 3] = checksum;
txdata[txpacklen - 2] = PACKET_TAIL & 0xFF;
txdata[txpacklen - 1] = (PACKET_TAIL >> 8) & 0xFF;
zaf_error_code_t ecode = sendPacket(txpacket, txpacklen, 1500);
if (ecode != kaf_ec_success) return ecode;
return kaf_ec_success;
}
zaf_error_code_t CLSTControler::readFreq(uint32_t reg, float &freqfloat) {
uint32_t freq_cnt = 0;
DO_CMD(reg_read(reg, freq_cnt, 30));
if (freq_cnt == 0) {
freqfloat = 0;
}
if (freq_cnt != 0) {
uint32_t freq_1000x = ((1.0 / (freq_cnt * 1.0 / (100 * 1000 * 1000))) * 1000 + 0.5); //+0.5???c++ ??????????????????
// ZLOGI(TAG, "freq_10x %f", freq_10x);
freqfloat = freq_1000x / 1000.0;
} else {
freqfloat = 0;
}
if (freqfloat < 0.05) {
freqfloat = 0;
}
return kaf_ec_success;
}
/*******************************************************************************
* ???? *
*******************************************************************************/
zaf_error_code_t CLSTControler::InterClk_setFreq(float freq) { //
DO_CMD(InterClk_stop());
ZLOGI(TAG, "InterClk_setFreq %f", freq);
double T = 1.0 / freq;
double T_ns = T * 1000 * 1000 * 1000;
double cnt = T_ns / 10 + 0.5; // 100MHZ <=> 10ns
uint32_t cnt_u32 = uint32_t(cnt);
ZLOGI(TAG, "InterClk_setFreq %f %d", freq, cnt_u32);
return reg_write(kreg_internal_clk_freq_cnt, cnt_u32);
}
zaf_error_code_t CLSTControler::InterClk_setPluseCnt(uint32_t cnt) { //
return reg_write(kreg_internal_clk_pluse_cnt, cnt);
}
zaf_error_code_t CLSTControler::InterClk_setSeqCtrlPluseCntMax(uint32_t cnt) { //
if (cnt == 0) return kaf_ec_param_error;
return reg_write(kreg_internal_clk_tri_sequential_control_pluse_cnt_max, cnt - 1);
}
zaf_error_code_t CLSTControler::InterClk_getFreq(float &freq) { //
return readFreq(kreg_internal_clk_freq_cnt, freq);
}
zaf_error_code_t CLSTControler::InterClk_getPluseCnt(uint32_t &cnt) { //
return reg_read(kreg_internal_clk_pluse_cnt, cnt);
}
zaf_error_code_t CLSTControler::InterClk_getSeqCtrlPluseCntMax(uint32_t &cnt) { //
DO_CMD(reg_read(kreg_internal_clk_tri_sequential_control_pluse_cnt_max, cnt));
cnt++;
return kaf_ec_success;
}
zaf_error_code_t CLSTControler::InterClk_readTriOutSignalFreq(float &freq) { //
return readFreq(kreg_internal_clk_tri_out_signal_freq, freq);
}
zaf_error_code_t CLSTControler::InterClk_trigger() { //
return reg_write(kreg_internal_clk_ctrl, 1);
}
zaf_error_code_t CLSTControler::InterClk_stop() { //
return reg_write(kreg_internal_clk_ctrl, 0);
}
/*******************************************************************************
* TTL????? *
*******************************************************************************/
// kreg_trigger_in1_module
// kreg_trigger_in1_src_slect
// kreg_trigger_in1_fileter_coefficient
// kreg_trigger_in1_freq_detect_bias
// kreg_trigger_in1_mode
// kreg_trigger_in1_trigger_mode_trigger_edge
// kreg_trigger_in1_trigger_mode_freq_division
// kreg_trigger_in1_trigger_mode_freq_multiplication
// kreg_trigger_in1_sequential_control_pluse_cnt_max
// kreg_trigger_in1_in_signal_freq
// kreg_trigger_in1_out_signal_freq
zaf_error_code_t CLSTControler::TriInX_setSrcSelect(int32_t index, ExtTriggerSrcType src) { //
if (index < 1 || index > 4) return kaf_ec_param_error;
return reg_write(kreg_trigger_in1_src_slect + (index - 1) * 32, src.getVal());
}
zaf_error_code_t CLSTControler::TriInX_setFileterCoefficient(int32_t index, uint32_t coefficient) { //
if (index < 1 || index > 4) return kaf_ec_param_error;
return reg_write(kreg_trigger_in1_fileter_coefficient + (index - 1) * 32, coefficient);
}
zaf_error_code_t CLSTControler::TriInX_setFreqDetectBias(int32_t index, uint32_t bias) { //
if (index < 1 || index > 4) return kaf_ec_param_error;
return reg_write(kreg_trigger_in1_freq_detect_bias + (index - 1) * 32, bias);
}
zaf_error_code_t CLSTControler::TriInX_setMode(int32_t index, SigProcessMode mode) { //
if (index < 1 || index > 4) return kaf_ec_param_error;
return reg_write(kreg_trigger_in1_mode + (index - 1) * 32, mode.getVal());
}
zaf_error_code_t CLSTControler::TriInX_setTriggerModeTriggerEdge(int32_t index, TriggerEdge edge) { //
if (index < 1 || index > 4) return kaf_ec_param_error;
return reg_write(kreg_trigger_in1_trigger_mode_trigger_edge + (index - 1) * 32, edge);
}
zaf_error_code_t CLSTControler::TriInX_setTriggerModeFreqDivision(int32_t index, uint32_t division) { //
if (index < 1 || index > 4) return kaf_ec_param_error;
return reg_write(kreg_trigger_in1_trigger_mode_freq_division + (index - 1) * 32, division);
}
zaf_error_code_t CLSTControler::TriInX_setTriggerModeFreqMultiplication(int32_t index, uint32_t multiplication) { //
if (index < 1 || index > 4) return kaf_ec_param_error;
return reg_write(kreg_trigger_in1_trigger_mode_freq_multiplication + (index - 1) * 32, multiplication);
}
zaf_error_code_t CLSTControler::TriInX_setSequentialControlPluseCntMax(int32_t index, uint32_t cnt) { //
if (index < 1 || index > 4) return kaf_ec_param_error;
return reg_write(kreg_trigger_in1_sequential_control_pluse_cnt_max + (index - 1) * 32, cnt - 1);
}
zaf_error_code_t CLSTControler::TriInX_getSrcSelect(int32_t index, ExtTriggerSrcType &src) { //
if (index < 1 || index > 4) return kaf_ec_param_error;
uint32_t val;
DO_CMD(reg_read(kreg_trigger_in1_src_slect + (index - 1) * 32, val));
src = ExtTriggerSrcType(val);
return kaf_ec_success;
}
zaf_error_code_t CLSTControler::TriInX_getFileterCoefficient(int32_t index, uint32_t &coefficient) { //
if (index < 1 || index > 4) return kaf_ec_param_error;
return reg_read(kreg_trigger_in1_fileter_coefficient + (index - 1) * 32, coefficient);
}
zaf_error_code_t CLSTControler::TriInX_getFreqDetectBias(int32_t index, uint32_t &bias) { //
if (index < 1 || index > 4) return kaf_ec_param_error;
return reg_read(kreg_trigger_in1_freq_detect_bias + (index - 1) * 32, bias);
}
zaf_error_code_t CLSTControler::TriInX_getMode(int32_t index, SigProcessMode &mode) { //
if (index < 1 || index > 4) return kaf_ec_param_error;
uint32_t reakbak = 0;
DO_CMD(reg_read(kreg_trigger_in1_mode + (index - 1) * 32, reakbak));
mode = SigProcessMode(reakbak);
return kaf_ec_success;
}
zaf_error_code_t CLSTControler::TriInX_getTriggerModeTriggerEdge(int32_t index, TriggerEdge &edge) { //
if (index < 1 || index > 4) return kaf_ec_param_error;
uint32_t val;
DO_CMD(reg_read(kreg_trigger_in1_trigger_mode_trigger_edge + (index - 1) * 32, val));
edge = TriggerEdge(val);
return kaf_ec_success;
}
zaf_error_code_t CLSTControler::TriInX_getTriggerModeFreqDivision(int32_t index, uint32_t &division) { //
if (index < 1 || index > 4) return kaf_ec_param_error;
return reg_read(kreg_trigger_in1_trigger_mode_freq_division + (index - 1) * 32, division);
}
zaf_error_code_t CLSTControler::TriInX_getTriggerModeFreqMultiplication(int32_t index, uint32_t &multiplication) { //
if (index < 1 || index > 4) return kaf_ec_param_error;
return reg_read(kreg_trigger_in1_trigger_mode_freq_multiplication + (index - 1) * 32, multiplication);
}
zaf_error_code_t CLSTControler::TriInX_readInSignalFreq(int32_t index, float &freq) { //
if (index < 1 || index > 4) return kaf_ec_param_error;
return readFreq(kreg_trigger_in1_in_signal_freq + (index - 1) * 32, freq);
}
zaf_error_code_t CLSTControler::TriInX_readOutSignalFreq(int32_t index, float &freq) { //
if (index < 1 || index > 4) return kaf_ec_param_error;
return readFreq(kreg_trigger_in1_out_signal_freq + (index - 1) * 32, freq);
return kaf_ec_success;
}
zaf_error_code_t CLSTControler::TriInX_getSequentialControlPluseCntMax(int32_t index, uint32_t &cnt) {
if (index < 1 || index > 4) return kaf_ec_param_error;
DO_CMD(reg_read(kreg_trigger_in1_sequential_control_pluse_cnt_max + (index - 1) * 32, cnt));
cnt++;
return kaf_ec_success;
}
/*******************************************************************************
* ???? *
*******************************************************************************/
zaf_error_code_t CLSTControler::LightSrcX_setTriSrc(int32_t index, InternalSig src) { //
if (index < 1 || index > 4) return kaf_ec_param_error;
return reg_write(kreg_light_ctrol_module1_source_select + (index - 1) * 32, src);
}
zaf_error_code_t CLSTControler::LightSrcX_setTriggerModePluseWidth(int32_t index, uint32_t width) { //
if (index < 1 || index > 4) return kaf_ec_param_error;
return reg_write(kreg_light_ctrol_module1_trigger_mode_pluse_width + (index - 1) * 32, width * 10); // 0.1us
}
zaf_error_code_t CLSTControler::LightSrcX_setTriggerModeFirstPluseOffset(int32_t index, uint32_t offset) { //
if (index < 1 || index > 4) return kaf_ec_param_error;
return reg_write(kreg_light_ctrol_module1_trigger_mode_first_pluse_offset + (index - 1) * 32, offset * 10); // 0.1us
}
zaf_error_code_t CLSTControler::LightSrcX_setLightIntensityDuty(int32_t index, float duty) { //
if (index < 1 || index > 4) return kaf_ec_param_error;
uint32_t freqcnt = 0;
DO_CMD(reg_read(kreg_light_ctrol_module1_light_driver_freq_cnt + (index - 1) * 32, freqcnt));
uint32_t cnt = freqcnt * (duty / 100.0);
return reg_write(kreg_light_ctrol_module1_light_intensity_cnt + (index - 1) * 32, cnt);
}
zaf_error_code_t CLSTControler::LightSrcX_setLightDriverFreq(int32_t index, float freq) { //
double T = 1.0 / freq;
double T_ns = T * 1000 * 1000 * 1000;
double cnt = T_ns / 10 + 0.5; // 100MHZ <=> 10ns
uint32_t cnt_u32 = uint32_t(cnt);
return reg_write(kreg_light_ctrol_module1_light_driver_freq_cnt + (index - 1) * 32, cnt_u32);
}
zaf_error_code_t CLSTControler::LightSrcX_getTriSrc(int32_t index, InternalSig &src) { //
if (index < 1 || index > 4) return kaf_ec_param_error;
uint32_t val;
DO_CMD(reg_read(kreg_light_ctrol_module1_source_select + (index - 1) * 32, val));
src = InternalSig(val);
return kaf_ec_success;
}
zaf_error_code_t CLSTControler::LightSrcX_getTriggerModePluseWidth(int32_t index, uint32_t &width) { //
if (index < 1 || index > 4) return kaf_ec_param_error;
uint32_t val;
DO_CMD(reg_read(kreg_light_ctrol_module1_trigger_mode_pluse_width + (index - 1) * 32, val));
width = val / 10;
return kaf_ec_success;
}
zaf_error_code_t CLSTControler::LightSrcX_getTriggerModeFirstPluseOffset(int32_t index, uint32_t &offset) { //
if (index < 1 || index > 4) return kaf_ec_param_error;
uint32_t val;
DO_CMD(reg_read(kreg_light_ctrol_module1_trigger_mode_first_pluse_offset + (index - 1) * 32, val));
offset = val / 10;
return kaf_ec_success;
}
zaf_error_code_t CLSTControler::LightSrcX_getLightIntensityDuty(int32_t index, float &duty) { //
if (index < 1 || index > 4) return kaf_ec_param_error;
uint32_t freqcnt = 0;
DO_CMD(reg_read(kreg_light_ctrol_module1_light_driver_freq_cnt + (index - 1) * 32, freqcnt));
uint32_t cnt = 0;
DO_CMD(reg_read(kreg_light_ctrol_module1_light_intensity_cnt + (index - 1) * 32, cnt));
duty = (cnt * 100.0 / freqcnt);
return kaf_ec_success;
}
zaf_error_code_t CLSTControler::LightSrcX_getLightDriverFreq(int32_t index, float &freq) { //
return readFreq(kreg_light_ctrol_module1_light_driver_freq_cnt + (index - 1) * 32, freq);
}
zaf_error_code_t CLSTControler::LightSrcX_readLightSrcErrorState(int32_t index, uint32_t &state) { //
if (index < 1 || index > 4) return kaf_ec_param_error;
return reg_read(kreg_light_ctrol_module1_light_src_error_state + (index - 1) * 32, state);
}
zaf_error_code_t CLSTControler::LightSrcX_readInSigFreqDetect(int32_t index, float &freq) { //
return readFreq(kreg_light_ctrol_module1_in_sig_freq_detect + (index - 1) * 32, freq);
}
zaf_error_code_t CLSTControler::LightSrcX_readOutSigFreqDetect(int32_t index, float &freq) { //
return readFreq(kreg_light_ctrol_module1_out_sig_freq_detect + (index - 1) * 32, freq);
}
/*******************************************************************************
* *
*******************************************************************************/
zaf_error_code_t CLSTControler::ShutterX_setOutputCtrlMode(int32_t index, SigProcessMode mode) { //
return reg_write(kreg_ttl_output_module1_output_ctrl_mode + (index - 1) * 32, mode);
}
zaf_error_code_t CLSTControler::ShutterX_setLtEnBind(int32_t index, uint32_t lt_en_sig_index, uint32_t state) { //
uint32_t readbak_state = 0;
DO_CMD(reg_read(kreg_ttl_output_module1_lt_en_bind + (index - 1) * 32, readbak_state));
if (state == 1) {
readbak_state |= (1 << (lt_en_sig_index - 1));
} else {
readbak_state &= ~(1 << (lt_en_sig_index - 1));
}
DO_CMD(reg_write(kreg_ttl_output_module1_lt_en_bind + (index - 1) * 32, readbak_state));
return kaf_ec_success;
}
zaf_error_code_t CLSTControler::ShutterX_setLtEnOffset(int32_t index, uint32_t offset) { //
return reg_write(kreg_ttl_output_module1_lt_en_offset + (index - 1) * 32, offset * 10); // 0.1us
}
zaf_error_code_t CLSTControler::ShutterX_setInSigSelect(int32_t index, InternalSig sig) { //
return reg_write(kreg_ttl_output_module1_in_sig_select + (index - 1) * 32, sig);
}
zaf_error_code_t CLSTControler::ShutterX_setOutPolarityReversal(int32_t index, uint32_t reversal) { return reg_write(kreg_ttl_output_module1_out_polarity_reversal + (index - 1) * 32, reversal); }
zaf_error_code_t CLSTControler::ShutterX_getOutputCtrlMode(int32_t index, SigProcessMode &mode) { //
uint32_t val;
DO_CMD(reg_read(kreg_ttl_output_module1_output_ctrl_mode + (index - 1) * 32, val));
mode = SigProcessMode(val);
return kaf_ec_success;
}
zaf_error_code_t CLSTControler::ShutterX_getLtEnBind(int32_t index, uint32_t lt_en_sig_index, uint32_t &state) { //
uint32_t readbak_state = 0;
DO_CMD(reg_read(kreg_ttl_output_module1_lt_en_bind + (index - 1) * 32, readbak_state));
state = (readbak_state >> (lt_en_sig_index - 1)) & 0x01;
return kaf_ec_success;
}
zaf_error_code_t CLSTControler::ShutterX_getLtEnOffset(int32_t index, uint32_t &offset) { //
uint32_t val;
DO_CMD(reg_read(kreg_ttl_output_module1_lt_en_offset + (index - 1) * 32, val));
offset = val / 10;
return kaf_ec_success;
}
zaf_error_code_t CLSTControler::ShutterX_getInSigSelect(int32_t index, InternalSig &sig) { //
uint32_t val;
DO_CMD(reg_read(kreg_ttl_output_module1_in_sig_select + (index - 1) * 32, val));
sig = InternalSig(val);
return kaf_ec_success;
}
zaf_error_code_t CLSTControler::ShutterX_getOutPolarityReversal(int32_t index, uint32_t &reversal) {
DO_CMD(reg_read(kreg_ttl_output_module1_out_polarity_reversal + (index - 1) * 32, reversal));
return kaf_ec_success;
}

177
src/camera_light_src_timing_controller/clst_controler.hpp

@ -1,177 +0,0 @@
#pragma once
#include <fstream>
#include <functional>
#include <iostream>
#include <list>
#include <map>
#include <memory>
#include <mutex>
#include <set>
#include <sstream>
#include <string>
#include <thread>
#include <vector>
#include "clst_controler_sig_type.hpp"
#include "zaf_protocol/zaf_protocol.h"
#define SDK_VERSION 1
namespace iflytop {
namespace clst {
using namespace std;
typedef enum {
kuart_raw_tx,
kuart_raw_rx,
} uart_message_type_t;
typedef function<void(bool connect)> device_state_cb_t;
typedef function<void(uart_message_type_t type, uint8_t *data, size_t len)> raw_data_cb_t;
class IDataChannel {
public:
virtual ~IDataChannel(){};
virtual bool isOpen() = 0;
virtual bool send(const uint8_t *data, size_t len) = 0;
virtual void regRxListener(function<void(uint8_t *data, size_t len)> cb) = 0;
};
class RxReceiptContext {
public:
bool waittingForReceipt;
bool receiptIsReady;
uint16_t waittingIndex;
uint8_t receipt[1024];
size_t receiptLen;
};
class CLSTControler {
CLSTControler() {}
IDataChannel *m_channel = nullptr;
uint8_t m_rxcache[1024];
size_t m_rxlen = 0;
mutex lock_;
unique_ptr<thread> m_thread;
RxReceiptContext m_rxReceiptContext;
mutex m_rxReceiptContext_lock;
mutex m_tx_lock;
raw_data_cb_t m_raw_data_cb;
uint16_t txindex = 0;
public:
static CLSTControler *ins();
void initialize(IDataChannel *channel);
void regRawDataListener(raw_data_cb_t cb);
public:
bool ping();
zaf_error_code_t factoryReset();
zaf_error_code_t reboot();
zaf_error_code_t storageConfigs();
void initDevice();
public:
zaf_error_code_t reg_write(uint32_t regadd, uint32_t regvalue, uint32_t &regbackvalue, int32_t overtime_ms = 30);
zaf_error_code_t reg_write(uint32_t regadd, uint32_t regvalue) {
uint32_t regbackvalue;
return reg_write(regadd, regvalue, regbackvalue, 30);
}
zaf_error_code_t reg_read(uint32_t regadd, uint32_t &regvalue, int32_t overtime_ms = 30);
uint32_t reg_read_v2(uint32_t regadd);
public:
/*******************************************************************************
* *
*******************************************************************************/
zaf_error_code_t InterClk_setFreq(float freq);
zaf_error_code_t InterClk_setPluseCnt(uint32_t cnt);
zaf_error_code_t InterClk_setSeqCtrlPluseCntMax(uint32_t cnt);
zaf_error_code_t InterClk_getFreq(float &freq);
zaf_error_code_t InterClk_getPluseCnt(uint32_t &cnt);
zaf_error_code_t InterClk_getSeqCtrlPluseCntMax(uint32_t &cnt);
zaf_error_code_t InterClk_readTriOutSignalFreq(float &freq);
zaf_error_code_t InterClk_trigger();
zaf_error_code_t InterClk_stop();
/*******************************************************************************
* TTL外部触发源 *
*******************************************************************************/
zaf_error_code_t TriInX_setSrcSelect(int32_t index, ExtTriggerSrcType src); // 0
zaf_error_code_t TriInX_setFileterCoefficient(int32_t index, uint32_t coefficient);
zaf_error_code_t TriInX_setFreqDetectBias(int32_t index, uint32_t bias);
zaf_error_code_t TriInX_setMode(int32_t index, SigProcessMode mode);
zaf_error_code_t TriInX_setTriggerModeTriggerEdge(int32_t index, TriggerEdge edge);
zaf_error_code_t TriInX_setTriggerModeFreqDivision(int32_t index, uint32_t division);
zaf_error_code_t TriInX_setTriggerModeFreqMultiplication(int32_t index, uint32_t multiplication);
zaf_error_code_t TriInX_setSequentialControlPluseCntMax(int32_t index, uint32_t cnt);
zaf_error_code_t TriInX_getSrcSelect(int32_t index, ExtTriggerSrcType &src);
zaf_error_code_t TriInX_getFileterCoefficient(int32_t index, uint32_t &coefficient);
zaf_error_code_t TriInX_getFreqDetectBias(int32_t index, uint32_t &bias);
zaf_error_code_t TriInX_getMode(int32_t index, SigProcessMode &mode);
zaf_error_code_t TriInX_getTriggerModeTriggerEdge(int32_t index, TriggerEdge &edge);
zaf_error_code_t TriInX_getTriggerModeFreqDivision(int32_t index, uint32_t &division);
zaf_error_code_t TriInX_getTriggerModeFreqMultiplication(int32_t index, uint32_t &multiplication);
zaf_error_code_t TriInX_getSequentialControlPluseCntMax(int32_t index, uint32_t& cnt);
zaf_error_code_t TriInX_readInSignalFreq(int32_t index, float &freq);
zaf_error_code_t TriInX_readOutSignalFreq(int32_t index, float &freq);
/*******************************************************************************
* *
*******************************************************************************/
zaf_error_code_t LightSrcX_setTriSrc(int32_t index, InternalSig src);
zaf_error_code_t LightSrcX_setTriggerModePluseWidth(int32_t index, uint32_t width);
zaf_error_code_t LightSrcX_setTriggerModeFirstPluseOffset(int32_t index, uint32_t offset);
zaf_error_code_t LightSrcX_setLightIntensityDuty(int32_t index, float duty);
zaf_error_code_t LightSrcX_setLightDriverFreq(int32_t index, float freq);
zaf_error_code_t LightSrcX_getTriSrc(int32_t index, InternalSig &src);
zaf_error_code_t LightSrcX_getTriggerModePluseWidth(int32_t index, uint32_t &width);
zaf_error_code_t LightSrcX_getTriggerModeFirstPluseOffset(int32_t index, uint32_t &offset);
zaf_error_code_t LightSrcX_getLightIntensityDuty(int32_t index, float &duty);
zaf_error_code_t LightSrcX_getLightDriverFreq(int32_t index, float &freq);
zaf_error_code_t LightSrcX_readLightSrcErrorState(int32_t index, uint32_t &state);
zaf_error_code_t LightSrcX_readInSigFreqDetect(int32_t index, float &freq);
zaf_error_code_t LightSrcX_readOutSigFreqDetect(int32_t index, float &freq);
/*******************************************************************************
* *
*******************************************************************************/
zaf_error_code_t ShutterX_setOutputCtrlMode(int32_t index, SigProcessMode mode);
zaf_error_code_t ShutterX_setLtEnBind(int32_t index, uint32_t lt_en_sig_index, uint32_t state);
zaf_error_code_t ShutterX_setLtEnOffset(int32_t index, uint32_t offset);
zaf_error_code_t ShutterX_setInSigSelect(int32_t index, InternalSig sig);
zaf_error_code_t ShutterX_setOutPolarityReversal(int32_t index, uint32_t reversal);
zaf_error_code_t ShutterX_getOutputCtrlMode(int32_t index, SigProcessMode &mode);
zaf_error_code_t ShutterX_getLtEnBind(int32_t index, uint32_t lt_en_sig_index, uint32_t &state);
zaf_error_code_t ShutterX_getLtEnOffset(int32_t index, uint32_t &offset);
zaf_error_code_t ShutterX_getInSigSelect(int32_t index, InternalSig &sig);
zaf_error_code_t ShutterX_getOutPolarityReversal(int32_t index, uint32_t &reversal);
private:
void processRxData(uint8_t *rx, uint32_t rxlen);
void processRxPacket(zaf_packet_header_t *packet);
zaf_error_code_t sendPacket(zaf_packet_header_t *packet, uint32_t len, uint32_t overtime);
zaf_error_code_t readFreq(uint32_t reg, float &freq);
};
} // namespace clst
} // namespace iflytop

57
src/camera_light_src_timing_controller/clst_controler_sig_type.cpp

@ -1,57 +0,0 @@
#include "clst_controler_sig_type.hpp"
using namespace iflytop;
using namespace clst;
map<string, ExtTriggerSrcType::EnumType_t> ExtTriggerSrcType::emap = {
{"OPTOCOUPLER_INPUT", OPTOCOUPLER_INPUT}, //
{"DIFF_INPUT", DIFF_INPUT}, //
};
map<string, TriggerEdge::EnumType_t> TriggerEdge::emap = {
{"RISING", RISING}, //
{"FALLING", FALLING}, //
{"BOTH", BOTH} //
};
map<string, SigProcessMode::EnumType_t> SigProcessMode::emap = {
{"TRIGGER_MODE", TRIGGER_MODE}, //
{"TRANSPARENT_MODE", TRANSPARENT_MODE}, //
{"BIND_MODE", BIND_MODE} //
};
map<string, InternalSig::EnumType_t> InternalSig::emap = {
{"LOGIC0", LOGIC0}, //
{"LOGIC1", LOGIC1}, //
{"INTERNAL_TRIGGER", INTERNAL_TRIGGER}, //
{"INTERNAL_TRIGGER_I1", INTERNAL_TRIGGER_I1}, //
{"INTERNAL_TRIGGER_I2", INTERNAL_TRIGGER_I2}, //
{"INTERNAL_TRIGGER_I3", INTERNAL_TRIGGER_I3}, //
{"INTERNAL_TRIGGER_I4", INTERNAL_TRIGGER_I4}, //
{"EXT_TRIGGER_1", EXT_TRIGGER_1}, //
{"EXT_TRIGGER_1_I1", EXT_TRIGGER_1_I1}, //
{"EXT_TRIGGER_1_I2", EXT_TRIGGER_1_I2}, //
{"EXT_TRIGGER_1_I3", EXT_TRIGGER_1_I3}, //
{"EXT_TRIGGER_1_I4", EXT_TRIGGER_1_I4}, //
{"EXT_TRIGGER_2", EXT_TRIGGER_2}, //
{"EXT_TRIGGER_2_I1", EXT_TRIGGER_2_I1}, //
{"EXT_TRIGGER_2_I2", EXT_TRIGGER_2_I2}, //
{"EXT_TRIGGER_2_I3", EXT_TRIGGER_2_I3}, //
{"EXT_TRIGGER_2_I4", EXT_TRIGGER_2_I4}, //
{"EXT_TRIGGER_3", EXT_TRIGGER_3}, //
{"EXT_TRIGGER_3_I1", EXT_TRIGGER_3_I1}, //
{"EXT_TRIGGER_3_I2", EXT_TRIGGER_3_I2}, //
{"EXT_TRIGGER_3_I3", EXT_TRIGGER_3_I3}, //
{"EXT_TRIGGER_3_I4", EXT_TRIGGER_3_I4}, //
{"EXT_TRIGGER_4", EXT_TRIGGER_4}, //
{"EXT_TRIGGER_4_I1", EXT_TRIGGER_4_I1}, //
{"EXT_TRIGGER_4_I2", EXT_TRIGGER_4_I2}, //
{"EXT_TRIGGER_4_I3", EXT_TRIGGER_4_I3}, //
{"EXT_TRIGGER_4_I4", EXT_TRIGGER_4_I4}, //
};

169
src/camera_light_src_timing_controller/clst_controler_sig_type.hpp

@ -1,169 +0,0 @@
#pragma once
#include <fstream>
#include <functional>
#include <iostream>
#include <list>
#include <map>
#include <memory>
#include <mutex>
#include <set>
#include <sstream>
#include <string>
#include <thread>
#include <vector>
#include "zaf_protocol/zaf_protocol.h"
namespace iflytop {
namespace clst {
using namespace std;
class ExtTriggerSrcType {
public:
typedef enum {
OPTOCOUPLER_INPUT = 0, // 光耦输入
DIFF_INPUT = 1, // 差分输入
} EnumType_t;
private:
static map<string, EnumType_t> emap;
public:
EnumType_t val;
ExtTriggerSrcType() { val = OPTOCOUPLER_INPUT; }
ExtTriggerSrcType(EnumType_t e) { val = e; }
ExtTriggerSrcType(uint32_t e) { val = (EnumType_t)e; }
ExtTriggerSrcType(string string) { emap.find(string) != emap.end() ? val = emap[string] : val = OPTOCOUPLER_INPUT; }
string toString() { return toString(val); }
string toString(EnumType_t ein) {
for (auto &item : emap) {
if (item.second == ein) return item.first;
}
return "unkown";
}
uint32_t getVal() { return val; }
operator uint32_t() { return val; }
};
class TriggerEdge {
public:
typedef enum {
RISING = 1, // 上升沿触发
FALLING = 0, // 下降沿触发
BOTH = 2, // 上升沿和下降沿触发
} EnumType_t;
private:
static map<string, EnumType_t> emap;
public:
EnumType_t val;
TriggerEdge() { val = RISING; }
TriggerEdge(EnumType_t e) { val = e; }
TriggerEdge(uint32_t e) { val = (EnumType_t)e; }
TriggerEdge(string string) { emap.find(string) != emap.end() ? val = emap[string] : val = RISING; }
string toString() { return toString(val); }
string toString(EnumType_t ein) {
for (auto &item : emap) {
if (item.second == ein) return item.first;
}
return "unkown";
}
uint32_t getVal() { return val; }
operator uint32_t() { return val; }
};
class SigProcessMode {
public:
typedef enum {
TRIGGER_MODE = 0, // 触发模式
TRANSPARENT_MODE = 1, // 透传模式
BIND_MODE = 2 // 绑定模式
} EnumType_t;
private:
static map<string, EnumType_t> emap;
public:
EnumType_t val;
SigProcessMode() { val = TRIGGER_MODE; }
SigProcessMode(EnumType_t e) { val = e; }
SigProcessMode(uint32_t e) { val = (EnumType_t)e; }
SigProcessMode(string string) { emap.find(string) != emap.end() ? val = emap[string] : val = TRIGGER_MODE; }
string toString() { return toString(val); }
string toString(EnumType_t ein) {
for (auto &item : emap) {
if (item.second == ein) return item.first;
}
return "unkown";
}
uint32_t getVal() { return val; }
operator uint32_t() { return val; }
};
class InternalSig {
public:
typedef enum {
LOGIC0 = 0,
LOGIC1 = 1,
INTERNAL_TRIGGER = 2,
INTERNAL_TRIGGER_I1 = 3,
INTERNAL_TRIGGER_I2 = 4,
INTERNAL_TRIGGER_I3 = 5,
INTERNAL_TRIGGER_I4 = 6,
EXT_TRIGGER_1 = 7,
EXT_TRIGGER_1_I1 = 8,
EXT_TRIGGER_1_I2 = 9,
EXT_TRIGGER_1_I3 = 10,
EXT_TRIGGER_1_I4 = 11,
EXT_TRIGGER_2 = 12,
EXT_TRIGGER_2_I1 = 13,
EXT_TRIGGER_2_I2 = 14,
EXT_TRIGGER_2_I3 = 15,
EXT_TRIGGER_2_I4 = 16,
EXT_TRIGGER_3 = 17,
EXT_TRIGGER_3_I1 = 18,
EXT_TRIGGER_3_I2 = 19,
EXT_TRIGGER_3_I3 = 20,
EXT_TRIGGER_3_I4 = 21,
EXT_TRIGGER_4 = 22,
EXT_TRIGGER_4_I1 = 23,
EXT_TRIGGER_4_I2 = 24,
EXT_TRIGGER_4_I3 = 25,
EXT_TRIGGER_4_I4 = 26,
} EnumType_t;
private:
static map<string, EnumType_t> emap;
public:
EnumType_t val;
InternalSig() { val = LOGIC0; }
InternalSig(EnumType_t e) { val = e; }
InternalSig(uint32_t e) { val = (EnumType_t)e; }
InternalSig(string string) { emap.find(string) != emap.end() ? val = emap[string] : val = LOGIC0; }
string toString() { return toString(val); }
string toString(EnumType_t ein) {
for (auto &item : emap) {
if (item.second == ein) return item.first;
}
return "unkown";
}
uint32_t getVal() { return val; }
operator uint32_t() { return val; }
};
} // namespace clst
} // namespace iflytop

155
src/camera_light_src_timing_controller/qt_serial_datachannel.cpp

@ -1,155 +0,0 @@
#include "qt_serial_datachannel.hpp"
//
#include <QtSerialPort/QSerialPort>
#include <QtSerialPort/QSerialPortInfo>
#pragma comment(lib, "ws2_32.lib")
#include "logger.hpp"
using namespace iflytop;
using namespace std;
using namespace clst;
#define TAG "QTDataChannel"
void QTDataChannel::init() {
m_thread.reset(new thread([this]() {
while (true) {
if (m_isOpen) {
uint8_t rx[1024] = {0};
int rx_cnt = com_receive(rx, 1024);
if (rx_cnt != 0) {
// ZLOGI(TAG, "rx %d bytes", rx_cnt);
if (m_rxcb) m_rxcb(rx, rx_cnt);
}
this_thread::sleep_for(chrono::microseconds(100));
} else {
this_thread::sleep_for(chrono::microseconds(10000));
}
}
}));
}
bool QTDataChannel::open() {
char portnamebuf[256] = {0};
sprintf(portnamebuf, "\\\\.\\%s", m_name.c_str());
m_CommHandler = CreateFileA(portnamebuf, // port name
GENERIC_READ | GENERIC_WRITE, // Read/Write
0, // No Sharing
NULL, // No Security
OPEN_EXISTING, // Open existing port only
0, // Non Overlapped I/O
NULL); // Null for Comm Devices
if (m_CommHandler == INVALID_HANDLE_VALUE) {
ZLOGI(TAG, "Error in opening serial port");
return false;
}
DCB p;
memset(&p, 0, sizeof(p));
p.DCBlength = sizeof(p);
p.BaudRate = m_baudRate; // 波特率
switch (m_dataBits) {
case QSerialPort::Data5:
p.ByteSize = 5;
break;
case QSerialPort::Data6:
p.ByteSize = 6;
break;
case QSerialPort::Data7:
p.ByteSize = 7;
break;
case QSerialPort::Data8:
p.ByteSize = 8;
break;
default:
p.ByteSize = 8;
break;
}
// QSerialPort::NoParity = 0,
// QSerialPort::EvenParity = 2,
// QSerialPort::OddParity = 3,
// QSerialPort::SpaceParity = 4,
// QSerialPort::MarkParity = 5,
// QSerialPort::UnknownParity = -1
switch (m_parity) // 校验位
{
case QSerialPort::NoParity:
p.Parity = NOPARITY; // 无校验
break;
case QSerialPort::EvenParity:
p.Parity = EVENPARITY; // 奇校验
break;
case QSerialPort::OddParity:
p.Parity = ODDPARITY; // 偶校验
break;
case QSerialPort::MarkParity:
p.Parity = MARKPARITY; // 标记校验
break;
default:
p.Parity = NOPARITY; // 无校验
}
switch (m_stopBits) // 停止位
{
case QSerialPort::OneStop:
p.StopBits = ONESTOPBIT; // 1位停止位
break;
case QSerialPort::OneAndHalfStop:
p.StopBits = TWOSTOPBITS; // 2位停止位
break;
case QSerialPort::TwoStop:
p.StopBits = ONE5STOPBITS; // 1.5位停止位
break;
default:
p.StopBits = ONESTOPBIT; // 无校验
}
if (!SetCommState(m_CommHandler, &p)) {
// 设置参数失败
CloseHandle(m_CommHandler);
return false;
}
m_isOpen = true;
return true;
}
void QTDataChannel::close() {
CloseHandle(m_CommHandler);
m_isOpen = false;
}
bool QTDataChannel::isOpen() { return m_isOpen; }
bool QTDataChannel::send(const uint8_t *data, size_t len) {
DWORD dwBytesWrite = len;
BOOL bWriteStat = WriteFile(m_CommHandler, // 串口句柄
(char *)data, // 数据首地址
dwBytesWrite, // 要发送的数据字节数
&dwBytesWrite, // DWORD*,用来接收返回成功发送的数据字节数
NULL); // NULL为同步发送,OVERLAPPED*为异步发送
return dwBytesWrite;
}
void QTDataChannel::regRxListener(function<void(uint8_t *data, size_t len)> cb) { m_rxcb = cb; }
int QTDataChannel::com_receive(uint8_t *rxbuf, int rxbufsize) {
COMMTIMEOUTS TimeOuts;
GetCommTimeouts(m_CommHandler, &TimeOuts);
TimeOuts.ReadIntervalTimeout = 0; // 读间隔超时
TimeOuts.ReadTotalTimeoutMultiplier = 0; // 读时间系数
TimeOuts.ReadTotalTimeoutConstant = 1; // 读时间常量
SetCommTimeouts(m_CommHandler, &TimeOuts);
// PurgeComm(m_CommHandler, PURGE_RXCLEAR);
DWORD wCount = rxbufsize; // 成功读取的数据字节数
BOOL bReadStat = ReadFile(m_CommHandler, // 串口句柄
rxbuf, // 数据首地址
wCount, // 要读取的数据最大字节数
&wCount, // DWORD*,用来接收返回成功读取的数据字节数
NULL);
return wCount;
}

79
src/camera_light_src_timing_controller/qt_serial_datachannel.hpp

@ -1,79 +0,0 @@
#pragma once
#include <fstream>
#include <functional>
#include <iostream>
#include <list>
#include <map>
#include <memory>
#include <mutex>
#include <set>
#include <sstream>
#include <string>
#include <vector>
//
#include <winsock2.h>
//
#include <Windows.h>
//
#include <QtSerialPort/QSerialPort>
#include <QtSerialPort/QSerialPortInfo>
//
#include "clst_controler.hpp"
#include "zqthread.hpp"
#define SDK_VERSION 1
namespace iflytop {
namespace clst {
using namespace std;
// QT_CHARTS_USE_NAMESPACE
typedef function<void(bool connect)> device_state_cb_t;
class QTDataChannel : public IDataChannel {
function<void(uint8_t *data, size_t len)> m_rxcb;
QSerialPort::DataBits m_dataBits;
QSerialPort::Parity m_parity;
QSerialPort::StopBits m_stopBits;
QSerialPort::FlowControl m_flowControl;
string m_name;
unique_ptr<thread> m_thread;
uint32_t m_baudRate;
HANDLE m_CommHandler;
bool m_isOpen = false;
public:
void init();
virtual bool isOpen() override;
virtual bool send(const uint8_t *data, size_t len) override;
virtual void regRxListener(function<void(uint8_t *data, size_t len)> cb) override;
bool open();
void close();
bool setBaudRate(qint32 baudRate) { m_baudRate = baudRate; }
qint32 baudRate() const { return m_baudRate; }
bool setPortName(string name) { m_name = name; }
bool setDataBits(QSerialPort::DataBits dataBits) { m_dataBits = dataBits; }
bool setParity(QSerialPort::Parity parity) { m_parity = parity; }
bool setStopBits(QSerialPort::StopBits stopBits) { m_stopBits = stopBits; }
bool setFlowControl(QSerialPort::FlowControl flowControl) { m_flowControl = flowControl; }
QSerialPort::DataBits dataBits() const { return m_dataBits; }
QSerialPort::Parity parity() const { return m_parity; }
QSerialPort::StopBits stopBits() const { return m_stopBits; }
QSerialPort::FlowControl flowControl() const { return m_flowControl; }
private:
int com_receive(uint8_t *rxbuf, int rxbufsize);
};
} // namespace clst
} // namespace iflytop

1
zaf_protocol

@ -1 +0,0 @@
Subproject commit c6d92f6fde665a4821dfdf968a84b2d987e441e6
Loading…
Cancel
Save