F´ Flight Software - C/C++ Documentation
A framework for building embedded system applications to NASA flight quality standards.
Loading...
Searching...
No Matches
RawTime.cpp
Go to the documentation of this file.
1// ======================================================================
2// \title Os/Posix/RawTime.cpp
3// \brief Posix implementation for Os::RawTime
4// ======================================================================
6#include <Fw/Types/Assert.hpp>
8#include <Os/Posix/error.hpp>
9#include <cerrno>
10
11namespace Os {
12namespace Posix {
13namespace RawTime {
14
16 PlatformIntType status = clock_gettime(CLOCK_REALTIME, &this->m_handle.m_timespec);
17 if (status != 0) {
18 return errno_to_rawtime_status(errno);
19 }
20 return Status::OP_OK;
21}
22
24 timespec t1 = this->m_handle.m_timespec;
25 timespec t2 = static_cast<PosixRawTimeHandle*>(const_cast<Os::RawTime&>(other).getHandle())->m_timespec;
26
27 // Guarantee t1 is the later time to make the calculation below easier
28 if ((t1.tv_sec < t2.tv_sec) or (t1.tv_sec == t2.tv_sec and t1.tv_nsec < t2.tv_nsec)) {
29 t1 = static_cast<PosixRawTimeHandle*>(const_cast<Os::RawTime&>(other).getHandle())->m_timespec;
30 t2 = this->m_handle.m_timespec;
31 }
32
33 // Here we have guaranteed that t1 > t2, so there is no underflow
34 U32 sec = static_cast<U32>(t1.tv_sec - t2.tv_sec);
35 U32 nanosec = 0;
36 if (t1.tv_nsec < t2.tv_nsec) {
37 sec -= 1; // subtract nsec carry to seconds
38 nanosec = static_cast<U32>(t1.tv_nsec + (1000000000 - t2.tv_nsec));
39 } else {
40 nanosec = static_cast<U32>(t1.tv_nsec - t2.tv_nsec);
41 }
42
43 interval.set(sec, nanosec / 1000);
44 return Status::OP_OK;
45}
46
48 static_assert(PosixRawTime::SERIALIZED_SIZE >= 2 * sizeof(U32),
49 "PosixRawTime implementation requires at least 2*sizeof(U32) serialization size");
50 Fw::SerializeStatus status = buffer.serialize(static_cast<U32>(this->m_handle.m_timespec.tv_sec));
52 return status;
53 }
54 return buffer.serialize(static_cast<U32>(this->m_handle.m_timespec.tv_nsec));
55}
56
58 static_assert(PosixRawTime::SERIALIZED_SIZE >= 2 * sizeof(U32),
59 "PosixRawTime implementation requires at least 2*sizeof(U32) serialization size");
60 U32 sec = 0;
61 U32 nsec = 0;
62 Fw::SerializeStatus status = buffer.deserialize(sec);
64 return status;
65 }
66 status = buffer.deserialize(nsec);
68 return status;
69 }
70 this->m_handle.m_timespec = {static_cast<time_t>(sec), static_cast<long>(nsec)};
72}
73
75 return &this->m_handle;
76}
77
78} // namespace RawTime
79} // namespace Posix
80} // namespace Os
int PlatformIntType
DefaultTypes.hpp provides fallback defaults for the platform types.
SerializeStatus deserialize(U8 &val)
deserialize 8-bit unsigned int
SerializeStatus serialize(U8 val)
serialize 8-bit unsigned int
void set(U32 seconds, U32 useconds)
Status now() override
Get the current time.
Definition RawTime.cpp:15
Status getTimeInterval(const Os::RawTime &other, Fw::TimeInterval &interval) const override
Calculate the time interval between this and another raw time.
Definition RawTime.cpp:23
Fw::SerializeStatus deserialize(Fw::SerializeBufferBase &buffer) override
Deserialize the contents of the RawTimeInterface object from a buffer.
Definition RawTime.cpp:57
Fw::SerializeStatus serialize(Fw::SerializeBufferBase &buffer) const override
Serialize the contents of the RawTimeInterface object into a buffer.
Definition RawTime.cpp:47
RawTimeHandle * getHandle() override
return the underlying RawTime handle (implementation specific)
Definition RawTime.cpp:74
static const FwSizeType SERIALIZED_SIZE
Definition RawTime.hpp:25
@ OP_OK
Operation was successful.
Definition RawTime.hpp:28
SerializeStatus
forward declaration for string
@ FW_SERIALIZE_OK
Serialization/Deserialization operation was successful.
RawTime::Status errno_to_rawtime_status(PlatformIntType errno_input)
Definition error.cpp:131