@@ -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