aboutsummaryrefslogtreecommitdiffstats
path: root/host/lib/usrp/usrp1/soft_time_ctrl.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'host/lib/usrp/usrp1/soft_time_ctrl.cpp')
-rw-r--r--host/lib/usrp/usrp1/soft_time_ctrl.cpp182
1 files changed, 100 insertions, 82 deletions
diff --git a/host/lib/usrp/usrp1/soft_time_ctrl.cpp b/host/lib/usrp/usrp1/soft_time_ctrl.cpp
index eb08d0352..42a1e9712 100644
--- a/host/lib/usrp/usrp1/soft_time_ctrl.cpp
+++ b/host/lib/usrp/usrp1/soft_time_ctrl.cpp
@@ -21,106 +21,117 @@ namespace pt = boost::posix_time;
static const time_spec_t TWIDDLE(0.0011);
-soft_time_ctrl::~soft_time_ctrl(void){
+soft_time_ctrl::~soft_time_ctrl(void)
+{
/* NOP */
}
/***********************************************************************
* Soft time control implementation
**********************************************************************/
-class soft_time_ctrl_impl : public soft_time_ctrl{
+class soft_time_ctrl_impl : public soft_time_ctrl
+{
public:
-
- soft_time_ctrl_impl(const cb_fcn_type &stream_on_off):
- _nsamps_remaining(0),
- _stream_mode(stream_cmd_t::STREAM_MODE_STOP_CONTINUOUS),
- _cmd_queue(2),
- _async_msg_queue(1000),
- _inline_msg_queue(1000),
- _stream_on_off(stream_on_off)
+ soft_time_ctrl_impl(const cb_fcn_type& stream_on_off)
+ : _nsamps_remaining(0)
+ , _stream_mode(stream_cmd_t::STREAM_MODE_STOP_CONTINUOUS)
+ , _cmd_queue(2)
+ , _async_msg_queue(1000)
+ , _inline_msg_queue(1000)
+ , _stream_on_off(stream_on_off)
{
- //synchronously spawn a new thread
+ // synchronously spawn a new thread
_recv_cmd_task = task::make(std::bind(&soft_time_ctrl_impl::recv_cmd_task, this));
- //initialize the time to something
+ // initialize the time to something
this->set_time(time_spec_t(0.0));
}
/*******************************************************************
* Time control
******************************************************************/
- void set_time(const time_spec_t &time){
+ void set_time(const time_spec_t& time)
+ {
boost::mutex::scoped_lock lock(_update_mutex);
_time_offset = uhd::get_system_time() - time;
}
- time_spec_t get_time(void){
+ time_spec_t get_time(void)
+ {
boost::mutex::scoped_lock lock(_update_mutex);
return time_now();
}
- UHD_INLINE time_spec_t time_now(void){
- //internal get time without scoped lock
+ UHD_INLINE time_spec_t time_now(void)
+ {
+ // internal get time without scoped lock
return uhd::get_system_time() - _time_offset;
}
UHD_INLINE void sleep_until_time(
- boost::mutex::scoped_lock &lock, const time_spec_t &time
- ){
+ boost::mutex::scoped_lock& lock, const time_spec_t& time)
+ {
boost::condition_variable cond;
- //use a condition variable to unlock, sleep, lock
+ // use a condition variable to unlock, sleep, lock
double seconds_to_sleep = (time - time_now()).get_real_secs();
- cond.timed_wait(lock, pt::microseconds(long(seconds_to_sleep*1e6)));
+ cond.timed_wait(lock, pt::microseconds(long(seconds_to_sleep * 1e6)));
}
/*******************************************************************
* Receive control
******************************************************************/
- size_t recv_post(rx_metadata_t &md, const size_t nsamps){
+ size_t recv_post(rx_metadata_t& md, const size_t nsamps)
+ {
boost::mutex::scoped_lock lock(_update_mutex);
- //Since it timed out on the receive, check for inline messages...
- //Must do a post check because recv() will not wake up for a message.
- if (md.error_code == rx_metadata_t::ERROR_CODE_TIMEOUT){
- if (_inline_msg_queue.pop_with_haste(md)) return 0;
+ // Since it timed out on the receive, check for inline messages...
+ // Must do a post check because recv() will not wake up for a message.
+ if (md.error_code == rx_metadata_t::ERROR_CODE_TIMEOUT) {
+ if (_inline_msg_queue.pop_with_haste(md))
+ return 0;
}
- //load the metadata with the expected time
+ // load the metadata with the expected time
md.has_time_spec = true;
- md.time_spec = time_now();
-
- //none of the stuff below matters in continuous streaming mode
- if (_stream_mode == stream_cmd_t::STREAM_MODE_START_CONTINUOUS) return nsamps;
-
- //When to stop streaming:
- //The samples have been received and the stream mode is non-continuous.
- //Rewrite the sample count to clip to the requested number of samples.
- if (_nsamps_remaining <= nsamps) switch(_stream_mode){
- case stream_cmd_t::STREAM_MODE_NUM_SAMPS_AND_MORE:{
- rx_metadata_t metadata;
- metadata.has_time_spec = true;
- metadata.time_spec = this->time_now();
- metadata.error_code = rx_metadata_t::ERROR_CODE_BROKEN_CHAIN;
- _inline_msg_queue.push_with_pop_on_full(metadata);
- } //continue to next case...
- UHD_FALLTHROUGH
- case stream_cmd_t::STREAM_MODE_NUM_SAMPS_AND_DONE:
- md.end_of_burst = true;
- this->issue_stream_cmd(stream_cmd_t::STREAM_MODE_STOP_CONTINUOUS);
- return _nsamps_remaining;
- default: break;
- }
+ md.time_spec = time_now();
+
+ // none of the stuff below matters in continuous streaming mode
+ if (_stream_mode == stream_cmd_t::STREAM_MODE_START_CONTINUOUS)
+ return nsamps;
+
+ // When to stop streaming:
+ // The samples have been received and the stream mode is non-continuous.
+ // Rewrite the sample count to clip to the requested number of samples.
+ if (_nsamps_remaining <= nsamps)
+ switch (_stream_mode) {
+ case stream_cmd_t::STREAM_MODE_NUM_SAMPS_AND_MORE: {
+ rx_metadata_t metadata;
+ metadata.has_time_spec = true;
+ metadata.time_spec = this->time_now();
+ metadata.error_code = rx_metadata_t::ERROR_CODE_BROKEN_CHAIN;
+ _inline_msg_queue.push_with_pop_on_full(metadata);
+ } // continue to next case...
+ UHD_FALLTHROUGH
+ case stream_cmd_t::STREAM_MODE_NUM_SAMPS_AND_DONE:
+ md.end_of_burst = true;
+ this->issue_stream_cmd(stream_cmd_t::STREAM_MODE_STOP_CONTINUOUS);
+ return _nsamps_remaining;
+ default:
+ break;
+ }
- //update the consumed samples
+ // update the consumed samples
_nsamps_remaining -= nsamps;
return nsamps;
}
- void issue_stream_cmd(const stream_cmd_t &cmd){
+ void issue_stream_cmd(const stream_cmd_t& cmd)
+ {
_cmd_queue.push_with_wait(std::make_shared<stream_cmd_t>(cmd));
}
- void stream_on_off(bool enb){
+ void stream_on_off(bool enb)
+ {
_stream_on_off(enb);
_nsamps_remaining = 0;
}
@@ -128,20 +139,22 @@ public:
/*******************************************************************
* Transmit control
******************************************************************/
- void send_pre(const tx_metadata_t &md, double &timeout){
- if (not md.has_time_spec) return;
+ void send_pre(const tx_metadata_t& md, double& timeout)
+ {
+ if (not md.has_time_spec)
+ return;
boost::mutex::scoped_lock lock(_update_mutex);
time_spec_t time_at(md.time_spec - TWIDDLE);
- //handle late packets
- if (time_at < time_now()){
+ // handle late packets
+ if (time_at < time_now()) {
async_metadata_t metadata;
- metadata.channel = 0;
+ metadata.channel = 0;
metadata.has_time_spec = true;
- metadata.time_spec = this->time_now();
- metadata.event_code = async_metadata_t::EVENT_CODE_TIME_ERROR;
+ metadata.time_spec = this->time_now();
+ metadata.event_code = async_metadata_t::EVENT_CODE_TIME_ERROR;
_async_msg_queue.push_with_pop_on_full(metadata);
return;
}
@@ -153,59 +166,63 @@ public:
/*******************************************************************
* Thread control
******************************************************************/
- void recv_cmd_handle_cmd(const stream_cmd_t &cmd){
+ void recv_cmd_handle_cmd(const stream_cmd_t& cmd)
+ {
boost::mutex::scoped_lock lock(_update_mutex);
- //handle the stream at time by sleeping
- if (not cmd.stream_now){
+ // handle the stream at time by sleeping
+ if (not cmd.stream_now) {
time_spec_t time_at(cmd.time_spec - TWIDDLE);
- if (time_at < time_now()){
+ if (time_at < time_now()) {
rx_metadata_t metadata;
metadata.has_time_spec = true;
- metadata.time_spec = this->time_now();
- metadata.error_code = rx_metadata_t::ERROR_CODE_LATE_COMMAND;
+ metadata.time_spec = this->time_now();
+ metadata.error_code = rx_metadata_t::ERROR_CODE_LATE_COMMAND;
_inline_msg_queue.push_with_pop_on_full(metadata);
this->issue_stream_cmd(stream_cmd_t::STREAM_MODE_STOP_CONTINUOUS);
return;
- }
- else{
+ } else {
sleep_until_time(lock, time_at);
}
}
- //When to stop streaming:
- //Stop streaming when the command is a stop and streaming.
+ // When to stop streaming:
+ // Stop streaming when the command is a stop and streaming.
if (cmd.stream_mode == stream_cmd_t::STREAM_MODE_STOP_CONTINUOUS
- and _stream_mode != stream_cmd_t::STREAM_MODE_STOP_CONTINUOUS
- ) stream_on_off(false);
+ and _stream_mode != stream_cmd_t::STREAM_MODE_STOP_CONTINUOUS)
+ stream_on_off(false);
- //When to start streaming:
- //Start streaming when the command is not a stop and not streaming.
+ // When to start streaming:
+ // Start streaming when the command is not a stop and not streaming.
if (cmd.stream_mode != stream_cmd_t::STREAM_MODE_STOP_CONTINUOUS
- and _stream_mode == stream_cmd_t::STREAM_MODE_STOP_CONTINUOUS
- ) stream_on_off(true);
+ and _stream_mode == stream_cmd_t::STREAM_MODE_STOP_CONTINUOUS)
+ stream_on_off(true);
- //update the state
+ // update the state
_nsamps_remaining += cmd.num_samps;
_stream_mode = cmd.stream_mode;
}
- void recv_cmd_task(void){ //task is looped
+ void recv_cmd_task(void)
+ { // task is looped
std::shared_ptr<stream_cmd_t> cmd;
if (_cmd_queue.pop_with_timed_wait(cmd, 0.25)) {
recv_cmd_handle_cmd(*cmd);
}
}
- bounded_buffer<async_metadata_t> &get_async_queue(void){
+ bounded_buffer<async_metadata_t>& get_async_queue(void)
+ {
return _async_msg_queue;
}
- bounded_buffer<rx_metadata_t> &get_inline_queue(void){
+ bounded_buffer<rx_metadata_t>& get_inline_queue(void)
+ {
return _inline_msg_queue;
}
- void stop(void){
+ void stop(void)
+ {
_recv_cmd_task.reset();
}
@@ -214,7 +231,7 @@ private:
size_t _nsamps_remaining;
stream_cmd_t::stream_mode_t _stream_mode;
time_spec_t _time_offset;
- bounded_buffer<std::shared_ptr<stream_cmd_t> > _cmd_queue;
+ bounded_buffer<std::shared_ptr<stream_cmd_t>> _cmd_queue;
bounded_buffer<async_metadata_t> _async_msg_queue;
bounded_buffer<rx_metadata_t> _inline_msg_queue;
const cb_fcn_type _stream_on_off;
@@ -224,6 +241,7 @@ private:
/***********************************************************************
* Soft time control factor
**********************************************************************/
-soft_time_ctrl::sptr soft_time_ctrl::make(const cb_fcn_type &stream_on_off){
+soft_time_ctrl::sptr soft_time_ctrl::make(const cb_fcn_type& stream_on_off)
+{
return sptr(new soft_time_ctrl_impl(stream_on_off));
}