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 14:06:00 浏览: 98
这是一个函数 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连接并且设置一些连接状态处理程序。
void load_parameters(); bool debug_; std::vector<std::tuple<double, imuReading<float>>> imu_queue_; double prev_imu_time_; void setup_track_handler(); std::shared_ptr<corner_detector::TrackHandler> track_handler_;
这段代码看起来像是一个类的成员函数和成员变量的定义,其中包括:
- load_parameters()函数,用于加载参数;
- debug_变量,可能是用于控制调试模式的开关;
- imu_queue_变量,是一个std::vector类型的队列,里面存储了一些tuple类型的数据,每个tuple包括一个double类型的时间戳和一个imuReading<float>类型的IMU数据;
- prev_imu_time_变量,是一个double类型的变量,可能是用于保存上一个IMU数据的时间戳;
- setup_track_handler()函数,用于设置一个corner_detector::TrackHandler类型的成员变量;
- track_handler_变量,是一个std::shared_ptr类型的智能指针,指向一个corner_detector::TrackHandler类型的对象。
不过由于缺乏上下文,无法准确判断这些成员函数和成员变量的作用和用途。