Using transfer priorities in protocol:: classes

This commit is contained in:
Pavel Kirienko
2015-04-30 14:19:52 +03:00
parent 2bfadc46b4
commit 20feaba1de
8 changed files with 47 additions and 14 deletions
+7 -4
View File
@@ -145,8 +145,10 @@ public:
* Once started, the node can't stop.
* If the node failed to start up, it's recommended to destroy the current node instance and start over.
* Returns negative error code.
* @param node_status_transfer_priority Transfer priority that will be used for outgoing NodeStatus messages.
* Normal priority is used by default.
*/
int start();
int start(const TransferPriority node_status_transfer_priority = TransferPriorityNormal);
#if !UAVCAN_TINY
/**
@@ -260,7 +262,8 @@ public:
template <std::size_t MemPoolSize_, unsigned OutgoingTransferRegistryStaticEntries,
unsigned OutgoingTransferMaxPayloadLen>
int Node<MemPoolSize_, OutgoingTransferRegistryStaticEntries, OutgoingTransferMaxPayloadLen>::start()
int Node<MemPoolSize_, OutgoingTransferRegistryStaticEntries, OutgoingTransferMaxPayloadLen>::start(
const TransferPriority priority)
{
if (started_)
{
@@ -274,7 +277,7 @@ int Node<MemPoolSize_, OutgoingTransferRegistryStaticEntries, OutgoingTransferMa
{
goto fail;
}
res = proto_nsp_.startAndPublish();
res = proto_nsp_.startAndPublish(priority);
if (res < 0)
{
goto fail;
@@ -322,7 +325,7 @@ checkNetworkCompatibility(NetworkCompatibilityCheckResult& result)
}
NetworkCompatibilityChecker checker(*this);
StaticAssert<(sizeof(checker) < 2048)>::check();
StaticAssert<(sizeof(checker) < 2048)>::check(); // Making sure that the code footprint doesn't explode
res = checker.execute();
result = checker.getResult();
return res;
+9 -5
View File
@@ -100,22 +100,26 @@ public:
/**
* Allows to change the priority of outgoing transfers.
* Note that only High, Normal and Low priorities can be used; Service priority is not available for messages.
* Attempt to use Service priority will result in assertion failure in debug builds, and it will have no
* effect in release builds.
* Returns negative error code if priority cannot be set, non-negative on success.
*/
void setPriority(const TransferPriority prio)
int setPriority(const TransferPriority prio)
{
if (prio < NumTransferPriorities && prio != TransferPriorityService)
{
TransferSender* const ts = getTransferSender();
TransferSender* const ts = getTransferSender(); // TODO: Static TransferSender?
if (ts != NULL)
{
ts->setPriority(prio);
return 0;
}
else
{
return -ErrLogic;
}
}
else
{
UAVCAN_ASSERT(0);
return -ErrInvalidParam;
}
}
@@ -58,11 +58,14 @@ public:
* @param hardware_version Hardware version information, where unique_id must be set correctly.
* @param preferred_node_id Node ID that the application would like to take; set to broadcast (zero) if
* the application doesn't have any preference (this is default).
* @param transfer_priority Transfer priority, Normal by default.
* @return Zero on success
* Negative error code on failure
* -ErrLogic if 1. the node is not in passive mode or 2. the client is already started
*/
int start(const protocol::HardwareVersion& hardware_version, const NodeID preferred_node_id = NodeID::Broadcast);
int start(const protocol::HardwareVersion& hardware_version,
const NodeID preferred_node_id = NodeID::Broadcast,
const TransferPriority transfer_priority = TransferPriorityNormal);
/**
* Use this method to determine when allocation is complete.
@@ -68,7 +68,7 @@ public:
* Starts the provider and immediately broadcasts uavcan.protocol.NodeStatus.
* Returns negative error code.
*/
int startAndPublish();
int startAndPublish(TransferPriority priority = TransferPriorityNormal);
/**
* Publish the message uavcan.protocol.NodeStatus right now, out of schedule.
@@ -114,7 +114,8 @@ void DynamicNodeIDAllocationClient::handleAllocation(
}
int DynamicNodeIDAllocationClient::start(const protocol::HardwareVersion& hardware_version,
const NodeID preferred_node_id)
const NodeID preferred_node_id,
const TransferPriority transfer_priority)
{
terminate();
@@ -161,6 +162,11 @@ int DynamicNodeIDAllocationClient::start(const protocol::HardwareVersion& hardwa
return res;
}
dnida_pub_.allowAnonymousTransfers();
res = dnida_pub_.setPriority(transfer_priority);
if (res < 0)
{
return res;
}
res = dnida_sub_.start(AllocationCallback(this, &DynamicNodeIDAllocationClient::handleAllocation));
if (res < 0)
@@ -24,6 +24,12 @@ int GlobalTimeSyncMaster::IfaceMaster::init()
UAVCAN_ASSERT(ts != NULL);
ts->setIfaceMask(uint8_t(1 << iface_index_));
ts->setCanIOFlags(CanIOFlagLoopback);
const int prio_res = pub_.setPriority(TransferPriorityHigh); // Fixed priority
if (prio_res < 0)
{
return prio_res;
}
}
return res;
}
+6 -1
View File
@@ -17,7 +17,12 @@ Logger::LogLevel Logger::getExternalSinkLevel() const
int Logger::init()
{
return logmsg_pub_.init();
const int res = logmsg_pub_.init();
if (res < 0)
{
return res;
}
return logmsg_pub_.setPriority(TransferPriorityLow); // Fixed priority
}
int Logger::log(const protocol::debug::LogMessage& message)
@@ -61,7 +61,7 @@ void NodeStatusProvider::handleGetNodeInfoRequest(const protocol::GetNodeInfo::R
rsp = node_info_;
}
int NodeStatusProvider::startAndPublish()
int NodeStatusProvider::startAndPublish(TransferPriority priority)
{
if (!isNodeInfoInitialized())
{
@@ -71,6 +71,12 @@ int NodeStatusProvider::startAndPublish()
int res = -1;
res = node_status_pub_.setPriority(priority);
if (res < 0)
{
goto fail;
}
if (!getNode().isPassiveMode())
{
res = publish();