sensorfw
|
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: // METHODS 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