5 #ifndef UAVCAN_PROTOCOL_DYNAMIC_NODE_ID_SERVER_NODE_DISCOVERER_HPP_INCLUDED 6 #define UAVCAN_PROTOCOL_DYNAMIC_NODE_ID_SERVER_NODE_DISCOVERER_HPP_INCLUDED 19 #include <uavcan/protocol/NodeStatus.hpp> 20 #include <uavcan/protocol/GetNodeInfo.hpp> 24 namespace dynamic_node_id_server
83 , num_get_node_info_attempts(0)
93 enum { MaxAttemptsToGetNodeInfo = 5 };
95 enum { TimerPollIntervalMs = 170 };
118 node_map_.
remove(node_id);
125 const NodeMap::KVPair*
const pair = node_map_.
getByIndex(0);
136 if (committed_node_mask_[node_id.
get()])
158 committed_node_mask_[node_id.
get()] =
true;
174 node_id = pickNextNodeToQuery();
177 if (needToQuery(node_id))
200 if (needToQuery(node_id))
210 UAVCAN_TRACE(
"dynamic_node_id_server::NodeDiscoverer",
"GetNodeInfo response from %d",
211 int(result.
getCallID().server_node_id.get()));
212 finalizeNodeDiscovery(&result.
getResponse().hardware_version.unique_id, result.
getCallID().server_node_id);
225 "GetNodeInfo request to %d has timed out, %d attempts",
226 int(result.
getCallID().server_node_id.get()),
int(data->num_get_node_info_attempts));
227 data->num_get_node_info_attempts++;
228 if (data->num_get_node_info_attempts >= MaxAttemptsToGetNodeInfo)
243 const NodeID node_id = pickNextNodeToQueryAndCleanupMap();
258 UAVCAN_TRACE(
"dynamic_node_id_server::NodeDiscoverer",
"Requesting GetNodeInfo from node %d",
260 const int res = get_node_info_client_.
call(node_id, protocol::GetNodeInfo::Request());
263 getNode().registerInternalFailure(
"NodeDiscoverer GetNodeInfo call");
282 getNode().registerInternalFailure(
"NodeDiscoverer OOM");
307 , node_map_(node.getAllocator())
308 , get_node_info_client_(node)
309 , node_status_sub_(node)
314 int res = get_node_info_client_.
init(priority);
348 #endif // Include guard TraceDiscoveryNewNodeFound
void remove(const Key &key)
TraceDiscoveryNodeRemoved
ServiceClient< protocol::GetNodeInfo, GetNodeInfoResponseCallback > get_node_info_client_
NodeID pickNextNodeToQueryAndCleanupMap()
ServiceCallID getCallID() const
NodeID getSrcNodeID() const
uint8_t getNumUnknownNodes() const
bool needToQuery(NodeID node_id)
Value * insert(const Key &key, const Value &value)
virtual void handleNewNodeDiscovery(const UniqueID *unique_id_or_null, NodeID node_id)=0
TraceDiscoveryNodeRestartDetected
TraceDiscoveryNodeFinalized
virtual NodeAwareness checkNodeAwareness(NodeID node_id) const =0
virtual void onEvent(TraceCode event_code, int64_t event_argument)=0
Map< NodeID, NodeData > NodeMap
#define UAVCAN_TRACE(...)
bool hasPendingCalls() const
void handleGetNodeInfoResponse(const ServiceCallResult< protocol::GetNodeInfo > &result)
TraceDiscoveryCommitCacheUpdated
INodeDiscoveryHandler & handler_
NodeID pickNextNodeToQuery() const
protocol::dynamic_node_id::server::Entry::FieldTypes::unique_id UniqueID
void trace(TraceCode code, int64_t argument)
void handleTimerEvent(const TimerEvent &)
NodeDiscoverer(INode &node, IEventTracer &tracer, INodeDiscoveryHandler &handler)
void finalizeNodeDiscovery(const UniqueID *unique_id_or_null, NodeID node_id)
uint32_t last_seen_uptime
bool hasUnknownNodes() const
int start(const Callback &callback)
TraceDiscoveryGetNodeInfoRequest
const ResponseFieldType & getResponse() const
BitSet< NodeID::Max+1 > committed_node_mask_
Nodes that are marked will not be queried.
void handleNodeStatus(const ReceivedDataStructure< protocol::NodeStatus > &msg)
void setCallback(const Callback &cb)
int init(const TransferPriority priority)
virtual ~INodeDiscoveryHandler()
Value * access(const Key &key)
static MonotonicDuration fromMSec(int64_t ms)
void removeNode(const NodeID node_id)
Subscriber< protocol::NodeStatus, NodeStatusCallback > node_status_sub_
int call(NodeID server_node_id, const RequestType &request)
bool isSuccessful() const
TraceDiscoveryGetNodeInfoFailure
virtual bool canDiscoverNewNodes() const =0
KVPair * getByIndex(unsigned index)
uint8_t num_get_node_info_attempts