CommPort: added isOpen method

required to allow Devices to safely close CommPorts after use.

This avoids problems when re-using a device without closing
DownloadRideDialog.
This commit is contained in:
Rainer Clasen
2011-07-21 23:09:24 +02:00
parent 9a394552b3
commit 5013235186
5 changed files with 36 additions and 22 deletions

View File

@@ -35,7 +35,8 @@ class CommPort
static bool addListFunction(ListFunction f);
static QVector<CommPortPtr> listCommPorts(QString &err);
virtual ~CommPort() {}
virtual ~CommPort() {};
virtual bool isOpen() = 0;
virtual bool open(QString &err) = 0;
virtual void close() = 0;
virtual int read(void *buf, size_t nbyte, QString &err) = 0;

View File

@@ -95,27 +95,33 @@ static D2XXWrapper *lib; // singleton lib instance
bool D2XXRegistered = CommPort::addListFunction(&D2XX::myListCommPorts);
D2XX::D2XX(const FT_DEVICE_LIST_INFO_NODE &info) :
info(info), isOpen(false), CommPort( "D2XX" )
CommPort( "D2XX" ), info(info), _isOpen(false)
{
}
D2XX::~D2XX()
{
if (isOpen)
if (_isOpen)
close();
}
bool
D2XX::isOpen()
{
return _isOpen;
}
bool
D2XX::open(QString &err)
{
assert(!isOpen);
assert(!_isOpen);
FT_STATUS ftStatus =
lib->open_ex(info.Description, FT_OPEN_BY_DESCRIPTION, &ftHandle);
if (ftStatus != FT_OK) {
err = QString("FT_Open: %1").arg(ftStatus);
return false;
}
isOpen = true;
_isOpen = true;
ftStatus = lib->set_baud_rate(ftHandle, 9600);
if (ftStatus != FT_OK) {
err = QString("FT_SetBaudRate: %1").arg(ftStatus);
@@ -142,15 +148,15 @@ D2XX::open(QString &err)
void
D2XX::close()
{
assert(isOpen);
assert(_isOpen);
lib->close(ftHandle);
isOpen = false;
_isOpen = false;
}
int
D2XX::read(void *buf, size_t nbyte, QString &err)
{
assert(isOpen);
assert(_isOpen);
DWORD rxbytes;
FT_STATUS ftStatus = lib->get_queue_status(ftHandle, &rxbytes);
if (ftStatus != FT_OK) {
@@ -174,7 +180,7 @@ D2XX::read(void *buf, size_t nbyte, QString &err)
int
D2XX::write(void *buf, size_t nbyte, QString &err)
{
assert(isOpen);
assert(_isOpen);
DWORD n;
FT_STATUS ftStatus = lib->write(ftHandle, buf, nbyte, &n);
if (ftStatus == FT_OK)

View File

@@ -33,7 +33,7 @@ class D2XX : public CommPort
FT_DEVICE_LIST_INFO_NODE info;
FT_HANDLE ftHandle;
bool isOpen;
bool _isOpen;
D2XX(const FT_DEVICE_LIST_INFO_NODE &info);
public:
@@ -41,6 +41,7 @@ class D2XX : public CommPort
static QVector<CommPortPtr> myListCommPorts(QString &err);
virtual ~D2XX();
virtual bool isOpen();
virtual bool open(QString &err);
virtual void close();
virtual int read(void *buf, size_t nbyte, QString &err);

View File

@@ -46,7 +46,7 @@
bool SerialRegistered = CommPort::addListFunction(&Serial::myListCommPorts);
#ifdef Q_OS_WIN32
Serial::Serial(const QString &path) : CommPort("Serial"), path(path), isOpen(false)
Serial::Serial(const QString &path) : CommPort("Serial"), path(path), _isOpen(false)
{
}
#else
@@ -57,12 +57,17 @@ Serial::Serial(const QString &path) : CommPort("Serial"), path(path), fd(-1)
Serial::~Serial()
{
#ifdef Q_OS_WIN32
if (isOpen == true) {
if( isOpen() )
close();
}
}
bool
Serial::isOpen()
{
#ifdef Q_OS_WIN32
return _isOpen;
#else
if (fd >= 0) close();
return fd >= 0;
#endif
}
@@ -129,9 +134,9 @@ Serial::open(QString &err)
fd = CreateFile (deviceFilenameW, GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_DELETE|FILE_SHARE_WRITE|FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
if (fd == INVALID_HANDLE_VALUE) return isOpen = false;
if (fd == INVALID_HANDLE_VALUE) return _isOpen = false;
if (GetCommState (fd, &deviceSettings) == false) return isOpen = false;
if (GetCommState (fd, &deviceSettings) == false) return _isOpen = false;
// so we've opened the comm port lets set it up for
deviceSettings.BaudRate = CBR_9600;
@@ -148,7 +153,7 @@ Serial::open(QString &err)
if (SetCommState(fd, &deviceSettings) == false) {
CloseHandle(fd);
return isOpen = false;
return _isOpen = false;
}
timeouts.ReadIntervalTimeout = 0;
@@ -158,7 +163,7 @@ Serial::open(QString &err)
timeouts.WriteTotalTimeoutMultiplier = 0;
SetCommTimeouts(fd, &timeouts);
return isOpen = true;
return _isOpen = true;
#endif
}
@@ -170,9 +175,9 @@ Serial::close()
::close(fd);
fd = -1;
#else
if (isOpen == true) {
if (_isOpen == true) {
CloseHandle(fd);
isOpen = false;
_isOpen = false;
}
#endif
}

View File

@@ -36,7 +36,7 @@ class Serial : public CommPort
#ifndef Q_OS_WIN32
int fd;
#else
bool isOpen; // don't rely on fd value to determine if
bool _isOpen; // don't rely on fd value to determine if
// the COM port is open
HANDLE fd; // file descriptor for reading from com3
#endif
@@ -47,6 +47,7 @@ class Serial : public CommPort
static QVector<CommPortPtr> myListCommPorts(QString &err);
virtual ~Serial();
virtual bool isOpen();
virtual bool open(QString &err);
virtual void close();
virtual int read(void *buf, size_t nbyte, QString &err);