From 6526499a78f1aad0df347bc2dcade0288c7f3016 Mon Sep 17 00:00:00 2001 From: r00t Date: Thu, 11 Mar 2021 04:16:13 +0100 Subject: [PATCH 1/4] [MeterD0] more meaningful names for time variables --- src/protocols/MeterD0.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/protocols/MeterD0.cpp b/src/protocols/MeterD0.cpp index 0cfd6d72..1c41263b 100644 --- a/src/protocols/MeterD0.cpp +++ b/src/protocols/MeterD0.cpp @@ -414,7 +414,7 @@ ssize_t MeterD0::read(std::vector &rds, size_t max_readings) { char endseq[2 + 1]; // Endsequence ! not ?! size_t number_of_tuples; int bytes_read; - time_t start_time, end_time; + time_t act_time, cur_time; struct termios tio; int baudrate_connect, baudrate_read; // Baudrates for switching @@ -440,7 +440,7 @@ ssize_t MeterD0::read(std::vector &rds, size_t max_readings) { wlen); } - time(&start_time); + time(&act_time); byte_iterator = number_of_tuples = baudrate = 0; byte = lastbyte = 0; @@ -471,8 +471,8 @@ ssize_t MeterD0::read(std::vector &rds, size_t max_readings) { while (1) { // check for timeout - time(&end_time); - if (difftime(end_time, start_time) > _read_timeout_s) { + time(&cur_time); + if (difftime(cur_time, act_time) > _read_timeout_s) { print(log_error, "nothing received for more than %d seconds", name().c_str(), _read_timeout_s); dump_file(CTRL, "timeout!"); @@ -493,7 +493,7 @@ ssize_t MeterD0::read(std::vector &rds, size_t max_readings) { // reset timeout if we are making progress if (context != START) { - time(&start_time); + time(&act_time); } lastbyte = byte; From 50c01c26903d573d9907ae78bc1faaee78cc5575 Mon Sep 17 00:00:00 2001 From: r00t Date: Fri, 26 Mar 2021 04:14:05 +0100 Subject: [PATCH 2/4] [Reading] support setting time by time_t --- include/Reading.hpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/include/Reading.hpp b/include/Reading.hpp index 3c72a3ad..d6eb487d 100644 --- a/include/Reading.hpp +++ b/include/Reading.hpp @@ -182,6 +182,10 @@ class Reading { return _time.tv_sec; }; // return only the seconds (always rounding down) void time() { gettimeofday(&_time, NULL); } + void time(time_t v) { + _time.tv_sec = v; + _time.tv_usec = 0; + } void time(struct timeval const &v) { _time = v; } void time(struct timespec const &v) { _time.tv_sec = v.tv_sec; From a3272619b2c84f94d180ae4612cb9a1e784f639b Mon Sep 17 00:00:00 2001 From: r00t Date: Thu, 11 Mar 2021 04:16:30 +0100 Subject: [PATCH 3/4] [MeterD0] use synced timestamps for all channels in message --- src/protocols/MeterD0.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/protocols/MeterD0.cpp b/src/protocols/MeterD0.cpp index 1c41263b..f3e3ecba 100644 --- a/src/protocols/MeterD0.cpp +++ b/src/protocols/MeterD0.cpp @@ -414,7 +414,7 @@ ssize_t MeterD0::read(std::vector &rds, size_t max_readings) { char endseq[2 + 1]; // Endsequence ! not ?! size_t number_of_tuples; int bytes_read; - time_t act_time, cur_time; + time_t start_time, act_time, cur_time; struct termios tio; int baudrate_connect, baudrate_read; // Baudrates for switching @@ -510,6 +510,7 @@ ssize_t MeterD0::read(std::vector &rds, size_t max_readings) { case START: // strip the initial "/" if (byte == '/') { // if ((byte != '\r') && (byte != '\n')) { // allow extra new line // at the start + time(&start_time); // remember time of start of transmission byte_iterator = number_of_tuples = 0; // start context = VENDOR; // set new context: START -> VENDOR } // else ignore the other chars. -> Wait for / (!? is checked above already) @@ -791,7 +792,7 @@ ssize_t MeterD0::read(std::vector &rds, size_t max_readings) { Obis obis(obis_code); ReadingIdentifier *rid(new ObisIdentifier(obis)); rds[number_of_tuples].identifier(rid); - rds[number_of_tuples].time(); + rds[number_of_tuples].time(start_time); number_of_tuples++; } catch (vz::VZException &e) { print(log_alert, "Failed to parse obis code (%s)", name().c_str(), From b5fd411057d1bee70e1e635b055a357e57333694 Mon Sep 17 00:00:00 2001 From: r00t Date: Thu, 11 Mar 2021 04:19:16 +0100 Subject: [PATCH 4/4] [MeterSML] use synced timestamps for all channels in message --- src/protocols/MeterSML.cpp | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/protocols/MeterSML.cpp b/src/protocols/MeterSML.cpp index 65b408c7..495d5b26 100644 --- a/src/protocols/MeterSML.cpp +++ b/src/protocols/MeterSML.cpp @@ -240,6 +240,7 @@ ssize_t MeterSML::read(std::vector &rds, size_t n) { unsigned char buffer[SML_BUFFER_LEN]; size_t bytes, m = 0; + struct timeval tv; sml_file *file; sml_get_list_response *body; @@ -261,6 +262,7 @@ ssize_t MeterSML::read(std::vector &rds, size_t n) { /* wait until we receive a new datagram from the meter (blocking read) */ bytes = sml_transport_read(_fd, buffer, SML_BUFFER_LEN); + gettimeofday(&tv, NULL); if (0 == bytes) { // try to reopen. see issue #362 @@ -289,8 +291,11 @@ ssize_t MeterSML::read(std::vector &rds, size_t n) { /* iterating through linked list */ for (; m < n && entry != NULL;) { - if (_parse(entry, &rds[m])) + if (_parse(entry, &rds[m])) { + if (_use_local_time || !rds[m].time_s()) + rds[m].time(tv); m++; + } entry = entry->next; } } @@ -324,15 +329,12 @@ bool MeterSML::_parse(sml_list *entry, Reading *rd) { ReadingIdentifier *rid(new ObisIdentifier(obis)); rd->identifier(rid); - // TODO handle SML_TIME_SEC_INDEX or time by SML File/Message - struct timeval tv; - if (!_use_local_time && entry->val_time) { /* use time from meter */ + // TODO handle SML_TIME_SEC_INDEX + if (entry->val_time) { /* use time from meter */ + struct timeval tv = {0, 0}; tv.tv_sec = *entry->val_time->data.timestamp; - tv.tv_usec = 0; - } else { - gettimeofday(&tv, NULL); /* use local time */ + rd->time(tv); } - rd->time(tv); return true; } return false;