概述
为便于主控程序代码的维护和与电台业务及其它部分代码之间的协作、整合和集成,我们将电台主控程序代码封装成了 DbdtControl 静态库,提供单一的 .a 库文件和 .h 头文件。
在电台程序里引入主控程序,需要首先引入主控程序的库和头文件,然后在电台程序代码若干位置加入主控程序的 hook 函数调用。
主控程序额外提供一个 interface.cpp 文件,内容是对主控调用业务层各个接口(发送消息)的简单封装。因为接口通过C++类方式组织,并且其中大量引用了业务层定义的符号类型,如果直接封装在主控程序库里会造成主控与业务代码耦合性过大,故而剥离。
项目配置
创建 rcu_arm_qmake_dbg2\lib_dbdt_control\ 目录并将主控程序的库文件和头文件放在这里: ---- libDbdtControl.a ---- dbdtcontrol.h rcu_arm_qmake_dbg2.pro QT 项目配置文件里加入: DEPENDPATH += $$PWD/lib_dbdt_control unix:!macx: LIBS += -L$$PWD/lib_dbdt_control/ -lDbdtControl 将 interface.cpp 文件放到 \mdm_sync\app_fpp\app_msg_que\ 目录下。
Hooks
修改电台基础程序代码的以下几处,加入主控程序 hook 函数调用。
File | Function | Hook Codes | Comment |
\mdm_sync\app_fpp\app_fpp_tsk_arm.cpp | <header> | #include "./app_msg_que/interface.cpp" | 引入 interface.cpp 文件 |
ㅤ | void TaskAppFppMain(void) | S2_msg(&msgToFpp); | 调用主控程序读取业务层发送的消息函数。
增加在函数开始部分。 |
\mdm_sync\obj_os\rcu_linux_main.cpp | <header> | #include "//geoinfo../../lib_dbdt_control/dbdtcontrol.h” | 引入主控程序头文件 |
ㅤ | int main(int argc, char** argv) | dbdt_init(argc, argv);
dbg_xmt_type = config.type;
dbdt_create(); | 主控程序代码初始化
建议加在 “OS_TASK_START_ALL();” 这行之前 |
\mdm_sync\app_net\app_net_aud_207.c | <global> | // dbdtcontrol
int sub_sio_put_string_rcv_new(INT32U comID, INT8U *buf, INT32U len) {
switch (comID) {
case 4: // 422 ICMU
b422_icmu_read_handle(buf, len);
return 1;
case 33: // 429
b429_read_handle(buf, len);
return 1;
case 34: // 1553
b1553_read_handle(buf, len);
return 1;
default:
return 0;
}
} | 引入主控程序读取 207 中转的各物理和虚拟串口通讯数据接口。 |
ㅤ | void AppNetAud3_callback_aud(unsigned char *u8p_src,int len) | if (sub_sio_put_string_rcv_new(p->DN_UP_ASIO.channel, &p->DN_UP_ASIO.asio_dat[0], p->h.sigLen - 1)) {
break;
} | 调用主控程序读取 207 中转虚拟串口数据接口。
增加在 if(tmp16U0)
sub_sio_put_string_rcv( p->DN_UP_ASIO.channel, &p->DN_UP_ASIO.asio_dat[0], p->h.sigLen-1); 这行代码下方。 |