libxr  1.0
Want to be the best embedded framework
Loading...
Searching...
No Matches
desc_str.cpp
1#include "desc_str.hpp"
2
3using namespace LibXR::USB;
4
6 const std::initializer_list<const LanguagePack*>& lang_list)
7 : LANG_NUM(lang_list.size()),
8 header_(new uint16_t[LANG_NUM + 1]),
9 land_id_(header_ + 1),
10 string_list_(new const LanguagePack*[LANG_NUM])
11{
12 ASSERT(LANG_NUM > 0);
13 auto lang = lang_list.begin();
14 size_t max_str_len = 0;
15 for (size_t i = 0; i < LANG_NUM; i++)
16 {
17 land_id_[i] = static_cast<uint16_t>((*lang)->lang_id);
18 string_list_[i] = *lang;
19 if (max_str_len < (*lang)->max_string_length)
20 {
21 max_str_len = (*lang)->max_string_length;
22 }
23 ++lang;
24 }
25 *header_ = (static_cast<uint16_t>(LANG_NUM * 2 + 2)) | (0x03 << 8);
26 buffer_.addr_ = new uint8_t[max_str_len + 2];
27 buffer_.size_ = max_str_len + 2;
28}
29
30ErrorCode DescriptorStrings::GenerateString(Index index, uint16_t lang)
31{
32 ASSERT(buffer_.addr_ != nullptr);
33
34 if (index == Index::LANGUAGE_ID)
35 {
36 return ErrorCode::NOT_SUPPORT;
37 }
38
39 int ans = -1;
40 for (size_t i = 0; i < LANG_NUM; ++i)
41 {
42 if (land_id_[i] == lang)
43 {
44 ans = static_cast<int>(i);
45 break;
46 }
47 }
48 if (ans == -1)
49 {
50 return ErrorCode::NOT_FOUND;
51 }
52
53 uint8_t* buffer = reinterpret_cast<uint8_t*>(buffer_.addr_);
54 auto data_len = string_list_[ans]->string_lens[static_cast<size_t>(index) - 1] + 2;
55
56 buffer[1] = 0x03;
57 buffer[0] = data_len;
58 const char* str = string_list_[ans]->strings[static_cast<size_t>(index) - 1];
59 ToUTF16LE(str, buffer + 2);
60 return ErrorCode::OK;
61}
62
64{
65 ASSERT(buffer_.addr_ != nullptr);
66 uint8_t* buffer = reinterpret_cast<uint8_t*>(buffer_.addr_);
67 return RawData{buffer_.addr_, buffer[0]};
68}
69
71{
72 return RawData{header_, (LANG_NUM + 1) * sizeof(uint16_t)};
73}
74
75void DescriptorStrings::ToUTF16LE(const char* str, uint8_t* buffer)
76{
77 size_t len = 0;
78 const unsigned char* s = reinterpret_cast<const unsigned char*>(str);
79
80 while (*s)
81 {
82 uint32_t codepoint = 0;
83
84 if (*s < 0x80)
85 {
86 codepoint = *s++;
87 }
88 else if ((*s & 0xE0) == 0xC0)
89 {
90 codepoint = (*s & 0x1F) << 6;
91 s++;
92 codepoint |= (*s & 0x3F);
93 s++;
94 }
95 else if ((*s & 0xF0) == 0xE0)
96 {
97 codepoint = (*s & 0x0F) << 12;
98 s++;
99 codepoint |= (*s & 0x3F) << 6;
100 s++;
101 codepoint |= (*s & 0x3F);
102 s++;
103 }
104 else if ((*s & 0xF8) == 0xF0)
105 {
106 // 忽略超出 BMP 的字符(如 emoji)
107 s++;
108 if (*s)
109 {
110 s++;
111 }
112 if (*s)
113 {
114 s++;
115 }
116 if (*s)
117 {
118 s++;
119 }
120 continue;
121 }
122 else
123 {
124 s++;
125 continue;
126 }
127
128 buffer[len++] = codepoint & 0xFF;
129 buffer[len++] = (codepoint >> 8) & 0xFF;
130 }
131}
原始数据封装类。 A class for encapsulating raw data.
size_t size_
数据大小(字节)。 The size of the data (in bytes).
void * addr_
数据存储地址。 The storage address of the data.
ErrorCode GenerateString(Index index, uint16_t lang)
生成指定语言和索引的字符串描述符 Generate USB string descriptor for given language and string index
Definition desc_str.cpp:30
const size_t LANG_NUM
已注册语言数量 / Registered language count
Definition desc_str.hpp:160
RawData GetData()
获取当前构建好的字符串描述符数据 Get the descriptor buffer
Definition desc_str.cpp:63
DescriptorStrings(const std::initializer_list< const LanguagePack * > &lang_list)
USB 描述符字符串管理器构造函数 USB descriptor string manager constructor.
Definition desc_str.cpp:5
RawData buffer_
临时描述符缓冲区 / Temp descriptor buffer
Definition desc_str.hpp:164
RawData GetLangIDData()
获取语言ID描述符内容 Get LangID descriptor data
Definition desc_str.cpp:70
Index
描述符字符串索引 / USB descriptor string index
Definition desc_str.hpp:25
@ LANGUAGE_ID
语言ID描述符 / LangID descriptor
const LanguagePack ** string_list_
多语言包指针表 / LanguagePack pointer table
Definition desc_str.hpp:163
uint16_t * land_id_
语言ID数组 / LangID array
Definition desc_str.hpp:162
uint16_t * header_
语言ID描述符头部 / LangID descriptor header
Definition desc_str.hpp:161
单语言描述符包(用于注册静态多语言字符串) Single language USB string descriptor pack for registration
Definition desc_str.hpp:49
StringData strings[STRING_LIST_SIZE]
Definition desc_str.hpp:51