8#ifndef PHYPHOX_BLE_TRANSPORT_NINAB31_PROTOCOL_H
9#define PHYPHOX_BLE_TRANSPORT_NINAB31_PROTOCOL_H
23 if (c >=
'0' && c <=
'9')
return c -
'0';
24 if (c >=
'a' && c <=
'f')
return c -
'a' + 10;
25 if (c >=
'A' && c <=
'F')
return c -
'A' + 10;
30inline uint16_t
decodeHex(
const char* s, uint8_t* out, uint16_t cap) {
33 int hi =
hexVal(s[0]);
if (hi < 0)
break;
34 int lo =
hexVal(s[1]);
if (lo < 0)
break;
35 out[n++] = (uint8_t)((hi << 4) | lo);
41inline void encodeHex(
const uint8_t* data, uint16_t len,
char* out) {
42 static const char* h =
"0123456789ABCDEF";
43 for (uint16_t i = 0; i < len; ++i) { *out++ = h[data[i] >> 4]; *out++ = h[data[i] & 15]; }
48inline bool isEvent(
const char* line) {
return strncmp(line,
"+UU", 3) == 0; }
49inline bool startsWith(
const char* line,
const char* prefix) {
return strncmp(line, prefix, strlen(prefix)) == 0; }
53 const char* colon = strchr(line,
':');
54 if (!colon)
return -1;
55 return atoi(colon + 1);
60 if (!
startsWith(line,
"+UBTGCHA:"))
return false;
61 const char* p = line + 9;
62 valueHandle = atoi(p);
63 const char* comma = strchr(p,
',');
64 cccdHandle = comma ? atoi(comma + 1) : 0;
84 const char* p = line + 9; e.
conn = atoi(p);
85 const char* c1 = strchr(p,
',');
if (!c1)
return e;
89 const char* p = line + 9; e.
conn = atoi(p);
90 const char* c1 = strchr(p,
',');
if (!c1)
return e;
92 const char* c2 = strchr(c1 + 1,
',');
if (!c2)
return e;
106 if (c ==
'\r' || c ==
'\n') {
107 bool complete = len_ > 0 && !overflow_;
109 len_ = 0; overflow_ =
false;
112 if (len_ <
kLineMax - 1) buf_[len_++] = c;
else overflow_ =
true;
115 const char*
line()
const {
return buf_; }
119 bool overflow_ =
false;
128 if (count_ >= N) { dropped_++;
return false; }
129 strncpy(slots_[(head_ + count_) % N], line,
kLineMax - 1);
130 slots_[(head_ + count_) % N][
kLineMax - 1] = 0;
135 if (!count_)
return false;
136 strcpy(out, slots_[head_]);
137 head_ = (head_ + 1) % N; count_--;
140 uint8_t
size()
const {
return count_; }
144 uint8_t head_ = 0, count_ = 0;
145 uint32_t dropped_ = 0;
Fixed ring of event lines, filled while a command waits for its response and drained from poll().
Definition NinaB31Protocol.h:125
bool pop(char *out)
Definition NinaB31Protocol.h:134
bool push(const char *line)
Definition NinaB31Protocol.h:127
uint8_t size() const
Definition NinaB31Protocol.h:140
uint32_t dropped() const
Definition NinaB31Protocol.h:141
Assembles lines from the byte stream.
Definition NinaB31Protocol.h:102
const char * line() const
Definition NinaB31Protocol.h:115
bool feed(char c)
Feed one byte; returns true when line() holds a complete line.
Definition NinaB31Protocol.h:105
void encodeHex(const uint8_t *data, uint16_t len, char *out)
Definition NinaB31Protocol.h:41
bool parseCharacteristicResponse(const char *line, int &valueHandle, int &cccdHandle)
"+UBTGCHA:<value_handle>,<cccd_handle>"; cccd is 0 when the characteristic has none.
Definition NinaB31Protocol.h:59
static const uint16_t kLineMax
Longest line kept: a 20-byte write is ~62 characters, a six-component sensor write ~70.
Definition NinaB31Protocol.h:20
bool startsWith(const char *line, const char *prefix)
Definition NinaB31Protocol.h:49
EventKind
Definition NinaB31Protocol.h:68
@ EV_DISCONNECTED
Definition NinaB31Protocol.h:68
@ EV_READ
Definition NinaB31Protocol.h:68
@ EV_NONE
Definition NinaB31Protocol.h:68
@ EV_CONNECTED
Definition NinaB31Protocol.h:68
@ EV_WRITE
Definition NinaB31Protocol.h:68
@ EV_OTHER
Definition NinaB31Protocol.h:68
Event parseEvent(const char *line)
Classify and parse one unsolicited line.
Definition NinaB31Protocol.h:79
int firstNumber(const char *line)
The integer after ':' (a handle), or -1 if the line has none.
Definition NinaB31Protocol.h:52
uint16_t decodeHex(const char *s, uint8_t *out, uint16_t cap)
Decode hex digits up to the first non-hex character; returns the byte count.
Definition NinaB31Protocol.h:30
int hexVal(char c)
Definition NinaB31Protocol.h:22
bool isEvent(const char *line)
Unsolicited result codes all start with "+UU"; everything else belongs to the command in flight.
Definition NinaB31Protocol.h:48
Definition ChannelStore.h:11
Definition NinaB31Protocol.h:70
int handle
Definition NinaB31Protocol.h:73
uint16_t len
Definition NinaB31Protocol.h:75
uint8_t data[64]
Definition NinaB31Protocol.h:74
int conn
Definition NinaB31Protocol.h:72
EventKind kind
Definition NinaB31Protocol.h:71