also track sequence number for syncronizaton
This commit is contained in:
parent
5101e0d22c
commit
08c07d1c9c
|
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue