GKD.RoboCtrl
RoboMaster Linux 电控:异步 IO、设备驱动与机器人控制
载入中...
搜索中...
未找到
controlpad.cpp
1#include "device/controlpad.h"
2#include "device/base.hpp"
3#include "io/serial.h"
4
5#include <cstdint>
6#include <limits>
7
8using namespace roboctrl::device;
9
10namespace {
11
12bool valid_control_pad_state(const control_pad_state& state) noexcept {
13 constexpr std::int32_t channel_limit = 660;
14 const auto valid_channel = [](std::int32_t value) {
15 return value >= -channel_limit && value <= channel_limit;
16 };
17 const auto valid_switch = [](std::int32_t value) {
18 return value >= static_cast<std::int32_t>(switch_position::up) &&
19 value <= static_cast<std::int32_t>(switch_position::middle);
20 };
21 const auto valid_mouse_axis = [](std::int32_t value) {
22 return value >= std::numeric_limits<std::int16_t>::min() &&
23 value <= std::numeric_limits<std::int16_t>::max();
24 };
25
26 return valid_channel(state.ch0) && valid_channel(state.ch1) &&
27 valid_channel(state.ch2) && valid_channel(state.ch3) &&
28 valid_channel(state.ch4) && valid_switch(state.s1) &&
29 valid_switch(state.s2) && valid_mouse_axis(state.mouse_x) &&
30 valid_mouse_axis(state.mouse_y) && valid_mouse_axis(state.mouse_z) &&
31 (state.mouse_l == 0 || state.mouse_l == 1) &&
32 (state.mouse_r == 0 || state.mouse_r == 1) &&
33 state.key >= 0 && state.key <= std::numeric_limits<std::uint16_t>::max();
34}
35
36} // namespace
37
39 :info_{info},
40 device_base{100ms}
41{
42 auto& serial = roboctrl::get<io::serial>(info.serial_name);
43 serial.on_data(2,[this](const control_pad_state& state){
44 if (!valid_control_pad_state(state)) {
45 log_warn("Rejected invalid control-pad frame");
46 return;
47 }
48 state_ = state;
49 tick();
50 on_update_(state);
51 });
52}
control_pad(const info_type &info)
构造遥控器设备并注册串口回调。
control_pad_state state() const noexcept
获取最近一次有效报文解析出的输入快照。
Definition controlpad.h:80
void log_warn(std::format_string< Args... > fmt, Args &&...args) const
输出warn日志
Definition logger.h:226
遥控器串口设备与稳定输入快照。
设备抽象基类与通用概念。
串口裸 IO 封装。
遥控器实例化参数。
Definition controlpad.h:61
串口遥控输入的稳定内存表示。
Definition controlpad.h:22
设备基础类,提供判断设备离线的基础功能
Definition base.hpp:38
void tick()
更新心跳时间
Definition base.hpp:61