/* * Unofficial Qt Serial Port Library * * Copyright (c) 2010 Inbiza Systems Inc. All rights reserved. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by the * Free Software Foundation, either version 3 of the License, or (at your * option) any later version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see * * author labs@inbiza.com */ #include #include #include #include #include "host.h" Host::Host(const QString &serPort, int tcpPort, QObject *parent) : QObject(parent), tcpPort_(tcpPort), tcpSocket_(NULL) { using TNX::QSerialPort; serialPort_ = new QSerialPort(serPort, "9600,8,N,1", this); tcpServer_ = new QTcpServer(this); } Host::~Host() { stop(); } int Host::start() { // deal with serial port if ( serialPort_->open() ) { serialPort_->flushInBuffer(); serialPort_->flushOutBuffer(); } else { qFatal("Cannot open serial port: \"%s\". Giving up.", qPrintable(serialPort_->errorString())); return -1; } connect(serialPort_, SIGNAL(readyRead()), SLOT(onDataReceivedSerial())); // deal with tcp port std::cout << "Waiting for connection on tcp port " << tcpPort_ << std::endl; if ( tcpServer_->listen(QHostAddress::Any, tcpPort_) ) { std::cout << "Listening on " << qPrintable(tcpServer_->serverAddress().toString()) << ":" << tcpServer_->serverPort() << std::endl; connect(tcpServer_, SIGNAL(newConnection()), SLOT(onNewTcpConnection())); } else { qFatal("Cannot listening tcp port: \"%s\". Giving up.", qPrintable(tcpServer_->errorString())); return -1; } return 0; } int Host::stop() { serialPort_->close(); disconnect(serialPort_, SIGNAL(readyRead()), this, SLOT(onDataReceivedSerial())); tcpServer_->close(); disconnect(tcpServer_, SIGNAL(newConnection()), this, SLOT(onNewTcpConnection())); return 0; } void Host::onDataReceivedNetwork() { serialPort_->write(tcpSocket_->read(2048)); } void Host::onDataReceivedSerial() { if ( tcpSocket_->state() == QAbstractSocket::ConnectedState ) { tcpSocket_->write(serialPort_->read(2048)); } } void Host::onNewTcpConnection() { tcpSocket_ = tcpServer_->nextPendingConnection(); connect(tcpSocket_, SIGNAL(readyRead()), SLOT(onDataReceivedNetwork())); std::cout << "Connection is established with " << qPrintable(tcpSocket_->peerAddress().toString()) << std::endl; }