Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 40 additions & 0 deletions common/utils/UtilsTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,26 +20,66 @@

#include <cppunit/extensions/HelperMacros.h>

#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();
};


CPPUNIT_TEST_SUITE_REGISTRATION(UtilsTest);

/*
* Test the SequenceNumber class
*/
void UtilsTest::testSequenceNumber() {
// Test a basic uint8 sequence
SequenceNumber<uint8_t> uint8_sequence;
OLA_ASSERT_EQ(uint8_sequence.Next(), static_cast<uint8_t>(0));
OLA_ASSERT_EQ(uint8_sequence.Next(), static_cast<uint8_t>(1));
OLA_ASSERT_EQ(uint8_sequence.Next(), static_cast<uint8_t>(2));

// Test a basic uint16 sequence
SequenceNumber<uint16_t> uint16_sequence;
OLA_ASSERT_EQ(uint16_sequence.Next(), static_cast<uint16_t>(0));
OLA_ASSERT_EQ(uint16_sequence.Next(), static_cast<uint16_t>(1));
OLA_ASSERT_EQ(uint16_sequence.Next(), static_cast<uint16_t>(2));

// Test a basic uint32 sequence
SequenceNumber<uint32_t> uint32_sequence;
OLA_ASSERT_EQ(uint32_sequence.Next(), static_cast<uint32_t>(0));
OLA_ASSERT_EQ(uint32_sequence.Next(), static_cast<uint32_t>(1));
OLA_ASSERT_EQ(uint32_sequence.Next(), static_cast<uint32_t>(2));

// Test a uint8 sequence starting at an offset
SequenceNumber<uint8_t> uint8_offset_sequence(20);
OLA_ASSERT_EQ(uint8_offset_sequence.Next(), static_cast<uint8_t>(20));
OLA_ASSERT_EQ(uint8_offset_sequence.Next(), static_cast<uint8_t>(21));
OLA_ASSERT_EQ(uint8_offset_sequence.Next(), static_cast<uint8_t>(22));

// Test a uint8 sequence wraps around
SequenceNumber<uint8_t> uint8_wrapping_sequence(254);
OLA_ASSERT_EQ(uint8_wrapping_sequence.Next(), static_cast<uint8_t>(254));
OLA_ASSERT_EQ(uint8_wrapping_sequence.Next(), static_cast<uint8_t>(255));
OLA_ASSERT_EQ(uint8_wrapping_sequence.Next(), static_cast<uint8_t>(0));
OLA_ASSERT_EQ(uint8_wrapping_sequence.Next(), static_cast<uint8_t>(1));
}

/*
* Test the SplitUInt16 function
*/
Expand Down
3 changes: 3 additions & 0 deletions include/olad/Universe.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
#include <ola/rdm/RDMControllerInterface.h>
#include <ola/rdm/UID.h>
#include <ola/rdm/UIDSet.h>
#include <ola/util/SequenceNumber.h>
#include <olad/DmxSource.h>

#include <set>
Expand Down Expand Up @@ -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();
Expand Down Expand Up @@ -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<uint8_t> m_transaction_number_sequence;

void HandleBroadcastAck(broadcast_request_tracker *tracker,
ola::rdm::RDMReply *reply);
Expand Down
6 changes: 3 additions & 3 deletions olad/OlaServerServiceImpl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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(),
Expand All @@ -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(),
Expand Down Expand Up @@ -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(),
Expand Down
9 changes: 8 additions & 1 deletion olad/plugin_api/Universe.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down Expand Up @@ -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).
Expand Down