2015-01-13 11:56:03 +00:00
|
|
|
#include "proto.h"
|
2017-06-01 21:38:03 +00:00
|
|
|
#include "ringbuf_mqtt.h"
|
2017-07-21 14:35:45 +00:00
|
|
|
I8 ICACHE_FLASH_ATTR PROTO_Init(PROTO_PARSER * parser, PROTO_PARSE_CALLBACK * completeCallback, U8 * buf, U16 bufSize) {
|
|
|
|
parser->buf = buf;
|
|
|
|
parser->bufSize = bufSize;
|
|
|
|
parser->dataLen = 0;
|
|
|
|
parser->callback = completeCallback;
|
|
|
|
parser->isEsc = 0;
|
|
|
|
return 0;
|
2015-01-13 11:56:03 +00:00
|
|
|
}
|
|
|
|
|
2017-07-21 14:35:45 +00:00
|
|
|
I8 ICACHE_FLASH_ATTR PROTO_ParseByte(PROTO_PARSER * parser, U8 value) {
|
|
|
|
switch (value) {
|
2016-09-09 15:37:03 +00:00
|
|
|
case 0x7D:
|
2017-07-21 14:35:45 +00:00
|
|
|
parser->isEsc = 1;
|
|
|
|
break;
|
2016-09-09 15:37:03 +00:00
|
|
|
|
|
|
|
case 0x7E:
|
2017-07-21 14:35:45 +00:00
|
|
|
parser->dataLen = 0;
|
|
|
|
parser->isEsc = 0;
|
|
|
|
parser->isBegin = 1;
|
|
|
|
break;
|
2016-09-09 15:37:03 +00:00
|
|
|
|
|
|
|
case 0x7F:
|
2017-07-21 14:35:45 +00:00
|
|
|
if (parser->callback != NULL)
|
|
|
|
parser->callback();
|
|
|
|
parser->isBegin = 0;
|
|
|
|
return 0;
|
|
|
|
break;
|
2016-09-09 15:37:03 +00:00
|
|
|
|
|
|
|
default:
|
2017-07-21 14:35:45 +00:00
|
|
|
if (parser->isBegin == 0)
|
|
|
|
break;
|
2016-09-09 15:37:03 +00:00
|
|
|
|
2017-07-21 14:35:45 +00:00
|
|
|
if (parser->isEsc) {
|
|
|
|
value ^= 0x20;
|
|
|
|
parser->isEsc = 0;
|
|
|
|
}
|
2016-09-09 15:37:03 +00:00
|
|
|
|
2017-07-21 14:35:45 +00:00
|
|
|
if (parser->dataLen < parser->bufSize)
|
|
|
|
parser->buf[parser->dataLen++] = value;
|
2016-09-09 15:37:03 +00:00
|
|
|
|
2017-07-21 14:35:45 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
return -1;
|
2015-01-13 11:56:03 +00:00
|
|
|
}
|
|
|
|
|
2017-07-21 14:35:45 +00:00
|
|
|
I8 ICACHE_FLASH_ATTR PROTO_Parse(PROTO_PARSER * parser, U8 * buf, U16 len) {
|
|
|
|
while (len--)
|
|
|
|
PROTO_ParseByte(parser, *buf++);
|
2015-01-13 11:56:03 +00:00
|
|
|
|
2017-07-21 14:35:45 +00:00
|
|
|
return 0;
|
2015-01-13 11:56:03 +00:00
|
|
|
}
|
2017-07-21 14:35:45 +00:00
|
|
|
I16 ICACHE_FLASH_ATTR PROTO_ParseRb(RINGBUF * rb, U8 * bufOut, U16 * len, U16 maxBufLen) {
|
|
|
|
U8 c;
|
|
|
|
|
|
|
|
PROTO_PARSER proto;
|
|
|
|
PROTO_Init(&proto, NULL, bufOut, maxBufLen);
|
|
|
|
while (RINGBUF_Get(rb, &c) == 0) {
|
|
|
|
if (PROTO_ParseByte(&proto, c) == 0) {
|
|
|
|
*len = proto.dataLen;
|
|
|
|
return 0;
|
|
|
|
}
|
2016-09-09 15:37:03 +00:00
|
|
|
}
|
2017-07-21 14:35:45 +00:00
|
|
|
return -1;
|
2015-01-13 11:56:03 +00:00
|
|
|
}
|
2017-07-21 14:35:45 +00:00
|
|
|
I16 ICACHE_FLASH_ATTR PROTO_Add(U8 * buf, const U8 * packet, I16 bufSize) {
|
|
|
|
U16 i = 2;
|
|
|
|
U16 len = *(U16 *) packet;
|
|
|
|
|
|
|
|
if (bufSize < 1)
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
*buf++ = 0x7E;
|
|
|
|
bufSize--;
|
|
|
|
|
|
|
|
while (len--) {
|
|
|
|
switch (*packet) {
|
|
|
|
case 0x7D:
|
|
|
|
case 0x7E:
|
|
|
|
case 0x7F:
|
|
|
|
if (bufSize < 2)
|
|
|
|
return -1;
|
|
|
|
*buf++ = 0x7D;
|
|
|
|
*buf++ = *packet++ ^ 0x20;
|
|
|
|
i += 2;
|
|
|
|
bufSize -= 2;
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
if (bufSize < 1)
|
|
|
|
return -1;
|
|
|
|
*buf++ = *packet++;
|
|
|
|
i++;
|
|
|
|
bufSize--;
|
|
|
|
break;
|
|
|
|
}
|
2015-01-13 11:56:03 +00:00
|
|
|
}
|
|
|
|
|
2017-07-21 14:35:45 +00:00
|
|
|
if (bufSize < 1)
|
|
|
|
return -1;
|
|
|
|
*buf++ = 0x7F;
|
2015-01-13 11:56:03 +00:00
|
|
|
|
2017-07-21 14:35:45 +00:00
|
|
|
return i;
|
2015-01-13 11:56:03 +00:00
|
|
|
}
|
|
|
|
|
2017-07-21 14:35:45 +00:00
|
|
|
I16 ICACHE_FLASH_ATTR PROTO_AddRb(RINGBUF * rb, const U8 * packet, I16 len) {
|
|
|
|
U16 i = 2;
|
|
|
|
if (RINGBUF_Put(rb, 0x7E) == -1)
|
|
|
|
return -1;
|
|
|
|
while (len--) {
|
|
|
|
switch (*packet) {
|
|
|
|
case 0x7D:
|
|
|
|
case 0x7E:
|
|
|
|
case 0x7F:
|
|
|
|
if (RINGBUF_Put(rb, 0x7D) == -1)
|
|
|
|
return -1;
|
|
|
|
if (RINGBUF_Put(rb, *packet++ ^ 0x20) == -1)
|
|
|
|
return -1;
|
|
|
|
i += 2;
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
if (RINGBUF_Put(rb, *packet++) == -1)
|
|
|
|
return -1;
|
|
|
|
i++;
|
|
|
|
break;
|
|
|
|
}
|
2015-01-13 11:56:03 +00:00
|
|
|
}
|
2017-07-21 14:35:45 +00:00
|
|
|
if (RINGBUF_Put(rb, 0x7F) == -1)
|
|
|
|
return -1;
|
2015-01-14 02:14:13 +00:00
|
|
|
|
2017-07-21 14:35:45 +00:00
|
|
|
return i;
|
2015-01-13 11:56:03 +00:00
|
|
|
}
|