mirror of https://github.com/arendst/Tasmota.git
30 lines
948 B
C++
30 lines
948 B
C++
#include "DsmrParser.h"
|
|
#include "crc.h"
|
|
#include "hexutils.h"
|
|
#include "lwip/def.h"
|
|
|
|
int8_t DSMRParser::parse(uint8_t *buf, DataParserContext &ctx, bool verified) {
|
|
uint16_t crcPos = 0;
|
|
bool reachedEnd = verified;
|
|
uint8_t lastByte = 0x00;
|
|
for(int pos = 0; pos < ctx.length; pos++) {
|
|
uint8_t b = *(buf+pos);
|
|
if(pos == 0 && b != '/') return DATA_PARSE_BOUNDRY_FLAG_MISSING;
|
|
if(pos > 0 && b == '!' && lastByte == '\n') crcPos = pos+1;
|
|
if(crcPos > 0 && b == '\n') reachedEnd = true;
|
|
lastByte = b;
|
|
}
|
|
if(!reachedEnd) return DATA_PARSE_INCOMPLETE;
|
|
buf[ctx.length+1] = '\0';
|
|
if(crcPos > 0) {
|
|
uint16_t crc_calc = AMS_crc16(buf, crcPos);
|
|
uint16_t crc = 0x0000;
|
|
AMS_fromHex((uint8_t*) &crc, String((char*) buf+crcPos), 2);
|
|
crc = ntohs(crc);
|
|
|
|
if(crc != crc_calc)
|
|
return DATA_PARSE_FOOTER_CHECKSUM_ERROR;
|
|
}
|
|
return DATA_PARSE_OK;
|
|
}
|