diff options
| author | Matthias P. Braendli <matthias.braendli@mpb.li> | 2014-09-26 11:23:53 +0200 | 
|---|---|---|
| committer | Matthias P. Braendli <matthias.braendli@mpb.li> | 2014-09-26 11:24:02 +0200 | 
| commit | 11295eabfdb514b43918b8ac45945d36f81f4bd7 (patch) | |
| tree | aa76f5e16867de3e57826f606a503cd325d54ae4 /src/OutputUHD.cpp | |
| parent | 685095418bc8fd27dcd0b1d73ad1741114aeda6a (diff) | |
| download | dabmod-11295eabfdb514b43918b8ac45945d36f81f4bd7.tar.gz dabmod-11295eabfdb514b43918b8ac45945d36f81f4bd7.tar.bz2 dabmod-11295eabfdb514b43918b8ac45945d36f81f4bd7.zip  | |
Interrupt UHD when FCT value is not contiguous
Diffstat (limited to 'src/OutputUHD.cpp')
| -rw-r--r-- | src/OutputUHD.cpp | 35 | 
1 files changed, 16 insertions, 19 deletions
diff --git a/src/OutputUHD.cpp b/src/OutputUHD.cpp index 927d2e6..3d8eea6 100644 --- a/src/OutputUHD.cpp +++ b/src/OutputUHD.cpp @@ -346,7 +346,10 @@ void UHDWorker::process()      md.start_of_burst = false;      md.end_of_burst = false; +    int expected_next_fct = -1; +      while (running) { +        bool fct_discontinuity = false;          md.has_time_spec = false;          md.time_spec = uhd::time_spec_t(0.0);          num_acc_samps = 0; @@ -376,19 +379,20 @@ void UHDWorker::process()          sizeIn = uwd->bufsize / sizeof(complexf); -#if FAKE_UHD +        /* Verify that the FCT value is correct. If we miss one transmission +         * frame we must interrupt UHD and resync to the timestamps +         */          if (expected_next_fct != -1) { -            if (expected_next_fct != frame->ts.fct) { +            if (expected_next_fct != (int)frame->ts.fct) {                  uwd->logger->level(warn) <<                      "OutputUHD: Incorrect expect fct " << frame->ts.fct; -                // TODO here we should disrupt the UHD streamer so that -                // it resyncs to the correct timestamps +                fct_discontinuity = true;              }          }          expected_next_fct = (frame->ts.fct + uwd->fct_increment) % 250; -#else +          // Check for ref_lock          if (uwd->check_refclk_loss)          { @@ -482,7 +486,6 @@ void UHDWorker::process()                  goto loopend;              }          } -#endif          PDEBUG("UHDWorker::process:max_num_samps: %zu.\n",                  usrp_max_num_samps); @@ -492,8 +495,13 @@ void UHDWorker::process()              //ensure the the last packet has EOB set if the timestamps has been              //refreshed and need to be reconsidered. -            md.end_of_burst = (frame->ts.timestamp_refresh && -                    (samps_to_send <= usrp_max_num_samps)); +            //Also, if we saw that the FCT did not increment as expected, which +            //could be due to a lost incoming packet. +            md.end_of_burst = ( +                    uwd->sourceContainsTimestamp && +                    (frame->ts.timestamp_refresh || fct_discontinuity) && +                    samps_to_send <= usrp_max_num_samps ); +  #if FAKE_UHD              // This is probably very approximate @@ -586,17 +594,6 @@ void UHDWorker::process()                  }              }  #endif - -            /* -               bool got_async_burst_ack = false; -            //loop through all messages for the ACK packet (may have underflow messages in queue) -            while (not got_async_burst_ack and uwd->myUsrp->get_device()->recv_async_msg(async_md, 0.2)){ -            got_async_burst_ack = (async_md.event_code == uhd::async_metadata_t::EVENT_CODE_BURST_ACK); -            } -            //std::cerr << (got_async_burst_ack? "success" : "fail") << std::endl; -            // */ - -          }          last_pps = pps_offset;  | 
