SerialInterface.h 7.74 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 36
/**
 * @file
 *   @brief Brief Description
 *
 *   @author James Goppertr <james.goppert@gmail.edu>
 *
 */

#ifndef SERIALINTERFACE_H
#define SERIALINTERFACE_H

#include <QIODevice>
#include "qextserialport.h"
37
#include <QtSerialPort/QSerialPort>
38
#include <iostream>
39 40 41 42

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

signals:
48
    void aboutToClose();
49 50 51

public:

52 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 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119
    enum baudRateType {
        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
    };

    enum dataBitsType {
        DATA_5,
        DATA_6,
        DATA_7,
        DATA_8
    };

    enum parityType {
        PAR_NONE,
        PAR_ODD,
        PAR_EVEN,
        PAR_MARK,               //WINDOWS ONLY
        PAR_SPACE
    };

    enum stopBitsType {
        STOP_1,
        STOP_1_5,               //WINDOWS ONLY
        STOP_2
    };

    enum flowType {
        FLOW_OFF,
        FLOW_HARDWARE,
        FLOW_XONXOFF
    };

    /**
     * structure to contain port settings
     */
    struct portSettings {
        baudRateType BaudRate;
        dataBitsType DataBits;
        parityType Parity;
        stopBitsType StopBits;
        flowType FlowControl;
        long timeout_Millisec;
    };

    virtual bool isOpen() = 0;
120
    virtual bool isWritable() = 0;
James Goppert's avatar
James Goppert committed
121
    virtual qint64 bytesAvailable() = 0;
122 123 124 125
    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;
126 127 128 129 130 131
    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;
132
    virtual void setFlow(flowType flow) = 0;
133 134 135 136
};

class SerialQextserial : public SerialInterface
{
137
    Q_OBJECT
138
private:
139
    QextSerialPort * _port;
140
signals:
141
    void aboutToClose();
142
public:
143 144 145 146
    SerialQextserial(QString porthandle, QextSerialPort::QueryMode mode) : _port(NULL) {
        _port = new QextSerialPort(porthandle, QextSerialPort::Polling);
        QObject::connect(_port,SIGNAL(aboutToClose()),this,SIGNAL(aboutToClose()));
    }
James Goppert's avatar
James Goppert committed
147 148 149 150
    ~SerialQextserial() {
        delete _port;
        _port = NULL;
    }
151 152 153
    virtual bool isOpen() {
        return _port->isOpen();
    }
154 155
    virtual bool isWritable() {
        return _port->isWritable();
156
    }
James Goppert's avatar
James Goppert committed
157
    virtual qint64 bytesAvailable() {
158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 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->flush();
    }
    virtual void close() {
        _port->close();
    }
    virtual void open(QIODevice::OpenModeFlag flag) {
        _port->open(flag);
    }
    virtual void setBaudRate(SerialInterface::baudRateType baudrate) {
        _port->setBaudRate((BaudRateType)baudrate);
    }
    virtual void setParity(SerialInterface::parityType parity) {
        _port->setParity((ParityType)parity);
    }
    virtual void setStopBits(SerialInterface::stopBitsType stopBits) {
        _port->setStopBits((StopBitsType)stopBits);
    }
    virtual void setDataBits(SerialInterface::dataBitsType dataBits) {
        _port->setDataBits((DataBitsType)dataBits);
    }
    virtual void setTimeout(qint64 timeout) {
        _port->setTimeout(timeout);
    };
190 191 192
    virtual void setFlow(SerialInterface::flowType flow) {
        // TODO implement
    };
193 194
};

195 196 197
using namespace TNX;

class SerialQserial : public SerialInterface
198
{
199 200 201 202 203 204 205 206
    Q_OBJECT
private:
    QSerialPort * _port;
    TNX::QPortSettings settings;
signals:
    void aboutToClose();
public:
    SerialQserial(QString porthandle, QIODevice::OpenModeFlag flag=QIODevice::ReadWrite)
207
        : _port(NULL) {
208
        QObject::connect(_port,SIGNAL(aboutToClose()),this,SIGNAL(aboutToClose()));
James Goppert's avatar
James Goppert committed
209 210
        settings.setBaudRate(QPortSettings::BAUDR_57600);
        settings.setStopBits(QPortSettings::STOP_1);
211 212 213 214
        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
215 216 217 218 219
        _port->setCommTimeouts(QSerialPort::CtScheme_NonBlockingRead);
    }
    ~SerialQserial() {
        delete _port;
        _port = NULL;
220 221 222 223
    }
    virtual bool isOpen() {
        return _port->isOpen();
    }
224
    virtual bool isWritable() {
225 226
        _port->isWritable();
    }
James Goppert's avatar
James Goppert committed
227
    virtual qint64 bytesAvailable() {
228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244
        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
245
        //flush();
246 247
    }
    virtual void setBaudRate(SerialInterface::baudRateType baudrate) {
248
        // TODO get the baudrate enum to map to one another
James Goppert's avatar
James Goppert committed
249
        settings.setBaudRate(QPortSettings::BAUDR_57600);
250 251
    }
    virtual void setParity(SerialInterface::parityType parity) {
252
        settings.setParity(QPortSettings::PAR_NONE);
253 254
    }
    virtual void setStopBits(SerialInterface::stopBitsType stopBits) {
255 256
        // TODO map
        settings.setStopBits(QPortSettings::STOP_1);
257 258
    }
    virtual void setDataBits(SerialInterface::dataBitsType dataBits) {
259 260
        // TODO map
        settings.setDataBits(QPortSettings::DB_8);
261 262
    }
    virtual void setTimeout(qint64 timeout) {
263
        // TODO implement
264 265
        //_port->setTimeout(timeout);
    };
266 267 268 269
    virtual void setFlow(SerialInterface::flowType flow) {
        // TODO map
        settings.setFlowControl(QPortSettings::FLOW_OFF);
    };
270 271 272
};

#endif // SERIALINTERFACE_H
273 274

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