/** * Controller for managing converter threads * $Id$ * $HeadURL$ * $Author$ * Created by Philipp Dassow, NLT, 30-11-2018 */ #include "controller.h" #include "settings.h" #include #include namespace SerialToTcpConverter { Controller::Controller(QObject *parent) : QObject(parent) , m_converterData() , m_icon(new QSystemTrayIcon(this)) , m_logger(getLogger("Controller")) { m_icon->setIcon(QIcon(QLatin1String(":/style/messages.svg"))); m_icon->show(); } Controller::~Controller() { for (const ConverterData &data : qAsConst(m_converterData)) { if (!data.thread) continue; data.thread->disconnect(this); data.thread->quit(); } for (const ConverterData &data : qAsConst(m_converterData)) { if (!data.thread) continue; data.thread->wait(); } } bool Controller::init() { QMenu *menu = new QMenu; const auto configs = Settings::configs(); for (const Settings::Config &config : configs) { INFO_LOG(m_logger) << "Creating converter-thread for " << config.serialPortName; ConverterData data; data.serialPortName = config.serialPortName; ConverterThread *converterThread = new ConverterThread(config.serialPortName, config.serialBaudrate, config.tcpPort); data.thread = converterThread; QAction *action = new QAction(QIcon(QLatin1String(":/style/pu_yellow.svg")), tr("%1 <-> %2").arg(config.serialPortName, QString::number(config.tcpPort)), menu); data.menuAction = action; menu->addAction(action); m_converterData.insert(data.serialPortName, data); connect(converterThread, &ConverterThread::finished, this, &Controller::onThreadExit); connect(converterThread, &ConverterThread::connected, this, &Controller::onThreadConnected); converterThread->start(); } m_icon->setContextMenu(menu); return true; } void Controller::onThreadExit() { ConverterThread *t = qobject_cast(sender()); if (!t) return; const QString name = t->portName(); auto &data = m_converterData[name]; INFO_LOG (m_logger) << "Exiting converter-thread for serial port: "<< data.serialPortName; data.menuAction->setIcon(QIcon(QLatin1String(":/style/pu_red.svg"))); data.thread->deleteLater(); data.thread = nullptr; } void Controller::onThreadConnected(const QString &portName) { if (!m_converterData.contains(portName)) return; m_converterData[portName].menuAction->setIcon(QIcon(QLatin1String(":/style/pu_green.svg"))); } } //namespace SerialToTcpConverter