rearrange in header order

This commit is contained in:
Kevin Matz 2022-12-09 15:16:03 -05:00
parent 1d1be459c8
commit 4975c7e809
2 changed files with 145 additions and 146 deletions

View File

@ -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

View File

@ -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