Commit 48f4d3ba authored by James Goppert's avatar James Goppert

Finished abstracting serial port.

parent d7e07781
......@@ -394,6 +394,7 @@ set(qgroundcontrolMocSrc
#src/comm/OpalLink.h
src/comm/MAVLinkProtocol.h
src/comm/SerialLinkInterface.h
src/comm/SerialInterface.h
src/comm/UDPLink.h
src/comm/LinkManager.h
src/comm/LinkInterface.h
......
......@@ -189,6 +189,7 @@ HEADERS += src/MG.h \
src/comm/LinkManager.h \
src/comm/LinkInterface.h \
src/comm/SerialLinkInterface.h \
src/comm/SerialInterface.h \
src/comm/SerialLink.h \
src/comm/SerialSimulationLink.h \
src/comm/ProtocolInterface.h \
......
/*=====================================================================
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/>.
======================================================================*/
/**
* @file
* @brief Brief Description
*
* @author James Goppertr <james.goppert@gmail.edu>
*
*/
#ifndef SERIALINTERFACE_H
#define SERIALINTERFACE_H
#include <QIODevice>
#include "qextserialport.h"
/**
* @brief The SerialInterface abstracts low level serial calls
*/
class SerialInterface : public QObject {
Q_OBJECT
signals:
void aboutToClose();
public:
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;
virtual bool isWriteable() = 0;
virtual bool bytesAvailable() = 0;
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;
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;
};
class SerialQextserial : public SerialInterface
{
Q_OBJECT
private:
QextSerialPort * _port;
signals:
void aboutToClose();
public:
SerialQextserial(QString porthandle, QextSerialPort::QueryMode mode) : _port(NULL)
{
_port = new QextSerialPort(porthandle, QextSerialPort::Polling);
//QObject::connect(_port,SIGNAL(aboutToClose()),this,SIGNAL(aboutToClose()));
}
virtual bool isOpen() { return _port->isOpen(); }
virtual bool isWriteable() { return _port->isWritable(); } // yess, that is mis-spelled, writable
virtual bool bytesAvailable() { 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); };
};
class SerialQserial
{
};
#endif // SERIALINTERFACE_H
......@@ -22,7 +22,8 @@
#endif
SerialLink::SerialLink(QString portname, BaudRateType baudrate, FlowType flow, ParityType parity, DataBitsType dataBits, StopBitsType stopBits) :
SerialLink::SerialLink(QString portname, SerialInterface::baudRateType baudrate, SerialInterface::flowType flow, SerialInterface::parityType parity,
SerialInterface::dataBitsType dataBits, SerialInterface::stopBitsType stopBits) :
port(NULL)
{
// Setup settings
......@@ -141,7 +142,7 @@ void SerialLink::run()
void SerialLink::checkForBytes()
{
/* Check if bytes are available */
if(port && port->isOpen() && port->isWritable())
if(port && port->isOpen() && port->isWriteable())
{
dataMutex.lock();
qint64 available = port->bytesAvailable();
......@@ -159,7 +160,6 @@ void SerialLink::checkForBytes()
}
void SerialLink::writeBytes(const char* data, qint64 size)
{
if(port && port->isOpen())
......@@ -316,7 +316,7 @@ bool SerialLink::hardwareConnect()
port->close();
delete port;
}
port = new QextSerialPort(porthandle, QextSerialPort::Polling);
port = new SerialQextserial(porthandle, QextSerialPort::Polling);
QObject::connect(port, SIGNAL(aboutToClose()), this, SIGNAL(disconnected()));
port->open(QIODevice::ReadWrite);
......@@ -380,77 +380,77 @@ qint64 SerialLink::getNominalDataRate()
qint64 dataRate = 0;
switch (baudrate)
{
case BAUD50:
case SerialInterface::BAUD50:
dataRate = 50;
break;
case BAUD75:
case SerialInterface::BAUD75:
dataRate = 75;
break;
case BAUD110:
case SerialInterface::BAUD110:
dataRate = 110;
break;
case BAUD134:
case SerialInterface::BAUD134:
dataRate = 134;
break;
case BAUD150:
case SerialInterface::BAUD150:
dataRate = 150;
break;
case BAUD200:
case SerialInterface::BAUD200:
dataRate = 200;
break;
case BAUD300:
case SerialInterface::BAUD300:
dataRate = 300;
break;
case BAUD600:
case SerialInterface::BAUD600:
dataRate = 600;
break;
case BAUD1200:
case SerialInterface::BAUD1200:
dataRate = 1200;
break;
case BAUD1800:
case SerialInterface::BAUD1800:
dataRate = 1800;
break;
case BAUD2400:
case SerialInterface::BAUD2400:
dataRate = 2400;
break;
case BAUD4800:
case SerialInterface::BAUD4800:
dataRate = 4800;
break;
case BAUD9600:
case SerialInterface::BAUD9600:
dataRate = 9600;
break;
case BAUD14400:
case SerialInterface::BAUD14400:
dataRate = 14400;
break;
case BAUD19200:
case SerialInterface::BAUD19200:
dataRate = 19200;
break;
case BAUD38400:
case SerialInterface::BAUD38400:
dataRate = 38400;
break;
case BAUD56000:
case SerialInterface::BAUD56000:
dataRate = 56000;
break;
case BAUD57600:
case SerialInterface::BAUD57600:
dataRate = 57600;
break;
case BAUD76800:
case SerialInterface::BAUD76800:
dataRate = 76800;
break;
case BAUD115200:
case SerialInterface::BAUD115200:
dataRate = 115200;
break;
case BAUD128000:
case SerialInterface::BAUD128000:
dataRate = 128000;
break;
case BAUD256000:
case SerialInterface::BAUD256000:
dataRate = 256000;
// Windows-specific high-end baudrates
case BAUD230400:
case SerialInterface::BAUD230400:
dataRate = 230400;
case BAUD460800:
case SerialInterface::BAUD460800:
dataRate = 460800;
case BAUD921600:
case SerialInterface::BAUD921600:
dataRate = 921600;
break;
}
......@@ -553,16 +553,16 @@ int SerialLink::getDataBits()
int ret;
switch (dataBits)
{
case DATA_5:
case SerialInterface::DATA_5:
ret = 5;
break;
case DATA_6:
case SerialInterface::DATA_6:
ret = 6;
break;
case DATA_7:
case SerialInterface::DATA_7:
ret = 7;
break;
case DATA_8:
case SerialInterface::DATA_8:
ret = 8;
break;
default:
......@@ -577,10 +577,10 @@ int SerialLink::getStopBits()
int ret;
switch (stopBits)
{
case STOP_1:
case SerialInterface::STOP_1:
ret = 1;
break;
case STOP_2:
case SerialInterface::STOP_2:
ret = 2;
break;
default:
......@@ -629,79 +629,79 @@ bool SerialLink::setBaudRateType(int rateIndex)
switch (rateIndex) {
case 0:
baudrate = BAUD50;
baudrate = SerialInterface::BAUD50;
break;
case 1:
baudrate = BAUD75;
baudrate = SerialInterface::BAUD75;
break;
case 2:
baudrate = BAUD110;
baudrate = SerialInterface::BAUD110;
break;
case 3:
baudrate = BAUD134;
baudrate = SerialInterface::BAUD134;
break;
case 4:
baudrate = BAUD150;
baudrate = SerialInterface::BAUD150;
break;
case 5:
baudrate = BAUD200;
baudrate = SerialInterface::BAUD200;
break;
case 6:
baudrate = BAUD300;
baudrate = SerialInterface::BAUD300;
break;
case 7:
baudrate = BAUD600;
baudrate = SerialInterface::BAUD600;
break;
case 8:
baudrate = BAUD1200;
baudrate = SerialInterface::BAUD1200;
break;
case 9:
baudrate = BAUD1800;
baudrate = SerialInterface::BAUD1800;
break;
case 10:
baudrate = BAUD2400;
baudrate = SerialInterface::BAUD2400;
break;
case 11:
baudrate = BAUD4800;
baudrate = SerialInterface::BAUD4800;
break;
case 12:
baudrate = BAUD9600;
baudrate = SerialInterface::BAUD9600;
break;
case 13:
baudrate = BAUD14400;
baudrate = SerialInterface::BAUD14400;
break;
case 14:
baudrate = BAUD19200;
baudrate = SerialInterface::BAUD19200;
break;
case 15:
baudrate = BAUD38400;
baudrate = SerialInterface::BAUD38400;
break;
case 16:
baudrate = BAUD56000;
baudrate = SerialInterface::BAUD56000;
break;
case 17:
baudrate = BAUD57600;
baudrate = SerialInterface::BAUD57600;
break;
case 18:
baudrate = BAUD76800;
baudrate = SerialInterface::BAUD76800;
break;
case 19:
baudrate = BAUD115200;
baudrate = SerialInterface::BAUD115200;
break;
case 20:
baudrate = BAUD128000;
baudrate = SerialInterface::BAUD128000;
break;
case 21:
baudrate = BAUD230400;
baudrate = SerialInterface::BAUD230400;
break;
case 22:
baudrate = BAUD256000;
baudrate = SerialInterface::BAUD256000;
break;
case 23:
baudrate = BAUD460800;
baudrate = SerialInterface::BAUD460800;
break;
case 24:
baudrate = BAUD921600;
baudrate = SerialInterface::BAUD921600;
break;
default:
// If none of the above cases matches, there must be an error
......@@ -728,79 +728,79 @@ bool SerialLink::setBaudRate(int rate)
switch (rate)
{
case 50:
baudrate = BAUD50;
baudrate = SerialInterface::BAUD50;
break;
case 75:
baudrate = BAUD75;
baudrate = SerialInterface::BAUD75;
break;
case 110:
baudrate = BAUD110;
baudrate = SerialInterface::BAUD110;
break;
case 134:
baudrate = BAUD134;
baudrate = SerialInterface::BAUD134;
break;
case 150:
baudrate = BAUD150;
baudrate = SerialInterface::BAUD150;
break;
case 200:
baudrate = BAUD200;
baudrate = SerialInterface::BAUD200;
break;
case 300:
baudrate = BAUD300;
baudrate = SerialInterface::BAUD300;
break;
case 600:
baudrate = BAUD600;
baudrate = SerialInterface::BAUD600;
break;
case 1200:
baudrate = BAUD1200;
baudrate = SerialInterface::BAUD1200;
break;
case 1800:
baudrate = BAUD1800;
baudrate = SerialInterface::BAUD1800;
break;
case 2400:
baudrate = BAUD2400;
baudrate = SerialInterface::BAUD2400;
break;
case 4800:
baudrate = BAUD4800;
baudrate = SerialInterface::BAUD4800;
break;
case 9600:
baudrate = BAUD9600;
baudrate = SerialInterface::BAUD9600;
break;
case 14400:
baudrate = BAUD14400;
baudrate = SerialInterface::BAUD14400;
break;
case 19200:
baudrate = BAUD19200;
baudrate = SerialInterface::BAUD19200;
break;
case 38400:
baudrate = BAUD38400;
baudrate = SerialInterface::BAUD38400;
break;
case 56000:
baudrate = BAUD56000;
baudrate = SerialInterface::BAUD56000;
break;
case 57600:
baudrate = BAUD57600;
baudrate = SerialInterface::BAUD57600;
break;
case 76800:
baudrate = BAUD76800;
baudrate = SerialInterface::BAUD76800;
break;
case 115200:
baudrate = BAUD115200;
baudrate = SerialInterface::BAUD115200;
break;
case 128000:
baudrate = BAUD128000;
baudrate = SerialInterface::BAUD128000;
break;
case 230400:
baudrate = BAUD230400;
baudrate = SerialInterface::BAUD230400;
break;
case 256000:
baudrate = BAUD256000;
baudrate = SerialInterface::BAUD256000;
break;
case 460800:
baudrate = BAUD460800;
baudrate = SerialInterface::BAUD460800;
break;
case 921600:
baudrate = BAUD921600;
baudrate = SerialInterface::BAUD921600;
break;
default:
// If none of the above cases matches, there must be an error
......@@ -822,14 +822,14 @@ bool SerialLink::setFlowType(int flow)
switch (flow)
{
case FLOW_OFF:
this->flow = FLOW_OFF;
case SerialInterface::FLOW_OFF:
this->flow = SerialInterface::FLOW_OFF;
break;
case FLOW_HARDWARE:
this->flow = FLOW_HARDWARE;
case SerialInterface::FLOW_HARDWARE:
this->flow = SerialInterface::FLOW_HARDWARE;
break;
case FLOW_XONXOFF:
this->flow = FLOW_XONXOFF;
case SerialInterface::FLOW_XONXOFF:
this->flow = SerialInterface::FLOW_XONXOFF;
break;
default:
// If none of the above cases matches, there must be an error
......@@ -851,19 +851,19 @@ bool SerialLink::setParityType(int parity)
switch (parity)
{
case (int)PAR_NONE:
this->parity = PAR_NONE;
this->parity = SerialInterface::PAR_NONE;
break;
case (int)PAR_ODD:
this->parity = PAR_ODD;
this->parity = SerialInterface::PAR_ODD;
break;
case (int)PAR_EVEN:
this->parity = PAR_EVEN;
this->parity = SerialInterface::PAR_EVEN;
break;
case (int)PAR_MARK:
this->parity = PAR_MARK;
this->parity = SerialInterface::PAR_MARK;
break;
case (int)PAR_SPACE:
this->parity = PAR_SPACE;
this->parity = SerialInterface::PAR_SPACE;
break;
default:
// If none of the above cases matches, there must be an error
......@@ -886,16 +886,16 @@ bool SerialLink::setDataBits(int dataBits)
switch (dataBits)
{
case 5:
this->dataBits = DATA_5;
this->dataBits = SerialInterface::DATA_5;
break;
case 6:
this->dataBits = DATA_6;
this->dataBits = SerialInterface::DATA_6;
break;
case 7:
this->dataBits = DATA_7;
this->dataBits = SerialInterface::DATA_7;
break;
case 8:
this->dataBits = DATA_8;
this->dataBits = SerialInterface::DATA_8;
break;
default:
// If none of the above cases matches, there must be an error
......@@ -918,10 +918,10 @@ bool SerialLink::setStopBits(int stopBits)
switch (stopBits)
{
case 1:
this->stopBits = STOP_1;
this->stopBits = SerialInterface::STOP_1;
break;
case 2:
this->stopBits = STOP_2;
this->stopBits = SerialInterface::STOP_2;
break;
default:
// If none of the above cases matches, there must be an error
......@@ -941,9 +941,9 @@ bool SerialLink::setDataBitsType(int dataBits)
if (isConnected()) reconnect = true;
disconnect();
if (dataBits >= (int)DATA_5 && dataBits <= (int)DATA_8)
if (dataBits >= (int)SerialInterface::DATA_5 && dataBits <= (int)SerialInterface::DATA_8)
{
this->dataBits = (DataBitsType) dataBits;
this->dataBits = (SerialInterface::dataBitsType) dataBits;
if(reconnect) connect();
accepted = true;
......@@ -959,9 +959,9 @@ bool SerialLink::setStopBitsType(int stopBits)
if(isConnected()) reconnect = true;
disconnect();
if (stopBits >= (int)STOP_1 && dataBits <= (int)STOP_2)
if (stopBits >= (int)SerialInterface::STOP_1 && dataBits <= (int)SerialInterface::STOP_2)
{
StopBitsType newBits = (StopBitsType) stopBits;
SerialInterface::stopBitsType newBits = (SerialInterface::stopBitsType) stopBits;
port->setStopBits(newBits);
accepted = true;
......
......@@ -36,7 +36,7 @@ This file is part of the QGROUNDCONTROL project
#include <QThread>
#include <QMutex>
#include <QString>
#include <qextserialport.h>
#include "SerialInterface.h"
#include <configuration.h>
#include "SerialLinkInterface.h"
#ifdef _WIN32
......@@ -57,7 +57,12 @@ class SerialLink : public SerialLinkInterface {
//Q_INTERFACES(SerialLinkInterface:LinkInterface)
public:
SerialLink(QString portname = "", BaudRateType baudrate=BAUD57600, FlowType flow=FLOW_OFF, ParityType parity=PAR_NONE, DataBitsType dataBits=DATA_8, StopBitsType stopBits=STOP_1);
SerialLink(QString portname = "",
SerialInterface::baudRateType baudrate=SerialInterface::BAUD57600,
SerialInterface::flowType flow=SerialInterface::FLOW_OFF,
SerialInterface::parityType parity=SerialInterface::PAR_NONE,
SerialInterface::dataBitsType dataBits=SerialInterface::DATA_8,
SerialInterface::stopBitsType stopBits=SerialInterface::STOP_1);
~SerialLink();
static const int poll_interval = SERIAL_POLL_INTERVAL; ///< Polling interval, defined in configuration.h
......@@ -132,18 +137,18 @@ protected slots:
void checkForBytes();
protected:
QextSerialPort* port;
SerialInterface * port;
#ifdef _WIN32
HANDLE winPort;
DCB winPortSettings;
#endif
QString porthandle;
QString name;
BaudRateType baudrate;
FlowType flow;
ParityType parity;
DataBitsType dataBits;
StopBitsType stopBits;
SerialInterface::baudRateType baudrate;
SerialInterface::flowType flow;
SerialInterface::parityType parity;
SerialInterface::dataBitsType dataBits;
SerialInterface::stopBitsType stopBits;
int timeout;
int id;
......@@ -163,7 +168,7 @@ protected:
bool hardwareConnect();
signals:
// Signals are defined by LinkInterface
void aboutToCloseFlag();
};
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment