diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index d16e0ed443..6340645250 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -21,7 +21,7 @@ jobs: pkg: "gcc g++" - id: "distcheck-debian-stable-amd64-gcc" task: "distcheck" - configure-args: "--enable-ja-rule --enable-e133 --enable-rdm-tests --enable-java-libs" + configure-args: "--enable-ja-rule --enable-e133 --enable-rdm-tests" # TODO(Perry): Fix Debian 12 OOM issue on GitHub Actions container: "debian:stable" compiler: @@ -30,7 +30,7 @@ jobs: pkg: "gcc g++" - id: "distcheck-debian-stable-amd64-clang" task: "distcheck" - configure-args: "--enable-ja-rule --enable-e133 --enable-rdm-tests --enable-java-libs" + configure-args: "--enable-ja-rule --enable-e133 --enable-rdm-tests" # TODO(Perry): Fix Debian 12 OOM issue on GitHub Actions container: "debian:stable" compiler: @@ -50,13 +50,13 @@ jobs: run: apt-get update -y # See comments beginning at # https://github.com/actions/runner/issues/763#issuecomment-1435474884 - # Without Git, actions/checkout@v3 will resort to REST and will not + # Without Git, actions/checkout@v4 will resort to REST and will not # create a .git folder or .git.config. The Problem Matcher looks for # .git/config to find where the root of the repo is, so it must be # present. - name: Install Git run: apt-get -y install git - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: fetch-depth: 0 # Fetch all tags for generating OLA_BUILD_NAME - name: Install build tools @@ -92,17 +92,18 @@ jobs: - name: Autoreconf run: sudo --preserve-env -u builduser env "PATH=$PATH" autoreconf -i - name: Set configure arguments + # Env var name DISTCHECK_CONFIGURE_FLAGS must be used, see #1881 and #1883 run: | - echo "GH_OLA_CONFIGURE_ARGS=${{ matrix.configure-args }}" >> $GITHUB_ENV + echo "DISTCHECK_CONFIGURE_FLAGS=${{ matrix.configure-args }}" >> $GITHUB_ENV - name: Set additional Linux configure arguments if: runner.os == 'Linux' # Silence all deprecated declarations on Linux due to auto_ptr making the build log too long run: | - echo "GH_OLA_CONFIGURE_ARGS=$GH_OLA_CONFIGURE_ARGS CPPFLAGS=-Wno-deprecated-declarations" >> $GITHUB_ENV + echo "DISTCHECK_CONFIGURE_FLAGS=$DISTCHECK_CONFIGURE_FLAGS CPPFLAGS=-Wno-deprecated-declarations" >> $GITHUB_ENV - name: Print configure command - run: echo "./configure $GH_OLA_CONFIGURE_ARGS" + run: echo "./configure $DISTCHECK_CONFIGURE_FLAGS" - name: Configure - run: sudo --preserve-env -u builduser env "PATH=$PATH" ./configure $GH_OLA_CONFIGURE_ARGS + run: sudo --preserve-env -u builduser env "PATH=$PATH" ./configure $DISTCHECK_CONFIGURE_FLAGS - name: ${{ matrix.task }} run: sudo --preserve-env -u builduser env "PATH=$PATH" make ${{ matrix.task }} -j${{ steps.num-cpu-cores.outputs.NUM_CPU_CORES }} VERBOSE=1 - name: Display structure of the built files diff --git a/.github/workflows/debian.yml b/.github/workflows/debian.yml index 2e08f0a6d1..23519a8700 100644 --- a/.github/workflows/debian.yml +++ b/.github/workflows/debian.yml @@ -21,13 +21,13 @@ jobs: run: apt-get update -y # See comments beginning at # https://github.com/actions/runner/issues/763#issuecomment-1435474884 - # Without Git, actions/checkout@v3 will resort to REST and will not + # Without Git, actions/checkout@v4 will resort to REST and will not # create a .git folder or .git.config. The Problem Matcher looks for # .git/config to find where the root of the repo is, so it must be # present. - name: Install Git and lsb-release run: apt-get -y install git lsb-release - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: fetch-depth: 0 # Fetch all tags for generating OLA_BUILD_NAME - name: Generate build name @@ -99,7 +99,7 @@ jobs: run: apt-get update -y - name: Install Git and lsb-release run: apt-get -y install git lsb-release - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: fetch-depth: 0 # Fetch all tags for generating OLA_DEBIAN_BUILD_VERSION - name: Generate build name # Job step outputs can't be passed between builds for matrix jobs, so we re-generate diff --git a/.github/workflows/isort.yml b/.github/workflows/isort.yml index f314e5b555..9aff6b16d1 100644 --- a/.github/workflows/isort.yml +++ b/.github/workflows/isort.yml @@ -8,5 +8,5 @@ jobs: isort: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: isort/isort-action@v1 diff --git a/.github/workflows/lint.yaml b/.github/workflows/lint.yaml index 731f617f5c..0c49e768a0 100644 --- a/.github/workflows/lint.yaml +++ b/.github/workflows/lint.yaml @@ -10,13 +10,13 @@ jobs: run: apt-get update -y # See comments beginning at # https://github.com/actions/runner/issues/763#issuecomment-1435474884 - # Without Git, actions/checkout@v3 will resort to REST and will not + # Without Git, actions/checkout@v4 will resort to REST and will not # create a .git folder or .git.config. The Problem Matcher looks for # .git/config to find where the root of the repo is, so it must be # present. - name: Install Git run: apt-get -y install git - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Install build tools shell: bash run: | @@ -260,7 +260,7 @@ jobs: name: weblint runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Setup Node.js v18 uses: actions/setup-node@v3 with: diff --git a/.travis-ci.sh b/.travis-ci.sh index 3d1e0c758b..94a93939a7 100755 --- a/.travis-ci.sh +++ b/.travis-ci.sh @@ -291,6 +291,7 @@ elif [[ $TASK = 'pychecker-wip' ]]; then pychecker --quiet --limit 500 --blacklist $PYCHECKER_BLACKLIST $(find ./ -name "*.py" -and ! \( -name "*_pb2.py" -or -name "OlaClient.py" -or -name "ola_candidate_ports.py" \) | xargs) else # Otherwise compile and check as normal + # Env var name DISTCHECK_CONFIGURE_FLAGS must be used, see #1881 and #1883 if [[ "$TRAVIS_OS_NAME" = "linux" ]]; then # Silence all deprecated declarations on Linux due to auto_ptr making the build log too long export DISTCHECK_CONFIGURE_FLAGS='--enable-rdm-tests --enable-java-libs --enable-ja-rule --enable-e133 CPPFLAGS=-Wno-deprecated-declarations' diff --git a/README.developer b/README.developer index e989e800df..309ad07a92 100644 --- a/README.developer +++ b/README.developer @@ -55,7 +55,7 @@ The release lifecycle is: - New feature work occurs on the master branch. - Once the new features are considered stable or enough time has passed, a new minor release branch will be created, e.g. 0.10. -- The minor release branch will be stablized with bugfixes, these bug fixes +- The minor release branch will be stabilized with bugfixes, these bug fixes will also be merged back into master. - Once declared stable, a new patch branch 0 will be created e.g. 0.10.0 - Release specific changes like the version number, debian files etc. will be diff --git a/common/messaging/DescriptorTest.cpp b/common/messaging/DescriptorTest.cpp index eb7fcdbcc0..9c1bbcde44 100644 --- a/common/messaging/DescriptorTest.cpp +++ b/common/messaging/DescriptorTest.cpp @@ -34,6 +34,7 @@ using ola::messaging::BoolFieldDescriptor; using ola::messaging::FieldDescriptor; using ola::messaging::FieldDescriptorGroup; using ola::messaging::IPV4FieldDescriptor; +using ola::messaging::MACFieldDescriptor; using ola::messaging::StringFieldDescriptor; using ola::messaging::UIDFieldDescriptor; using ola::messaging::UInt16FieldDescriptor; @@ -76,6 +77,13 @@ void DescriptorTest::testFieldDescriptors() { OLA_ASSERT_TRUE(ipv4_descriptor.LimitedSize()); OLA_ASSERT_EQ(4u, ipv4_descriptor.MaxSize()); + // MAC address + MACFieldDescriptor mac_descriptor("mac"); + OLA_ASSERT_EQ(string("mac"), mac_descriptor.Name()); + OLA_ASSERT_TRUE(mac_descriptor.FixedSize()); + OLA_ASSERT_TRUE(mac_descriptor.LimitedSize()); + OLA_ASSERT_EQ(6u, mac_descriptor.MaxSize()); + // UID UIDFieldDescriptor uid_descriptor("uid"); OLA_ASSERT_EQ(string("uid"), uid_descriptor.Name()); diff --git a/common/messaging/MessagePrinterTest.cpp b/common/messaging/MessagePrinterTest.cpp index a096ab628d..0fdc2c2519 100644 --- a/common/messaging/MessagePrinterTest.cpp +++ b/common/messaging/MessagePrinterTest.cpp @@ -33,20 +33,23 @@ using std::string; using std::vector; using ola::rdm::UID; +using ola::network::MACAddress; using ola::messaging::BoolFieldDescriptor; using ola::messaging::BoolMessageField; using ola::messaging::FieldDescriptor; using ola::messaging::FieldDescriptorGroup; -using ola::messaging::GroupMessageField; -using ola::messaging::IPV4FieldDescriptor; using ola::messaging::GenericMessagePrinter; -using ola::messaging::IPV4MessageField; +using ola::messaging::GroupMessageField; using ola::messaging::Int16FieldDescriptor; using ola::messaging::Int16MessageField; using ola::messaging::Int8FieldDescriptor; using ola::messaging::Int8MessageField; +using ola::messaging::IPV4FieldDescriptor; +using ola::messaging::IPV4MessageField; +using ola::messaging::MACFieldDescriptor; +using ola::messaging::MACMessageField; using ola::messaging::Message; using ola::messaging::MessageFieldInterface; using ola::messaging::StringFieldDescriptor; @@ -87,6 +90,7 @@ void GenericMessagePrinterTest::testSimplePrinter() { // setup some fields BoolFieldDescriptor bool_descriptor("On/Off"); IPV4FieldDescriptor ipv4_descriptor("ip"); + MACFieldDescriptor mac_descriptor("mac"); UIDFieldDescriptor uid_descriptor("uid"); StringFieldDescriptor string_descriptor("Name", 0, 32); UInt32FieldDescriptor uint32_descriptor("Id"); @@ -100,6 +104,9 @@ void GenericMessagePrinterTest::testSimplePrinter() { fields.push_back( new IPV4MessageField(&ipv4_descriptor, ola::network::HostToNetwork(0x0a000001))); + fields.push_back( + new MACMessageField(&mac_descriptor, + MACAddress::FromStringOrDie("01:23:45:67:89:ab"))); fields.push_back(new UIDMessageField(&uid_descriptor, UID(0x7a70, 1))); fields.push_back(new StringMessageField(&string_descriptor, "foobar")); fields.push_back(new UInt32MessageField(&uint32_descriptor, 42)); @@ -109,8 +116,9 @@ void GenericMessagePrinterTest::testSimplePrinter() { Message message(fields); string expected = ( - "On/Off: false\nip: 10.0.0.1\nuid: 7a70:00000001\nName: foobar\nId: 42\n" - "Count: 4 x 10 ^ -3\nDelta: 10 x 10 ^ 1\nRate: 10 x 10 ^ -1\n"); + "On/Off: false\nip: 10.0.0.1\nmac: 01:23:45:67:89:ab\n" + "uid: 7a70:00000001\nName: foobar\nId: 42\nCount: 4 x 10 ^ -3\n" + "Delta: 10 x 10 ^ 1\nRate: 10 x 10 ^ -1\n"); OLA_ASSERT_EQ(expected, m_printer.AsString(&message)); } diff --git a/common/rdm/GroupSizeCalculatorTest.cpp b/common/rdm/GroupSizeCalculatorTest.cpp index a47b80d6c0..02559f5074 100644 --- a/common/rdm/GroupSizeCalculatorTest.cpp +++ b/common/rdm/GroupSizeCalculatorTest.cpp @@ -37,6 +37,7 @@ using ola::messaging::IPV4FieldDescriptor; using ola::messaging::Int16FieldDescriptor; using ola::messaging::Int32FieldDescriptor; using ola::messaging::Int8FieldDescriptor; +using ola::messaging::MACFieldDescriptor; using ola::messaging::StringFieldDescriptor; using ola::messaging::UIDFieldDescriptor; using ola::messaging::UInt16FieldDescriptor; @@ -83,6 +84,7 @@ void GroupSizeCalculatorTest::testSimpleCases() { fields.push_back(new Int8FieldDescriptor("int8")); fields.push_back(new Int16FieldDescriptor("int16")); fields.push_back(new Int32FieldDescriptor("int32")); + fields.push_back(new MACFieldDescriptor("mac")); fields.push_back(new StringFieldDescriptor("string", 0, 32)); fields.push_back(new IPV4FieldDescriptor("address")); fields.push_back(new UIDFieldDescriptor("uid")); @@ -91,7 +93,8 @@ void GroupSizeCalculatorTest::testSimpleCases() { unsigned int token_count, group_repeat_count; OLA_ASSERT_TRUE( m_static_calculator.CalculateTokensRequired(&descriptor, &token_count)); - OLA_ASSERT_EQ(10u, token_count); + OLA_ASSERT_EQ(11u, token_count); // Actual token count + OLA_ASSERT_EQ( GroupSizeCalculator::INSUFFICIENT_TOKENS, @@ -103,21 +106,21 @@ void GroupSizeCalculatorTest::testSimpleCases() { OLA_ASSERT_EQ( GroupSizeCalculator::INSUFFICIENT_TOKENS, m_calculator.CalculateGroupSize( - 9, + 10, // Actual token count - 1 &descriptor, &group_repeat_count)); OLA_ASSERT_EQ( GroupSizeCalculator::NO_VARIABLE_GROUPS, m_calculator.CalculateGroupSize( - 10, + 11, // Actual token count &descriptor, &group_repeat_count)); OLA_ASSERT_EQ( GroupSizeCalculator::EXTRA_TOKENS, m_calculator.CalculateGroupSize( - 11, + 12, // Actual token count + 1 &descriptor, &group_repeat_count)); } diff --git a/common/rpc/RpcChannel.cpp b/common/rpc/RpcChannel.cpp index 7d1c81d6fd..10b5211e93 100644 --- a/common/rpc/RpcChannel.cpp +++ b/common/rpc/RpcChannel.cpp @@ -166,7 +166,7 @@ void RpcChannel::DescriptorReady() { m_buffer_size = AllocateMsgBuffer(m_expected_size); if (m_buffer_size < m_expected_size) { - OLA_WARN << "buffer size to small " << m_buffer_size << " < " << + OLA_WARN << "buffer size too small: " << m_buffer_size << " < " << m_expected_size; return; } diff --git a/examples/ola-client.cpp b/examples/ola-client.cpp index f6eeab53c9..c639889efd 100644 --- a/examples/ola-client.cpp +++ b/examples/ola-client.cpp @@ -84,6 +84,7 @@ typedef struct { string cmd; // argv[0] string uni_name; // universe name string dmx; // DMX string + bool blackout; ola::port_priority_mode priority_mode; // port priority mode uint8_t priority_value; // port priority value bool list_plugin_ids; @@ -304,6 +305,7 @@ void InitOptions(options *opts) { opts->port_direction = ola::client::OUTPUT_PORT; opts->device_id = INVALID_VALUE; opts->merge_mode = OlaUniverse::MERGE_HTP; + opts->blackout = false; opts->priority_mode = ola::PRIORITY_MODE_INHERIT; opts->priority_value = 0; } @@ -358,6 +360,7 @@ void ParseOptions(int argc, char *argv[], options *opts) { static struct option long_options[] = { {"dmx", required_argument, 0, 'd'}, + {"blackout", no_argument, 0, 'b'}, {"help", no_argument, 0, 'h'}, {"ltp", no_argument, 0, 'l'}, {"name", required_argument, 0, 'n'}, @@ -373,7 +376,7 @@ void ParseOptions(int argc, char *argv[], options *opts) { int option_index = 0; while (1) { - c = getopt_long(argc, argv, "ld:n:u:p:s:hv", long_options, &option_index); + c = getopt_long(argc, argv, "ld:bn:u:p:s:hv", long_options, &option_index); if (c == -1) break; @@ -384,6 +387,9 @@ void ParseOptions(int argc, char *argv[], options *opts) { case 'd': opts->dmx = optarg; break; + case 'b': + opts->blackout = true; + break; case 'h': opts->help = true; break; @@ -656,7 +662,8 @@ void DisplayUniverseMergeHelp(const options &opts) { * Help message for set dmx */ void DisplaySetDmxHelp(const options &opts) { - cout << "Usage: " << opts.cmd << " --universe --dmx \n" + cout << "Usage: " << opts.cmd << " --universe [ --dmx ] " + "[ --blackout ]\n" "\n" "Sets the DMX values for a universe.\n" "\n" @@ -665,6 +672,7 @@ void DisplaySetDmxHelp(const options &opts) { " -d, --dmx Comma separated DMX values, e.g. " "0,255,128 sets first channel to 0, second channel to 255" " and third channel to 128.\n" + " -b, --blackout Send a universe to blackout instead.\n" << endl; } @@ -857,9 +865,16 @@ int SendDmx(OlaClientWrapper *wrapper, const options &opts) { SelectServer *ss = wrapper->GetSelectServer(); OlaClient *client = wrapper->GetClient(); ola::DmxBuffer buffer; - bool status = buffer.SetFromString(opts.dmx); + bool status = false; + if (opts.blackout) { + status = buffer.Blackout(); + } else { + status = buffer.SetFromString(opts.dmx); + } - if (opts.uni < 0 || !status || buffer.Size() == 0) { + // A dmx string and blackout are mutually exclusive + if (opts.uni < 0 || !status || (opts.blackout && !opts.dmx.empty()) || + buffer.Size() == 0) { DisplaySetDmxHelp(opts); exit(1); } diff --git a/include/ola/io/MemoryBlock.h b/include/ola/io/MemoryBlock.h index 464fdfd77b..2a053d52bb 100644 --- a/include/ola/io/MemoryBlock.h +++ b/include/ola/io/MemoryBlock.h @@ -63,7 +63,7 @@ class MemoryBlock { /** * @brief Move the insertation point to the end of the block. - * This is useful if you want to use the block in pre-pend mode. + * This is useful if you want to use the block in prepend mode. */ void SeekBack() { m_first = m_data_end; diff --git a/include/ola/rdm/StringMessageBuilder.h b/include/ola/rdm/StringMessageBuilder.h index 4f08afc85e..f66187e682 100644 --- a/include/ola/rdm/StringMessageBuilder.h +++ b/include/ola/rdm/StringMessageBuilder.h @@ -22,7 +22,7 @@ * @addtogroup rdm_helpers * @{ * @file include/ola/rdm/StringMessageBuilder.h - * @brief Builds a Messagse object from a list of strings and a Descriptor. + * @brief Builds a Message object from a list of strings and a Descriptor. * @} */ diff --git a/libs/acn/DMPE131Inflator.cpp b/libs/acn/DMPE131Inflator.cpp index 3e11c3e4b2..ed011161d8 100644 --- a/libs/acn/DMPE131Inflator.cpp +++ b/libs/acn/DMPE131Inflator.cpp @@ -71,8 +71,9 @@ bool DMPE131Inflator::HandlePDUData(uint32_t vector, return true; } - if (universe_iter == m_handlers.end()) + if (universe_iter == m_handlers.end()) { return true; + } DMPHeader dmp_header = headers.GetDMPHeader(); @@ -104,16 +105,17 @@ bool DMPE131Inflator::HandlePDUData(uint32_t vector, if (address->Increment() != 1) { OLA_INFO << "E1.31 DMP packet with increment " << address->Increment() - << ", disarding"; + << ", disarding"; return true; } unsigned int length_remaining = pdu_len - available_length; int start_code = -1; - if (e131_header.UsingRev2()) + if (e131_header.UsingRev2()) { start_code = static_cast(address->Start()); - else if (length_remaining && address->Number()) + } else if (length_remaining && address->Number()) { start_code = *(data + available_length); + } // The only time we want to continue processing a non-0 start code is if it // contains a Terminate message. @@ -132,14 +134,16 @@ bool DMPE131Inflator::HandlePDUData(uint32_t vector, // Reaching here means that we actually have new data and we should merge. if (target_buffer && start_code == 0) { unsigned int channels = std::min(length_remaining, address->Number()); - if (e131_header.UsingRev2()) + if (e131_header.UsingRev2()) { target_buffer->Set(data + available_length, channels); - else - target_buffer->Set(data + available_length + 1, channels - 1); + } else { + target_buffer->Set(data + available_length + 1, channels - 1); + } } - if (universe_iter->second.priority) + if (universe_iter->second.priority) { *universe_iter->second.priority = universe_iter->second.active_priority; + } // merge the sources switch (universe_iter->second.sources.size()) { @@ -155,9 +159,11 @@ bool DMPE131Inflator::HandlePDUData(uint32_t vector, // HTP Merge universe_iter->second.buffer->Reset(); std::vector::const_iterator source_iter = - universe_iter->second.sources.begin(); - for (; source_iter != universe_iter->second.sources.end(); ++source_iter) + universe_iter->second.sources.begin(); + for (; source_iter != universe_iter->second.sources.end(); + ++source_iter) { universe_iter->second.buffer->HTPMerge(source_iter->buffer); + } universe_iter->second.closure->Run(); } return true; @@ -175,8 +181,9 @@ bool DMPE131Inflator::SetHandler(uint16_t universe, ola::DmxBuffer *buffer, uint8_t *priority, ola::Callback0 *closure) { - if (!closure || !buffer) + if (!closure || !buffer) { return false; + } UniverseHandlers::iterator iter = m_handlers.find(universe); @@ -265,38 +272,41 @@ bool DMPE131Inflator::TrackSourceIfRequired( iter++; } - if (sources.empty()) + if (sources.empty()) { universe_data->active_priority = 0; + } for (iter = sources.begin(); iter != sources.end(); ++iter) { - if (iter->cid == headers.GetRootHeader().GetCid()) + if (iter->cid == headers.GetRootHeader().GetCid()) { break; + } } if (iter == sources.end()) { // This is an untracked source if (e131_header.StreamTerminated() || - priority < universe_data->active_priority) + priority < universe_data->active_priority) { return false; + } if (priority > universe_data->active_priority) { - OLA_INFO << "Raising priority for universe " << - e131_header.Universe() << " from " << - static_cast(universe_data->active_priority) << " to " << - static_cast(priority); + OLA_INFO << "Raising priority for universe " << e131_header.Universe() + << " from " << static_cast(universe_data->active_priority) + << " to " << static_cast(priority); sources.clear(); universe_data->active_priority = priority; } if (sources.size() == MAX_MERGE_SOURCES) { // TODO(simon): flag this in the export map - OLA_WARN << "Max merge sources reached for universe " << - e131_header.Universe() << ", " << - headers.GetRootHeader().GetCid().ToString() << " won't be tracked"; + OLA_WARN << "Max merge sources reached for universe " + << e131_header.Universe() << ", " + << headers.GetRootHeader().GetCid().ToString() + << " won't be tracked"; return false; } else { - OLA_INFO << "Added new E1.31 source: " << - headers.GetRootHeader().GetCid().ToString(); + OLA_INFO << "Added new E1.31 source: " + << headers.GetRootHeader().GetCid().ToString(); dmx_source new_source; new_source.cid = headers.GetRootHeader().GetCid(); new_source.sequence = e131_header.Sequence(); @@ -311,19 +321,21 @@ bool DMPE131Inflator::TrackSourceIfRequired( int8_t seq_diff = static_cast(e131_header.Sequence() - iter->sequence); if (seq_diff <= 0 && seq_diff > SEQUENCE_DIFF_THRESHOLD) { - OLA_INFO << "Old packet received, ignoring, this # " << - static_cast(e131_header.Sequence()) << ", last " << - static_cast(iter->sequence); + OLA_INFO << "Old packet received, ignoring, this # " + << static_cast(e131_header.Sequence()) << ", last " + << static_cast(iter->sequence); return false; } iter->sequence = e131_header.Sequence(); if (e131_header.StreamTerminated()) { - OLA_INFO << "CID " << headers.GetRootHeader().GetCid().ToString() << - " sent a termination for universe " << e131_header.Universe(); + OLA_INFO << "CID " << headers.GetRootHeader().GetCid().ToString() + << " sent a termination for universe " + << e131_header.Universe(); sources.erase(iter); - if (sources.empty()) + if (sources.empty()) { universe_data->active_priority = 0; + } // We need to trigger a merge here else the buffer will be stale, we keep // the buffer as NULL though so we don't use the data. return true; diff --git a/libs/acn/DMPE131Inflator.h b/libs/acn/DMPE131Inflator.h index 35b62d845b..e1185b653b 100644 --- a/libs/acn/DMPE131Inflator.h +++ b/libs/acn/DMPE131Inflator.h @@ -36,58 +36,58 @@ class DMPE131Inflator: public DMPInflator { friend class DMPE131InflatorTest; public: - explicit DMPE131Inflator(bool ignore_preview): - DMPInflator(), - m_ignore_preview(ignore_preview) { - } - ~DMPE131Inflator(); + explicit DMPE131Inflator(bool ignore_preview): + DMPInflator(), + m_ignore_preview(ignore_preview) { + } + ~DMPE131Inflator(); - bool SetHandler(uint16_t universe, ola::DmxBuffer *buffer, - uint8_t *priority, ola::Callback0 *handler); - bool RemoveHandler(uint16_t universe); + bool SetHandler(uint16_t universe, ola::DmxBuffer *buffer, + uint8_t *priority, ola::Callback0 *handler); + bool RemoveHandler(uint16_t universe); - void RegisteredUniverses(std::vector *universes); + void RegisteredUniverses(std::vector *universes); protected: - virtual bool HandlePDUData(uint32_t vector, - const HeaderSet &headers, - const uint8_t *data, - unsigned int pdu_len); + virtual bool HandlePDUData(uint32_t vector, + const HeaderSet &headers, + const uint8_t *data, + unsigned int pdu_len); private: - typedef struct { - ola::acn::CID cid; - uint8_t sequence; - TimeStamp last_heard_from; - DmxBuffer buffer; - } dmx_source; + typedef struct { + ola::acn::CID cid; + uint8_t sequence; + TimeStamp last_heard_from; + DmxBuffer buffer; + } dmx_source; - typedef struct { - DmxBuffer *buffer; - Callback0 *closure; - uint8_t active_priority; - uint8_t *priority; - std::vector sources; - } universe_handler; + typedef struct { + DmxBuffer *buffer; + Callback0 *closure; + uint8_t active_priority; + uint8_t *priority; + std::vector sources; + } universe_handler; - typedef std::map UniverseHandlers; + typedef std::map UniverseHandlers; - UniverseHandlers m_handlers; - bool m_ignore_preview; - ola::Clock m_clock; + UniverseHandlers m_handlers; + bool m_ignore_preview; + ola::Clock m_clock; - bool TrackSourceIfRequired(universe_handler *universe_data, - const HeaderSet &headers, - DmxBuffer **buffer); + bool TrackSourceIfRequired(universe_handler *universe_data, + const HeaderSet &headers, + DmxBuffer **buffer); - // The max number of sources we'll track per universe. - static const uint8_t MAX_MERGE_SOURCES = 6; - // The max merge priority. - static const uint8_t MAX_E131_PRIORITY = 200; - // ignore packets that differ by less than this amount from the last one - static const int8_t SEQUENCE_DIFF_THRESHOLD = -20; - // expire sources after 2.5s - static const TimeInterval EXPIRY_INTERVAL; + // The max number of sources we'll track per universe. + static const uint8_t MAX_MERGE_SOURCES = 6; + // The max merge priority. + static const uint8_t MAX_E131_PRIORITY = 200; + // ignore packets that differ by less than this amount from the last one + static const int8_t SEQUENCE_DIFF_THRESHOLD = -20; + // expire sources after 2.5s + static const TimeInterval EXPIRY_INTERVAL; }; } // namespace acn } // namespace ola diff --git a/man/ola_set_dmx.1 b/man/ola_set_dmx.1 index 0de61b95f7..89f95379bb 100644 --- a/man/ola_set_dmx.1 +++ b/man/ola_set_dmx.1 @@ -4,7 +4,7 @@ ola_set_dmx \- Sets the DMX values for a universe. .SH SYNOPSIS .B ola_set_dmx -\fI--universe --dmx \fR +\fI--universe [ --dmx ] [ --blackout ]\fR .SH DESCRIPTION Sets the DMX values for a universe. .TP @@ -15,3 +15,7 @@ Display this help message and exit. .TP \fB\-d\fR, \fB\-\-dmx\fR Comma separated DMX values, e.g. 0,255,128 sets first channel to 0, second channel to 255 and third channel to 128. +.HP +\fB\-b\fR, \fB\-\-blackout\fR +Send a universe to blackout instead. +.TP diff --git a/plugins/artnet/ArtNetNodeTest.cpp b/plugins/artnet/ArtNetNodeTest.cpp index 65e5ecb5c2..85954801a7 100644 --- a/plugins/artnet/ArtNetNodeTest.cpp +++ b/plugins/artnet/ArtNetNodeTest.cpp @@ -211,7 +211,7 @@ class ArtNetNodeTest: public CppUnit::TestFixture { // This sends a tod data so 7s70:00000000 is insert into the tod void PopulateTod() { - SocketVerifier verifer(m_socket); + SocketVerifier verifier(m_socket); const uint8_t art_tod[] = { 'A', 'r', 't', '-', 'N', 'e', 't', 0x00, 0x00, 0x81, @@ -646,7 +646,7 @@ void ArtNetNodeTest::testBroadcastSendDMX() { m_socket->SetDiscardMode(false); { - SocketVerifier verifer(m_socket); + SocketVerifier verifier(m_socket); const uint8_t DMX_MESSAGE[] = { 'A', 'r', 't', '-', 'N', 'e', 't', 0x00, 0x00, 0x50, @@ -666,7 +666,7 @@ void ArtNetNodeTest::testBroadcastSendDMX() { // send an odd sized dmx frame, we should pad this to a multiple of two { - SocketVerifier verifer(m_socket); + SocketVerifier verifier(m_socket); const uint8_t DMX_MESSAGE2[] = { 'A', 'r', 't', '-', 'N', 'e', 't', 0x00, 0x00, 0x50, @@ -684,14 +684,14 @@ void ArtNetNodeTest::testBroadcastSendDMX() { } { // attempt to send on a invalid port - SocketVerifier verifer(m_socket); + SocketVerifier verifier(m_socket); DmxBuffer dmx; dmx.SetFromString("0,1,2,3,4"); OLA_ASSERT_FALSE(node.SendDMX(4, dmx)); } { // attempt to send an empty frame - SocketVerifier verifer(m_socket); + SocketVerifier verifier(m_socket); DmxBuffer empty_buffer; OLA_ASSERT(node.SendDMX(m_port_id, empty_buffer)); } @@ -717,7 +717,7 @@ void ArtNetNodeTest::testBroadcastSendDMXZeroUniverse() { m_socket->SetDiscardMode(false); { - SocketVerifier verifer(m_socket); + SocketVerifier verifier(m_socket); const uint8_t DMX_MESSAGE[] = { 'A', 'r', 't', '-', 'N', 'e', 't', 0x00, 0x00, 0x50, @@ -781,7 +781,7 @@ void ArtNetNodeTest::testBroadcastSendDMXZeroUniverse() { } { - SocketVerifier verifer(m_socket); + SocketVerifier verifier(m_socket); const uint8_t DMX_MESSAGE[] = { 'A', 'r', 't', '-', 'N', 'e', 't', 0x00, 0x00, 0x50, @@ -818,7 +818,7 @@ void ArtNetNodeTest::testLimitedBroadcastDMX() { m_socket->SetDiscardMode(false); { - SocketVerifier verifer(m_socket); + SocketVerifier verifier(m_socket); const uint8_t DMX_MESSAGE[] = { 'A', 'r', 't', '-', 'N', 'e', 't', 0x00, 0x00, 0x50, @@ -861,7 +861,7 @@ void ArtNetNodeTest::testNonBroadcastSendDMX() { vector node_addresses; { - SocketVerifier verifer(m_socket); + SocketVerifier verifier(m_socket); const uint8_t poll_reply_message[] = { 'A', 'r', 't', '-', 'N', 'e', 't', 0x00, 0x00, 0x21, @@ -926,7 +926,7 @@ void ArtNetNodeTest::testNonBroadcastSendDMX() { // add another peer { - SocketVerifier verifer(m_socket); + SocketVerifier verifier(m_socket); const uint8_t poll_reply_message2[] = { 'A', 'r', 't', '-', 'N', 'e', 't', 0x00, 0x00, 0x21, @@ -980,7 +980,7 @@ void ArtNetNodeTest::testNonBroadcastSendDMX() { // send another DMX frame, this should get unicast twice { - SocketVerifier verifer(m_socket); + SocketVerifier verifier(m_socket); const uint8_t DMX_MESSAGE2[] = { 'A', 'r', 't', '-', 'N', 'e', 't', 0x00, 0x00, 0x50, @@ -999,7 +999,7 @@ void ArtNetNodeTest::testNonBroadcastSendDMX() { // adjust the broadcast threshold { - SocketVerifier verifer(m_socket); + SocketVerifier verifier(m_socket); node.SetBroadcastThreshold(2); // send another DMX frame, this should get broadcast @@ -1050,7 +1050,7 @@ void ArtNetNodeTest::testReceiveDMX() { // 'receive' a DMX message { - SocketVerifier verifer(m_socket); + SocketVerifier verifier(m_socket); OLA_ASSERT_FALSE(m_got_dmx); ReceiveFromPeer(DMX_MESSAGE, sizeof(DMX_MESSAGE), peer_ip); OLA_ASSERT(m_got_dmx); @@ -1059,7 +1059,7 @@ void ArtNetNodeTest::testReceiveDMX() { // send a second frame { - SocketVerifier verifer(m_socket); + SocketVerifier verifier(m_socket); uint8_t DMX_MESSAGE2[] = { 'A', 'r', 't', '-', 'N', 'e', 't', 0x00, 0x00, 0x50, @@ -1079,7 +1079,7 @@ void ArtNetNodeTest::testReceiveDMX() { // advance the clock by more than the merge timeout (10s) { - SocketVerifier verifer(m_socket); + SocketVerifier verifier(m_socket); m_clock.AdvanceTime(11, 0); // send another message, but first update the seq # @@ -1128,7 +1128,7 @@ void ArtNetNodeTest::testReceiveDMXZeroUniverse() { 0, 6, // dmx length 0, 1, 2, 3, 4, 5 }; - SocketVerifier verifer(m_socket); + SocketVerifier verifier(m_socket); OLA_ASSERT_FALSE(m_got_dmx); ReceiveFromPeer(DMX_MESSAGE, sizeof(DMX_MESSAGE), peer_ip); OLA_ASSERT(m_got_dmx); @@ -1158,7 +1158,7 @@ void ArtNetNodeTest::testReceiveDMXZeroUniverse() { 0, 4, // dmx length 10, 11, 12, 13 }; - SocketVerifier verifer(m_socket); + SocketVerifier verifier(m_socket); OLA_ASSERT_FALSE(m_got_dmx); ReceiveFromPeer(DMX_MESSAGE, sizeof(DMX_MESSAGE), peer_ip); OLA_ASSERT(m_got_dmx); @@ -1186,7 +1186,7 @@ void ArtNetNodeTest::testHTPMerge() { // 'receive' a DMX message from the first peer { - SocketVerifier verifer(m_socket); + SocketVerifier verifier(m_socket); uint8_t source1_message1[] = { 'A', 'r', 't', '-', 'N', 'e', 't', 0x00, 0x00, 0x50, @@ -1206,7 +1206,7 @@ void ArtNetNodeTest::testHTPMerge() { // receive a message from a second peer { - SocketVerifier verifer(m_socket); + SocketVerifier verifier(m_socket); uint8_t source2_message1[] = { 'A', 'r', 't', '-', 'N', 'e', 't', 0x00, 0x00, 0x50, @@ -1267,7 +1267,7 @@ void ArtNetNodeTest::testHTPMerge() { // send a packet from a third source, this shouldn't result in any new dmx { - SocketVerifier verifer(m_socket); + SocketVerifier verifier(m_socket); const uint8_t source3_message1[] = { 'A', 'r', 't', '-', 'N', 'e', 't', 0x00, 0x00, 0x50, @@ -1287,7 +1287,7 @@ void ArtNetNodeTest::testHTPMerge() { // send another packet from the first source { - SocketVerifier verifer(m_socket); + SocketVerifier verifier(m_socket); uint8_t source1_message2[] = { 'A', 'r', 't', '-', 'N', 'e', 't', 0x00, 0x00, 0x50, @@ -1312,7 +1312,7 @@ void ArtNetNodeTest::testHTPMerge() { // send another packet from the first source { - SocketVerifier verifer(m_socket); + SocketVerifier verifier(m_socket); uint8_t source1_message3[] = { 'A', 'r', 't', '-', 'N', 'e', 't', 0x00, 0x00, 0x50, @@ -1337,7 +1337,7 @@ void ArtNetNodeTest::testHTPMerge() { // send another packet from the first source { - SocketVerifier verifer(m_socket); + SocketVerifier verifier(m_socket); uint8_t source1_message4[] = { 'A', 'r', 't', '-', 'N', 'e', 't', 0x00, 0x00, 0x50, @@ -1379,7 +1379,7 @@ void ArtNetNodeTest::testLTPMerge() { // switch to LTP merge mode, this will trigger an art poll reply { - SocketVerifier verifer(m_socket); + SocketVerifier verifier(m_socket); uint8_t poll_reply_message[] = { 'A', 'r', 't', '-', 'N', 'e', 't', 0x00, 0x00, 0x21, @@ -1422,7 +1422,7 @@ void ArtNetNodeTest::testLTPMerge() { // 'receive' a DMX message from the first peer { - SocketVerifier verifer(m_socket); + SocketVerifier verifier(m_socket); uint8_t source1_message1[] = { 'A', 'r', 't', '-', 'N', 'e', 't', 0x00, 0x00, 0x50, @@ -1442,7 +1442,7 @@ void ArtNetNodeTest::testLTPMerge() { // receive a message from a second peer { - SocketVerifier verifer(m_socket); + SocketVerifier verifier(m_socket); uint8_t source2_message1[] = { 'A', 'r', 't', '-', 'N', 'e', 't', 0x00, 0x00, 0x50, @@ -1506,7 +1506,7 @@ void ArtNetNodeTest::testLTPMerge() { // send another packet from the first source { - SocketVerifier verifer(m_socket); + SocketVerifier verifier(m_socket); uint8_t source1_message2[] = { 'A', 'r', 't', '-', 'N', 'e', 't', 0x00, 0x00, 0x50, @@ -1547,7 +1547,7 @@ void ArtNetNodeTest::testControllerDiscovery() { // send a tod control { - SocketVerifier verifer(m_socket); + SocketVerifier verifier(m_socket); ExpectedBroadcast(TOD_CONTROL, sizeof(TOD_CONTROL)); node.RunFullDiscovery( m_port_id, @@ -1557,7 +1557,7 @@ void ArtNetNodeTest::testControllerDiscovery() { // advance the clock and run the select server { - SocketVerifier verifer(m_socket); + SocketVerifier verifier(m_socket); m_clock.AdvanceTime(5, 0); // tod timeout is 4s ss.RunOnce(); // update the wake up time OLA_ASSERT(m_discovery_done); @@ -1568,7 +1568,7 @@ void ArtNetNodeTest::testControllerDiscovery() { // run discovery again, this time returning a ArtTod from a peer { - SocketVerifier verifer(m_socket); + SocketVerifier verifier(m_socket); m_discovery_done = false; ExpectedBroadcast(TOD_CONTROL, sizeof(TOD_CONTROL)); @@ -1602,7 +1602,7 @@ void ArtNetNodeTest::testControllerDiscovery() { // advance the clock and run the select server { - SocketVerifier verifer(m_socket); + SocketVerifier verifier(m_socket); m_clock.AdvanceTime(5, 0); // tod timeout is 4s ss.RunOnce(); // update the wake up time OLA_ASSERT(m_discovery_done); @@ -1617,7 +1617,7 @@ void ArtNetNodeTest::testControllerDiscovery() { // run discovery again, removing one UID, and moving another from peer1 // to peer2 { - SocketVerifier verifer(m_socket); + SocketVerifier verifier(m_socket); m_discovery_done = false; ExpectedBroadcast(TOD_CONTROL, sizeof(TOD_CONTROL)); @@ -1668,7 +1668,7 @@ void ArtNetNodeTest::testControllerDiscovery() { // advance the clock and run the select server { - SocketVerifier verifer(m_socket); + SocketVerifier verifier(m_socket); m_clock.AdvanceTime(5, 0); // tod timeout is 4s ss.RunOnce(); // update the wake up time OLA_ASSERT(m_discovery_done); @@ -1681,7 +1681,7 @@ void ArtNetNodeTest::testControllerDiscovery() { // try running discovery for a invalid port id { - SocketVerifier verifer(m_socket); + SocketVerifier verifier(m_socket); m_discovery_done = false; node.RunFullDiscovery( 4, @@ -1708,7 +1708,7 @@ void ArtNetNodeTest::testControllerIncrementalDiscovery() { // send a tod request { - SocketVerifier verifer(m_socket); + SocketVerifier verifier(m_socket); const uint8_t tod_request[] = { 'A', 'r', 't', '-', 'N', 'e', 't', 0x00, 0x00, 0x80, @@ -1733,7 +1733,7 @@ void ArtNetNodeTest::testControllerIncrementalDiscovery() { // respond with a tod { - SocketVerifier verifer(m_socket); + SocketVerifier verifier(m_socket); const uint8_t art_tod1[] = { 'A', 'r', 't', '-', 'N', 'e', 't', 0x00, 0x00, 0x81, @@ -1766,7 +1766,7 @@ void ArtNetNodeTest::testControllerIncrementalDiscovery() { // try running discovery for a invalid port id { - SocketVerifier verifer(m_socket); + SocketVerifier verifier(m_socket); m_discovery_done = false; node.RunIncrementalDiscovery( 4, @@ -1797,7 +1797,7 @@ void ArtNetNodeTest::testUnsolicitedTod() { // receive a tod { - SocketVerifier verifer(m_socket); + SocketVerifier verifier(m_socket); OLA_ASSERT_FALSE(m_discovery_done); // receive a ArtTod @@ -1848,7 +1848,7 @@ void ArtNetNodeTest::testResponderDiscovery() { // receive a tod request { - SocketVerifier verifer(m_socket); + SocketVerifier verifier(m_socket); const uint8_t tod_request[] = { 'A', 'r', 't', '-', 'N', 'e', 't', 0x00, 0x00, 0x80, @@ -1870,7 +1870,7 @@ void ArtNetNodeTest::testResponderDiscovery() { // respond with a Tod { - SocketVerifier verifer(m_socket); + SocketVerifier verifier(m_socket); const uint8_t art_tod1[] = { 'A', 'r', 't', '-', 'N', 'e', 't', 0x00, 0x00, 0x81, @@ -1897,7 +1897,7 @@ void ArtNetNodeTest::testResponderDiscovery() { // try a tod request a universe that doesn't match ours { - SocketVerifier verifer(m_socket); + SocketVerifier verifier(m_socket); m_tod_request = false; const uint8_t tod_request2[] = { 'A', 'r', 't', '-', 'N', 'e', 't', 0x00, @@ -1920,7 +1920,7 @@ void ArtNetNodeTest::testResponderDiscovery() { // check TodControl { - SocketVerifier verifer(m_socket); + SocketVerifier verifier(m_socket); OLA_ASSERT_FALSE(m_tod_flush); const uint8_t tod_control[] = { @@ -1940,7 +1940,7 @@ void ArtNetNodeTest::testResponderDiscovery() { // try a tod control a universe that doesn't match ours { - SocketVerifier verifer(m_socket); + SocketVerifier verifier(m_socket); m_tod_flush = false; OLA_ASSERT_FALSE(m_tod_flush); const uint8_t tod_control2[] = { @@ -1980,7 +1980,7 @@ void ArtNetNodeTest::testRDMResponder() { ola::NewCallback(this, &ArtNetNodeTest::HandleRDM))); { - SocketVerifier verifer(m_socket); + SocketVerifier verifier(m_socket); const uint8_t rdm_request[] = { 'A', 'r', 't', '-', 'N', 'e', 't', 0x00, 0x00, 0x83, @@ -2026,7 +2026,7 @@ void ArtNetNodeTest::testRDMResponder() { // run the RDM callback, triggering the response { - SocketVerifier verifer(m_socket); + SocketVerifier verifier(m_socket); const uint8_t rdm_response[] = { 'A', 'r', 't', '-', 'N', 'e', 't', 0x00, 0x00, 0x83, @@ -2079,7 +2079,7 @@ void ArtNetNodeTest::testRDMRequest() { // create a new RDM request { - SocketVerifier verifer(m_socket); + SocketVerifier verifier(m_socket); SendRDMRequest( &node, ola::NewSingleCallback(this, &ArtNetNodeTest::FinalizeRDM)); @@ -2087,7 +2087,7 @@ void ArtNetNodeTest::testRDMRequest() { // send a response { - SocketVerifier verifer(m_socket); + SocketVerifier verifier(m_socket); const uint8_t rdm_response[] = { 'A', 'r', 't', '-', 'N', 'e', 't', 0x00, 0x00, 0x83, @@ -2133,7 +2133,7 @@ void ArtNetNodeTest::testRDMRequestTimeout() { // create a new RDM request { - SocketVerifier verifer(m_socket); + SocketVerifier verifier(m_socket); SendRDMRequest( &node, ola::NewSingleCallback(this, &ArtNetNodeTest::ExpectTimeout)); @@ -2163,7 +2163,7 @@ void ArtNetNodeTest::testRDMRequestIPMismatch() { // create a new RDM request { - SocketVerifier verifer(m_socket); + SocketVerifier verifier(m_socket); SendRDMRequest( &node, ola::NewSingleCallback(this, &ArtNetNodeTest::ExpectTimeout)); @@ -2171,7 +2171,7 @@ void ArtNetNodeTest::testRDMRequestIPMismatch() { // send a response from a different IP { - SocketVerifier verifer(m_socket); + SocketVerifier verifier(m_socket); const uint8_t rdm_response[] = { 'A', 'r', 't', '-', 'N', 'e', 't', 0x00, 0x00, 0x83, @@ -2220,7 +2220,7 @@ void ArtNetNodeTest::testRDMRequestUIDMismatch() { // create a new RDM request { - SocketVerifier verifer(m_socket); + SocketVerifier verifier(m_socket); SendRDMRequest( &node, ola::NewSingleCallback(this, &ArtNetNodeTest::ExpectTimeout)); @@ -2228,7 +2228,7 @@ void ArtNetNodeTest::testRDMRequestUIDMismatch() { // send a response from a different IP { - SocketVerifier verifer(m_socket); + SocketVerifier verifier(m_socket); const uint8_t rdm_response[] = { 'A', 'r', 't', '-', 'N', 'e', 't', 0x00, 0x00, 0x83, @@ -2273,7 +2273,7 @@ void ArtNetNodeTest::testTimeCode() { m_socket->SetDiscardMode(false); { - SocketVerifier verifer(m_socket); + SocketVerifier verifier(m_socket); const uint8_t timecode_message[] = { 'A', 'r', 't', '-', 'N', 'e', 't', 0x00, 0x00, 0x97, diff --git a/plugins/usbpro/DmxterWidget.cpp b/plugins/usbpro/DmxterWidget.cpp index aae5f95645..4b061aa3b9 100644 --- a/plugins/usbpro/DmxterWidget.cpp +++ b/plugins/usbpro/DmxterWidget.cpp @@ -325,7 +325,7 @@ void DmxterWidgetImpl::HandleRDMResponse(const uint8_t *data, case RC_NACK_FORMAT_ERROR: case RC_NACK_HARDWARE_FAULT: case RC_NACK_PROXY_REJECT: - case RC_NACK_WRITE_PROECT: + case RC_NACK_WRITE_PROTECT: case RC_NACK_COMMAND_CLASS: case RC_NACK_DATA_RANGE: case RC_NACK_BUFFER_FULL: diff --git a/plugins/usbpro/DmxterWidget.h b/plugins/usbpro/DmxterWidget.h index 44cde56723..3e48ef1763 100644 --- a/plugins/usbpro/DmxterWidget.h +++ b/plugins/usbpro/DmxterWidget.h @@ -107,7 +107,7 @@ class DmxterWidgetImpl: public BaseUsbProWidget, RC_NACK_FORMAT_ERROR = 25, RC_NACK_HARDWARE_FAULT = 26, RC_NACK_PROXY_REJECT = 27, - RC_NACK_WRITE_PROECT = 28, + RC_NACK_WRITE_PROTECT = 28, RC_NACK_COMMAND_CLASS = 29, RC_NACK_DATA_RANGE = 30, RC_NACK_BUFFER_FULL = 31, diff --git a/tools/rdm/rdm_test_server.py b/tools/rdm/rdm_test_server.py index 80158c4c2e..62588be6ec 100755 --- a/tools/rdm/rdm_test_server.py +++ b/tools/rdm/rdm_test_server.py @@ -846,7 +846,7 @@ def _CheckValidUniverse(self, request): request: the HTTPRequest object. Returns: - The santitized universe id. + The sanitized universe id. Raises: ServerException if the universe isn't valid or doesn't exist.