Skip to content

Commit e8c755c

Browse files
authored
Merge pull request #1996 from peternewman/plugfest
Add some E1.37-5 PIDs and accompanying RDM tests
2 parents 4690c7e + 7943d7a commit e8c755c

28 files changed

+3285
-67
lines changed

common/rdm/DummyResponder.cpp

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,18 @@ const ResponderOps<DummyResponder>::ParamHandler
160160
{ PID_DNS_NAME_SERVER,
161161
&DummyResponder::GetDNSNameServer,
162162
NULL},
163+
{ PID_MANUFACTURER_URL,
164+
&DummyResponder::GetManufacturerURL,
165+
NULL},
166+
{ PID_PRODUCT_URL,
167+
&DummyResponder::GetProductURL,
168+
NULL},
169+
{ PID_FIRMWARE_URL,
170+
&DummyResponder::GetFirmwareURL,
171+
NULL},
172+
{ PID_TEST_DATA,
173+
&DummyResponder::GetTestData,
174+
&DummyResponder::SetTestData},
163175
{ OLA_MANUFACTURER_PID_CODE_VERSION,
164176
&DummyResponder::GetOlaCodeVersion,
165177
NULL},
@@ -225,7 +237,7 @@ RDMResponse *DummyResponder::GetParamDescription(
225237
RDMResponse *DummyResponder::GetDeviceInfo(const RDMRequest *request) {
226238
return ResponderHelper::GetDeviceInfo(
227239
request, OLA_DUMMY_DEVICE_MODEL,
228-
PRODUCT_CATEGORY_OTHER, 3,
240+
PRODUCT_CATEGORY_OTHER, 4,
229241
&m_personality_manager,
230242
m_start_address,
231243
0, m_sensors.size());
@@ -435,6 +447,39 @@ RDMResponse *DummyResponder::GetDNSNameServer(
435447
m_network_manager.get());
436448
}
437449

450+
RDMResponse *DummyResponder::GetManufacturerURL(
451+
const RDMRequest *request) {
452+
return ResponderHelper::GetString(
453+
// TODO(Peter): This field's length isn't limited in the spec
454+
request, OLA_MANUFACTURER_URL, 0, UINT8_MAX);
455+
}
456+
457+
RDMResponse *DummyResponder::GetProductURL(
458+
const RDMRequest *request) {
459+
return ResponderHelper::GetString(
460+
request,
461+
"https://openlighting.org/rdm-tools/dummy-responders/",
462+
0,
463+
UINT8_MAX); // TODO(Peter): This field's length isn't limited in the spec
464+
}
465+
466+
RDMResponse *DummyResponder::GetFirmwareURL(
467+
const RDMRequest *request) {
468+
return ResponderHelper::GetString(
469+
request,
470+
"https://github.com/OpenLightingProject/ola",
471+
0,
472+
UINT8_MAX); // TODO(Peter): This field's length isn't limited in the spec
473+
}
474+
475+
RDMResponse *DummyResponder::GetTestData(const RDMRequest *request) {
476+
return ResponderHelper::GetTestData(request);
477+
}
478+
479+
RDMResponse *DummyResponder::SetTestData(const RDMRequest *request) {
480+
return ResponderHelper::SetTestData(request);
481+
}
482+
438483
RDMResponse *DummyResponder::GetOlaCodeVersion(
439484
const RDMRequest *request) {
440485
return ResponderHelper::GetString(request, VERSION);

common/rdm/Makefile.mk

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,8 @@ test_programs += \
8686
common/rdm/RDMHelperTester \
8787
common/rdm/RDMMessageTester \
8888
common/rdm/RDMReplyTester \
89+
common/rdm/ResponderHelperTester \
90+
common/rdm/ResponderTagSetTester \
8991
common/rdm/UIDAllocatorTester \
9092
common/rdm/UIDTester
9193

@@ -142,6 +144,15 @@ common_rdm_RDMCommandSerializerTester_SOURCES = \
142144
common_rdm_RDMCommandSerializerTester_CXXFLAGS = $(COMMON_TESTING_FLAGS)
143145
common_rdm_RDMCommandSerializerTester_LDADD = $(COMMON_TESTING_LIBS)
144146

147+
common_rdm_ResponderHelperTester_SOURCES = common/rdm/ResponderHelperTest.cpp
148+
common_rdm_ResponderHelperTester_CXXFLAGS = $(COMMON_TESTING_FLAGS)
149+
common_rdm_ResponderHelperTester_LDADD = $(COMMON_TESTING_LIBS)
150+
151+
common_rdm_ResponderTagSetTester_SOURCES = \
152+
common/rdm/ResponderTagSetTest.cpp
153+
common_rdm_ResponderTagSetTester_CXXFLAGS = $(COMMON_TESTING_FLAGS)
154+
common_rdm_ResponderTagSetTester_LDADD = $(COMMON_TESTING_LIBS)
155+
145156
common_rdm_QueueingRDMControllerTester_SOURCES = \
146157
common/rdm/QueueingRDMControllerTest.cpp \
147158
common/rdm/TestHelper.h

common/rdm/OpenLightingEnums.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,5 +23,6 @@ namespace ola {
2323
namespace rdm {
2424

2525
const char OLA_MANUFACTURER_LABEL[] = "Open Lighting Project";
26+
const char OLA_MANUFACTURER_URL[] = "https://openlighting.org/";
2627
} // namespace rdm
2728
} // namespace ola

common/rdm/PidStoreLoader.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -514,7 +514,7 @@ const FieldDescriptor *PidStoreLoader::IntegerFieldToFieldDescriptor(
514514
intervals.push_back(interval);
515515
}
516516

517-
// if not intervals were specified, we automatically add all the labels
517+
// if no intervals were specified, we automatically add all the labels
518518
bool intervals_empty = intervals.empty();
519519

520520
for (int i = 0; i < field.label_size(); ++i) {
@@ -550,7 +550,8 @@ const FieldDescriptor *PidStoreLoader::StringFieldToFieldDescriptor(
550550
min = field.min_size();
551551

552552
if (!field.has_max_size()) {
553-
OLA_WARN << "String field failed to specify max size";
553+
OLA_WARN << "String field " << field.name()
554+
<< " failed to specify max size";
554555
return NULL;
555556
}
556557
return new ola::messaging::StringFieldDescriptor(

common/rdm/RDMHelper.cpp

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1146,5 +1146,45 @@ string UnitToString(uint8_t unit) {
11461146
return str.str();
11471147
}
11481148
}
1149+
1150+
1151+
/**
1152+
* Convert a uint8_t representing a shipping lock state to a human-readable string.
1153+
* @param shipping_lock_state the shipping lock state value
1154+
*/
1155+
string ShippingLockStateToString(uint8_t shipping_lock_state) {
1156+
switch (shipping_lock_state) {
1157+
case SHIPPING_LOCK_STATE_UNLOCKED:
1158+
return "Unlocked";
1159+
case SHIPPING_LOCK_STATE_LOCKED:
1160+
return "Locked";
1161+
case SHIPPING_LOCK_STATE_PARTIALLY_LOCKED:
1162+
return "Partially locked";
1163+
default:
1164+
ostringstream str;
1165+
str << "Unknown, was " << static_cast<int>(shipping_lock_state);
1166+
return str.str();
1167+
}
1168+
}
1169+
1170+
1171+
/**
1172+
* Safely convert a uint8_t to a rdm_shipping_lock_state
1173+
*/
1174+
bool UIntToShippingLockState(uint8_t state, rdm_shipping_lock_state *shipping_lock_state) {
1175+
switch (state) {
1176+
case SHIPPING_LOCK_STATE_UNLOCKED:
1177+
*shipping_lock_state = SHIPPING_LOCK_STATE_UNLOCKED;
1178+
return true;
1179+
case SHIPPING_LOCK_STATE_LOCKED:
1180+
*shipping_lock_state = SHIPPING_LOCK_STATE_LOCKED;
1181+
return true;
1182+
case SHIPPING_LOCK_STATE_PARTIALLY_LOCKED:
1183+
*shipping_lock_state = SHIPPING_LOCK_STATE_PARTIALLY_LOCKED;
1184+
return true;
1185+
default:
1186+
return false;
1187+
}
1188+
}
11491189
} // namespace rdm
11501190
} // namespace ola

common/rdm/ResponderHelper.cpp

Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ using ola::network::InterfacePicker;
4747
using ola::network::IPV4Address;
4848
using ola::network::MACAddress;
4949
using ola::network::NetworkToHost;
50+
using ola::strings::StrNLength;
5051
using std::min;
5152
using std::string;
5253
using std::vector;
@@ -79,6 +80,24 @@ bool ResponderHelper::ExtractUInt32(const RDMRequest *request,
7980
return GenericExtractValue(request, output);
8081
}
8182

83+
bool ResponderHelper::ExtractString(const RDMRequest *request,
84+
std::string *output,
85+
uint8_t max_length) {
86+
if (request->ParamDataSize() > max_length) {
87+
return false;
88+
}
89+
90+
size_t len = (size_t) request->ParamDataSize();
91+
if (request->ParamData() != NULL) {
92+
// StrNLength ensures we stop on the first null we hit
93+
len = StrNLength(reinterpret_cast<const char*>(request->ParamData()),
94+
min(len, (size_t) max_length));
95+
}
96+
const string value(reinterpret_cast<const char*>(request->ParamData()), len);
97+
*output = value;
98+
return true;
99+
}
100+
82101

83102
RDMResponse *ResponderHelper::GetDeviceInfo(
84103
const RDMRequest *request,
@@ -1053,6 +1072,121 @@ RDMResponse *ResponderHelper::GetIPV4Address(
10531072
queued_message_count);
10541073
}
10551074

1075+
RDMResponse *ResponderHelper::GetTestData(
1076+
const RDMRequest *request,
1077+
uint8_t queued_message_count) {
1078+
uint16_t pattern_length;
1079+
if (!ExtractUInt16(request, &pattern_length)) {
1080+
return NackWithReason(request, NR_FORMAT_ERROR, queued_message_count);
1081+
}
1082+
1083+
if (pattern_length > MAX_RDM_TEST_DATA_PATTERN_LENGTH) {
1084+
return NackWithReason(request, NR_DATA_OUT_OF_RANGE, queued_message_count);
1085+
}
1086+
1087+
uint8_t pattern_data[pattern_length];
1088+
1089+
for (unsigned int i = 0; i < pattern_length; i++) {
1090+
// Need to return values 0-255, 0... etc
1091+
pattern_data[i] = i % (UINT8_MAX + 1);
1092+
}
1093+
1094+
return GetResponseFromData(
1095+
request,
1096+
reinterpret_cast<uint8_t*>(&pattern_data),
1097+
sizeof(pattern_data),
1098+
RDM_ACK,
1099+
queued_message_count);
1100+
}
1101+
1102+
RDMResponse *ResponderHelper::SetTestData(
1103+
const RDMRequest *request,
1104+
uint8_t queued_message_count) {
1105+
return GetResponseFromData(
1106+
request,
1107+
request->ParamData(),
1108+
request->ParamDataSize(),
1109+
RDM_ACK,
1110+
queued_message_count);
1111+
}
1112+
1113+
RDMResponse *ResponderHelper::GetListTags(
1114+
const RDMRequest *request,
1115+
const TagSet *tag_set,
1116+
uint8_t queued_message_count) {
1117+
if (request->ParamDataSize()) {
1118+
return NackWithReason(request, NR_FORMAT_ERROR, queued_message_count);
1119+
}
1120+
1121+
uint8_t tags[(MAX_RDM_STRING_LENGTH + 1) * tag_set->Size()];
1122+
unsigned int pdl = sizeof(tags);
1123+
1124+
tag_set->Pack(tags, &pdl);
1125+
1126+
return GetResponseFromData(request, tags, pdl,
1127+
RDM_ACK, queued_message_count);
1128+
}
1129+
1130+
RDMResponse *ResponderHelper::SetAddTag(
1131+
const RDMRequest *request,
1132+
TagSet *tag_set,
1133+
uint8_t queued_message_count) {
1134+
string tag;
1135+
if (!ResponderHelper::ExtractString(request, &tag)) {
1136+
return NackWithReason(request, NR_FORMAT_ERROR, queued_message_count);
1137+
}
1138+
1139+
tag_set->AddTag(tag);
1140+
1141+
return ResponderHelper::EmptySetResponse(request, queued_message_count);
1142+
}
1143+
1144+
RDMResponse *ResponderHelper::SetRemoveTag(
1145+
const RDMRequest *request,
1146+
TagSet *tag_set,
1147+
uint8_t queued_message_count) {
1148+
string tag;
1149+
if (!ResponderHelper::ExtractString(request, &tag)) {
1150+
return NackWithReason(request, NR_FORMAT_ERROR, queued_message_count);
1151+
}
1152+
1153+
if (tag_set->Contains(tag)) {
1154+
tag_set->RemoveTag(tag);
1155+
1156+
return ResponderHelper::EmptySetResponse(request, queued_message_count);
1157+
} else {
1158+
return NackWithReason(request, NR_DATA_OUT_OF_RANGE, queued_message_count);
1159+
}
1160+
}
1161+
1162+
RDMResponse *ResponderHelper::GetCheckTag(
1163+
const RDMRequest *request,
1164+
const TagSet *tag_set,
1165+
uint8_t queued_message_count) {
1166+
string tag;
1167+
if (!ResponderHelper::ExtractString(request, &tag)) {
1168+
return NackWithReason(request, NR_FORMAT_ERROR, queued_message_count);
1169+
}
1170+
1171+
uint8_t param = tag_set->Contains(tag) ? 1 : 0;
1172+
1173+
return GetResponseFromData(request, &param, sizeof(param),
1174+
RDM_ACK, queued_message_count);
1175+
}
1176+
1177+
RDMResponse *ResponderHelper::SetClearTags(
1178+
const RDMRequest *request,
1179+
TagSet *tag_set,
1180+
uint8_t queued_message_count) {
1181+
if (request->ParamDataSize()) {
1182+
return NackWithReason(request, NR_FORMAT_ERROR, queued_message_count);
1183+
}
1184+
1185+
tag_set->Clear();
1186+
1187+
return ResponderHelper::EmptySetResponse(request, queued_message_count);
1188+
}
1189+
10561190
/**
10571191
* @brief Handle a request that returns a string
10581192
* @note this truncates the string to max_length

0 commit comments

Comments
 (0)