mirror of https://github.com/arendst/Tasmota.git
37 lines
916 B
C++
37 lines
916 B
C++
|
#include "GbtParser.h"
|
||
|
#include "lwip/def.h"
|
||
|
|
||
|
GBTParser::~GBTParser(void) {
|
||
|
if (buf) free(buf);
|
||
|
}
|
||
|
|
||
|
int8_t GBTParser::parse(uint8_t *d, DataParserContext &ctx) {
|
||
|
GBTHeader* h = (GBTHeader*) (d);
|
||
|
uint16_t sequence = ntohs(h->sequence);
|
||
|
|
||
|
if(h->flag != GBT_TAG) return DATA_PARSE_BOUNDRY_FLAG_MISSING;
|
||
|
|
||
|
if(sequence == 1) {
|
||
|
if(buf == NULL) buf = (uint8_t *)malloc((size_t)1024); // TODO find out from first package ?
|
||
|
pos = 0;
|
||
|
} else if(lastSequenceNumber != sequence-1) {
|
||
|
return DATA_PARSE_FAIL;
|
||
|
}
|
||
|
|
||
|
if(buf == NULL) return DATA_PARSE_FAIL;
|
||
|
|
||
|
uint8_t* ptr = (uint8_t*) &h[1];
|
||
|
memcpy(buf + pos, ptr, h->size);
|
||
|
pos += h->size;
|
||
|
lastSequenceNumber = sequence;
|
||
|
|
||
|
if((h->control & 0x80) == 0x00) {
|
||
|
return DATA_PARSE_INTERMEDIATE_SEGMENT;
|
||
|
} else {
|
||
|
memcpy((uint8_t *) d, buf, pos);
|
||
|
}
|
||
|
ctx.length = pos;
|
||
|
return DATA_PARSE_OK;
|
||
|
|
||
|
}
|