Go to the documentation of this file.00001
00029 #ifndef ABSTRACTSENSOR_I_H
00030 #define ABSTRACTSENSOR_I_H
00031
00032 #include <QtDBus/QtDBus>
00033 #include <QList>
00034 #include <QVector>
00035 #include <QString>
00036
00037 #include "sfwerror.h"
00038 #include "serviceinfo.h"
00039 #include "socketreader.h"
00040 #include "datatypes/datarange.h"
00041
00045 class AbstractSensorChannelInterface : public QObject
00046 {
00047 Q_OBJECT
00048 Q_DISABLE_COPY(AbstractSensorChannelInterface)
00049 Q_PROPERTY(int sessionId READ sessionId)
00050 Q_PROPERTY(SensorError errorCode READ errorCode)
00051 Q_PROPERTY(QString errorString READ errorString)
00052 Q_PROPERTY(QString description READ description)
00053 Q_PROPERTY(QString id READ id)
00054 Q_PROPERTY(int interval READ interval WRITE setInterval)
00055 Q_PROPERTY(bool standbyOverride READ standbyOverride WRITE setStandbyOverride)
00056 Q_PROPERTY(QString type READ type)
00057 Q_PROPERTY(unsigned int bufferInterval READ bufferInterval WRITE setBufferInterval)
00058 Q_PROPERTY(unsigned int bufferSize READ bufferSize WRITE setBufferSize)
00059 Q_PROPERTY(bool hwBuffering READ hwBuffering)
00060 Q_PROPERTY(bool downsampling READ downsampling WRITE setDownsampling)
00061
00062 public:
00063
00067 virtual ~AbstractSensorChannelInterface();
00068
00075 bool release();
00076
00082 int sessionId() const;
00083
00089 SensorError errorCode();
00090
00096 QString errorString();
00097
00103 QString description();
00104
00110 QString id();
00111
00119 int interval();
00120
00128 void setInterval(int value);
00129
00137 bool standbyOverride();
00138
00147 bool setStandbyOverride(bool override);
00148
00155 unsigned int bufferInterval();
00156
00164 void setBufferInterval(unsigned int value);
00165
00173 bool downsampling();
00174
00184 bool setDownsampling(bool value);
00185
00191 IntegerRangeList getAvailableBufferIntervals();
00192
00199 unsigned int bufferSize();
00200
00207 void setBufferSize(unsigned int value);
00208
00215 IntegerRangeList getAvailableBufferSizes();
00216
00222 QString type();
00223
00230 virtual QDBusReply<void> start();
00231
00237 virtual QDBusReply<void> stop();
00238
00244 DataRangeList getAvailableIntervals();
00245
00251 DataRangeList getAvailableDataRanges();
00252
00258 DataRange getCurrentDataRange();
00259
00266 void requestDataRange(DataRange range);
00267
00271 void removeDataRangeRequest();
00272
00280 bool setDataRangeIndex(int dataRangeIndex);
00281
00287 bool hwBuffering();
00288
00295 bool isValid() const;
00296
00297 private:
00304 void setError(SensorError errorCode, const QString& errorString);
00305
00309 void clearError();
00310
00314 SocketReader& getSocketReader() const;
00315
00316 private Q_SLOTS:
00324 QDBusReply<void> setInterval(int sessionId, int value);
00325
00333 QDBusReply<bool> setStandbyOverride(int sessionId, bool value);
00334
00342 QDBusReply<void> setBufferInterval(int sessionId, unsigned int value);
00343
00351 QDBusReply<void> setBufferSize(int sessionId, unsigned int value);
00352
00360 QDBusReply<void> setDownsampling(int sessionId, bool value);
00361
00368 QDBusReply<void> start(int sessionId);
00369
00376 QDBusReply<void> stop(int sessionId);
00377
00381 void dataReceived();
00382
00383 protected:
00391 AbstractSensorChannelInterface(const QString& path, const char* interfaceName, int sessionId);
00392
00399 bool read(void* buffer, int size);
00400
00408 template<typename T>
00409 bool read(QVector<T>& values);
00410
00417 virtual bool dataReceivedImpl() = 0;
00418
00427 template<typename T>
00428 T getAccessor(const char* name);
00429
00438 template<typename T>
00439 void setAccessor(const char* name, const T& value);
00440
00445 QDBusMessage call(QDBus::CallMode mode,
00446 const QString& method,
00447 const QVariant& arg1 = QVariant(),
00448 const QVariant& arg2 = QVariant(),
00449 const QVariant& arg3 = QVariant(),
00450 const QVariant& arg4 = QVariant(),
00451 const QVariant& arg5 = QVariant(),
00452 const QVariant& arg6 = QVariant(),
00453 const QVariant& arg7 = QVariant(),
00454 const QVariant& arg8 = QVariant());
00455
00460 QDBusMessage callWithArgumentList(QDBus::CallMode mode, const QString& method, const QList<QVariant>& args);
00461
00466 void dbusConnectNotify(const char* signal);
00467
00468 private:
00469 struct AbstractSensorChannelInterfaceImpl;
00470
00471 AbstractSensorChannelInterfaceImpl* pimpl_;
00472 };
00473
00474 template<typename T>
00475 bool AbstractSensorChannelInterface::read(QVector<T>& values)
00476 {
00477 return getSocketReader().read(values);
00478 }
00479
00480 template<typename T>
00481 T AbstractSensorChannelInterface::getAccessor(const char* name)
00482 {
00483 QDBusReply<T> reply(call(QDBus::Block, QLatin1String(name)));
00484 if(!reply.isValid())
00485 {
00486 qDebug() << "Failed to get '" << name << "' from sensord: " << reply.error().message();
00487 return T();
00488 }
00489 return reply.value();
00490 }
00491
00492 template<typename T>
00493 void AbstractSensorChannelInterface::setAccessor(const char* name, const T& value)
00494 {
00495 QDBusReply<void> reply(call(QDBus::Block, QLatin1String(name), qVariantFromValue(value)));
00496 if(!reply.isValid())
00497 {
00498 qDebug() << "Failed to set '" << name << " = " << value << "' to sensord: " << reply.error().message();
00499 }
00500 }
00501
00502 namespace local {
00503 typedef ::AbstractSensorChannelInterface AbstractSensor;
00504 }
00505
00506 #endif