Hi Timo,
I think we can use the basic input device
accelerometer(adaptors/accelerometeradaptor) on Medfield.
Here are the patches for ALS and Proximity. Both of them are different
from the basic adaptors because of the output format of driver.Please
check and give your opinion.
Thanks,
Leo Yan
diff --git a/adaptors/adaptors.pro b/adaptors/adaptors.pro
index efb4bbf..a2815f0 100644
--- a/adaptors/adaptors.pro
+++ b/adaptors/adaptors.pro
@@ -12,5 +12,6 @@ internal {
kbslideradaptor \
proximityadaptor \
proximityadaptor-evdev \
- mrstaccelerometer
+ mrstaccelerometer \
+ mfldalsadaptor
}
diff --git a/adaptors/mfldalsadaptor/mfldalsadaptor.cpp b/adaptors/mfldalsadaptor/mfldalsadaptor.cpp
new file mode 100644
index 0000000..bfa7004
--- /dev/null
+++ b/adaptors/mfldalsadaptor/mfldalsadaptor.cpp
@@ -0,0 +1,66 @@
+#include <fcntl.h>
+#include <sys/stat.h>
+#include <errno.h>
+
+#include "logging.h"
+#include "config.h"
+#include "mfldalsadaptor.h"
+#include "filters/utils.h"
+#include <QDebug>
+
+#define RANGE_PATH "/sys/bus/i2c/devices/5-0029/apds9802als/sensing_range"
+#define LUX_PATH "/sys/bus/i2c/devices/5-0029/apds9802als/lux_output"
+
+MFLDALSAdaptor::MFLDALSAdaptor(const QString& id) : SysfsAdaptor(id, SysfsAdaptor::IntervalMode)
+{
+ int fd, range;
+
+ fd = open(RANGE_PATH, O_RDONLY);
+ if (fd < 0) {
+ sensordLogW() << "open():" << strerror(errno);
+ return;
+ }
+ if (read(fd, buf, sizeof(buf)) <= 0) {
+ sensordLogW() << "read():" << strerror(errno);
+ close(fd);
+ return;
+ }
+ close(fd);
+
+ sscanf(buf, "%d", &range);
+ introduceAvailableDataRange(DataRange(0, range, 1));
+ sensordLogT() << "Ambient light range: " << range;
+
+ devId = 0;
+ addPath(LUX_PATH, devId);
+ ring_buffer = new DeviceAdaptorRingBuffer<TimedUnsigned>(1024);
+ addAdaptedSensor("als", "MFLD apds9802als", ring_buffer);
+}
+
+MFLDALSAdaptor::~MFLDALSAdaptor()
+{
+ delete ring_buffer;
+}
+
+void MFLDALSAdaptor::processSample(int pathId, int fd)
+{
+ if (pathId != devId) {
+ qDebug() << "pathId != devId";
+ return;
+ }
+
+ lseek(fd, 0, SEEK_SET);
+ if (read(fd, buf, sizeof(buf)) <= 0) {
+ qDebug() << "read() error";
+ sensordLogW() << "read():" << strerror(errno);
+ return;
+ }
+ sensordLogT() << "Ambient light value: " << buf;
+
+ TimedUnsigned* lux = ring_buffer->nextSlot();
+ sscanf(buf, "%d", &lux->value_);
+
+ lux->timestamp_ = Utils::getTimeStamp();
+ ring_buffer->commit();
+ ring_buffer->wakeUpReaders();
+}
diff --git a/adaptors/mfldalsadaptor/mfldalsadaptor.h b/adaptors/mfldalsadaptor/mfldalsadaptor.h
new file mode 100644
index 0000000..9d9e6c0
--- /dev/null
+++ b/adaptors/mfldalsadaptor/mfldalsadaptor.h
@@ -0,0 +1,34 @@
+#ifndef MFLDALSADAPTOR_H
+#define MFLDALSADAPTOR_H
+
+#include "sysfsadaptor.h"
+#include "sensord/deviceadaptorringbuffer.h"
+#include "filters/timedunsigned.h"
+#include <QTime>
+
+
+class MFLDALSAdaptor : public SysfsAdaptor
+{
+ Q_OBJECT;
+public:
+ static DeviceAdaptor* factoryMethod(const QString& id)
+ {
+ return new MFLDALSAdaptor(id);
+ }
+
+protected:
+ MFLDALSAdaptor(const QString& id);
+ ~MFLDALSAdaptor();
+
+ virtual bool setStandbyOverride(const bool override) { Q_UNUSED(override); return false; }
+private:
+
+ void processSample(int pathId, int fd);
+ int devId;
+ char buf[16];
+
+ DeviceAdaptorRingBuffer<TimedUnsigned>* ring_buffer;
+};
+
+#endif
+
diff --git a/adaptors/mfldalsadaptor/mfldalsadaptor.pro b/adaptors/mfldalsadaptor/mfldalsadaptor.pro
new file mode 100644
index 0000000..a723df9
--- /dev/null
+++ b/adaptors/mfldalsadaptor/mfldalsadaptor.pro
@@ -0,0 +1,27 @@
+TEMPLATE = lib
+CONFIG += plugin
+
+TARGET = alsadaptor
+
+include( ../../common-config.pri )
+
+HEADERS += mfldalsadaptor.h \
+ mfldalsadaptorplugin.h
+
+SOURCES += mfldalsadaptor.cpp \
+ mfldalsadaptorplugin.cpp
+
+SENSORFW_INCLUDEPATHS = ../.. \
+ ../../include \
+ ../../sensord \
+ ../../datatypes \
+ ../../filters
+
+DEPENDPATH += $$SENSORFW_INCLUDEPATHS
+INCLUDEPATH += $$SENSORFW_INCLUDEPATHS
+
+include(../../common-install.pri)
+publicheaders.files += $$HEADERS
+target.path = $$PLUGINPATH
+
+INSTALLS += target
diff --git a/adaptors/mfldalsadaptor/mfldalsadaptorplugin.cpp b/adaptors/mfldalsadaptor/mfldalsadaptorplugin.cpp
new file mode 100644
index 0000000..bb3f4bf
--- /dev/null
+++ b/adaptors/mfldalsadaptor/mfldalsadaptorplugin.cpp
@@ -0,0 +1,13 @@
+#include "mfldalsadaptorplugin.h"
+#include "mfldalsadaptor.h"
+#include "sensormanager.h"
+#include <QtDebug>
+
+void MFLDALSAdaptorPlugin::Register(class Loader&)
+{
+ qDebug() << "registering mfldalsadaptor";
+ SensorManager& sm = SensorManager::instance();
+ sm.registerDeviceAdaptor<MFLDALSAdaptor>("alsadaptor");
+}
+
+Q_EXPORT_PLUGIN2(alsadaptor, MFLDALSAdaptorPlugin)
diff --git a/adaptors/mfldalsadaptor/mfldalsadaptorplugin.h b/adaptors/mfldalsadaptor/mfldalsadaptorplugin.h
new file mode 100644
index 0000000..70fc766
--- /dev/null
+++ b/adaptors/mfldalsadaptor/mfldalsadaptorplugin.h
@@ -0,0 +1,12 @@
+#ifndef MFLDALSADAPTORPLUGIN_H
+#define MFLDALSADAPTORPLUGIN_H
+
+#include "plugin.h"
+
+class MFLDALSAdaptorPlugin : public Plugin
+{
+private:
+ void Register(class Loader& l);
+};
+
+#endif
diff --git a/adaptors/adaptors.pro b/adaptors/adaptors.pro
index efb4bbf..cb35101 100644
--- a/adaptors/adaptors.pro
+++ b/adaptors/adaptors.pro
@@ -12,5 +12,6 @@ internal {
kbslideradaptor \
proximityadaptor \
proximityadaptor-evdev \
- mrstaccelerometer
+ mrstaccelerometer \
+ mfldproximityadaptor
}
diff --git a/adaptors/mfldproximityadaptor/mfldproximityadaptor.cpp b/adaptors/mfldproximityadaptor/mfldproximityadaptor.cpp
new file mode 100644
index 0000000..566a5c5
--- /dev/null
+++ b/adaptors/mfldproximityadaptor/mfldproximityadaptor.cpp
@@ -0,0 +1,49 @@
+#include <errno.h>
+
+#include "logging.h"
+#include "config.h"
+#include "mfldproximityadaptor.h"
+#include "filters/utils.h"
+#include <QDebug>
+
+#define PROXIMITY_FS_PATH "/sys/bus/i2c/devices/5-0055/apds9802ps/proximity_output"
+
+MFLDProximityAdaptor::MFLDProximityAdaptor(const QString& id) :
+ SysfsAdaptor(id, SysfsAdaptor::IntervalMode)
+{
+ if (access(PROXIMITY_FS_PATH, R_OK) < 0) {
+ qDebug() << PROXIMITY_FS_PATH << ": "<< strerror(errno);
+ return;
+ }
+ introduceAvailableDataRange(DataRange(0, 4096, 1));
+ devId = 0;
+ addPath(PROXIMITY_FS_PATH, devId);
+ ring_buffer = new DeviceAdaptorRingBuffer<TimedUnsigned>(1024);
+ addAdaptedSensor("proximity", "MFLD apds9802ps", ring_buffer);
+}
+
+MFLDProximityAdaptor::~MFLDProximityAdaptor()
+{
+ delete ring_buffer;
+}
+
+void MFLDProximityAdaptor::processSample(int pathId, int fd)
+{
+ if (pathId != devId) {
+ qDebug() << "pathId != devId";
+ return;
+ }
+ lseek(fd, 0, SEEK_SET);
+ if (read(fd, buf, sizeof(buf)) <= 0) {
+ sensordLogW() << "read():" << strerror(errno);
+ return;
+ }
+ sensordLogT() << "Proximity output value: " << buf;
+
+ TimedUnsigned* proximity = ring_buffer->nextSlot();
+ sscanf(buf, "%d", &proximity->value_);
+
+ proximity->timestamp_ = Utils::getTimeStamp();
+ ring_buffer->commit();
+ ring_buffer->wakeUpReaders();
+}
diff --git a/adaptors/mfldproximityadaptor/mfldproximityadaptor.h b/adaptors/mfldproximityadaptor/mfldproximityadaptor.h
new file mode 100644
index 0000000..a12e11b
--- /dev/null
+++ b/adaptors/mfldproximityadaptor/mfldproximityadaptor.h
@@ -0,0 +1,34 @@
+#ifndef MFLDPROXIMITYADAPTOR_H
+#define MFLDPROXIMITYADAPTOR_H
+
+#include "sysfsadaptor.h"
+#include "sensord/deviceadaptorringbuffer.h"
+#include "filters/timedunsigned.h"
+#include <QTime>
+
+
+class MFLDProximityAdaptor : public SysfsAdaptor
+{
+ Q_OBJECT;
+public:
+ static DeviceAdaptor* factoryMethod(const QString& id)
+ {
+ return new MFLDProximityAdaptor(id);
+ }
+
+protected:
+ MFLDProximityAdaptor(const QString& id);
+ ~MFLDProximityAdaptor();
+
+ virtual bool setStandbyOverride(const bool override) { Q_UNUSED(override); return false; }
+private:
+
+ void processSample(int pathId, int fd);
+ int devId;
+ char buf[16];
+
+ DeviceAdaptorRingBuffer<TimedUnsigned>* ring_buffer;
+};
+
+#endif
+
diff --git a/adaptors/mfldproximityadaptor/mfldproximityadaptor.pro b/adaptors/mfldproximityadaptor/mfldproximityadaptor.pro
new file mode 100644
index 0000000..dc5e0a4
--- /dev/null
+++ b/adaptors/mfldproximityadaptor/mfldproximityadaptor.pro
@@ -0,0 +1,27 @@
+TEMPLATE = lib
+CONFIG += plugin
+
+TARGET = proximityadaptor
+
+include( ../../common-config.pri )
+
+HEADERS += mfldproximityadaptor.h \
+ mfldproximityadaptorplugin.h
+
+SOURCES += mfldproximityadaptor.cpp \
+ mfldproximityadaptorplugin.cpp
+
+SENSORFW_INCLUDEPATHS = ../.. \
+ ../../include \
+ ../../sensord \
+ ../../datatypes \
+ ../../filters
+
+DEPENDPATH += $$SENSORFW_INCLUDEPATHS
+INCLUDEPATH += $$SENSORFW_INCLUDEPATHS
+
+include(../../common-install.pri)
+publicheaders.files += $$HEADERS
+target.path = $$PLUGINPATH
+
+INSTALLS += target
diff --git a/adaptors/mfldproximityadaptor/mfldproximityadaptorplugin.cpp b/adaptors/mfldproximityadaptor/mfldproximityadaptorplugin.cpp
new file mode 100644
index 0000000..842a07c
--- /dev/null
+++ b/adaptors/mfldproximityadaptor/mfldproximityadaptorplugin.cpp
@@ -0,0 +1,13 @@
+#include "mfldproximityadaptorplugin.h"
+#include "mfldproximityadaptor.h"
+#include "sensormanager.h"
+#include <QtDebug>
+
+void MFLDProximityAdaptorPlugin::Register(class Loader&)
+{
+ qDebug() << "registering medfield proximity adaptor";
+ SensorManager& sm = SensorManager::instance();
+ sm.registerDeviceAdaptor<MFLDProximityAdaptor>("proximityadaptor");
+}
+
+Q_EXPORT_PLUGIN2(proximityadaptor, MFLDProximityAdaptorPlugin)
diff --git a/adaptors/mfldproximityadaptor/mfldproximityadaptorplugin.h b/adaptors/mfldproximityadaptor/mfldproximityadaptorplugin.h
new file mode 100644
index 0000000..58d84dc
--- /dev/null
+++ b/adaptors/mfldproximityadaptor/mfldproximityadaptorplugin.h
@@ -0,0 +1,12 @@
+#ifndef MFLDPROXIMITYADAPTORPLUGIN_H
+#define MFLDPROXIMITYADAPTORPLUGIN_H
+
+#include "plugin.h"
+
+class MFLDProximityAdaptorPlugin : public Plugin
+{
+private:
+ void Register(class Loader& l);
+};
+
+#endif
_______________________________________________
MeeGo-dev mailing list
[email protected]
http://lists.meego.com/listinfo/meego-dev