amiro-os / components / bluetooth / checkutility.cpp @ a47d64ad
History | View | Annotate | Download (6.19 KB)
1 | 58fe0e0b | Thomas Schöpping | #include <amiro/bluetooth/checkutility.hpp> |
---|---|---|---|
2 | |||
3 | #include <chprintf.h> |
||
4 | #include <hal.h> |
||
5 | |||
6 | #include <cstring> |
||
7 | |||
8 | using namespace chibios_rt; |
||
9 | using namespace amiro; |
||
10 | |||
11 | WT12CheckUtility::WT12CheckUtility() |
||
12 | {} |
||
13 | |||
14 | WT12CheckUtility::~WT12CheckUtility() |
||
15 | {} |
||
16 | |||
17 | void
|
||
18 | WT12CheckUtility::reset() |
||
19 | { |
||
20 | palWritePad(GPIOC, GPIOC_BT_RST, PAL_HIGH); |
||
21 | BaseThread::sleep(MS2ST(10));
|
||
22 | palWritePad(GPIOC, GPIOC_BT_RST, PAL_LOW); |
||
23 | |||
24 | return;
|
||
25 | } |
||
26 | |||
27 | bool
|
||
28 | WT12CheckUtility::waitForReady(const bool print) |
||
29 | { |
||
30 | char buffer[8]; |
||
31 | const uint16_t length = this->receiveMessage(buffer, 8); |
||
32 | |||
33 | if (print) {
|
||
34 | msgPrint(buffer, length); |
||
35 | } |
||
36 | |||
37 | return (strcmp(buffer, "READY.\r\n") == 0); |
||
38 | } |
||
39 | |||
40 | uint8_t |
||
41 | WT12CheckUtility::selftest() |
||
42 | { |
||
43 | return 0; |
||
44 | } |
||
45 | |||
46 | void
|
||
47 | WT12CheckUtility::msgPrint(const char* message, const uint16_t length) |
||
48 | { |
||
49 | if (length > 0) |
||
50 | { |
||
51 | f8cf404d | Thomas Schöpping | chSequentialStreamWrite((BaseSequentialStream*)&global.sercanmux1, (uint8_t*)message, length); |
52 | // chprintf((BaseSequentialStream*) &global.sercanmux1, "[%d]\n", length);
|
||
53 | 58fe0e0b | Thomas Schöpping | } |
54 | return;
|
||
55 | } |
||
56 | |||
57 | void
|
||
58 | WT12CheckUtility::msgPrintMulti(const char* message_buf, const uint16_t* length_buf, const uint16_t num_messages) |
||
59 | { |
||
60 | uint16_t pos = 0;
|
||
61 | for (uint16_t i = 0; i < num_messages; ++i) |
||
62 | { |
||
63 | this->msgPrint(&message_buf[pos], length_buf[i]);
|
||
64 | pos += length_buf[i]; |
||
65 | } |
||
66 | |||
67 | return;
|
||
68 | } |
||
69 | |||
70 | void
|
||
71 | WT12CheckUtility::sendMessage(char* message, uint8_t link_id)
|
||
72 | { |
||
73 | const uint16_t length = strlen(message);
|
||
74 | if (length >= 1 << 10) { |
||
75 | f8cf404d | Thomas Schöpping | chprintf((BaseSequentialStream*) &global.sercanmux1, "%s(%d): ERROR: message too long!\n", __FILE__ , __LINE__);
|
76 | 58fe0e0b | Thomas Schöpping | return;
|
77 | } |
||
78 | |||
79 | Message msg; |
||
80 | msg.head.start_of_frame = MUX_StartOfFrame; |
||
81 | msg.head.link_id = link_id; |
||
82 | msg.head.flags = 0x00u;
|
||
83 | msg.head.length = length; |
||
84 | msg.message = message; |
||
85 | msg.n_link = ~link_id; |
||
86 | |||
87 | chSequentialStreamPut((BaseSequentialStream*)&SD3, msg.head.start_of_frame); |
||
88 | chSequentialStreamPut((BaseSequentialStream*)&SD3, msg.head.link_id); |
||
89 | chSequentialStreamPut((BaseSequentialStream*)&SD3, msg.head.flags | (msg.head.length >> 8));
|
||
90 | chSequentialStreamPut((BaseSequentialStream*)&SD3, msg.head.length & 0xFFu);
|
||
91 | chSequentialStreamWrite((BaseSequentialStream*)&SD3, (uint8_t*)msg.message, msg.head.length); |
||
92 | chSequentialStreamPut((BaseSequentialStream*)&SD3, msg.n_link); |
||
93 | |||
94 | return;
|
||
95 | } |
||
96 | |||
97 | void
|
||
98 | WT12CheckUtility::sendMessageRaw(const char* message) |
||
99 | { |
||
100 | chSequentialStreamWrite((BaseSequentialStream*)&SD3, (uint8_t*)message, strlen(message)); |
||
101 | return;
|
||
102 | } |
||
103 | |||
104 | uint16_t |
||
105 | WT12CheckUtility::receiveMessage(char* message, const uint16_t max_length) |
||
106 | { |
||
107 | Message msg; |
||
108 | msg.message = message; |
||
109 | |||
110 | msg.head.start_of_frame = chSequentialStreamGet((BaseSequentialStream*)&SD3); |
||
111 | msg.head.link_id = chSequentialStreamGet((BaseSequentialStream*)&SD3); |
||
112 | msg.head.flags = chSequentialStreamGet((BaseSequentialStream*)&SD3); |
||
113 | msg.head.length = (msg.head.flags & 0x03u) << 8; |
||
114 | msg.head.flags = msg.head.flags >> 2;
|
||
115 | msg.head.length += uint8_t(chSequentialStreamGet((BaseSequentialStream*)&SD3)); |
||
116 | |||
117 | if (msg.head.length > max_length)
|
||
118 | { |
||
119 | f8cf404d | Thomas Schöpping | chprintf((BaseSequentialStream*) &global.sercanmux1, "%s(%d): ERROR: message too long (%d of max %d bytes)!\n", __FILE__ , __LINE__, msg.head.length, max_length);
|
120 | 58fe0e0b | Thomas Schöpping | |
121 | for (uint16_t i = 0; i < msg.head.length; ++i) { |
||
122 | chSequentialStreamGet((BaseSequentialStream*)&SD3); |
||
123 | } |
||
124 | msg.head.length = 0;
|
||
125 | } |
||
126 | else
|
||
127 | { |
||
128 | chSequentialStreamRead((BaseSequentialStream*)&SD3, (uint8_t*)msg.message, msg.head.length); |
||
129 | } |
||
130 | |||
131 | msg.n_link = chSequentialStreamGet((BaseSequentialStream*)&SD3); |
||
132 | |||
133 | if (uint8_t(msg.head.link_id ^ msg.n_link) != 0xFFu) |
||
134 | { |
||
135 | f8cf404d | Thomas Schöpping | chprintf((BaseSequentialStream*) &global.sercanmux1, "%s(%d): ERROR: message link id does not match (0x%02X vs 0x%02X)!\n", __FILE__ , __LINE__, msg.head.link_id, msg.n_link);
|
136 | 58fe0e0b | Thomas Schöpping | } |
137 | |||
138 | return msg.head.length;
|
||
139 | } |
||
140 | |||
141 | uint16_t |
||
142 | WT12CheckUtility::receiveMessages(char* message_buf, const uint16_t msg_buf_size, uint16_t* length_buf, const uint16_t len_buf_size, const char* last_msg, const char* filter_in, const char* filter_out) |
||
143 | { |
||
144 | if (msg_buf_size == 0 || len_buf_size == 0) { |
||
145 | return 0; |
||
146 | } |
||
147 | |||
148 | for (uint16_t i = 0; i < len_buf_size; ++i) { |
||
149 | length_buf[i] = 0;
|
||
150 | } |
||
151 | |||
152 | uint16_t msg_pos = 0;
|
||
153 | uint16_t msg_count = 0;
|
||
154 | while (true) |
||
155 | { |
||
156 | length_buf[msg_count] = this->receiveMessage(&message_buf[msg_pos], msg_buf_size-msg_pos);
|
||
157 | |||
158 | // if (msg_count >= 0) {
|
||
159 | // msgPrint(&message_buf[msg_pos], length_buf[msg_count]);
|
||
160 | // }
|
||
161 | |||
162 | if (length_buf[msg_count] == 0) { |
||
163 | f8cf404d | Thomas Schöpping | chprintf((BaseSequentialStream*) &global.sercanmux1, "%s(%d): WARNING: receiving aborted after %d messages (%d bytes)\n", __FILE__ , __LINE__, msg_count, msg_pos);
|
164 | 58fe0e0b | Thomas Schöpping | return msg_count;
|
165 | } |
||
166 | |||
167 | if (strncmp(&message_buf[msg_pos], last_msg, strlen(last_msg)) == 0) { |
||
168 | return msg_count+1; |
||
169 | } |
||
170 | |||
171 | if (strncmp(&message_buf[msg_pos], filter_in, strlen(filter_in)) == 0) |
||
172 | { |
||
173 | if (filter_out == NULL || strncmp(&message_buf[msg_pos], filter_out, strlen(filter_out)) != 0) |
||
174 | { |
||
175 | msg_pos += length_buf[msg_count]; |
||
176 | ++msg_count; |
||
177 | } |
||
178 | } |
||
179 | |||
180 | if (msg_count > len_buf_size) {
|
||
181 | f8cf404d | Thomas Schöpping | chprintf((BaseSequentialStream*) &global.sercanmux1, "%s(%d): ERROR: maximum messages received (%d)!\n", __FILE__ , __LINE__, len_buf_size);
|
182 | 58fe0e0b | Thomas Schöpping | return len_buf_size;
|
183 | } |
||
184 | |||
185 | } |
||
186 | |||
187 | return 0xFFFFu; // unreachable |
||
188 | } |
||
189 | |||
190 | void
|
||
191 | WT12CheckUtility::receiveRaw(uint8_t* buffer, uint16_t num_bytes, const bool print) |
||
192 | { |
||
193 | uint16_t i; |
||
194 | |||
195 | for (i = 0; i < num_bytes; ++i) |
||
196 | { |
||
197 | buffer[i] = chSequentialStreamGet((BaseSequentialStream*)&SD3); |
||
198 | } |
||
199 | |||
200 | if (print)
|
||
201 | { |
||
202 | for (i = 0; i < num_bytes; ++i) |
||
203 | { |
||
204 | f8cf404d | Thomas Schöpping | chprintf((BaseSequentialStream*) &global.sercanmux1, "%02X ", buffer[i]);
|
205 | 58fe0e0b | Thomas Schöpping | } |
206 | f8cf404d | Thomas Schöpping | chprintf((BaseSequentialStream*) &global.sercanmux1, "\n");
|
207 | 58fe0e0b | Thomas Schöpping | } |
208 | |||
209 | return;
|
||
210 | } |
||
211 | |||
212 | void
|
||
213 | WT12CheckUtility::receiveRawLine(const bool print) |
||
214 | { |
||
215 | uint8_t byte = 0;;
|
||
216 | while (byte != '\n') |
||
217 | { |
||
218 | byte = chSequentialStreamGet((BaseSequentialStream*) &SD3); |
||
219 | if (print) {
|
||
220 | f8cf404d | Thomas Schöpping | chprintf((BaseSequentialStream*) &global.sercanmux1, "%c", byte);
|
221 | 58fe0e0b | Thomas Schöpping | } |
222 | } |
||
223 | |||
224 | return;
|
||
225 | } |
||
226 | |||
227 | void
|
||
228 | WT12CheckUtility::clearMessageBuffer(const bool print) |
||
229 | { |
||
230 | uint8_t byte; |
||
231 | while (!sdGetWouldBlock(&SD3))
|
||
232 | { |
||
233 | byte = sdGet(&SD3); |
||
234 | //byte = chSequentialStreamGet((BaseSequentialStream*) &SD3);
|
||
235 | if (print) {
|
||
236 | f8cf404d | Thomas Schöpping | chprintf((BaseSequentialStream*) &global.sercanmux1, "0x%02X <%c>\n", byte, byte);
|
237 | 58fe0e0b | Thomas Schöpping | } |
238 | BaseThread::sleep(MS2ST(1));
|
||
239 | } |
||
240 | |||
241 | return;
|
||
242 | } |