13 UAVCAN_TRACE(
"DynamicNodeIDClient",
"Client terminated");
23 static_cast<uint32_t>(
std::rand()) % (upper_bound_msec - lower_bound_msec));
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",
141 size_of_received_unique_id_ = msg.unique_id.size();
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;
NodeID allocator_node_id_
UAVCAN_EXPORT bool equal(InputIt1 first1, InputIt1 last1, InputIt2 first2)
void setPriority(const TransferPriority prio)
NodeID getSrcNodeID() const
uint8_t unique_id_[protocol::HardwareVersion::FieldTypes::unique_id::MaxSize]
void allowAnonymousTransfers()
Publisher< protocol::dynamic_node_id::Allocation > dnida_pub_
static MonotonicDuration getRandomDuration(uint32_t lower_bound_msec, uint32_t upper_bound_msec)
#define UAVCAN_TRACE(...)
bool isAllocationComplete() const
protocol::HardwareVersion::FieldTypes::unique_id UniqueID
UAVCAN_EXPORT OutputIt copy(InputIt first, InputIt last, OutputIt result)
void startOneShotWithDelay(MonotonicDuration delay)
Subscriber< protocol::dynamic_node_id::Allocation, AllocationCallback > dnida_sub_
virtual void registerInternalFailure(const char *msg)=0
void handleAllocation(const ReceivedDataStructure< protocol::dynamic_node_id::Allocation > &msg)
UAVCAN_EXPORT const T & min(const T &a, const T &b)
virtual void handleTimerEvent(const TimerEvent &)
bool isAnonymousTransfer() const
uint8_t size_of_received_unique_id_
NodeID preferred_node_id_
static MonotonicDuration fromMSec(int64_t ms)
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_
int broadcast(const DataType &message)
MethodBinder< DynamicNodeIDClient *, void(DynamicNodeIDClient::*)(const ReceivedDataStructure< protocol::dynamic_node_id::Allocation > &)> AllocationCallback
static const uavcan::int16_t ErrLogic
Internal logic error.