mirror of https://github.com/arendst/Tasmota.git
39 lines
1.2 KiB
C++
39 lines
1.2 KiB
C++
#include "DlmsParser.h"
|
|
#include "Cosem.h"
|
|
|
|
int8_t DLMSParser::parse(uint8_t *buf, DataParserContext &ctx) {
|
|
if(ctx.length < 6) return DATA_PARSE_INCOMPLETE;
|
|
|
|
uint8_t* ptr = buf+1;
|
|
ptr += 4; // Skip invoke ID and priority
|
|
|
|
CosemData* item = (CosemData*) ptr;
|
|
if(item->base.type == CosemTypeOctetString) {
|
|
if(item->base.length == 0x0C) {
|
|
CosemDateTime* dateTime = (CosemDateTime*) (ptr+1);
|
|
ctx.timestamp = decodeCosemDateTime(*dateTime);
|
|
}
|
|
uint8_t len = 5+14;
|
|
ctx.length -= len;
|
|
return len;
|
|
} else if(item->base.type == CosemTypeNull) {
|
|
ctx.timestamp = 0;
|
|
uint8_t len = 5+1;
|
|
ctx.length -= len;
|
|
return len;
|
|
} else if(item->base.type == CosemTypeDateTime) {
|
|
CosemDateTime* dateTime = (CosemDateTime*) (ptr);
|
|
ctx.timestamp = decodeCosemDateTime(*dateTime);
|
|
uint8_t len = 5+13;
|
|
ctx.length -= len;
|
|
return len;
|
|
} else if(item->base.type == 0x0C) { // Kamstrup bug...
|
|
CosemDateTime* dateTime = (CosemDateTime*) (ptr);
|
|
ctx.timestamp = decodeCosemDateTime(*dateTime);
|
|
uint8_t len = 5+13;
|
|
ctx.length -= len;
|
|
return len;
|
|
}
|
|
return DATA_PARSE_UNKNOWN_DATA;
|
|
}
|