// STL includes #include #include // Hyperion includes #include PriorityMuxer::PriorityMuxer(int ledCount) : _currentPriority(LOWEST_PRIORITY) , _activeInputs() , _lowestPriorityInfo() { _lowestPriorityInfo.priority = LOWEST_PRIORITY; _lowestPriorityInfo.timeoutTime_ms = -1; _lowestPriorityInfo.ledColors = std::vector(ledCount, {0, 0, 0}); _activeInputs[_currentPriority] = _lowestPriorityInfo; } PriorityMuxer::~PriorityMuxer() { // empty } int PriorityMuxer::getCurrentPriority() const { return _currentPriority; } QList PriorityMuxer::getPriorities() const { return _activeInputs.keys(); } bool PriorityMuxer::hasPriority(const int priority) const { return (priority == LOWEST_PRIORITY) ? true : _activeInputs.contains(priority); } const PriorityMuxer::InputInfo& PriorityMuxer::getInputInfo(const int priority) const { auto elemIt = _activeInputs.find(priority); if (elemIt == _activeInputs.end()) { throw std::runtime_error("HYPERION (prioritymuxer) ERROR: no such priority"); } return elemIt.value(); } void PriorityMuxer::setInput(const int priority, const std::vector& ledColors, const int64_t timeoutTime_ms, hyperion::Components component) { InputInfo& input = _activeInputs[priority]; input.priority = priority; input.timeoutTime_ms = timeoutTime_ms; input.ledColors = ledColors; input.componentId = component; _currentPriority = std::min(_currentPriority, priority); } void PriorityMuxer::clearInput(const int priority) { if (priority < LOWEST_PRIORITY) { _activeInputs.remove(priority); if (_currentPriority == priority) { QList keys = _activeInputs.keys(); _currentPriority = *std::min_element(keys.begin(), keys.end()); } } } void PriorityMuxer::clearAll() { _activeInputs.clear(); _currentPriority = LOWEST_PRIORITY; _activeInputs[_currentPriority] = _lowestPriorityInfo; } void PriorityMuxer::setCurrentTime(const int64_t& now) { _currentPriority = LOWEST_PRIORITY; for (auto infoIt = _activeInputs.begin(); infoIt != _activeInputs.end();) { if (infoIt->timeoutTime_ms != -1 && infoIt->timeoutTime_ms <= now) { infoIt = _activeInputs.erase(infoIt); } else { _currentPriority = std::min(_currentPriority, infoIt->priority); ++infoIt; } } }