One Framework 0.1.0
RoboMaster嵌入式框架“一键”解决方案,为你的“创意”服务。
载入中...
搜索中...
未找到
ControllerHub.hpp
浏览该文件的文档.
1// Copyright (c) 2025. MoonFeather
2// SPDX-License-Identifier: BSD-3-Clause
3
4#ifndef CONTROLLERHUB_HPP
5#define CONTROLLERHUB_HPP
6
7#include <array>
8
10
11#include <OF/utils/Remap.hpp>
12
13#include <zephyr/drivers/uart.h>
14#include <zephyr/kernel.h>
15
16#include <tl/expected.hpp>
17
18namespace OF
19{
21 {
22 const device* input_device;
23 };
24
25 // ControllerHub 错误类型定义
27 {
28 enum class Code
29 {
30 DISCONNECTED, // 遥控器断线
32
33 const char* message;
34 };
35
36 // Forward declare State class for ControllerHub
38 {
39 public:
71
72 int16_t& operator[](Channel ch)
73 {
74 return m_arr[static_cast<size_t>(ch)];
75 }
76
77 int16_t operator[](Channel ch) const
78 {
79 return m_arr[static_cast<size_t>(ch)];
80 }
81
82 [[nodiscard]] float percent(const Channel ch) const
83 {
84 const float value = m_arr[static_cast<size_t>(ch)];
85 return remap<364.0f, 1684.0f, -1.0f, 1.0f>(value);
86 }
87
88 private:
89 std::array<int16_t, 32> m_arr{}; // 扩展数组大小以容纳新通道
90 };
91
92 class ControllerHub : public HubBase<ControllerHub>
93 {
94 public:
95 ControllerHub() = default;
96 static constexpr auto name = "ControllerHub";
97
100
101 static tl::expected<State, ControllerHubError> getData();
102
103 void setup();
104 void configure(const ControllerHubConfig& config);
105
108
109 private:
110 // DBUS相关数据结构
111 static constexpr size_t DBUS_FRAME_LEN = 18;
112 static constexpr size_t DBUS_CHANNEL_COUNT = 28; // 通道总数:5个摇杆+2个开关+4个鼠标+1个滚轮+16个键盘
113 static constexpr uint32_t DBUS_INTERFRAME_SPACING_MS = 20;
114
115 // 通道映射表 - 直接存储DBUS通道号
116 static const uint32_t input_channels_full[DBUS_CHANNEL_COUNT];
117
118 // 内部数据结构
119 struct ControllerHubDataInternal
120 {
121 k_thread thread;
122 k_sem report_lock;
123
124 uint16_t xfer_bytes;
125 uint8_t rd_data[DBUS_FRAME_LEN];
126 uint8_t dbus_frame[DBUS_FRAME_LEN];
127 bool in_sync;
128 uint32_t last_rx_time;
129
130 /* async mode buffers */
131 uint8_t async_rx_buf[2][DBUS_FRAME_LEN];
132 uint8_t next_async_buf;
133
134 uint16_t last_reported_value[DBUS_CHANNEL_COUNT];
135 int8_t channel_mapping[DBUS_CHANNEL_COUNT];
136
137 bool using_async; /* true if async API is in use, false -> IRQ fallback */
138 uint8_t invalid_frames;
139
140 K_KERNEL_STACK_MEMBER(thread_stack, 1024);
141 };
142
143 static ControllerHubDataInternal s_data;
144 static const device* s_uart_dev;
145
146 // 内部方法
147 static int dbus_enable_rx();
148 static void dbus_restart_rx();
149 static void dbus_append_rx_bytes(const uint8_t* buf, size_t len);
150 static void dbus_supply_rx_buffer();
151 static bool dbus_frame_valid(const uint8_t* buf);
152 static void dbus_uart_event_handler(struct uart_event* evt);
153 static void dbus_uart_isr_handler();
154 static void input_dbus_input_report_thread();
155 };
156} // namespace OF
157static tl::expected<OF::ControllerHubData, OF::ControllerHubError> getControllerData()
158{
160}
161#endif // CONTROLLERHUB_HPP
static tl::expected< OF::ControllerHubData, OF::ControllerHubError > getControllerData()
定义 ControllerHub.hpp:157
定义 ControllerHub.hpp:38
int16_t & operator[](Channel ch)
定义 ControllerHub.hpp:72
float percent(const Channel ch) const
定义 ControllerHub.hpp:82
int16_t operator[](Channel ch) const
定义 ControllerHub.hpp:77
Channel
定义 ControllerHub.hpp:41
@ KEY_R
定义 ControllerHub.hpp:62
@ MOUSE_RIGHT
定义 ControllerHub.hpp:53
@ WHEEL
定义 ControllerHub.hpp:46
@ MOUSE_X
定义 ControllerHub.hpp:49
@ KEY_B
定义 ControllerHub.hpp:69
@ KEY_G
定义 ControllerHub.hpp:64
@ KEY_Z
定义 ControllerHub.hpp:65
@ KEY_V
定义 ControllerHub.hpp:68
@ KEY_A
定义 ControllerHub.hpp:57
@ KEY_Q
定义 ControllerHub.hpp:60
@ MOUSE_Z
定义 ControllerHub.hpp:51
@ SW_L
定义 ControllerHub.hpp:47
@ KEY_C
定义 ControllerHub.hpp:67
@ RIGHT_Y
定义 ControllerHub.hpp:45
@ KEY_E
定义 ControllerHub.hpp:61
@ KEY_W
定义 ControllerHub.hpp:54
@ KEY_S
定义 ControllerHub.hpp:55
@ KEY_SHIFT
定义 ControllerHub.hpp:58
@ SW_R
定义 ControllerHub.hpp:48
@ KEY_CTRL
定义 ControllerHub.hpp:59
@ MOUSE_LEFT
定义 ControllerHub.hpp:52
@ LEFT_Y
定义 ControllerHub.hpp:43
@ KEY_X
定义 ControllerHub.hpp:66
@ LEFT_X
定义 ControllerHub.hpp:42
@ RIGHT_X
定义 ControllerHub.hpp:44
@ KEY_F
定义 ControllerHub.hpp:63
@ MOUSE_Y
定义 ControllerHub.hpp:50
@ KEY_D
定义 ControllerHub.hpp:56
void configure(const ControllerHubConfig &config)
定义 ControllerHub.cpp:89
ControllerHub()=default
void setup()
定义 ControllerHub.cpp:97
ControllerHub & operator=(const ControllerHub &)=delete
static constexpr auto name
定义 ControllerHub.hpp:96
ControllerHub(ControllerHub &)=delete
ControllerHubData::Channel Channel
定义 ControllerHub.hpp:98
static tl::expected< State, ControllerHubError > getData()
定义 ControllerHub.cpp:78
ControllerHubData State
定义 ControllerHub.hpp:99
定义 Mecanum.hpp:6
float remap(const float x)
定义 Remap.hpp:7
定义 ControllerHub.hpp:21
const device * input_device
定义 ControllerHub.hpp:22
定义 ControllerHub.hpp:27
const char * message
定义 ControllerHub.hpp:33
enum OF::ControllerHubError::Code code
Code
定义 ControllerHub.hpp:29
@ DISCONNECTED
定义 ControllerHub.hpp:30