diff --git a/common/utils/UtilsTest.cpp b/common/utils/UtilsTest.cpp index c9d534aa1c..bfe4a93877 100644 --- a/common/utils/UtilsTest.cpp +++ b/common/utils/UtilsTest.cpp @@ -20,19 +20,23 @@ #include +#include "ola/util/SequenceNumber.h" #include "ola/util/Utils.h" #include "ola/testing/TestUtils.h" +using ola::SequenceNumber; using ola::utils::SplitUInt16; using ola::utils::JoinUInt8; class UtilsTest: public CppUnit::TestFixture { CPPUNIT_TEST_SUITE(UtilsTest); + CPPUNIT_TEST(testSequenceNumber); CPPUNIT_TEST(testSplitUInt16); CPPUNIT_TEST(testJoinUInt8); CPPUNIT_TEST_SUITE_END(); public: + void testSequenceNumber(); void testSplitUInt16(); void testJoinUInt8(); }; @@ -40,6 +44,42 @@ class UtilsTest: public CppUnit::TestFixture { CPPUNIT_TEST_SUITE_REGISTRATION(UtilsTest); +/* + * Test the SequenceNumber class + */ +void UtilsTest::testSequenceNumber() { + // Test a basic uint8 sequence + SequenceNumber uint8_sequence; + OLA_ASSERT_EQ(uint8_sequence.Next(), static_cast(0)); + OLA_ASSERT_EQ(uint8_sequence.Next(), static_cast(1)); + OLA_ASSERT_EQ(uint8_sequence.Next(), static_cast(2)); + + // Test a basic uint16 sequence + SequenceNumber uint16_sequence; + OLA_ASSERT_EQ(uint16_sequence.Next(), static_cast(0)); + OLA_ASSERT_EQ(uint16_sequence.Next(), static_cast(1)); + OLA_ASSERT_EQ(uint16_sequence.Next(), static_cast(2)); + + // Test a basic uint32 sequence + SequenceNumber uint32_sequence; + OLA_ASSERT_EQ(uint32_sequence.Next(), static_cast(0)); + OLA_ASSERT_EQ(uint32_sequence.Next(), static_cast(1)); + OLA_ASSERT_EQ(uint32_sequence.Next(), static_cast(2)); + + // Test a uint8 sequence starting at an offset + SequenceNumber uint8_offset_sequence(20); + OLA_ASSERT_EQ(uint8_offset_sequence.Next(), static_cast(20)); + OLA_ASSERT_EQ(uint8_offset_sequence.Next(), static_cast(21)); + OLA_ASSERT_EQ(uint8_offset_sequence.Next(), static_cast(22)); + + // Test a uint8 sequence wraps around + SequenceNumber uint8_wrapping_sequence(254); + OLA_ASSERT_EQ(uint8_wrapping_sequence.Next(), static_cast(254)); + OLA_ASSERT_EQ(uint8_wrapping_sequence.Next(), static_cast(255)); + OLA_ASSERT_EQ(uint8_wrapping_sequence.Next(), static_cast(0)); + OLA_ASSERT_EQ(uint8_wrapping_sequence.Next(), static_cast(1)); +} + /* * Test the SplitUInt16 function */ diff --git a/include/olad/Universe.h b/include/olad/Universe.h index c43c14748a..a381887340 100644 --- a/include/olad/Universe.h +++ b/include/olad/Universe.h @@ -29,6 +29,7 @@ #include #include #include +#include #include #include @@ -132,6 +133,7 @@ class Universe: public ola::rdm::RDMControllerInterface { void NewUIDList(OutputPort *port, const ola::rdm::UIDSet &uids); void GetUIDs(ola::rdm::UIDSet *uids) const; unsigned int UIDCount() const; + uint8_t GetRDMTransactionNumber(); bool operator==(const Universe &other) { return m_universe_id == other.UniverseId(); @@ -180,6 +182,7 @@ class Universe: public ola::rdm::RDMControllerInterface { Clock *m_clock; TimeInterval m_rdm_discovery_interval; TimeStamp m_last_discovery_time; + ola::SequenceNumber m_transaction_number_sequence; void HandleBroadcastAck(broadcast_request_tracker *tracker, ola::rdm::RDMReply *reply); diff --git a/olad/OlaServerServiceImpl.cpp b/olad/OlaServerServiceImpl.cpp index adbb18e22e..7c0a1e504f 100644 --- a/olad/OlaServerServiceImpl.cpp +++ b/olad/OlaServerServiceImpl.cpp @@ -733,7 +733,7 @@ void OlaServerServiceImpl::RDMCommand( rdm_request = new ola::rdm::RDMSetRequest( source_uid, destination, - 0, // transaction # + universe->GetRDMTransactionNumber(), 1, // port id request->sub_device(), request->param_id(), @@ -744,7 +744,7 @@ void OlaServerServiceImpl::RDMCommand( rdm_request = new ola::rdm::RDMGetRequest( source_uid, destination, - 0, // transaction # + universe->GetRDMTransactionNumber(), 1, // port id request->sub_device(), request->param_id(), @@ -787,7 +787,7 @@ void OlaServerServiceImpl::RDMDiscoveryCommand( ola::rdm::RDMRequest *rdm_request = new ola::rdm::RDMDiscoveryRequest( source_uid, destination, - 0, // transaction # + universe->GetRDMTransactionNumber(), 1, // port id request->sub_device(), request->param_id(), diff --git a/olad/plugin_api/Universe.cpp b/olad/plugin_api/Universe.cpp index 6bc67346f7..8df09fedcd 100644 --- a/olad/plugin_api/Universe.cpp +++ b/olad/plugin_api/Universe.cpp @@ -96,7 +96,8 @@ Universe::Universe(unsigned int universe_id, UniverseStore *store, m_export_map(export_map), m_clock(clock), m_rdm_discovery_interval(), - m_last_discovery_time() { + m_last_discovery_time(), + m_transaction_number_sequence() { ostringstream universe_id_str, universe_name_str; universe_id_str << universe_id; m_universe_id_str = universe_id_str.str(); @@ -607,6 +608,12 @@ unsigned int Universe::UIDCount() const { return m_output_uids.size(); } +/** + * Return the RDM transaction number to use + */ +uint8_t Universe::GetRDMTransactionNumber() { + return m_transaction_number_sequence.Next(); +} /* * Return true if this universe is in use (has at least one port or client).