From 7965892827d9fc1aac5f84ff44a5e818c78e8f8c Mon Sep 17 00:00:00 2001 From: "Jonathan Thorpe (Sony)" Date: Fri, 24 May 2024 17:07:08 +0100 Subject: [PATCH] Create NcStatusMonitor and update NcReceiverMonitor --- Development/nmos/api_utils.cpp | 4 +- .../nmos/control_protocol_handlers.cpp | 6 +- Development/nmos/control_protocol_methods.cpp | 95 +++++++++++-------- Development/nmos/control_protocol_methods.h | 8 ++ .../nmos/control_protocol_resource.cpp | 79 +++++++-------- Development/nmos/control_protocol_resource.h | 19 ++-- .../nmos/control_protocol_resources.cpp | 15 +-- Development/nmos/control_protocol_resources.h | 19 ++-- Development/nmos/control_protocol_state.cpp | 27 +++--- Development/nmos/control_protocol_typedefs.h | 44 ++++----- Development/nmos/json_fields.h | 11 ++- Development/nmos/type.h | 2 +- 12 files changed, 175 insertions(+), 154 deletions(-) diff --git a/Development/nmos/api_utils.cpp b/Development/nmos/api_utils.cpp index 899d759d..21894f43 100644 --- a/Development/nmos/api_utils.cpp +++ b/Development/nmos/api_utils.cpp @@ -168,8 +168,8 @@ namespace nmos { U("nc_manager"), nmos::types::nc_manager }, { U("nc_device_manager"), nmos::types::nc_device_manager }, { U("nc_class_manager"), nmos::types::nc_class_manager }, + { U("nc_status_monitor"), nmos::types::nc_status_monitor }, { U("nc_receiver_monitor"), nmos::types::nc_receiver_monitor }, - { U("nc_receiver_monitor_protected"), nmos::types::nc_receiver_monitor_protected }, { U("nc_ident_beacon"), nmos::types::nc_ident_beacon } }; return types_from_resourceType.at(resourceType); @@ -195,8 +195,8 @@ namespace nmos { nmos::types::nc_manager, U("nc_manager") }, { nmos::types::nc_device_manager, U("nc_device_manager") }, { nmos::types::nc_class_manager, U("nc_class_manager") }, + { nmos::types::nc_status_monitor, U("nc_status_monitor") }, { nmos::types::nc_receiver_monitor, U("nc_receiver_monitor") }, - { nmos::types::nc_receiver_monitor_protected, U("nc_receiver_monitor_protected") }, { nmos::types::nc_ident_beacon, U("nc_ident_beacon") } }; return resourceTypes_from_type.at(type); diff --git a/Development/nmos/control_protocol_handlers.cpp b/Development/nmos/control_protocol_handlers.cpp index 1fb5fdb4..79eb1429 100644 --- a/Development/nmos/control_protocol_handlers.cpp +++ b/Development/nmos/control_protocol_handlers.cpp @@ -81,20 +81,20 @@ namespace nmos const auto active = nmos::fields::master_enable(nmos::fields::endpoint_active(connection_resource.data)); const web::json::value connection_status = active ? nc_connection_status::healthy : nc_connection_status::inactive; - const web::json::value payload_status = active ? nc_payload_status::payload_ok : nc_payload_status::undefined; + const web::json::value stream_status = active ? nc_stream_status::healthy : nc_stream_status::inactive; // hmm, maybe updating connectionStatusMessage and payloadStatusMessage too const auto property_changed_event = make_property_changed_event(nmos::fields::nc::oid(found->data), { { nc_receiver_monitor_connection_status_property_id, nc_property_change_type::type::value_changed, connection_status }, - { nc_receiver_monitor_payload_status_property_id, nc_property_change_type::type::value_changed, payload_status } + { nc_receiver_monitor_stream_status_property_id, nc_property_change_type::type::value_changed, stream_status } }); modify_control_protocol_resource(resources, found->id, [&](nmos::resource& resource) { resource.data[nmos::fields::nc::connection_status] = connection_status; - resource.data[nmos::fields::nc::payload_status] = payload_status; + resource.data[nmos::fields::nc::stream_status] = stream_status; }, property_changed_event); } diff --git a/Development/nmos/control_protocol_methods.cpp b/Development/nmos/control_protocol_methods.cpp index 446a4749..b3f50bec 100644 --- a/Development/nmos/control_protocol_methods.cpp +++ b/Development/nmos/control_protocol_methods.cpp @@ -569,60 +569,79 @@ namespace nmos // Get a single datatype descriptor web::json::value get_datatype(nmos::resources&, const nmos::resource&, const web::json::value& arguments, bool is_deprecated, get_control_protocol_class_descriptor_handler, get_control_protocol_datatype_descriptor_handler get_control_protocol_datatype_descriptor, control_protocol_property_changed_handler, slog::base_gate& gate) - { - // note, model mutex is already locked by the outer function, so access to control_protocol_resources is OK... + { + // note, model mutex is already locked by the outer function, so access to control_protocol_resources is OK... - const auto& name = nmos::fields::nc::name(arguments); // name of datatype - const auto& include_inherited = nmos::fields::nc::include_inherited(arguments); // If set the descriptor would contain all inherited elements + const auto& name = nmos::fields::nc::name(arguments); // name of datatype + const auto& include_inherited = nmos::fields::nc::include_inherited(arguments); // If set the descriptor would contain all inherited elements - slog::log(gate, SLOG_FLF) << "Get a single datatype descriptor: " << "name: " << name; + slog::log(gate, SLOG_FLF) << "Get a single datatype descriptor: " << "name: " << name; - if (name.empty()) - { - // empty name - return details::make_nc_method_result_error({ nc_method_status::parameter_error }, U("empty name to do GetDatatype")); - } + if (name.empty()) + { + // empty name + return details::make_nc_method_result_error({ nc_method_status::parameter_error }, U("empty name to do GetDatatype")); + } - const auto& datatype = get_control_protocol_datatype_descriptor(name); - if (datatype.descriptor.size()) - { - auto descriptor = datatype.descriptor; + const auto& datatype = get_control_protocol_datatype_descriptor(name); + if (datatype.descriptor.size()) + { + auto descriptor = datatype.descriptor; - if (include_inherited) + if (include_inherited) + { + const auto& type = nmos::fields::nc::type(descriptor); + if (nc_datatype_type::Struct == type) { - const auto& type = nmos::fields::nc::type(descriptor); - if (nc_datatype_type::Struct == type) - { - auto descriptor_ = descriptor; + auto descriptor_ = descriptor; - for (;;) + for (;;) + { + const auto& parent_type = descriptor_.at(nmos::fields::nc::parent_type); + if (!parent_type.is_null()) { - const auto& parent_type = descriptor_.at(nmos::fields::nc::parent_type); - if (!parent_type.is_null()) + const auto& parent_datatype = get_control_protocol_datatype_descriptor(parent_type.as_string()); + if (parent_datatype.descriptor.size()) { - const auto& parent_datatype = get_control_protocol_datatype_descriptor(parent_type.as_string()); - if (parent_datatype.descriptor.size()) - { - descriptor_ = parent_datatype.descriptor; + descriptor_ = parent_datatype.descriptor; - const auto& fields = nmos::fields::nc::fields(descriptor_); - for (const auto& field : fields) - { - web::json::push_back(descriptor.at(nmos::fields::nc::fields), field); - } + const auto& fields = nmos::fields::nc::fields(descriptor_); + for (const auto& field : fields) + { + web::json::push_back(descriptor.at(nmos::fields::nc::fields), field); } } - else - { - break; - } + } + else + { + break; } } } - - return details::make_nc_method_result({ is_deprecated ? nmos::nc_method_status::method_deprecated : nc_method_status::ok }, descriptor); } - return details::make_nc_method_result_error({ nc_method_status::parameter_error }, U("name not found")); + return details::make_nc_method_result({ is_deprecated ? nmos::nc_method_status::method_deprecated : nc_method_status::ok }, descriptor); } + + return details::make_nc_method_result_error({ nc_method_status::parameter_error }, U("name not found")); + } + + // NcReceiverMonitor methods + web::json::value get_lost_packets(nmos::resources&, const nmos::resource&, const web::json::value&, bool, get_control_protocol_class_descriptor_handler, get_control_protocol_datatype_descriptor_handler, control_protocol_property_changed_handler, slog::base_gate&) + { + // this will need to be defined in a user defined handler + return details::make_nc_method_result({ nc_method_status::ok }); + } + + web::json::value get_late_packets(nmos::resources&, const nmos::resource&, const web::json::value&, bool, get_control_protocol_class_descriptor_handler, get_control_protocol_datatype_descriptor_handler, control_protocol_property_changed_handler, slog::base_gate&) + { + // this will need to be defined in a user defined handler + return details::make_nc_method_result({ nc_method_status::ok }); + } + + web::json::value reset_packet_counters(nmos::resources&, const nmos::resource&, const web::json::value&, bool, get_control_protocol_class_descriptor_handler, get_control_protocol_datatype_descriptor_handler, control_protocol_property_changed_handler, slog::base_gate&) + { + // this will need to be defined in a user defined handler + return details::make_nc_method_result({ nc_method_status::ok }); + } } diff --git a/Development/nmos/control_protocol_methods.h b/Development/nmos/control_protocol_methods.h index 063d3112..0cae8e70 100644 --- a/Development/nmos/control_protocol_methods.h +++ b/Development/nmos/control_protocol_methods.h @@ -42,6 +42,14 @@ namespace nmos web::json::value get_control_class(nmos::resources&, const nmos::resource&, const web::json::value& arguments, bool is_deprecated, get_control_protocol_class_descriptor_handler get_control_protocol_class_descriptor, get_control_protocol_datatype_descriptor_handler, control_protocol_property_changed_handler, slog::base_gate& gate); // Get a single datatype descriptor web::json::value get_datatype(nmos::resources&, const nmos::resource&, const web::json::value& arguments, bool is_deprecated, get_control_protocol_class_descriptor_handler, get_control_protocol_datatype_descriptor_handler get_control_protocol_datatype, control_protocol_property_changed_handler, slog::base_gate& gate); + + // NcReceiverMonitor methods implementation + // Gets the lost packets + web::json::value get_lost_packets(nmos::resources&, const nmos::resource&, const web::json::value&, bool, get_control_protocol_class_descriptor_handler, get_control_protocol_datatype_descriptor_handler, control_protocol_property_changed_handler, slog::base_gate&); + // Gets the late packets + web::json::value get_late_packets(nmos::resources&, const nmos::resource&, const web::json::value&, bool, get_control_protocol_class_descriptor_handler, get_control_protocol_datatype_descriptor_handler, control_protocol_property_changed_handler, slog::base_gate&); + // Resets the packet counters + web::json::value reset_packet_counters(nmos::resources&, const nmos::resource&, const web::json::value&, bool, get_control_protocol_class_descriptor_handler, get_control_protocol_datatype_descriptor_handler, control_protocol_property_changed_handler, slog::base_gate&); } #endif diff --git a/Development/nmos/control_protocol_resource.cpp b/Development/nmos/control_protocol_resource.cpp index b9b972dd..d2c7a20e 100644 --- a/Development/nmos/control_protocol_resource.cpp +++ b/Development/nmos/control_protocol_resource.cpp @@ -739,16 +739,21 @@ namespace nmos } // See https://specs.amwa.tv/nmos-control-feature-sets/branches/main/monitoring/#ncreceivermonitor - web::json::value make_receiver_monitor(const nc_class_id& class_id, nc_oid oid, bool constant_oid, nc_oid owner, const utility::string_t& role, const utility::string_t& user_label, const utility::string_t& description, const web::json::value& touchpoints, const web::json::value& runtime_property_constraints, bool enabled, - nc_connection_status::status connection_status, const utility::string_t& connection_status_message, nc_payload_status::status payload_status, const utility::string_t& payload_status_message) + web::json::value make_receiver_monitor(const nc_class_id& class_id, nc_oid oid, bool constant_oid, nc_oid owner, const utility::string_t& role, const utility::string_t& user_label, const utility::string_t& description, const web::json::value& touchpoints, const web::json::value& runtime_property_constraints, bool enabled, nc_link_status::status link_status, const utility::string_t& link_status_message, nc_connection_status::status connection_status, const utility::string_t& connection_status_message, nc_synchronization_status::status synchronization_status, const utility::string_t& synchronization_status_message, const utility::string_t& grand_master_clock_id, nc_stream_status::status stream_status, const utility::string_t& stream_status_message) { using web::json::value; auto data = make_nc_worker(class_id, oid, constant_oid, owner, role, value::string(user_label), description, touchpoints, runtime_property_constraints, enabled); + + data[nmos::fields::nc::link_status] = value::number(link_status); + data[nmos::fields::nc::link_status_message] = value::string(link_status_message); data[nmos::fields::nc::connection_status] = value::number(connection_status); data[nmos::fields::nc::connection_status_message] = value::string(connection_status_message); - data[nmos::fields::nc::payload_status] = value::number(payload_status); - data[nmos::fields::nc::payload_status_message] = value::string(payload_status_message); + data[nmos::fields::nc::synchronization_status] = value::number(synchronization_status); + data[nmos::fields::nc::synchronization_status_message] = value::string(synchronization_status_message); + data[nmos::fields::nc::grand_master_clock_id] = value::string(grand_master_clock_id); + data[nmos::fields::nc::stream_status] = value::number(stream_status); + data[nmos::fields::nc::stream_status_message] = value::string(stream_status_message); return data; } @@ -1155,49 +1160,60 @@ namespace nmos return value::array(); } - // See https://specs.amwa.tv/nmos-control-feature-sets/branches/main/monitoring/#ncreceivermonitor - web::json::value make_nc_receiver_monitor_properties() + // TODO: add link + web::json::value make_nc_status_monitor_properties() { using web::json::value; auto properties = value::array(); - web::json::push_back(properties, details::make_nc_property_descriptor(U("Connection status property"), nc_receiver_monitor_connection_status_property_id, nmos::fields::nc::connection_status, U("NcConnectionStatus"), true, false, false, false, value::null())); - web::json::push_back(properties, details::make_nc_property_descriptor(U("Connection status message property"), nc_receiver_monitor_connection_status_message_property_id, nmos::fields::nc::connection_status_message, U("NcString"), true, true, false, false, value::null())); - web::json::push_back(properties, details::make_nc_property_descriptor(U("Payload status property"), nc_receiver_monitor_payload_status_property_id, nmos::fields::nc::payload_status, U("NcPayloadStatus"), true, false, false, false, value::null())); - web::json::push_back(properties, details::make_nc_property_descriptor(U("Payload status message property"), nc_receiver_monitor_payload_status_message_property_id, nmos::fields::nc::payload_status_message, U("NcString"), true, true, false, false, value::null())); + web::json::push_back(properties, details::make_nc_property_descriptor(U("Overall status property"), nc_status_monitor_overall_status_property_id, nmos::fields::nc::overall_status, U("NcOverallStatus"), true, false, false, false, value::null())); + web::json::push_back(properties, details::make_nc_property_descriptor(U("Overall status message property"), nc_status_monitor_overall_status_message_property_id, nmos::fields::nc::overall_status_message, U("NcString"), true, true, false, false, value::null())); return properties; } - web::json::value make_nc_receiver_monitor_methods() + web::json::value make_nc_status_monitor_methods() { using web::json::value; return value::array(); } - web::json::value make_nc_receiver_monitor_events() + web::json::value make_nc_status_monitor_events() { using web::json::value; return value::array(); } - // See https://specs.amwa.tv/nmos-control-feature-sets/branches/main/monitoring/#ncreceivermonitorprotected - web::json::value make_nc_receiver_monitor_protected_properties() + // See https://specs.amwa.tv/nmos-control-feature-sets/branches/main/monitoring/#ncreceivermonitor + web::json::value make_nc_receiver_monitor_properties() { using web::json::value; auto properties = value::array(); - web::json::push_back(properties, details::make_nc_property_descriptor(U("Indicates if signal protection is active"), nc_receiver_monitor_protected_signal_protection_status_property_id, nmos::fields::nc::signal_protection_status, U("NcBoolean"), true, false, false, false, value::null())); + web::json::push_back(properties, details::make_nc_property_descriptor(U("Link status property"), nc_receiver_monitor_link_status_property_id, nmos::fields::nc::link_status, U("NcLinkStatus"), true, false, false, false, value::null())); + web::json::push_back(properties, details::make_nc_property_descriptor(U("Link status message property"), nc_receiver_monitor_link_status_message_property_id, nmos::fields::nc::link_status_message, U("NcString"), true, true, false, false, value::null())); + web::json::push_back(properties, details::make_nc_property_descriptor(U("Connection status property"), nc_receiver_monitor_connection_status_property_id, nmos::fields::nc::connection_status, U("NcConnectionStatus"), true, false, false, false, value::null())); + web::json::push_back(properties, details::make_nc_property_descriptor(U("Connection status message property"), nc_receiver_monitor_connection_status_message_property_id, nmos::fields::nc::connection_status_message, U("NcString"), true, true, false, false, value::null())); + web::json::push_back(properties, details::make_nc_property_descriptor(U("Synchronization status property"), nc_receiver_monitor_synchronization_status_property_id, nmos::fields::nc::synchronization_status, U("NcSynchronizationStatus"), true, false, false, false, value::null())); + web::json::push_back(properties, details::make_nc_property_descriptor(U("Synchronization status message property"), nc_receiver_monitor_synchronization_status_message_property_id, nmos::fields::nc::synchronization_status_message, U("NcString"), true, true, false, false, value::null())); + web::json::push_back(properties, details::make_nc_property_descriptor(U("Grand master clock id property"), nc_receiver_monitor_synchronization_grand_master_clock_id_property_id, nmos::fields::nc::grand_master_clock_id, U("NcString"), true, true, false, false, value::null())); + web::json::push_back(properties, details::make_nc_property_descriptor(U("Stream status property"), nc_receiver_monitor_stream_status_property_id, nmos::fields::nc::stream_status, U("NcStreamStatus"), true, false, false, false, value::null())); + web::json::push_back(properties, details::make_nc_property_descriptor(U("Stream status message property"), nc_receiver_monitor_stream_status_message_property_id, nmos::fields::nc::stream_status_message, U("NcString"), true, true, false, false, value::null())); return properties; } - web::json::value make_nc_receiver_monitor_protected_methods() + web::json::value make_nc_receiver_monitor_methods() { using web::json::value; - return value::array(); + auto methods = value::array(); + web::json::push_back(methods, details::make_nc_method_descriptor(U("Gets the lost packets"), nc_receiver_monitor_get_lost_packets_method_id, U("GetLostPackets"), U("NcMethodResultCounter"), value::array(), false)); + web::json::push_back(methods, details::make_nc_method_descriptor(U("Gets the late packets"), nc_receiver_monitor_get_late_packets_method_id, U("GetLatePackets"), U("NcMethodResultCounter"), value::array(), false)); + web::json::push_back(methods, details::make_nc_method_descriptor(U("Resets the packet counters"), nc_receiver_monitor_reset_packet_counters_method_id, U("ResetPacketCounters"), U("NcMethodResult"), value::array(), false)); + + return methods; } - web::json::value make_nc_receiver_monitor_protected_events() + web::json::value make_nc_receiver_monitor_events() { using web::json::value; @@ -1285,20 +1301,20 @@ namespace nmos } // Monitoring feature set control classes - // See https://specs.amwa.tv/nmos-control-feature-sets/branches/main/monitoring/#ncreceivermonitor - web::json::value make_nc_receiver_monitor_class() + // TODO: link + web::json::value make_nc_status_monitor_class() { using web::json::value; - return details::make_nc_class_descriptor(U("NcReceiverMonitor class descriptor"), nc_receiver_monitor_class_id, U("NcReceiverMonitor"), make_nc_receiver_monitor_properties(), make_nc_receiver_monitor_methods(), make_nc_receiver_monitor_events()); + return details::make_nc_class_descriptor(U("NcStatusMonitor class descriptor"), nc_status_monitor_class_id, U("NcStatusMonitor"), make_nc_status_monitor_properties(), make_nc_status_monitor_methods(), make_nc_status_monitor_events()); } - - // See https://specs.amwa.tv/nmos-control-feature-sets/branches/main/monitoring/#ncreceivermonitorprotected - web::json::value make_nc_receiver_monitor_protected_class() + + // See https://specs.amwa.tv/nmos-control-feature-sets/branches/main/monitoring/#ncreceivermonitor + web::json::value make_nc_receiver_monitor_class() { using web::json::value; - return details::make_nc_class_descriptor(U("NcReceiverMonitorProtected class descriptor"), nc_receiver_monitor_protected_class_id, U("NcReceiverMonitorProtected"), make_nc_receiver_monitor_protected_properties(), make_nc_receiver_monitor_protected_methods(), make_nc_receiver_monitor_protected_events()); + return details::make_nc_class_descriptor(U("NcReceiverMonitor class descriptor"), nc_receiver_monitor_class_id, U("NcReceiverMonitor"), make_nc_receiver_monitor_properties(), make_nc_receiver_monitor_methods(), make_nc_receiver_monitor_events()); } // Primitive datatypes @@ -2038,19 +2054,6 @@ namespace nmos web::json::push_back(items, details::make_nc_enum_item_descriptor(U("Active and unhealthy"), U("Unhealthy"), 3)); return details::make_nc_datatype_descriptor_enum(U("Connection status enum data typee"), U("NcConnectionStatus"), items, value::null()); } - // See https://specs.amwa.tv/nmos-control-feature-sets/branches/main/monitoring/#ncpayloadstatus - // ****************** - web::json::value make_nc_payload_status_datatype() - { - using web::json::value; - - auto items = value::array(); - web::json::push_back(items, details::make_nc_enum_item_descriptor(U("This is the value when there's no connection"), U("Undefined"), 0)); - web::json::push_back(items, details::make_nc_enum_item_descriptor(U("Payload is being received without errors and is the correct type"), U("PayloadOK"), 1)); - web::json::push_back(items, details::make_nc_enum_item_descriptor(U("Payload is being received but is of an unsupported type"), U("PayloadFormatUnsupported"), 2)); - web::json::push_back(items, details::make_nc_enum_item_descriptor(U("A payload error was encountered"), U("PayloadError"), 3)); - return details::make_nc_datatype_descriptor_enum(U("Connection status enum data typee"), U("NcPayloadStatus"), items, value::null()); - } // *********************** // TOO: link web::json::value make_nc_overall_status_datatype() diff --git a/Development/nmos/control_protocol_resource.h b/Development/nmos/control_protocol_resource.h index 6b1da957..c74fec5a 100644 --- a/Development/nmos/control_protocol_resource.h +++ b/Development/nmos/control_protocol_resource.h @@ -178,8 +178,7 @@ namespace nmos web::json::value make_nc_worker(const nc_class_id& class_id, nc_oid oid, bool constant_oid, nc_oid owner, const utility::string_t& role, const web::json::value& user_label, const utility::string_t& description, const web::json::value& touchpoints, const web::json::value& runtime_property_constraints, bool enabled); // See https://specs.amwa.tv/nmos-control-feature-sets/branches/main/monitoring/#ncreceivermonitor - web::json::value make_receiver_monitor(const nc_class_id& class_id, nc_oid oid, bool constant_oid, nc_oid owner, const utility::string_t& role, const utility::string_t& user_label, const utility::string_t& description, const web::json::value& touchpoints, const web::json::value& runtime_property_constraints, bool enabled, - nc_connection_status::status connection_status, const utility::string_t& connection_status_message, nc_payload_status::status payload_status, const utility::string_t& payload_status_message); + web::json::value make_receiver_monitor(const nc_class_id& class_id, nc_oid oid, bool constant_oid, nc_oid owner, const utility::string_t& role, const utility::string_t& user_label, const utility::string_t& description, const web::json::value& touchpoints, const web::json::value& runtime_property_constraints, bool enabled, nc_link_status::status link_status, const utility::string_t& link_status_message, nc_connection_status::status connection_status, const utility::string_t& connection_status_message, nc_synchronization_status::status synchronization_status, const utility::string_t& synchronization_status_message, const utility::string_t& grand_master_clock_id, nc_stream_status::status stream_status, const utility::string_t& stream_status_message); // See https://specs.amwa.tv/ms-05-02/branches/v1.0.x/docs/Framework.html#ncmanager web::json::value make_nc_manager(const nc_class_id& class_id, nc_oid oid, bool constant_oid, const web::json::value& owner, const utility::string_t& role, const web::json::value& user_label, const utility::string_t& description, const web::json::value& touchpoints, const web::json::value& runtime_property_constraints); @@ -236,8 +235,6 @@ namespace nmos web::json::value make_nc_ident_beacon_class(); // See https://specs.amwa.tv/nmos-control-feature-sets/branches/main/monitoring/#ncreceivermonitor web::json::value make_nc_receiver_monitor_class(); - // See https://specs.amwa.tv/nmos-control-feature-sets/branches/main/monitoring/#ncreceivermonitorprotected - web::json::value make_nc_receiver_monitor_protected_class(); // control classes proprties/methods/events // See https://specs.amwa.tv/ms-05-02/branches/v1.0.x/docs/Framework.html#ncobject @@ -264,17 +261,17 @@ namespace nmos web::json::value make_nc_class_manager_properties(); web::json::value make_nc_class_manager_methods(); web::json::value make_nc_class_manager_events(); + + // Monitoring feature set control classes + // TODO: link + web::json::value make_nc_status_monitor_properties(); + web::json::value make_nc_status_monitor_methods(); + web::json::value make_nc_status_monitor_events(); // See https://specs.amwa.tv/nmos-control-feature-sets/branches/main/monitoring/#ncreceivermonitor web::json::value make_nc_receiver_monitor_properties(); web::json::value make_nc_receiver_monitor_methods(); web::json::value make_nc_receiver_monitor_events(); - // Monitoring feature set control classes - // See https://specs.amwa.tv/nmos-control-feature-sets/branches/main/monitoring/#ncreceivermonitorprotected - web::json::value make_nc_receiver_monitor_protected_properties(); - web::json::value make_nc_receiver_monitor_protected_methods(); - web::json::value make_nc_receiver_monitor_protected_events(); - // Identification feature set control classes // See https://specs.amwa.tv/nmos-control-feature-sets/branches/main/identification/#ncidentbeacon web::json::value make_nc_ident_beacon_properties(); @@ -426,8 +423,6 @@ namespace nmos // // See https://specs.amwa.tv/nmos-control-feature-sets/branches/main/monitoring/#ncconnectionstatus web::json::value make_nc_connection_status_datatype(); - // See https://specs.amwa.tv/nmos-control-feature-sets/branches/main/monitoring/#ncpayloadstatus - web::json::value make_nc_payload_status_datatype(); // TOO: link web::json::value make_nc_overall_status_datatype(); // TOO: link diff --git a/Development/nmos/control_protocol_resources.cpp b/Development/nmos/control_protocol_resources.cpp index 26030a6f..b7a2b93c 100644 --- a/Development/nmos/control_protocol_resources.cpp +++ b/Development/nmos/control_protocol_resources.cpp @@ -67,23 +67,12 @@ namespace nmos // // See https://specs.amwa.tv/nmos-control-feature-sets/branches/main/monitoring/#ncreceivermonitor control_protocol_resource make_receiver_monitor(nc_oid oid, bool constant_oid, nc_oid owner, const utility::string_t& role, const utility::string_t& user_label, const utility::string_t& description, const web::json::value& touchpoints, const web::json::value& runtime_property_constraints, bool enabled, - nc_connection_status::status connection_status, const utility::string_t& connection_status_message, nc_payload_status::status payload_status, const utility::string_t& payload_status_message) + nc_link_status::status link_status, const utility::string_t& link_status_message, nc_connection_status::status connection_status, const utility::string_t& connection_status_message, nc_synchronization_status::status synchronization_status, const utility::string_t& synchronization_status_message, const utility::string_t& grand_master_clock_id, nc_stream_status::status stream_status, const utility::string_t& stream_status_message) { - auto data = details::make_receiver_monitor(nc_receiver_monitor_class_id, oid, constant_oid, owner, role, user_label, description, touchpoints, runtime_property_constraints, enabled, connection_status, connection_status_message, payload_status, payload_status_message); + auto data = details::make_receiver_monitor(nc_receiver_monitor_class_id, oid, constant_oid, owner, role, user_label, description, touchpoints, runtime_property_constraints, enabled, link_status, link_status_message, connection_status, connection_status_message, synchronization_status, synchronization_status_message, grand_master_clock_id, stream_status, stream_status_message); return{ is12_versions::v1_0, types::nc_receiver_monitor, std::move(data), true }; } - // See https://specs.amwa.tv/nmos-control-feature-sets/branches/main/monitoring/#ncreceivermonitorprotected - control_protocol_resource make_receiver_monitor_protected(nc_oid oid, bool constant_oid, nc_oid owner, const utility::string_t& role, const utility::string_t& user_label, const utility::string_t& description, const web::json::value& touchpoints, const web::json::value& runtime_property_constraints, bool enabled, - nc_connection_status::status connection_status, const utility::string_t& connection_status_message, nc_payload_status::status payload_status, const utility::string_t& payload_status_message, bool signal_protection_status) - { - using web::json::value; - - auto data = details::make_receiver_monitor(nc_receiver_monitor_protected_class_id, oid, constant_oid, owner, role, user_label, description, touchpoints, runtime_property_constraints, enabled, connection_status, connection_status_message, payload_status, payload_status_message); - data[nmos::fields::nc::signal_protection_status] = value::boolean(signal_protection_status); - - return{ is12_versions::v1_0, types::nc_receiver_monitor_protected, std::move(data), true }; - } // Identification feature set control classes // diff --git a/Development/nmos/control_protocol_resources.h b/Development/nmos/control_protocol_resources.h index 99da8f47..26804f91 100644 --- a/Development/nmos/control_protocol_resources.h +++ b/Development/nmos/control_protocol_resources.h @@ -29,18 +29,15 @@ namespace nmos // // create Receiver Monitor resource control_protocol_resource make_receiver_monitor(nc_oid oid, bool constant_oid, nmos::nc_oid owner, const utility::string_t& role, const utility::string_t& user_label, const utility::string_t& description, const web::json::value& touchpoints = web::json::value::null(), const web::json::value& runtime_property_constraints = web::json::value::null(), bool enabled = true, + nc_link_status::status link_status = nc_link_status::all_up, + const utility::string_t& link_status_message = U(""), nc_connection_status::status connection_status = nc_connection_status::status::inactive, - const utility::string_t& connection_status_message = U(""), - nc_payload_status::status payload_status = nc_payload_status::status::undefined, - const utility::string_t& payload_status_message = U("") - ); - // create Receiver Monitor Protected resource - control_protocol_resource make_receiver_monitor_protected(nc_oid oid, bool constant_oid, nc_oid owner, const utility::string_t& role, const utility::string_t& user_label, const utility::string_t& description, const web::json::value& touchpoints, const web::json::value& runtime_property_constraints = web::json::value::null(), bool enabled = true, - nc_connection_status::status connection_status = nc_connection_status::status::inactive, - const utility::string_t& connection_status_message = U(""), - nc_payload_status::status payload_status = nc_payload_status::status::undefined, - const utility::string_t& payload_status_message = U(""), - bool signal_protection_status = true + const utility::string_t& connection_status_message = U(""), + nc_synchronization_status::status synchronization_status = nc_synchronization_status::not_used, + const utility::string_t& synchronization_status_message = U(""), + const utility::string_t& grand_master_clock_id = U(""), + nc_stream_status::status stream_status = nc_stream_status::inactive, + const utility::string_t& stream_status_message = U("") ); // Identification feature set control classes diff --git a/Development/nmos/control_protocol_state.cpp b/Development/nmos/control_protocol_state.cpp index 8fce5529..1a810a58 100644 --- a/Development/nmos/control_protocol_state.cpp +++ b/Development/nmos/control_protocol_state.cpp @@ -206,22 +206,28 @@ namespace nmos to_vector(make_nc_ident_beacon_events())) }, // Monitoring feature set // See https://specs.amwa.tv/nmos-control-feature-sets/branches/main/monitoring/#control-classes + // NcStatusMonitor + { nc_status_monitor_class_id, make_control_class_descriptor(U("NcStatusMonitor class descriptor"), nc_status_monitor_class_id, U("NcStatusMonitor"), + // NcReceiverMonitor properties + to_vector(make_nc_status_monitor_properties()), + // NcReceiverMonitor methods + to_methods_vector(make_nc_status_monitor_methods(), {}), + // NcReceiverMonitor events + to_vector(make_nc_status_monitor_events())) }, // NcReceiverMonitor { nc_receiver_monitor_class_id, make_control_class_descriptor(U("NcReceiverMonitor class descriptor"), nc_receiver_monitor_class_id, U("NcReceiverMonitor"), // NcReceiverMonitor properties to_vector(make_nc_receiver_monitor_properties()), // NcReceiverMonitor methods - to_methods_vector(make_nc_receiver_monitor_methods(), {}), + to_methods_vector(make_nc_receiver_monitor_methods(), + { + // link NcReceiverMonitor method_ids with method functions + { nc_receiver_monitor_get_lost_packets_method_id, get_lost_packets }, + { nc_receiver_monitor_get_late_packets_method_id, get_late_packets }, + { nc_receiver_monitor_reset_packet_counters_method_id, reset_packet_counters } + }), // NcReceiverMonitor events - to_vector(make_nc_receiver_monitor_events())) }, - // NcReceiverMonitorProtected - { nc_receiver_monitor_protected_class_id, make_control_class_descriptor(U("NcReceiverMonitorProtected class descriptor"), nc_receiver_monitor_protected_class_id, U("NcReceiverMonitorProtected"), - // NcReceiverMonitorProtected properties - to_vector(make_nc_receiver_monitor_protected_properties()), - // NcReceiverMonitorProtected methods - to_methods_vector(make_nc_receiver_monitor_protected_methods(), {}), - // NcReceiverMonitorProtected events - to_vector(make_nc_receiver_monitor_protected_events())) } + to_vector(make_nc_receiver_monitor_events())) } }; // setup the standard datatypes @@ -300,7 +306,6 @@ namespace nmos // Monitoring feature set // See https://specs.amwa.tv/nmos-control-feature-sets/branches/main/monitoring/#datatypes { U("NcConnectionStatus"), {make_nc_connection_status_datatype()} }, - { U("NcPayloadStatus"), {make_nc_payload_status_datatype()} }, { U("NcOverallStatus"), {make_nc_overall_status_datatype() } }, { U("NcLinkStatus"), {make_nc_link_status_datatype() } }, { U("NcSynchronizationStatus"), {make_nc_synchronization_status_datatype() } }, diff --git a/Development/nmos/control_protocol_typedefs.h b/Development/nmos/control_protocol_typedefs.h index 4a1db413..a255fd03 100644 --- a/Development/nmos/control_protocol_typedefs.h +++ b/Development/nmos/control_protocol_typedefs.h @@ -111,19 +111,6 @@ namespace nmos }; } - // NcPayloadStatus - // See https://specs.amwa.tv/nmos-control-feature-sets/branches/main/monitoring/#ncpayloadstatus - namespace nc_payload_status - { - enum status - { - undefined = 0, // This is the value when there's no connection. - payload_ok = 1, // Payload is being received without errors and is the correct type - payload_format_unsupported = 2, // Payload is being received but is of an unsupported type - payloadError = 3 // A payload error was encountered - }; - } - // NcOverallStatus // TODO: link namespace nc_overall_status @@ -223,6 +210,11 @@ namespace nmos // See https://specs.amwa.tv/ms-05-02/branches/v1.0.x/docs/Framework.html#ncclassmanager const nc_method_id nc_class_manager_get_control_class_method_id(3, 1); const nc_method_id nc_class_manager_get_datatype_method_id(3, 2); + // NcMethodIds for NcReceiverMonitor + // TODO: link + const nc_method_id nc_receiver_monitor_get_lost_packets_method_id(4, 1); + const nc_method_id nc_receiver_monitor_get_late_packets_method_id(4, 2); + const nc_method_id nc_receiver_monitor_reset_packet_counters_method_id(4, 3); // NcPropertyId // See https://specs.amwa.tv/ms-05-02/branches/v1.0.x/docs/Framework.html#ncpropertyid @@ -260,14 +252,20 @@ namespace nmos // See https://specs.amwa.tv/ms-05-02/branches/v1.0.x/docs/Framework.html#ncclassmanager const nc_property_id nc_class_manager_control_classes_property_id(3, 1); const nc_property_id nc_class_manager_datatypes_property_id(3, 2); + // NcPropertyIds for NcStatusMonitor + const nc_property_id nc_status_monitor_overall_status_property_id(3, 1); + const nc_property_id nc_status_monitor_overall_status_message_property_id(3, 2); // NcPropertyids for NcReceiverMonitor // See https://specs.amwa.tv/nmos-control-feature-sets/branches/main/monitoring/#ncreceivermonitor - const nc_property_id nc_receiver_monitor_connection_status_property_id(3, 1); - const nc_property_id nc_receiver_monitor_connection_status_message_property_id(3, 2); - const nc_property_id nc_receiver_monitor_payload_status_property_id(3, 3); - const nc_property_id nc_receiver_monitor_payload_status_message_property_id(3, 4); - // NcPropertyids for NcReceiverMonitorProtected - // See https://specs.amwa.tv/nmos-control-feature-sets/branches/main/monitoring/#ncreceivermonitorprotected + const nc_property_id nc_receiver_monitor_link_status_property_id(4, 1); + const nc_property_id nc_receiver_monitor_link_status_message_property_id(4, 2); + const nc_property_id nc_receiver_monitor_connection_status_property_id(4, 3); + const nc_property_id nc_receiver_monitor_connection_status_message_property_id(4, 4); + const nc_property_id nc_receiver_monitor_synchronization_status_property_id(4, 5); + const nc_property_id nc_receiver_monitor_synchronization_status_message_property_id(4, 6); + const nc_property_id nc_receiver_monitor_synchronization_grand_master_clock_id_property_id(4, 7); + const nc_property_id nc_receiver_monitor_stream_status_property_id(4, 8); + const nc_property_id nc_receiver_monitor_stream_status_message_property_id(4, 9); const nc_property_id nc_receiver_monitor_protected_signal_protection_status_property_id(4, 1); // NcPropertyids for NcIdentBeacon // See https://specs.amwa.tv/nmos-control-feature-sets/branches/main/identification/#ncidentbeacon @@ -317,11 +315,11 @@ namespace nmos // See https://specs.amwa.tv/ms-05-02/branches/v1.0.x/docs/Framework.html#ncclassmanager const nc_class_id nc_class_manager_class_id({ 1, 3, 2 }); // See https://specs.amwa.tv/nmos-control-feature-sets/branches/main/identification/#ncidentbeacon - const nc_class_id nc_ident_beacon_class_id({ 1, 2, 2 }); + const nc_class_id nc_ident_beacon_class_id({ 1, 2, 1 }); + // TODO: link + const nc_class_id nc_status_monitor_class_id({ 1, 2, 2 }); // See https://specs.amwa.tv/nmos-control-feature-sets/branches/main/monitoring/#ncreceivermonitor - const nc_class_id nc_receiver_monitor_class_id({ 1, 2, 3 }); - // See https://specs.amwa.tv/nmos-control-feature-sets/branches/main/monitoring/#ncreceivermonitorprotected - const nc_class_id nc_receiver_monitor_protected_class_id({ 1, 2, 3, 1 }); + const nc_class_id nc_receiver_monitor_class_id({ 1, 2, 2, 1 }); // NcTouchpoint // See https://specs.amwa.tv/ms-05-02/branches/v1.0.x/docs/Framework.html#nctouchpoint diff --git a/Development/nmos/json_fields.h b/Development/nmos/json_fields.h index 7374c5a9..075da370 100644 --- a/Development/nmos/json_fields.h +++ b/Development/nmos/json_fields.h @@ -332,10 +332,17 @@ namespace nmos const web::json::field_as_string io_id{ U("ioId") }; const web::json::field_as_integer connection_status{ U("connectionStatus") }; // NcConnectionStatus const web::json::field_as_string connection_status_message{ U("connectionStatusMessage") }; - const web::json::field_as_integer payload_status{ U("payloadStatus") }; // NcPayloadStatus - const web::json::field_as_string payload_status_message{ U("payloadStatusMessage") }; + const web::json::field_as_integer link_status{ U("linkStatus") }; // NcLinkStatus + const web::json::field_as_string link_status_message{ U("linkStatusMessage") }; + const web::json::field_as_integer synchronization_status{ U("synchronizationStatus") }; // NcSynchronizationStatus + const web::json::field_as_string synchronization_status_message{ U("synchronizationStatusMessage") }; + const web::json::field_as_string grand_master_clock_id{ U("grandMasterClockId") }; const web::json::field_as_bool signal_protection_status{ U("signalProtectionStatus") }; + const web::json::field_as_integer stream_status{ U("streamStatus") }; // NcStreamStatus + const web::json::field_as_string stream_status_message{ U("streamStatusMessage") }; const web::json::field_as_bool active{ U("active") }; + const web::json::field_as_integer overall_status{ U("overallStatus") }; + const web::json::field_as_string overall_status_message{ U("overallStatusMessage") }; } // NMOS Parameter Registers diff --git a/Development/nmos/type.h b/Development/nmos/type.h index 8da37f68..a0e7ae6e 100644 --- a/Development/nmos/type.h +++ b/Development/nmos/type.h @@ -46,8 +46,8 @@ namespace nmos const type nc_manager{ U("nc_manager") }; const type nc_device_manager{ U("nc_device_manager") }; const type nc_class_manager{ U("nc_class_manager") }; + const type nc_status_monitor{ U("nc_status_monitor") }; const type nc_receiver_monitor{ U("nc_receiver_monitor") }; - const type nc_receiver_monitor_protected{ U("nc_receiver_monitor_protected") }; const type nc_ident_beacon{ U("nc_ident_beacon") }; } }