rearrange in header order
This commit is contained in:
parent
1d1be459c8
commit
4975c7e809
@ -33,10 +33,10 @@ namespace sACN {
|
|||||||
Universe::Universe(Source* src)
|
Universe::Universe(Source* src)
|
||||||
: DMX::Universe(E131_NETWORK_DATA_LOSS_TIMEOUT)
|
: DMX::Universe(E131_NETWORK_DATA_LOSS_TIMEOUT)
|
||||||
, ACN::DMP::Component(UUID::uuid(), "OpenLCP sACN Universe")
|
, ACN::DMP::Component(UUID::uuid(), "OpenLCP sACN Universe")
|
||||||
|
, sender_(src ? new UniverseSender(src, this) : nullptr)
|
||||||
, metadata_(std::make_shared<DATA::data_header>())
|
, metadata_(std::make_shared<DATA::data_header>())
|
||||||
, active_data_slots_(1) // start code
|
, active_data_slots_(1) // start code
|
||||||
, sync_sequence_(0)
|
, sync_sequence_(0)
|
||||||
, sender_(src ? new UniverseSender(src, this) : nullptr)
|
|
||||||
{
|
{
|
||||||
destination.type = ACN::SDT::SDT_ADDR_NULL;
|
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
|
* @brief Universe::rxDmpGetProperty
|
||||||
* @param message
|
* @param message
|
||||||
@ -128,208 +332,4 @@ void Universe::rxDmpSubscribe(ACN::PDU::Message<ACN::DMP::Pdu> message)
|
|||||||
(void)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
|
}; // namespace SACN
|
||||||
|
@ -99,6 +99,7 @@ protected:
|
|||||||
virtual void rxDmpSubscribe(ACN::PDU::Message<ACN::DMP::Pdu>) override;
|
virtual void rxDmpSubscribe(ACN::PDU::Message<ACN::DMP::Pdu>) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
UniverseSender * sender_;
|
||||||
std::shared_ptr<DATA::data_header> metadata_;
|
std::shared_ptr<DATA::data_header> metadata_;
|
||||||
std::vector<uint8_t> * sync_data_ = nullptr;
|
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.
|
* > the sequence number of an E1.31 Data Packet on that same universe.
|
||||||
*/
|
*/
|
||||||
uint8_t sync_sequence_;
|
uint8_t sync_sequence_;
|
||||||
|
|
||||||
UniverseSender * sender_;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} // SACN namespace
|
} // SACN namespace
|
||||||
|
Loading…
Reference in New Issue
Block a user