diff options
author | Matthias P. Braendli <matthias.braendli@mpb.li> | 2019-07-29 15:27:32 +0200 |
---|---|---|
committer | Matthias P. Braendli <matthias.braendli@mpb.li> | 2019-07-29 15:27:32 +0200 |
commit | 14f69f9c915cf644147a52b803d79ff8f40a4ea1 (patch) | |
tree | b89eabcdb3c2fb2ae3f911b08867f46061e6cf37 /lib/edi | |
parent | 6ff1dd95a6552c0f7e868dda1dffeb9ae572b8b7 (diff) | |
download | dabmux-14f69f9c915cf644147a52b803d79ff8f40a4ea1.tar.gz dabmux-14f69f9c915cf644147a52b803d79ff8f40a4ea1.tar.bz2 dabmux-14f69f9c915cf644147a52b803d79ff8f40a4ea1.zip |
First prototype taking EDI TIST into account for contribution
Diffstat (limited to 'lib/edi')
-rw-r--r-- | lib/edi/STIWriter.cpp | 1 | ||||
-rw-r--r-- | lib/edi/common.cpp | 25 | ||||
-rw-r--r-- | lib/edi/common.hpp | 4 |
3 files changed, 29 insertions, 1 deletions
diff --git a/lib/edi/STIWriter.cpp b/lib/edi/STIWriter.cpp index 6964eb1..399922a 100644 --- a/lib/edi/STIWriter.cpp +++ b/lib/edi/STIWriter.cpp @@ -120,6 +120,7 @@ void STIWriter::assemble() m_stiFrame.frame = m_payload.istd; m_stiFrame.timestamp.seconds = m_seconds; m_stiFrame.timestamp.utco = m_utco; + m_stiFrame.timestamp.tsta = m_management_data.tsta; } sti_frame_t STIWriter::getFrame() diff --git a/lib/edi/common.cpp b/lib/edi/common.cpp index bc0fa1b..b4b0c79 100644 --- a/lib/edi/common.cpp +++ b/lib/edi/common.cpp @@ -25,18 +25,31 @@ #include <iomanip> #include <sstream> #include <cassert> +#include <cmath> #include <cstdio> namespace EdiDecoder { using namespace std; +bool frame_timestamp_t::valid() const +{ + return tsta != 0xFFFFFF; +} + string frame_timestamp_t::to_string() const { const time_t seconds_in_unix_epoch = to_unix_epoch(); stringstream ss; - ss << "Timestamp: " << std::put_time(std::gmtime(&seconds_in_unix_epoch), "%c %Z"); + if (valid()) { + ss << "Timestamp: "; + } + else { + ss << "Timestamp not valid: "; + } + ss << std::put_time(std::gmtime(&seconds_in_unix_epoch), "%c %Z") << + " + " << ((double)tsta / 16384000.0); return ss.str(); } @@ -48,6 +61,16 @@ time_t frame_timestamp_t::to_unix_epoch() const return 946684800 + seconds - utco; } +std::chrono::system_clock::time_point frame_timestamp_t::to_system_clock() const +{ + auto ts = chrono::system_clock::from_time_t(to_unix_epoch()); + + // PPS offset in seconds = tsta / 16384000 + ts += chrono::nanoseconds(std::lrint(tsta / 0.016384)); + + return ts; +} + TagDispatcher::TagDispatcher( std::function<void()>&& af_packet_completed, bool verbose) : diff --git a/lib/edi/common.hpp b/lib/edi/common.hpp index 1433004..887bc3d 100644 --- a/lib/edi/common.hpp +++ b/lib/edi/common.hpp @@ -23,6 +23,7 @@ #include "PFT.hpp" #include <functional> #include <map> +#include <chrono> #include <string> #include <vector> #include <cstddef> @@ -33,9 +34,12 @@ namespace EdiDecoder { struct frame_timestamp_t { uint32_t seconds = 0; uint32_t utco = 0; + uint32_t tsta = 0; // According to EN 300 797 Annex B + bool valid() const; std::string to_string() const; time_t to_unix_epoch() const; + std::chrono::system_clock::time_point to_system_clock() const; }; struct decode_state_t { |