/** * Send / Receive telegrams to/from PrtCnv * $Id$ * $HeadURL$ * $Author$ * Created by Christian Ehrlicher, SLSE, 2016-09-26 */ #include "tetra_dispatcher.h" #include "tetra_handler_rx.h" #include "tetra_handler_tx.h" namespace WlsTetra { // // TetraDispatcher // TetraDispatcher::TetraDispatcher(TrainingAreaBase::Plugin::DataProvider *pdp, const std::shared_ptr &recvFromTabCb) : TrainingAreaBase::Plugin::Interface() , m_rxHandler(std::make_shared(recvFromTabCb)) , m_txHandler(std::make_shared()) , m_tetraPrtCnv(new TetraPrtCnv(pdp, this)) , m_dataProvider(pdp) , m_logger(getLogger("TetraDispatcher")) { connect(m_tetraPrtCnv, &TetraPrtCnv::tetraConnectionChanged, this, &TetraDispatcher::onTetraConnectionChanged); connect(m_rxHandler.get(), &TetraHandlerRx::tetraConnectionChanged, this, &TetraDispatcher::onTetraConnectionChanged); connect(m_rxHandler.get(), &TetraHandlerRx::participantLicenseChange, this, &TetraDispatcher::participantLicenseChange); connect(m_tetraPrtCnv, &TetraPrtCnv::textMessageFromPrtCnv, m_rxHandler.get(), &TetraHandlerRx::handleTelegram); connect(m_rxHandler.get(), &TetraHandlerRx::initialAckReceived, this, &TetraDispatcher::onSendInitialData); connect(m_rxHandler.get(), &TetraHandlerRx::txData, m_txHandler.get(), QOverload::of(&TetraHandlerTx::txData)); connect(m_txHandler.get(), &TetraHandlerTx::outgoingMessage, m_tetraPrtCnv, &TetraPrtCnv::textMessageToPrtCnv); } bool TetraDispatcher::init() { onTetraConnectionChanged(false); if (!m_tetraPrtCnv->init()) return false; return true; } void TetraDispatcher::onBroadcastTelegramsRequest(int equipmentNumber, int broadcastIndex, int resetCounter) { emit m_tetraPrtCnv->broadcastTelegramsRequest(equipmentNumber, broadcastIndex, resetCounter); } void TetraDispatcher::onWlsTelegramReceived(const TrainingAreaBase::TetraIcd::TrainingAreaTelegram *tele) { m_tetraPrtCnv->logWlsTelegram(tele, false); } void TetraDispatcher::onWlsTelegramSent(const TrainingAreaBase::TetraIcd::TrainingAreaTelegram *tele) { m_tetraPrtCnv->logWlsTelegram(tele, true); } std::shared_ptr TetraDispatcher::sendToTab() { return std::static_pointer_cast(m_txHandler); } bool TetraDispatcher::canSendData() const { return m_txHandler->isConnected(); } void TetraDispatcher::exerciseChanged() { m_tetraPrtCnv->onExerciseChanged(); } void TetraDispatcher::onTetraConnectionChanged(bool bConnected) { NOTICE_LOG(m_logger) << "onTetraConnectionChanged: " << bConnected; m_txHandler->setConnected(false); if (!bConnected) { m_txHandler->resetSendCounter(); m_rxHandler->resetConnection(); } emit connectionState(QString::fromUtf8(name()), bConnected); } void TetraDispatcher::onSendInitialData() { m_txHandler->setConnected(true); if (m_dataProvider) { INFO_LOG(m_logger) << "sending initial data"; // on connect we must send: if (m_dataProvider->exerciseId() > 0) { // - Umgebungsmeldung m_txHandler->txData(m_dataProvider->exerciseEnvironmentData()); } // - Betriebszustandsmeldung m_txHandler->txData(m_dataProvider->exerciseStateData()); m_txHandler->txData(m_dataProvider->exerciseEquipmentAssignment()); const auto &aesTeles = m_dataProvider->aesTelegrams(); for (TrainingAreaBase::TetraIcd::TrainingAreaTelegram *aesTele : aesTeles) m_txHandler->sendToTx(aesTele); } } } // namespace WlsTetra