23 #ifndef RDMNET_CPP_DEVICE_H_
24 #define RDMNET_CPP_DEVICE_H_
35 #include "rdm/cpp/uid.h"
83 size_t num_dynamic_responders = 0);
86 const rdm::Uid* static_responders,
87 size_t num_static_responders,
89 size_t num_dynamic_responders = 0);
111 size_t num_dynamic_responders)
112 : config_{id, nullptr, 0, nullptr, 0}
114 if (dynamic_responders && num_dynamic_responders)
116 std::transform(dynamic_responders, dynamic_responders + num_dynamic_responders,
126 : config_{id, nullptr, 0, nullptr, 0}
128 if (!dynamic_responders.
empty())
145 const rdm::Uid* static_responders,
146 size_t num_static_responders,
148 size_t num_dynamic_responders)
149 : config_{id, nullptr, 0, nullptr, 0}
151 if (static_responders && num_static_responders)
154 [](
const rdm::Uid& uid) {
return uid.get(); });
156 if (dynamic_responders && num_dynamic_responders)
158 std::transform(dynamic_responders, dynamic_responders + num_dynamic_responders,
173 : config_{id, nullptr, 0, nullptr, 0}
175 if (!static_responders.
empty())
178 [](
const rdm::Uid& uid) { return uid.get(); });
180 if (!dynamic_responders.
empty())
195 inline void VirtualEndpointConfig::UpdateConfig()
197 if (!static_responders_.
empty())
202 if (!dynamic_responders_.
empty())
215 uint16_t control_field,
216 rdm::Uid binding_uid = rdm::Uid{});
229 uint16_t control_field,
230 rdm::Uid binding_uid)
231 : responder_{uid.get(), control_field, binding_uid.get()}
280 size_t num_responders)
281 : config_{id, nullptr, 0}
283 if (responders && num_responders)
296 : config_{id, nullptr, 0}
298 if (!responders.
empty())
313 inline void PhysicalEndpointConfig::UpdateConfig()
377 ETCPAL_UNUSED_ARG(
handle);
378 ETCPAL_UNUSED_ARG(list);
420 const Settings& settings,
421 const char* scope_id_str,
433 const uint8_t* response_data =
nullptr,
434 size_t response_data_len = 0);
440 const uint8_t* data =
nullptr,
441 size_t data_len = 0);
444 const uint8_t* data =
nullptr,
445 size_t data_len = 0);
448 const char* status_string =
nullptr);
451 const uint8_t* response_data =
nullptr,
452 uint8_t response_data_len = 0);
468 const rdm::Uid& responder_uid,
469 uint16_t control_field,
470 const rdm::Uid& binding_uid = rdm::Uid{});
485 class TranslatedConfig
488 TranslatedConfig(
const Settings& settings,
501 NotifyHandler* notify_{
nullptr};
515 static_cast<Device::NotifyHandler*
>(context)->HandleConnectedToBroker(
Device::Handle(
handle), *info);
525 static_cast<Device::NotifyHandler*
>(context)->HandleBrokerConnectFailed(
Device::Handle(
handle), *info);
535 static_cast<Device::NotifyHandler*
>(context)->HandleDisconnectedFromBroker(
Device::Handle(
handle), *info);
544 if (cmd && response && context)
546 *response =
static_cast<Device::NotifyHandler*
>(context)->HandleRdmCommand(
Device::Handle(
handle), *cmd).get();
555 if (cmd && response && context)
557 *response =
static_cast<Device::NotifyHandler*
>(context)->HandleLlrpRdmCommand(
Device::Handle(
handle), *cmd).get();
567 static_cast<Device::NotifyHandler*
>(context)->HandleDynamicUidStatus(
Device::Handle(
handle), *list);
588 : cid(cid_in), uid(rdm::Uid::DynamicUidRequest(manufacturer_id))
595 return (!cid.IsNull() && (uid.IsStatic() || uid.IsDynamicUidRequest()));
616 TranslatedConfig config(settings,
notify_handler, E133_DEFAULT_SCOPE, static_broker_addr);
643 const char* scope_id_str,
649 TranslatedConfig config(settings,
notify_handler, scope_id_str, static_broker_addr);
714 if (!new_scope_id_str)
756 if (!new_search_domain)
769 const uint8_t* response_data,
770 size_t response_data_len)
794 static_cast<rdm_nack_reason_t
>(raw_nack_reason));
862 const char* status_string)
874 const uint8_t* response_data,
875 uint8_t response_data_len)
899 static_cast<rdm_nack_reason_t
>(raw_nack_reason));
925 if (endpoint_configs.
empty())
959 if (endpoint_configs.
empty())
994 if (endpoint_ids.
empty())
1054 if (responder_ids.
empty())
1080 if (responder_static_uids.
empty())
1086 [](
const rdm::Uid& uid) { return uid.get(); });
1106 const rdm::Uid& responder_uid,
1107 uint16_t control_field,
1108 const rdm::Uid& binding_uid)
1146 if (responders.
empty())
1209 if (responder_ids.
empty())
1236 if (responder_static_uids.
empty())
1242 [](
const rdm::Uid& uid) { return uid.get(); });
1280 if (responder_uids.
empty())
1286 [](
const rdm::Uid& uid) { return uid.get(); });
1309 std::string scope_id(E133_SCOPE_STRING_PADDED_LENGTH, 0);
1313 return Scope(scope_id, static_broker_addr);
1320 if (!physical_endpoints_.empty())
1323 config_.num_physical_endpoints = physical_endpoints_.size();
1325 if (!virtual_endpoints_.empty())
1327 config_.virtual_endpoints = virtual_endpoints_.data();
1328 config_.num_virtual_endpoints = virtual_endpoints_.size();
1334 inline Device::TranslatedConfig::TranslatedConfig(
const Settings& settings,
1341 ::rdmnet::internal::DeviceLibCbConnected,
1342 ::rdmnet::internal::DeviceLibCbConnectFailed,
1343 ::rdmnet::internal::DeviceLibCbDisconnected,
1344 ::rdmnet::internal::DeviceLibCbRdmCommandReceived,
1345 ::rdmnet::internal::DeviceLibCbLlrpRdmCommandReceived,
1346 ::rdmnet::internal::DeviceLibCbDynamicUidStatus,
1349 settings.response_buf,
1352 static_broker_addr.get()
1355 settings.search_domain.c_str(),
1365 if (!settings.physical_endpoints.empty())
1367 physical_endpoints_.reserve(settings.physical_endpoints.size());
1368 std::transform(settings.physical_endpoints.begin(), settings.physical_endpoints.end(),
1370 [](
const PhysicalEndpointConfig& config) { return config.get(); });
1374 if (!settings.virtual_endpoints.empty())
1376 virtual_endpoints_.reserve(settings.virtual_endpoints.size());
1377 std::transform(settings.virtual_endpoints.begin(), settings.virtual_endpoints.end(),
1379 [](
const VirtualEndpointConfig& config) { return config.get(); });
T back_inserter(T... args)
ETCPAL_CONSTEXPR_14 void Clear()
ETCPAL_CONSTEXPR_14 void SetValue(const ValueType &new_value)
constexpr ValueType value() const
constexpr const EtcPalSockAddr & get() const noexcept
constexpr const EtcPalUuid & get() const noexcept
Information about a failed connection to a broker delivered to an RDMnet callback function.
Definition: client.h:228
Information about a successful connection to a broker delivered to an RDMnet callback function.
Definition: client.h:158
Information about a disconnect event from a broker delivered to an RDMnet callback function.
Definition: client.h:346
A base class for a class that receives notification callbacks from a device.
Definition: device.h:334
virtual void HandleDynamicUidStatus(Handle handle, const DynamicUidAssignmentList &list)
The dynamic UID assignment status for a set of virtual responders has been received.
Definition: device.h:375
virtual RdmResponseAction HandleRdmCommand(Handle handle, const RdmCommand &cmd)=0
An RDM command has been received addressed to a device.
virtual void HandleDisconnectedFromBroker(Handle handle, const ClientDisconnectedInfo &info)=0
A device which was previously connected to a broker has disconnected.
virtual void HandleBrokerConnectFailed(Handle handle, const ClientConnectFailedInfo &info)=0
A connection attempt failed between a device and a broker.
virtual void HandleConnectedToBroker(Handle handle, const ClientConnectedInfo &info)=0
A device has successfully connected to a broker.
virtual RdmResponseAction HandleLlrpRdmCommand(Handle handle, const llrp::RdmCommand &cmd)=0
An RDM command has been received over LLRP, addressed to a device.
An instance of RDMnet device functionality.
Definition: device.h:324
etcpal::Error SendRdmUpdate(uint16_t param_id, const uint8_t *data=nullptr, size_t data_len=0)
Send an asynchronous RDM GET response to update the value of a local parameter.
Definition: device.h:807
etcpal::Error RemoveEndpoints(const std::vector< uint16_t > &endpoint_ids)
Remove multiple endpoints from a device.
Definition: device.h:992
etcpal::Error RemovePhysicalResponder(uint16_t endpoint_id, const rdm::Uid &responder_uid)
Remove a responder from a physical endpoint.
Definition: device.h:1260
etcpal::Error SendLlrpNack(const llrp::SavedRdmCommand &received_cmd, rdm_nack_reason_t nack_reason)
Send a negative acknowledge (NACK) response to an RDM command received by a device over LLRP.
Definition: device.h:885
etcpal::Error RemovePhysicalResponders(uint16_t endpoint_id, const std::vector< rdm::Uid > &responder_uids)
Remove multiple responders from a physical endpoint.
Definition: device.h:1278
etcpal::Error SendLlrpAck(const llrp::SavedRdmCommand &received_cmd, const uint8_t *response_data=nullptr, uint8_t response_data_len=0)
Send an acknowledge (ACK) response to an RDM command received by a device over LLRP.
Definition: device.h:873
constexpr Handle handle() const
Retrieve the handle of a device instance.
Definition: device.h:1292
etcpal::Error SendRptStatus(const SavedRdmCommand &received_cmd, rpt_status_code_t status_code, const char *status_string=nullptr)
Send an RPT status message from a device.
Definition: device.h:860
etcpal::Error RemoveVirtualResponder(uint16_t endpoint_id, const etcpal::Uuid &responder_id)
Remove a responder with a dynamic UID from a virtual endpoint.
Definition: device.h:1170
etcpal::Error AddVirtualResponder(uint16_t endpoint_id, const etcpal::Uuid &responder_id)
Add a responder with a dynamic UID to a virtual endpoint.
Definition: device.h:1015
etcpal::Error AddPhysicalEndpoints(const std::vector< PhysicalEndpointConfig > &endpoint_configs)
Add multiple physical endpoints to a device.
Definition: device.h:957
etcpal::Error AddVirtualResponders(uint16_t endpoint_id, const std::vector< etcpal::Uuid > &responder_ids)
Add multiple responders with dynamic UIDs to a virtual endpoint.
Definition: device.h:1052
etcpal::Error AddPhysicalResponders(uint16_t endpoint_id, const std::vector< PhysicalEndpointResponder > &responders)
Add multiple responders to a physical endpoint.
Definition: device.h:1143
etcpal::Error AddVirtualEndpoints(const std::vector< VirtualEndpointConfig > &endpoint_configs)
Add multiple virtual endpoints to a device.
Definition: device.h:923
etcpal::OpaqueId< detail::DeviceHandleType, rdmnet_device_t, RDMNET_DEVICE_INVALID > Handle
A handle type used by the RDMnet library to identify device instances.
Definition: device.h:327
etcpal::Error SendRdmAck(const SavedRdmCommand &received_cmd, const uint8_t *response_data=nullptr, size_t response_data_len=0)
Send an acknowledge (ACK) response to an RDM command received by a device.
Definition: device.h:768
etcpal::Error RemoveEndpoint(uint16_t endpoint_id)
Remove an endpoint from a device.
Definition: device.h:978
void Shutdown(rdmnet_disconnect_reason_t disconnect_reason=kRdmnetDisconnectShutdown)
Shut down this device and deallocate resources.
Definition: device.h:691
etcpal::Error AddPhysicalEndpoint(const PhysicalEndpointConfig &physical_config)
Add a physical endpoint to a device.
Definition: device.h:944
etcpal::Error RemoveVirtualResponders(uint16_t endpoint_id, const std::vector< etcpal::Uuid > &responder_ids)
Remove multiple responder with dynamic UIDs from a virtual endpoint.
Definition: device.h:1206
etcpal::Error AddVirtualEndpoint(const VirtualEndpointConfig &endpoint_config)
Add a virtual endpoint to a device.
Definition: device.h:910
etcpal::Error ChangeSearchDomain(const char *new_search_domain, rdmnet_disconnect_reason_t disconnect_reason)
Change the device's DNS search domain.
Definition: device.h:753
Device(Device &&other)=default
Move a device instance.
etcpal::Error AddPhysicalResponder(uint16_t endpoint_id, const rdm::Uid &responder_uid, uint16_t control_field, const rdm::Uid &binding_uid=rdm::Uid{})
Add a responder to a physical endpoint.
Definition: device.h:1105
etcpal::Error Startup(NotifyHandler ¬ify_handler, const Settings &settings, const char *scope_id_str, const etcpal::SockAddr &static_broker_addr=etcpal::SockAddr{})
Allocate resources and start up this device with the given configuration on the given RDMnet scope.
Definition: device.h:641
constexpr NotifyHandler * notify_handler() const
Retrieve the NotifyHandler reference that this device was configured with.
Definition: device.h:1298
Device & operator=(Device &&other)=default
Move a device instance.
etcpal::Error ChangeScope(const char *new_scope_id_str, rdmnet_disconnect_reason_t disconnect_reason, const etcpal::SockAddr &static_broker_addr=etcpal::SockAddr{})
Change the device's RDMnet scope.
Definition: device.h:710
etcpal::Error SendRdmNack(const SavedRdmCommand &received_cmd, rdm_nack_reason_t nack_reason)
Send a negative acknowledge (NACK) response to an RDM command received by a device.
Definition: device.h:780
etcpal::Error StartupWithDefaultScope(NotifyHandler ¬ify_handler, const Settings &settings, const etcpal::SockAddr &static_broker_addr=etcpal::SockAddr{})
Allocate resources and start up this device with the given configuration on the default RDMnet scope.
Definition: device.h:612
etcpal::Expected< Scope > scope() const
Retrieve the scope configuration associated with a device instance.
Definition: device.h:1307
A list of mappings from dynamic UIDs to responder IDs received from an RDMnet broker.
Definition: dynamic_uid.h:99
Configuration information for a physical endpoint on a device.
Definition: device.h:260
const RdmnetPhysicalEndpointConfig & get() const noexcept
Get a const reference to the underlying C type.
Definition: device.h:307
PhysicalEndpointConfig(uint16_t id, const PhysicalEndpointResponder *responders=nullptr, size_t num_responders=0)
Create a physical endpoint configuration with an optional set of RDM responders.
Definition: device.h:278
Identifying information for a physical RDM responder connected to an RDMnet gateway.
Definition: device.h:212
ETCPAL_CONSTEXPR_14 const RdmnetPhysicalEndpointResponder & get() const noexcept
Get a const reference to the underlying C type.
Definition: device.h:236
ETCPAL_CONSTEXPR_14 PhysicalEndpointResponder(rdm::Uid uid, uint16_t control_field, rdm::Uid binding_uid=rdm::Uid{})
Create a physical endpoint responder from its identifying information.
Definition: device.h:228
An RDM command received over RDMnet and delivered to an RDMnet callback function.
Definition: rdm_command.h:43
A class representing a synchronous action to take in response to a received RDM command.
Definition: common.h:146
An RDM command received over RDMnet by a local component and saved for a later response.
Definition: rdm_command.h:87
ETCPAL_CONSTEXPR_14 RdmnetSavedRdmCommand & get() noexcept
Get a mutable reference to the underlying C type.
Definition: rdm_command.h:374
An RDMnet scope configuration.
Definition: client.h:469
const etcpal::SockAddr & static_broker_addr() const noexcept
The static broker address associated with this scope.
Definition: client.h:524
const std::string & id_string() const noexcept
The ID string of this scope.
Definition: client.h:515
The source address for an unsolicited RDM response generated by a local component.
Definition: client.h:48
constexpr const RdmnetSourceAddr & get() const noexcept
Get a const reference to the underlying C type.
Definition: client.h:61
Configuration information for a virtual endpoint on a device.
Definition: device.h:79
VirtualEndpointConfig(uint16_t id, const etcpal::Uuid *dynamic_responders=nullptr, size_t num_dynamic_responders=0)
Create a virtual endpoint configuration with an optional set of virtual responders with dynamic UIDs.
Definition: device.h:109
const RdmnetVirtualEndpointConfig & get() const noexcept
Get a const reference to the underlying C type.
Definition: device.h:189
An RDM command received over LLRP and delivered to an RDMnet callback function.
Definition: llrp_rdm_command.h:46
An RDM command received over LLRP by a local component and saved for a later response.
Definition: llrp_rdm_command.h:91
ETCPAL_CONSTEXPR_14 LlrpSavedRdmCommand & get() noexcept
Get a mutable reference to the underlying C type.
Definition: llrp_rdm_command.h:391
C++ wrapper for RDMnet client API definitions.
C++ wrapper for the RDMnet init/deinit functions.
RDMnet C++ message type definitions.
Definitions for the RDMnet Device API.
#define ETCPAL_CONSTEXPR_14
#define ETCPAL_CONSTEXPR_14_OR_INLINE
rdmnet_disconnect_reason_t
Definition: common.h:85
rpt_status_code_t
Definition: common.h:53
@ kRdmnetDisconnectShutdown
Definition: common.h:87
etcpal_error_t rdmnet_device_remove_endpoint(rdmnet_device_t handle, uint16_t endpoint_id)
Remove an endpoint from a device.
Definition: device.c:698
etcpal_error_t rdmnet_device_add_static_responders(rdmnet_device_t handle, uint16_t endpoint_id, const RdmUid *responder_uids, size_t num_responders)
Add one or more responders with static UIDs to a virtual endpoint.
Definition: device.c:776
etcpal_error_t rdmnet_device_destroy(rdmnet_device_t handle, rdmnet_disconnect_reason_t disconnect_reason)
Destroy a device instance.
Definition: device.c:266
etcpal_error_t rdmnet_device_send_rdm_nack(rdmnet_device_t handle, const RdmnetSavedRdmCommand *received_cmd, rdm_nack_reason_t nack_reason)
Send an RDM NACK response from a device.
Definition: device.c:328
etcpal_error_t rdmnet_device_remove_physical_responders(rdmnet_device_t handle, uint16_t endpoint_id, const RdmUid *responder_uids, size_t num_responders)
Remove one or more responders from a physical endpoint.
Definition: device.c:1072
etcpal_error_t rdmnet_device_add_physical_responders(rdmnet_device_t handle, uint16_t endpoint_id, const RdmnetPhysicalEndpointResponder *responders, size_t num_responders)
Add one or more responders to a physical endpoint.
Definition: device.c:884
#define RDMNET_DEVICE_INVALID
Definition: device.h:56
etcpal_error_t rdmnet_device_send_rdm_update_from_responder(rdmnet_device_t handle, const RdmnetSourceAddr *source_addr, uint16_t param_id, const uint8_t *data, size_t data_len)
Send an asynchronous RDM GET response to update the value of a parameter on a sub-responder.
Definition: device.c:404
etcpal_error_t rdmnet_device_change_scope(rdmnet_device_t handle, const RdmnetScopeConfig *new_scope_config, rdmnet_disconnect_reason_t disconnect_reason)
Change the device's scope.
Definition: device.c:1146
etcpal_error_t rdmnet_device_add_physical_endpoint(rdmnet_device_t handle, const RdmnetPhysicalEndpointConfig *endpoint_config)
Add a physical endpoint to a device.
Definition: device.c:542
etcpal_error_t rdmnet_device_send_rdm_update(rdmnet_device_t handle, uint16_t subdevice, uint16_t param_id, const uint8_t *data, size_t data_len)
Send an asynchronous RDM GET response to update the value of a local parameter.
Definition: device.c:367
etcpal_error_t rdmnet_device_add_physical_endpoints(rdmnet_device_t handle, const RdmnetPhysicalEndpointConfig *endpoint_configs, size_t num_endpoints)
Add multiple physical endpoints to a device.
Definition: device.c:581
etcpal_error_t rdmnet_device_remove_static_responders(rdmnet_device_t handle, uint16_t endpoint_id, const RdmUid *responder_uids, size_t num_responders)
Remove one or more responders with static UIDs from a virtual endpoint.
Definition: device.c:934
etcpal_error_t rdmnet_device_add_virtual_endpoints(rdmnet_device_t handle, const RdmnetVirtualEndpointConfig *endpoint_configs, size_t num_endpoints)
Add multiple virtual endpoints to a device.
Definition: device.c:659
etcpal_error_t rdmnet_device_add_virtual_endpoint(rdmnet_device_t handle, const RdmnetVirtualEndpointConfig *endpoint_config)
Add a virtual endpoint to a device.
Definition: device.c:620
etcpal_error_t rdmnet_device_send_llrp_nack(rdmnet_device_t handle, const LlrpSavedRdmCommand *received_cmd, rdm_nack_reason_t nack_reason)
Send an ACK response to an RDM command received over LLRP.
Definition: device.c:510
etcpal_error_t rdmnet_device_change_search_domain(rdmnet_device_t handle, const char *new_search_domain, rdmnet_disconnect_reason_t disconnect_reason)
Change the device's DNS search domain.
Definition: device.c:1184
etcpal_error_t rdmnet_device_send_llrp_ack(rdmnet_device_t handle, const LlrpSavedRdmCommand *received_cmd, const uint8_t *response_data, uint8_t response_data_len)
Send an ACK response to an RDM command received over LLRP.
Definition: device.c:477
etcpal_error_t rdmnet_device_add_dynamic_responders(rdmnet_device_t handle, uint16_t endpoint_id, const EtcPalUuid *responder_ids, size_t num_responders)
Add one or more responders with dynamic UIDs to a virtual endpoint.
Definition: device.c:830
etcpal_error_t rdmnet_device_send_rdm_ack(rdmnet_device_t handle, const RdmnetSavedRdmCommand *received_cmd, const uint8_t *response_data, size_t response_data_len)
Send an RDM ACK response from a device.
Definition: device.c:295
int rdmnet_device_t
Definition: device.h:54
etcpal_error_t rdmnet_device_get_scope(rdmnet_device_t handle, char *scope_str_buf, EtcPalSockAddr *static_broker_addr)
Retrieve the device's current scope configuration.
Definition: device.c:1220
etcpal_error_t rdmnet_device_create(const RdmnetDeviceConfig *config, rdmnet_device_t *handle)
Create a new instance of RDMnet device functionality.
Definition: device.c:228
etcpal_error_t rdmnet_device_remove_endpoints(rdmnet_device_t handle, const uint16_t *endpoint_ids, size_t num_endpoints)
Remove multiple endpoints from a device.
Definition: device.c:733
etcpal_error_t rdmnet_device_remove_dynamic_responders(rdmnet_device_t handle, uint16_t endpoint_id, const EtcPalUuid *responder_ids, size_t num_responders)
Remove one or more responders with dynamic UIDs from a virtual endpoint.
Definition: device.c:1009
etcpal_error_t rdmnet_device_send_status(rdmnet_device_t handle, const RdmnetSavedRdmCommand *received_cmd, rpt_status_code_t status_code, const char *status_string)
Send an RPT status message from a device.
Definition: device.c:443
A namespace which contains all C++ language definitions in the RDMnet library.
Definition: broker.h:45
Definition: message.h:440
A set of information that defines the startup parameters of an RDMnet Device.
Definition: device.h:233
const RdmnetPhysicalEndpointConfig * physical_endpoints
Definition: device.h:273
Definition: message.h:246
Configuration information for a physical endpoint on a device.
Definition: device.h:199
size_t num_responders
Definition: device.h:205
const RdmnetPhysicalEndpointResponder * responders
Definition: device.h:203
Configuration information for a virtual endpoint on a device.
Definition: device.h:146
const EtcPalUuid * dynamic_responders
An array of initial virtual RDM responders on this endpoint, identified by RID.
Definition: device.h:153
const RdmUid * static_responders
Definition: device.h:157
size_t num_static_responders
Definition: device.h:159
size_t num_dynamic_responders
Definition: device.h:155
A set of configuration settings that a device needs to initialize.
Definition: device.h:388
rdm::Uid uid
The device's RDM UID. For a dynamic UID, use rdm::Uid::DynamicUidRequest().
Definition: device.h:390
Settings()=default
Create an empty, invalid data structure by default.
std::vector< PhysicalEndpointConfig > physical_endpoints
Array of configurations for physical endpoints that are present on the device at startup.
Definition: device.h:400
std::string search_domain
The device's search domain for discovering brokers.
Definition: device.h:391
uint8_t * response_buf
Definition: device.h:395
etcpal::Uuid cid
The device's Component Identifier (CID).
Definition: device.h:389
bool IsValid() const
Determine whether a device Settings instance contains valid data for RDMnet operation.
Definition: device.h:593
std::vector< VirtualEndpointConfig > virtual_endpoints
Array of configurations for virtual endpoints that are present on the device at startup.
Definition: device.h:398