/** * Handler for player data * $Id$ * $HeadURL$ * $Author$ * Created by hjl, SLSE, 2016-07-05 */ #include "handler_participant_data.h" #include "settings.h" #include using namespace VideoOverlayManagement; HandlerParticipantData::HandlerParticipantData(const std::shared_ptr &ddsHandler, QObject *parent) : QObject(parent) , m_ddsHandler(ddsHandler) , m_logger(getLogger("HandlerParticipantData")) { } // end of ctor() //----------------------------------------------------------------------------- HandlerParticipantData::~HandlerParticipantData() { } // end of dtor() //----------------------------------------------------------------------------- bool HandlerParticipantData::init() { // DTC ParticipantManagement m_dtc = ParticipantManagement::Interface::Dtc::create(m_ddsHandler->dds()); if (m_dtc == nullptr) { ERROR_LOG(m_logger) << "Could not create DTC ParticipantManagement"; return false; } // only subscribe to the topics we're interested in if (!m_dtc->enableParticipant() || !m_dtc->enableParticipantPosition()) { ERROR_LOG(m_logger) << "init() DTC ParticipantManagement failed"; return false; } // Get 'static' data for all participants (playerdata) // Subsribe for ParticipantChanged connect(m_dtc.get(), &ParticipantManagement::Interface::Dtc::participantChanged, this, &HandlerParticipantData::onParticipantChanged); // Player in Referenzmap eintragen m_dtc->participants([this](const ParticipantManagement::Participant &p) { onParticipantChanged(p, DataModification::eAdded);}); // Get last position ('dynamic' data) of all participants // Subsribe for participantPositionChanged connect(m_dtc.get(), &ParticipantManagement::Interface::Dtc::participantPositionChanged, this, &HandlerParticipantData::onParticipantPositionChanged); // Position in ParticipantsPositionMap eintragen auto cbParticipantPos = [this](const ParticipantManagement::ParticipantPosition &participantPos) { m_participantsPositionMap.insert(participantPos.participantId(), participantPos.roomId()); }; m_dtc->participantPositions(cbParticipantPos); INFO_LOG(m_logger) << "HandlerParticipantData::init() finished. " << " m_partId2EquipNoMap.size(): " << m_partId2EquipNoMap.size() << " m_participantsPositionMap.size(): " << m_participantsPositionMap.size(); return true; } // end of init() //----------------------------------------------------------------------------- int HandlerParticipantData::getEquipmentNumber(int participantId) const { return m_partId2EquipNoMap.value(participantId); } // end of getEquipmentNumber() //----------------------------------------------------------------------------- QMap HandlerParticipantData::getAllAssignedParticipants() const { QMap qMap; for (auto i = m_participantsPositionMap.begin(); i != m_participantsPositionMap.end(); ++i) { if (i.value() > 0) qMap.insert(i.key(), i.value()); } return qMap; } // end of getAllAssignedParticipants() //----------------------------------------------------------------------------- void HandlerParticipantData::onParticipantChanged(const ParticipantManagement::Participant &data, DataModification modType) { INFO_LOG(m_logger) << "onParticipantChanged() participantId:" << data.id(); if (modType != DataModification::eRemoved && data.equipmentNumber().is_set()) m_partId2EquipNoMap.insert(data.id(), data.equipmentNumber().get()); else m_partId2EquipNoMap.remove(data.id()); if (m_logger.isDebugEnabled()) { for (auto i = m_partId2EquipNoMap.begin(); i != m_partId2EquipNoMap.end(); ++i) DEBUG_LOG(m_logger) << " partId2EquipNoMap.size(): " << m_partId2EquipNoMap.size() << " partId: " << i.key() << " eqNo: " << i.value(); } } // end of onParticipantChanged() //----------------------------------------------------------------------------- void HandlerParticipantData::onParticipantPositionChanged(const ParticipantManagement::ParticipantPosition &data, DataModification modType) { const int newRoomId = data.roomId(); // get reference to room (will be created if not exist) int &roomId = m_participantsPositionMap[data.participantId()]; // remember old room const int oldRoomId = roomId; // assing new room roomId = modType == DataModification::eRemoved ? 0 : newRoomId; if (newRoomId != oldRoomId) emit participantPositionChanged(oldRoomId, newRoomId, data.participantId()); INFO_LOG(m_logger) << "onParticipantPositionChanged()" << " oldRoomId: " << oldRoomId << " newRoomId: " << newRoomId << " participantId: " << data.participantId(); if (modType == DataModification::eRemoved) m_participantsPositionMap.remove(data.participantId()); } // end of onParticipantPositionChanged() //-----------------------------------------------------------------------------