mirror of
https://gitee.com/mirrors_PX4/PX4-Autopilot.git
synced 2026-06-29 18:20:35 +08:00
NodeStatusMonitor update
This commit is contained in:
@@ -7,11 +7,13 @@
|
||||
#include <uavcan/protocol/node_status_provider.hpp>
|
||||
#include "helpers.hpp"
|
||||
|
||||
static void publishNodeStatus(CanDriverMock& can, uavcan::NodeID node_id, uavcan::uint8_t status_code,
|
||||
static void publishNodeStatus(CanDriverMock& can, uavcan::NodeID node_id,
|
||||
uavcan::uint8_t health, uavcan::uint8_t mode,
|
||||
uavcan::uint32_t uptime_sec, uavcan::TransferID tid)
|
||||
{
|
||||
uavcan::protocol::NodeStatus msg;
|
||||
msg.status_code = status_code;
|
||||
msg.health = health;
|
||||
msg.mode = mode;
|
||||
msg.uptime_sec = uptime_sec;
|
||||
emulateSingleFrameBroadcastTransfer(can, node_id, msg, tid);
|
||||
}
|
||||
@@ -46,38 +48,37 @@ TEST(NodeStatusMonitor, Basic)
|
||||
/*
|
||||
* Empty NSM, no nodes were registered yet
|
||||
*/
|
||||
ASSERT_FALSE(nsm.findNodeWithWorstStatus().isValid());
|
||||
ASSERT_FALSE(nsm.findNodeWithWorstHealth().isValid());
|
||||
|
||||
uavcan::NodeStatusMonitor::NodeStatus st = nsm.getNodeStatus(uavcan::NodeID(123));
|
||||
ASSERT_FALSE(st.known);
|
||||
ASSERT_EQ(NodeStatus::STATUS_OFFLINE, st.status_code);
|
||||
ASSERT_FALSE(nsm.isNodeKnown(uavcan::NodeID(123)));
|
||||
ASSERT_EQ(NodeStatus::MODE_OFFLINE, nsm.getNodeStatus(uavcan::NodeID(123)).mode);
|
||||
|
||||
/*
|
||||
* Some new status messages
|
||||
*/
|
||||
publishNodeStatus(can, 10, NodeStatus::STATUS_OK, 12, 0);
|
||||
publishNodeStatus(can, 10, NodeStatus::HEALTH_OK, NodeStatus::MODE_OPERATIONAL, 12, 0);
|
||||
shortSpin(node);
|
||||
ASSERT_EQ(NodeID(10), nsm.findNodeWithWorstStatus());
|
||||
ASSERT_EQ(NodeID(10), nsm.findNodeWithWorstHealth());
|
||||
|
||||
publishNodeStatus(can, 9, NodeStatus::STATUS_INITIALIZING, 0, 0);
|
||||
publishNodeStatus(can, 9, NodeStatus::HEALTH_WARNING, NodeStatus::MODE_INITIALIZATION, 0, 0);
|
||||
shortSpin(node);
|
||||
ASSERT_EQ(NodeID(9), nsm.findNodeWithWorstStatus());
|
||||
ASSERT_EQ(NodeID(9), nsm.findNodeWithWorstHealth());
|
||||
|
||||
publishNodeStatus(can, 11, NodeStatus::STATUS_CRITICAL, 999, 0);
|
||||
publishNodeStatus(can, 11, NodeStatus::HEALTH_CRITICAL, NodeStatus::MODE_MAINTENANCE, 999, 0);
|
||||
shortSpin(node);
|
||||
ASSERT_EQ(NodeID(11), nsm.findNodeWithWorstStatus());
|
||||
ASSERT_EQ(NodeID(11), nsm.findNodeWithWorstHealth());
|
||||
|
||||
st = nsm.getNodeStatus(uavcan::NodeID(10));
|
||||
ASSERT_TRUE(st.known);
|
||||
ASSERT_EQ(NodeStatus::STATUS_OK, st.status_code);
|
||||
ASSERT_TRUE(nsm.isNodeKnown(uavcan::NodeID(10)));
|
||||
ASSERT_EQ(NodeStatus::MODE_OPERATIONAL, nsm.getNodeStatus(uavcan::NodeID(10)).mode);
|
||||
ASSERT_EQ(NodeStatus::HEALTH_OK, nsm.getNodeStatus(uavcan::NodeID(10)).health);
|
||||
|
||||
st = nsm.getNodeStatus(uavcan::NodeID(9));
|
||||
ASSERT_TRUE(st.known);
|
||||
ASSERT_EQ(NodeStatus::STATUS_INITIALIZING, st.status_code);
|
||||
ASSERT_TRUE(nsm.isNodeKnown(uavcan::NodeID(9)));
|
||||
ASSERT_EQ(NodeStatus::MODE_INITIALIZATION, nsm.getNodeStatus(uavcan::NodeID(9)).mode);
|
||||
ASSERT_EQ(NodeStatus::HEALTH_WARNING, nsm.getNodeStatus(uavcan::NodeID(9)).health);
|
||||
|
||||
st = nsm.getNodeStatus(uavcan::NodeID(11));
|
||||
ASSERT_TRUE(st.known);
|
||||
ASSERT_EQ(NodeStatus::STATUS_CRITICAL, st.status_code);
|
||||
ASSERT_TRUE(nsm.isNodeKnown(uavcan::NodeID(11)));
|
||||
ASSERT_EQ(NodeStatus::MODE_MAINTENANCE, nsm.getNodeStatus(uavcan::NodeID(11)).mode);
|
||||
ASSERT_EQ(NodeStatus::HEALTH_CRITICAL, nsm.getNodeStatus(uavcan::NodeID(11)).health);
|
||||
|
||||
/*
|
||||
* Timeout
|
||||
@@ -86,21 +87,21 @@ TEST(NodeStatusMonitor, Basic)
|
||||
|
||||
clock_mock.advance(500000);
|
||||
shortSpin(node);
|
||||
st = nsm.getNodeStatus(uavcan::NodeID(10));
|
||||
ASSERT_TRUE(st.known);
|
||||
ASSERT_EQ(NodeStatus::STATUS_OK, st.status_code);
|
||||
ASSERT_TRUE(nsm.isNodeKnown(uavcan::NodeID(10)));
|
||||
ASSERT_EQ(NodeStatus::MODE_OPERATIONAL, nsm.getNodeStatus(uavcan::NodeID(10)).mode);
|
||||
ASSERT_EQ(NodeStatus::HEALTH_OK, nsm.getNodeStatus(uavcan::NodeID(10)).health);
|
||||
|
||||
clock_mock.advance(500000);
|
||||
shortSpin(node);
|
||||
st = nsm.getNodeStatus(uavcan::NodeID(9));
|
||||
ASSERT_TRUE(st.known);
|
||||
ASSERT_EQ(NodeStatus::STATUS_INITIALIZING, st.status_code);
|
||||
ASSERT_TRUE(nsm.isNodeKnown(uavcan::NodeID(9)));
|
||||
ASSERT_EQ(NodeStatus::MODE_INITIALIZATION, nsm.getNodeStatus(uavcan::NodeID(9)).mode);
|
||||
ASSERT_EQ(NodeStatus::HEALTH_WARNING, nsm.getNodeStatus(uavcan::NodeID(9)).health);
|
||||
|
||||
clock_mock.advance(500000);
|
||||
shortSpin(node);
|
||||
st = nsm.getNodeStatus(uavcan::NodeID(11));
|
||||
ASSERT_TRUE(st.known);
|
||||
ASSERT_EQ(NodeStatus::STATUS_CRITICAL, st.status_code);
|
||||
ASSERT_TRUE(nsm.isNodeKnown(uavcan::NodeID(11)));
|
||||
ASSERT_EQ(NodeStatus::MODE_MAINTENANCE, nsm.getNodeStatus(uavcan::NodeID(11)).mode);
|
||||
ASSERT_EQ(NodeStatus::HEALTH_CRITICAL, nsm.getNodeStatus(uavcan::NodeID(11)).health);
|
||||
|
||||
/*
|
||||
* Will timeout now
|
||||
@@ -108,68 +109,68 @@ TEST(NodeStatusMonitor, Basic)
|
||||
clock_mock.advance(4000000);
|
||||
shortSpin(node);
|
||||
|
||||
st = nsm.getNodeStatus(uavcan::NodeID(10));
|
||||
ASSERT_TRUE(st.known);
|
||||
ASSERT_EQ(NodeStatus::STATUS_OFFLINE, st.status_code);
|
||||
ASSERT_TRUE(nsm.isNodeKnown(uavcan::NodeID(10)));
|
||||
ASSERT_EQ(NodeStatus::MODE_OFFLINE, nsm.getNodeStatus(uavcan::NodeID(10)).mode);
|
||||
ASSERT_EQ(NodeStatus::HEALTH_OK, nsm.getNodeStatus(uavcan::NodeID(10)).health);
|
||||
|
||||
st = nsm.getNodeStatus(uavcan::NodeID(9));
|
||||
ASSERT_TRUE(st.known);
|
||||
ASSERT_EQ(NodeStatus::STATUS_OFFLINE, st.status_code);
|
||||
ASSERT_TRUE(nsm.isNodeKnown(uavcan::NodeID(9)));
|
||||
ASSERT_EQ(NodeStatus::MODE_OFFLINE, nsm.getNodeStatus(uavcan::NodeID(9)).mode);
|
||||
ASSERT_EQ(NodeStatus::HEALTH_WARNING, nsm.getNodeStatus(uavcan::NodeID(9)).health);
|
||||
|
||||
st = nsm.getNodeStatus(uavcan::NodeID(11));
|
||||
ASSERT_TRUE(st.known);
|
||||
ASSERT_EQ(NodeStatus::STATUS_OFFLINE, st.status_code);
|
||||
ASSERT_TRUE(nsm.isNodeKnown(uavcan::NodeID(11)));
|
||||
ASSERT_EQ(NodeStatus::MODE_OFFLINE, nsm.getNodeStatus(uavcan::NodeID(11)).mode);
|
||||
ASSERT_EQ(NodeStatus::HEALTH_CRITICAL, nsm.getNodeStatus(uavcan::NodeID(11)).health);
|
||||
|
||||
/*
|
||||
* Recovering one node, adding two extra
|
||||
*/
|
||||
publishNodeStatus(can, 11, NodeStatus::STATUS_WARNING, 999, 1);
|
||||
publishNodeStatus(can, 11, NodeStatus::HEALTH_WARNING, NodeStatus::MODE_OPERATIONAL, 999, 1);
|
||||
shortSpin(node);
|
||||
|
||||
publishNodeStatus(can, 127, NodeStatus::STATUS_WARNING, 9999, 1);
|
||||
publishNodeStatus(can, 127, NodeStatus::HEALTH_WARNING, NodeStatus::MODE_OPERATIONAL, 9999, 1);
|
||||
shortSpin(node);
|
||||
|
||||
publishNodeStatus(can, 1, NodeStatus::STATUS_OK, 1234, 1);
|
||||
publishNodeStatus(can, 1, NodeStatus::HEALTH_OK, NodeStatus::MODE_OPERATIONAL, 1234, 1);
|
||||
shortSpin(node);
|
||||
|
||||
/*
|
||||
* Making sure OFFLINE is still worst status
|
||||
*/
|
||||
ASSERT_EQ(NodeID(9), nsm.findNodeWithWorstStatus());
|
||||
ASSERT_EQ(NodeID(9), nsm.findNodeWithWorstHealth());
|
||||
|
||||
/*
|
||||
* Final validation
|
||||
*/
|
||||
st = nsm.getNodeStatus(uavcan::NodeID(10));
|
||||
ASSERT_TRUE(st.known);
|
||||
ASSERT_EQ(NodeStatus::STATUS_OFFLINE, st.status_code);
|
||||
ASSERT_TRUE(nsm.isNodeKnown(uavcan::NodeID(10)));
|
||||
ASSERT_EQ(NodeStatus::MODE_OFFLINE, nsm.getNodeStatus(uavcan::NodeID(10)).mode);
|
||||
ASSERT_EQ(NodeStatus::HEALTH_OK, nsm.getNodeStatus(uavcan::NodeID(10)).health);
|
||||
|
||||
st = nsm.getNodeStatus(uavcan::NodeID(9));
|
||||
ASSERT_TRUE(st.known);
|
||||
ASSERT_EQ(NodeStatus::STATUS_OFFLINE, st.status_code);
|
||||
ASSERT_TRUE(nsm.isNodeKnown(uavcan::NodeID(9)));
|
||||
ASSERT_EQ(NodeStatus::MODE_OFFLINE, nsm.getNodeStatus(uavcan::NodeID(9)).mode);
|
||||
ASSERT_EQ(NodeStatus::HEALTH_WARNING, nsm.getNodeStatus(uavcan::NodeID(9)).health);
|
||||
|
||||
st = nsm.getNodeStatus(uavcan::NodeID(11));
|
||||
ASSERT_TRUE(st.known);
|
||||
ASSERT_EQ(NodeStatus::STATUS_WARNING, st.status_code);
|
||||
ASSERT_TRUE(nsm.isNodeKnown(uavcan::NodeID(11)));
|
||||
ASSERT_EQ(NodeStatus::MODE_OPERATIONAL, nsm.getNodeStatus(uavcan::NodeID(11)).mode);
|
||||
ASSERT_EQ(NodeStatus::HEALTH_WARNING, nsm.getNodeStatus(uavcan::NodeID(11)).health);
|
||||
|
||||
st = nsm.getNodeStatus(uavcan::NodeID(127));
|
||||
ASSERT_TRUE(st.known);
|
||||
ASSERT_EQ(NodeStatus::STATUS_WARNING, st.status_code);
|
||||
ASSERT_TRUE(nsm.isNodeKnown(uavcan::NodeID(127)));
|
||||
ASSERT_EQ(NodeStatus::MODE_OPERATIONAL, nsm.getNodeStatus(uavcan::NodeID(127)).mode);
|
||||
ASSERT_EQ(NodeStatus::HEALTH_WARNING, nsm.getNodeStatus(uavcan::NodeID(127)).health);
|
||||
|
||||
st = nsm.getNodeStatus(uavcan::NodeID(1));
|
||||
ASSERT_TRUE(st.known);
|
||||
ASSERT_EQ(NodeStatus::STATUS_OK, st.status_code);
|
||||
ASSERT_TRUE(nsm.isNodeKnown(uavcan::NodeID(1)));
|
||||
ASSERT_EQ(NodeStatus::MODE_OPERATIONAL, nsm.getNodeStatus(uavcan::NodeID(1)).mode);
|
||||
ASSERT_EQ(NodeStatus::HEALTH_OK, nsm.getNodeStatus(uavcan::NodeID(1)).health);
|
||||
|
||||
/*
|
||||
* Forgetting
|
||||
*/
|
||||
nsm.forgetNode(127);
|
||||
st = nsm.getNodeStatus(uavcan::NodeID(127));
|
||||
ASSERT_FALSE(st.known);
|
||||
ASSERT_EQ(NodeStatus::STATUS_OFFLINE, st.status_code);
|
||||
ASSERT_FALSE(nsm.isNodeKnown(uavcan::NodeID(127)));
|
||||
ASSERT_EQ(NodeStatus::MODE_OFFLINE, nsm.getNodeStatus(uavcan::NodeID(127)).mode);
|
||||
ASSERT_EQ(NodeStatus::HEALTH_OK, nsm.getNodeStatus(uavcan::NodeID(127)).health);
|
||||
|
||||
nsm.forgetNode(9);
|
||||
st = nsm.getNodeStatus(uavcan::NodeID(9));
|
||||
ASSERT_FALSE(st.known);
|
||||
ASSERT_EQ(NodeStatus::STATUS_OFFLINE, st.status_code);
|
||||
ASSERT_FALSE(nsm.isNodeKnown(uavcan::NodeID(9)));
|
||||
ASSERT_EQ(NodeStatus::MODE_OFFLINE, nsm.getNodeStatus(uavcan::NodeID(9)).mode);
|
||||
ASSERT_EQ(NodeStatus::HEALTH_OK, nsm.getNodeStatus(uavcan::NodeID(9)).health);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user