Subversion Repositories Projects

Rev

Blame | Last modification | View Log | RSS feed

/***************************************************************************
 *   Copyright (C) 2009 by Manuel Schrape                                  *
 *   manuel.schrape@gmx.de                                                 *
 *                                                                         *
 *   This program is free software; you can redistribute it and/or modify  *
 *   it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation; either version 2 of the License.        *
 *                                                                         *
 *   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 General Public License     *
 *   along with this program; if not, write to the                         *
 *   Free Software Foundation, Inc.,                                       *
 *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
 ***************************************************************************/

#include "Input_TCP.h"

void Input_TCP::Init()
{
    b_Open = false;
    Timer = new QTimer();
    s_Buffer = "";
    connect(Timer, SIGNAL(timeout()), this, SLOT(slot_Timer()));

    for (int z = 0; z < MAX_Confirm; z++)
    {
        Confirm[z].ID = false;
    }
}

bool Input_TCP::Open(set_Input s_Input)
{
    TCP_Socket = new(QTcpSocket);
    TCP_Socket->connectToHost (s_Input.Main, s_Input.Sub.toInt());

    connect(TCP_Socket, SIGNAL(connected()), this, SLOT(slot_TCP_Connected()) );
    connect(TCP_Socket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(slot_TCP_Error(QAbstractSocket::SocketError)));

    return true;
}

bool Input_TCP::IsOpen()
{
    return b_Open;
}

bool Input_TCP::Close()
{
    TCP_Socket->disconnectFromHost();
    disconnect(TCP_Socket, SIGNAL(connected()), 0, 0);
    disconnect(TCP_Socket, SIGNAL(readyRead()), 0, 0);
    disconnect(TCP_Socket, SIGNAL(disconnected()), 0, 0);

    b_Open = false;
    Timer->stop();

    return true;
}

void Input_TCP::send_Data(QString t_Data, int ID)
{
    if ((ID > 0) && (ID < MAX_Confirm))
    {
        Timer->start(2500);
        Confirm[ID].ID = true;
        Confirm[ID].Data = t_Data;
    }

    if (b_Open)
    {
        usleep(50000);

        if (t_Data[t_Data.length() - 1] != '\r')
        {
            t_Data = t_Data + "\r";
        }

        QByteArray Temp;
        Temp = QByteArray(QString(t_Data + "\n").toAscii());

        TCP_Socket->write(Temp);
        TCP_Socket->flush();

//        qDebug(t_Data.toLatin1().data());
    }
}

void Input_TCP::send_RawData(char *t_Data)
{
    t_Data = t_Data;
}

void Input_TCP::stop_Resend(int ID)
{
    if ((ID > 0) && (ID < MAX_Confirm))
    {
        Confirm[ID].ID = false;
        Confirm[ID].Data = "";
    }
}

void Input_TCP::slot_Timer()
{
    bool Active = false;

    for (int x = 0; x < MAX_Confirm; x++)
    {
        if (Confirm[x].ID)
        {
            Active = true;
            send_Data(Confirm[x].Data);
        }
    }

    if (Active == false)
    {
        Timer->stop();
    }
}

void Input_TCP::slot_TCP_Connected()
{
    b_Open = true;
    connect(TCP_Socket, SIGNAL(readyRead()), SLOT(slot_TCP_ReadLine()));
    connect(TCP_Socket, SIGNAL(disconnected()),TCP_Socket, SLOT(deleteLater()));
    connect(TCP_Socket, SIGNAL(disconnected()),this, SLOT(slot_TCP_Disconnect()));

    emit sig_Connected();
}

void Input_TCP::slot_TCP_Disconnect()
{
    disconnect(TCP_Socket, SIGNAL(disconnected()), 0, 0);
    disconnect(TCP_Socket, SIGNAL(readyRead()), 0, 0);
//    emit sig_Disconnected(1);
}

void Input_TCP::slot_TCP_ReadLine()
{
//    QString t_Data = QString(TCP_Socket->readLine(TCP_Socket->bytesAvailable())).remove(QChar('\n'));
    QString t_Data = s_Buffer + QString(TCP_Socket->readAll());

    s_Buffer = "";

    QStringList l_Data;
    l_Data = t_Data.split('\n');

    for (int z = 0; z < l_Data.count(); z++)
    {

        if ((l_Data[z][l_Data[z].length() - 1] == '\r'))
        {
            emit(sig_NewData(l_Data[z]));
//                qDebug(QString("DATA: _" + l_Data[z] + "_ < END").toLatin1().data());
        }
        else
        {
            s_Buffer = s_Buffer + l_Data[z];
        }
    }
}

void Input_TCP::slot_TCP_Error(QAbstractSocket::SocketError Error)
{
    b_Open = false;

    disconnect(TCP_Socket, SIGNAL(disconnected()), 0, 0);
    disconnect(TCP_Socket, SIGNAL(error(QAbstractSocket::SocketError)), 0, 0);
    disconnect(TCP_Socket, SIGNAL(connected()), 0, 0);
    disconnect(TCP_Socket, SIGNAL(readyRead()), 0, 0);

//    qDebug("Error");
    switch (Error)
    {
        case QAbstractSocket::ConnectionRefusedError:
            emit sig_Disconnected(REFUSED);
        break;
        case QAbstractSocket::RemoteHostClosedError:
            emit sig_Disconnected(REMOTECLOSED);
        break;
        default:
            emit sig_Disconnected(CLOSED);
        break;
    }
//    emit sig_Disconnected(CLOSED);
}

eMode Input_TCP::Mode()
{
    return TCP;
}