1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324
|
/*
* Copyright (C) 2016 Open Source Robotics Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
#ifndef IGNITION_COMMON_TIME_HH_
#define IGNITION_COMMON_TIME_HH_
#include <string>
#include <iostream>
#include <ignition/common/Export.hh>
#include <ignition/common/Util.hh>
namespace ignition
{
namespace common
{
/// \class Time Time.hh common/common.hh
/// \brief A Time class, can be used to hold wall- or sim-time.
/// stored as sec and nano-sec.
class IGNITION_COMMON_VISIBLE Time
{
/// \brief A static zero time variable set to common::Time(0, 0).
public: static const Time Zero;
/// \enum Format options
/// \brief Options for formatting time as a string.
public: enum class FormatOption
{
/// \brief Days
DAYS = 0,
/// \brief Hours
HOURS = 1,
/// \brief Minutes
MINUTES = 2,
/// \brief Seconds
SECONDS = 3,
/// \brief Milliseconds
MILLISECONDS = 4
};
/// \brief Constructors
public: IGN_DEPRECATED(4) Time();
/// \brief Copy constructor
/// \param[in] time Time to copy
public: IGN_DEPRECATED(4) Time(const Time &_time);
/// \brief Constructor
/// \param[in] _tv Time to initialize to
public: explicit IGN_DEPRECATED(4) Time(const struct timespec &_tv);
/// \brief Constructor
/// \param[in] _sec Seconds
/// \param[in] _nsec Nanoseconds
public: IGN_DEPRECATED(4) Time(int32_t _sec, int32_t _nsec);
/// \brief Constuctor
/// \param[in] _time Time in double format sec.nsec
public: explicit IGN_DEPRECATED(4) Time(double _time);
/// \brief Destructor
public: virtual ~Time();
/// \brief Get the wall time
/// \return the current time
public: static const IGN_DEPRECATED(4) Time &SystemTime();
/// \brief Set to sec and nsec
/// \param[in] _sec Seconds
/// \param[in] _nsec Nanoseconds
public: void Set(int32_t _sec, int32_t _nsec);
/// \brief Set to seconds
/// \param[in] _seconds Number of seconds
public: void Set(double _seconds);
/// \brief Get the time as a double
/// \return Time as a double in seconds
public: double Double() const;
/// \brief Get the time as a float
/// \return Time as a float in seconds
public: float Float() const;
/// \brief Sleep for the specified time.
/// \param[in] _time Sleep time
/// \return On OSX and Linux the return value is the time slept,
/// as reported by `nanosleep` for OSX and `clock_nanosleep` for Linux.
/// The return value does not include time spent before and after the
/// actual call to the system's sleep function.
///
/// On Windows the return value is always common::Time::Zero.
public: static Time IGN_DEPRECATED(4) Sleep(const common::Time &_time);
/// \brief Get the time as a string formatted as "DD hh:mm:ss.mmm", with
/// the option to choose the start/end.
/// \param[in] _start Start point.
/// \param[in] _end End point.
/// \return String representing time.
public: std::string FormattedString(
FormatOption _start = FormatOption::DAYS,
FormatOption _end = FormatOption::MILLISECONDS) const;
/// \brief Assignment operator
/// \param[in] _time the new time
/// \return a reference to this instance
public: Time &operator=(const Time &_time);
/// \brief Addition operators
/// \param[in] _time The time to add
/// \return a Time instance
public: Time operator+(const Time &_time) const;
/// \brief Addition assignemtn operator
/// \param[in] _time The time to add
/// \return a Time instance
public: const Time &operator +=(const Time &_time);
/// \brief Subtraction operator
/// \param[in] _tv The time to subtract
/// \return a Time instance
public: Time operator -(const struct timespec &_tv) const;
/// \brief Subtraction assignment operator
/// \param[in] _tv The time to subtract
/// \return a Time instance
public: const Time &operator -=(const struct timespec &_tv);
/// \brief Subtraction operator
/// \param[in] _time The time to subtract
/// \return a Time instance
public: Time operator -(const Time &_time) const;
/// \brief Subtraction assignment operator
/// \param[in] _time The time to subtract
/// \return a reference to this instance
public: const Time &operator -=(const Time &_time);
/// \brief Multiplication operator
/// \param[in] _tv the scaling duration
/// \return Time instance
public: Time operator *(const struct timespec &_tv) const;
/// \brief Multiplication assignment operator
/// \param[in] _tv the scaling duration
/// \return a reference to this instance
public: const Time &operator *=(const struct timespec &_tv);
/// \brief Multiplication operators
/// \param[in] _time the scaling factor
/// \return a scaled Time instance
public: Time operator *(const Time &_time) const;
/// \brief Multiplication operators
/// \param[in] _time scale factor
/// \return a scaled Time instance
public: const Time &operator *=(const Time &_time);
/// \brief Division assignment operator
/// \param[in] _tv a divisor
/// \return a Time instance
public: const Time &operator /=(const struct timespec &_tv);
/// \brief Division operator
/// \param[in] _time the divisor
/// \return a Time instance
public: Time operator /(const Time &_time) const;
/// \brief Division assignment operator
/// \param[in] time the divisor
/// \return a Time instance
public: const Time &operator /=(const Time &time);
/// \brief Equal to operator
/// \param[in] _time the time to compare to
/// \return true if values are the same, false otherwise
public: bool operator==(const Time &_time) const;
/// \brief Equal to operator
/// \param[in] _time the time to compare to
/// \return true if values are the same, false otherwise
public: bool operator==(double _time) const;
/// \brief Equal to operator
/// \param[in] _time the time to compare to
/// \return true if values are the same, false otherwise
public: bool operator!=(const Time &_time) const;
/// \brief Equal to operator
/// \param[in] _time the time to compare to
/// \return true if values are the same, false otherwise
public: bool operator!=(double _time) const;
/// \brief Less than operator
/// \param[in] _time the time to compare with
/// \return true if time is shorter than this, false otherwise
public: bool operator<(const Time &_time) const;
/// \brief Less than operator
/// \param[in] _time the time to compare with
/// \return true if time is shorter than this, false otherwise
public: bool operator<(double _time) const;
/// \brief Less than or equal to operator
/// \param[in] _time the time to compare with
/// \return true if time is shorter than or equal to this, false otherwise
public: bool operator<=(const Time &_time) const;
/// \brief Less than or equal to operator
/// \param[in] _time the time to compare with
/// \return true if time is shorter than or equal to this, false otherwise
public: bool operator<=(double _time) const;
/// \brief Greater than operator
/// \param[in] _tv the time to compare with
/// \return true if time is greater than this, false otherwise
public: bool operator>(const struct timespec &_tv) const;
/// \brief Greater than operator
/// \param[in] _time the time to compare with
/// \return true if time is greater than this, false otherwise
public: bool operator>(const Time &_time) const;
/// \brief Greater than operator
/// \param[in] _time the time to compare with
/// \return true if time is greater than this, false otherwise
public: bool operator>(double _time) const;
/// \brief Greater than or equal operator
/// \param[in] _time the time to compare with
/// \return true if time is greater than or equal to this, false otherwise
public: bool operator>=(const Time &_time) const;
/// \brief Greater than or equal operator
/// \param[in] _tv the time to compare with
/// \return true if tv is greater than or equal to this, false otherwise
public: bool operator>=(const struct timespec &_tv) const;
/// \brief Greater than or equal operator
/// \param[in] _time the time to compare with
/// \return true if time is greater than or equal to this, false otherwise
public: bool operator>=(double _time) const;
/// \brief Stream insertion operator
/// \param[in] _out the output stream
/// \param[in] _time time to write to the stream
/// \return the output stream
public: friend std::ostream &operator<<(std::ostream &_out,
const ignition::common::Time &_time)
{
_out << _time.sec << " " << _time.nsec;
return _out;
}
/// \brief Stream extraction operator
/// \param[in] _in the input stream
/// \param[in] _time time to read from to the stream
/// \return the input stream
public: friend std::istream &operator>>(std::istream &_in,
ignition::common::Time &_time)
{
// Skip white spaces
_in.setf(std::ios_base::skipws);
_in >> _time.sec >> _time.nsec;
return _in;
}
/// \brief Seconds
public: int32_t sec;
/// \brief Nanoseconds
public: int32_t nsec;
/// \brief a singleton value of the last GetWallTime() value
private: static Time wallTime;
/// \brief Correct the time so that small additions/substractions
/// preserve the internal seconds and nanoseconds separation
private: inline void Correct()
{
// In the case sec and nsec have different signs, normalize
if (this->sec > 0 && this->nsec < 0)
{
int32_t n = abs(this->nsec / this->nsInSec) + 1;
this->sec -= n;
this->nsec += n * this->nsInSec;
}
if (this->sec < 0 && this->nsec > 0)
{
int32_t n = abs(this->nsec / this->nsInSec) + 1;
this->sec += n;
this->nsec -= n * this->nsInSec;
}
// Make any corrections
this->sec += this->nsec / this->nsInSec;
this->nsec = this->nsec % this->nsInSec;
}
/// \brief Constant multiplier to convert from nanoseconds to seconds.
private: static const int32_t nsInSec;
/// \brief Constant multiplier to convert from nanoseconds to
/// milliseconds.
private: static const int32_t nsInMs;
private: static struct timespec clockResolution;
};
}
}
#endif
|