diff --git a/CMakeLists.txt b/CMakeLists.txt index 2526cc92252d793dc3ee91b4ef9e9fb9055db904..01facd80321915e760e6ff5a6aaffb0347b8a623 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -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 diff --git a/qgroundcontrol.pro b/qgroundcontrol.pro index c6b0e7837923984145604168916719b8b72a3e49..3b952f3d56107d7b01cba2834054b38b24ada993 100644 --- a/qgroundcontrol.pro +++ b/qgroundcontrol.pro @@ -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 \ diff --git a/src/comm/SerialInterface.h b/src/comm/SerialInterface.h new file mode 100644 index 0000000000000000000000000000000000000000..2769db5d1b06c0b95c78f2a9e72c97ddaecdef1a --- /dev/null +++ b/src/comm/SerialInterface.h @@ -0,0 +1,171 @@ +/*===================================================================== + +QGroundControl Open Source Ground Control Station + +(c) 2009 - 2011 QGROUNDCONTROL PROJECT + +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 . + +======================================================================*/ + +/** + * @file + * @brief Brief Description + * + * @author James Goppertr + * + */ + +#ifndef SERIALINTERFACE_H +#define SERIALINTERFACE_H + +#include +#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 diff --git a/src/comm/SerialLink.cc b/src/comm/SerialLink.cc index d6a3cc5389ea28083b447de589a3d44d356b8073..dfd394cef0a800e4d260a986e8e6522d1b1a40ea 100644 --- a/src/comm/SerialLink.cc +++ b/src/comm/SerialLink.cc @@ -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; diff --git a/src/comm/SerialLink.h b/src/comm/SerialLink.h index b352ad9329d2daf1976f556520416d5d54dda797..bbf80d27a2fc128e8a1763eb24a7218576792f32 100644 --- a/src/comm/SerialLink.h +++ b/src/comm/SerialLink.h @@ -36,7 +36,7 @@ This file is part of the QGROUNDCONTROL project #include #include #include -#include +#include "SerialInterface.h" #include #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(); };