diff options
| -rw-r--r-- | host/include/uhd/types/time_spec.hpp | 4 | ||||
| -rw-r--r-- | host/lib/types.cpp | 21 | ||||
| -rw-r--r-- | host/test/CMakeLists.txt | 1 | ||||
| -rw-r--r-- | host/test/time_spec_test.cpp | 61 | 
4 files changed, 78 insertions, 9 deletions
| diff --git a/host/include/uhd/types/time_spec.hpp b/host/include/uhd/types/time_spec.hpp index 59b85f4b7..57d002d48 100644 --- a/host/include/uhd/types/time_spec.hpp +++ b/host/include/uhd/types/time_spec.hpp @@ -59,7 +59,7 @@ namespace uhd{           * \param tick_count the fractional seconds tick count           * \param tick_rate the number of ticks per second           */ -        time_spec_t(time_t full_secs, size_t tick_count, double tick_rate); +        time_spec_t(time_t full_secs, long tick_count, double tick_rate);          /*!           * Convert the fractional seconds to clock ticks. @@ -67,7 +67,7 @@ namespace uhd{           * \param tick_rate the number of ticks per second           * \return the fractional seconds tick count           */ -        size_t get_tick_count(double tick_rate) const; +        long get_tick_count(double tick_rate) const;          /*!           * Get the time as a real-valued seconds count. diff --git a/host/lib/types.cpp b/host/lib/types.cpp index f957cd83f..6aa82b012 100644 --- a/host/lib/types.cpp +++ b/host/lib/types.cpp @@ -124,14 +124,14 @@ time_spec_t::time_spec_t(time_t full_secs, double frac_secs):      /* NOP */  } -time_spec_t::time_spec_t(time_t full_secs, size_t tick_count, double tick_rate): +time_spec_t::time_spec_t(time_t full_secs, long tick_count, double tick_rate):      _full_secs(full_secs),      _frac_secs(double(tick_count)/tick_rate)  {      /* NOP */  } -size_t time_spec_t::get_tick_count(double tick_rate) const{ +long time_spec_t::get_tick_count(double tick_rate) const{      return boost::math::iround(this->get_frac_secs()*tick_rate);  } @@ -140,7 +140,9 @@ double time_spec_t::get_real_secs(void) const{  }  time_t time_spec_t::get_full_secs(void) const{ -    return this->_full_secs + time_t(std::floor(this->_frac_secs)); +    double intpart; +    std::modf(this->_frac_secs, &intpart); +    return this->_full_secs + time_t(intpart);  }  double time_spec_t::get_frac_secs(void) const{ @@ -160,13 +162,18 @@ time_spec_t &time_spec_t::operator-=(const time_spec_t &rhs){  }  bool uhd::operator==(const time_spec_t &lhs, const time_spec_t &rhs){ -    return lhs.get_full_secs() == rhs.get_full_secs() and lhs.get_frac_secs() == rhs.get_frac_secs(); +    return +        lhs.get_full_secs() == rhs.get_full_secs() and +        lhs.get_frac_secs() == rhs.get_frac_secs() +    ;  }  bool uhd::operator<(const time_spec_t &lhs, const time_spec_t &rhs){ -    if (lhs.get_full_secs() < rhs.get_full_secs()) return true; -    if (lhs.get_full_secs() > rhs.get_full_secs()) return false; -    return lhs.get_frac_secs() < rhs.get_frac_secs(); +    return ( +        (lhs.get_full_secs() < rhs.get_full_secs()) or ( +        (lhs.get_full_secs() == rhs.get_full_secs()) and +        (lhs.get_frac_secs() < rhs.get_frac_secs()) +    ));  }  /*********************************************************************** diff --git a/host/test/CMakeLists.txt b/host/test/CMakeLists.txt index c620fd641..fb075ea07 100644 --- a/host/test/CMakeLists.txt +++ b/host/test/CMakeLists.txt @@ -28,6 +28,7 @@ ADD_EXECUTABLE(main_test      error_test.cpp      gain_group_test.cpp      subdev_spec_test.cpp +    time_spec_test.cpp      tune_helper_test.cpp      vrt_test.cpp      warning_test.cpp diff --git a/host/test/time_spec_test.cpp b/host/test/time_spec_test.cpp new file mode 100644 index 000000000..5ad782160 --- /dev/null +++ b/host/test/time_spec_test.cpp @@ -0,0 +1,61 @@ +// +// Copyright 2010 Ettus Research LLC +// +// This program 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. +// +// This program 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 this program.  If not, see <http://www.gnu.org/licenses/>. +// + +#include <boost/test/unit_test.hpp> +#include <uhd/types/time_spec.hpp> +#include <boost/foreach.hpp> +#include <iostream> + +BOOST_AUTO_TEST_CASE(test_time_spec_compare){ +    std::cout << "Testing time specification compare..." << std::endl; + +    BOOST_CHECK(uhd::time_spec_t(2.0) == uhd::time_spec_t(2.0)); +    BOOST_CHECK(uhd::time_spec_t(2.0) > uhd::time_spec_t(1.0)); +    BOOST_CHECK(uhd::time_spec_t(1.0) < uhd::time_spec_t(2.0)); + +    BOOST_CHECK(uhd::time_spec_t(1.1) == uhd::time_spec_t(1.1)); +    BOOST_CHECK(uhd::time_spec_t(1.1) > uhd::time_spec_t(1.0)); +    BOOST_CHECK(uhd::time_spec_t(1.0) < uhd::time_spec_t(1.1)); + +    BOOST_CHECK(uhd::time_spec_t(0.1) == uhd::time_spec_t(0.1)); +    BOOST_CHECK(uhd::time_spec_t(0.2) > uhd::time_spec_t(0.1)); +    BOOST_CHECK(uhd::time_spec_t(0.1) < uhd::time_spec_t(0.2)); +} + +#define CHECK_TS_EQUAL(lhs, rhs) \ +    BOOST_CHECK_CLOSE((lhs).get_real_secs(), (rhs).get_real_secs(), 0.001) + +BOOST_AUTO_TEST_CASE(test_time_spec_arithmetic){ +    std::cout << "Testing time specification arithmetic..." << std::endl; + +    CHECK_TS_EQUAL(uhd::time_spec_t(2.3) + uhd::time_spec_t(1.0), uhd::time_spec_t(3.3)); +    CHECK_TS_EQUAL(uhd::time_spec_t(2.3) - uhd::time_spec_t(1.0), uhd::time_spec_t(1.3)); +    CHECK_TS_EQUAL(uhd::time_spec_t(1.0) + uhd::time_spec_t(2.3), uhd::time_spec_t(3.3)); +    CHECK_TS_EQUAL(uhd::time_spec_t(1.0) - uhd::time_spec_t(2.3), uhd::time_spec_t(-1.3)); +} + +BOOST_AUTO_TEST_CASE(test_time_spec_parts){ +    std::cout << "Testing time specification parts..." << std::endl; + +    BOOST_CHECK_EQUAL(uhd::time_spec_t(1.1).get_full_secs(), 1); +    BOOST_CHECK_CLOSE(uhd::time_spec_t(1.1).get_frac_secs(), 0.1, 0.001); +    BOOST_CHECK_EQUAL(uhd::time_spec_t(1.1).get_tick_count(100), 10); + +    BOOST_CHECK_EQUAL(uhd::time_spec_t(-1.1).get_full_secs(), -1); +    BOOST_CHECK_CLOSE(uhd::time_spec_t(-1.1).get_frac_secs(), -0.1, 0.001); +    BOOST_CHECK_EQUAL(uhd::time_spec_t(-1.1).get_tick_count(100), -10); +} | 
