mirror of
https://gitee.com/mirrors_PX4/PX4-Autopilot.git
synced 2026-10-11 12:43:34 +08:00
ComponentStatusManager<>
This commit is contained in:
@@ -0,0 +1,57 @@
|
||||
/*
|
||||
* Copyright (C) 2014 Pavel Kirienko <pavel.kirienko@gmail.com>
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <uavcan/impl_constants.hpp>
|
||||
#include <uavcan/stdint.hpp>
|
||||
#include <uavcan/protocol/NodeStatus.hpp>
|
||||
|
||||
namespace uavcan
|
||||
{
|
||||
|
||||
template <unsigned NumComponents_>
|
||||
class ComponentStatusManager
|
||||
{
|
||||
public:
|
||||
typedef typename StorageType<protocol::NodeStatus::FieldTypes::status_code>::Type StatusCode;
|
||||
static const unsigned NumComponents = NumComponents_;
|
||||
|
||||
private:
|
||||
StatusCode status_array[NumComponents];
|
||||
|
||||
public:
|
||||
ComponentStatusManager(StatusCode default_status = protocol::NodeStatus::STATUS_OK)
|
||||
{
|
||||
for (unsigned i = 0; i < NumComponents; i++)
|
||||
{
|
||||
status_array[i] = default_status;
|
||||
}
|
||||
}
|
||||
|
||||
template <typename ComponentIndexType>
|
||||
void setComponentStatus(ComponentIndexType component_index, StatusCode status_code)
|
||||
{
|
||||
const unsigned compidx = static_cast<unsigned>(component_index); // This cast allows to use typesafe enums
|
||||
if (compidx < NumComponents)
|
||||
{
|
||||
status_array[compidx] = status_code;
|
||||
}
|
||||
}
|
||||
|
||||
StatusCode getWorstStatusCode() const
|
||||
{
|
||||
StatusCode result = 0;
|
||||
for (unsigned i = 0; i < NumComponents; i++)
|
||||
{
|
||||
result = std::max(result, status_array[i]);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
};
|
||||
|
||||
template <unsigned NumComponents_>
|
||||
const unsigned ComponentStatusManager<NumComponents_>::NumComponents;
|
||||
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
/*
|
||||
* Copyright (C) 2014 Pavel Kirienko <pavel.kirienko@gmail.com>
|
||||
*/
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
#include <uavcan/helpers/component_status_manager.hpp>
|
||||
|
||||
|
||||
TEST(ComponentStatusManager, Basic)
|
||||
{
|
||||
uavcan::ComponentStatusManager<4> csm;
|
||||
|
||||
ASSERT_EQ(4, uavcan::ComponentStatusManager<4>::NumComponents);
|
||||
ASSERT_EQ(uavcan::protocol::NodeStatus::STATUS_OK, csm.getWorstStatusCode());
|
||||
|
||||
csm.setComponentStatus(3, uavcan::protocol::NodeStatus::STATUS_WARNING);
|
||||
ASSERT_EQ(uavcan::protocol::NodeStatus::STATUS_WARNING, csm.getWorstStatusCode());
|
||||
|
||||
csm.setComponentStatus(2, uavcan::protocol::NodeStatus::STATUS_CRITICAL);
|
||||
ASSERT_EQ(uavcan::protocol::NodeStatus::STATUS_CRITICAL, csm.getWorstStatusCode());
|
||||
|
||||
csm.setComponentStatus(3, uavcan::protocol::NodeStatus::STATUS_INITIALIZING);
|
||||
ASSERT_EQ(uavcan::protocol::NodeStatus::STATUS_CRITICAL, csm.getWorstStatusCode());
|
||||
|
||||
csm.setComponentStatus(2, uavcan::protocol::NodeStatus::STATUS_INITIALIZING);
|
||||
ASSERT_EQ(uavcan::protocol::NodeStatus::STATUS_INITIALIZING, csm.getWorstStatusCode());
|
||||
}
|
||||
Reference in New Issue
Block a user