SerialInterface.h 5.99 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
/*=====================================================================

QGroundControl Open Source Ground Control Station

(c) 2009 - 2011 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>

This file is part of the QGROUNDCONTROL project

    QGROUNDCONTROL 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 3 of the License, or
    (at your option) any later version.

    QGROUNDCONTROL 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 QGROUNDCONTROL. If not, see <http://www.gnu.org/licenses/>.

======================================================================*/
23

24 25 26 27 28 29 30 31 32 33 34 35
/**
 * @file
 *   @brief Brief Description
 *
 *   @author James Goppertr <james.goppert@gmail.edu>
 *
 */

#ifndef SERIALINTERFACE_H
#define SERIALINTERFACE_H

#include <QIODevice>
36
#include <QtSerialPort/QSerialPort>
37
#include <iostream>
38 39 40 41

/**
 * @brief The SerialInterface abstracts low level serial calls
 */
42 43 44
class SerialInterface : public QObject
{
    Q_OBJECT
45 46

signals:
47
    void aboutToClose();
48 49 50

public:

51 52
    enum baudRateType
    {
53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
        BAUD50,                //POSIX ONLY
        BAUD75,                //POSIX ONLY
        BAUD110,
        BAUD134,               //POSIX ONLY
        BAUD150,               //POSIX ONLY
        BAUD200,               //POSIX ONLY
        BAUD300,
        BAUD600,
        BAUD1200,
        BAUD1800,              //POSIX ONLY
        BAUD2400,
        BAUD4800,
        BAUD9600,
        BAUD14400,             //WINDOWS ONLY
        BAUD19200,
        BAUD38400,
        BAUD56000,             //WINDOWS ONLY
        BAUD57600,
        BAUD76800,             //POSIX ONLY
        BAUD115200,
        BAUD128000,            // WINDOWS ONLY
        BAUD230400,            // WINDOWS ONLY
        BAUD256000,            // WINDOWS ONLY
        BAUD460800,            // WINDOWS ONLY
        BAUD921600             // WINDOWS ONLY
    };

80 81
    enum dataBitsType
    {
82 83 84 85 86 87
        DATA_5,
        DATA_6,
        DATA_7,
        DATA_8
    };

88 89
    enum parityType
    {
90 91 92 93 94 95 96
        PAR_NONE,
        PAR_ODD,
        PAR_EVEN,
        PAR_MARK,               //WINDOWS ONLY
        PAR_SPACE
    };

97 98
    enum stopBitsType
    {
99 100 101 102 103
        STOP_1,
        STOP_1_5,               //WINDOWS ONLY
        STOP_2
    };

104 105
    enum flowType
    {
106 107 108 109 110 111 112 113
        FLOW_OFF,
        FLOW_HARDWARE,
        FLOW_XONXOFF
    };

    /**
     * structure to contain port settings
     */
114 115
    struct portSettings
    {
116 117 118 119 120 121 122 123 124
        baudRateType BaudRate;
        dataBitsType DataBits;
        parityType Parity;
        stopBitsType StopBits;
        flowType FlowControl;
        long timeout_Millisec;
    };

    virtual bool isOpen() = 0;
125
    virtual bool isWritable() = 0;
James Goppert's avatar
James Goppert committed
126
    virtual qint64 bytesAvailable() = 0;
127 128 129 130
    virtual int write(const char * data, qint64 size) = 0;
    virtual void read(char * data, qint64 numBytes) = 0;
    virtual void flush() = 0;
    virtual void close() = 0;
131 132 133 134 135 136
    virtual void open(QIODevice::OpenModeFlag flag) = 0;
    virtual void setBaudRate(baudRateType baudrate) = 0;
    virtual void setParity(parityType parity) = 0;
    virtual void setStopBits(stopBitsType stopBits) = 0;
    virtual void setDataBits(dataBitsType dataBits) = 0;
    virtual void setTimeout(qint64 timeout) = 0;
137
    virtual void setFlow(flowType flow) = 0;
138 139
};

140 141 142
using namespace TNX;

class SerialQserial : public SerialInterface
143
{
144 145 146 147 148 149 150 151
    Q_OBJECT
private:
    QSerialPort * _port;
    TNX::QPortSettings settings;
signals:
    void aboutToClose();
public:
    SerialQserial(QString porthandle, QIODevice::OpenModeFlag flag=QIODevice::ReadWrite)
152
        : _port(NULL) {
153
        QObject::connect(_port,SIGNAL(aboutToClose()),this,SIGNAL(aboutToClose()));
James Goppert's avatar
James Goppert committed
154 155
        settings.setBaudRate(QPortSettings::BAUDR_57600);
        settings.setStopBits(QPortSettings::STOP_1);
156 157 158 159
        settings.setDataBits(QPortSettings::DB_8);
        settings.setFlowControl(QPortSettings::FLOW_OFF);
        settings.setParity(QPortSettings::PAR_NONE);
        _port = new QSerialPort(porthandle,settings);
James Goppert's avatar
James Goppert committed
160 161 162 163 164
        _port->setCommTimeouts(QSerialPort::CtScheme_NonBlockingRead);
    }
    ~SerialQserial() {
        delete _port;
        _port = NULL;
165 166 167 168
    }
    virtual bool isOpen() {
        return _port->isOpen();
    }
169
    virtual bool isWritable() {
170 171
        _port->isWritable();
    }
James Goppert's avatar
James Goppert committed
172
    virtual qint64 bytesAvailable() {
173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189
        return _port->bytesAvailable();
    }
    virtual int write(const char * data, qint64 size) {
        return _port->write(data,size);
    }
    virtual void read(char * data, qint64 numBytes) {
        _port->read(data,numBytes);
    }
    virtual void flush() {
        _port->flushInBuffer();
        _port->flushOutBuffer();
    }
    virtual void close() {
        _port->close();
    }
    virtual void open(QIODevice::OpenModeFlag flag) {
        _port->open(flag);
James Goppert's avatar
James Goppert committed
190
        //flush();
191 192
    }
    virtual void setBaudRate(SerialInterface::baudRateType baudrate) {
193
        // TODO get the baudrate enum to map to one another
James Goppert's avatar
James Goppert committed
194
        settings.setBaudRate(QPortSettings::BAUDR_57600);
195 196
    }
    virtual void setParity(SerialInterface::parityType parity) {
197
        settings.setParity(QPortSettings::PAR_NONE);
198 199
    }
    virtual void setStopBits(SerialInterface::stopBitsType stopBits) {
200 201
        // TODO map
        settings.setStopBits(QPortSettings::STOP_1);
202 203
    }
    virtual void setDataBits(SerialInterface::dataBitsType dataBits) {
204 205
        // TODO map
        settings.setDataBits(QPortSettings::DB_8);
206 207
    }
    virtual void setTimeout(qint64 timeout) {
208
        // TODO implement
209
        //_port->setTimeout(timeout);
210
    }
211 212 213
    virtual void setFlow(SerialInterface::flowType flow) {
        // TODO map
        settings.setFlowControl(QPortSettings::FLOW_OFF);
214
    }
215 216 217
};

#endif // SERIALINTERFACE_H
218 219

// vim:ts=4:sw=4:tw=78:expandtab: