3434#include " ola/network/MACAddress.h"
3535#include " ola/network/NetworkUtils.h"
3636#include " ola/rdm/RDMEnums.h"
37+ #include " ola/rdm/ResponderEndpointManager.h"
3738#include " ola/rdm/ResponderHelper.h"
3839#include " ola/rdm/ResponderSensor.h"
3940#include " ola/strings/Utils.h"
@@ -81,7 +82,7 @@ bool ResponderHelper::ExtractUInt32(const RDMRequest *request,
8182}
8283
8384bool ResponderHelper::ExtractString (const RDMRequest *request,
84- std:: string *output,
85+ string *output,
8586 uint8_t max_length) {
8687 if (request->ParamDataSize () > max_length) {
8788 return false ;
@@ -965,7 +966,7 @@ RDMResponse *ResponderHelper::GetParamDescription(
965966 uint32_t min_value,
966967 uint32_t default_value,
967968 uint32_t max_value,
968- const string description,
969+ const string & description,
969970 uint8_t queued_message_count) {
970971 PACK (
971972 struct parameter_description_s {
@@ -1016,11 +1017,11 @@ RDMResponse *ResponderHelper::GetParamDescription(
10161017}
10171018
10181019RDMResponse *ResponderHelper::GetASCIIParamDescription (
1019- const RDMRequest *request,
1020- uint16_t pid,
1021- rdm_command_class command_class,
1022- const string description,
1023- uint8_t queued_message_count) {
1020+ const RDMRequest *request,
1021+ uint16_t pid,
1022+ rdm_command_class command_class,
1023+ const string & description,
1024+ uint8_t queued_message_count) {
10241025 return GetParamDescription (
10251026 request,
10261027 pid,
@@ -1037,12 +1038,12 @@ RDMResponse *ResponderHelper::GetASCIIParamDescription(
10371038}
10381039
10391040RDMResponse *ResponderHelper::GetBitFieldParamDescription (
1040- const RDMRequest *request,
1041- uint16_t pid,
1042- uint8_t pdl_size,
1043- rdm_command_class command_class,
1044- const string description,
1045- uint8_t queued_message_count) {
1041+ const RDMRequest *request,
1042+ uint16_t pid,
1043+ uint8_t pdl_size,
1044+ rdm_command_class command_class,
1045+ const string & description,
1046+ uint8_t queued_message_count) {
10461047 return GetParamDescription (
10471048 request,
10481049 pid,
@@ -1273,7 +1274,7 @@ RDMResponse *ResponderHelper::GetMetadataParameterVersion(
12731274RDMResponse *ResponderHelper::GetMetadataJSON (
12741275 const RDMRequest *request,
12751276 uint16_t pid,
1276- const string json,
1277+ const string & json,
12771278 uint8_t queued_message_count) {
12781279 PACK (
12791280 struct metadata_json_s {
@@ -1302,6 +1303,55 @@ RDMResponse *ResponderHelper::GetMetadataJSON(
13021303 queued_message_count);
13031304}
13041305
1306+ RDMResponse *ResponderHelper::GetEndpointList (
1307+ const RDMRequest *request,
1308+ const ola::rdm::EndpointManager *endpoint_manager,
1309+ uint8_t queued_message_count) {
1310+ PACK (
1311+ struct endpoint_info_s {
1312+ uint16_t endpoint_id;
1313+ uint8_t endpoint_type;
1314+ });
1315+ STATIC_ASSERT (sizeof (endpoint_info_s) == 3 );
1316+
1317+ PACK (
1318+ struct endpoint_list_s {
1319+ uint32_t list_change_number;
1320+ endpoint_info_s endpoints[5 ];
1321+ });
1322+ STATIC_ASSERT (sizeof (endpoint_list_s) == (4 + (sizeof (endpoint_info_s) * 5 )));
1323+
1324+ struct endpoint_list_s endpoint_list;
1325+ endpoint_list.list_change_number = HostToNetwork (endpoint_manager->list_change_number ());
1326+
1327+ vector<uint16_t > endpoints;
1328+
1329+ endpoint_manager->EndpointIDs (&endpoints);
1330+ for (unsigned int i = 0 ; i < endpoints.size (); i++) {
1331+ endpoint_list.endpoints [i].endpoint_id = HostToNetwork (endpoints[i]);
1332+ }
1333+
1334+ unsigned int param_data_size = (
1335+ sizeof (endpoint_list) -
1336+ sizeof (endpoint_list.endpoints ) + (sizeof (endpoint_info_s) * endpoints.size ()));
1337+
1338+ return GetResponseFromData (
1339+ request,
1340+ reinterpret_cast <uint8_t *>(&endpoint_list),
1341+ param_data_size,
1342+ RDM_ACK,
1343+ queued_message_count);
1344+ }
1345+
1346+ RDMResponse *ResponderHelper::GetEndpointListChange (
1347+ const RDMRequest *request,
1348+ const ola::rdm::EndpointManager *endpoint_manager,
1349+ uint8_t queued_message_count) {
1350+ return GetUInt32Value (request,
1351+ NetworkToHost (endpoint_manager->list_change_number ()),
1352+ queued_message_count);
1353+ }
1354+
13051355
13061356/* *
13071357 * @brief Handle a request that returns a string
@@ -1361,8 +1411,8 @@ RDMResponse *ResponderHelper::SetString(
13611411}
13621412
13631413RDMResponse *ResponderHelper::GetBoolValue (const RDMRequest *request,
1364- bool value,
1365- uint8_t queued_message_count) {
1414+ bool value,
1415+ uint8_t queued_message_count) {
13661416 if (request->ParamDataSize ()) {
13671417 return NackWithReason (request, NR_FORMAT_ERROR, queued_message_count);
13681418 }
@@ -1373,8 +1423,8 @@ RDMResponse *ResponderHelper::GetBoolValue(const RDMRequest *request,
13731423}
13741424
13751425RDMResponse *ResponderHelper::SetBoolValue (const RDMRequest *request,
1376- bool *value,
1377- uint8_t queued_message_count) {
1426+ bool *value,
1427+ uint8_t queued_message_count) {
13781428 uint8_t arg;
13791429 if (!ResponderHelper::ExtractUInt8 (request, &arg)) {
13801430 return NackWithReason (request, NR_FORMAT_ERROR, queued_message_count);
@@ -1390,8 +1440,8 @@ RDMResponse *ResponderHelper::SetBoolValue(const RDMRequest *request,
13901440
13911441template <typename T>
13921442static RDMResponse *GenericGetIntValue (const RDMRequest *request,
1393- T value,
1394- uint8_t queued_message_count = 0 ) {
1443+ T value,
1444+ uint8_t queued_message_count = 0 ) {
13951445 if (request->ParamDataSize ()) {
13961446 return NackWithReason (request, NR_FORMAT_ERROR, queued_message_count);
13971447 }
@@ -1427,8 +1477,8 @@ RDMResponse *ResponderHelper::GetUInt32Value(
14271477
14281478template <typename T>
14291479static RDMResponse *GenericSetIntValue (const RDMRequest *request,
1430- T *value,
1431- uint8_t queued_message_count = 0 ) {
1480+ T *value,
1481+ uint8_t queued_message_count = 0 ) {
14321482 if (!GenericExtractValue (request, value)) {
14331483 return NackWithReason (request, NR_FORMAT_ERROR, queued_message_count);
14341484 }
0 commit comments