Commit 083f27d3 authored by James Goppert's avatar James Goppert

Merge branch 'new-uart' of github.com:pixhawk/qgroundcontrol into dev-lin

parents bba55d01 4b2663b5
...@@ -127,7 +127,7 @@ INCLUDEPATH += . \ ...@@ -127,7 +127,7 @@ INCLUDEPATH += . \
thirdParty/qserialport/src thirdParty/qserialport/src
# Include serial port library # Include serial port library
include(src/lib/qextserialport/qextserialport.pri) #include(src/lib/qextserialport/qextserialport.pri)
# include qserial library # include qserial library
include(thirdParty/qserialport/qgroundcontrol-qserialport.pri) include(thirdParty/qserialport/qgroundcontrol-qserialport.pri)
...@@ -207,7 +207,6 @@ HEADERS += src/MG.h \ ...@@ -207,7 +207,6 @@ HEADERS += src/MG.h \
src/comm/LinkManager.h \ src/comm/LinkManager.h \
src/comm/LinkInterface.h \ src/comm/LinkInterface.h \
src/comm/SerialLinkInterface.h \ src/comm/SerialLinkInterface.h \
src/comm/SerialInterface.h \
src/comm/SerialLink.h \ src/comm/SerialLink.h \
src/comm/SerialSimulationLink.h \ src/comm/SerialSimulationLink.h \
src/comm/ProtocolInterface.h \ src/comm/ProtocolInterface.h \
......
...@@ -33,7 +33,6 @@ This file is part of the QGROUNDCONTROL project ...@@ -33,7 +33,6 @@ This file is part of the QGROUNDCONTROL project
#define SERIALINTERFACE_H #define SERIALINTERFACE_H
#include <QIODevice> #include <QIODevice>
#include "qextserialport.h"
#include <QtSerialPort/QSerialPort> #include <QtSerialPort/QSerialPort>
#include <iostream> #include <iostream>
...@@ -138,67 +137,6 @@ public: ...@@ -138,67 +137,6 @@ public:
virtual void setFlow(flowType flow) = 0; virtual void setFlow(flowType flow) = 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()));
}
~SerialQextserial() {
delete _port;
_port = NULL;
}
virtual bool isOpen() {
return _port->isOpen();
}
virtual bool isWritable() {
return _port->isWritable();
}
virtual qint64 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);
}
virtual void setFlow(SerialInterface::flowType flow) {
// TODO implement
_port->setFlowControl((FlowType)flow);
}
};
using namespace TNX; using namespace TNX;
class SerialQserial : public SerialInterface class SerialQserial : public SerialInterface
......
...@@ -21,10 +21,12 @@ ...@@ -21,10 +21,12 @@
#include "windows.h" #include "windows.h"
#endif #endif
using namespace TNX;
//#define USE_QEXTSERIAL // this allows us to revert to old serial library during transition //#define USE_QEXTSERIAL // this allows us to revert to old serial library during transition
SerialLink::SerialLink(QString portname, SerialInterface::baudRateType baudrate, SerialInterface::flowType flow, SerialInterface::parityType parity, SerialLink::SerialLink(QString portname, int baudRate, bool hardwareFlowControl, bool parity,
SerialInterface::dataBitsType dataBits, SerialInterface::stopBitsType stopBits) : int dataBits, int stopBits) :
port(NULL) port(NULL)
{ {
// Setup settings // Setup settings
...@@ -40,12 +42,25 @@ SerialLink::SerialLink(QString portname, SerialInterface::baudRateType baudrate, ...@@ -40,12 +42,25 @@ SerialLink::SerialLink(QString portname, SerialInterface::baudRateType baudrate,
// Set unique ID and add link to the list of links // Set unique ID and add link to the list of links
this->id = getNextLinkId(); this->id = getNextLinkId();
this->baudrate = baudrate; setBaudRate(baudRate);
this->flow = flow; if (hardwareFlowControl)
this->parity = parity; {
this->dataBits = dataBits; portSettings.setFlowControl(QPortSettings::FLOW_HARDWARE);
this->stopBits = stopBits; }
this->timeout = 1; ///< The timeout controls how long the program flow should wait for new serial bytes. As we're polling, we don't want to wait at all. else
{
portSettings.setFlowControl(QPortSettings::FLOW_OFF);
}
if (parity)
{
portSettings.setParity(QPortSettings::PAR_EVEN);
}
else
{
portSettings.setParity(QPortSettings::PAR_NONE);
}
setDataBits(dataBits);
setStopBits(stopBits);
// Set the port name // Set the port name
if (porthandle == "") if (porthandle == "")
...@@ -224,7 +239,8 @@ bool SerialLink::disconnect() ...@@ -224,7 +239,8 @@ bool SerialLink::disconnect()
/* Block the thread until it returns from run() */ /* Block the thread until it returns from run() */
//#endif //#endif
// dataMutex.lock(); // dataMutex.lock();
port->flush(); port->flushInBuffer();
port->flushOutBuffer();
port->close(); port->close();
delete port; delete port;
port = NULL; port = NULL;
...@@ -237,7 +253,7 @@ bool SerialLink::disconnect() ...@@ -237,7 +253,7 @@ bool SerialLink::disconnect()
emit disconnected(); emit disconnected();
emit connected(false); emit connected(false);
return ! closed; return closed;
} else { } else {
// No port, so we're disconnected // No port, so we're disconnected
return true; return true;
...@@ -252,12 +268,8 @@ bool SerialLink::disconnect() ...@@ -252,12 +268,8 @@ bool SerialLink::disconnect()
**/ **/
bool SerialLink::connect() bool SerialLink::connect()
{ {
if (!isConnected()) { if (this->isRunning()) this->disconnect();
qDebug() << "CONNECTING LINK: " << __FILE__ << __LINE__ << "with settings" << porthandle << baudrate << dataBits << parity << stopBits; this->start(LowPriority);
if (!this->isRunning()) {
this->start(LowPriority);
}
}
return true; return true;
} }
...@@ -275,27 +287,22 @@ bool SerialLink::hardwareConnect() ...@@ -275,27 +287,22 @@ bool SerialLink::hardwareConnect()
port->close(); port->close();
delete port; delete port;
} }
#ifdef USE_QEXTSERIAL port = new QSerialPort(porthandle, portSettings);
port = new SerialQextserial(porthandle, QextSerialPort::Polling); QObject::connect(port,SIGNAL(aboutToClose()),this,SIGNAL(disconnected()));
#else port->setCommTimeouts(QSerialPort::CtScheme_NonBlockingRead);
port = new SerialQserial(porthandle, QIODevice::ReadWrite);
#endif
QObject::connect(port, SIGNAL(aboutToClose()), this, SIGNAL(disconnected()));
port->open(QIODevice::ReadWrite);
port->setBaudRate(this->baudrate);
port->setParity(this->parity);
port->setStopBits(this->stopBits);
port->setDataBits(this->dataBits);
port->setTimeout(timeout); // Timeout of 0 ms, we don't want to wait for data, we just poll again next time
connectionStartTime = MG::TIME::getGroundTimeNow(); connectionStartTime = MG::TIME::getGroundTimeNow();
port->open();
bool connectionUp = isConnected(); bool connectionUp = isConnected();
if(connectionUp) { if(connectionUp) {
emit connected(); emit connected();
emit connected(true); emit connected(true);
} }
qDebug() << "CONNECTING LINK: " << __FILE__ << __LINE__ << "with settings" << port->portName() << getBaudRate() << getDataBits() << getParityType() << getStopBits();
writeSettings(); writeSettings();
return connectionUp; return connectionUp;
...@@ -336,80 +343,93 @@ void SerialLink::setName(QString name) ...@@ -336,80 +343,93 @@ void SerialLink::setName(QString name)
qint64 SerialLink::getNominalDataRate() qint64 SerialLink::getNominalDataRate()
{ {
qint64 dataRate = 0; qint64 dataRate = 0;
switch (baudrate) { switch (portSettings.baudRate()) {
case SerialInterface::BAUD50: case QPortSettings::BAUDR_50:
dataRate = 50; dataRate = 50;
break; break;
case SerialInterface::BAUD75: case QPortSettings::BAUDR_75:
dataRate = 75; dataRate = 75;
break; break;
case SerialInterface::BAUD110: case QPortSettings::BAUDR_110:
dataRate = 110; dataRate = 110;
break; break;
case SerialInterface::BAUD134: case QPortSettings::BAUDR_134:
dataRate = 134; dataRate = 134;
break; break;
case SerialInterface::BAUD150: case QPortSettings::BAUDR_150:
dataRate = 150; dataRate = 150;
break; break;
case SerialInterface::BAUD200: case QPortSettings::BAUDR_200:
dataRate = 200; dataRate = 200;
break; break;
case SerialInterface::BAUD300: case QPortSettings::BAUDR_300:
dataRate = 300; dataRate = 300;
break; break;
case SerialInterface::BAUD600: case QPortSettings::BAUDR_600:
dataRate = 600; dataRate = 600;
break; break;
case SerialInterface::BAUD1200: case QPortSettings::BAUDR_1200:
dataRate = 1200; dataRate = 1200;
break; break;
case SerialInterface::BAUD1800: case QPortSettings::BAUDR_1800:
dataRate = 1800; dataRate = 1800;
break; break;
case SerialInterface::BAUD2400: case QPortSettings::BAUDR_2400:
dataRate = 2400; dataRate = 2400;
break; break;
case SerialInterface::BAUD4800: case QPortSettings::BAUDR_4800:
dataRate = 4800; dataRate = 4800;
break; break;
case SerialInterface::BAUD9600: case QPortSettings::BAUDR_9600:
dataRate = 9600; dataRate = 9600;
break; break;
case SerialInterface::BAUD14400: #ifdef Q_OS_WIN
case QPortSettings::BAUDR_14400:
dataRate = 14400; dataRate = 14400;
break; break;
case SerialInterface::BAUD19200: #endif
case QPortSettings::BAUDR_19200:
dataRate = 19200; dataRate = 19200;
break; break;
case SerialInterface::BAUD38400: case QPortSettings::BAUDR_38400:
dataRate = 38400; dataRate = 38400;
break; break;
case SerialInterface::BAUD56000: #ifdef Q_OS_WIN
case QPortSettings::BAUDR_56000:
dataRate = 56000; dataRate = 56000;
break; break;
case SerialInterface::BAUD57600: #endif
case QPortSettings::BAUDR_57600:
dataRate = 57600; dataRate = 57600;
break; break;
case SerialInterface::BAUD76800: #ifdef Q_OS_WIN
case QPortSettings::BAUDR_76800:
dataRate = 76800; dataRate = 76800;
break; break;
case SerialInterface::BAUD115200: #endif
case QPortSettings::BAUDR_115200:
dataRate = 115200; dataRate = 115200;
break; break;
case SerialInterface::BAUD128000: #ifdef Q_OS_WIN
// Windows-specific high-end baudrates
case QPortSettings::BAUDR_128000:
dataRate = 128000; dataRate = 128000;
break; break;
case SerialInterface::BAUD256000: case QPortSettings::BAUDR_256000:
dataRate = 256000; dataRate = 256000;
// Windows-specific high-end baudrates case QPortSettings::BAUDR_230400:
case SerialInterface::BAUD230400:
dataRate = 230400; dataRate = 230400;
case SerialInterface::BAUD460800: case QPortSettings::BAUDR_460800:
dataRate = 460800; dataRate = 460800;
case SerialInterface::BAUD921600: #endif
// All-OS high-speed
case QPortSettings::BAUDR_921600:
dataRate = 921600; dataRate = 921600;
break; break;
case QPortSettings::BAUDR_UNKNOWN:
default:
// Do nothing
break;
} }
return dataRate; return dataRate;
} }
...@@ -482,47 +502,47 @@ int SerialLink::getBaudRate() ...@@ -482,47 +502,47 @@ int SerialLink::getBaudRate()
int SerialLink::getBaudRateType() int SerialLink::getBaudRateType()
{ {
return baudrate; return portSettings.baudRate();
} }
int SerialLink::getFlowType() int SerialLink::getFlowType()
{ {
return flow; return portSettings.flowControl();
} }
int SerialLink::getParityType() int SerialLink::getParityType()
{ {
return parity; return portSettings.parity();
} }
int SerialLink::getDataBitsType() int SerialLink::getDataBitsType()
{ {
return dataBits; return portSettings.dataBits();
} }
int SerialLink::getStopBitsType() int SerialLink::getStopBitsType()
{ {
return stopBits; return portSettings.stopBits();
} }
int SerialLink::getDataBits() int SerialLink::getDataBits()
{ {
int ret; int ret = -1;
switch (dataBits) { switch (portSettings.dataBits()) {
case SerialInterface::DATA_5: case QPortSettings::DB_5:
ret = 5; ret = 5;
break; break;
case SerialInterface::DATA_6: case QPortSettings::DB_6:
ret = 6; ret = 6;
break; break;
case SerialInterface::DATA_7: case QPortSettings::DB_7:
ret = 7; ret = 7;
break; break;
case SerialInterface::DATA_8: case QPortSettings::DB_8:
ret = 8; ret = 8;
break; break;
default: default:
ret = 0; ret = -1;
break; break;
} }
return ret; return ret;
...@@ -530,18 +550,18 @@ int SerialLink::getDataBits() ...@@ -530,18 +550,18 @@ int SerialLink::getDataBits()
int SerialLink::getStopBits() int SerialLink::getStopBits()
{ {
int ret; int ret = -1;
switch (stopBits) { switch (portSettings.stopBits()) {
case SerialInterface::STOP_1: case QPortSettings::STOP_1:
ret = 1; ret = 1;
break; break;
case SerialInterface::STOP_2: case QPortSettings::STOP_2:
ret = 2; ret = 2;
break; break;
default: default:
ret = 0; ret = -1;
break; break;
} }
return ret; return ret;
} }
...@@ -578,96 +598,27 @@ bool SerialLink::setBaudRateType(int rateIndex) ...@@ -578,96 +598,27 @@ bool SerialLink::setBaudRateType(int rateIndex)
if(isConnected()) reconnect = true; if(isConnected()) reconnect = true;
disconnect(); disconnect();
switch (rateIndex) { if (rateIndex >= (int)QPortSettings::BAUDR_50 && rateIndex <= (int)QPortSettings::BAUDR_921600)
case 0: {
baudrate = SerialInterface::BAUD50; portSettings.setBaudRate((QPortSettings::BaudRate)rateIndex);
break;
case 1:
baudrate = SerialInterface::BAUD75;
break;
case 2:
baudrate = SerialInterface::BAUD110;
break;
case 3:
baudrate = SerialInterface::BAUD134;
break;
case 4:
baudrate = SerialInterface::BAUD150;
break;
case 5:
baudrate = SerialInterface::BAUD200;
break;
case 6:
baudrate = SerialInterface::BAUD300;
break;
case 7:
baudrate = SerialInterface::BAUD600;
break;
case 8:
baudrate = SerialInterface::BAUD1200;
break;
case 9:
baudrate = SerialInterface::BAUD1800;
break;
case 10:
baudrate = SerialInterface::BAUD2400;
break;
case 11:
baudrate = SerialInterface::BAUD4800;
break;
case 12:
baudrate = SerialInterface::BAUD9600;
break;
case 13:
baudrate = SerialInterface::BAUD14400;
break;
case 14:
baudrate = SerialInterface::BAUD19200;
break;
case 15:
baudrate = SerialInterface::BAUD38400;
break;
case 16:
baudrate = SerialInterface::BAUD56000;
break;
case 17:
baudrate = SerialInterface::BAUD57600;
break;
case 18:
baudrate = SerialInterface::BAUD76800;
break;
case 19:
baudrate = SerialInterface::BAUD115200;
break;
case 20:
baudrate = SerialInterface::BAUD128000;
break;
case 21:
baudrate = SerialInterface::BAUD230400;
break;
case 22:
baudrate = SerialInterface::BAUD256000;
break;
case 23:
baudrate = SerialInterface::BAUD460800;
break;
case 24:
baudrate = SerialInterface::BAUD921600;
break;
default:
// If none of the above cases matches, there must be an error
accepted = false;
break;
} }
if(reconnect) connect(); if(reconnect) connect();
return accepted; return accepted;
} }
bool SerialLink::setBaudRateString(const QString& rate)
{
bool ok;
int intrate = rate.toInt(&ok);
if (!ok) return false;
return setBaudRate(intrate);
}
bool SerialLink::setBaudRate(int rate) bool SerialLink::setBaudRate(int rate)
{ {
qDebug() << "BAUD RATE:" << rate;
bool reconnect = false; bool reconnect = false;
bool accepted = true; // This is changed if none of the data rates matches bool accepted = true; // This is changed if none of the data rates matches
if(isConnected()) { if(isConnected()) {
...@@ -677,79 +628,87 @@ bool SerialLink::setBaudRate(int rate) ...@@ -677,79 +628,87 @@ bool SerialLink::setBaudRate(int rate)
switch (rate) { switch (rate) {
case 50: case 50:
baudrate = SerialInterface::BAUD50; portSettings.setBaudRate(QPortSettings::BAUDR_50);
break; break;
case 75: case 75:
baudrate = SerialInterface::BAUD75; portSettings.setBaudRate(QPortSettings::BAUDR_75);
break; break;
case 110: case 110:
baudrate = SerialInterface::BAUD110; portSettings.setBaudRate(QPortSettings::BAUDR_110);
break; break;
case 134: case 134:
baudrate = SerialInterface::BAUD134; portSettings.setBaudRate(QPortSettings::BAUDR_134);
break; break;
case 150: case 150:
baudrate = SerialInterface::BAUD150; portSettings.setBaudRate(QPortSettings::BAUDR_150);
break; break;
case 200: case 200:
baudrate = SerialInterface::BAUD200; portSettings.setBaudRate(QPortSettings::BAUDR_200);
break; break;
case 300: case 300:
baudrate = SerialInterface::BAUD300; portSettings.setBaudRate(QPortSettings::BAUDR_300);
break; break;
case 600: case 600:
baudrate = SerialInterface::BAUD600; portSettings.setBaudRate(QPortSettings::BAUDR_600);
break; break;
case 1200: case 1200:
baudrate = SerialInterface::BAUD1200; portSettings.setBaudRate(QPortSettings::BAUDR_1200);
break; break;
case 1800: case 1800:
baudrate = SerialInterface::BAUD1800; portSettings.setBaudRate(QPortSettings::BAUDR_1800);
break; break;
case 2400: case 2400:
baudrate = SerialInterface::BAUD2400; portSettings.setBaudRate(QPortSettings::BAUDR_2400);
break; break;
case 4800: case 4800:
baudrate = SerialInterface::BAUD4800; portSettings.setBaudRate(QPortSettings::BAUDR_4800);
break; break;
case 9600: case 9600:
baudrate = SerialInterface::BAUD9600; portSettings.setBaudRate(QPortSettings::BAUDR_9600);
break; break;
#ifdef Q_OS_WIN
case 14400: case 14400:
baudrate = SerialInterface::BAUD14400; portSettings.setBaudRate(QPortSettings::BAUDR_14400);
break; break;
#endif
case 19200: case 19200:
baudrate = SerialInterface::BAUD19200; portSettings.setBaudRate(QPortSettings::BAUDR_19200);
break; break;
case 38400: case 38400:
baudrate = SerialInterface::BAUD38400; portSettings.setBaudRate(QPortSettings::BAUDR_38400);
break; break;
#ifdef Q_OS_WIN
case 56000: case 56000:
baudrate = SerialInterface::BAUD56000; portSettings.setBaudRate(QPortSettings::BAUDR_56000);
break; break;
#endif
case 57600: case 57600:
baudrate = SerialInterface::BAUD57600; portSettings.setBaudRate(QPortSettings::BAUDR_57600);
break; break;
#ifdef Q_OS_WIN
case 76800: case 76800:
baudrate = SerialInterface::BAUD76800; portSettings.setBaudRate(QPortSettings::BAUDR_76800);
break; break;
#endif
case 115200: case 115200:
baudrate = SerialInterface::BAUD115200; portSettings.setBaudRate(QPortSettings::BAUDR_115200);
break; break;
#ifdef Q_OS_WIN
case 128000: case 128000:
baudrate = SerialInterface::BAUD128000; portSettings.setBaudRate(QPortSettings::BAUDR_128000);
break; break;
case 230400: case 230400:
baudrate = SerialInterface::BAUD230400; portSettings.setBaudRate(QPortSettings::BAUDR_230400);
break; break;
case 256000: case 256000:
baudrate = SerialInterface::BAUD256000; portSettings.setBaudRate(QPortSettings::BAUDR_256000);
break; break;
case 460800: case 460800:
baudrate = SerialInterface::BAUD460800; portSettings.setBaudRate(QPortSettings::BAUDR_460800);
break; break;
#endif
case 921600: case 921600:
baudrate = SerialInterface::BAUD921600; portSettings.setBaudRate(QPortSettings::BAUDR_921600);
break; break;
default: default:
// If none of the above cases matches, there must be an error // If none of the above cases matches, there must be an error
...@@ -770,14 +729,14 @@ bool SerialLink::setFlowType(int flow) ...@@ -770,14 +729,14 @@ bool SerialLink::setFlowType(int flow)
disconnect(); disconnect();
switch (flow) { switch (flow) {
case SerialInterface::FLOW_OFF: case (int)QPortSettings::FLOW_OFF:
this->flow = SerialInterface::FLOW_OFF; portSettings.setFlowControl(QPortSettings::FLOW_OFF);
break; break;
case SerialInterface::FLOW_HARDWARE: case (int)QPortSettings::FLOW_HARDWARE:
this->flow = SerialInterface::FLOW_HARDWARE; portSettings.setFlowControl(QPortSettings::FLOW_HARDWARE);
break; break;
case SerialInterface::FLOW_XONXOFF: case (int)QPortSettings::FLOW_XONXOFF:
this->flow = SerialInterface::FLOW_XONXOFF; portSettings.setFlowControl(QPortSettings::FLOW_XONXOFF);
break; break;
default: default:
// If none of the above cases matches, there must be an error // If none of the above cases matches, there must be an error
...@@ -797,20 +756,17 @@ bool SerialLink::setParityType(int parity) ...@@ -797,20 +756,17 @@ bool SerialLink::setParityType(int parity)
disconnect(); disconnect();
switch (parity) { switch (parity) {
case (int)PAR_NONE: case (int)QPortSettings::PAR_NONE:
this->parity = SerialInterface::PAR_NONE; portSettings.setParity(QPortSettings::PAR_NONE);
break; break;
case (int)PAR_ODD: case (int)QPortSettings::PAR_ODD:
this->parity = SerialInterface::PAR_ODD; portSettings.setParity(QPortSettings::PAR_ODD);
break; break;
case (int)PAR_EVEN: case (int)QPortSettings::PAR_EVEN:
this->parity = SerialInterface::PAR_EVEN; portSettings.setParity(QPortSettings::PAR_EVEN);
break; break;
case (int)PAR_MARK: case (int)QPortSettings::PAR_SPACE:
this->parity = SerialInterface::PAR_MARK; portSettings.setParity(QPortSettings::PAR_SPACE);
break;
case (int)PAR_SPACE:
this->parity = SerialInterface::PAR_SPACE;
break; break;
default: default:
// If none of the above cases matches, there must be an error // If none of the above cases matches, there must be an error
...@@ -825,6 +781,7 @@ bool SerialLink::setParityType(int parity) ...@@ -825,6 +781,7 @@ bool SerialLink::setParityType(int parity)
bool SerialLink::setDataBits(int dataBits) bool SerialLink::setDataBits(int dataBits)
{ {
qDebug() << "Setting" << dataBits << "data bits";
bool reconnect = false; bool reconnect = false;
if (isConnected()) reconnect = true; if (isConnected()) reconnect = true;
bool accepted = true; bool accepted = true;
...@@ -832,16 +789,16 @@ bool SerialLink::setDataBits(int dataBits) ...@@ -832,16 +789,16 @@ bool SerialLink::setDataBits(int dataBits)
switch (dataBits) { switch (dataBits) {
case 5: case 5:
this->dataBits = SerialInterface::DATA_5; portSettings.setDataBits(QPortSettings::DB_5);
break; break;
case 6: case 6:
this->dataBits = SerialInterface::DATA_6; portSettings.setDataBits(QPortSettings::DB_6);
break; break;
case 7: case 7:
this->dataBits = SerialInterface::DATA_7; portSettings.setDataBits(QPortSettings::DB_7);
break; break;
case 8: case 8:
this->dataBits = SerialInterface::DATA_8; portSettings.setDataBits(QPortSettings::DB_8);
break; break;
default: default:
// If none of the above cases matches, there must be an error // If none of the above cases matches, there must be an error
...@@ -863,10 +820,10 @@ bool SerialLink::setStopBits(int stopBits) ...@@ -863,10 +820,10 @@ bool SerialLink::setStopBits(int stopBits)
switch (stopBits) { switch (stopBits) {
case 1: case 1:
this->stopBits = SerialInterface::STOP_1; portSettings.setStopBits(QPortSettings::STOP_1);
break; break;
case 2: case 2:
this->stopBits = SerialInterface::STOP_2; portSettings.setStopBits(QPortSettings::STOP_2);
break; break;
default: default:
// If none of the above cases matches, there must be an error // If none of the above cases matches, there must be an error
...@@ -886,8 +843,8 @@ bool SerialLink::setDataBitsType(int dataBits) ...@@ -886,8 +843,8 @@ bool SerialLink::setDataBitsType(int dataBits)
if (isConnected()) reconnect = true; if (isConnected()) reconnect = true;
disconnect(); disconnect();
if (dataBits >= (int)SerialInterface::DATA_5 && dataBits <= (int)SerialInterface::DATA_8) { if (dataBits >= (int)QPortSettings::DB_5 && dataBits <= (int)QPortSettings::DB_8) {
this->dataBits = (SerialInterface::dataBitsType) dataBits; portSettings.setDataBits((QPortSettings::DataBits) dataBits);
if(reconnect) connect(); if(reconnect) connect();
accepted = true; accepted = true;
...@@ -903,10 +860,10 @@ bool SerialLink::setStopBitsType(int stopBits) ...@@ -903,10 +860,10 @@ bool SerialLink::setStopBitsType(int stopBits)
if(isConnected()) reconnect = true; if(isConnected()) reconnect = true;
disconnect(); disconnect();
if (stopBits >= (int)SerialInterface::STOP_1 && dataBits <= (int)SerialInterface::STOP_2) { if (stopBits >= (int)QPortSettings::STOP_1 && stopBits <= (int)QPortSettings::STOP_2) {
SerialInterface::stopBitsType newBits = (SerialInterface::stopBitsType) stopBits; portSettings.setStopBits((QPortSettings::StopBits) stopBits);
port->setStopBits(newBits); if(reconnect) connect();
accepted = true; accepted = true;
} }
......
...@@ -36,7 +36,7 @@ This file is part of the QGROUNDCONTROL project ...@@ -36,7 +36,7 @@ This file is part of the QGROUNDCONTROL project
#include <QThread> #include <QThread>
#include <QMutex> #include <QMutex>
#include <QString> #include <QString>
#include "SerialInterface.h" #include "qserialport.h"
#include <configuration.h> #include <configuration.h>
#include "SerialLinkInterface.h" #include "SerialLinkInterface.h"
#ifdef _WIN32 #ifdef _WIN32
...@@ -59,11 +59,11 @@ class SerialLink : public SerialLinkInterface ...@@ -59,11 +59,11 @@ class SerialLink : public SerialLinkInterface
public: public:
SerialLink(QString portname = "", SerialLink(QString portname = "",
SerialInterface::baudRateType baudrate=SerialInterface::BAUD57600, int baudrate=57600,
SerialInterface::flowType flow=SerialInterface::FLOW_OFF, bool flow=false,
SerialInterface::parityType parity=SerialInterface::PAR_NONE, bool parity=false,
SerialInterface::dataBitsType dataBits=SerialInterface::DATA_8, int dataBits=8,
SerialInterface::stopBitsType stopBits=SerialInterface::STOP_1); int stopBits=1);
~SerialLink(); ~SerialLink();
static const int poll_interval = SERIAL_POLL_INTERVAL; ///< Polling interval, defined in configuration.h static const int poll_interval = SERIAL_POLL_INTERVAL; ///< Polling interval, defined in configuration.h
...@@ -116,6 +116,9 @@ public slots: ...@@ -116,6 +116,9 @@ public slots:
bool setDataBits(int dataBits); bool setDataBits(int dataBits);
bool setStopBits(int stopBits); bool setStopBits(int stopBits);
// Set string rate
bool setBaudRateString(const QString& rate);
// Set ENUM values // Set ENUM values
bool setBaudRateType(int rateIndex); bool setBaudRateType(int rateIndex);
bool setFlowType(int flow); bool setFlowType(int flow);
...@@ -138,18 +141,14 @@ protected slots: ...@@ -138,18 +141,14 @@ protected slots:
void checkForBytes(); void checkForBytes();
protected: protected:
SerialInterface * port; TNX::QSerialPort * port;
TNX::QPortSettings portSettings;
#ifdef _WIN32 #ifdef _WIN32
HANDLE winPort; HANDLE winPort;
DCB winPortSettings; DCB winPortSettings;
#endif #endif
QString porthandle; QString porthandle;
QString name; QString name;
SerialInterface::baudRateType baudrate;
SerialInterface::flowType flow;
SerialInterface::parityType parity;
SerialInterface::dataBitsType dataBits;
SerialInterface::stopBitsType stopBits;
int timeout; int timeout;
int id; int id;
......
...@@ -243,6 +243,44 @@ SerialConfigurationWindow::SerialConfigurationWindow(LinkInterface* link, QWidge ...@@ -243,6 +243,44 @@ SerialConfigurationWindow::SerialConfigurationWindow(LinkInterface* link, QWidge
setupPortList(); setupPortList();
// Set up baud rates
ui.baudRate->addItem("115200", 115200);
ui.baudRate->clear();
ui.baudRate->addItem("50", 50);
ui.baudRate->addItem("70", 70);
ui.baudRate->addItem("110", 110);
ui.baudRate->addItem("134", 134);
ui.baudRate->addItem("150", 150);
ui.baudRate->addItem("200", 200);
ui.baudRate->addItem("300", 300);
ui.baudRate->addItem("600", 600);
ui.baudRate->addItem("1200", 1200);
ui.baudRate->addItem("1800", 1800);
ui.baudRate->addItem("2400", 2400);
ui.baudRate->addItem("4800", 4800);
ui.baudRate->addItem("9600", 9600);
#ifdef Q_OS_WIN
ui.baudRate->addItem("14400", 14400);
#endif
ui.baudRate->addItem("19200", 19200);
ui.baudRate->addItem("34800", 34800);
#ifdef Q_OS_WIN
ui.baudRate->addItem("56000", 56000);
#endif
ui.baudRate->addItem("57600", 57600);
#ifdef Q_OS_WIN
ui.baudRate->addItem("76800", 76800);
#endif
ui.baudRate->addItem("115200", 115200);
#ifdef Q_OS_WIN
ui.baudRate->addItem("128000", 128000);
ui.baudRate->addItem("230400", 230400);
ui.baudRate->addItem("256000", 256000);
ui.baudRate->addItem("460800", 460800);
#endif
ui.baudRate->addItem("921600", 921600);
connect(action, SIGNAL(triggered()), this, SLOT(configureCommunication())); connect(action, SIGNAL(triggered()), this, SLOT(configureCommunication()));
// Make sure that a change in the link name will be reflected in the UI // Make sure that a change in the link name will be reflected in the UI
...@@ -251,7 +289,7 @@ SerialConfigurationWindow::SerialConfigurationWindow(LinkInterface* link, QWidge ...@@ -251,7 +289,7 @@ SerialConfigurationWindow::SerialConfigurationWindow(LinkInterface* link, QWidge
// Connect the individual user interface inputs // Connect the individual user interface inputs
connect(ui.portName, SIGNAL(editTextChanged(QString)), this, SLOT(setPortName(QString))); connect(ui.portName, SIGNAL(editTextChanged(QString)), this, SLOT(setPortName(QString)));
connect(ui.portName, SIGNAL(currentIndexChanged(QString)), this, SLOT(setPortName(QString))); connect(ui.portName, SIGNAL(currentIndexChanged(QString)), this, SLOT(setPortName(QString)));
connect(ui.baudRate, SIGNAL(activated(int)), this->link, SLOT(setBaudRateType(int))); connect(ui.baudRate, SIGNAL(activated(QString)), this->link, SLOT(setBaudRateString(QString)));
connect(ui.flowControlCheckBox, SIGNAL(toggled(bool)), this, SLOT(enableFlowControl(bool))); connect(ui.flowControlCheckBox, SIGNAL(toggled(bool)), this, SLOT(enableFlowControl(bool)));
connect(ui.parNone, SIGNAL(toggled(bool)), this, SLOT(setParityNone(bool))); connect(ui.parNone, SIGNAL(toggled(bool)), this, SLOT(setParityNone(bool)));
connect(ui.parOdd, SIGNAL(toggled(bool)), this, SLOT(setParityOdd(bool))); connect(ui.parOdd, SIGNAL(toggled(bool)), this, SLOT(setParityOdd(bool)));
...@@ -292,7 +330,7 @@ SerialConfigurationWindow::SerialConfigurationWindow(LinkInterface* link, QWidge ...@@ -292,7 +330,7 @@ SerialConfigurationWindow::SerialConfigurationWindow(LinkInterface* link, QWidge
enableFlowControl(false); enableFlowControl(false);
} }
ui.baudRate->setCurrentIndex(this->link->getBaudRateType()); ui.baudRate->setCurrentIndex(ui.baudRate->findText(QString("%1").arg(this->link->getBaudRate())));
ui.dataBitsSpinBox->setValue(this->link->getDataBits()); ui.dataBitsSpinBox->setValue(this->link->getDataBits());
ui.stopBitsSpinBox->setValue(this->link->getStopBits()); ui.stopBitsSpinBox->setValue(this->link->getStopBits());
...@@ -466,7 +504,7 @@ void SerialConfigurationWindow::setParityEven(bool accept) ...@@ -466,7 +504,7 @@ void SerialConfigurationWindow::setParityEven(bool accept)
void SerialConfigurationWindow::setPortName(QString port) void SerialConfigurationWindow::setPortName(QString port)
{ {
#ifdef _WIN32 #ifdef Q_OS_WIN
port = port.split("-").first(); port = port.split("-").first();
#endif #endif
port = port.remove(" "); port = port.remove(" ");
......
...@@ -99,13 +99,14 @@ public: ...@@ -99,13 +99,14 @@ public:
BAUDR_460800, BAUDR_460800,
BAUDR_500000, BAUDR_500000,
BAUDR_576000, BAUDR_576000,
BAUDR_921600,
#endif #endif
#ifdef TNX_WINDOWS_SERIAL_PORT #ifdef TNX_WINDOWS_SERIAL_PORT
BAUDR_14400, BAUDR_14400,
BAUDR_56000, BAUDR_56000,
BAUDR_128000, BAUDR_128000,
BAUDR_230400,
BAUDR_256000, BAUDR_256000,
BAUDR_460800,
#endif #endif
// baud rates supported by all OSs // baud rates supported by all OSs
BAUDR_110, BAUDR_110,
...@@ -118,7 +119,8 @@ public: ...@@ -118,7 +119,8 @@ public:
BAUDR_19200, BAUDR_19200,
BAUDR_38400, BAUDR_38400,
BAUDR_57600, BAUDR_57600,
BAUDR_115200 BAUDR_115200,
BAUDR_921600
}; };
enum DataBits { enum DataBits {
...@@ -184,13 +186,14 @@ public: ...@@ -184,13 +186,14 @@ public:
case BAUDR_56000: baudRateInt_=56000; break; case BAUDR_56000: baudRateInt_=56000; break;
case BAUDR_128000: baudRateInt_=128000; break; case BAUDR_128000: baudRateInt_=128000; break;
case BAUDR_256000: baudRateInt_=256000; break; case BAUDR_256000: baudRateInt_=256000; break;
case BAUDR_230400: baudRateInt_=230400; break;
case BAUDR_460800: baudRateInt_=460800; break;
#endif #endif
#if defined(Q_OS_LINUX) #if defined(Q_OS_LINUX)
case BAUDR_230400: baudRateInt_=230400; break; case BAUDR_230400: baudRateInt_=230400; break;
case BAUDR_460800: baudRateInt_=460800; break; case BAUDR_460800: baudRateInt_=460800; break;
case BAUDR_500000: baudRateInt_=500000; break; case BAUDR_500000: baudRateInt_=500000; break;
case BAUDR_576000: baudRateInt_=576000; break; case BAUDR_576000: baudRateInt_=576000; break;
case BAUDR_921600: baudRateInt_=921600; break;
#endif #endif
// baud rates supported by all platforms // baud rates supported by all platforms
case BAUDR_110: baudRateInt_=110; break; case BAUDR_110: baudRateInt_=110; break;
...@@ -204,6 +207,7 @@ public: ...@@ -204,6 +207,7 @@ public:
case BAUDR_38400: baudRateInt_=38400; break; case BAUDR_38400: baudRateInt_=38400; break;
case BAUDR_57600: baudRateInt_=57600; break; case BAUDR_57600: baudRateInt_=57600; break;
case BAUDR_115200: baudRateInt_=115200; break; case BAUDR_115200: baudRateInt_=115200; break;
case BAUDR_921600: baudRateInt_=921600; break;
default: default:
baudRateInt_ = 0; // unknown baudrate baudRateInt_ = 0; // unknown baudrate
} }
......
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