Go to the documentation of this file.
13 UAVCAN_TRACE(
"DynamicNodeIDClient",
"Client terminated");
33 protocol::dynamic_node_id::Allocation::MAX_REQUEST_PERIOD_MS) :
35 protocol::dynamic_node_id::Allocation::MAX_FOLLOWUP_DELAY_MS);
39 UAVCAN_TRACE(
"DynamicNodeIDClient",
"Restart mode %d, delay %d ms",
40 static_cast<int>(mode),
static_cast<int>(delay.
toMSec()));
58 protocol::dynamic_node_id::Allocation tx;
62 const uint8_t size_of_unique_id_in_request =
63 min(protocol::dynamic_node_id::Allocation::MAX_LENGTH_OF_UNIQUE_ID_IN_REQUEST,
66 tx.unique_id.resize(size_of_unique_id_in_request);
69 tx.unique_id.begin());
82 UAVCAN_TRACE(
"DynamicNodeIDClient",
"Broadcasting; preferred ID %d, size of UID %d",
84 static_cast<int>(tx.unique_id.size()));
102 UAVCAN_TRACE(
"DynamicNodeIDClient",
"Allocation message from %d, %d bytes of unique ID, node ID %d",
103 static_cast<int>(msg.
getSrcNodeID().get()),
static_cast<int>(msg.unique_id.size()),
104 static_cast<int>(msg.node_id));
115 const bool full_response = (msg.unique_id.size() == msg.unique_id.capacity());
118 msg.unique_id.empty() ||
119 (full_response && (msg.node_id == 0)))
136 UAVCAN_TRACE(
"DynamicNodeIDClient",
"Allocation complete, node ID %d provided by %d",
148 const NodeID preferred_node_id,
161 bool unique_id_is_zero =
true;
166 unique_id_is_zero =
false;
171 if (unique_id_is_zero)
173 return -ErrInvalidParam;
176 if (!preferred_node_id.
isValid())
178 return -ErrInvalidParam;
void restartTimer(const Mode mode)
int start(const UniqueID &unique_id, const NodeID preferred_node_id=NodeID::Broadcast, const TransferPriority transfer_priority=TransferPriority::OneHigherThanLowest)
NodeID allocated_node_id_
MethodBinder< DynamicNodeIDClient *, void(DynamicNodeIDClient::*)(const ReceivedDataStructure< protocol::dynamic_node_id::Allocation > &)> AllocationCallback
NodeID allocator_node_id_
static MonotonicDuration fromMSec(int64_t ms)
bool isAllocationComplete() const
static MonotonicDuration getRandomDuration(uint32_t lower_bound_msec, uint32_t upper_bound_msec)
#define UAVCAN_TRACE(...)
Subscriber< protocol::dynamic_node_id::Allocation, AllocationCallback > dnida_sub_
Publisher< protocol::dynamic_node_id::Allocation > dnida_pub_
void allowAnonymousTransfers()
virtual void registerInternalFailure(const char *msg)=0
static const uavcan::int16_t ErrLogic
Internal logic error.
protocol::HardwareVersion::FieldTypes::unique_id UniqueID
uint8_t size_of_received_unique_id_
UAVCAN_EXPORT bool equal(InputIt1 first1, InputIt1 last1, InputIt2 first2)
NodeID preferred_node_id_
const UAVCAN_EXPORT T & min(const T &a, const T &b)
void handleAllocation(const ReceivedDataStructure< protocol::dynamic_node_id::Allocation > &msg)
virtual void handleTimerEvent(const TimerEvent &)
int broadcast(const DataType &message)
void setPriority(const TransferPriority prio)
NodeID getSrcNodeID() const
void startOneShotWithDelay(MonotonicDuration delay)
UAVCAN_EXPORT OutputIt copy(InputIt first, InputIt last, OutputIt result)
uint8_t unique_id_[protocol::HardwareVersion::FieldTypes::unique_id::MaxSize]
@ ModeDelayBeforeFollowup
bool isAnonymousTransfer() const