/** * Listen to EquipmentExerciseMapping telegrams from PPM * $Id$ * $HeadURL$ * $Author$ * Created by Christian Ehrlicher, SLSE, 2018-06-18 */ #include "ppm_handler.h" #include "main_handler.h" #include "send_to_tab.h" #include namespace TrainingAreaBase { PpmHandler::PpmHandler(MainHandler *mainHandler) : m_mainHandler(mainHandler) , m_equipExerciseMappingTimer(new QTimer(this)) , m_logger(getLogger("PpmHandler")) { m_equipExerciseMappingTimer->setSingleShot(true); m_equipExerciseMappingTimer->setInterval(100); connect(m_equipExerciseMappingTimer, &QTimer::timeout, this, &PpmHandler::sendEquipmentExerciseAssignment); } bool PpmHandler::init() { m_ppmDtc = ParticipantManagement::Interface::Dtc::create(m_mainHandler->ddsHandler()->ddsConnector()); connect(m_ppmDtc.get(), &ParticipantManagement::Interface::Dtc::equipmentExerciseMappingChanged, this, &PpmHandler::onEquipmentExerciseMappingChanged); connect(m_ppmDtc.get(), &ParticipantManagement::Interface::Dtc::participantPositionChanged, this, &PpmHandler::onParticipantPositionChanged); if (!m_ppmDtc->enableEquipmentExerciseMapping() || !m_ppmDtc->enableParticipantPosition()) { ERROR_LOG(m_logger) << "Can not read equipment/exercise mappings from PPM"; return false; } return true; } template void removeFromContainer(T &cont, int id) { auto it = cont.find(id); if (it != cont.end()) cont.erase(it); } void PpmHandler::onParticipantPositionChanged(const ParticipantManagement::ParticipantPosition &data, DataModification modType) { if (modType == DataModification::eRemoved) return; ParticipantManagement::Participant participant = m_ppmDtc->participant(data.participantId()); int equipNo = 0; if (participant.equipmentNumber().is_set()) equipNo = participant.equipmentNumber().get(); if (equipNo > 0) emit position(equipNo, data); } void PpmHandler::onEquipmentExerciseMappingChanged(const ParticipantManagement::EquipmentExerciseMapping &data, DataModification modType) { DEBUG_LOG(m_logger) << "EquipmentExerciseMappingChanged: " << data << ", " << modType; switch (modType) { case DataModification::eAdded: case DataModification::eModified: { std::unordered_set &equipmentNumbers = m_exerciseEquipmentAssignments[data.exerciseId()]; equipmentNumbers.clear(); for (const ParticipantManagement::Equipment2ParticipantId &e2p : data.mapping()) equipmentNumbers.insert(e2p.equipmentNumber()); break; } case DataModification::eRemoved: { auto it = m_exerciseEquipmentAssignments.find(data.exerciseId()); if (it != m_exerciseEquipmentAssignments.end()) m_exerciseEquipmentAssignments.erase(it); break; } } m_equipExerciseMappingTimer->start(); } void PpmHandler::sendEquipmentExerciseAssignment() { if (!m_mainHandler || !m_mainHandler->txHandler()) return; NOTICE_LOG(m_logger) << "Sending EquipmentExerciseAssignment to PrtCnv"; m_mainHandler->txHandler()->txData(m_mainHandler->exerciseEquipmentAssignment()); } } // namespace TrainingAreaBase