cleanup universe status setting
This commit is contained in:
parent
85bd5accd0
commit
2491054e1d
|
@ -33,7 +33,7 @@ namespace DMX {
|
|||
Universe::Universe(int timeout_period)
|
||||
: null_start_data({0})
|
||||
, rx_timeout_period_(timeout_period)
|
||||
, status_(Status::DMX_NULL)
|
||||
, status_(DMX_NULL)
|
||||
{
|
||||
}
|
||||
|
||||
|
@ -168,6 +168,12 @@ uint8_t Universe::status()
|
|||
*/
|
||||
void Universe::setStatus(uint8_t val)
|
||||
{
|
||||
if (val == RX_TIMEOUT)
|
||||
val = DMX_LOST;
|
||||
|
||||
if (val == status_)
|
||||
return;
|
||||
|
||||
status_ = val;
|
||||
}
|
||||
|
||||
|
@ -188,7 +194,7 @@ void Universe::setValue(const uint16_t address, const uint8_t value)
|
|||
null_start_data[address] = value;
|
||||
null_start_mutex.unlock();
|
||||
|
||||
setStatus(Status::DMX_ACTIVE);
|
||||
setStatus(DMX_ACTIVE);
|
||||
last_updated_ = std::chrono::system_clock::now();
|
||||
doDataCallbacks();
|
||||
}
|
||||
|
@ -212,7 +218,7 @@ void Universe::setValue(const uint16_t start, const uint16_t footprint,
|
|||
std::copy(data, data + footprint, null_start_data.begin() + start);
|
||||
null_start_mutex.unlock();
|
||||
|
||||
setStatus(Status::DMX_ACTIVE);
|
||||
setStatus(DMX_ACTIVE);
|
||||
last_updated_ = std::chrono::system_clock::now();
|
||||
doDataCallbacks();
|
||||
}
|
||||
|
@ -261,22 +267,22 @@ void Universe::doDataCallbacks()
|
|||
void Universe::rx_timeout_(bool add_now)
|
||||
{
|
||||
auto now = std::chrono::system_clock::now();
|
||||
auto age = rxAge();
|
||||
|
||||
if (add_now)
|
||||
{
|
||||
setStatus(Status::DMX_ACTIVE);
|
||||
setStatus(DMX_ACTIVE);
|
||||
last_updated_ = now;
|
||||
rx_times_.push(now);
|
||||
}
|
||||
else if (age >= E111_DATA_LOSS_TIMEOUT)
|
||||
else if (status_ == DMX_ACTIVE && rxAge() >= E111_DATA_LOSS_TIMEOUT)
|
||||
// E1.11 DMX timeout period may be different the the rx_timeout_period
|
||||
setStatus(Status::DMX_LOST);
|
||||
setStatus(DMX_LOST);
|
||||
|
||||
auto elapsed = [] (auto& a, auto& b) {
|
||||
return std::chrono::duration_cast<std::chrono::milliseconds>(a - b).count();
|
||||
};
|
||||
|
||||
long age;
|
||||
while (!rx_times_.empty())
|
||||
{ // drop timestamps that are older than the timeout period
|
||||
age = elapsed(now, rx_times_.front());
|
||||
|
@ -285,6 +291,8 @@ void Universe::rx_timeout_(bool add_now)
|
|||
else
|
||||
rx_times_.pop();
|
||||
}
|
||||
if (rx_times_.empty() && status_ != DMX_NULL)
|
||||
setStatus(RX_TIMEOUT);
|
||||
}
|
||||
|
||||
} // namespace DMX
|
||||
|
|
|
@ -70,7 +70,8 @@ class Universe {
|
|||
enum Status : uint8_t {
|
||||
DMX_NULL = 0, //!< uninitialized
|
||||
DMX_ACTIVE = 1, //!< actively sending/receiving data
|
||||
DMX_LOST = 2 //!< no activity in E111_DATA_LOSS_TIMEOUT
|
||||
DMX_LOST = 2, //!< no activity in E111_DATA_LOSS_TIMEOUT
|
||||
RX_TIMEOUT = 250 //!< no activity in the constructed timeout period
|
||||
};
|
||||
virtual void setStatus(uint8_t);
|
||||
virtual uint8_t status();
|
||||
|
|
|
@ -241,12 +241,6 @@ uint8_t ArbitratingUniverse::status()
|
|||
else
|
||||
{
|
||||
status = Universe::status();
|
||||
if (status != Status::DMX_NULL
|
||||
&& status != Status::sACN_TERMINATED)
|
||||
{
|
||||
status = Status::sACN_TERMINATED;
|
||||
setStatus(status);
|
||||
}
|
||||
}
|
||||
return status;
|
||||
}
|
||||
|
|
|
@ -226,7 +226,7 @@ void Receiver::dataFrameHandler(ACN::PDU::Message<DATA::Pdu> frame) {
|
|||
if (source->options.stream_terminated)
|
||||
{
|
||||
/// Set the universe's status to TERMINATED.
|
||||
universe->setStatus(Universe::Status::sACN_TERMINATED);
|
||||
universe->setStatus(Universe::sACN_TERMINATED);
|
||||
/// Terminated universe may be deleted as sources.
|
||||
/// The universe may keep itself, in a terminated state, for hold-last-look.
|
||||
universes_[source->universe]->deleteSourceUniverse(*source);
|
||||
|
|
|
@ -291,23 +291,11 @@ void Universe::setValue (const uint16_t start, const uint16_t footprint,
|
|||
}
|
||||
|
||||
|
||||
uint8_t Universe::status()
|
||||
{
|
||||
uint8_t ret;
|
||||
// tx_control_mutex_.lock();
|
||||
ret = DMX::Universe::status();
|
||||
// tx_control_mutex_.unlock();
|
||||
if (ret == Status::DMX_LOST && rxAge() >= E131_NETWORK_DATA_LOSS_TIMEOUT)
|
||||
{
|
||||
ret = Status::sACN_TERMINATED;
|
||||
setStatus(ret);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
void Universe::setStatus(uint8_t status)
|
||||
{
|
||||
if (status == RX_TIMEOUT)
|
||||
status = sACN_TERMINATED;
|
||||
|
||||
tx_control_mutex_.lock();
|
||||
DMX::Universe::setStatus(status);
|
||||
tx_control_mutex_.unlock();
|
||||
|
|
|
@ -74,8 +74,7 @@ public:
|
|||
virtual void setValue (const uint16_t address, const uint8_t value) override;
|
||||
virtual void setValue (const uint16_t start, const uint16_t footprint,
|
||||
const uint8_t* data) override;
|
||||
virtual void setStatus(uint8_t) override;
|
||||
virtual uint8_t status() override;
|
||||
virtual void setStatus(uint8_t) override;
|
||||
|
||||
/**
|
||||
* @brief destination IP address
|
||||
|
@ -92,7 +91,7 @@ public:
|
|||
DMX_ACTIVE = DMX::Universe::DMX_ACTIVE, //!< actively sending/receiving data
|
||||
DMX_LOST = DMX::Universe::DMX_LOST, //!< no activity in E111_DATA_LOSS_TIMEOUT
|
||||
sACN_TERMINATED = 11, //!< stream has been terminated or no activity in E131_NETWORK_DATA_LOSS_TIMEOUT
|
||||
sACN_HOLD = 12 //!< 10.2.2 Loss of Data alternate mode, holds last look
|
||||
RX_TIMEOUT = DMX::Universe::RX_TIMEOUT //!< no activity in the constructed timeout period
|
||||
};
|
||||
|
||||
protected:
|
||||
|
|
Loading…
Reference in New Issue