From 06268c30c784051dfa5d651cb9195298094113b1 Mon Sep 17 00:00:00 2001 From: "Bram (morningbird)" Date: Wed, 1 Aug 2012 15:06:22 +0200 Subject: dabmod: offset calculation includes pipeline delay due to FIRFilter --- src/TimestampDecoder.cpp | 60 ++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 51 insertions(+), 9 deletions(-) (limited to 'src/TimestampDecoder.cpp') diff --git a/src/TimestampDecoder.cpp b/src/TimestampDecoder.cpp index 3dd64bf..d3bf578 100644 --- a/src/TimestampDecoder.cpp +++ b/src/TimestampDecoder.cpp @@ -22,14 +22,15 @@ along with CRC-DADMOD. If not, see . */ -#include "TimestampDecoder.h" -#include "Eti.h" -#include -#include "PcDebug.h" +#include #include #include #include #include +#include +#include "PcDebug.h" +#include "TimestampDecoder.h" +#include "Eti.h" //#define MDEBUG(fmt, args...) fprintf (LOG, fmt , ## args) #define MDEBUG(fmt, args...) PDEBUG(fmt, ## args) @@ -37,14 +38,55 @@ void TimestampDecoder::calculateTimestamp(struct frame_timestamp& ts) { - ts.timestamp_valid = full_timestamp_received_mnsc; - ts.timestamp_sec = time_secs; - ts.timestamp_pps_offset = time_pps; + struct frame_timestamp* ts_queued = new struct frame_timestamp; + + /* Push new timestamp into queue */ + ts_queued->timestamp_valid = full_timestamp_received_mnsc; + ts_queued->timestamp_sec = time_secs; + ts_queued->timestamp_pps_offset = time_pps; - ts.timestamp_refresh = offset_changed; + ts_queued->timestamp_refresh = offset_changed; offset_changed = false; - ts += timestamp_offset; + *ts_queued += timestamp_offset; + + queue_timestamps.push(ts_queued); + + if (queue_timestamps.size() < modconfig.delay_calculation_pipeline_stages) { + /* Return invalid timestamp */ + ts.timestamp_valid = false; + ts.timestamp_sec = 0; + ts.timestamp_pps_offset = 0; + ts.timestamp_refresh = false; + } + else { + /* 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);*/ + + delete ts_queued; + } + + PDEBUG("Timestamp queue size %zu, delay_calc %u\n", + queue_timestamps.size(), + modconfig.delay_calculation_pipeline_stages); + + if (queue_timestamps.size() > modconfig.delay_calculation_pipeline_stages) { + fprintf(stderr, "Error: Timestamp queue is too large : size %zu ! This should not happen !\n", + queue_timestamps.size()); + } + //ts.print("calc2 "); } -- cgit v1.2.3