diff options
-rw-r--r-- | src/ClockTAI.cpp | 8 | ||||
-rw-r--r-- | src/DabMultiplexer.cpp | 44 | ||||
-rw-r--r-- | src/DabMultiplexer.h | 1 | ||||
-rw-r--r-- | src/dabOutput/edi/TagItems.h | 2 |
4 files changed, 34 insertions, 21 deletions
diff --git a/src/ClockTAI.cpp b/src/ClockTAI.cpp index 1b2d4ef..992390b 100644 --- a/src/ClockTAI.cpp +++ b/src/ClockTAI.cpp @@ -30,6 +30,7 @@ #endif #include "ClockTAI.h" +#include "Log.h" #include <stdio.h> #include <errno.h> @@ -71,11 +72,14 @@ int ClockTAI::get_offset() else if (download_tai_utc_bulletin(tai_data_url2) == 0) { m_offset = parse_tai_offset(); } + else { + throw std::runtime_error("Could not fetch TAI-UTC offset"); + } + + etiLog.level(info) << "Updated TAI-UTC offset to " << m_offset << "s."; } return m_offset; - - throw std::runtime_error("Could not fetch TAI-UTC offset"); } #if SUPPORT_SETTING_CLOCK_TAI diff --git a/src/DabMultiplexer.cpp b/src/DabMultiplexer.cpp index d9e1a10..28f799d 100644 --- a/src/DabMultiplexer.cpp +++ b/src/DabMultiplexer.cpp @@ -239,6 +239,10 @@ void DabMultiplexer::prepare() */ gettimeofday(&mnsc_time, NULL); + if (clock_gettime(CLOCK_REALTIME, &edi_time)) { + throw std::runtime_error("Setting eti_time with clock_gettime failed"); + } + #if HAVE_OUTPUT_EDI // Try to load offset once @@ -471,22 +475,6 @@ void DabMultiplexer::mux_frame(std::vector<std::shared_ptr<DabOutput> >& outputs // The above Tag Items will be assembled into a TAG Packet TagPacket edi_tagpacket(edi_conf.tagpacket_alignment); - edi_tagDETI.atstf = 1; - edi_tagDETI.utco = 0; - edi_tagDETI.seconds = 0; - try { - bool tist_enabled = m_pt.get("general.tist", false); - - if (tist_enabled and edi_conf.enabled) { - edi_tagDETI.set_utco(m_clock_tai.get_offset()); - } - - edi_tagDETI.set_seconds(mnsc_time); - } - catch (std::runtime_error& e) { - etiLog.level(error) << "Could not get UTC-TAI offset for EDI timestamp"; - } - date = getDabTime(); // Initialise the ETI frame @@ -1784,12 +1772,29 @@ void DabMultiplexer::mux_frame(std::vector<std::shared_ptr<DabOutput> >& outputs bool enableTist = m_pt.get("general.tist", false); if (enableTist) { tist->TIST = htonl(timestamp) | 0xff; + edi_tagDETI.tsta = timestamp & 0xffffff; } else { tist->TIST = htonl(0xffffff) | 0xff; + edi_tagDETI.tsta = 0xffffff; + } + + edi_tagDETI.atstf = 1; + edi_tagDETI.utco = 0; + edi_tagDETI.seconds = 0; + try { + bool tist_enabled = m_pt.get("general.tist", false); + + if (tist_enabled and edi_conf.enabled) { + edi_tagDETI.set_utco(m_clock_tai.get_offset()); + edi_tagDETI.set_seconds(edi_time); + } + + } + catch (std::runtime_error& e) { + etiLog.level(error) << "Could not get UTC-TAI offset for EDI timestamp"; } - edi_tagDETI.tsta = tist->TIST; /* Coding of the TIST, according to ETS 300 799 Annex C @@ -1808,8 +1813,11 @@ void DabMultiplexer::mux_frame(std::vector<std::shared_ptr<DabOutput> >& outputs { timestamp -= 0xfa0000; // Substract 16384000, corresponding to one second - // Also update MNSC time for next frame + // Also update MNSC time for next time FP==0 MNSC_increment_time = true; + + // Immediately update edi time + edi_time.tv_sec++; } diff --git a/src/DabMultiplexer.h b/src/DabMultiplexer.h index 7b3834e..e8b2a00 100644 --- a/src/DabMultiplexer.h +++ b/src/DabMultiplexer.h @@ -102,6 +102,7 @@ class DabMultiplexer : public RemoteControllable { unsigned timestamp; bool MNSC_increment_time; struct timeval mnsc_time; + struct timespec edi_time; edi_configuration_t edi_conf; diff --git a/src/dabOutput/edi/TagItems.h b/src/dabOutput/edi/TagItems.h index dee857a..50d5e99 100644 --- a/src/dabOutput/edi/TagItems.h +++ b/src/dabOutput/edi/TagItems.h @@ -98,7 +98,7 @@ class TagDETI : public TagItem */ uint32_t seconds; - void set_seconds(struct timeval tv) + void set_seconds(struct timespec tv) { time_t posix_timestamp_1_jan_2000 = 946684800; seconds = tv.tv_sec - posix_timestamp_1_jan_2000; |