HandlerInfo make_handler(void (_C::*fn)(const mavlink::mavlink_message_t*, _T &)) { auto bfn = std::bind(fn, static_cast<_C*>(this), std::placeholders::_1, std::placeholders::_2); const auto id = _T::MSG_ID; const auto name = _T::NAME; const auto type_hash_ = typeid(_T).hash_code(); return HandlerInfo { id, name, type_hash_, [bfn](const mavlink::mavlink_message_t *msg, const mavconn::Framing framing) { if (framing != mavconn::Framing::ok) return; mavlink::MsgMap map(msg); _T obj; obj.deserialize(map); bfn(msg, obj); } }; }
时间: 2023-06-26 12:06:00 浏览: 235
这是一个函数 make_handler,它接受一个指向类成员函数的指针 fn,并返回一个 HandlerInfo 对象。HandlerInfo 对象包含以下信息:
- 消息 ID:_T::MSG_ID
- 消息名称:_T::NAME
- 类型哈希码:typeid(_T).hash_code()
- 回调函数:一个 lambda 表达式,它将传入的 mavlink_message_t 和 mavconn::Framing 参数转换为 _T 对象,调用 fn 函数,并传入 mavlink_message_t 和 _T 对象作为参数。
该函数的实现使用了 std::bind 和 placeholders,将 fn 和 this 指针绑定到了一个新的函数对象 bfn 上,以便在 lambda 表达式中使用。lambda 表达式中先判断 mavconn::Framing 参数是否为 ok,如果不是则直接返回;否则将 mavlink_message_t 转换为 _T 对象,并调用 fn 函数处理。
相关问题
// setup UAS and diag mav_uas.set_tgt(tgt_system_id, tgt_component_id); UAS_FCU(&mav_uas) = fcu_link; mav_uas.add_connection_change_handler(std::bind(&MavlinkDiag::set_connection_status, &fcu_link_diag, std::placeholders::_1)); mav_uas.add_connection_change_handler(std::bind(&MavRos::log_connect_change, this, std::placeholders::_1));
这段代码看起来是在设置一个MAVLink的链接,并且将该链接与一些处理程序关联。具体来说:
- `mav_uas.set_tgt(tgt_system_id, tgt_component_id);` 这行代码设置MAVLink连接的目标系统ID和组件ID。
- `UAS_FCU(&mav_uas) = fcu_link;` 这行代码设置MAVLink连接的通信方式(可能是串口、UDP、TCP等)。
- `mav_uas.add_connection_change_handler(std::bind(&MavlinkDiag::set_connection_status, &fcu_link_diag, std::placeholders::_1));` 这行代码将一个处理程序与MAVLink连接关联。当连接状态发生变化时,处理程序`MavlinkDiag::set_connection_status`将被调用,参数`_1`是连接状态。
- `mav_uas.add_connection_change_handler(std::bind(&MavRos::log_connect_change, this, std::placeholders::_1));` 这行代码将另一个处理程序与MAVLink连接关联。当连接状态发生变化时,处理程序`MavRos::log_connect_change`将被调用,参数`_1`是连接状态。
总体来说,这段代码的作用是建立MAVLink连接并且设置一些连接状态处理程序。
static void start_task(void* parameter) { BaseType_t xReturn = pdPASS; //进入临界状态 taskENTER_CRITICAL(); //创建loop任务 xReturn = xTaskCreate((TaskFunction_t )Loop_task, (const char* )"Loop_task", (uint16_t )LOOP_STACK_SIZE, (void* )NULL, (UBaseType_t )LOOP_TASK_PRIO, (TaskHandle_t* )&LoopTask_Handler); if(pdPASS == xReturn) { printf("创建Loop_task成功\r\n"); } //创建display任务 xReturn = xTaskCreate((TaskFunction_t )display_task, (const char* )"display_task", (uint16_t )DISPLAY_STACK_SIZE, (void* )NULL, (UBaseType_t )DISPLAY_TASK_PRIO, (TaskHandle_t* )&DisplayTask_Handler); if(pdPASS == xReturn) { printf("创建display_task成功\r\n"); } 逐行注释
这是一段使用 FreeRTOS 操作系统的嵌入式 C 语言代码,主要是创建两个任务:Loop_task 和 display_task。下面是逐行注释:
```
static void start_task(void* parameter) { // 定义一个名为 start_task 的函数,参数为 void 指针类型的 parameter
BaseType_t xReturn = pdPASS; // 定义一个 BaseType_t 类型的变量 xReturn,并初始化为 pdPASS
taskENTER_CRITICAL(); // 进入临界状态,屏蔽中断
// 创建 Loop_task 任务
xReturn = xTaskCreate((TaskFunction_t )Loop_task, // 任务函数为 Loop_task
(const char* )"Loop_task", // 任务名称为 Loop_task
(uint16_t )LOOP_STACK_SIZE, // 任务堆栈大小为 LOOP_STACK_SIZE
(void* )NULL, // 任务参数为 NULL
(UBaseType_t )LOOP_TASK_PRIO, // 任务优先级为 LOOP_TASK_PRIO
(TaskHandle_t* )&LoopTask_Handler); // 任务句柄为 &LoopTask_Handler
if(pdPASS == xReturn) { // 如果任务创建成功
printf("创建Loop_task成功\r\n"); // 输出提示信息
}
// 创建 display_task 任务
xReturn = xTaskCreate((TaskFunction_t )display_task, // 任务函数为 display_task
(const char* )"display_task", // 任务名称为 display_task
(uint16_t )DISPLAY_STACK_SIZE, // 任务堆栈大小为 DISPLAY_STACK_SIZE
(void* )NULL, // 任务参数为 NULL
(UBaseType_t )DISPLAY_TASK_PRIO, // 任务优先级为 DISPLAY_TASK_PRIO
(TaskHandle_t* )&DisplayTask_Handler); // 任务句柄为 &DisplayTask_Handler
if(pdPASS == xReturn) { // 如果任务创建成功
printf("创建display_task成功\r\n"); // 输出提示信息
}
}
```
阅读全文