From 35fd6342822f1659099ddb4e259e75c5d7287e12 Mon Sep 17 00:00:00 2001 From: Pavel Kirienko Date: Sun, 5 Jul 2015 09:54:54 +0300 Subject: [PATCH] Configurable priority in high-level protocol logic classes --- .../include/uavcan/protocol/firmware_update_trigger.hpp | 5 +++-- .../include/uavcan/protocol/global_time_sync_master.hpp | 9 ++++----- libuavcan/include/uavcan/protocol/logger.hpp | 5 ++--- .../include/uavcan/protocol/node_info_retriever.hpp | 4 ++-- .../include/uavcan/protocol/node_status_provider.hpp | 2 +- libuavcan/include/uavcan/protocol/panic_broadcaster.hpp | 5 ++++- libuavcan/include/uavcan/transport/transfer.hpp | 1 + libuavcan/src/protocol/uc_node_status_provider.cpp | 2 +- libuavcan/src/transport/uc_transfer.cpp | 1 + 9 files changed, 19 insertions(+), 15 deletions(-) diff --git a/libuavcan/include/uavcan/protocol/firmware_update_trigger.hpp b/libuavcan/include/uavcan/protocol/firmware_update_trigger.hpp index 788536c07c..1016add7e1 100644 --- a/libuavcan/include/uavcan/protocol/firmware_update_trigger.hpp +++ b/libuavcan/include/uavcan/protocol/firmware_update_trigger.hpp @@ -396,7 +396,8 @@ public: * @return Negative error code. */ int start(NodeInfoRetriever& node_info_retriever, - const FirmwareFilePath& arg_common_path_prefix = FirmwareFilePath()) + const FirmwareFilePath& arg_common_path_prefix = FirmwareFilePath(), + const TransferPriority priority = TransferPriority::OneHigherThanLowest) { /* * Configuring the node info retriever @@ -423,7 +424,7 @@ public: /* * Initializing the client */ - res = begin_fw_update_client_.init(); + res = begin_fw_update_client_.init(priority); if (res < 0) { return res; diff --git a/libuavcan/include/uavcan/protocol/global_time_sync_master.hpp b/libuavcan/include/uavcan/protocol/global_time_sync_master.hpp index e3a3a69849..69261af068 100644 --- a/libuavcan/include/uavcan/protocol/global_time_sync_master.hpp +++ b/libuavcan/include/uavcan/protocol/global_time_sync_master.hpp @@ -46,14 +46,13 @@ class UAVCAN_EXPORT GlobalTimeSyncMaster : protected LoopbackFrameListenerBase UAVCAN_ASSERT(iface_index < MaxCanIfaces); } - int init(TransferPriority priority = TransferPriority::OneLowerThanHighest) + int init(TransferPriority priority) { - const int res = pub_.init(); + const int res = pub_.init(priority); if (res >= 0) { pub_.getTransferSender().setIfaceMask(uint8_t(1 << iface_index_)); pub_.getTransferSender().setCanIOFlags(CanIOFlagLoopback); - pub_.setPriority(priority); } return res; } @@ -152,7 +151,7 @@ public: * Must be called before the master can be used. * Returns negative error code. */ - int init() + int init(const TransferPriority priority = TransferPriority::OneLowerThanHighest) { if (initialized_) { @@ -176,7 +175,7 @@ public: { iface_masters_[i].construct(node_, i); } - res = iface_masters_[i]->init(); + res = iface_masters_[i]->init(priority); if (res < 0) { break; diff --git a/libuavcan/include/uavcan/protocol/logger.hpp b/libuavcan/include/uavcan/protocol/logger.hpp index fd57a0fcd8..017de4dc18 100644 --- a/libuavcan/include/uavcan/protocol/logger.hpp +++ b/libuavcan/include/uavcan/protocol/logger.hpp @@ -94,14 +94,13 @@ public: * Must be called once before use. * Returns negative error code. */ - int init(TransferPriority priority = TransferPriority::OneHigherThanLowest) + int init(const TransferPriority priority = TransferPriority::Lowest) { - const int res = logmsg_pub_.init(); + const int res = logmsg_pub_.init(priority); if (res < 0) { return res; } - logmsg_pub_.setPriority(priority); // Fixed priority return 0; } diff --git a/libuavcan/include/uavcan/protocol/node_info_retriever.hpp b/libuavcan/include/uavcan/protocol/node_info_retriever.hpp index 00458efbea..cb805a7b84 100644 --- a/libuavcan/include/uavcan/protocol/node_info_retriever.hpp +++ b/libuavcan/include/uavcan/protocol/node_info_retriever.hpp @@ -346,7 +346,7 @@ public: * Destroy the object to stop it. * Returns negative error code. */ - int start() + int start(const TransferPriority priority = TransferPriority::OneHigherThanLowest) { int res = NodeStatusMonitor::start(); if (res < 0) @@ -354,7 +354,7 @@ public: return res; } - res = get_node_info_client_.init(); + res = get_node_info_client_.init(priority); if (res < 0) { return res; diff --git a/libuavcan/include/uavcan/protocol/node_status_provider.hpp b/libuavcan/include/uavcan/protocol/node_status_provider.hpp index 529d962097..859a99ab77 100644 --- a/libuavcan/include/uavcan/protocol/node_status_provider.hpp +++ b/libuavcan/include/uavcan/protocol/node_status_provider.hpp @@ -61,7 +61,7 @@ public: * Starts the provider and immediately broadcasts uavcan.protocol.NodeStatus. * Returns negative error code. */ - int startAndPublish(TransferPriority priority = TransferPriority::Default); + int startAndPublish(const TransferPriority priority = TransferPriority::Default); /** * Publish the message uavcan.protocol.NodeStatus right now, out of schedule. diff --git a/libuavcan/include/uavcan/protocol/panic_broadcaster.hpp b/libuavcan/include/uavcan/protocol/panic_broadcaster.hpp index 0eff9bfc87..685fd13831 100644 --- a/libuavcan/include/uavcan/protocol/panic_broadcaster.hpp +++ b/libuavcan/include/uavcan/protocol/panic_broadcaster.hpp @@ -48,7 +48,8 @@ public: * @param short_reason Short ASCII string that describes the reason of the panic, 7 characters max. * If the string exceeds 7 characters, it will be truncated. */ - void panic(const char* short_reason_description) + void panic(const char* short_reason_description, + const TransferPriority priority = TransferPriority::Default) { msg_.reason_text.clear(); const char* p = short_reason_description; @@ -64,6 +65,8 @@ public: UAVCAN_TRACE("PanicBroadcaster", "Panicking with reason '%s'", getReason().c_str()); + pub_.setPriority(priority); + publishOnce(); startPeriodic(MonotonicDuration::fromMSec(protocol::Panic::BROADCASTING_PERIOD_MS)); } diff --git a/libuavcan/include/uavcan/transport/transfer.hpp b/libuavcan/include/uavcan/transport/transfer.hpp index 1edaf4368c..4d6e7a712f 100644 --- a/libuavcan/include/uavcan/transport/transfer.hpp +++ b/libuavcan/include/uavcan/transport/transfer.hpp @@ -38,6 +38,7 @@ public: static const TransferPriority MiddleLower; static const TransferPriority OneHigherThanLowest; static const TransferPriority OneLowerThanHighest; + static const TransferPriority Lowest; TransferPriority() : value_(0xFF) { } diff --git a/libuavcan/src/protocol/uc_node_status_provider.cpp b/libuavcan/src/protocol/uc_node_status_provider.cpp index e4f36bc470..f142f97c79 100644 --- a/libuavcan/src/protocol/uc_node_status_provider.cpp +++ b/libuavcan/src/protocol/uc_node_status_provider.cpp @@ -50,7 +50,7 @@ void NodeStatusProvider::handleGetNodeInfoRequest(const protocol::GetNodeInfo::R rsp = node_info_; } -int NodeStatusProvider::startAndPublish(TransferPriority priority) +int NodeStatusProvider::startAndPublish(const TransferPriority priority) { if (!isNodeInfoInitialized()) { diff --git a/libuavcan/src/transport/uc_transfer.cpp b/libuavcan/src/transport/uc_transfer.cpp index d0c0f981d9..bb5af287b3 100644 --- a/libuavcan/src/transport/uc_transfer.cpp +++ b/libuavcan/src/transport/uc_transfer.cpp @@ -19,6 +19,7 @@ const TransferPriority TransferPriority::Default((1U << BitLen) / 2); const TransferPriority TransferPriority::MiddleLower((1U << BitLen) / 2 + (1U << BitLen) / 4); const TransferPriority TransferPriority::OneHigherThanLowest(NumericallyMax - 1); const TransferPriority TransferPriority::OneLowerThanHighest(NumericallyMin + 1); +const TransferPriority TransferPriority::Lowest(NumericallyMax); /** * TransferID