rearrange in header order
This commit is contained in:
parent
1d1be459c8
commit
4975c7e809
|
@ -33,10 +33,10 @@ namespace sACN {
|
|||
Universe::Universe(Source* src)
|
||||
: DMX::Universe(E131_NETWORK_DATA_LOSS_TIMEOUT)
|
||||
, ACN::DMP::Component(UUID::uuid(), "OpenLCP sACN Universe")
|
||||
, sender_(src ? new UniverseSender(src, this) : nullptr)
|
||||
, metadata_(std::make_shared<DATA::data_header>())
|
||||
, active_data_slots_(1) // start code
|
||||
, sync_sequence_(0)
|
||||
, sender_(src ? new UniverseSender(src, this) : nullptr)
|
||||
{
|
||||
destination.type = ACN::SDT::SDT_ADDR_NULL;
|
||||
}
|
||||
|
@ -55,6 +55,210 @@ Universe::~Universe()
|
|||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief Universe::metadata
|
||||
* @return
|
||||
*/
|
||||
std::shared_ptr<DATA::data_header> Universe::metadata()
|
||||
{
|
||||
std::shared_lock lk_ctl(mtx_control);
|
||||
return metadata_;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief Universe::setMetadata
|
||||
* @param metadata
|
||||
*/
|
||||
void Universe::setMetadata(std::shared_ptr<DATA::data_header> metadata)
|
||||
{
|
||||
std::unique_lock lk_ctl(mtx_control);
|
||||
metadata_ = metadata;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief Universe::isSyncronized
|
||||
* @return
|
||||
*/
|
||||
bool Universe::isSyncronized()
|
||||
{
|
||||
std::shared_lock lk_ctl(mtx_control);
|
||||
return !sync_data_;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* @brief Universe::synchronize
|
||||
* @param sequence_number
|
||||
*/
|
||||
void Universe::synchronize(uint8_t sequence_number)
|
||||
{
|
||||
std::shared_lock lk_ctl(mtx_control);
|
||||
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)
|
||||
return;
|
||||
{
|
||||
std::unique_lock lk_wctl(lk_ctl);
|
||||
sync_sequence_ = sequence_number;
|
||||
}
|
||||
DMX::Universe::setData(*sync_data_);
|
||||
resetSynchronization();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief Universe::resetSynchronization
|
||||
*/
|
||||
void Universe::resetSynchronization()
|
||||
{
|
||||
std::unique_lock lk_ctl(mtx_control);
|
||||
delete sync_data_;
|
||||
sync_data_ = nullptr;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief Universe::setSyncData
|
||||
* @param data
|
||||
*/
|
||||
void Universe::setSyncData(const std::vector<uint8_t> & data)
|
||||
{
|
||||
resetSynchronization();
|
||||
std::unique_lock lk_ctl(mtx_control);
|
||||
sync_data_ = new std::vector<uint8_t>(data);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief Universe::isEditable
|
||||
* @return
|
||||
*/
|
||||
bool Universe::isEditable() const
|
||||
{
|
||||
std::shared_lock lk_ctl(mtx_control);
|
||||
return sender_;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief Universe::activeSlots
|
||||
* @return
|
||||
*/
|
||||
uint16_t Universe::activeSlots()
|
||||
{
|
||||
std::shared_lock lk_ctl(mtx_control);
|
||||
return active_data_slots_;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief Universe::sources
|
||||
* @return
|
||||
*/
|
||||
const std::vector<DATA::data_header> Universe::sources() const
|
||||
{
|
||||
std::shared_lock lk_ctl(mtx_control);
|
||||
std::vector<DATA::data_header> keys = {*metadata_};
|
||||
return keys;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief sourceUniverse
|
||||
* @param src
|
||||
* @return
|
||||
*/
|
||||
std::shared_ptr<Universe> Universe::sourceUniverse(const DATA::data_header& src)
|
||||
{
|
||||
std::shared_lock lk_ctl(mtx_control);
|
||||
if (src == *metadata_)
|
||||
return shared_from_this();
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief Universe::addNewSource
|
||||
* @return
|
||||
*/
|
||||
std::shared_ptr<Universe> Universe::addNewSource(const DATA::data_header&)
|
||||
{
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief Add a callback to be notified when the source list changes.
|
||||
* @param callback
|
||||
* @return
|
||||
*/
|
||||
std::shared_ptr<void> Universe::onSourceListChange(std::function<void()> callback)
|
||||
{
|
||||
(void)callback;
|
||||
return nullptr;
|
||||
};
|
||||
|
||||
|
||||
void Universe::setValue (const uint16_t start, const uint16_t footprint,
|
||||
const uint8_t* data)
|
||||
{
|
||||
if (!isEditable())
|
||||
return;
|
||||
|
||||
// start and footprint valid?
|
||||
if (start < 1 || start + footprint > null_start_data.size())
|
||||
return;
|
||||
|
||||
// set active_data_slots to at least end of footprint
|
||||
if (start + footprint > active_data_slots_)
|
||||
{
|
||||
std::unique_lock lk_ctl(mtx_control);
|
||||
active_data_slots_ = start + footprint;
|
||||
}
|
||||
|
||||
// get a copy of the current values
|
||||
uint8_t og[footprint];
|
||||
{
|
||||
std::unique_lock lk_data(mtx_data);
|
||||
std::copy_n(std::begin(null_start_data) + start, footprint, og);
|
||||
}
|
||||
|
||||
// data not changed!
|
||||
if (memcmp(data, og, footprint) == 0)
|
||||
return;
|
||||
|
||||
// set the values
|
||||
DMX::Universe::setValue(start, footprint, data);
|
||||
|
||||
// request sACN message to be sent
|
||||
sender_->flush();
|
||||
}
|
||||
|
||||
|
||||
void Universe::setStatus(uint8_t status)
|
||||
{
|
||||
if (status == RX_TIMEOUT)
|
||||
status = sACN_TERMINATED;
|
||||
|
||||
DMX::Universe::setStatus(status);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief Universe::rxDmpGetProperty
|
||||
* @param message
|
||||
|
@ -128,208 +332,4 @@ void Universe::rxDmpSubscribe(ACN::PDU::Message<ACN::DMP::Pdu> message)
|
|||
(void)message;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief Universe::setMetadata
|
||||
* @param metadata
|
||||
*/
|
||||
void Universe::setMetadata(std::shared_ptr<DATA::data_header> metadata)
|
||||
{
|
||||
std::unique_lock lk_ctl(mtx_control);
|
||||
metadata_ = metadata;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief Universe::isSyncronized
|
||||
* @return
|
||||
*/
|
||||
bool Universe::isSyncronized()
|
||||
{
|
||||
std::shared_lock lk_ctl(mtx_control);
|
||||
return !sync_data_;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* @brief Universe::isEditable
|
||||
* @return
|
||||
*/
|
||||
bool Universe::isEditable() const
|
||||
{
|
||||
std::shared_lock lk_ctl(mtx_control);
|
||||
return sender_;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief Universe::sources
|
||||
* @return
|
||||
*/
|
||||
const std::vector<DATA::data_header> Universe::sources() const
|
||||
{
|
||||
std::shared_lock lk_ctl(mtx_control);
|
||||
std::vector<DATA::data_header> keys = {*metadata_};
|
||||
return keys;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief Add a callback to be notified when the source list changes.
|
||||
* @param callback
|
||||
* @return
|
||||
*/
|
||||
std::shared_ptr<void> Universe::onSourceListChange(std::function<void()> callback)
|
||||
{
|
||||
(void)callback;
|
||||
return nullptr;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* @brief sourceUniverse
|
||||
* @param src
|
||||
* @return
|
||||
*/
|
||||
std::shared_ptr<Universe> Universe::sourceUniverse(const DATA::data_header& src)
|
||||
{
|
||||
std::shared_lock lk_ctl(mtx_control);
|
||||
if (src == *metadata_)
|
||||
return shared_from_this();
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief Universe::addNewSource
|
||||
* @return
|
||||
*/
|
||||
std::shared_ptr<Universe> Universe::addNewSource(const DATA::data_header&)
|
||||
{
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief Universe::activeSlots
|
||||
* @return
|
||||
*/
|
||||
uint16_t Universe::activeSlots()
|
||||
{
|
||||
std::shared_lock lk_ctl(mtx_control);
|
||||
return active_data_slots_;
|
||||
}
|
||||
|
||||
|
||||
void Universe::setValue (const uint16_t start, const uint16_t footprint,
|
||||
const uint8_t* data)
|
||||
{
|
||||
if (!isEditable())
|
||||
return;
|
||||
|
||||
// start and footprint valid?
|
||||
if (start < 1 || start + footprint > null_start_data.size())
|
||||
return;
|
||||
|
||||
// set active_data_slots to at least end of footprint
|
||||
if (start + footprint > active_data_slots_)
|
||||
{
|
||||
std::unique_lock lk_ctl(mtx_control);
|
||||
active_data_slots_ = start + footprint;
|
||||
}
|
||||
|
||||
// get a copy of the current values
|
||||
uint8_t og[footprint];
|
||||
{
|
||||
std::unique_lock lk_data(mtx_data);
|
||||
std::copy_n(std::begin(null_start_data) + start, footprint, og);
|
||||
}
|
||||
|
||||
// data not changed!
|
||||
if (memcmp(data, og, footprint) == 0)
|
||||
return;
|
||||
|
||||
// set the values
|
||||
DMX::Universe::setValue(start, footprint, data);
|
||||
|
||||
// request sACN message to be sent
|
||||
sender_->flush();
|
||||
}
|
||||
|
||||
|
||||
void Universe::setStatus(uint8_t status)
|
||||
{
|
||||
if (status == RX_TIMEOUT)
|
||||
status = sACN_TERMINATED;
|
||||
|
||||
DMX::Universe::setStatus(status);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief Universe::metadata
|
||||
* @return
|
||||
*/
|
||||
std::shared_ptr<DATA::data_header> Universe::metadata()
|
||||
{
|
||||
std::shared_lock lk_ctl(mtx_control);
|
||||
return metadata_;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief Universe::synchronize
|
||||
* @param sequence_number
|
||||
*/
|
||||
void Universe::synchronize(uint8_t sequence_number)
|
||||
{
|
||||
std::shared_lock lk_ctl(mtx_control);
|
||||
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)
|
||||
return;
|
||||
{
|
||||
std::unique_lock lk_wctl(lk_ctl);
|
||||
sync_sequence_ = sequence_number;
|
||||
}
|
||||
DMX::Universe::setData(*sync_data_);
|
||||
resetSynchronization();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief Universe::resetSynchronization
|
||||
*/
|
||||
void Universe::resetSynchronization()
|
||||
{
|
||||
std::unique_lock lk_ctl(mtx_control);
|
||||
delete sync_data_;
|
||||
sync_data_ = nullptr;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief Universe::setSyncData
|
||||
* @param data
|
||||
*/
|
||||
void Universe::setSyncData(const std::vector<uint8_t> & data)
|
||||
{
|
||||
resetSynchronization();
|
||||
std::unique_lock lk_ctl(mtx_control);
|
||||
sync_data_ = new std::vector<uint8_t>(data);
|
||||
}
|
||||
|
||||
}; // namespace SACN
|
||||
|
|
|
@ -99,6 +99,7 @@ protected:
|
|||
virtual void rxDmpSubscribe(ACN::PDU::Message<ACN::DMP::Pdu>) override;
|
||||
|
||||
private:
|
||||
UniverseSender * sender_;
|
||||
std::shared_ptr<DATA::data_header> metadata_;
|
||||
std::vector<uint8_t> * sync_data_ = nullptr;
|
||||
|
||||
|
@ -125,8 +126,6 @@ private:
|
|||
* > the sequence number of an E1.31 Data Packet on that same universe.
|
||||
*/
|
||||
uint8_t sync_sequence_;
|
||||
|
||||
UniverseSender * sender_;
|
||||
};
|
||||
|
||||
} // SACN namespace
|
||||
|
|
Loading…
Reference in New Issue
Block a user