/** * Handle Participants which are available in the system (map between Wls id and ParticipantId) * $Id$ * $HeadURL$ * $Author$ * Created by Christian Ehrlicher, SLSE, 2017-01-10 */ #include "wls_participant_handler.h" #include "web_socket_handler.h" #include "wls_handler.h" #include namespace WirelessLocationSystem { WlsParticipantHandler::WlsParticipantHandler(QObject *parent) : QObject(parent) , m_gpsOnOffTimeoutTimer(new QTimer(this)) , m_logger(getLogger("WlsParticipantHandler")) { connect(m_gpsOnOffTimeoutTimer, &QTimer::timeout, this, &WlsParticipantHandler::onGpsOnOffTimeoutTimer); m_gpsOnOffTimeoutTimer->setSingleShot(false); m_gpsOnOffTimeoutTimer->start(1000); } WlsParticipantHandler::~WlsParticipantHandler() { qDeleteAll(m_participantsByEqId); } void WlsParticipantHandler::init(WebSocketHandler *wsHandler, WlsHandler *wlsHandler) { m_wsHandler = wsHandler; m_wlsHandler = wlsHandler; } WlsParticipant *WlsParticipantHandler::createNewParticipant(const QByteArray &tagId) { delete m_participantsByTagId.take(tagId); WlsParticipant *p = new WlsParticipant; connect(p, &WlsParticipant::gpsOnOffChanged, m_wlsHandler, &WlsHandler::sendGpsMode); connect(p, &WlsParticipant::dataForWls, m_wlsHandler, QOverload::of(&WlsHandler::sendWlsMessage)); connect(p, &WlsParticipant::gpsOnOffChanged, m_wsHandler, &WebSocketHandler::sendGpsPositionUsage); connect(p, &WlsParticipant::positionChanged, m_wsHandler, &WebSocketHandler::sendPosition); connect(p, &WlsParticipant::wlsBinarySfmDataComplete, m_wsHandler, &WebSocketHandler::sendBinarySfmData); connect(p, &WlsParticipant::dataCommunicationStateChanged, m_wsHandler, &WebSocketHandler::sendDataCommunicationState); p->m_tagId = tagId; m_participantsByTagId[tagId] = p; return p; } void WlsParticipantHandler::setEquipmentNumber(WlsParticipant *participant, int equipmentNumber) { participant->setExerciseId(m_equipNo2ExerciseId.value(equipmentNumber)); auto it = m_participantsByEqId.find(participant->equipmentNumber()); // remove old assignment if (it != m_participantsByEqId.end()) m_participantsByEqId.erase(it); participant->setEquipmentNumber(equipmentNumber); m_participantsByEqId[equipmentNumber] = participant; } WlsParticipant *WlsParticipantHandler::participantByTagId(const QByteArray &tagId) const { return m_participantsByTagId.value(tagId); } void WlsParticipantHandler::exerciseEquipmentAssignmentChanged(const std::unordered_map> &eea) { m_equipNo2ExerciseId.clear(); for (const auto &itEx : eea) { const int curExerciseId = itEx.first; const auto &assignment = itEx.second; for (int eqId : assignment) { m_equipNo2ExerciseId[eqId] = curExerciseId; WlsParticipant *p = m_participantsByEqId.value(eqId); if (!p) continue; p->setExerciseId(curExerciseId); } } } void WlsParticipantHandler::handleWlsBinarySfmData(const TrainingAreaBase::TetraIcd::WlsBinarySfmData &data) { WlsParticipant *p = m_participantsByEqId.value(data.header.equipmentNumber); if (!p) { WARNING_LOG(m_logger) << "Got binary sfm data for participant with eqId " << data.header.equipmentNumber << " but could not find this participant!"; return; } p->sendBinarySfmData(data.payload); } void WlsParticipantHandler::onGpsOnOffTimeoutTimer() { const qint64 tNow = QDateTime::currentMSecsSinceEpoch(); for (WlsParticipant *p : qAsConst(m_participantsByTagId)) p->checkGpsOnOffTimeoutTimer(tNow); } } // namespace WirelessLocationSystem