11#include <promeki/config.h>
12#if PROMEKI_ENABLE_NETWORK
23PROMEKI_NAMESPACE_BEGIN
85 PhcClock(PhcClock &&other)
noexcept;
86 PhcClock &operator=(PhcClock &&other)
noexcept;
88 PhcClock(
const PhcClock &) =
delete;
89 PhcClock &operator=(
const PhcClock &) =
delete;
101 int maxAdjustmentPpb = 0;
106 bool ppsSupported =
false;
107 bool crossTimestamping =
false;
108 bool adjustPhase =
false;
122 int64_t sysRealtimeNs = 0;
124 int64_t sysRealtimePostNs = 0;
136 static Result<PhcClock> open(
const String &path = String(
"/dev/ptp0"));
139 bool isOpen()
const {
return _fd >= 0; }
142 const String &devicePath()
const {
return _path; }
145 int fileDescriptor()
const {
return _fd; }
148 const Caps &caps()
const {
return _caps; }
158 Result<TimeStamp> now()
const;
167 Result<NtpTime> ntpNow()
const;
177 Result<SysOffset> sysOffsetPrecise()
const;
180 int taiUtcOffsetSeconds()
const {
return _taiUtcOffsetSec; }
183 void setTaiUtcOffsetSeconds(
int seconds) { _taiUtcOffsetSec = seconds; }
194 Error refreshTaiUtcOffset();
211 bool isLocked(int64_t toleranceNs = 1'000'000LL)
const;
238 Error bindAsDomain(
const ClockDomain::ID &domain = ClockDomain::Ptp);
247 void unbindDomain(
const ClockDomain::ID &domain = ClockDomain::Ptp);
263 static int systemTaiUtcOffsetSeconds();
285 static uint64_t utcNsToTaiNs(int64_t utcNs);
288 explicit PhcClock(
int fd, String path, Caps caps,
int taiUtcSec)
289 : _fd(fd), _path(std::move(path)), _caps(caps),
290 _taiUtcOffsetSec(taiUtcSec) {}
295 int _taiUtcOffsetSec = 37;