Added remote debugging

This commit is contained in:
Gunnar Skjold
2020-03-24 20:17:44 +01:00
parent d747c84a14
commit 73d00f786a
11 changed files with 346 additions and 243 deletions

View File

@@ -4,11 +4,11 @@ HanReader::HanReader()
{
}
void HanReader::setup(Stream *hanPort, Stream *debugPort)
void HanReader::setup(Stream *hanPort, RemoteDebug *debug)
{
han = hanPort;
bytesRead = 0;
debug = debugPort;
debugger = debug;
// Central European Time (Frankfurt, Paris)
TimeChangeRule CEST = {"CEST", Last, Sun, Mar, 2, 120}; // Central European Summer Time
@@ -23,26 +23,22 @@ void HanReader::setup(Stream *hanPort)
setup(hanPort, NULL);
}
bool HanReader::read(byte data)
{
if (reader.Read(data))
{
bool HanReader::read(byte data) {
if (reader.Read(data)) {
bytesRead = reader.GetRawData(buffer, 0, 512);
if (debug)
{
debug->print("Got valid DLMS data (");
debug->print(bytesRead);
debug->println(" bytes):");
debugPrint(buffer, 0, bytesRead);
if (debugger->isActive(RemoteDebug::INFO)) {
printI("Got valid DLMS data (%d bytes)", bytesRead);
if (debugger->isActive(RemoteDebug::DEBUG)) {
debugPrint(buffer, 0, bytesRead);
}
}
/*
Data should start with E6 E7 00 0F
and continue with four bytes for the InvokeId
*/
if (bytesRead < 9)
{
if (debug) debug->println("Invalid HAN data: Less than 9 bytes received");
if (bytesRead < 9) {
printW("Invalid HAN data: Less than 9 bytes received");
return false;
}
else if (
@@ -52,39 +48,35 @@ bool HanReader::read(byte data)
buffer[3] != 0x0F
)
{
if (debug) debug->println("Invalid HAN data: Start should be E6 E7 00 0F");
printW("Invalid HAN data: Start should be E6 E7 00 0F");
return false;
}
listSize = getInt(0, buffer, 0, bytesRead);
if (debug) debug->print("HAN data is valid, listSize: ");
if (debug) debug->println(listSize);
printI("HAN data is valid, listSize: %d", listSize);
return true;
}
return false;
}
void HanReader::debugPrint(byte *buffer, int start, int length)
{
for (int i = start; i < start + length; i++)
{
void HanReader::debugPrint(byte *buffer, int start, int length) {
for (int i = start; i < start + length; i++) {
if (buffer[i] < 0x10)
debug->print("0");
debug->print(buffer[i], HEX);
debug->print(" ");
debugger->print("0");
debugger->print(buffer[i], HEX);
debugger->print(" ");
if ((i - start + 1) % 16 == 0)
debug->println("");
debugger->println("");
else if ((i - start + 1) % 4 == 0)
debug->print(" ");
debugger->print(" ");
yield(); // Let other get some resources too
}
debug->println("");
debugger->println("");
}
bool HanReader::read()
{
bool HanReader::read() {
while(han->available()) {
if(read(han->read())) {
return true;
@@ -93,44 +85,37 @@ bool HanReader::read()
return false;
}
int HanReader::getListSize()
{
int HanReader::getListSize() {
return listSize;
}
time_t HanReader::getPackageTime()
{
time_t HanReader::getPackageTime() {
int packageTimePosition = dataHeader
+ (compensateFor09HeaderBug ? 1 : 0);
return getTime(buffer, packageTimePosition, bytesRead);
}
time_t HanReader::getTime(int objectId)
{
time_t HanReader::getTime(int objectId) {
return getTime(objectId, buffer, 0, bytesRead);
}
int HanReader::getInt(int objectId)
{
int HanReader::getInt(int objectId) {
return getInt(objectId, buffer, 0, bytesRead);
}
String HanReader::getString(int objectId)
{
String HanReader::getString(int objectId) {
return getString(objectId, buffer, 0, bytesRead);
}
int HanReader::findValuePosition(int dataPosition, byte *buffer, int start, int length)
{
int HanReader::findValuePosition(int dataPosition, byte *buffer, int start, int length) {
// The first byte after the header gives the length
// of the extended header information (variable)
int headerSize = dataHeader + (compensateFor09HeaderBug ? 1 : 0);
int firstData = headerSize + buffer[headerSize] + 1;
for (int i = start + firstData; i<length; i++)
{
for (int i = start + firstData; i<length; i++) {
if (dataPosition-- == 0)
return i;
else if (buffer[i] == 0x00) // null
@@ -153,37 +138,26 @@ int HanReader::findValuePosition(int dataPosition, byte *buffer, int start, int
i += 1;
else if (buffer[i] == 0x16) // enum (1 bytes)
i += 1;
else
{
if (debug)
{
debug->print("Unknown data type found: 0x");
debug->println(buffer[i], HEX);
}
else {
printW("Unknown data type found: 0x%s", String(buffer[i], HEX).c_str());
return 0; // unknown data type found
}
}
if (debug)
{
debug->print("Passed the end of the data. Length was: ");
debug->println(length);
}
printD("Passed the end of the data. Length was: %d", length);
return 0;
}
time_t HanReader::getTime(int dataPosition, byte *buffer, int start, int length)
{
time_t HanReader::getTime(int dataPosition, byte *buffer, int start, int length) {
// TODO: check if the time is represented always as a 12 byte string (0x09 0x0C)
int timeStart = findValuePosition(dataPosition, buffer, start, length);
timeStart += 1;
return getTime(buffer, start + timeStart, length - timeStart);
}
time_t HanReader::getTime(byte *buffer, int start, int length)
{
time_t HanReader::getTime(byte *buffer, int start, int length) {
int pos = start;
int dataLength = buffer[pos++];
@@ -208,25 +182,19 @@ time_t HanReader::getTime(byte *buffer, int start, int length)
} else if(dataLength == 0) {
return (time_t)0L;
} else {
if(debug) {
debug->print("Unknown time length: ");
debug->println(dataLength);
}
printW("Unknown time length: %d", dataLength);
// Date format not supported
return (time_t)0L;
}
}
int HanReader::getInt(int dataPosition, byte *buffer, int start, int length)
{
int HanReader::getInt(int dataPosition, byte *buffer, int start, int length) {
int valuePosition = findValuePosition(dataPosition, buffer, start, length);
if (valuePosition > 0)
{
if (valuePosition > 0) {
int value = 0;
int bytes = 0;
switch (buffer[valuePosition++])
{
switch (buffer[valuePosition++]) {
case 0x10:
bytes = 2;
break;
@@ -250,8 +218,7 @@ int HanReader::getInt(int dataPosition, byte *buffer, int start, int length)
break;
}
for (int i = valuePosition; i < valuePosition + bytes; i++)
{
for (int i = valuePosition; i < valuePosition + bytes; i++) {
value = value << 8 | buffer[i];
}
@@ -260,17 +227,42 @@ int HanReader::getInt(int dataPosition, byte *buffer, int start, int length)
return 0;
}
String HanReader::getString(int dataPosition, byte *buffer, int start, int length)
{
String HanReader::getString(int dataPosition, byte *buffer, int start, int length) {
int valuePosition = findValuePosition(dataPosition, buffer, start, length);
if (valuePosition > 0)
{
if (valuePosition > 0) {
String value = String("");
for (int i = valuePosition + 2; i < valuePosition + buffer[valuePosition + 1] + 2; i++)
{
for (int i = valuePosition + 2; i < valuePosition + buffer[valuePosition + 1] + 2; i++) {
value += String((char)buffer[i]);
}
return value;
}
return String("");
}
void HanReader::printD(String fmt, ...) {
va_list args;
va_start(args, fmt);
if(debugger->isActive(RemoteDebug::DEBUG)) debugger->printf(String("(HanReader)" + fmt + "\n").c_str(), args);
va_end(args);
}
void HanReader::printI(String fmt, ...) {
va_list args;
va_start(args, fmt);
if(debugger->isActive(RemoteDebug::INFO)) debugger->printf(String("(HanReader)" + fmt + "\n").c_str(), args);
va_end(args);
}
void HanReader::printW(String fmt, ...) {
va_list args;
va_start(args, fmt);
if(debugger->isActive(RemoteDebug::WARNING)) debugger->printf(String("(HanReader)" + fmt + "\n").c_str(), args);
va_end(args);
}
void HanReader::printE(String fmt, ...) {
va_list args;
va_start(args, fmt);
if(debugger->isActive(RemoteDebug::ERROR)) debugger->printf(String("(HanReader)" + fmt + "\n").c_str(), args);
va_end(args);
}

View File

@@ -10,6 +10,7 @@
#include "DlmsReader.h"
#include <Timezone.h>
#include "RemoteDebug.h"
class HanReader
{
@@ -19,7 +20,7 @@ public:
HanReader();
void setup(Stream *hanPort);
void setup(Stream *hanPort, Stream *debugPort);
void setup(Stream *hanPort, RemoteDebug *debug);
bool read();
bool read(byte data);
int getListSize();
@@ -29,7 +30,7 @@ public:
time_t getTime(int objectId);
private:
Stream *debug;
RemoteDebug* debugger;
Stream *han;
byte buffer[512];
int bytesRead;
@@ -47,6 +48,11 @@ private:
time_t toUnixTime(int year, int month, int day, int hour, int minute, int second);
void debugPrint(byte *buffer, int start, int length);
void printD(String fmt, ...);
void printI(String fmt, ...);
void printW(String fmt, ...);
void printE(String fmt, ...);
};