1
0
Fork 0

also track sequence number for syncronizaton

This commit is contained in:
Kevin Matz 2021-08-29 01:12:11 -04:00
parent 5101e0d22c
commit 08c07d1c9c
5 changed files with 38 additions and 17 deletions

View File

@ -178,12 +178,13 @@ void ArbitratingUniverse::set(std::shared_ptr<ACN::DMP::Pdu> pdu,
/**
* @brief MergeProxyUniverse::synchronize
* @brief ArbitratingUniverse::synchronize
* @param sequence_number
*/
void ArbitratingUniverse::synchronize()
void ArbitratingUniverse::synchronize(uint8_t sequence_number)
{
for ( auto& [_, uni] : sources_)
uni->synchronize();
uni->synchronize(sequence_number);
}

View File

@ -73,7 +73,7 @@ public:
std::shared_ptr<DATA::data_header> provenance() const override;
void setProvenance(std::shared_ptr<DATA::data_header>) override {};
bool isSyncronized() const override;
void synchronize() override;
void synchronize(uint8_t = 0) override;
// DMX::Universe Overrides:
const DMX::DimmerData *data() const override;

View File

@ -227,15 +227,15 @@ void Receiver::dataFrameHandler(ACN::PDU::Message<DATA::Pdu> frame) {
/// > \cite sACN 6.7.2 Sequence Numbering
/// >
/// > Having first received a packet with sequence number A,
auto a = universe->provenance()->sequence_number;
/// > a second packet with sequence number B arrives.
auto b = source->sequence_number;
/// > If, using signed 8-bit binary arithmetic, B - A
int8_t dif = b - a;
/// > is less than or equal to 0, but greater than -20,
if (dif <= 0 && dif > -20)
/// > then the packet containing sequence number B shall be deemed out of
/// > sequence and discarded.
auto a = universe->provenance()->sequence_number;
auto b = source->sequence_number;
int8_t dif = b - a;
if (dif <= 0 && dif > -20)
/// Tolerate out-of-spec sources transmitting 0s instead of a sequence number.
if (!(a == 0 && b == 0))
return;
@ -269,7 +269,7 @@ void Receiver::dataFrameHandler(ACN::PDU::Message<DATA::Pdu> frame) {
void Receiver::syncFrameHandler(ACN::PDU::Message<EXTENDED::Pdu> frame)
{
auto header = static_cast<EXTENDED::sync_header*>(frame->header());
universes_.at(header->sync_address)->synchronize();
universes_.at(header->sync_address)->synchronize(header->sequence_number);
}

View File

@ -160,15 +160,34 @@ std::shared_ptr<DATA::data_header> Universe::provenance() const
/**
* @brief Universe::synchronize
* @param sequence_number
*/
void Universe::synchronize()
void Universe::synchronize(uint8_t sequence_number)
{
if (sync_data_)
{
DMX::Universe::setData(*sync_data_);
delete sync_data_;
sync_data_ = nullptr;
}
if (!sync_data_)
return;
/// > \cite sACN 6.7.2 Sequence Numbering
/// >
/// > Having first received a packet with sequence number A,
/// > a second packet with sequence number B arrives.
/// > If, using signed 8-bit binary arithmetic, B - A
/// > is less than or equal to 0, but greater than -20,
/// > then the packet containing sequence number B shall be deemed out of
/// > sequence and discarded.
auto a = sync_sequence_;
auto b = sequence_number;
int8_t dif = b - a;
if (dif <= 0 && dif > -20)
/// Tolerate out-of-spec sources transmitting 0s instead of a sequence number.
if (!(a == 0 && b == 0))
return;
sync_sequence_ = sequence_number;
DMX::Universe::setData(*sync_data_);
delete sync_data_;
sync_data_ = nullptr;
}
}; // namespace SACN

View File

@ -52,7 +52,7 @@ public:
virtual void setProvenance(std::shared_ptr<DATA::data_header>);
virtual bool isSyncronized() const;
virtual void synchronize();
virtual void synchronize(uint8_t = 0);
protected:
/**
@ -71,6 +71,7 @@ protected:
private:
std::shared_ptr<DATA::data_header> provenance_;
std::vector<uint8_t> * sync_data_ = nullptr;
uint8_t sync_sequence_ = 0;
};
} // SACN namespace