Statistics
| Branch: | Tag: | Revision:

amiro-os / components / bluetooth / checkutility.cpp @ ba75ee1d

History | View | Annotate | Download (6.19 KB)

1
#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
    chSequentialStreamWrite((BaseSequentialStream*)&global.sercanmux1, (uint8_t*)message, length);
52
//    chprintf((BaseSequentialStream*) &global.sercanmux1, "[%d]\n", length);
53
  }
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
    chprintf((BaseSequentialStream*) &global.sercanmux1, "%s(%d): ERROR: message too long!\n", __FILE__ , __LINE__);
76
    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
    chprintf((BaseSequentialStream*) &global.sercanmux1, "%s(%d): ERROR: message too long (%d of max %d bytes)!\n", __FILE__ , __LINE__, msg.head.length, max_length);
120

    
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
    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
  }
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
      chprintf((BaseSequentialStream*) &global.sercanmux1, "%s(%d): WARNING: receiving aborted after %d messages (%d bytes)\n", __FILE__ , __LINE__, msg_count, msg_pos);
164
      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
      chprintf((BaseSequentialStream*) &global.sercanmux1, "%s(%d): ERROR: maximum messages received (%d)!\n", __FILE__ , __LINE__, len_buf_size);
182
      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
      chprintf((BaseSequentialStream*) &global.sercanmux1, "%02X ", buffer[i]);
205
    }
206
    chprintf((BaseSequentialStream*) &global.sercanmux1, "\n");
207
  }
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
      chprintf((BaseSequentialStream*) &global.sercanmux1, "%c", byte);
221
    }
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
      chprintf((BaseSequentialStream*) &global.sercanmux1, "0x%02X <%c>\n", byte, byte);
237
    }
238
    BaseThread::sleep(MS2ST(1));
239
  }
240

    
241
  return;
242
}
243