diff --git a/src/modules/uavcan/uavcan_main.cpp b/src/modules/uavcan/uavcan_main.cpp index c38ff8738b..fb9223a6a2 100644 --- a/src/modules/uavcan/uavcan_main.cpp +++ b/src/modules/uavcan/uavcan_main.cpp @@ -1121,6 +1121,24 @@ UavcanNode::ioctl(file *filp, int cmd, unsigned long arg) } break; + case UAVCAN_IOCG_NODEID_INPROGRESS: { + UavcanServers *_servers = UavcanServers::instance(); + + if (_servers == nullptr) { + // status unavailable + ret = -EINVAL; + break; + } else if (_servers->guessIfAllDynamicNodesAreAllocated()) { + // node discovery complete + ret = -ETIME; + break; + } else { + // node discovery in progress + ret = OK; + break; + } + } + default: ret = -ENOTTY; break; diff --git a/src/modules/uavcan/uavcan_servers.hpp b/src/modules/uavcan/uavcan_servers.hpp index b8190fc57f..17e94cd311 100644 --- a/src/modules/uavcan/uavcan_servers.hpp +++ b/src/modules/uavcan/uavcan_servers.hpp @@ -100,6 +100,8 @@ public: void requestCheckAllNodesFirmwareAndUpdate() { _check_fw = true; } + bool guessIfAllDynamicNodesAreAllocated() { return _server_instance.guessIfAllDynamicNodesAreAllocated(); } + private: pthread_t _subnode_thread; pthread_mutex_t _subnode_mutex;