5 #ifndef UAVCAN_PROTOCOL_GLOBAL_TIME_SYNC_MASTER_HPP_INCLUDED 6 #define UAVCAN_PROTOCOL_GLOBAL_TIME_SYNC_MASTER_HPP_INCLUDED 13 #include <uavcan/protocol/GlobalTimeSync.hpp> 44 , iface_index_(iface_index)
51 const int res = pub_.
init(priority);
68 if (!prev_tx_utc_.
isZero())
83 iface_prev_pub_mono_ = current_time;
85 const bool long_period = since_prev_pub.
toMSec() >= protocol::GlobalTimeSync::MAX_BROADCASTING_PERIOD_MS;
87 protocol::GlobalTimeSync msg;
88 msg.previous_transmission_timestamp_usec = long_period ? 0 : prev_tx_utc_.
toUSec();
91 UAVCAN_TRACE(
"GlobalTimeSyncMaster",
"Publishing %llu iface=%i tid=%i",
92 static_cast<unsigned long long>(msg.previous_transmission_timestamp_usec),
93 int(iface_index_),
int(tid.
get()));
146 , initialized_(false)
166 return -ErrUnknownDataType;
168 dtid_ = desc->
getID();
174 if (!iface_masters_[i].isConstructed())
178 res = iface_masters_[i]->init(priority);
186 initialized_ = res >= 0;
214 const int res =
init();
228 if (since_prev_pub.
toMSec() < protocol::GlobalTimeSync::MIN_BROADCASTING_PERIOD_MS)
230 UAVCAN_TRACE(
"GlobalTimeSyncMaster",
"Publication skipped");
233 prev_pub_mono_ = current_time;
241 const int tid_res = getNextTransferID(tid);
250 const int res = iface_masters_[i]->publish(tid, current_time);
262 #endif // UAVCAN_PROTOCOL_GLOBAL_TIME_SYNC_MASTER_HPP_INCLUDED
uint8_t getNumIfaces() const
TransferType getTransferType() const
bool isStartOfTransfer() const
int getNextTransferID(TransferID &tid)
Dispatcher & getDispatcher()
IfaceMaster(INode &node, uint8_t iface_index)
static const NodeID Broadcast
void setTxTimestamp(UtcTime ts)
DataTypeID getDataTypeID() const
void setIfaceMask(uint8_t iface_mask)
const CanIOManager & getCanIOManager() const
const DataTypeDescriptor * find(const char *name) const
int init(TransferPriority priority)
uint8_t getIfaceMask() const
TransferSender & getTransferSender()
bool isInitialized() const
#define UAVCAN_TRACE(...)
int publish(TransferID tid, MonotonicTime current_time)
Implicitly convertible to/from uavcan.Timestamp.
const uint8_t iface_index_
bool isEndOfTransfer() const
virtual void handleLoopbackFrame(const RxFrame &frame)
virtual void registerInternalFailure(const char *msg)=0
MonotonicTime iface_prev_pub_mono_
NodeID getSrcNodeID() const
uint8_t getIfaceIndex() const
int init(const TransferPriority priority=TransferPriority::OneLowerThanHighest)
GlobalTimeSyncMaster(INode &node)
static GlobalDataTypeRegistry & instance()
MonotonicTime prev_pub_mono_
UtcTime getUtcTimestamp() const
Publisher< protocol::GlobalTimeSync > pub_
CanIOFlags getCanIOFlags() const
TransferID * accessOrCreate(const OutgoingTransferRegistryKey &key, MonotonicTime new_deadline)
static const CanIOFlags CanIOFlagLoopback
void setCanIOFlags(CanIOFlags flags)
static MonotonicDuration fromMSec(int64_t ms)
MonotonicTime getMonotonicTime() const
static const TransferPriority OneLowerThanHighest
int broadcast(const DataType &message)
OutgoingTransferRegistry & getOutgoingTransferRegistry()
static const uavcan::int16_t ErrLogic
Internal logic error.