Skip to content

Commit 9287035

Browse files
Add example Sender Monitor behaviour
1 parent c7307ee commit 9287035

File tree

1 file changed

+76
-3
lines changed

1 file changed

+76
-3
lines changed

Development/nmos-cpp-node/node_implementation.cpp

Lines changed: 76 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1336,6 +1336,7 @@ void node_implementation_run(nmos::node_model& model, nmos::experimental::contro
13361336
const auto seed_id = nmos::experimental::fields::seed_id(model.settings);
13371337
const auto how_many = impl::fields::how_many(model.settings);
13381338
const auto sender_ports = impl::parse_ports(impl::fields::senders(model.settings));
1339+
const auto rtp_sender_ports = boost::copy_range<std::vector<impl::port>>(sender_ports | boost::adaptors::filtered(impl::is_rtp_port));
13391340
const auto ws_sender_ports = boost::copy_range<std::vector<impl::port>>(sender_ports | boost::adaptors::filtered(impl::is_ws_port));
13401341
const auto rtp_receiver_ports = boost::copy_range<std::vector<impl::port>>(impl::parse_ports(impl::fields::receivers(model.settings)) | boost::adaptors::filtered(impl::is_rtp_port));
13411342

@@ -1348,6 +1349,12 @@ void node_implementation_run(nmos::node_model& model, nmos::experimental::contro
13481349
auto set_receiver_monitor_stream_status = nmos::make_set_receiver_monitor_stream_status_handler(control_protocol_resources, control_protocol_state, gate);
13491350
auto set_receiver_monitor_synchronization_source_id = nmos::make_set_receiver_monitor_synchronization_source_id_handler(control_protocol_resources, control_protocol_state, gate);
13501351

1352+
auto set_sender_monitor_link_status = nmos::make_set_sender_monitor_link_status_handler(control_protocol_resources, control_protocol_state, gate);
1353+
auto set_sender_monitor_transmission_status = nmos::make_set_sender_monitor_transmission_status_handler(control_protocol_resources, control_protocol_state, gate);
1354+
auto set_sender_monitor_external_synchronization_status = nmos::make_set_sender_monitor_external_synchronization_status_handler(control_protocol_resources, control_protocol_state, gate);
1355+
auto set_sender_monitor_essence_status = nmos::make_set_sender_monitor_essence_status_handler(control_protocol_resources, control_protocol_state, gate);
1356+
auto set_sender_monitor_synchronization_source_id = nmos::make_set_sender_monitor_synchronization_source_id_handler(control_protocol_resources, control_protocol_state, gate);
1357+
13511358
// start background tasks to intermittently update the state of the event sources, to cause events to be emitted to connected receivers
13521359

13531360
nmos::details::seed_generator events_seeder;
@@ -1356,10 +1363,10 @@ void node_implementation_run(nmos::node_model& model, nmos::experimental::contro
13561363
auto cancellation_source = pplx::cancellation_token_source();
13571364

13581365
auto token = cancellation_source.get_token();
1359-
auto events = pplx::do_while([&model, seed_id, how_many, ws_sender_ports, rtp_receiver_ports, get_control_protocol_property, set_receiver_monitor_link_status, set_receiver_monitor_connection_status, set_receiver_monitor_external_synchronization_status, set_receiver_monitor_stream_status, set_receiver_monitor_synchronization_source_id, events_engine, &gate, token]
1366+
auto events = pplx::do_while([&model, seed_id, how_many, ws_sender_ports, rtp_receiver_ports, rtp_sender_ports, get_control_protocol_property, set_receiver_monitor_link_status, set_receiver_monitor_connection_status, set_receiver_monitor_external_synchronization_status, set_receiver_monitor_stream_status, set_receiver_monitor_synchronization_source_id, set_sender_monitor_link_status, set_sender_monitor_transmission_status, set_sender_monitor_external_synchronization_status, set_sender_monitor_essence_status, set_sender_monitor_synchronization_source_id, events_engine, &gate, token]
13601367
{
13611368
const auto event_interval = std::uniform_real_distribution<>(0.5, 5.0)(*events_engine);
1362-
return pplx::complete_after(std::chrono::milliseconds(std::chrono::milliseconds::rep(1000 * event_interval)), token).then([&model, seed_id, how_many, ws_sender_ports, rtp_receiver_ports, get_control_protocol_property, set_receiver_monitor_link_status, set_receiver_monitor_connection_status, set_receiver_monitor_external_synchronization_status, set_receiver_monitor_stream_status, set_receiver_monitor_synchronization_source_id, events_engine, &gate]
1369+
return pplx::complete_after(std::chrono::milliseconds(std::chrono::milliseconds::rep(1000 * event_interval)), token).then([&model, seed_id, how_many, ws_sender_ports, rtp_receiver_ports, rtp_sender_ports, get_control_protocol_property, set_receiver_monitor_link_status, set_receiver_monitor_connection_status, set_receiver_monitor_external_synchronization_status, set_receiver_monitor_stream_status, set_receiver_monitor_synchronization_source_id, set_sender_monitor_link_status, set_sender_monitor_transmission_status, set_sender_monitor_external_synchronization_status, set_sender_monitor_essence_status, set_sender_monitor_synchronization_source_id, events_engine, &gate]
13631370
{
13641371
auto lock = model.write_lock();
13651372

@@ -1436,7 +1443,7 @@ void node_implementation_run(nmos::node_model& model, nmos::experimental::contro
14361443
if (counter.late_packet_counter.value < std::numeric_limits<uint64_t>::max()) ++counter.late_packet_counter.value;
14371444
}
14381445

1439-
// example to set receiver monitors statuses
1446+
// example setting receiver monitor statuses
14401447
{
14411448
auto& resources = model.control_protocol_resources;
14421449
for (int index = 0; index < how_many; ++index)
@@ -1503,7 +1510,73 @@ void node_implementation_run(nmos::node_model& model, nmos::experimental::contro
15031510
}
15041511
}
15051512
}
1513+
// example setting sender monitor statuses
1514+
{
1515+
auto& resources = model.control_protocol_resources;
1516+
for (int index = 0; index < how_many; ++index)
1517+
{
1518+
for (const auto& port : rtp_sender_ports)
1519+
{
1520+
const auto sender_id = impl::make_id(seed_id, nmos::types::sender, port, index);
1521+
1522+
auto sender_monitor = nmos::find_control_protocol_resource(resources, nmos::types::nc_status_monitor, sender_id);
1523+
if (resources.end() != sender_monitor)
1524+
{
1525+
const auto& oid = nmos::fields::nc::oid(sender_monitor->data);
1526+
1527+
auto overall_status = get_control_protocol_property(oid, nmos::nc_status_monitor_overall_status_property_id);
1528+
1529+
switch (rand() % 3)
1530+
{
1531+
case 0:
1532+
{
1533+
const auto status = nmos::nc_link_status::status(nmos::nc_link_status::all_up + rand() % 3);
1534+
const auto status_message = status > nmos::nc_link_status::all_up ? U("NIC1, NIC2 are down") : U("");
1535+
set_sender_monitor_link_status(oid, status, status_message);
1536+
break;
1537+
}
1538+
case 1:
1539+
{
1540+
if (overall_status.as_integer() != nmos::nc_overall_status::inactive)
1541+
{
1542+
const auto transmission_status = nmos::nc_transmission_status::status(nmos::nc_transmission_status::healthy + rand() % 3);
1543+
const auto transmission_status_message = transmission_status > nmos::nc_transmission_status::healthy ? U("Transmission errors detected") : U("");
15061544

1545+
set_sender_monitor_transmission_status(oid, transmission_status, transmission_status_message);
1546+
}
1547+
break;
1548+
}
1549+
case 2:
1550+
{
1551+
const auto status = nmos::nc_synchronization_status::status(nmos::nc_synchronization_status::not_used + rand() % 4);
1552+
const auto status_message = status > nmos::nc_synchronization_status::healthy ? U("Source change from: 00:0c:ec:ff:fe:0a:2b:a1 on NIC1") : U("");
1553+
set_sender_monitor_external_synchronization_status(oid, status, status_message);
1554+
// update sender monitor synchronization source id if in-used
1555+
if (nmos::nc_synchronization_status::not_used != status)
1556+
{
1557+
if (nmos::nc_synchronization_status::healthy == status) set_sender_monitor_synchronization_source_id(oid, bst::optional<utility::string_t>{ U("internal") });
1558+
else set_sender_monitor_synchronization_source_id(oid, {});
1559+
}
1560+
break;
1561+
}
1562+
case 3:
1563+
{
1564+
if (overall_status.as_integer() != nmos::nc_overall_status::inactive)
1565+
{
1566+
const auto status = nmos::nc_essence_status::status(nmos::nc_stream_status::healthy + rand() % 3);
1567+
const auto status_message = status > nmos::nc_essence_status::status::healthy ? U("No valid input signal on input SDI1") : U("");
1568+
1569+
set_sender_monitor_essence_status(oid, status, status_message);
1570+
}
1571+
break;
1572+
}
1573+
default:
1574+
break;
1575+
}
1576+
}
1577+
}
1578+
}
1579+
}
15071580
model.notify();
15081581

15091582
return true;

0 commit comments

Comments
 (0)