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;
|
||||||
}
|
}
|
||||||
@ -56,76 +56,13 @@ Universe::~Universe()
|
|||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Universe::rxDmpGetProperty
|
* @brief Universe::metadata
|
||||||
* @param message
|
* @return
|
||||||
*/
|
*/
|
||||||
void Universe::rxDmpGetProperty(ACN::PDU::Message<ACN::DMP::Pdu> message)
|
std::shared_ptr<DATA::data_header> Universe::metadata()
|
||||||
{
|
{
|
||||||
(void)message;
|
std::shared_lock lk_ctl(mtx_control);
|
||||||
}
|
return metadata_;
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Universe::rxDmpSetProperty
|
|
||||||
* @param message
|
|
||||||
*/
|
|
||||||
void Universe::rxDmpSetProperty(ACN::PDU::Message<ACN::DMP::Pdu> message)
|
|
||||||
{
|
|
||||||
// only act on the first property pair in the data
|
|
||||||
if (!message->data())
|
|
||||||
return;
|
|
||||||
auto set_data = std::static_pointer_cast<ACN::DMP::address_pair_list>(message->data());
|
|
||||||
if (set_data->properties.empty())
|
|
||||||
return;
|
|
||||||
const auto& [range, data] = set_data->properties.front();
|
|
||||||
|
|
||||||
/// > \cite sACN 7.3 Address Type and Data Type
|
|
||||||
/// >
|
|
||||||
/// > Sources shall set the DMP Layer's Address Type and Data Type to 0xa1.
|
|
||||||
/// > Receivers shall discard the packet if the received value is not 0xa1.
|
|
||||||
if (range.isRelative()) return;
|
|
||||||
if (range.type() != ACN::DMP::ARRAY) return;
|
|
||||||
if (range.elementLength() != ACN::DMP::TWO) return;
|
|
||||||
|
|
||||||
/// > \cite sACN 7.4 First Property Address
|
|
||||||
/// >
|
|
||||||
/// > Sources shall set the DMP Layer's First Property Address to 0x0000.
|
|
||||||
/// > Receivers shall discard the packet if the received value is not 0x0000.
|
|
||||||
if (range.address != 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
/// > \cite sACN 7.5 Address Increment
|
|
||||||
/// >
|
|
||||||
/// > Sources shall set the DMP Layer's Address Increment to 0x0001.
|
|
||||||
/// > Receivers shall discard the packet if the received value is not 0x0001.
|
|
||||||
if (range.incriment != 1)
|
|
||||||
return;
|
|
||||||
|
|
||||||
/// > \cite sACN 7.6 Property Value Count
|
|
||||||
/// >
|
|
||||||
/// > The DMP Layer's Property Value Count is used to encode the number of
|
|
||||||
/// > DMX512-A [DMX] Slots (including the START Code slot).
|
|
||||||
if (range.count < 1 || range.count > null_start_data.size())
|
|
||||||
return;
|
|
||||||
{
|
|
||||||
std::unique_lock lk_ctl(mtx_control);
|
|
||||||
active_data_slots_ = range.address + range.count;
|
|
||||||
}
|
|
||||||
/// > \cite sACN 7.7 Property Values (DMX512-A Data)
|
|
||||||
/// >
|
|
||||||
/// > The DMP Layer's Property values field is used to encode the
|
|
||||||
/// > DMX512-A [DMX] START Code and data.
|
|
||||||
DMX::Universe::setData(data);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Universe::rxDmpGetProperty
|
|
||||||
* @param message
|
|
||||||
*/
|
|
||||||
void Universe::rxDmpSubscribe(ACN::PDU::Message<ACN::DMP::Pdu> message)
|
|
||||||
{
|
|
||||||
(void)message;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -135,8 +72,8 @@ void Universe::rxDmpSubscribe(ACN::PDU::Message<ACN::DMP::Pdu> message)
|
|||||||
*/
|
*/
|
||||||
void Universe::setMetadata(std::shared_ptr<DATA::data_header> metadata)
|
void Universe::setMetadata(std::shared_ptr<DATA::data_header> metadata)
|
||||||
{
|
{
|
||||||
std::unique_lock lk_ctl(mtx_control);
|
std::unique_lock lk_ctl(mtx_control);
|
||||||
metadata_ = metadata;
|
metadata_ = metadata;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -146,19 +83,85 @@ void Universe::setMetadata(std::shared_ptr<DATA::data_header> metadata)
|
|||||||
*/
|
*/
|
||||||
bool Universe::isSyncronized()
|
bool Universe::isSyncronized()
|
||||||
{
|
{
|
||||||
std::shared_lock lk_ctl(mtx_control);
|
std::shared_lock lk_ctl(mtx_control);
|
||||||
return !sync_data_;
|
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
|
* @brief Universe::isEditable
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
bool Universe::isEditable() const
|
bool Universe::isEditable() const
|
||||||
{
|
{
|
||||||
std::shared_lock lk_ctl(mtx_control);
|
std::shared_lock lk_ctl(mtx_control);
|
||||||
return sender_;
|
return sender_;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Universe::activeSlots
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
uint16_t Universe::activeSlots()
|
||||||
|
{
|
||||||
|
std::shared_lock lk_ctl(mtx_control);
|
||||||
|
return active_data_slots_;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -174,18 +177,6 @@ const std::vector<DATA::data_header> Universe::sources() const
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @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
|
* @brief sourceUniverse
|
||||||
* @param src
|
* @param src
|
||||||
@ -193,11 +184,11 @@ std::shared_ptr<void> Universe::onSourceListChange(std::function<void()> callbac
|
|||||||
*/
|
*/
|
||||||
std::shared_ptr<Universe> Universe::sourceUniverse(const DATA::data_header& src)
|
std::shared_ptr<Universe> Universe::sourceUniverse(const DATA::data_header& src)
|
||||||
{
|
{
|
||||||
std::shared_lock lk_ctl(mtx_control);
|
std::shared_lock lk_ctl(mtx_control);
|
||||||
if (src == *metadata_)
|
if (src == *metadata_)
|
||||||
return shared_from_this();
|
return shared_from_this();
|
||||||
|
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -207,19 +198,20 @@ std::shared_ptr<Universe> Universe::sourceUniverse(const DATA::data_header& src)
|
|||||||
*/
|
*/
|
||||||
std::shared_ptr<Universe> Universe::addNewSource(const DATA::data_header&)
|
std::shared_ptr<Universe> Universe::addNewSource(const DATA::data_header&)
|
||||||
{
|
{
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Universe::activeSlots
|
* @brief Add a callback to be notified when the source list changes.
|
||||||
|
* @param callback
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
uint16_t Universe::activeSlots()
|
std::shared_ptr<void> Universe::onSourceListChange(std::function<void()> callback)
|
||||||
{
|
{
|
||||||
std::shared_lock lk_ctl(mtx_control);
|
(void)callback;
|
||||||
return active_data_slots_;
|
return nullptr;
|
||||||
}
|
};
|
||||||
|
|
||||||
|
|
||||||
void Universe::setValue (const uint16_t start, const uint16_t footprint,
|
void Universe::setValue (const uint16_t start, const uint16_t footprint,
|
||||||
@ -268,68 +260,76 @@ void Universe::setStatus(uint8_t status)
|
|||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Universe::metadata
|
* @brief Universe::rxDmpGetProperty
|
||||||
* @return
|
* @param message
|
||||||
*/
|
*/
|
||||||
std::shared_ptr<DATA::data_header> Universe::metadata()
|
void Universe::rxDmpGetProperty(ACN::PDU::Message<ACN::DMP::Pdu> message)
|
||||||
{
|
{
|
||||||
std::shared_lock lk_ctl(mtx_control);
|
(void)message;
|
||||||
return metadata_;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Universe::synchronize
|
* @brief Universe::rxDmpSetProperty
|
||||||
* @param sequence_number
|
* @param message
|
||||||
*/
|
*/
|
||||||
void Universe::synchronize(uint8_t sequence_number)
|
void Universe::rxDmpSetProperty(ACN::PDU::Message<ACN::DMP::Pdu> message)
|
||||||
{
|
{
|
||||||
std::shared_lock lk_ctl(mtx_control);
|
// only act on the first property pair in the data
|
||||||
if (!sync_data_)
|
if (!message->data())
|
||||||
return;
|
return;
|
||||||
|
auto set_data = std::static_pointer_cast<ACN::DMP::address_pair_list>(message->data());
|
||||||
|
if (set_data->properties.empty())
|
||||||
|
return;
|
||||||
|
const auto& [range, data] = set_data->properties.front();
|
||||||
|
|
||||||
/// > \cite sACN 6.7.2 Sequence Numbering
|
/// > \cite sACN 7.3 Address Type and Data Type
|
||||||
/// >
|
/// >
|
||||||
/// > Having first received a packet with sequence number A,
|
/// > Sources shall set the DMP Layer's Address Type and Data Type to 0xa1.
|
||||||
/// > a second packet with sequence number B arrives.
|
/// > Receivers shall discard the packet if the received value is not 0xa1.
|
||||||
/// > If, using signed 8-bit binary arithmetic, B - A
|
if (range.isRelative()) return;
|
||||||
/// > is less than or equal to 0, but greater than -20,
|
if (range.type() != ACN::DMP::ARRAY) return;
|
||||||
/// > then the packet containing sequence number B shall be deemed out of
|
if (range.elementLength() != ACN::DMP::TWO) return;
|
||||||
/// > sequence and discarded.
|
|
||||||
auto a = sync_sequence_;
|
/// > \cite sACN 7.4 First Property Address
|
||||||
auto b = sequence_number;
|
/// >
|
||||||
int8_t dif = b - a;
|
/// > Sources shall set the DMP Layer's First Property Address to 0x0000.
|
||||||
if (dif <= 0 && dif > -20)
|
/// > Receivers shall discard the packet if the received value is not 0x0000.
|
||||||
return;
|
if (range.address != 0)
|
||||||
{
|
return;
|
||||||
std::unique_lock lk_wctl(lk_ctl);
|
|
||||||
sync_sequence_ = sequence_number;
|
/// > \cite sACN 7.5 Address Increment
|
||||||
}
|
/// >
|
||||||
DMX::Universe::setData(*sync_data_);
|
/// > Sources shall set the DMP Layer's Address Increment to 0x0001.
|
||||||
resetSynchronization();
|
/// > Receivers shall discard the packet if the received value is not 0x0001.
|
||||||
|
if (range.incriment != 1)
|
||||||
|
return;
|
||||||
|
|
||||||
|
/// > \cite sACN 7.6 Property Value Count
|
||||||
|
/// >
|
||||||
|
/// > The DMP Layer's Property Value Count is used to encode the number of
|
||||||
|
/// > DMX512-A [DMX] Slots (including the START Code slot).
|
||||||
|
if (range.count < 1 || range.count > null_start_data.size())
|
||||||
|
return;
|
||||||
|
{
|
||||||
|
std::unique_lock lk_ctl(mtx_control);
|
||||||
|
active_data_slots_ = range.address + range.count;
|
||||||
|
}
|
||||||
|
/// > \cite sACN 7.7 Property Values (DMX512-A Data)
|
||||||
|
/// >
|
||||||
|
/// > The DMP Layer's Property values field is used to encode the
|
||||||
|
/// > DMX512-A [DMX] START Code and data.
|
||||||
|
DMX::Universe::setData(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Universe::resetSynchronization
|
* @brief Universe::rxDmpGetProperty
|
||||||
|
* @param message
|
||||||
*/
|
*/
|
||||||
void Universe::resetSynchronization()
|
void Universe::rxDmpSubscribe(ACN::PDU::Message<ACN::DMP::Pdu> message)
|
||||||
{
|
{
|
||||||
std::unique_lock lk_ctl(mtx_control);
|
(void)message;
|
||||||
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