timetag values to/from system time
This commit is contained in:
parent
4023cdaa81
commit
23572904d2
@ -94,6 +94,56 @@ void blob::oStream(std::shared_ptr<bufferstream> stream) const
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief timetag::time_point
|
||||||
|
* @return
|
||||||
|
*
|
||||||
|
* Convert \cite NTPv4 NTP timestamp to a system referanced time_point, with
|
||||||
|
* not greater than nanosecond resolution.
|
||||||
|
*
|
||||||
|
* \warning \cite Spec11 OSC Spec 1.1 leaves unchanged the reliance on the 64-bit NTP
|
||||||
|
* timestamp format. The NTP Epoch 0 ends on February 7, 2036, at which time OSC
|
||||||
|
* timetag values will rollover.
|
||||||
|
*/
|
||||||
|
std::chrono::time_point<std::chrono::system_clock> timetag::time() const
|
||||||
|
{
|
||||||
|
std::chrono::time_point<std::chrono::system_clock> time; // POSIX epoch
|
||||||
|
time -= std::chrono::seconds(2208988800); // NTP epoch offset
|
||||||
|
time += std::chrono::seconds(seconds);
|
||||||
|
time += std::chrono::nanoseconds(
|
||||||
|
(uint32_t)(((double)fractional
|
||||||
|
*(1.0/(double)std::numeric_limits<typeof(fractional)>::max()))
|
||||||
|
*1e9));
|
||||||
|
/// \test validate time conversion from fractional seconds.
|
||||||
|
return time;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief timetag::setTime
|
||||||
|
* @param time
|
||||||
|
*
|
||||||
|
* Convert system referanced time_point to \cite NTPv4 NTP timestamps, with
|
||||||
|
* not greater than nanosecond resolution.
|
||||||
|
*
|
||||||
|
* \warning \cite Spec11 OSC Spec 1.1 leaves unchanged the reliance on the 64-bit NTP
|
||||||
|
* timestamp format. The NTP Epoch 0 ends on February 7, 2036, at which time OSC
|
||||||
|
* timetag values will rollover.
|
||||||
|
*/
|
||||||
|
void timetag::setTime(std::chrono::time_point<std::chrono::system_clock> time)
|
||||||
|
{
|
||||||
|
auto t = time.time_since_epoch(); // POSIX epoch
|
||||||
|
auto s = std::chrono::duration_cast<std::chrono::seconds>(t);
|
||||||
|
auto f = std::chrono::duration_cast<std::chrono::nanoseconds>(t - s);
|
||||||
|
s += std::chrono::seconds(2208988800); // NTP epoch offset
|
||||||
|
seconds = s.count();
|
||||||
|
fractional = ((double)f.count()
|
||||||
|
*1e-9)
|
||||||
|
*(1.0/(double)std::numeric_limits<typeof(fractional)>::max());
|
||||||
|
/// \test validate time conversion to fractional seconds.
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void character::iStream(std::shared_ptr<bufferstream> stream)
|
void character::iStream(std::shared_ptr<bufferstream> stream)
|
||||||
{
|
{
|
||||||
value = stream->readType<int32_t>();
|
value = stream->readType<int32_t>();
|
||||||
|
@ -24,6 +24,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <bufferstream.h>
|
#include <bufferstream.h>
|
||||||
|
#include <chrono>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
namespace OSC {
|
namespace OSC {
|
||||||
@ -136,6 +137,9 @@ struct timetag
|
|||||||
{
|
{
|
||||||
timetag() : Argument('t') {};
|
timetag() : Argument('t') {};
|
||||||
|
|
||||||
|
std::chrono::time_point<std::chrono::system_clock> time() const;
|
||||||
|
void setTime(std::chrono::time_point<std::chrono::system_clock> time = std::chrono::system_clock::now());
|
||||||
|
|
||||||
virtual size_t streamSize() const override { return 8; }
|
virtual size_t streamSize() const override { return 8; }
|
||||||
virtual void iStream(std::shared_ptr<bufferstream> stream) override { *stream >> value; }
|
virtual void iStream(std::shared_ptr<bufferstream> stream) override { *stream >> value; }
|
||||||
virtual void oStream(std::shared_ptr<bufferstream> stream) const override { *stream << value; }
|
virtual void oStream(std::shared_ptr<bufferstream> stream) const override { *stream << value; }
|
||||||
|
Loading…
Reference in New Issue
Block a user