Go to the documentation of this file.
5 #ifndef UAVCAN_PROTOCOL_FIRMWARE_UPDATE_TRIGGER_HPP_INCLUDED
6 #define UAVCAN_PROTOCOL_FIRMWARE_UPDATE_TRIGGER_HPP_INCLUDED
15 #include <uavcan/protocol/file/BeginFirmwareUpdate.hpp>
76 const protocol::file::BeginFirmwareUpdate::Response& error_response,
90 const protocol::file::BeginFirmwareUpdate::Response& response)
192 UAVCAN_TRACE(
"FirmwareUpdateTrigger",
"Node ID %d could not provide GetNodeInfo response",
int(node_id.
get()));
202 UAVCAN_TRACE(
"FirmwareUpdateTrigger",
"Node ID %d requires update; file path: %s",
203 int(node_id.
get()), firmware_file_path.
c_str());
208 UAVCAN_TRACE(
"FirmwareUpdateTrigger",
"Node ID %d does not need update",
int(node_id.
get()));
215 if (event.
status.
mode == protocol::NodeStatus::MODE_OFFLINE)
272 UAVCAN_TRACE(
"FirmwareUpdateTrigger",
"Next node ID to query: %d, pending nodes: %u, pending calls: %u",
282 UAVCAN_TRACE(
"FirmwareUpdateTrigger",
"Request to %d has timed out, will retry",
283 int(result.
getCallID().server_node_id.get()));
294 const bool confirmed =
295 result.
getResponse().error == protocol::file::BeginFirmwareUpdate::Response::ERROR_OK ||
296 result.
getResponse().error == protocol::file::BeginFirmwareUpdate::Response::ERROR_IN_PROGRESS;
300 UAVCAN_TRACE(
"FirmwareUpdateTrigger",
"Node %d confirmed the update request",
301 int(result.
getCallID().server_node_id.get()));
311 const bool update_needed =
316 UAVCAN_TRACE(
"FirmwareUpdateTrigger",
"Node %d does not need retry",
317 int(result.
getCallID().server_node_id.get()));
345 protocol::file::BeginFirmwareUpdate::Request req;
351 req.image_file_remote_path.path.push_back(protocol::file::Path::SEPARATOR);
353 req.image_file_remote_path.path += path->
c_str();
355 UAVCAN_TRACE(
"FirmwareUpdateTrigger",
"Request to %d with path: %s",
356 int(node_id.
get()), req.image_file_remote_path.path.c_str());
476 #endif // Include guard
NextNodeIDSearchPredicate(const FirmwareUpdateTrigger &arg_owner)
const std::string response
void removeListener(INodeInfoListener *listener)
void resize(SizeType new_size, const ValueType &filler)
EnableIf< sizeof((reinterpret_cast< const R * >0)) -> size()) &&sizeof((*(reinterpret_cast< const R * >(0)))[0])
unsigned getNumPendingNodes() const
FirmwareFilePath common_path_prefix_
virtual ~IFirmwareVersionChecker()
virtual void handleNodeInfoUnavailable(NodeID node_id)
ServiceCallID getCallID() const
IFirmwareVersionChecker::FirmwareFilePath FirmwareFilePath
NodeInfoRetriever * node_info_retriever_
uint8_t last_queried_node_id_
virtual void handleFirmwareUpdateConfirmation(NodeID node_id, const protocol::file::BeginFirmwareUpdate::Response &response)
@ MaxFirmwareFilePathLength
#define UAVCAN_TRACE(...)
void handleBeginFirmwareUpdateResponse(const ServiceCallResult< protocol::file::BeginFirmwareUpdate > &result)
MonotonicDuration request_interval_
bool operator()(const NodeID node_id, const FirmwareFilePath &)
void startPeriodic(MonotonicDuration period)
virtual void handleNodeStatusChange(const NodeStatusMonitor::NodeStatusChangeEvent &event)
MakeString< MaxFirmwareFilePathLength >::Type FirmwareFilePath
void setRequestInterval(const MonotonicDuration interval)
virtual void handleNodeInfoRetrieved(const NodeID node_id, const protocol::GetNodeInfo::Response &node_info)
virtual void registerInternalFailure(const char *msg)=0
NodeID pickNextNodeID() const
static const TransferPriority OneHigherThanLowest
bool isTimerRunning() const
FirmwareUpdateTrigger(INode &node, IFirmwareVersionChecker &checker)
virtual bool shouldRequestFirmwareUpdate(NodeID node_id, const protocol::GetNodeInfo::Response &node_info, FirmwareFilePath &out_firmware_file_path)=0
const UAVCAN_EXPORT T & min(const T &a, const T &b)
void trySetPendingNode(const NodeID node_id, const FirmwareFilePath &path)
const ResponseFieldType & getResponse() const
bool isSuccessful() const
@ DefaultRequestIntervalMs
Map< NodeID, FirmwareFilePath > pending_nodes_
virtual void handleTimerEvent(const TimerEvent &)
int addListener(INodeInfoListener *listener)
ServiceClient< protocol::file::BeginFirmwareUpdate, BeginFirmwareUpdateResponseCallback > begin_fw_update_client_
MethodBinder< FirmwareUpdateTrigger *, void(FirmwareUpdateTrigger::*)(const ServiceCallResult< protocol::file::BeginFirmwareUpdate > &)> BeginFirmwareUpdateResponseCallback
int start(NodeInfoRetriever &node_info_retriever, const FirmwareFilePath &arg_common_path_prefix=FirmwareFilePath(), const TransferPriority priority=TransferPriority::OneHigherThanLowest)
const char * c_str() const
IFirmwareVersionChecker & checker_
MonotonicDuration getRequestInterval() const
virtual bool shouldRetryFirmwareUpdate(NodeID node_id, const protocol::file::BeginFirmwareUpdate::Response &error_response, FirmwareFilePath &out_firmware_file_path)=0
const FirmwareUpdateTrigger & owner