1
0
Fork 0

cleanup universe status setting

This commit is contained in:
Kevin Matz 2022-12-02 13:04:06 -05:00
parent 85bd5accd0
commit 2491054e1d
6 changed files with 23 additions and 33 deletions

View File

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

View File

@ -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();

View File

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

View File

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

View File

@ -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();

View File

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