// ************************************************************************** // // (C) Copyright 2009 Swiss SIMTEC AG // // ************************************************************************** // // $HeadURL$ // $LastChangedBy$ // $LastChangedDate$ // $LastChangedRevision$ // // ************************************************************************** // manual class headers #include "LogViewInjectionThread.hpp" #include "LogViewTelegram.hpp" #include "LogViewOptionDialog.hpp" #include #include #include #include namespace N_LogView { LogViewInjectionThread::LogViewInjectionThread() : m_DoStartConnection(false) , m_SendingPossible(false) , m_Socket(nullptr) , m_Timer(nullptr) , m_logger(getLogger("LogViewInjectionThread")) { // load the settings (and write default-values if not defined) QSettings settings; settings.beginGroup(LogViewOptionDialog::INJECTION_GROUP); m_Hostname = settings.value(LogViewOptionDialog::INJECTION_HOSTNAME).toString(); if (m_Hostname.isEmpty()) { // set default-hostname if nothing was set m_Hostname = QLatin1String("localhost"); settings.setValue(LogViewOptionDialog::INJECTION_HOSTNAME, m_Hostname); } m_Port = settings.value(LogViewOptionDialog::INJECTION_PORT).toInt(); if (0 == m_Port || m_Port > 65535) { m_Port = 46666; settings.setValue(LogViewOptionDialog::INJECTION_PORT, m_Port); } } // --------------------------------------------------------------- void LogViewInjectionThread::run() { emit updateStatus(QLatin1String(":/image/RedLamp.png"), tr("LogView ist nicht mit TETRA-If-Injection-Server (%1:%2) verbunden").arg(m_Hostname).arg(m_Port)); QTimer::singleShot(100, this, &LogViewInjectionThread::tryToConnect); exec(); } // --------------------------------------------------------------- void LogViewInjectionThread::setPort(uint16_t port) { m_Port = port; QSettings settings; settings.beginGroup(LogViewOptionDialog::INJECTION_GROUP); settings.setValue(LogViewOptionDialog::INJECTION_PORT, m_Port); } // --------------------------------------------------------------- bool LogViewInjectionThread::isSendingPossible() const { return m_SendingPossible; } // --------------------------------------------------------------- void LogViewInjectionThread::tryToConnect() { //m_Timer->setInterval(3000); if (!m_Socket) { m_Socket = new QTcpSocket(this); connect(m_Socket, &QTcpSocket::connected, this, &LogViewInjectionThread::doConnect); connect(m_Socket, &QTcpSocket::disconnected, this, &LogViewInjectionThread::doDisconnect); } // we need a timer for retrying connection if (!m_Timer) { m_Timer = new QTimer(this); connect(m_Timer, &QTimer::timeout, this, &LogViewInjectionThread::tryToConnect); } m_Timer->setInterval(3000); m_Timer->start(); INFO_LOG(m_logger) << "Try to connect to injection-server of TETRA-If (" << m_Hostname << ":" << m_Port << ")"; m_Socket->connectToHost(m_Hostname, m_Port); } // --------------------------------------------------------------- void LogViewInjectionThread::doConnect() { INFO_LOG(m_logger) << "LogView has successful connected to injection-server of TETRA-If"; m_SendingPossible = true; m_Timer->stop(); emit updateStatus(QLatin1String(":/image/GreenLamp.png"), tr("LogView ist mit TETRA-If-Injection-Server (%1:%2) verbunden").arg(m_Hostname).arg(m_Port)); } // --------------------------------------------------------------- void LogViewInjectionThread::doDisconnect() { INFO_LOG(m_logger) << "LogView was disconnected from injection-server of TETRA-If"; m_SendingPossible = false; emit updateStatus(QLatin1String(":/image/RedLamp.png"), tr("LogView ist nicht mehr mit TETRA-If-Injection-Server (%1:%2) verbunden").arg(m_Hostname).arg(m_Port)); tryToConnect(); } // --------------------------------------------------------------- void LogViewInjectionThread::sendTelegram(LogViewTelegram* a_telegram, const bool a_doSendAsCentralTelegram) { INFO_LOG(m_logger) << "inject " << (a_doSendAsCentralTelegram ? "central" : "Tetra") << " telegram"; if (!m_Socket || m_Socket->state() != QAbstractSocket::ConnectedState) { ERROR_LOG(m_logger) << "Try to write a telegramm but we are not connected"; return; } N_CoPrtCnv::CoPrtCnvInjectionHeader injectionHeader; injectionHeader.m_Kind = a_doSendAsCentralTelegram ? N_CoPrtCnv::CoPrtCnvInjectionHeader::eCentral : N_CoPrtCnv::CoPrtCnvInjectionHeader::eRadio; const QByteArray &data = a_telegram->getData(); injectionHeader.m_Size = data.size(); m_Socket->write((char*)(&injectionHeader), sizeof(injectionHeader)); m_Socket->write(data); } } // namespace N_LogView