summaryrefslogtreecommitdiffstats
path: root/src/TimestampDecoder.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/TimestampDecoder.h')
-rw-r--r--src/TimestampDecoder.h154
1 files changed, 154 insertions, 0 deletions
diff --git a/src/TimestampDecoder.h b/src/TimestampDecoder.h
new file mode 100644
index 0000000..3a1fb1b
--- /dev/null
+++ b/src/TimestampDecoder.h
@@ -0,0 +1,154 @@
+/*
+ Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Her Majesty the
+ Queen in Right of Canada (Communications Research Center Canada)
+
+ Includes modifications for which no copyright is claimed
+ 2012, Matthias P. Braendli, matthias.braendli@mpb.li
+ */
+/*
+ This file is part of CRC-DADMOD.
+
+ CRC-DADMOD is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as
+ published by the Free Software Foundation, either version 3 of the
+ License, or (at your option) any later version.
+
+ CRC-DADMOD is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with CRC-DADMOD. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef TIMESTAMP_DECODER_H
+#define TIMESTAMP_DECODER_H
+
+#include "Eti.h"
+#include <time.h>
+#include <math.h>
+#include <stdio.h>
+
+struct modulator_offset_config
+{
+ bool use_offset_fixed;
+ double offset_fixed;
+
+ bool use_offset_file;
+ char* offset_filename;
+};
+
+struct frame_timestamp
+{
+ uint32_t timestamp_sec;
+ double timestamp_pps_offset;
+ bool timestamp_valid;
+ bool timestamp_refresh;
+
+ struct frame_timestamp operator=(const struct frame_timestamp &rhs)
+ {
+ if (this != &rhs) {
+ this->timestamp_sec = rhs.timestamp_sec;
+ this->timestamp_pps_offset = rhs.timestamp_pps_offset;
+ this->timestamp_valid = rhs.timestamp_valid;
+ this->timestamp_refresh = rhs.timestamp_refresh;
+ }
+
+ return *this;
+ }
+
+ struct frame_timestamp& operator+=(const double& diff)
+ {
+ double offset_pps, offset_secs;
+ offset_pps = modf(diff, &offset_secs);
+
+ this->timestamp_sec += lrintf(offset_secs);
+ this->timestamp_pps_offset += offset_pps;
+
+ while (this->timestamp_pps_offset > 1)
+ {
+ this->timestamp_pps_offset -= 1.0;
+ this->timestamp_sec += 1;
+ };
+ return *this;
+ }
+
+ const struct frame_timestamp operator+(const double diff)
+ {
+ struct frame_timestamp ts = *this;
+ ts += diff;
+ return ts;
+ }
+
+ void print(const char* t)
+ {
+ fprintf(stderr,
+ "%s <struct frame_timestamp(%s, %d, %.9f)>\n",
+ t, this->timestamp_valid ? "valid" : "invalid",
+ this->timestamp_sec, this->timestamp_pps_offset);
+ }
+};
+
+/* This module decodes MNSC time information */
+class TimestampDecoder
+{
+ public:
+ TimestampDecoder(struct modulator_offset_config& config):
+ modconfig(config)
+ {
+ inhibit_second_update = 0;
+ time_pps = 0.0;
+ time_secs = 0;
+ enableDecode = false;
+ full_timestamp_received_mnsc = false;
+ gmtime_r(0, &temp_time);
+ offset_changed = false;
+ };
+
+ /* Calculate the timestamp for the current frame. */
+ void calculateTimestamp(struct frame_timestamp& ts);
+
+ /* Update timestamp data from data in ETI */
+ void updateTimestampEti(int framephase, uint16_t mnsc, double pps);
+
+ /* Update the modulator timestamp offset according to the modconf
+ */
+ bool updateModulatorOffset();
+
+ protected:
+ /* Push a new MNSC field into the decoder */
+ void pushMNSCData(int framephase, uint16_t mnsc);
+
+ /* Each frame contains the TIST field with the PPS offset.
+ * For each frame, this function must be called to update
+ * the timestamp
+ */
+ void updateTimestampPPS(double pps);
+
+ /* Update the timestamp when a full set of MNSC data is
+ * known. This function can be called at most every four
+ * frames when the data is transferred using the MNSC.
+ */
+ void updateTimestampSeconds(uint32_t secs);
+
+ struct tm temp_time;
+ uint32_t time_secs;
+ double time_pps;
+ double timestamp_offset;
+ int inhibit_second_update;
+ bool offset_changed;
+
+ /* configuration for the offset management */
+ struct modulator_offset_config& modconfig;
+
+ /* When the type or identifier don't match, the decoder must
+ * be disabled
+ */
+ bool enableDecode;
+
+ /* Disable timstamps until full time has been received in mnsc */
+ bool full_timestamp_received_mnsc;
+};
+
+#endif