abstract Device to support multiple device types

This commit is contained in:
Sean Rhea
2009-08-09 14:49:18 -07:00
parent 9624cd03a9
commit 502cb4b60f
6 changed files with 97 additions and 9 deletions

43
src/Device.cpp Normal file
View File

@@ -0,0 +1,43 @@
/*
* Copyright (c) 2008 Sean C. Rhea (srhea@srhea.net)
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
* Software Foundation; either version 2 of the License, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc., 51
* Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "Device.h"
static QMap<QString,Device*> devices;
QList<QString>
Device::deviceTypes()
{
return devices.keys();
}
Device &
Device::device(const QString &deviceType)
{
assert(devices.contains(deviceType));
return *devices.value(deviceType);
}
bool
Device::addDevice(const QString &deviceType, Device *device)
{
assert(!devices.contains(deviceType));
devices.insert(deviceType, device);
return true;
}

41
src/Device.h Normal file
View File

@@ -0,0 +1,41 @@
/*
* Copyright (c) 2008 Sean C. Rhea (srhea@srhea.net)
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
* Software Foundation; either version 2 of the License, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc., 51
* Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef _GC_Device_h
#define _GC_Device_h 1
#include "CommPort.h"
#include <boost/function.hpp>
struct Device
{
virtual ~Device() {}
typedef boost::function<bool (const QString &statusText)> StatusCallback;
virtual bool download(CommPortPtr dev, const QDir &tmpdir,
QString &tmpname, QString &filename,
StatusCallback statusCallback, QString &err) = 0;
static QList<QString> deviceTypes();
static Device &device(const QString &deviceType);
static bool addDevice(const QString &deviceType, Device *device);
};
#endif // _GC_Device_h

View File

@@ -19,8 +19,8 @@
*/
#include "DownloadRideDialog.h"
#include "Device.h"
#include "MainWindow.h"
#include "PowerTapDevice.h"
#include <assert.h>
#include <errno.h>
#include <QtGui>
@@ -139,7 +139,8 @@ DownloadRideDialog::downloadClicked()
assert(dev);
QString err;
QString tmpname, filename;
if (!PowerTapDevice::download(
Device &device = Device::device("PowerTap");
if (!device.download(
dev, home, tmpname, filename,
boost::bind(&DownloadRideDialog::statusCallback, this, _1), err))
{

View File

@@ -22,6 +22,9 @@
#define PT_DEBUG false
static bool powerTapRegistered =
Device::addDevice("PowerTap", new PowerTapDevice());
static bool
hasNewline(const char *buf, int len)
{

View File

@@ -20,15 +20,13 @@
#define _GC_PowerTapDevice_h 1
#include "CommPort.h"
#include <boost/function.hpp>
#include "Device.h"
struct PowerTapDevice
struct PowerTapDevice : public Device
{
typedef boost::function<bool (const QString &statusText)> StatusCallback;
static bool download(CommPortPtr dev, const QDir &tmpdir,
QString &tmpname, QString &filename,
StatusCallback statusCallback, QString &err);
virtual bool download(CommPortPtr dev, const QDir &tmpdir,
QString &tmpname, QString &filename,
StatusCallback statusCallback, QString &err);
};
#endif // _GC_PowerTapDevice_h

View File

@@ -30,6 +30,7 @@ HEADERS += \
CpintPlot.h \
CsvRideFile.h \
DBAccess.h \
Device.h \
DownloadRideDialog.h \
MainWindow.h \
PfPvPlot.h \
@@ -73,6 +74,7 @@ SOURCES += \
CpintPlot.cpp \
CsvRideFile.cpp \
DBAccess.cpp \
Device.cpp \
DownloadRideDialog.cpp \
MainWindow.cpp \
PfPvPlot.cpp \