mirror of
https://github.com/UtilitechAS/amsreader-firmware.git
synced 2026-05-03 22:59:28 +00:00
Fixed Kamstrup bug
This commit is contained in:
@@ -517,6 +517,7 @@ void setupHanPort(uint8_t pin, uint32_t baud, uint8_t parityOrdinal, bool invert
|
|||||||
#else
|
#else
|
||||||
hwSerial->begin(baud, serialConfig, SERIAL_FULL, 1, invert);
|
hwSerial->begin(baud, serialConfig, SERIAL_FULL, 1, invert);
|
||||||
#endif
|
#endif
|
||||||
|
hwSerial->setRxBufferSize(256);
|
||||||
hanSerial = hwSerial;
|
hanSerial = hwSerial;
|
||||||
} else {
|
} else {
|
||||||
debugD("Software serial");
|
debugD("Software serial");
|
||||||
@@ -539,7 +540,7 @@ void setupHanPort(uint8_t pin, uint32_t baud, uint8_t parityOrdinal, bool invert
|
|||||||
}
|
}
|
||||||
|
|
||||||
SoftwareSerial *swSerial = new SoftwareSerial(pin, -1, invert);
|
SoftwareSerial *swSerial = new SoftwareSerial(pin, -1, invert);
|
||||||
swSerial->begin(baud, serialConfig);
|
swSerial->begin(baud, serialConfig, pin, -1, invert, 256);
|
||||||
hanSerial = swSerial;
|
hanSerial = swSerial;
|
||||||
|
|
||||||
Serial.begin(115200);
|
Serial.begin(115200);
|
||||||
@@ -627,13 +628,14 @@ void mqttMessageReceived(String &topic, String &payload)
|
|||||||
// Ideas could be to query for values or to initiate OTA firmware update
|
// Ideas could be to query for values or to initiate OTA firmware update
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint8_t buf[BUF_SIZE];
|
||||||
HDLCConfig* hc = NULL;
|
HDLCConfig* hc = NULL;
|
||||||
int currentMeterType = -1;
|
int currentMeterType = -1;
|
||||||
void readHanPort() {
|
void readHanPort() {
|
||||||
if(!hanSerial->available()) return;
|
if(!hanSerial->available()) return;
|
||||||
|
|
||||||
if(currentMeterType == -1) {
|
if(currentMeterType == -1) {
|
||||||
while(hanSerial->available()) hanSerial->read();
|
hanSerial->readBytes(buf, BUF_SIZE);
|
||||||
currentMeterType = 0;
|
currentMeterType = 0;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -641,12 +643,11 @@ void readHanPort() {
|
|||||||
uint8_t flag = hanSerial->read();
|
uint8_t flag = hanSerial->read();
|
||||||
if(flag == 0x7E) currentMeterType = 1;
|
if(flag == 0x7E) currentMeterType = 1;
|
||||||
else currentMeterType = 2;
|
else currentMeterType = 2;
|
||||||
while(hanSerial->available()) hanSerial->read();
|
hanSerial->readBytes(buf, BUF_SIZE);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
AmsData data;
|
AmsData data;
|
||||||
if(currentMeterType == 1) {
|
if(currentMeterType == 1) {
|
||||||
uint8_t buf[BUF_SIZE];
|
|
||||||
size_t len = hanSerial->readBytes(buf, BUF_SIZE); // TODO: read one byte at the time. This blocks up the GUI
|
size_t len = hanSerial->readBytes(buf, BUF_SIZE); // TODO: read one byte at the time. This blocks up the GUI
|
||||||
if(len > 0) {
|
if(len > 0) {
|
||||||
int pos = HDLC_validate((uint8_t *) buf, len, hc);
|
int pos = HDLC_validate((uint8_t *) buf, len, hc);
|
||||||
|
|||||||
@@ -8,8 +8,6 @@
|
|||||||
#include "mbedtls/gcm.h"
|
#include "mbedtls/gcm.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
int wtf = 48;
|
|
||||||
|
|
||||||
void mbus_hexdump(const uint8_t* buf, int len) {
|
void mbus_hexdump(const uint8_t* buf, int len) {
|
||||||
printf("\nDUMP (%db) [ ", len);
|
printf("\nDUMP (%db) [ ", len);
|
||||||
for(const uint8_t* p = buf; p-buf < len; ++p)
|
for(const uint8_t* p = buf; p-buf < len; ++p)
|
||||||
@@ -76,11 +74,14 @@ int HDLC_validate(const uint8_t* d, int len, HDLCConfig* config) {
|
|||||||
ptr += sizeof *adpu;
|
ptr += sizeof *adpu;
|
||||||
|
|
||||||
// ADPU timestamp
|
// ADPU timestamp
|
||||||
|
// TODO : extract and return
|
||||||
CosemData* dateTime = (CosemData*) ptr;
|
CosemData* dateTime = (CosemData*) ptr;
|
||||||
if(dateTime->base.type == CosemTypeOctetString)
|
if(dateTime->base.type == CosemTypeOctetString) {
|
||||||
ptr += 2 + dateTime->base.length;
|
ptr += 2 + dateTime->base.length;
|
||||||
else if(dateTime->base.type == CosemTypeNull) {
|
} else if(dateTime->base.type == CosemTypeNull) {
|
||||||
ptr++;
|
ptr++;
|
||||||
|
} else if(dateTime->base.type == 0x0C) { // Kamstrup bug...
|
||||||
|
ptr += 13;
|
||||||
} else {
|
} else {
|
||||||
return -99;
|
return -99;
|
||||||
}
|
}
|
||||||
@@ -133,6 +134,6 @@ int HDLC_validate(const uint8_t* d, int len, HDLCConfig* config) {
|
|||||||
return ptr-d;
|
return ptr-d;
|
||||||
}
|
}
|
||||||
|
|
||||||
// No payload
|
// Unknown payload
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user