aboutsummaryrefslogtreecommitdiffstats
path: root/src/TimestampDecoder.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/TimestampDecoder.cpp')
-rw-r--r--src/TimestampDecoder.cpp86
1 files changed, 31 insertions, 55 deletions
diff --git a/src/TimestampDecoder.cpp b/src/TimestampDecoder.cpp
index 26deb60..523551c 100644
--- a/src/TimestampDecoder.cpp
+++ b/src/TimestampDecoder.cpp
@@ -37,72 +37,45 @@
//#define MDEBUG(fmt, args...) fprintf (LOG, "*****" fmt , ## args)
#define MDEBUG(fmt, args...) PDEBUG(fmt, ## args)
+TimestampDecoder::TimestampDecoder(double& offset_s) :
+ RemoteControllable("tist"),
+ timestamp_offset(offset_s)
+{
+ // Properly initialise temp_time
+ memset(&temp_time, 0, sizeof(temp_time));
+ const time_t timep = 0;
+ gmtime_r(&timep, &temp_time);
+
+ RC_ADD_PARAMETER(offset, "TIST offset [s]");
+ RC_ADD_PARAMETER(timestamp, "FCT and timestamp [s]");
+
+ etiLog.level(info) << "Setting up timestamp decoder with " <<
+ timestamp_offset << " offset";
+}
-void TimestampDecoder::calculateTimestamp(frame_timestamp& ts)
+std::shared_ptr<frame_timestamp> TimestampDecoder::getTimestamp()
{
- std::shared_ptr<frame_timestamp> ts_queued =
+ std::shared_ptr<frame_timestamp> ts =
std::make_shared<frame_timestamp>();
/* Push new timestamp into queue */
- ts_queued->timestamp_valid = full_timestamp_received;
- ts_queued->timestamp_sec = time_secs;
- ts_queued->timestamp_pps = time_pps;
- ts_queued->fct = latestFCT;
+ ts->timestamp_valid = full_timestamp_received;
+ ts->timestamp_sec = time_secs;
+ ts->timestamp_pps = time_pps;
+ ts->fct = latestFCT;
+ ts->fp = latestFP;
- ts_queued->timestamp_refresh = offset_changed;
+ ts->timestamp_refresh = offset_changed;
offset_changed = false;
MDEBUG("time_secs=%d, time_pps=%f\n", time_secs,
(double)time_pps / 16384000.0);
- *ts_queued += timestamp_offset;
-
- queue_timestamps.push(ts_queued);
-
- /* Here, the queue size is one more than the pipeline delay, because
- * we've just added a new element in the queue.
- *
- * Therefore, use <= and not < for comparison
- */
- if (queue_timestamps.size() <= m_tist_delay_stages) {
- //fprintf(stderr, "* %zu %u ", queue_timestamps.size(), m_tist_delay_stages);
- /* Return invalid timestamp until the queue is full */
- ts.timestamp_valid = false;
- ts.timestamp_sec = 0;
- ts.timestamp_pps = 0;
- ts.timestamp_refresh = false;
- ts.fct = -1;
- }
- else {
- //fprintf(stderr, ". %zu ", queue_timestamps.size());
- /* Return timestamp from queue */
- ts_queued = queue_timestamps.front();
- queue_timestamps.pop();
- /*fprintf(stderr, "ts_queued v:%d, sec:%d, pps:%f, ref:%d\n",
- ts_queued->timestamp_valid,
- ts_queued->timestamp_sec,
- ts_queued->timestamp_pps_offset,
- ts_queued->timestamp_refresh);*/
- ts = *ts_queued;
- /*fprintf(stderr, "ts v:%d, sec:%d, pps:%f, ref:%d\n\n",
- ts.timestamp_valid,
- ts.timestamp_sec,
- ts.timestamp_pps_offset,
- ts.timestamp_refresh);*/
- }
-
- MDEBUG("Timestamp queue size %zu, delay_calc %u\n",
- queue_timestamps.size(),
- m_tist_delay_stages);
+ *ts += timestamp_offset;
- if (queue_timestamps.size() > m_tist_delay_stages) {
- etiLog.level(error) << "Error: Timestamp queue is too large : size " <<
- queue_timestamps.size() << "! This should not happen !";
- }
-
- //ts.print("calc2 ");
+ return ts;
}
-void TimestampDecoder::pushMNSCData(int framephase, uint16_t mnsc)
+void TimestampDecoder::pushMNSCData(uint8_t framephase, uint16_t mnsc)
{
struct eti_MNSC_TIME_0 *mnsc0;
struct eti_MNSC_TIME_1 *mnsc1;
@@ -190,7 +163,7 @@ void TimestampDecoder::updateTimestampPPS(uint32_t pps)
}
void TimestampDecoder::updateTimestampEti(
- int framephase,
+ uint8_t framephase,
uint16_t mnsc,
uint32_t pps, // In units of 1/16384000 s
int32_t fct)
@@ -198,16 +171,19 @@ void TimestampDecoder::updateTimestampEti(
updateTimestampPPS(pps);
pushMNSCData(framephase, mnsc);
latestFCT = fct;
+ latestFP = framephase;
}
void TimestampDecoder::updateTimestampEdi(
uint32_t seconds_utc,
uint32_t pps, // In units of 1/16384000 s
- int32_t fct)
+ int32_t fct,
+ uint8_t framephase)
{
time_secs = seconds_utc;
time_pps = pps;
latestFCT = fct;
+ latestFP = framephase;
full_timestamp_received = true;
}