/* * Copyright (C) 2014 Pavel Kirienko */ #pragma once #include #include #include namespace uavcan { template class ComponentStatusManager { public: typedef typename StorageType::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 void setComponentStatus(ComponentIndexType component_index, StatusCode status_code) { const unsigned compidx = static_cast(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 = max(result, status_array[i]); } return result; } }; template const unsigned ComponentStatusManager::NumComponents; }