diff --git a/a0-qqtfoundation.pro b/a0-qqtfoundation.pro index 7f92333f..cb4188f2 100644 --- a/a0-qqtfoundation.pro +++ b/a0-qqtfoundation.pro @@ -3,6 +3,7 @@ CONFIG += ordered SUBDIRS += \ src/qqt.pro \ examples/qqtframe \ + examples/qqtframe2 \ # examples/animationframe \ # examples/cmdwidget \ # examples/qqtliveplayer \ @@ -10,6 +11,6 @@ SUBDIRS += \ # examples/qqtftpclient \ # examples/qqthttpclient \ # examples/qqtwebkit - examples/qqtframe2 + #include(src/qqt.pri) diff --git a/examples/QtBuildTool/QtBuildTool.pro b/examples/QtBuildTool/QtBuildTool.pro index 96356594..98992d43 100644 --- a/examples/QtBuildTool/QtBuildTool.pro +++ b/examples/QtBuildTool/QtBuildTool.pro @@ -18,11 +18,6 @@ QT += core gui network sql xml greaterThan(QT_MAJOR_VERSION, 4): QT += widgets printsupport serialport greaterThan(QT_MAJOR_VERSION, 4): DEFINES += __QT5__ -TARGET = QtBuildTool -TEMPLATE = app -macx { - CONFIG += app_bundle -} QT_KIT = $$(QKIT) message($${QT_KIT} Defined in $${TARGET}) @@ -43,6 +38,12 @@ equals(QT_KIT, MIPS32) { DEFINES += __ANDROID__ } +TARGET = QtBuildTool +TEMPLATE = app +equals(QT_KIT, macOS) { + CONFIG += app_bundle +} + CONFIG(debug, debug|release) { } else { DEFINES -= QT_NO_DEBUG_OUTPUT @@ -72,7 +73,7 @@ INCLUDEPATH += $$PWD \ $$PWD/../../src/frame #include(../../src/qqt.pri) -macx { +equals(QT_KIT, macOS) { LIBS += -F/Users/abel/Develop/c0-buildstation/a0-qqtfoundation/MacOS/Release/src/bin LIBS += -framework QQt } @@ -97,7 +98,7 @@ can_install:equals(QT_KIT, MIPS32) { target.path = /Application INSTALLS += target } else: unix { - macx{ + equals(QT_KIT, macOS){ target.path = /Applications INSTALLS += target } diff --git a/examples/QtSdkManager/QtSdkManager.pro b/examples/QtSdkManager/QtSdkManager.pro index ea37983f..f0baca48 100644 --- a/examples/QtSdkManager/QtSdkManager.pro +++ b/examples/QtSdkManager/QtSdkManager.pro @@ -20,9 +20,6 @@ greaterThan(QT_MAJOR_VERSION, 4): DEFINES += __QT5__ TARGET = qqtframe2 TEMPLATE = app -macx { - CONFIG += app_bundle -} QT_KIT = $$(QKIT) message($${QT_KIT} Defined in $${TARGET}) @@ -42,6 +39,9 @@ equals(QT_KIT, MIPS32) { } else:equals(QT_KIT, Android) { DEFINES += __ANDROID__ } +equals(QT_KIT, macOS) { + CONFIG += app_bundle +} CONFIG(debug, debug|release) { } else { @@ -72,7 +72,7 @@ INCLUDEPATH += $$PWD \ $$PWD/../../src/frame #include(../../src/qqt.pri) -macx { +equals(QT_KIT, macOS) { LIBS += -F/Users/abel/Develop/c0-buildstation/a0-qqtfoundation/MacOS/Release/src/bin LIBS += -framework QQt } @@ -97,7 +97,7 @@ can_install:equals(QT_KIT, MIPS32) { target.path = /Application INSTALLS += target } else: unix { - macx{ + equals(QT_KIT, macOS){ target.path = /Applications INSTALLS += target } diff --git a/examples/ffmpegplayer/qqtffmpegplayer.pro b/examples/ffmpegplayer/qqtffmpegplayer.pro index 8a8b1018..59d33ee8 100644 --- a/examples/ffmpegplayer/qqtffmpegplayer.pro +++ b/examples/ffmpegplayer/qqtffmpegplayer.pro @@ -49,7 +49,7 @@ HEADERS += $$PWD/qqtapp.h $$PWD/qqtwindow.h \ FORMS += $$PWD/qqtwindow.ui unix { - macx{ + equals(QT_KIT, macOS){ } else{ INCLUDEPATH += /usr/include/x86_64-linux-gnu diff --git a/examples/qqtframe/qqtframe.pro b/examples/qqtframe/qqtframe.pro index 6369e9bf..2feea7f9 100644 --- a/examples/qqtframe/qqtframe.pro +++ b/examples/qqtframe/qqtframe.pro @@ -10,9 +10,6 @@ greaterThan(QT_MAJOR_VERSION, 4): DEFINES += __QT5__ TARGET = qqtframe TEMPLATE = app -macx { - CONFIG += app_bundle -} QT_KIT = $$(QKIT) message($${QT_KIT} Defined in qqtframe) @@ -22,15 +19,23 @@ equals(QT_KIT, MIPS32) { } else:equals(QT_KIT, LINUX) { DEFINES += __LINUX__ } else:equals(QT_KIT, LINUX64) { + DEFINES += __LINUX__ DEFINES += __LINUX64__ } else:equals(QT_KIT, WIN) { DEFINES += __WIN__ } else:equals(QT_KIT, WIN64) { + DEFINES += __WIN__ DEFINES += __WIN64__ } else:equals(QT_KIT, macOS) { DEFINES += __DARWIN__ } else:equals(QT_KIT, Android) { DEFINES += __ANDROID__ +} else:equals(QT_KIT, ANDROIDX86) { + DEFINES += __ANDROID__ + DEFINES += __ANDROIDX86__ +} +equals(QT_KIT, macOS) { + CONFIG += app_bundle } CONFIG(debug, debug|release) { @@ -62,12 +67,20 @@ INCLUDEPATH += $$PWD \ $$PWD/../../src/frame #include(../../src/qqt.pri) -macx { - LIBS += -F/Users/abel/Develop/c0-buildstation/a0-qqtfoundation/MacOS/Release/src/bin - LIBS += -framework QQt -} -equals(QT_KIT, Android) { - LIBS += -L/Users/abel/Develop/c0-buildstation/a0-qqtfoundation/Android-arm/Release/src/bin +message(Link QQt to $${TARGET} $${QT_KIT} on $${QMAKE_HOST.os}) +equals(QMAKE_HOST.os, Darwin) { + equals(QT_KIT, macOS) { + LIBS += -F/Users/abel/Develop/c0-buildstation/a0-qqtfoundation/MacOS/Release/src/bin + LIBS += -framework QQt + } else: equals(QT_KIT, Android) { + LIBS += -L/Users/abel/Develop/c0-buildstation/a0-qqtfoundation/Android/Release/src/bin + LIBS += -lQQt + } else: equals(QT_KIT, ANDROIDX86) { + LIBS += -L/Users/abel/Develop/c0-buildstation/a0-qqtfoundation/Android_x86/Release/src/bin + LIBS += -lQQt + } +} else: equals(QMAKE_HOST.os, Linux) { + LIBS += -L/mnt/hgfs/abel/Develop/c0-buildstation/a0-qqtfoundation/Linux/Release/src/bin LIBS += -lQQt } @@ -87,7 +100,7 @@ can_install:equals(QT_KIT, MIPS32) { target.path = /Application INSTALLS += target } else: unix { - macx{ + equals(QT_KIT, macOS){ target.path = /Applications INSTALLS += target } diff --git a/examples/qqtframe2/qqtframe2.pro b/examples/qqtframe2/qqtframe2.pro index ea37983f..3898decc 100644 --- a/examples/qqtframe2/qqtframe2.pro +++ b/examples/qqtframe2/qqtframe2.pro @@ -18,12 +18,6 @@ QT += core gui network sql xml greaterThan(QT_MAJOR_VERSION, 4): QT += widgets printsupport serialport greaterThan(QT_MAJOR_VERSION, 4): DEFINES += __QT5__ -TARGET = qqtframe2 -TEMPLATE = app -macx { - CONFIG += app_bundle -} - QT_KIT = $$(QKIT) message($${QT_KIT} Defined in $${TARGET}) equals(QT_KIT, MIPS32) { @@ -43,6 +37,13 @@ equals(QT_KIT, MIPS32) { DEFINES += __ANDROID__ } +TARGET = qqtframe2 +TEMPLATE = app + +equals(QT_KIT, macOS) { + CONFIG += app_bundle +} + CONFIG(debug, debug|release) { } else { DEFINES -= QT_NO_DEBUG_OUTPUT @@ -72,12 +73,20 @@ INCLUDEPATH += $$PWD \ $$PWD/../../src/frame #include(../../src/qqt.pri) -macx { - LIBS += -F/Users/abel/Develop/c0-buildstation/a0-qqtfoundation/MacOS/Release/src/bin - LIBS += -framework QQt -} -equals(QT_KIT, Android) { - LIBS += -L/Users/abel/Develop/c0-buildstation/a0-qqtfoundation/Android-arm/Release/src/bin +message(Link QQt to $${TARGET} $${QT_KIT} on $${QMAKE_HOST.os}) +equals(QMAKE_HOST.os, Darwin) { + equals(QT_KIT, macOS) { + LIBS += -F/Users/abel/Develop/c0-buildstation/a0-qqtfoundation/MacOS/Release/src/bin + LIBS += -framework QQt + } else: equals(QT_KIT, Android) { + LIBS += -L/Users/abel/Develop/c0-buildstation/a0-qqtfoundation/Android/Release/src/bin + LIBS += -lQQt + } else: equals(QT_KIT, ANDROIDX86) { + LIBS += -L/Users/abel/Develop/c0-buildstation/a0-qqtfoundation/Android_x86/Release/src/bin + LIBS += -lQQt + } +} else: equals(QMAKE_HOST.os, Linux) { + LIBS += -L/mnt/hgfs/abel/Develop/c0-buildstation/a0-qqtfoundation/Linux/Release/src/bin LIBS += -lQQt } @@ -97,7 +106,7 @@ can_install:equals(QT_KIT, MIPS32) { target.path = /Application INSTALLS += target } else: unix { - macx{ + equals(QT_KIT, macOS) { target.path = /Applications INSTALLS += target } diff --git a/src/network/qqtbluetoothmanager.cpp b/src/network/qqtbluetoothmanager.cpp new file mode 100644 index 00000000..dcfdc2f5 --- /dev/null +++ b/src/network/qqtbluetoothmanager.cpp @@ -0,0 +1,6 @@ +#include "qqtbluetoothmanager.h" + +QQtBluetoothManager::QQtBluetoothManager(QObject *parent) : QObject(parent) +{ + +} diff --git a/src/network/qqtbluetoothmanager.h b/src/network/qqtbluetoothmanager.h new file mode 100644 index 00000000..6de22045 --- /dev/null +++ b/src/network/qqtbluetoothmanager.h @@ -0,0 +1,17 @@ +#ifndef QQTBLUETOOTHMANAGER_H +#define QQTBLUETOOTHMANAGER_H + +#include + +class QQtBluetoothManager : public QObject +{ + Q_OBJECT +public: + explicit QQtBluetoothManager(QObject *parent = nullptr); + +signals: + +public slots: +}; + +#endif // QQTBLUETOOTHMANAGER_H \ No newline at end of file diff --git a/src/qqt.pri b/src/qqt.pri index 4b80c141..aa25b390 100644 --- a/src/qqt.pri +++ b/src/qqt.pri @@ -11,7 +11,7 @@ unix:VERSION = 1.0.0 ##Qt version QT += core gui network sql xml -greaterThan(QT_MAJOR_VERSION, 4): QT += widgets printsupport serialport +greaterThan(QT_MAJOR_VERSION, 4): QT += widgets printsupport ############# ##definition @@ -34,17 +34,23 @@ equals(QT_KIT, MIPS32) { } else:equals(QT_KIT, LINUX) { DEFINES += __LINUX__ } else:equals(QT_KIT, LINUX64) { + DEFINES += __LINUX__ DEFINES += __LINUX64__ } else:equals(QT_KIT, WIN) { DEFINES += __WIN__ } else:equals(QT_KIT, WIN64) { + DEFINES += __WIN__ DEFINES += __WIN64__ } else:equals(QT_KIT, macOS) { DEFINES += __DARWIN__ } else:equals(QT_KIT, Android) { DEFINES += __ANDROID__ - #TODO:no customplot word printer +} else:equals(QT_KIT, ANDROIDX86) { + DEFINES += __ANDROID__ + DEFINES += __ANDROIDX86__ + #todo:no customplot word printer } + CONFIG(debug, debug|release) { } else { DEFINES -= QT_NO_DEBUG_OUTPUT @@ -60,7 +66,7 @@ win32 { win32 { LIBS += -luser32 }else: unix { - macx { + equals(QT_KIT, macOS) { #min macosx target QMAKE_MACOSX_DEPLOYMENT_TARGET = 10.9 #deperated @@ -87,7 +93,6 @@ DESTDIR = bin ##include directories ########################### INCLUDEPATH += $$PWD -INCLUDEPATH += $$PWD/serialport INCLUDEPATH += $$PWD/core INCLUDEPATH += $$PWD/customplot INCLUDEPATH += $$PWD/dmmu @@ -95,6 +100,7 @@ INCLUDEPATH += $$PWD/frame INCLUDEPATH += $$PWD/gui INCLUDEPATH += $$PWD/multimedia INCLUDEPATH += $$PWD/network +INCLUDEPATH += $$PWD/network/qextserialport INCLUDEPATH += $$PWD/pluginwatcher INCLUDEPATH += $$PWD/printsupport INCLUDEPATH += $$PWD/sql @@ -106,7 +112,7 @@ win32 { HEADERS += $$PWD/qqtwin.h } unix { - macx { + equals(QT_KIT, macOS) { HEADERS += $$PWD/qqtdarwin.h } else { HEADERS += $$PWD/qqtlinux.h @@ -118,13 +124,48 @@ HEADERS += $$PWD/qqt.h \ $$PWD/qqt-qt.h -#serialport +#network +equals(QT_KIT, MIPS32) { + SOURCES += $$PWD/network/qqtethenetmanager.cpp + HEADERS += $$PWD/network/qqtethenetmanager.h +} +##websocket +SOURCES += $$PWD/network/qqtwebclient.cpp \ + $$PWD/network/qqtftpprotocol.cpp \ + $$PWD/network/qqthttpprotocol.cpp \ + $$PWD/network/qqtwebprotocol.cpp +HEADERS += $$PWD/network/qqtwebclient.h \ + $$PWD/network/qqtftpprotocol.h \ + $$PWD/network/qqthttpprotocol.h \ + $$PWD/network/qqtwebprotocol.h +#tcpsocket +SOURCES += \ + $$PWD/network/qqtclient.cpp \ + $$PWD/network/qqtserialport.cpp \ + $$PWD/network/qqtserver.cpp \ + $$PWD/network/qqtmessage.cpp \ + $$PWD/network/qqtprotocol.cpp \ + $$PWD/network/qqtnetwork.cpp +HEADERS += \ + $$PWD/network/qqtclient.h \ + $$PWD/network/qqtserialport.h \ + $$PWD/network/qqtserver.h \ + $$PWD/network/qqtmessage.h \ + $$PWD/network/qqtprotocol.h \ + $$PWD/network/qqtnetwork.h +#bluetooth +SOURCES += \ + $$PWD/network/qqtbluetoothmanager.cpp +HEADERS += \ + $$PWD/network/qqtbluetoothmanager.h +#qserialport #USE QEXTSERIALPORT #DEFINES += __QTEXTSERIALPORT__ contains (DEFINES, __QTEXTSERIALPORT__) { - message ( __QTEXTSERIALPORT__ defined in qqtfoundation) - include ( $$PWD/serialport/qextserialport.pri ) + message ( __QTEXTSERIALPORT__ Defined in qqtfoundation) + include ( $$PWD/network/qextserialport/qextserialport.pri ) } else { + greaterThan(QT_MAJOR_VERSION, 4): QT += serialport lessThan(QT_MAJOR_VERSION, 5): CONFIG += serialport unix { DEFINES += _TTY_POSIX_ @@ -232,37 +273,6 @@ HEADERS += \ SOURCES += $$PWD/multimedia/qqtmplayer.cpp HEADERS += $$PWD/multimedia/qqtmplayer.h - -#network -equals(QT_KIT, MIPS32) { - SOURCES += $$PWD/network/qqtethenetmanager.cpp - HEADERS += $$PWD/network/qqtethenetmanager.h -} -##websocket -SOURCES += $$PWD/network/qqtwebclient.cpp \ - $$PWD/network/qqtftpprotocol.cpp \ - $$PWD/network/qqthttpprotocol.cpp \ - $$PWD/network/qqtwebprotocol.cpp -HEADERS += $$PWD/network/qqtwebclient.h \ - $$PWD/network/qqtftpprotocol.h \ - $$PWD/network/qqthttpprotocol.h \ - $$PWD/network/qqtwebprotocol.h -#tcpsocket -SOURCES += \ - $$PWD/network/qqtclient.cpp \ - $$PWD/network/qqtserialport.cpp \ - $$PWD/network/qqtserver.cpp \ - $$PWD/network/qqtmessage.cpp \ - $$PWD/network/qqtprotocol.cpp \ - $$PWD/network/qqtnetwork.cpp -HEADERS += \ - $$PWD/network/qqtclient.h \ - $$PWD/network/qqtserialport.h \ - $$PWD/network/qqtserver.h \ - $$PWD/network/qqtmessage.h \ - $$PWD/network/qqtprotocol.h \ - $$PWD/network/qqtnetwork.h - #pluginwatcher contains (DEFINES, QQT_LIBRARY) { DEFINES += BUILD_QDEVICEWATCHER_LIB @@ -272,7 +282,7 @@ win32 { else: SOURCES += $$PWD/pluginwatcher/qdevicewatcher_win32.cpp } unix { - macx { + equals(QT_KIT, macOS) { SOURCES += $$PWD/pluginwatcher/qdevicewatcher_mac.cpp } else { SOURCES += $$PWD/pluginwatcher/qdevicewatcher_linux.cpp diff --git a/src/qqt.pro b/src/qqt.pro index f137a882..dcecf2f6 100644 --- a/src/qqt.pro +++ b/src/qqt.pro @@ -5,10 +5,6 @@ #------------------------------------------------- TARGET = QQt TEMPLATE = lib -CONFIG += dll -macx { - CONFIG += lib_bundle -} #QQT LIBRARY (DLL) #DEFINES += QQT_LIBRARY @@ -17,12 +13,18 @@ DEFINES += QQT_LIBRARY include ($$PWD/qqt.pri) +equals(QT_KIT, macOS) { + message (build $${TARGET} $${QT_KIT} bundle) + CONFIG += dll + CONFIG += lib_bundle +} + ############ ##install ############ #CONFIG += can_install -can_install:macx { +can_install:equals(QT_KIT, macOS) { ###if install product to same path,use this. target.path = /System/Library/Frameworks INSTALLS += target diff --git a/src/serialport/posix_qextserialport.cpp b/src/serialport/posix_qextserialport.cpp deleted file mode 100644 index 719421c0..00000000 --- a/src/serialport/posix_qextserialport.cpp +++ /dev/null @@ -1,1128 +0,0 @@ - -/*! -\class Posix_QextSerialPort -\version 1.0.0 -\author Stefan Sander -\author Michal Policht - -A cross-platform serial port class. -This class encapsulates the POSIX portion of QextSerialPort. The user will be notified of errors -and possible portability conflicts at run-time by default - this behavior can be turned off by -defining _TTY_NOWARN_ (to turn off all warnings) or _TTY_NOWARN_PORT_ (to turn off portability -warnings) in the project. Note that _TTY_NOWARN_ will also turn off portability warnings. -*/ - -#include -#include "posix_qextserialport.h" - -/*! -\fn Posix_QextSerialPort::Posix_QextSerialPort() -Default constructor. Note that the name of the device used by a QextSerialPort constructed with -this constructor will be determined by #defined constants, or lack thereof - the default behavior -is the same as _TTY_LINUX_. Possible naming conventions and their associated constants are: - -\verbatim - -Constant Used By Naming Convention ----------- ------------- ------------------------ -_TTY_WIN_ Windows COM1, COM2 -_TTY_IRIX_ SGI/IRIX /dev/ttyf1, /dev/ttyf2 -_TTY_HPUX_ HP-UX /dev/tty1p0, /dev/tty2p0 -_TTY_SUN_ SunOS/Solaris /dev/ttya, /dev/ttyb -_TTY_DIGITAL_ Digital UNIX /dev/tty01, /dev/tty02 -_TTY_FREEBSD_ FreeBSD /dev/ttyd0, /dev/ttyd1 -_TTY_LINUX_ Linux /dev/ttyS0, /dev/ttyS1 - Linux /dev/ttyS0, /dev/ttyS1 -\endverbatim - -This constructor assigns the device name to the name of the first port on the specified system. -See the other constructors if you need to open a different port. -*/ -Posix_QextSerialPort::Posix_QextSerialPort() -: QextSerialBase() -{ - Posix_File=new QFile(); -} - -/*! -\fn Posix_QextSerialPort::Posix_QextSerialPort(const Posix_QextSerialPort&) -Copy constructor. -*/ -Posix_QextSerialPort::Posix_QextSerialPort(const Posix_QextSerialPort& s) - : QextSerialBase(s.port) -{ - setOpenMode(s.openMode()); - port = s.port; - Settings.BaudRate=s.Settings.BaudRate; - Settings.DataBits=s.Settings.DataBits; - Settings.Parity=s.Settings.Parity; - Settings.StopBits=s.Settings.StopBits; - Settings.FlowControl=s.Settings.FlowControl; - lastErr=s.lastErr; - - Posix_File=new QFile(); - Posix_File=s.Posix_File; - memcpy(&Posix_Timeout, &s.Posix_Timeout, sizeof(struct timeval)); - memcpy(&Posix_Copy_Timeout, &s.Posix_Copy_Timeout, sizeof(struct timeval)); - memcpy(&Posix_CommConfig, &s.Posix_CommConfig, sizeof(struct termios)); -} - -/*! -\fn Posix_QextSerialPort::Posix_QextSerialPort(const QString & name) -Constructs a serial port attached to the port specified by name. -name is the name of the device, which is windowsystem-specific, -e.g."COM1" or "/dev/ttyS0". -*/ -Posix_QextSerialPort::Posix_QextSerialPort(const QString & name, QextSerialBase::QueryMode mode) - : QextSerialBase(name) -{ - Posix_File=new QFile(); - setQueryMode(mode); - init(); -} - -/*! -\fn Posix_QextSerialPort::Posix_QextSerialPort(const PortSettings& settings) -Constructs a port with default name and specified settings. -*/ -Posix_QextSerialPort::Posix_QextSerialPort(const PortSettings& settings, QextSerialBase::QueryMode mode) - : QextSerialBase() -{ - setBaudRate(settings.BaudRate); - setDataBits(settings.DataBits); - setParity(settings.Parity); - setStopBits(settings.StopBits); - setFlowControl(settings.FlowControl); - - Posix_File=new QFile(); - setTimeout(settings.Timeout_Millisec); - setQueryMode(mode); - init(); -} - -/*! -\fn Posix_QextSerialPort::Posix_QextSerialPort(const QString & name, const PortSettings& settings) -Constructs a port with specified name and settings. -*/ -Posix_QextSerialPort::Posix_QextSerialPort(const QString & name, const PortSettings& settings, QextSerialBase::QueryMode mode) - : QextSerialBase(name) -{ - setBaudRate(settings.BaudRate); - setDataBits(settings.DataBits); - setParity(settings.Parity); - setStopBits(settings.StopBits); - setFlowControl(settings.FlowControl); - - Posix_File=new QFile(); - setTimeout(settings.Timeout_Millisec); - setQueryMode(mode); - init(); -} - -/*! -\fn Posix_QextSerialPort& Posix_QextSerialPort::operator=(const Posix_QextSerialPort& s) -Override the = operator. -*/ -Posix_QextSerialPort& Posix_QextSerialPort::operator=(const Posix_QextSerialPort& s) -{ - setOpenMode(s.openMode()); - port = s.port; - Settings.BaudRate=s.Settings.BaudRate; - Settings.DataBits=s.Settings.DataBits; - Settings.Parity=s.Settings.Parity; - Settings.StopBits=s.Settings.StopBits; - Settings.FlowControl=s.Settings.FlowControl; - lastErr=s.lastErr; - - Posix_File=s.Posix_File; - memcpy(&Posix_Timeout, &(s.Posix_Timeout), sizeof(struct timeval)); - memcpy(&Posix_Copy_Timeout, &(s.Posix_Copy_Timeout), sizeof(struct timeval)); - memcpy(&Posix_CommConfig, &(s.Posix_CommConfig), sizeof(struct termios)); - return *this; -} - -void Posix_QextSerialPort::init() -{ - if (queryMode() == QextSerialBase::EventDriven) - qWarning("POSIX doesn't have event driven mechanism implemented yet"); -} - -/*! -\fn Posix_QextSerialPort::~Posix_QextSerialPort() -Standard destructor. -*/ -Posix_QextSerialPort::~Posix_QextSerialPort() -{ - if (isOpen()) { - close(); - } - Posix_File->close(); - delete Posix_File; -} - -/*! -\fn void Posix_QextSerialPort::setBaudRate(BaudRateType baudRate) -Sets the baud rate of the serial port. Note that not all rates are applicable on -all platforms. The following table shows translations of the various baud rate -constants on Windows(including NT/2000) and POSIX platforms. Speeds marked with an * -are speeds that are usable on both Windows and POSIX. - -\note -BAUD76800 may not be supported on all POSIX systems. SGI/IRIX systems do not support -BAUD1800. - -\verbatim - - RATE Windows Speed POSIX Speed - ----------- ------------- ----------- - BAUD50 110 50 - BAUD75 110 75 - *BAUD110 110 110 - BAUD134 110 134.5 - BAUD150 110 150 - BAUD200 110 200 - *BAUD300 300 300 - *BAUD600 600 600 - *BAUD1200 1200 1200 - BAUD1800 1200 1800 - *BAUD2400 2400 2400 - *BAUD4800 4800 4800 - *BAUD9600 9600 9600 - BAUD14400 14400 9600 - *BAUD19200 19200 19200 - *BAUD38400 38400 38400 - BAUD56000 56000 38400 - *BAUD57600 57600 57600 - BAUD76800 57600 76800 - *BAUD115200 115200 115200 - BAUD128000 128000 115200 - BAUD256000 256000 115200 -\endverbatim -*/ -void Posix_QextSerialPort::setBaudRate(BaudRateType baudRate) -{ - LOCK_MUTEX(); - if (Settings.BaudRate!=baudRate) { - switch (baudRate) { - case BAUD14400: - Settings.BaudRate=BAUD9600; - break; - - case BAUD56000: - Settings.BaudRate=BAUD38400; - break; - - case BAUD76800: - -#ifndef B76800 - Settings.BaudRate=BAUD57600; -#else - Settings.BaudRate=baudRate; -#endif - break; - - case BAUD128000: - case BAUD256000: - Settings.BaudRate=BAUD115200; - break; - - default: - Settings.BaudRate=baudRate; - break; - } - } - if (isOpen()) { - switch (baudRate) { - - /*50 baud*/ - case BAUD50: - TTY_PORTABILITY_WARNING("Posix_QextSerialPort Portability Warning: Windows does not support 50 baud operation."); -#ifdef CBAUD - Posix_CommConfig.c_cflag&=(~CBAUD); - Posix_CommConfig.c_cflag|=B50; -#else - cfsetispeed(&Posix_CommConfig, B50); - cfsetospeed(&Posix_CommConfig, B50); -#endif - break; - - /*75 baud*/ - case BAUD75: - TTY_PORTABILITY_WARNING("Posix_QextSerialPort Portability Warning: Windows does not support 75 baud operation."); -#ifdef CBAUD - Posix_CommConfig.c_cflag&=(~CBAUD); - Posix_CommConfig.c_cflag|=B75; -#else - cfsetispeed(&Posix_CommConfig, B75); - cfsetospeed(&Posix_CommConfig, B75); -#endif - break; - - /*110 baud*/ - case BAUD110: -#ifdef CBAUD - Posix_CommConfig.c_cflag&=(~CBAUD); - Posix_CommConfig.c_cflag|=B110; -#else - cfsetispeed(&Posix_CommConfig, B110); - cfsetospeed(&Posix_CommConfig, B110); -#endif - break; - - /*134.5 baud*/ - case BAUD134: - TTY_PORTABILITY_WARNING("Posix_QextSerialPort Portability Warning: Windows does not support 134.5 baud operation."); -#ifdef CBAUD - Posix_CommConfig.c_cflag&=(~CBAUD); - Posix_CommConfig.c_cflag|=B134; -#else - cfsetispeed(&Posix_CommConfig, B134); - cfsetospeed(&Posix_CommConfig, B134); -#endif - break; - - /*150 baud*/ - case BAUD150: - TTY_PORTABILITY_WARNING("Posix_QextSerialPort Portability Warning: Windows does not support 150 baud operation."); -#ifdef CBAUD - Posix_CommConfig.c_cflag&=(~CBAUD); - Posix_CommConfig.c_cflag|=B150; -#else - cfsetispeed(&Posix_CommConfig, B150); - cfsetospeed(&Posix_CommConfig, B150); -#endif - break; - - /*200 baud*/ - case BAUD200: - TTY_PORTABILITY_WARNING("Posix_QextSerialPort Portability Warning: Windows does not support 200 baud operation."); -#ifdef CBAUD - Posix_CommConfig.c_cflag&=(~CBAUD); - Posix_CommConfig.c_cflag|=B200; -#else - cfsetispeed(&Posix_CommConfig, B200); - cfsetospeed(&Posix_CommConfig, B200); -#endif - break; - - /*300 baud*/ - case BAUD300: -#ifdef CBAUD - Posix_CommConfig.c_cflag&=(~CBAUD); - Posix_CommConfig.c_cflag|=B300; -#else - cfsetispeed(&Posix_CommConfig, B300); - cfsetospeed(&Posix_CommConfig, B300); -#endif - break; - - /*600 baud*/ - case BAUD600: -#ifdef CBAUD - Posix_CommConfig.c_cflag&=(~CBAUD); - Posix_CommConfig.c_cflag|=B600; -#else - cfsetispeed(&Posix_CommConfig, B600); - cfsetospeed(&Posix_CommConfig, B600); -#endif - break; - - /*1200 baud*/ - case BAUD1200: -#ifdef CBAUD - Posix_CommConfig.c_cflag&=(~CBAUD); - Posix_CommConfig.c_cflag|=B1200; -#else - cfsetispeed(&Posix_CommConfig, B1200); - cfsetospeed(&Posix_CommConfig, B1200); -#endif - break; - - /*1800 baud*/ - case BAUD1800: - TTY_PORTABILITY_WARNING("Posix_QextSerialPort Portability Warning: Windows and IRIX do not support 1800 baud operation."); -#ifdef CBAUD - Posix_CommConfig.c_cflag&=(~CBAUD); - Posix_CommConfig.c_cflag|=B1800; -#else - cfsetispeed(&Posix_CommConfig, B1800); - cfsetospeed(&Posix_CommConfig, B1800); -#endif - break; - - /*2400 baud*/ - case BAUD2400: -#ifdef CBAUD - Posix_CommConfig.c_cflag&=(~CBAUD); - Posix_CommConfig.c_cflag|=B2400; -#else - cfsetispeed(&Posix_CommConfig, B2400); - cfsetospeed(&Posix_CommConfig, B2400); -#endif - break; - - /*4800 baud*/ - case BAUD4800: -#ifdef CBAUD - Posix_CommConfig.c_cflag&=(~CBAUD); - Posix_CommConfig.c_cflag|=B4800; -#else - cfsetispeed(&Posix_CommConfig, B4800); - cfsetospeed(&Posix_CommConfig, B4800); -#endif - break; - - /*9600 baud*/ - case BAUD9600: -#ifdef CBAUD - Posix_CommConfig.c_cflag&=(~CBAUD); - Posix_CommConfig.c_cflag|=B9600; -#else - cfsetispeed(&Posix_CommConfig, B9600); - cfsetospeed(&Posix_CommConfig, B9600); -#endif - break; - - /*14400 baud*/ - case BAUD14400: - TTY_WARNING("Posix_QextSerialPort: POSIX does not support 14400 baud operation. Switching to 9600 baud."); -#ifdef CBAUD - Posix_CommConfig.c_cflag&=(~CBAUD); - Posix_CommConfig.c_cflag|=B9600; -#else - cfsetispeed(&Posix_CommConfig, B9600); - cfsetospeed(&Posix_CommConfig, B9600); -#endif - break; - - /*19200 baud*/ - case BAUD19200: -#ifdef CBAUD - Posix_CommConfig.c_cflag&=(~CBAUD); - Posix_CommConfig.c_cflag|=B19200; -#else - cfsetispeed(&Posix_CommConfig, B19200); - cfsetospeed(&Posix_CommConfig, B19200); -#endif - break; - - /*38400 baud*/ - case BAUD38400: -#ifdef CBAUD - Posix_CommConfig.c_cflag&=(~CBAUD); - Posix_CommConfig.c_cflag|=B38400; -#else - cfsetispeed(&Posix_CommConfig, B38400); - cfsetospeed(&Posix_CommConfig, B38400); -#endif - break; - - /*56000 baud*/ - case BAUD56000: - TTY_WARNING("Posix_QextSerialPort: POSIX does not support 56000 baud operation. Switching to 38400 baud."); -#ifdef CBAUD - Posix_CommConfig.c_cflag&=(~CBAUD); - Posix_CommConfig.c_cflag|=B38400; -#else - cfsetispeed(&Posix_CommConfig, B38400); - cfsetospeed(&Posix_CommConfig, B38400); -#endif - break; - - /*57600 baud*/ - case BAUD57600: -#ifdef CBAUD - Posix_CommConfig.c_cflag&=(~CBAUD); - Posix_CommConfig.c_cflag|=B57600; -#else - cfsetispeed(&Posix_CommConfig, B57600); - cfsetospeed(&Posix_CommConfig, B57600); -#endif - break; - - /*76800 baud*/ - case BAUD76800: - TTY_PORTABILITY_WARNING("Posix_QextSerialPort Portability Warning: Windows and some POSIX systems do not support 76800 baud operation."); -#ifdef CBAUD - Posix_CommConfig.c_cflag&=(~CBAUD); - -#ifdef B76800 - Posix_CommConfig.c_cflag|=B76800; -#else - TTY_WARNING("Posix_QextSerialPort: Posix_QextSerialPort was compiled without 76800 baud support. Switching to 57600 baud."); - Posix_CommConfig.c_cflag|=B57600; -#endif //B76800 -#else //CBAUD -#ifdef B76800 - cfsetispeed(&Posix_CommConfig, B76800); - cfsetospeed(&Posix_CommConfig, B76800); -#else - TTY_WARNING("Posix_QextSerialPort: Posix_QextSerialPort was compiled without 76800 baud support. Switching to 57600 baud."); - cfsetispeed(&Posix_CommConfig, B57600); - cfsetospeed(&Posix_CommConfig, B57600); -#endif //B76800 -#endif //CBAUD - break; - - /*115200 baud*/ - case BAUD115200: -#ifdef CBAUD - Posix_CommConfig.c_cflag&=(~CBAUD); - Posix_CommConfig.c_cflag|=B115200; -#else - cfsetispeed(&Posix_CommConfig, B115200); - cfsetospeed(&Posix_CommConfig, B115200); -#endif - break; - - /*128000 baud*/ - case BAUD128000: - TTY_WARNING("Posix_QextSerialPort: POSIX does not support 128000 baud operation. Switching to 115200 baud."); -#ifdef CBAUD - Posix_CommConfig.c_cflag&=(~CBAUD); - Posix_CommConfig.c_cflag|=B115200; -#else - cfsetispeed(&Posix_CommConfig, B115200); - cfsetospeed(&Posix_CommConfig, B115200); -#endif - break; - - /*256000 baud*/ - case BAUD256000: - TTY_WARNING("Posix_QextSerialPort: POSIX does not support 256000 baud operation. Switching to 115200 baud."); -#ifdef CBAUD - Posix_CommConfig.c_cflag&=(~CBAUD); - Posix_CommConfig.c_cflag|=B115200; -#else - cfsetispeed(&Posix_CommConfig, B115200); - cfsetospeed(&Posix_CommConfig, B115200); -#endif - break; - } - tcsetattr(Posix_File->handle(), TCSAFLUSH, &Posix_CommConfig); - } - UNLOCK_MUTEX(); -} - -/*! -\fn void Posix_QextSerialPort::setDataBits(DataBitsType dataBits) -Sets the number of data bits used by the serial port. Possible values of dataBits are: -\verbatim - DATA_5 5 data bits - DATA_6 6 data bits - DATA_7 7 data bits - DATA_8 8 data bits -\endverbatim - -\note -This function is subject to the following restrictions: -\par - 5 data bits cannot be used with 2 stop bits. -\par - 8 data bits cannot be used with space parity on POSIX systems. - -*/ -void Posix_QextSerialPort::setDataBits(DataBitsType dataBits) -{ - LOCK_MUTEX(); - if (Settings.DataBits!=dataBits) { - if ((Settings.StopBits==STOP_2 && dataBits==DATA_5) || - (Settings.StopBits==STOP_1_5 && dataBits!=DATA_5) || - (Settings.Parity==PAR_SPACE && dataBits==DATA_8)) { - } - else { - Settings.DataBits=dataBits; - } - } - if (isOpen()) { - switch(dataBits) { - - /*5 data bits*/ - case DATA_5: - if (Settings.StopBits==STOP_2) { - TTY_WARNING("Posix_QextSerialPort: 5 Data bits cannot be used with 2 stop bits."); - } - else { - Settings.DataBits=dataBits; - Posix_CommConfig.c_cflag&=(~CSIZE); - Posix_CommConfig.c_cflag|=CS5; - tcsetattr(Posix_File->handle(), TCSAFLUSH, &Posix_CommConfig); - } - break; - - /*6 data bits*/ - case DATA_6: - if (Settings.StopBits==STOP_1_5) { - TTY_WARNING("Posix_QextSerialPort: 6 Data bits cannot be used with 1.5 stop bits."); - } - else { - Settings.DataBits=dataBits; - Posix_CommConfig.c_cflag&=(~CSIZE); - Posix_CommConfig.c_cflag|=CS6; - tcsetattr(Posix_File->handle(), TCSAFLUSH, &Posix_CommConfig); - } - break; - - /*7 data bits*/ - case DATA_7: - if (Settings.StopBits==STOP_1_5) { - TTY_WARNING("Posix_QextSerialPort: 7 Data bits cannot be used with 1.5 stop bits."); - } - else { - Settings.DataBits=dataBits; - Posix_CommConfig.c_cflag&=(~CSIZE); - Posix_CommConfig.c_cflag|=CS7; - tcsetattr(Posix_File->handle(), TCSAFLUSH, &Posix_CommConfig); - } - break; - - /*8 data bits*/ - case DATA_8: - if (Settings.StopBits==STOP_1_5) { - TTY_WARNING("Posix_QextSerialPort: 8 Data bits cannot be used with 1.5 stop bits."); - } - else { - Settings.DataBits=dataBits; - Posix_CommConfig.c_cflag&=(~CSIZE); - Posix_CommConfig.c_cflag|=CS8; - tcsetattr(Posix_File->handle(), TCSAFLUSH, &Posix_CommConfig); - } - break; - } - } - UNLOCK_MUTEX(); -} - -/*! -\fn void Posix_QextSerialPort::setParity(ParityType parity) -Sets the parity associated with the serial port. The possible values of parity are: -\verbatim - PAR_SPACE Space Parity - PAR_MARK Mark Parity - PAR_NONE No Parity - PAR_EVEN Even Parity - PAR_ODD Odd Parity -\endverbatim - -\note -This function is subject to the following limitations: -\par -POSIX systems do not support mark parity. -\par -POSIX systems support space parity only if tricked into doing so, and only with - fewer than 8 data bits. Use space parity very carefully with POSIX systems. - -*/ -void Posix_QextSerialPort::setParity(ParityType parity) -{ - LOCK_MUTEX(); - if (Settings.Parity!=parity) { - if (parity==PAR_MARK || (parity==PAR_SPACE && Settings.DataBits==DATA_8)) { - } - else { - Settings.Parity=parity; - } - } - if (isOpen()) { - switch (parity) { - - /*space parity*/ - case PAR_SPACE: - if (Settings.DataBits==DATA_8) { - TTY_PORTABILITY_WARNING("Posix_QextSerialPort: Space parity is only supported in POSIX with 7 or fewer data bits"); - } - else { - - /*space parity not directly supported - add an extra data bit to simulate it*/ - Posix_CommConfig.c_cflag&=~(PARENB|CSIZE); - switch(Settings.DataBits) { - case DATA_5: - Settings.DataBits=DATA_6; - Posix_CommConfig.c_cflag|=CS6; - break; - - case DATA_6: - Settings.DataBits=DATA_7; - Posix_CommConfig.c_cflag|=CS7; - break; - - case DATA_7: - Settings.DataBits=DATA_8; - Posix_CommConfig.c_cflag|=CS8; - break; - - case DATA_8: - break; - } - tcsetattr(Posix_File->handle(), TCSAFLUSH, &Posix_CommConfig); - } - break; - - /*mark parity - WINDOWS ONLY*/ - case PAR_MARK: - TTY_WARNING("Posix_QextSerialPort: Mark parity is not supported by POSIX."); - break; - - /*no parity*/ - case PAR_NONE: - Posix_CommConfig.c_cflag&=(~PARENB); - tcsetattr(Posix_File->handle(), TCSAFLUSH, &Posix_CommConfig); - break; - - /*even parity*/ - case PAR_EVEN: - Posix_CommConfig.c_cflag&=(~PARODD); - Posix_CommConfig.c_cflag|=PARENB; - tcsetattr(Posix_File->handle(), TCSAFLUSH, &Posix_CommConfig); - break; - - /*odd parity*/ - case PAR_ODD: - Posix_CommConfig.c_cflag|=(PARENB|PARODD); - tcsetattr(Posix_File->handle(), TCSAFLUSH, &Posix_CommConfig); - break; - } - } - UNLOCK_MUTEX(); -} - -/*! -\fn void Posix_QextSerialPort::setStopBits(StopBitsType stopBits) -Sets the number of stop bits used by the serial port. Possible values of stopBits are: -\verbatim - STOP_1 1 stop bit - STOP_1_5 1.5 stop bits - STOP_2 2 stop bits -\endverbatim -\note -This function is subject to the following restrictions: -\par - 2 stop bits cannot be used with 5 data bits. -\par - POSIX does not support 1.5 stop bits. - -*/ -void Posix_QextSerialPort::setStopBits(StopBitsType stopBits) -{ - LOCK_MUTEX(); - if (Settings.StopBits!=stopBits) { - if ((Settings.DataBits==DATA_5 && stopBits==STOP_2) || stopBits==STOP_1_5) {} - else { - Settings.StopBits=stopBits; - } - } - if (isOpen()) { - switch (stopBits) { - - /*one stop bit*/ - case STOP_1: - Settings.StopBits=stopBits; - Posix_CommConfig.c_cflag&=(~CSTOPB); - tcsetattr(Posix_File->handle(), TCSAFLUSH, &Posix_CommConfig); - break; - - /*1.5 stop bits*/ - case STOP_1_5: - TTY_WARNING("Posix_QextSerialPort: 1.5 stop bit operation is not supported by POSIX."); - break; - - /*two stop bits*/ - case STOP_2: - if (Settings.DataBits==DATA_5) { - TTY_WARNING("Posix_QextSerialPort: 2 stop bits cannot be used with 5 data bits"); - } - else { - Settings.StopBits=stopBits; - Posix_CommConfig.c_cflag|=CSTOPB; - tcsetattr(Posix_File->handle(), TCSAFLUSH, &Posix_CommConfig); - } - break; - } - } - UNLOCK_MUTEX(); -} - -/*! -\fn void Posix_QextSerialPort::setFlowControl(FlowType flow) -Sets the flow control used by the port. Possible values of flow are: -\verbatim - FLOW_OFF No flow control - FLOW_HARDWARE Hardware (RTS/CTS) flow control - FLOW_XONXOFF Software (XON/XOFF) flow control -\endverbatim -\note -FLOW_HARDWARE may not be supported on all versions of UNIX. In cases where it is -unsupported, FLOW_HARDWARE is the same as FLOW_OFF. - -*/ -void Posix_QextSerialPort::setFlowControl(FlowType flow) -{ - LOCK_MUTEX(); - if (Settings.FlowControl!=flow) { - Settings.FlowControl=flow; - } - if (isOpen()) { - switch(flow) { - - /*no flow control*/ - case FLOW_OFF: - Posix_CommConfig.c_cflag&=(~CRTSCTS); - Posix_CommConfig.c_iflag&=(~(IXON|IXOFF|IXANY)); - tcsetattr(Posix_File->handle(), TCSAFLUSH, &Posix_CommConfig); - break; - - /*software (XON/XOFF) flow control*/ - case FLOW_XONXOFF: - Posix_CommConfig.c_cflag&=(~CRTSCTS); - Posix_CommConfig.c_iflag|=(IXON|IXOFF|IXANY); - tcsetattr(Posix_File->handle(), TCSAFLUSH, &Posix_CommConfig); - break; - - case FLOW_HARDWARE: - Posix_CommConfig.c_cflag|=CRTSCTS; - Posix_CommConfig.c_iflag&=(~(IXON|IXOFF|IXANY)); - tcsetattr(Posix_File->handle(), TCSAFLUSH, &Posix_CommConfig); - break; - } - } - UNLOCK_MUTEX(); -} - -/*! -\fn void Posix_QextSerialPort::setTimeout(ulong sec); -Sets the read and write timeouts for the port to millisec milliseconds. -Note that this is a per-character timeout, i.e. the port will wait this long for each -individual character, not for the whole read operation. This timeout also applies to the -bytesWaiting() function. - -\note -POSIX does not support millisecond-level control for I/O timeout values. Any -timeout set using this function will be set to the next lowest tenth of a second for -the purposes of detecting read or write timeouts. For example a timeout of 550 milliseconds -will be seen by the class as a timeout of 500 milliseconds for the purposes of reading and -writing the port. However millisecond-level control is allowed by the select() system call, -so for example a 550-millisecond timeout will be seen as 550 milliseconds on POSIX systems for -the purpose of detecting available bytes in the read buffer. - -*/ -void Posix_QextSerialPort::setTimeout(long millisec) -{ - LOCK_MUTEX(); - Settings.Timeout_Millisec = millisec; - Posix_Copy_Timeout.tv_sec = millisec / 1000; - Posix_Copy_Timeout.tv_usec = millisec % 1000; - if (isOpen()) { - tcgetattr(Posix_File->handle(), &Posix_CommConfig); - Posix_CommConfig.c_cc[VTIME] = millisec/100; - tcsetattr(Posix_File->handle(), TCSAFLUSH, &Posix_CommConfig); - } - UNLOCK_MUTEX(); -} - -/*! -\fn bool Posix_QextSerialPort::open(OpenMode mode) -Opens the serial port associated to this class. -This function has no effect if the port associated with the class is already open. -The port is also configured to the current settings, as stored in the Settings structure. -*/ -bool Posix_QextSerialPort::open(OpenMode mode) -{ - LOCK_MUTEX(); - if (mode == QIODevice::NotOpen) - return isOpen(); - if (!isOpen()) { - /*open the port*/ - Posix_File->setFileName(port); - qDebug("Trying to open File"); - if (Posix_File->open(QIODevice::ReadWrite|QIODevice::Unbuffered)) { - qDebug("Opened File succesfully"); - /*set open mode*/ - QIODevice::open(mode); - - /*configure port settings*/ - tcgetattr(Posix_File->handle(), &Posix_CommConfig); - - /*set up other port settings*/ - Posix_CommConfig.c_cflag|=CREAD|CLOCAL; - Posix_CommConfig.c_lflag&=(~(ICANON|ECHO|ECHOE|ECHOK|ECHONL|ISIG)); - Posix_CommConfig.c_iflag&=(~(INPCK|IGNPAR|PARMRK|ISTRIP|ICRNL|IXANY)); - Posix_CommConfig.c_oflag&=(~OPOST); - Posix_CommConfig.c_cc[VMIN]=0; - Posix_CommConfig.c_cc[VINTR] = _POSIX_VDISABLE; - Posix_CommConfig.c_cc[VQUIT] = _POSIX_VDISABLE; - Posix_CommConfig.c_cc[VSTART] = _POSIX_VDISABLE; - Posix_CommConfig.c_cc[VSTOP] = _POSIX_VDISABLE; - Posix_CommConfig.c_cc[VSUSP] = _POSIX_VDISABLE; - setBaudRate(Settings.BaudRate); - setDataBits(Settings.DataBits); - setParity(Settings.Parity); - setStopBits(Settings.StopBits); - setFlowControl(Settings.FlowControl); - setTimeout(Settings.Timeout_Millisec); - tcsetattr(Posix_File->handle(), TCSAFLUSH, &Posix_CommConfig); - } else { - qDebug("Could not open File! Error code : %d", Posix_File->error()); - } - } - UNLOCK_MUTEX(); - return isOpen(); -} - -/*! -\fn void Posix_QextSerialPort::close() -Closes a serial port. This function has no effect if the serial port associated with the class -is not currently open. -*/ -void Posix_QextSerialPort::close() -{ - LOCK_MUTEX(); - Posix_File->close(); - QIODevice::close(); - UNLOCK_MUTEX(); -} - -/*! -\fn void Posix_QextSerialPort::flush() -Flushes all pending I/O to the serial port. This function has no effect if the serial port -associated with the class is not currently open. -*/ -void Posix_QextSerialPort::flush() -{ - LOCK_MUTEX(); - if (isOpen()) { - Posix_File->flush(); - } - UNLOCK_MUTEX(); -} - -/*! -\fn qint64 Posix_QextSerialPort::size() const -This function will return the number of bytes waiting in the receive queue of the serial port. -It is included primarily to provide a complete QIODevice interface, and will not record errors -in the lastErr member (because it is const). This function is also not thread-safe - in -multithreading situations, use Posix_QextSerialPort::bytesWaiting() instead. -*/ -qint64 Posix_QextSerialPort::size() const -{ - int numBytes; - if (ioctl(Posix_File->handle(), FIONREAD, &numBytes)<0) { - numBytes=0; - } - return (qint64)numBytes; -} - -/*! -\fn qint64 Posix_QextSerialPort::bytesAvailable() -Returns the number of bytes waiting in the port's receive queue. This function will return 0 if -the port is not currently open, or -1 on error. Error information can be retrieved by calling -Posix_QextSerialPort::getLastError(). -*/ -qint64 Posix_QextSerialPort::bytesAvailable() -{ - LOCK_MUTEX(); - if (isOpen()) { - int bytesQueued; - fd_set fileSet; - FD_ZERO(&fileSet); - FD_SET(Posix_File->handle(), &fileSet); - - /*on Linux systems the Posix_Timeout structure will be altered by the select() call. - Make sure we use the right timeout values*/ - //memcpy(&Posix_Timeout, &Posix_Copy_Timeout, sizeof(struct timeval)); - Posix_Timeout = Posix_Copy_Timeout; - int n=select(Posix_File->handle()+1, &fileSet, NULL, &fileSet, &Posix_Timeout); - if (!n) { - lastErr=E_PORT_TIMEOUT; - UNLOCK_MUTEX(); - return -1; - } - if (n==-1 || ioctl(Posix_File->handle(), FIONREAD, &bytesQueued)==-1) { - translateError(errno); - UNLOCK_MUTEX(); - return -1; - } - lastErr=E_NO_ERROR; - UNLOCK_MUTEX(); - return bytesQueued + QIODevice::bytesAvailable(); - } - UNLOCK_MUTEX(); - return 0; -} - -/*! -\fn void Posix_QextSerialPort::ungetChar(char) -This function is included to implement the full QIODevice interface, and currently has no -purpose within this class. This function is meaningless on an unbuffered device and currently -only prints a warning message to that effect. -*/ -void Posix_QextSerialPort::ungetChar(char) -{ - /*meaningless on unbuffered sequential device - return error and print a warning*/ - TTY_WARNING("Posix_QextSerialPort: ungetChar() called on an unbuffered sequential device - operation is meaningless"); -} - -/*! -\fn void Posix_QextSerialPort::translateError(ulong error) -Translates a system-specific error code to a QextSerialPort error code. Used internally. -*/ -void Posix_QextSerialPort::translateError(ulong error) -{ - switch (error) { - case EBADF: - case ENOTTY: - lastErr=E_INVALID_FD; - break; - - case EINTR: - lastErr=E_CAUGHT_NON_BLOCKED_SIGNAL; - break; - - case ENOMEM: - lastErr=E_NO_MEMORY; - break; - } -} - -/*! -\fn void Posix_QextSerialPort::setDtr(bool set) -Sets DTR line to the requested state (high by default). This function will have no effect if -the port associated with the class is not currently open. -*/ -void Posix_QextSerialPort::setDtr(bool set) -{ - LOCK_MUTEX(); - if (isOpen()) { - int status; - ioctl(Posix_File->handle(), TIOCMGET, &status); - if (set) { - status|=TIOCM_DTR; - } - else { - status&=~TIOCM_DTR; - } - ioctl(Posix_File->handle(), TIOCMSET, &status); - } - UNLOCK_MUTEX(); -} - -/*! -\fn void Posix_QextSerialPort::setRts(bool set) -Sets RTS line to the requested state (high by default). This function will have no effect if -the port associated with the class is not currently open. -*/ -void Posix_QextSerialPort::setRts(bool set) -{ - LOCK_MUTEX(); - if (isOpen()) { - int status; - ioctl(Posix_File->handle(), TIOCMGET, &status); - if (set) { - status|=TIOCM_RTS; - } - else { - status&=~TIOCM_RTS; - } - ioctl(Posix_File->handle(), TIOCMSET, &status); - } - UNLOCK_MUTEX(); -} - -/*! -\fn unsigned long Posix_QextSerialPort::lineStatus() -returns the line status as stored by the port function. This function will retrieve the states -of the following lines: DCD, CTS, DSR, and RI. On POSIX systems, the following additional lines -can be monitored: DTR, RTS, Secondary TXD, and Secondary RXD. The value returned is an unsigned -long with specific bits indicating which lines are high. The following constants should be used -to examine the states of individual lines: - -\verbatim -Mask Line ------- ---- -LS_CTS CTS -LS_DSR DSR -LS_DCD DCD -LS_RI RI -LS_RTS RTS (POSIX only) -LS_DTR DTR (POSIX only) -LS_ST Secondary TXD (POSIX only) -LS_SR Secondary RXD (POSIX only) -\endverbatim - -This function will return 0 if the port associated with the class is not currently open. -*/ -unsigned long Posix_QextSerialPort::lineStatus() -{ - unsigned long Status=0, Temp=0; - LOCK_MUTEX(); - if (isOpen()) { - ioctl(Posix_File->handle(), TIOCMGET, &Temp); - if (Temp&TIOCM_CTS) { - Status|=LS_CTS; - } - if (Temp&TIOCM_DSR) { - Status|=LS_DSR; - } - if (Temp&TIOCM_RI) { - Status|=LS_RI; - } - if (Temp&TIOCM_CD) { - Status|=LS_DCD; - } - if (Temp&TIOCM_DTR) { - Status|=LS_DTR; - } - if (Temp&TIOCM_RTS) { - Status|=LS_RTS; - } - if (Temp&TIOCM_ST) { - Status|=LS_ST; - } - if (Temp&TIOCM_SR) { - Status|=LS_SR; - } - } - UNLOCK_MUTEX(); - return Status; -} - -/*! -\fn qint64 Posix_QextSerialPort::readData(char * data, qint64 maxSize) -Reads a block of data from the serial port. This function will read at most maxSize bytes from -the serial port and place them in the buffer pointed to by data. Return value is the number of -bytes actually read, or -1 on error. - -\warning before calling this function ensure that serial port associated with this class -is currently open (use isOpen() function to check if port is open). -*/ -qint64 Posix_QextSerialPort::readData(char * data, qint64 maxSize) -{ - LOCK_MUTEX(); - int retVal=0; - retVal=Posix_File->read(data, maxSize); - if (retVal==-1) - lastErr=E_READ_FAILED; - UNLOCK_MUTEX(); - - return retVal; -} - -/*! -\fn qint64 Posix_QextSerialPort::writeData(const char * data, qint64 maxSize) -Writes a block of data to the serial port. This function will write maxSize bytes -from the buffer pointed to by data to the serial port. Return value is the number -of bytes actually written, or -1 on error. - -\warning before calling this function ensure that serial port associated with this class -is currently open (use isOpen() function to check if port is open). -*/ -qint64 Posix_QextSerialPort::writeData(const char * data, qint64 maxSize) -{ - LOCK_MUTEX(); - int retVal=0; - retVal=Posix_File->write(data, maxSize); - if (retVal==-1) - lastErr=E_WRITE_FAILED; - UNLOCK_MUTEX(); - - return retVal; -} diff --git a/src/serialport/posix_qextserialport.h b/src/serialport/posix_qextserialport.h deleted file mode 100644 index 298bc2e4..00000000 --- a/src/serialport/posix_qextserialport.h +++ /dev/null @@ -1,63 +0,0 @@ -#ifndef _POSIX_QEXTSERIALPORT_H_ -#define _POSIX_QEXTSERIALPORT_H_ - -#include -#include -#include -#include -#include -#include -#include -#include "qextserialbase.h" - -class Posix_QextSerialPort:public QextSerialBase -{ - private: - /*! - * This method is a part of constructor. - */ - void init(); - - protected: - QFile* Posix_File; - struct termios Posix_CommConfig; - struct timeval Posix_Timeout; - struct timeval Posix_Copy_Timeout; - - virtual qint64 readData(char * data, qint64 maxSize); - virtual qint64 writeData(const char * data, qint64 maxSize); - - public: - Posix_QextSerialPort(); - Posix_QextSerialPort(const Posix_QextSerialPort& s); - Posix_QextSerialPort(const QString & name, QextSerialBase::QueryMode mode = QextSerialBase::Polling); - Posix_QextSerialPort(const PortSettings& settings, QextSerialBase::QueryMode mode = QextSerialBase::Polling); - Posix_QextSerialPort(const QString & name, const PortSettings& settings, QextSerialBase::QueryMode mode = QextSerialBase::Polling); - Posix_QextSerialPort& operator=(const Posix_QextSerialPort& s); - virtual ~Posix_QextSerialPort(); - - virtual void setBaudRate(BaudRateType); - virtual void setDataBits(DataBitsType); - virtual void setParity(ParityType); - virtual void setStopBits(StopBitsType); - virtual void setFlowControl(FlowType); - virtual void setTimeout(long); - - virtual bool open(OpenMode mode); - virtual void close(); - virtual void flush(); - - virtual qint64 size() const; - virtual qint64 bytesAvailable(); - - virtual void ungetChar(char c); - - virtual void translateError(ulong error); - - virtual void setDtr(bool set=true); - virtual void setRts(bool set=true); - virtual ulong lineStatus(); - -}; - -#endif diff --git a/src/serialport/qextserialbase.cpp b/src/serialport/qextserialbase.cpp deleted file mode 100644 index 854adf6b..00000000 --- a/src/serialport/qextserialbase.cpp +++ /dev/null @@ -1,226 +0,0 @@ -#include "qextserialbase.h" - -/*! -\fn QextSerialBase::QextSerialBase() -Default constructor. -*/ -QextSerialBase::QextSerialBase() - : QIODevice() -{ - -#ifdef _TTY_WIN_ - setPortName("COM1"); - -#elif defined(_TTY_IRIX_) - setPortName("/dev/ttyf1"); - -#elif defined(_TTY_HPUX_) - setPortName("/dev/tty1p0"); - -#elif defined(_TTY_SUN_) - setPortName("/dev/ttya"); - -#elif defined(_TTY_DIGITAL_) - setPortName("/dev/tty01"); - -#elif defined(_TTY_FREEBSD_) - setPortName("/dev/ttyd1"); - -#else - setPortName("/dev/ttyS0"); -#endif - - construct(); -} - -/*! -\fn QextSerialBase::QextSerialBase(const QString & name) -Construct a port and assign it to the device specified by the name parameter. -*/ -QextSerialBase::QextSerialBase(const QString & name) - : QIODevice() -{ - setPortName(name); - construct(); -} - -/*! -\fn QextSerialBase::~QextSerialBase() -Standard destructor. -*/ -QextSerialBase::~QextSerialBase() -{ - delete mutex; -} - -/*! -\fn void QextSerialBase::construct() -Common constructor function for setting up default port settings. -(115200 Baud, 8N1, Hardware flow control where supported, otherwise no flow control, and 0 ms timeout). -*/ -void QextSerialBase::construct() -{ - Settings.BaudRate=BAUD115200; - Settings.DataBits=DATA_8; - Settings.Parity=PAR_NONE; - Settings.StopBits=STOP_1; - Settings.FlowControl=FLOW_HARDWARE; - Settings.Timeout_Millisec=500; - mutex = new QMutex( QMutex::Recursive ); - setOpenMode(QIODevice::NotOpen); -} - -void QextSerialBase::setQueryMode(QueryMode mechanism) -{ - _queryMode = mechanism; -} - -/*! -\fn void QextSerialBase::setPortName(const QString & name) -Sets the name of the device associated with the object, e.g. "COM1", or "/dev/ttyS0". -*/ -void QextSerialBase::setPortName(const QString & name) -{ - port = name; -} - -/*! -\fn QString QextSerialBase::portName() const -Returns the name set by setPortName(). -*/ -QString QextSerialBase::portName() const -{ - return port; -} - -/*! -\fn BaudRateType QextSerialBase::baudRate(void) const -Returns the baud rate of the serial port. For a list of possible return values see -the definition of the enum BaudRateType. -*/ -BaudRateType QextSerialBase::baudRate(void) const -{ - return Settings.BaudRate; -} - -/*! -\fn DataBitsType QextSerialBase::dataBits() const -Returns the number of data bits used by the port. For a list of possible values returned by -this function, see the definition of the enum DataBitsType. -*/ -DataBitsType QextSerialBase::dataBits() const -{ - return Settings.DataBits; -} - -/*! -\fn ParityType QextSerialBase::parity() const -Returns the type of parity used by the port. For a list of possible values returned by -this function, see the definition of the enum ParityType. -*/ -ParityType QextSerialBase::parity() const -{ - return Settings.Parity; -} - -/*! -\fn StopBitsType QextSerialBase::stopBits() const -Returns the number of stop bits used by the port. For a list of possible return values, see -the definition of the enum StopBitsType. -*/ -StopBitsType QextSerialBase::stopBits() const -{ - return Settings.StopBits; -} - -/*! -\fn FlowType QextSerialBase::flowControl() const -Returns the type of flow control used by the port. For a list of possible values returned -by this function, see the definition of the enum FlowType. -*/ -FlowType QextSerialBase::flowControl() const -{ - return Settings.FlowControl; -} - -/*! -\fn bool QextSerialBase::isSequential() const -Returns true if device is sequential, otherwise returns false. Serial port is sequential device -so this function always returns true. Check QIODevice::isSequential() documentation for more -information. -*/ -bool QextSerialBase::isSequential() const -{ - return true; -} - -/*! -\fn bool QextSerialBase::atEnd() const -This function will return true if the input buffer is empty (or on error), and false otherwise. -Call QextSerialBase::lastError() for error information. -*/ -bool QextSerialBase::atEnd() const -{ - if (size()) { - return true; - } - return false; -} - -/*! -\fn qint64 QextSerialBase::readLine(char * data, qint64 maxSize) -This function will read a line of buffered input from the port, stopping when either maxSize bytes -have been read, the port has no more data available, or a newline is encountered. -The value returned is the length of the string that was read. -*/ -qint64 QextSerialBase::readLine(char * data, qint64 maxSize) -{ - qint64 numBytes = bytesAvailable(); - char* pData = data; - - if (maxSize < 2) //maxSize must be larger than 1 - return -1; - - /*read a byte at a time for MIN(bytesAvail, maxSize - 1) iterations, or until a newline*/ - while (pData<(data+numBytes) && --maxSize) { - readData(pData, 1); - if (*pData++ == '\n') { - break; - } - } - *pData='\0'; - - /*return size of data read*/ - return (pData-data); -} - -/*! -\fn ulong QextSerialBase::lastError() const -Returns the code for the last error encountered by the port, or E_NO_ERROR if the last port -operation was successful. Possible error codes are: - -\verbatim -Error Explanation ---------------------------- ------------------------------------------------------------- -E_NO_ERROR No Error has occured -E_INVALID_FD Invalid file descriptor (port was not opened correctly) -E_NO_MEMORY Unable to allocate memory tables (POSIX) -E_CAUGHT_NON_BLOCKED_SIGNAL Caught a non-blocked signal (POSIX) -E_PORT_TIMEOUT Operation timed out (POSIX) -E_INVALID_DEVICE The file opened by the port is not a character device (POSIX) -E_BREAK_CONDITION The port detected a break condition -E_FRAMING_ERROR The port detected a framing error - (usually caused by incorrect baud rate settings) -E_IO_ERROR There was an I/O error while communicating with the port -E_BUFFER_OVERRUN Character buffer overrun -E_RECEIVE_OVERFLOW Receive buffer overflow -E_RECEIVE_PARITY_ERROR The port detected a parity error in the received data -E_TRANSMIT_OVERFLOW Transmit buffer overflow -E_READ_FAILED General read operation failure -E_WRITE_FAILED General write operation failure -\endverbatim -*/ -ulong QextSerialBase::lastError() const -{ - return lastErr; -} diff --git a/src/serialport/qextserialbase.h b/src/serialport/qextserialbase.h deleted file mode 100644 index 792a1815..00000000 --- a/src/serialport/qextserialbase.h +++ /dev/null @@ -1,258 +0,0 @@ -#ifndef _QEXTSERIALBASE_H_ -#define _QEXTSERIALBASE_H_ - -#include -#include -#include -#include - -/*if all warning messages are turned off, flag portability warnings to be turned off as well*/ -#ifdef _TTY_NOWARN_ -#define _TTY_NOWARN_PORT_ -#endif - -/*macros for thread support*/ -#define LOCK_MUTEX() mutex->lock() -#define UNLOCK_MUTEX() mutex->unlock() - -/*macros for warning and debug messages*/ -#ifdef _TTY_NOWARN_PORT_ -#define TTY_PORTABILITY_WARNING(s) -#else -#define TTY_PORTABILITY_WARNING(s) qWarning(s) -#endif /*_TTY_NOWARN_PORT_*/ -#ifdef _TTY_NOWARN_ -#define TTY_WARNING(s) -#else -#define TTY_WARNING(s) qWarning(s) -#endif /*_TTY_NOWARN_*/ - - -/*line status constants*/ -#define LS_CTS 0x01 -#define LS_DSR 0x02 -#define LS_DCD 0x04 -#define LS_RI 0x08 -#define LS_RTS 0x10 -#define LS_DTR 0x20 -#define LS_ST 0x40 -#define LS_SR 0x80 - -/*error constants*/ -#define E_NO_ERROR 0 -#define E_INVALID_FD 1 -#define E_NO_MEMORY 2 -#define E_CAUGHT_NON_BLOCKED_SIGNAL 3 -#define E_PORT_TIMEOUT 4 -#define E_INVALID_DEVICE 5 -#define E_BREAK_CONDITION 6 -#define E_FRAMING_ERROR 7 -#define E_IO_ERROR 8 -#define E_BUFFER_OVERRUN 9 -#define E_RECEIVE_OVERFLOW 10 -#define E_RECEIVE_PARITY_ERROR 11 -#define E_TRANSMIT_OVERFLOW 12 -#define E_READ_FAILED 13 -#define E_WRITE_FAILED 14 - -/*! - * Enums for port settings. - */ -enum NamingConvention -{ - WIN_NAMES, - IRIX_NAMES, - HPUX_NAMES, - SUN_NAMES, - DIGITAL_NAMES, - FREEBSD_NAMES, - LINUX_NAMES -}; - -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 - BAUD256000 //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; -}; - -/*! - * \author Stefan Sander - * \author Michal Policht - * - * A common base class for Win_QextSerialBase, Posix_QextSerialBase and QextSerialPort. - */ -class QextSerialBase : public QIODevice -{ - Q_OBJECT - - public: - enum QueryMode { - Polling, - EventDriven - }; - - protected: - QMutex* mutex; - QString port; - PortSettings Settings; - ulong lastErr; - QextSerialBase::QueryMode _queryMode; - - virtual qint64 readData(char * data, qint64 maxSize)=0; - virtual qint64 writeData(const char * data, qint64 maxSize)=0; - - public: - QextSerialBase(); - QextSerialBase(const QString & name); - virtual ~QextSerialBase(); - virtual void construct(); - virtual void setPortName(const QString & name); - virtual QString portName() const; - - /**! - * Get query mode. - * \return query mode. - */ - inline QextSerialBase::QueryMode queryMode() const { return _queryMode; }; - - /*! - * Set desired serial communication handling style. You may choose from polling - * or event driven approach. This function does nothing when port is open; to - * apply changes port must be reopened. - * - * In event driven approach read() and write() functions are acting - * asynchronously. They return immediately and the operation is performed in - * the background, so they doesn't freeze the calling thread. - * To determine when operation is finished, QextSerialPort runs separate thread - * and monitors serial port events. Whenever the event occurs, adequate signal - * is emitted. - * - * When polling is set, read() and write() are acting synchronously. Signals are - * not working in this mode and some functions may not be available. The advantage - * of polling is that it generates less overhead due to lack of signals emissions - * and it doesn't start separate thread to monitor events. - * - * Generally event driven approach is more capable and friendly, although some - * applications may need as low overhead as possible and then polling comes. - * - * \param mode query mode. - */ - virtual void setQueryMode(QueryMode mode); - -// virtual void setBlockingRead(bool block) = 0; ///< @todo implement. - - virtual void setBaudRate(BaudRateType)=0; - virtual BaudRateType baudRate() const; - virtual void setDataBits(DataBitsType)=0; - virtual DataBitsType dataBits() const; - virtual void setParity(ParityType)=0; - virtual ParityType parity() const; - virtual void setStopBits(StopBitsType)=0; - virtual StopBitsType stopBits() const; - virtual void setFlowControl(FlowType)=0; - virtual FlowType flowControl() const; - virtual void setTimeout(long)=0; - - virtual bool open(OpenMode mode)=0; - virtual bool isSequential() const; - virtual void close()=0; - virtual void flush()=0; - - virtual qint64 size() const=0; - virtual qint64 bytesAvailable()=0; - virtual bool atEnd() const; - - virtual void ungetChar(char c)=0; - virtual qint64 readLine(char * data, qint64 maxSize); - - virtual ulong lastError() const; - virtual void translateError(ulong error)=0; - - virtual void setDtr(bool set=true)=0; - virtual void setRts(bool set=true)=0; - virtual ulong lineStatus()=0; - - signals: - /** - * This signal is emitted whenever port settings are updated. - * \param valid \p true if settings are valid, \p false otherwise. - * - * @todo implement. - */ -// void validSettings(bool valid); - - /*! - * This signal is emitted whenever dsr line has changed its state. You may - * use this signal to check if device is connected. - * \param status \p true when DSR signal is on, \p false otherwise. - * - * \see lineStatus(). - */ - void dsrChanged(bool status); -}; - -#endif diff --git a/src/serialport/qextserialenumerator.cpp b/src/serialport/qextserialenumerator.cpp deleted file mode 100644 index 8f4009eb..00000000 --- a/src/serialport/qextserialenumerator.cpp +++ /dev/null @@ -1,158 +0,0 @@ -/** - * @file qextserialenumerator.cpp - * @author MichaƂ Policht - * @see QextSerialEnumerator - */ - -#include "qextserialenumerator.h" - -#if defined ( _TTY_WIN_ ) -#include -#include -#endif - - -#ifdef _TTY_WIN_ - //this is serial port GUID - #ifndef GUID_CLASS_COMPORT - DEFINE_GUID(GUID_CLASS_COMPORT, 0x86e0d1e0L, 0x8089, 0x11d0, 0x9c, 0xe4, 0x08, 0x00, 0x3e, 0x30, 0x1f, 0x73); - #endif - - /* Gordon Schumacher's macros for TCHAR -> QString conversions and vice versa */ - #ifdef UNICODE - #define QStringToTCHAR(x) (wchar_t*) x.utf16() - #define PQStringToTCHAR(x) (wchar_t*) x->utf16() - #define TCHARToQString(x) QString::fromUtf16((ushort*)(x)) - #define TCHARToQStringN(x,y) QString::fromUtf16((ushort*)(x),(y)) - #else - #define QStringToTCHAR(x) x.local8Bit().constData() - #define PQStringToTCHAR(x) x->local8Bit().constData() - #define TCHARToQString(x) QString::fromLocal8Bit((x)) - #define TCHARToQStringN(x,y) QString::fromLocal8Bit((x),(y)) - #endif /*UNICODE*/ - - - //static - QString QextSerialEnumerator::getRegKeyValue(HKEY key, LPCTSTR property) - { - DWORD size = 0; - RegQueryValueEx(key, property, NULL, NULL, NULL, & size); - BYTE * buff = new BYTE[size]; - if (RegQueryValueEx(key, property, NULL, NULL, buff, & size) == ERROR_SUCCESS) { - return TCHARToQStringN(buff, size); - delete [] buff; - } else { - qWarning("QextSerialEnumerator::getRegKeyValue: can not obtain value from registry"); - delete [] buff; - return QString(); - } - } - - //static - QString QextSerialEnumerator::getDeviceProperty(HDEVINFO devInfo, PSP_DEVINFO_DATA devData, DWORD property) - { - DWORD buffSize = 0; - SetupDiGetDeviceRegistryProperty(devInfo, devData, property, NULL, NULL, 0, & buffSize); - BYTE * buff = new BYTE[buffSize]; - if (!SetupDiGetDeviceRegistryProperty(devInfo, devData, property, NULL, buff, buffSize, NULL)) - qCritical("Can not obtain property: %ld from registry", property); - QString result = TCHARToQString(buff); - delete [] buff; - return result; - } - - //static - void QextSerialEnumerator::setupAPIScan(QList & infoList) - { - HDEVINFO devInfo = INVALID_HANDLE_VALUE; - GUID * guidDev = (GUID *) & GUID_CLASS_COMPORT; - - devInfo = SetupDiGetClassDevs(guidDev, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE); - if(devInfo == INVALID_HANDLE_VALUE) { - qCritical("SetupDiGetClassDevs failed. Error code: %ld", GetLastError()); - return; - } - - //enumerate the devices - bool ok = true; - SP_DEVICE_INTERFACE_DATA ifcData; - ifcData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA); - SP_DEVICE_INTERFACE_DETAIL_DATA * detData = NULL; - DWORD detDataSize = 0; - DWORD oldDetDataSize = 0; - - for (DWORD i = 0; ok; i++) { - ok = SetupDiEnumDeviceInterfaces(devInfo, NULL, guidDev, i, &ifcData); - if (ok) { - SP_DEVINFO_DATA devData = {sizeof(SP_DEVINFO_DATA)}; - //check for required detData size - SetupDiGetDeviceInterfaceDetail(devInfo, & ifcData, NULL, 0, & detDataSize, & devData); - //if larger than old detData size then reallocate the buffer - if (detDataSize > oldDetDataSize) { - delete [] detData; - detData = (SP_DEVICE_INTERFACE_DETAIL_DATA *) new char[detDataSize]; - detData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA); - oldDetDataSize = detDataSize; - } - //check the details - if (SetupDiGetDeviceInterfaceDetail(devInfo, & ifcData, detData, detDataSize, - NULL, & devData)) { - // Got a device. Get the details. - QextPortInfo info; - info.friendName = getDeviceProperty(devInfo, & devData, SPDRP_FRIENDLYNAME); - info.physName = getDeviceProperty(devInfo, & devData, SPDRP_PHYSICAL_DEVICE_OBJECT_NAME); - info.enumName = getDeviceProperty(devInfo, & devData, SPDRP_ENUMERATOR_NAME); - //anyway, to get the port name we must still open registry directly :( ??? - //Eh... - HKEY devKey = SetupDiOpenDevRegKey(devInfo, & devData, DICS_FLAG_GLOBAL, 0, - DIREG_DEV, KEY_READ); - info.portName = getRegKeyValue(devKey, TEXT("PortName")); - RegCloseKey(devKey); - infoList.append(info); - } else { - qCritical("SetupDiGetDeviceInterfaceDetail failed. Error code: %ld", GetLastError()); - delete [] detData; - return; - } - } else { - if (GetLastError() != ERROR_NO_MORE_ITEMS) { - delete [] detData; - qCritical("SetupDiEnumDeviceInterfaces failed. Error code: %ld", GetLastError()); - return; - } - } - } - delete [] detData; - } - -#endif /*_TTY_WIN_*/ - - -//static -QList QextSerialEnumerator::getPorts() -{ - QList ports; - - #ifdef _TTY_WIN_ - OSVERSIONINFO vi; - vi.dwOSVersionInfoSize = sizeof(vi); - if (!::GetVersionEx(&vi)) { - qCritical("Could not get OS version."); - return ports; - } - // Handle windows 9x and NT4 specially - if (vi.dwMajorVersion < 5) { - qCritical("Enumeration for this version of Windows is not implemented yet"); -/* if (vi.dwPlatformId == VER_PLATFORM_WIN32_NT) - EnumPortsWNt4(ports); - else - EnumPortsW9x(ports);*/ - } else //w2k or later - setupAPIScan(ports); - #endif /*_TTY_WIN_*/ - #ifdef _TTY_POSIX_ - qCritical("Enumeration for POSIX systems is not implemented yet."); - #endif /*_TTY_POSIX_*/ - - return ports; -} diff --git a/src/serialport/qextserialenumerator.h b/src/serialport/qextserialenumerator.h deleted file mode 100644 index 20a41359..00000000 --- a/src/serialport/qextserialenumerator.h +++ /dev/null @@ -1,75 +0,0 @@ -/*! - * \file qextserialenumerator.h - * \author Michal Policht - * \see QextSerialEnumerator - */ - -#ifndef _QEXTSERIALENUMERATOR_H_ -#define _QEXTSERIALENUMERATOR_H_ - - -#include -#include - -#ifdef _TTY_WIN_ - #include - #include -#endif /*_TTY_WIN_*/ - - -/*! - * Structure containing port information. - */ -struct QextPortInfo { - QString portName; ///< Port name. - QString physName; ///< Physical name. - QString friendName; ///< Friendly name. - QString enumName; ///< Enumerator name. -}; - - -/*! - * Serial port enumerator. This class provides list of ports available in the system. - * - * Windows implementation is based on Zach Gorman's work from - * The Code Project (http://www.codeproject.com/system/setupdi.asp). - */ -class QextSerialEnumerator -{ - private: - #ifdef _TTY_WIN_ - /*! - * Get value of specified property from the registry. - * \param key handle to an open key. - * \param property property name. - * \return property value. - */ - static QString getRegKeyValue(HKEY key, LPCTSTR property); - - /*! - * Get specific property from registry. - * \param devInfo pointer to the device information set that contains the interface - * and its underlying device. Returned by SetupDiGetClassDevs() function. - * \param devData pointer to an SP_DEVINFO_DATA structure that defines the device instance. - * this is returned by SetupDiGetDeviceInterfaceDetail() function. - * \param property registry property. One of defined SPDRP_* constants. - * \return property string. - */ - static QString getDeviceProperty(HDEVINFO devInfo, PSP_DEVINFO_DATA devData, DWORD property); - - /*! - * Search for serial ports using setupapi. - * \param infoList list with result. - */ - static void setupAPIScan(QList & infoList); - #endif /*_TTY_WIN_*/ - - public: - /*! - * Get list of ports. - * \return list of ports currently available in the system. - */ - static QList getPorts(); -}; - -#endif /*_QEXTSERIALENUMERATOR_H_*/ diff --git a/src/serialport/qextserialport.cpp b/src/serialport/qextserialport.cpp deleted file mode 100644 index 99a922ed..00000000 --- a/src/serialport/qextserialport.cpp +++ /dev/null @@ -1,106 +0,0 @@ - -/*! -\class QextSerialPort -\author Stefan Sander -\author Michal Policht - -A cross-platform serial port class. -This class encapsulates a serial port on both POSIX and Windows systems. The user will be -notified of errors and possible portability conflicts at run-time by default - this behavior can -be turned off by defining _TTY_NOWARN_ (to turn off all warnings) or _TTY_NOWARN_PORT_ (to turn -off portability warnings) in the project. - -You may choose from polling or event driven API. For details check setQueryMode() documentation. - -\note -On Windows NT/2000/XP this class uses Win32 serial port functions by default. The user may -select POSIX behavior under NT, 2000, or XP ONLY by defining _TTY_POSIX_ in the project. I can -make no guarantees as to the quality of POSIX support under NT/2000 however. - -*/ - -#include -#include "qextserialport.h" - -/*! -Default constructor. Note that the naming convention used by a QextSerialPort constructed with -this constructor will be determined by #defined constants, or lack thereof - the default behavior -is the same as _TTY_LINUX_. Possible naming conventions and their associated constants are: - -\verbatim - -Constant Used By Naming Convention ----------- ------------- ------------------------ -_TTY_WIN_ Windows COM1, COM2 -_TTY_IRIX_ SGI/IRIX /dev/ttyf1, /dev/ttyf2 -_TTY_HPUX_ HP-UX /dev/tty1p0, /dev/tty2p0 -_TTY_SUN_ SunOS/Solaris /dev/ttya, /dev/ttyb -_TTY_DIGITAL_ Digital UNIX /dev/tty01, /dev/tty02 -_TTY_FREEBSD_ FreeBSD /dev/ttyd0, /dev/ttyd1 -_TTY_LINUX_ Linux /dev/ttyS0, /dev/ttyS1 - Linux /dev/ttyS0, /dev/ttyS1 -\endverbatim - -The object will be associated with the first port in the system, e.g. COM1 on Windows systems. -See the other constructors if you need to use a port other than the first. -*/ -QextSerialPort::QextSerialPort() - : QextBaseType() -{} - -/*! -Constructs a serial port attached to the port specified by name. -name is the name of the device, which is windowsystem-specific, -e.g."COM1" or "/dev/ttyS0". - -\see setQueryMode(). -*/ -QextSerialPort::QextSerialPort(const QString & name, QueryMode mode) - : QextBaseType(name, mode) -{ -} - -/*! -Constructs a port with default name and settings specified by the settings parameter. - -\see setQueryMode(). -*/ -QextSerialPort::QextSerialPort(PortSettings const& settings, QueryMode mode) - : QextBaseType(settings, mode) -{} - -/*! -Constructs a port with the name and settings specified. - -\see setQueryMode(). -*/ -QextSerialPort::QextSerialPort(const QString & name, PortSettings const& settings, QueryMode mode) - : QextBaseType(name, settings, mode) -{} - -/*! -Copy constructor. - -\deprecated -*/ -QextSerialPort::QextSerialPort(const QextSerialPort& s) - : QextBaseType(s) -{} - -/*! -\fn QextSerialPort& QextSerialPort::operator=(const QextSerialPort& s) -Overrides the = operator. - -\deprecated -*/ -QextSerialPort& QextSerialPort::operator=(const QextSerialPort& s) -{ - return (QextSerialPort&)QextBaseType::operator=(s); -} - -/*! -\fn QextSerialPort::~QextSerialPort() -Standard destructor. -*/ -QextSerialPort::~QextSerialPort() -{} diff --git a/src/serialport/qextserialport.h b/src/serialport/qextserialport.h deleted file mode 100644 index 2b71fc1f..00000000 --- a/src/serialport/qextserialport.h +++ /dev/null @@ -1,33 +0,0 @@ - -#ifndef _QEXTSERIALPORT_H_ -#define _QEXTSERIALPORT_H_ - -/*POSIX CODE*/ -#ifdef _TTY_POSIX_ -#include "posix_qextserialport.h" -#define QextBaseType Posix_QextSerialPort - -/*MS WINDOWS CODE*/ -#else -#include "win_qextserialport.h" -#define QextBaseType Win_QextSerialPort -#endif - -class QextSerialPort: public QextBaseType -{ - Q_OBJECT - - public: - typedef QextSerialBase::QueryMode QueryMode; - - QextSerialPort(); - QextSerialPort(const QString & name, QueryMode mode = QextSerialPort::Polling); - QextSerialPort(PortSettings const& s, QueryMode mode = QextSerialPort::Polling); - QextSerialPort(const QString & name, PortSettings const& s, QueryMode mode = QextSerialPort::Polling); - QextSerialPort(const QextSerialPort& s); - QextSerialPort& operator=(const QextSerialPort&); - virtual ~QextSerialPort(); - -}; - -#endif diff --git a/src/serialport/qextserialport.pri b/src/serialport/qextserialport.pri deleted file mode 100644 index f13faad6..00000000 --- a/src/serialport/qextserialport.pri +++ /dev/null @@ -1,33 +0,0 @@ - -CONFIG += debug_and_release -CONFIG += qt -CONFIG += warn_on -CONFIG += thread - - -OBJECTS_DIR = obj -MOC_DIR = obj/moc.cpp -UI_DIR = obj/ui.h -RCC_DIR = qrc -#user directory -DESTDIR = bin - -DEPENDPATH += $$PWD -INCLUDEPATH += $$PWD -HEADERS += $$PWD/qextserialbase.h \ - $$PWD/qextserialport.h \ - $$PWD/qextserialenumerator.h -SOURCES += $$PWD/qextserialbase.cpp \ - $$PWD/qextserialport.cpp \ - $$PWD/qextserialenumerator.cpp - -unix:HEADERS += $$PWD/posix_qextserialport.h -unix:SOURCES += $$PWD/posix_qextserialport.cpp -unix:DEFINES += _TTY_POSIX_ - - -win32:HEADERS += $$PWD/win_qextserialport.h -win32:SOURCES += $$PWD/win_qextserialport.cpp -win32:DEFINES += _TTY_WIN_ -win32:LIBS += -lsetupapi - diff --git a/src/serialport/qextserialport.pro b/src/serialport/qextserialport.pro deleted file mode 100644 index 24284c78..00000000 --- a/src/serialport/qextserialport.pro +++ /dev/null @@ -1,49 +0,0 @@ -PROJECT = qextserialport -TEMPLATE = lib - -CONFIG += debug_and_release - -CONFIG += qt -CONFIG += warn_on -CONFIG += thread - -CONFIG += dll -#CONFIG += staticlib - -QT -= gui - -OBJECTS_DIR = build/obj -MOC_DIR = build/moc -DEPENDDIR = . -INCLUDEDIR = . -HEADERS = qextserialbase.h \ - qextserialport.h \ - qextserialenumerator.h -SOURCES = qextserialbase.cpp \ - qextserialport.cpp \ - qextserialenumerator.cpp - -unix:HEADERS += posix_qextserialport.h -unix:SOURCES += posix_qextserialport.cpp -unix:DEFINES += _TTY_POSIX_ - - -win32:HEADERS += win_qextserialport.h -win32:SOURCES += win_qextserialport.cpp -win32:DEFINES += _TTY_WIN_ - -win32:LIBS += -lsetupapi - - -DESTDIR = build -#DESTDIR = examples/enumerator/debug -#DESTDIR = examples/qespta/debug -#DESTDIR = examples/event/debug - -CONFIG(debug, debug|release) { - TARGET = qextserialportd -} else { - TARGET = qextserialport -} - -unix:VERSION = 1.2.0 diff --git a/src/serialport/win_qextserialport.cpp b/src/serialport/win_qextserialport.cpp deleted file mode 100644 index 090bf82c..00000000 --- a/src/serialport/win_qextserialport.cpp +++ /dev/null @@ -1,1049 +0,0 @@ -//#include -//#include -//#include -//#include -#include -#include "win_qextserialport.h" - - -/*! -\fn Win_QextSerialPort::Win_QextSerialPort() -Default constructor. Note that the name of the device used by a Win_QextSerialPort constructed -with this constructor will be determined by #defined constants, or lack thereof - the default -behavior is the same as _TTY_LINUX_. Possible naming conventions and their associated constants -are: - -\verbatim - -Constant Used By Naming Convention ----------- ------------- ------------------------ -_TTY_WIN_ Windows COM1, COM2 -_TTY_IRIX_ SGI/IRIX /dev/ttyf1, /dev/ttyf2 -_TTY_HPUX_ HP-UX /dev/tty1p0, /dev/tty2p0 -_TTY_SUN_ SunOS/Solaris /dev/ttya, /dev/ttyb -_TTY_DIGITAL_ Digital UNIX /dev/tty01, /dev/tty02 -_TTY_FREEBSD_ FreeBSD /dev/ttyd0, /dev/ttyd1 -_TTY_LINUX_ Linux /dev/ttyS0, /dev/ttyS1 - Linux /dev/ttyS0, /dev/ttyS1 -\endverbatim - -This constructor associates the object with the first port on the system, e.g. COM1 for Windows -platforms. See the other constructor if you need a port other than the first. -*/ -Win_QextSerialPort::Win_QextSerialPort(): - QextSerialBase() -{ - Win_Handle=INVALID_HANDLE_VALUE; - init(); -} - -/*!Win_QextSerialPort::Win_QextSerialPort(const Win_QextSerialPort&) -Copy constructor. -*/ -Win_QextSerialPort::Win_QextSerialPort(const Win_QextSerialPort& s): - QextSerialBase(s.port) -{ - Win_Handle=INVALID_HANDLE_VALUE; - _queryMode = s._queryMode; - _bytesToWrite = s._bytesToWrite; - bytesToWriteLock = new QReadWriteLock; - overlapThread = new Win_QextSerialThread(this); - memcpy(& overlap, & s.overlap, sizeof(OVERLAPPED)); - memcpy(& overlapWrite, & s.overlapWrite, sizeof(OVERLAPPED)); - setOpenMode(s.openMode()); - lastErr=s.lastErr; - port = s.port; - Settings.FlowControl=s.Settings.FlowControl; - Settings.Parity=s.Settings.Parity; - Settings.DataBits=s.Settings.DataBits; - Settings.StopBits=s.Settings.StopBits; - Settings.BaudRate=s.Settings.BaudRate; - Win_Handle=s.Win_Handle; - memcpy(&Win_CommConfig, &s.Win_CommConfig, sizeof(COMMCONFIG)); - memcpy(&Win_CommTimeouts, &s.Win_CommTimeouts, sizeof(COMMTIMEOUTS)); - if (s.overlapThread->isRunning()) - overlapThread->start(); -} - -/*! -\fn Win_QextSerialPort::Win_QextSerialPort(const QString & name) -Constructs a serial port attached to the port specified by devName. -devName is the name of the device, which is windowsystem-specific, -e.g."COM2" or "/dev/ttyS0". -*/ -Win_QextSerialPort::Win_QextSerialPort(const QString & name, QextSerialBase::QueryMode mode): - QextSerialBase(name) -{ - Win_Handle=INVALID_HANDLE_VALUE; - setQueryMode(mode); - init(); -} - -/*! -\fn Win_QextSerialPort::Win_QextSerialPort(const PortSettings& settings) -Constructs a port with default name and specified settings. -*/ -Win_QextSerialPort::Win_QextSerialPort(const PortSettings& settings, QextSerialBase::QueryMode mode) { - Win_Handle=INVALID_HANDLE_VALUE; - setBaudRate(settings.BaudRate); - setDataBits(settings.DataBits); - setStopBits(settings.StopBits); - setParity(settings.Parity); - setFlowControl(settings.FlowControl); - setTimeout(settings.Timeout_Millisec); - setQueryMode(mode); - init(); -} - -/*! -\fn Win_QextSerialPort::Win_QextSerialPort(const QString & name, const PortSettings& settings) -Constructs a port with specified name and settings. -*/ -Win_QextSerialPort::Win_QextSerialPort(const QString & name, const PortSettings& settings, QextSerialBase::QueryMode mode) { - Win_Handle=INVALID_HANDLE_VALUE; - setPortName(name); - setBaudRate(settings.BaudRate); - setDataBits(settings.DataBits); - setStopBits(settings.StopBits); - setParity(settings.Parity); - setFlowControl(settings.FlowControl); - setTimeout(settings.Timeout_Millisec); - setQueryMode(mode); - init(); -} - -void Win_QextSerialPort::init() -{ - _bytesToWrite = 0; - overlap.Internal = 0; - overlap.InternalHigh = 0; - overlap.Offset = 0; - overlap.OffsetHigh = 0; - overlap.hEvent = CreateEvent(NULL, true, false, NULL); - overlapThread = new Win_QextSerialThread(this); - bytesToWriteLock = new QReadWriteLock; -} - -/*! -\fn Win_QextSerialPort::~Win_QextSerialPort() -Standard destructor. -*/ -Win_QextSerialPort::~Win_QextSerialPort() { - if (isOpen()) { - close(); - } - CloseHandle(overlap.hEvent); - delete overlapThread; - delete bytesToWriteLock; -} - -/*! -\fn Win_QextSerialPort& Win_QextSerialPort::operator=(const Win_QextSerialPort& s) -overrides the = operator -*/ -Win_QextSerialPort& Win_QextSerialPort::operator=(const Win_QextSerialPort& s) { - setOpenMode(s.openMode()); - _queryMode = s._queryMode; - _bytesToWrite = s._bytesToWrite; - bytesToWriteLock = new QReadWriteLock; - overlapThread = new Win_QextSerialThread(this); - memcpy(& overlap, & s.overlap, sizeof(OVERLAPPED)); - memcpy(& overlapWrite, & s.overlapWrite, sizeof(OVERLAPPED)); - lastErr=s.lastErr; - port = s.port; - Settings.FlowControl=s.Settings.FlowControl; - Settings.Parity=s.Settings.Parity; - Settings.DataBits=s.Settings.DataBits; - Settings.StopBits=s.Settings.StopBits; - Settings.BaudRate=s.Settings.BaudRate; - Win_Handle=s.Win_Handle; - memcpy(&Win_CommConfig, &s.Win_CommConfig, sizeof(COMMCONFIG)); - memcpy(&Win_CommTimeouts, &s.Win_CommTimeouts, sizeof(COMMTIMEOUTS)); - if (s.overlapThread->isRunning()) - overlapThread->start(); - return *this; -} - - -/*! -\fn bool Win_QextSerialPort::open(OpenMode mode) -Opens a serial port. Note that this function does not specify which device to open. If you need -to open a device by name, see Win_QextSerialPort::open(const char*). This function has no effect -if the port associated with the class is already open. The port is also configured to the current -settings, as stored in the Settings structure. -*/ -bool Win_QextSerialPort::open(OpenMode mode) { - unsigned long confSize = sizeof(COMMCONFIG); - Win_CommConfig.dwSize = confSize; - DWORD dwFlagsAndAttributes = 0; - if (queryMode() == QextSerialBase::EventDriven) - dwFlagsAndAttributes += FILE_FLAG_OVERLAPPED; - - LOCK_MUTEX(); - if (mode == QIODevice::NotOpen) - return isOpen(); - if (!isOpen()) { - /*open the port*/ - Win_Handle=CreateFileA(port.toAscii(), GENERIC_READ|GENERIC_WRITE, - FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, dwFlagsAndAttributes, NULL); - if (Win_Handle!=INVALID_HANDLE_VALUE) { - /*configure port settings*/ - GetCommConfig(Win_Handle, &Win_CommConfig, &confSize); - GetCommState(Win_Handle, &(Win_CommConfig.dcb)); - - /*set up parameters*/ - Win_CommConfig.dcb.fBinary=TRUE; - Win_CommConfig.dcb.fInX=FALSE; - Win_CommConfig.dcb.fOutX=FALSE; - Win_CommConfig.dcb.fAbortOnError=FALSE; - Win_CommConfig.dcb.fNull=FALSE; - setBaudRate(Settings.BaudRate); - setDataBits(Settings.DataBits); - setStopBits(Settings.StopBits); - setParity(Settings.Parity); - setFlowControl(Settings.FlowControl); - setTimeout(Settings.Timeout_Millisec); - SetCommConfig(Win_Handle, &Win_CommConfig, sizeof(COMMCONFIG)); - - //init event driven approach - if (queryMode() == QextSerialBase::EventDriven) { - Win_CommTimeouts.ReadIntervalTimeout = MAXDWORD; - Win_CommTimeouts.ReadTotalTimeoutMultiplier = 0; - Win_CommTimeouts.ReadTotalTimeoutConstant = 0; - Win_CommTimeouts.WriteTotalTimeoutMultiplier = 0; - Win_CommTimeouts.WriteTotalTimeoutConstant = 0; - SetCommTimeouts(Win_Handle, &Win_CommTimeouts); - if (!SetCommMask( Win_Handle, EV_TXEMPTY | EV_RXCHAR | EV_DSR)) { - qWarning("Failed to set Comm Mask. Error code: %ld", GetLastError()); - UNLOCK_MUTEX(); - return false; - } - overlapThread->start(); - } - QIODevice::open(mode); - } - } else { - UNLOCK_MUTEX(); - return false; - } - UNLOCK_MUTEX(); - return isOpen(); -} - -/*! -\fn void Win_QextSerialPort::close() -Closes a serial port. This function has no effect if the serial port associated with the class -is not currently open. -*/ -void Win_QextSerialPort::close() -{ - LOCK_MUTEX(); - - if (isOpen()) { - flush(); - if (overlapThread->isRunning()) { - overlapThread->stop(); - if (QThread::currentThread() != overlapThread) - overlapThread->wait(); - } - if (CloseHandle(Win_Handle)) - Win_Handle = INVALID_HANDLE_VALUE; - _bytesToWrite = 0; - QIODevice::close(); - } - - UNLOCK_MUTEX(); -} - -/*! -\fn void Win_QextSerialPort::flush() -Flushes all pending I/O to the serial port. This function has no effect if the serial port -associated with the class is not currently open. -*/ -void Win_QextSerialPort::flush() { - LOCK_MUTEX(); - if (isOpen()) { - FlushFileBuffers(Win_Handle); - } - UNLOCK_MUTEX(); -} - -/*! -\fn qint64 Win_QextSerialPort::size() const -This function will return the number of bytes waiting in the receive queue of the serial port. -It is included primarily to provide a complete QIODevice interface, and will not record errors -in the lastErr member (because it is const). This function is also not thread-safe - in -multithreading situations, use Win_QextSerialPort::bytesAvailable() instead. -*/ -qint64 Win_QextSerialPort::size() const { - int availBytes; - COMSTAT Win_ComStat; - DWORD Win_ErrorMask=0; - ClearCommError(Win_Handle, &Win_ErrorMask, &Win_ComStat); - availBytes = Win_ComStat.cbInQue; - return (qint64)availBytes; -} - -/*! -\fn qint64 Win_QextSerialPort::bytesAvailable() -Returns the number of bytes waiting in the port's receive queue. This function will return 0 if -the port is not currently open, or -1 on error. Error information can be retrieved by calling -Win_QextSerialPort::getLastError(). -*/ -qint64 Win_QextSerialPort::bytesAvailable() { - LOCK_MUTEX(); - if (isOpen()) { - DWORD Errors; - COMSTAT Status; - bool success=ClearCommError(Win_Handle, &Errors, &Status); - translateError(Errors); - if (success) { - lastErr=E_NO_ERROR; - UNLOCK_MUTEX(); - return Status.cbInQue + QIODevice::bytesAvailable(); - } - UNLOCK_MUTEX(); - return (unsigned int)-1; - } - UNLOCK_MUTEX(); - return 0; -} - -/*! -\fn void Win_QextSerialPort::translateError(ulong error) -Translates a system-specific error code to a QextSerialPort error code. Used internally. -*/ -void Win_QextSerialPort::translateError(ulong error) { - if (error&CE_BREAK) { - lastErr=E_BREAK_CONDITION; - } - else if (error&CE_FRAME) { - lastErr=E_FRAMING_ERROR; - } - else if (error&CE_IOE) { - lastErr=E_IO_ERROR; - } - else if (error&CE_MODE) { - lastErr=E_INVALID_FD; - } - else if (error&CE_OVERRUN) { - lastErr=E_BUFFER_OVERRUN; - } - else if (error&CE_RXPARITY) { - lastErr=E_RECEIVE_PARITY_ERROR; - } - else if (error&CE_RXOVER) { - lastErr=E_RECEIVE_OVERFLOW; - } - else if (error&CE_TXFULL) { - lastErr=E_TRANSMIT_OVERFLOW; - } -} - -/*! -\fn qint64 Win_QextSerialPort::readData(char *data, qint64 maxSize) -Reads a block of data from the serial port. This function will read at most maxlen bytes from -the serial port and place them in the buffer pointed to by data. Return value is the number of -bytes actually read, or -1 on error. - -\warning before calling this function ensure that serial port associated with this class -is currently open (use isOpen() function to check if port is open). -*/ -qint64 Win_QextSerialPort::readData(char *data, qint64 maxSize) -{ - DWORD retVal; - - LOCK_MUTEX(); - - retVal = 0; - if (queryMode() == QextSerialBase::EventDriven) { - OVERLAPPED overlapRead; - overlapRead.Internal = 0; - overlapRead.InternalHigh = 0; - overlapRead.Offset = 0; - overlapRead.OffsetHigh = 0; - overlapRead.hEvent = CreateEvent(NULL, true, false, NULL); - if (!ReadFile(Win_Handle, (void*)data, (DWORD)maxSize, & retVal, & overlapRead)) { - if (GetLastError() == ERROR_IO_PENDING) - GetOverlappedResult(Win_Handle, & overlapRead, & retVal, true); - else { - lastErr = E_READ_FAILED; - retVal = (DWORD)-1; - } - } - CloseHandle(overlapRead.hEvent); - } else if (!ReadFile(Win_Handle, (void*)data, (DWORD)maxSize, & retVal, NULL)) { - lastErr = E_READ_FAILED; - retVal = (DWORD)-1; - } - - UNLOCK_MUTEX(); - - return (qint64)retVal; -} - -/*! -\fn qint64 Win_QextSerialPort::writeData(const char *data, qint64 maxSize) -Writes a block of data to the serial port. This function will write len bytes -from the buffer pointed to by data to the serial port. Return value is the number -of bytes actually written, or -1 on error. - -\warning before calling this function ensure that serial port associated with this class -is currently open (use isOpen() function to check if port is open). -*/ -qint64 Win_QextSerialPort::writeData(const char *data, qint64 maxSize) -{ - DWORD retVal; - - LOCK_MUTEX(); - - retVal = 0; - if (queryMode() == QextSerialBase::EventDriven) { - bytesToWriteLock->lockForWrite(); - _bytesToWrite += maxSize; - bytesToWriteLock->unlock(); - overlapWrite.Internal = 0; - overlapWrite.InternalHigh = 0; - overlapWrite.Offset = 0; - overlapWrite.OffsetHigh = 0; - overlapWrite.hEvent = CreateEvent(NULL, true, false, NULL); - if (!WriteFile(Win_Handle, (void*)data, (DWORD)maxSize, & retVal, & overlapWrite)) { - lastErr = E_WRITE_FAILED; - retVal = (DWORD)-1; - } else - retVal = maxSize; - } else if (!WriteFile(Win_Handle, (void*)data, (DWORD)maxSize, & retVal, NULL)) { - lastErr = E_WRITE_FAILED; - retVal = (DWORD)-1; - } - - UNLOCK_MUTEX(); - - return (qint64)retVal; -} - -/*! -\fn void Win_QextSerialPort::ungetChar(char c) -This function is included to implement the full QIODevice interface, and currently has no -purpose within this class. This function is meaningless on an unbuffered device and currently -only prints a warning message to that effect. -*/ -void Win_QextSerialPort::ungetChar(char c) { - - /*meaningless on unbuffered sequential device - return error and print a warning*/ - TTY_WARNING("Win_QextSerialPort: ungetChar() called on an unbuffered sequential device - operation is meaningless"); -} - -/*! -\fn void Win_QextSerialPort::setFlowControl(FlowType flow) -Sets the flow control used by the port. Possible values of flow are: -\verbatim - FLOW_OFF No flow control - FLOW_HARDWARE Hardware (RTS/CTS) flow control - FLOW_XONXOFF Software (XON/XOFF) flow control -\endverbatim -*/ -void Win_QextSerialPort::setFlowControl(FlowType flow) { - LOCK_MUTEX(); - if (Settings.FlowControl!=flow) { - Settings.FlowControl=flow; - } - if (isOpen()) { - switch(flow) { - - /*no flow control*/ - case FLOW_OFF: - Win_CommConfig.dcb.fOutxCtsFlow=FALSE; - Win_CommConfig.dcb.fRtsControl=RTS_CONTROL_DISABLE; - Win_CommConfig.dcb.fInX=FALSE; - Win_CommConfig.dcb.fOutX=FALSE; - SetCommConfig(Win_Handle, &Win_CommConfig, sizeof(COMMCONFIG)); - break; - - /*software (XON/XOFF) flow control*/ - case FLOW_XONXOFF: - Win_CommConfig.dcb.fOutxCtsFlow=FALSE; - Win_CommConfig.dcb.fRtsControl=RTS_CONTROL_DISABLE; - Win_CommConfig.dcb.fInX=TRUE; - Win_CommConfig.dcb.fOutX=TRUE; - SetCommConfig(Win_Handle, &Win_CommConfig, sizeof(COMMCONFIG)); - break; - - case FLOW_HARDWARE: - Win_CommConfig.dcb.fOutxCtsFlow=TRUE; - Win_CommConfig.dcb.fRtsControl=RTS_CONTROL_HANDSHAKE; - Win_CommConfig.dcb.fInX=FALSE; - Win_CommConfig.dcb.fOutX=FALSE; - SetCommConfig(Win_Handle, &Win_CommConfig, sizeof(COMMCONFIG)); - break; - } - } - UNLOCK_MUTEX(); -} - -/*! -\fn void Win_QextSerialPort::setParity(ParityType parity) -Sets the parity associated with the serial port. The possible values of parity are: -\verbatim - PAR_SPACE Space Parity - PAR_MARK Mark Parity - PAR_NONE No Parity - PAR_EVEN Even Parity - PAR_ODD Odd Parity -\endverbatim -*/ -void Win_QextSerialPort::setParity(ParityType parity) { - LOCK_MUTEX(); - if (Settings.Parity!=parity) { - Settings.Parity=parity; - } - if (isOpen()) { - Win_CommConfig.dcb.Parity=(unsigned char)parity; - switch (parity) { - - /*space parity*/ - case PAR_SPACE: - if (Settings.DataBits==DATA_8) { - TTY_PORTABILITY_WARNING("Win_QextSerialPort Portability Warning: Space parity with 8 data bits is not supported by POSIX systems."); - } - Win_CommConfig.dcb.fParity=TRUE; - break; - - /*mark parity - WINDOWS ONLY*/ - case PAR_MARK: - TTY_PORTABILITY_WARNING("Win_QextSerialPort Portability Warning: Mark parity is not supported by POSIX systems"); - Win_CommConfig.dcb.fParity=TRUE; - break; - - /*no parity*/ - case PAR_NONE: - Win_CommConfig.dcb.fParity=FALSE; - break; - - /*even parity*/ - case PAR_EVEN: - Win_CommConfig.dcb.fParity=TRUE; - break; - - /*odd parity*/ - case PAR_ODD: - Win_CommConfig.dcb.fParity=TRUE; - break; - } - SetCommConfig(Win_Handle, &Win_CommConfig, sizeof(COMMCONFIG)); - } - UNLOCK_MUTEX(); -} - -/*! -\fn void Win_QextSerialPort::setDataBits(DataBitsType dataBits) -Sets the number of data bits used by the serial port. Possible values of dataBits are: -\verbatim - DATA_5 5 data bits - DATA_6 6 data bits - DATA_7 7 data bits - DATA_8 8 data bits -\endverbatim - -\note -This function is subject to the following restrictions: -\par - 5 data bits cannot be used with 2 stop bits. -\par - 1.5 stop bits can only be used with 5 data bits. -\par - 8 data bits cannot be used with space parity on POSIX systems. - -*/ -void Win_QextSerialPort::setDataBits(DataBitsType dataBits) { - LOCK_MUTEX(); - if (Settings.DataBits!=dataBits) { - if ((Settings.StopBits==STOP_2 && dataBits==DATA_5) || - (Settings.StopBits==STOP_1_5 && dataBits!=DATA_5)) { - } - else { - Settings.DataBits=dataBits; - } - } - if (isOpen()) { - switch(dataBits) { - - /*5 data bits*/ - case DATA_5: - if (Settings.StopBits==STOP_2) { - TTY_WARNING("Win_QextSerialPort: 5 Data bits cannot be used with 2 stop bits."); - } - else { - Win_CommConfig.dcb.ByteSize=5; - SetCommConfig(Win_Handle, &Win_CommConfig, sizeof(COMMCONFIG)); - } - break; - - /*6 data bits*/ - case DATA_6: - if (Settings.StopBits==STOP_1_5) { - TTY_WARNING("Win_QextSerialPort: 6 Data bits cannot be used with 1.5 stop bits."); - } - else { - Win_CommConfig.dcb.ByteSize=6; - SetCommConfig(Win_Handle, &Win_CommConfig, sizeof(COMMCONFIG)); - } - break; - - /*7 data bits*/ - case DATA_7: - if (Settings.StopBits==STOP_1_5) { - TTY_WARNING("Win_QextSerialPort: 7 Data bits cannot be used with 1.5 stop bits."); - } - else { - Win_CommConfig.dcb.ByteSize=7; - SetCommConfig(Win_Handle, &Win_CommConfig, sizeof(COMMCONFIG)); - } - break; - - /*8 data bits*/ - case DATA_8: - if (Settings.StopBits==STOP_1_5) { - TTY_WARNING("Win_QextSerialPort: 8 Data bits cannot be used with 1.5 stop bits."); - } - else { - Win_CommConfig.dcb.ByteSize=8; - SetCommConfig(Win_Handle, &Win_CommConfig, sizeof(COMMCONFIG)); - } - break; - } - } - UNLOCK_MUTEX(); -} - -/*! -\fn void Win_QextSerialPort::setStopBits(StopBitsType stopBits) -Sets the number of stop bits used by the serial port. Possible values of stopBits are: -\verbatim - STOP_1 1 stop bit - STOP_1_5 1.5 stop bits - STOP_2 2 stop bits -\endverbatim - -\note -This function is subject to the following restrictions: -\par - 2 stop bits cannot be used with 5 data bits. -\par - 1.5 stop bits cannot be used with 6 or more data bits. -\par - POSIX does not support 1.5 stop bits. -*/ -void Win_QextSerialPort::setStopBits(StopBitsType stopBits) { - LOCK_MUTEX(); - if (Settings.StopBits!=stopBits) { - if ((Settings.DataBits==DATA_5 && stopBits==STOP_2) || - (stopBits==STOP_1_5 && Settings.DataBits!=DATA_5)) { - } - else { - Settings.StopBits=stopBits; - } - } - if (isOpen()) { - switch (stopBits) { - - /*one stop bit*/ - case STOP_1: - Win_CommConfig.dcb.StopBits=ONESTOPBIT; - SetCommConfig(Win_Handle, &Win_CommConfig, sizeof(COMMCONFIG)); - break; - - /*1.5 stop bits*/ - case STOP_1_5: - TTY_PORTABILITY_WARNING("Win_QextSerialPort Portability Warning: 1.5 stop bit operation is not supported by POSIX."); - if (Settings.DataBits!=DATA_5) { - TTY_WARNING("Win_QextSerialPort: 1.5 stop bits can only be used with 5 data bits"); - } - else { - Win_CommConfig.dcb.StopBits=ONE5STOPBITS; - SetCommConfig(Win_Handle, &Win_CommConfig, sizeof(COMMCONFIG)); - } - break; - - /*two stop bits*/ - case STOP_2: - if (Settings.DataBits==DATA_5) { - TTY_WARNING("Win_QextSerialPort: 2 stop bits cannot be used with 5 data bits"); - } - else { - Win_CommConfig.dcb.StopBits=TWOSTOPBITS; - SetCommConfig(Win_Handle, &Win_CommConfig, sizeof(COMMCONFIG)); - } - break; - } - } - UNLOCK_MUTEX(); -} - -/*! -\fn void Win_QextSerialPort::setBaudRate(BaudRateType baudRate) -Sets the baud rate of the serial port. Note that not all rates are applicable on -all platforms. The following table shows translations of the various baud rate -constants on Windows(including NT/2000) and POSIX platforms. Speeds marked with an * -are speeds that are usable on both Windows and POSIX. -\verbatim - - RATE Windows Speed POSIX Speed - ----------- ------------- ----------- - BAUD50 110 50 - BAUD75 110 75 - *BAUD110 110 110 - BAUD134 110 134.5 - BAUD150 110 150 - BAUD200 110 200 - *BAUD300 300 300 - *BAUD600 600 600 - *BAUD1200 1200 1200 - BAUD1800 1200 1800 - *BAUD2400 2400 2400 - *BAUD4800 4800 4800 - *BAUD9600 9600 9600 - BAUD14400 14400 9600 - *BAUD19200 19200 19200 - *BAUD38400 38400 38400 - BAUD56000 56000 38400 - *BAUD57600 57600 57600 - BAUD76800 57600 76800 - *BAUD115200 115200 115200 - BAUD128000 128000 115200 - BAUD256000 256000 115200 -\endverbatim -*/ -void Win_QextSerialPort::setBaudRate(BaudRateType baudRate) { - LOCK_MUTEX(); - if (Settings.BaudRate!=baudRate) { - switch (baudRate) { - case BAUD50: - case BAUD75: - case BAUD134: - case BAUD150: - case BAUD200: - Settings.BaudRate=BAUD110; - break; - - case BAUD1800: - Settings.BaudRate=BAUD1200; - break; - - case BAUD76800: - Settings.BaudRate=BAUD57600; - break; - - default: - Settings.BaudRate=baudRate; - break; - } - } - if (isOpen()) { - switch (baudRate) { - - /*50 baud*/ - case BAUD50: - TTY_WARNING("Win_QextSerialPort: Windows does not support 50 baud operation. Switching to 110 baud."); - Win_CommConfig.dcb.BaudRate=CBR_110; - break; - - /*75 baud*/ - case BAUD75: - TTY_WARNING("Win_QextSerialPort: Windows does not support 75 baud operation. Switching to 110 baud."); - Win_CommConfig.dcb.BaudRate=CBR_110; - break; - - /*110 baud*/ - case BAUD110: - Win_CommConfig.dcb.BaudRate=CBR_110; - break; - - /*134.5 baud*/ - case BAUD134: - TTY_WARNING("Win_QextSerialPort: Windows does not support 134.5 baud operation. Switching to 110 baud."); - Win_CommConfig.dcb.BaudRate=CBR_110; - break; - - /*150 baud*/ - case BAUD150: - TTY_WARNING("Win_QextSerialPort: Windows does not support 150 baud operation. Switching to 110 baud."); - Win_CommConfig.dcb.BaudRate=CBR_110; - break; - - /*200 baud*/ - case BAUD200: - TTY_WARNING("Win_QextSerialPort: Windows does not support 200 baud operation. Switching to 110 baud."); - Win_CommConfig.dcb.BaudRate=CBR_110; - break; - - /*300 baud*/ - case BAUD300: - Win_CommConfig.dcb.BaudRate=CBR_300; - break; - - /*600 baud*/ - case BAUD600: - Win_CommConfig.dcb.BaudRate=CBR_600; - break; - - /*1200 baud*/ - case BAUD1200: - Win_CommConfig.dcb.BaudRate=CBR_1200; - break; - - /*1800 baud*/ - case BAUD1800: - TTY_WARNING("Win_QextSerialPort: Windows does not support 1800 baud operation. Switching to 1200 baud."); - Win_CommConfig.dcb.BaudRate=CBR_1200; - break; - - /*2400 baud*/ - case BAUD2400: - Win_CommConfig.dcb.BaudRate=CBR_2400; - break; - - /*4800 baud*/ - case BAUD4800: - Win_CommConfig.dcb.BaudRate=CBR_4800; - break; - - /*9600 baud*/ - case BAUD9600: - Win_CommConfig.dcb.BaudRate=CBR_9600; - break; - - /*14400 baud*/ - case BAUD14400: - TTY_PORTABILITY_WARNING("Win_QextSerialPort Portability Warning: POSIX does not support 14400 baud operation."); - Win_CommConfig.dcb.BaudRate=CBR_14400; - break; - - /*19200 baud*/ - case BAUD19200: - Win_CommConfig.dcb.BaudRate=CBR_19200; - break; - - /*38400 baud*/ - case BAUD38400: - Win_CommConfig.dcb.BaudRate=CBR_38400; - break; - - /*56000 baud*/ - case BAUD56000: - TTY_PORTABILITY_WARNING("Win_QextSerialPort Portability Warning: POSIX does not support 56000 baud operation."); - Win_CommConfig.dcb.BaudRate=CBR_56000; - break; - - /*57600 baud*/ - case BAUD57600: - Win_CommConfig.dcb.BaudRate=CBR_57600; - break; - - /*76800 baud*/ - case BAUD76800: - TTY_WARNING("Win_QextSerialPort: Windows does not support 76800 baud operation. Switching to 57600 baud."); - Win_CommConfig.dcb.BaudRate=CBR_57600; - break; - - /*115200 baud*/ - case BAUD115200: - Win_CommConfig.dcb.BaudRate=CBR_115200; - break; - - /*128000 baud*/ - case BAUD128000: - TTY_PORTABILITY_WARNING("Win_QextSerialPort Portability Warning: POSIX does not support 128000 baud operation."); - Win_CommConfig.dcb.BaudRate=CBR_128000; - break; - - /*256000 baud*/ - case BAUD256000: - TTY_PORTABILITY_WARNING("Win_QextSerialPort Portability Warning: POSIX does not support 256000 baud operation."); - Win_CommConfig.dcb.BaudRate=CBR_256000; - break; - } - SetCommConfig(Win_Handle, &Win_CommConfig, sizeof(COMMCONFIG)); - } - UNLOCK_MUTEX(); -} - -/*! -\fn void Win_QextSerialPort::setDtr(bool set) -Sets DTR line to the requested state (high by default). This function will have no effect if -the port associated with the class is not currently open. -*/ -void Win_QextSerialPort::setDtr(bool set) { - LOCK_MUTEX(); - if (isOpen()) { - if (set) { - EscapeCommFunction(Win_Handle, SETDTR); - } - else { - EscapeCommFunction(Win_Handle, CLRDTR); - } - } - UNLOCK_MUTEX(); -} - -/*! -\fn void Win_QextSerialPort::setRts(bool set) -Sets RTS line to the requested state (high by default). This function will have no effect if -the port associated with the class is not currently open. -*/ -void Win_QextSerialPort::setRts(bool set) { - LOCK_MUTEX(); - if (isOpen()) { - if (set) { - EscapeCommFunction(Win_Handle, SETRTS); - } - else { - EscapeCommFunction(Win_Handle, CLRRTS); - } - } - UNLOCK_MUTEX(); -} - -/*! -\fn ulong Win_QextSerialPort::lineStatus(void) -returns the line status as stored by the port function. This function will retrieve the states -of the following lines: DCD, CTS, DSR, and RI. On POSIX systems, the following additional lines -can be monitored: DTR, RTS, Secondary TXD, and Secondary RXD. The value returned is an unsigned -long with specific bits indicating which lines are high. The following constants should be used -to examine the states of individual lines: - -\verbatim -Mask Line ------- ---- -LS_CTS CTS -LS_DSR DSR -LS_DCD DCD -LS_RI RI -\endverbatim - -This function will return 0 if the port associated with the class is not currently open. -*/ -ulong Win_QextSerialPort::lineStatus(void) { - unsigned long Status=0, Temp=0; - LOCK_MUTEX(); - if (isOpen()) { - GetCommModemStatus(Win_Handle, &Temp); - if (Temp&MS_CTS_ON) { - Status|=LS_CTS; - } - if (Temp&MS_DSR_ON) { - Status|=LS_DSR; - } - if (Temp&MS_RING_ON) { - Status|=LS_RI; - } - if (Temp&MS_RLSD_ON) { - Status|=LS_DCD; - } - } - UNLOCK_MUTEX(); - return Status; -} - -bool Win_QextSerialPort::waitForReadyRead(int msecs) -{ - //@todo implement - return false; -} - -qint64 Win_QextSerialPort::bytesToWrite() const -{ - return _bytesToWrite; -} - -void Win_QextSerialPort::monitorCommEvent() -{ - DWORD eventMask = 0; - - ResetEvent(overlap.hEvent); - if (!WaitCommEvent(Win_Handle, & eventMask, & overlap)) - if (GetLastError() != ERROR_IO_PENDING) - qCritical("WaitCommEvent error %ld\n", GetLastError()); - - if (WaitForSingleObject(overlap.hEvent, INFINITE) == WAIT_OBJECT_0) { - //overlap event occured - DWORD undefined; - if (!GetOverlappedResult(Win_Handle, & overlap, & undefined, false)) { - qWarning("Comm event overlapped error %ld", GetLastError()); - return; - } - if (eventMask & EV_RXCHAR) { - if (sender() != this) - emit readyRead(); - } - if (eventMask & EV_TXEMPTY) { - DWORD numBytes; - GetOverlappedResult(Win_Handle, & overlapWrite, & numBytes, true); - bytesToWriteLock->lockForWrite(); - if (sender() != this) - emit bytesWritten(bytesToWrite()); - _bytesToWrite = 0; - bytesToWriteLock->unlock(); - } - if (eventMask & EV_DSR) - if (lineStatus() & LS_DSR) - emit dsrChanged(true); - else - emit dsrChanged(false); - } -} - -void Win_QextSerialPort::terminateCommWait() -{ - SetCommMask(Win_Handle, 0); -} - - -/*! -\fn void Win_QextSerialPort::setTimeout(ulong millisec); -Sets the read and write timeouts for the port to millisec milliseconds. -Setting 0 for both sec and millisec indicates that timeouts are not used for read nor -write operations. Setting -1 indicates that read and write should return immediately. - -\note this function does nothing in event driven mode. -*/ -void Win_QextSerialPort::setTimeout(long millisec) { - LOCK_MUTEX(); - Settings.Timeout_Millisec = millisec; - - if (millisec == -1) { - Win_CommTimeouts.ReadIntervalTimeout = MAXDWORD; - Win_CommTimeouts.ReadTotalTimeoutConstant = 0; - } else { - Win_CommTimeouts.ReadIntervalTimeout = millisec; - Win_CommTimeouts.ReadTotalTimeoutConstant = millisec; - } - Win_CommTimeouts.ReadTotalTimeoutMultiplier = 0; - Win_CommTimeouts.WriteTotalTimeoutMultiplier = millisec; - Win_CommTimeouts.WriteTotalTimeoutConstant = 0; - if (queryMode() != QextSerialBase::EventDriven) - SetCommTimeouts(Win_Handle, &Win_CommTimeouts); - - UNLOCK_MUTEX(); -} - - -Win_QextSerialThread::Win_QextSerialThread(Win_QextSerialPort * qesp): - QThread() -{ - this->qesp = qesp; - terminate = false; -} - -void Win_QextSerialThread::stop() -{ - terminate = true; - qesp->terminateCommWait(); -} - -void Win_QextSerialThread::run() -{ - while (!terminate) - qesp->monitorCommEvent(); - terminate = false; -} diff --git a/src/serialport/win_qextserialport.h b/src/serialport/win_qextserialport.h deleted file mode 100644 index 6b5375e9..00000000 --- a/src/serialport/win_qextserialport.h +++ /dev/null @@ -1,137 +0,0 @@ -#ifndef _WIN_QEXTSERIALPORT_H_ -#define _WIN_QEXTSERIALPORT_H_ - -#include "qextserialbase.h" -#include -#include - - -/*if all warning messages are turned off, flag portability warnings to be turned off as well*/ -#ifdef _TTY_NOWARN_ -#define _TTY_NOWARN_PORT_ -#endif - -class QReadWriteLock; -class Win_QextSerialThread; - - -/*! -\author Stefan Sander -\author Michal Policht - -A cross-platform serial port class. -This class encapsulates the Windows portion of QextSerialPort. The user will be notified of -errors and possible portability conflicts at run-time by default - this behavior can be turned -off by defining _TTY_NOWARN_ (to turn off all warnings) or _TTY_NOWARN_PORT_ (to turn off -portability warnings) in the project. Note that defining _TTY_NOWARN_ also defines -_TTY_NOWARN_PORT_. - -\note -On Windows NT/2000/XP this class uses Win32 serial port functions by default. The user may -select POSIX behavior under NT, 2000, or XP ONLY by defining _TTY_POSIX_ in the project. I can -make no guarantees as to the quality of POSIX support under NT/2000 however. - -\todo remove copy constructor and assign operator. -*/ -class Win_QextSerialPort: public QextSerialBase -{ - Q_OBJECT - friend class Win_QextSerialThread; - - private: - /*! - * This method is a part of constructor. - */ - void init(); - - protected: - HANDLE Win_Handle; - HANDLE threadStartEvent; - HANDLE threadTerminateEvent; - OVERLAPPED overlap; - OVERLAPPED overlapWrite; - COMMCONFIG Win_CommConfig; - COMMTIMEOUTS Win_CommTimeouts; - QReadWriteLock * bytesToWriteLock; ///< @todo maybe move to QextSerialBase. - qint64 _bytesToWrite; ///< @todo maybe move to QextSerialBase (and implement in POSIX). - Win_QextSerialThread * overlapThread; ///< @todo maybe move to QextSerialBase (and implement in POSIX). - - void monitorCommEvent(); - void terminateCommWait(); - virtual qint64 readData(char *data, qint64 maxSize); - virtual qint64 writeData(const char *data, qint64 maxSize); - - public: - Win_QextSerialPort(); - Win_QextSerialPort(Win_QextSerialPort const& s); - Win_QextSerialPort(const QString & name, QextSerialBase::QueryMode mode = QextSerialBase::Polling); - Win_QextSerialPort(const PortSettings& settings, QextSerialBase::QueryMode mode = QextSerialBase::Polling); - Win_QextSerialPort(const QString & name, const PortSettings& settings, QextSerialBase::QueryMode mode = QextSerialBase::Polling); - Win_QextSerialPort& operator=(const Win_QextSerialPort& s); - virtual ~Win_QextSerialPort(); - virtual bool open(OpenMode mode); - virtual void close(); - virtual void flush(); - virtual qint64 size() const; - virtual void ungetChar(char c); - virtual void setFlowControl(FlowType); - virtual void setParity(ParityType); - virtual void setDataBits(DataBitsType); - virtual void setStopBits(StopBitsType); - virtual void setBaudRate(BaudRateType); - virtual void setDtr(bool set=true); - virtual void setRts(bool set=true); - virtual ulong lineStatus(void); - virtual qint64 bytesAvailable(); - virtual void translateError(ulong); - virtual void setTimeout(long); - - /*! - * Return number of bytes waiting in the buffer. Currently this shows number - * of bytes queued within write() and before the TX_EMPTY event occured. TX_EMPTY - * event is created whenever last character in the system buffer was sent. - * - * \return number of bytes queued within write(), before the first TX_EMPTY - * event occur. - * - * \warning this function may not give you expected results since TX_EMPTY may occur - * while writing data to the buffer. Eventually some TX_EMPTY events may not be - * catched. - * - * \note this function always returns 0 in polling mode. - * - * \see flush(). - */ - virtual qint64 bytesToWrite() const; - - virtual bool waitForReadyRead(int msecs); ///< @todo implement. -}; - -/*! - * This thread monitors communication events. - */ -class Win_QextSerialThread: public QThread -{ - Win_QextSerialPort * qesp; - bool terminate; - - public: - /*! - * Constructor. - * - * \param qesp valid serial port object. - */ - Win_QextSerialThread(Win_QextSerialPort * qesp); - - /*! - * Stop the thread. - */ - void stop(); - - protected: - //overriden - virtual void run(); - -}; - -#endif diff --git a/src/widgets/qqtapplication.cpp b/src/widgets/qqtapplication.cpp index 10faf681..6e027fcb 100644 --- a/src/widgets/qqtapplication.cpp +++ b/src/widgets/qqtapplication.cpp @@ -11,16 +11,8 @@ #include #include -QQtApplication::QQtApplication(int &argc, char **argv - #ifndef Q_QDOC - , int flags - #endif - ) : - QApplication(argc, argv - #ifndef Q_QDOC - , flags - #endif - ), +QQtApplication::QQtApplication(int &argc, char **argv) : + QApplication(argc, argv), bUPanAutoRun(false) { #if QT_VERSION < QT_VERSION_CHECK(5,0,0) diff --git a/src/widgets/qqtapplication.h b/src/widgets/qqtapplication.h index 3aee327a..50c43e9c 100644 --- a/src/widgets/qqtapplication.h +++ b/src/widgets/qqtapplication.h @@ -9,11 +9,7 @@ class QQTSHARED_EXPORT QQtApplication : public QApplication Q_OBJECT public: public: - explicit QQtApplication(int &argc, char **argv -#ifndef Q_QDOC - , int = ApplicationFlags -#endif - ); + explicit QQtApplication(int &argc, char **argv); void setLanguage(QString qmfile = "./lang/zh_CN.qm"); //palette