mirror of
https://github.com/GoldenCheetah/GoldenCheetah.git
synced 2026-04-15 05:32:21 +00:00
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:
@@ -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;
|
||||
|
||||
22
src/D2XX.cpp
22
src/D2XX.cpp
@@ -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)
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user