#ifndef MESHCOP_TIMESTAMP_HPP_
#define MESHCOP_TIMESTAMP_HPP_
#include "openthread-core-config.h"
#include <string.h>
#include <openthread/platform/toolchain.h>
#include "common/encoding.hpp"
namespace ot {
namespace MeshCoP {
using ot::Encoding::BigEndian::HostSwap16;
using ot::Encoding::BigEndian::HostSwap32;
OT_TOOL_PACKED_BEGIN
class Timestamp
{
public:
void Init(void) { memset(this, 0, sizeof(*this)); }
int Compare(const Timestamp &aCompare) const;
uint64_t GetSeconds(void) const
{
return (static_cast<uint64_t>(HostSwap16(mSeconds16)) << 32) + HostSwap32(mSeconds32);
}
void SetSeconds(uint64_t aSeconds)
{
mSeconds16 = HostSwap16(static_cast<uint16_t>(aSeconds >> 32));
mSeconds32 = HostSwap32(static_cast<uint32_t>(aSeconds & 0xffffffff));
}
uint16_t GetTicks(void) const { return HostSwap16(mTicks) >> kTicksOffset; }
void SetTicks(uint16_t aTicks)
{
mTicks = HostSwap16((HostSwap16(mTicks) & ~kTicksMask) | ((aTicks << kTicksOffset) & kTicksMask));
}
bool GetAuthoritative(void) const { return (HostSwap16(mTicks) & kAuthoritativeMask) != 0; }
void SetAuthoritative(bool aAuthoritative)
{
mTicks = HostSwap16((HostSwap16(mTicks) & kTicksMask) |
((aAuthoritative << kAuthoritativeOffset) & kAuthoritativeMask));
}
private:
enum
{
kTicksOffset = 1,
kTicksMask = 0x7fff << kTicksOffset,
kAuthoritativeOffset = 0,
kAuthoritativeMask = 1 << kAuthoritativeOffset,
};
uint16_t mSeconds16; uint32_t mSeconds32; uint16_t mTicks;
} OT_TOOL_PACKED_END;
} }
#endif