diff --git a/modules/pannel/control_pannel/CMakeLists.txt b/modules/pannel/control_pannel/CMakeLists.txt index a9bdc570d0deef2c31f2998eb94e663d1612a1ef..7eed81d5e7f6f40b79afd5ccca496f91461b255e 100644 --- a/modules/pannel/control_pannel/CMakeLists.txt +++ b/modules/pannel/control_pannel/CMakeLists.txt @@ -49,3 +49,9 @@ set_target_properties(control_pannel PROPERTIES ) qt_finalize_executable(control_pannel) +# ====copy doc +add_custom_command(TARGET control_pannel + POST_BUILD + COMMAND echo Copy Handbook to EXE path + COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/control_pannel.md ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/control_pannel.md + ) diff --git a/modules/pannel/control_pannel/control_pannel.md b/modules/pannel/control_pannel/control_pannel.md new file mode 100644 index 0000000000000000000000000000000000000000..0ad26d458f9bc34131396d3009b9a076f5588132 --- /dev/null +++ b/modules/pannel/control_pannel/control_pannel.md @@ -0,0 +1,109 @@ +# 控制面板模块 + +首次发布:2020-06 + +最新发布:2022-11 + +作者:彩鹰工作室 + +---- + +控制面板模块用于统一管理各个进程开放的可配置参数表。典型的需求是在模块运行时,动态的修改/显示某个参数。如在调频收音机启动时,动态改变频率、增益。 + +这个模块的原理参考技术文章:[Qt lambda槽在跨进程功能发现与参数同步中的应用](https://goldenhawking.blog.csdn.net/article/details/124426795) + + +# 1.输入输出专题 + +本模块没有输入输出专题。 + +# 2.工作原理 + +要做到跨进程参数的实时控制,需要经过如下几个步骤。 + +1. 参数发布:受控模块要广播自身可被配置的参数。 +2. 参数更新,包含两个部分。 + 1. 参数显示:控制面板模块收到广播,创建控件并显示。 + 2. 参数配置:控制面板模块中的控件被用户点击,取值发生改变。此时,会广播模块修改命令。 + + +## 2.1 参数发布 + +参数发布使用taskBus的控制专题(0xffffffffu)进行全局广播。控制专题是一种特殊的专题,能够实现模块之间的控制消息传递。传递的消息格式是key=value这样的样式,用分号分割。 + +一个模块要告诉所有部位,自己在运行时,有哪些可操作的变量。同时,要广播的还有变量的类型、范围,取值等等。这个指令可以看做功能声明,指令类似: + +```txt +source=2; +destin=0; +function=handle_annouce; +handle=rx_freq; +label=接收频率(Hz); +type=double; +range=0:6000000000; +step=100000; +decimal=0; +value=70000000; +``` + +或者: + +```txt +source=2; +destin=0; +function=handle_annouce; +handle=rx_antenna; +label=接收天线; +type=string; +range=RX,TX/RX; +value=RX2; +``` + + +当模块启动时,向所有人广播这个功能声明,以便发现相应的功能。 + +上述字符串使用专题0xffffffffu直接写入 stdout,即可完成声明。当然,如果您使用的是C语言,在 tb_interface.h里,已经有了方便的函数直接使用: + +```c + /*! + * \brief annouce_handle 通过广播,公告某个参数可被全局配置 + * \param source 本公告的来源。可以自定义,只要确保与配置指令的一致性即可。 + * \param destin 一般填“0”,表示向所有模块实例广播 + * \param handle 参数的名称(句柄名称),如频率、增益 + * \param value 当前取值 + * \param label 显示在界面上的友好信息。如果不写,handle会被显示 + * \param type 类型,可以为空,则表示字符串。 + * \param range 取值范围:用于指定spinbox的范围 + * \param step 步进:用于指定spinbox的步进 + * \param decimal 小数位数。 + * \param pMtx 用于多线程stdout时的互斥量 + */ + inline void annouce_handle( + const std::string & source, + const std::string & destin, + const std::string & handle, + const std::string & value, + const std::string & label = "", + const std::string & type = "", + const std::string & range = "", + const std::string & step = "", + const std::string & decimal = "", + std::mutex * pMtx = nullptr + )... +``` + +## 2.2 参数更新 + +一旦要进行参数同步,则由修改方发起,发给被修改方。这种修改可以是双向的,即参数使用进程如果发现参数变更,可以发起同步给界面控制台。界面控制台接到修改请求,发给参数使用进程。指令: + + +```txt +source=7; +destin=2; +function=handle_set; +handle=rx_freq; +value=71200000; +``` + +当然,使用者要保证destin的正确性。 + diff --git a/modules/pannel/control_pannel/control_pannel.pro b/modules/pannel/control_pannel/control_pannel.pro index ecc1e941b9aa42e4b36fac4a2b5d61cdabad793d..33d07d5defa3337d475e534f88995a666a8874da 100644 --- a/modules/pannel/control_pannel/control_pannel.pro +++ b/modules/pannel/control_pannel/control_pannel.pro @@ -36,3 +36,5 @@ DISTFILES += \ RESOURCES += \ control_pannel.qrc + +QMAKE_POST_LINK += $${QMAKE_COPY} $$PWD/control_pannel.md $$DESTDIR/control_pannel.md diff --git a/taskbusplatform/gui/taskbusplatformfrm.cpp b/taskbusplatform/gui/taskbusplatformfrm.cpp index 0224a3ed513a4b358ba84b4d266781f85f5ccf11..eeeffb1500dc9abf1152a68159b94c20c5229b15 100644 --- a/taskbusplatform/gui/taskbusplatformfrm.cpp +++ b/taskbusplatform/gui/taskbusplatformfrm.cpp @@ -262,6 +262,15 @@ void taskBusPlatformFrm::on_mdiArea_subWindowActivated(QMdiSubWindow *arg1) ui->dockWidget_props->setEnabled(!dv->is_running()); dv->setEnabled(!dv->is_running()); } + else + { + ui->action_Start_project->setEnabled(false); + ui->action_stop_project->setEnabled(false); + ui->action_Save_Project->setEnabled(false); + ui->dockWidget_props->setEnabled(false); + ui->treeView_props->setModel(0); + return; + } } void taskBusPlatformFrm::on_comboBox_class_currentIndexChanged(int index) diff --git a/tb_interface/tb_interface.h b/tb_interface/tb_interface.h index 1df9d4e5443e66efa1f7936040a68327e0e7f502..3f27a510af7e01fa0bc2fa07050f7dc97e02a952 100644 --- a/tb_interface/tb_interface.h +++ b/tb_interface/tb_interface.h @@ -380,7 +380,19 @@ namespace TASKBUS{ v.push_back(0); return v; } - //播告功能 + /*! + * \brief annouce_handle 通过广播,公告某个参数可被全局配置 + * \param source 本公告的来源。可以自定义,只要确保与配置指令的一致性即可。 + * \param destin 一般填“0”,表示向所有模块实例广播 + * \param handle 参数的名称(句柄名称),如频率、增益 + * \param value 当前取值 + * \param label 显示在界面上的友好信息。如果不写,handle会被显示 + * \param type 类型,可以为空,则表示字符串。 + * \param range 取值范围:用于指定spinbox的范围 + * \param step 步进:用于指定spinbox的步进 + * \param decimal 小数位数。 + * \param pMtx 用于多线程stdout时的互斥量 + */ inline void annouce_handle( const std::string & source, const std::string & destin, @@ -408,10 +420,17 @@ namespace TASKBUS{ std::vector v = map_to_ctrlpackage(mp); push_subject(TB_SUBJECT_CMD,0,v.size(),v.data(),pMtx); } - //播告功能 + /*! + * \brief set_handle 设置刷新功能参数的值 + * \param source + * \param destin 如果destin是0,则是用于刷新界面显示。如果destin是annouce_handle的source,则是配置参数。 + * \param handle 参数的名称(句柄名称),如频率、增益 + * \param value 当前取值 + * \param pMtx 用于多线程stdout时的互斥量 + */ inline void set_handle( - const std::string & source, - const std::string & destin, + const std::string & source, //发起参数刷新的来源。注意要和annouce_handle的source一致 + const std::string & destin, //配置目的。这个目的 const std::string & handle, const std::string & value, std::mutex * pMtx = nullptr