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