[PATCH] Improve accelerometer library, and use it in Arora and QX for autorotation
Neil Jerram
neil at ossau.homelinux.net
Tue Jul 17 22:55:15 CEST 2012
---
src/3rdparty/applications/arora | 2 +-
src/3rdparty/applications/qx/qbuild.pro | 1 +
src/3rdparty/applications/qx/rotate.cpp | 76 ++++----------------=
----
src/3rdparty/applications/qx/rotate.h | 5 --
src/3rdparty/games/qtmaze/form.cpp | 2 +-
src/libraries/accelerometer/accelerometers.cpp | 65 ++++++++++++++++----
src/libraries/accelerometer/accelerometers.h | 6 +-
7 files changed, 72 insertions(+), 85 deletions(-)
diff --git a/src/3rdparty/applications/arora b/src/3rdparty/applications/ar=
ora
index 6fe8d25..c4938dc 160000
--- a/src/3rdparty/applications/arora
+++ b/src/3rdparty/applications/arora
@@ -1 +1 @@
-Subproject commit 6fe8d25fd36dbc29b5e6c479db1193e6523eeb7b
+Subproject commit c4938dce05b27426334cd32d594084fbd055880d
diff --git a/src/3rdparty/applications/qx/qbuild.pro b/src/3rdparty/applica=
tions/qx/qbuild.pro
index a22a561..3fbf3e7 100644
--- a/src/3rdparty/applications/qx/qbuild.pro
+++ b/src/3rdparty/applications/qx/qbuild.pro
@@ -4,6 +4,7 @@ TARGET=3Dqx
CONFIG+=3Dqtopia
LIBS+=3D-lX11 -lXtst
DEFINES+=3DQTOPIA
+MODULES*=3Daccelerometer
=20
# I18n info
STRING_LANGUAGE=3Den_US
diff --git a/src/3rdparty/applications/qx/rotate.cpp b/src/3rdparty/applica=
tions/qx/rotate.cpp
index 52302d6..4463698 100644
--- a/src/3rdparty/applications/qx/rotate.cpp
+++ b/src/3rdparty/applications/qx/rotate.cpp
@@ -7,6 +7,8 @@
=20
#include <stdlib.h>
=20
+#include <accelerometers.h>
+
/**
* The acceleromer algorithms and code taken from omnewrotate-0.5.4
* Copyright =C2=A9 2008 Rui Miguel Silva Seabra <rms at 1407.org>
@@ -55,9 +57,7 @@ RotateHelper::RotateHelper(QObject *parent, int dflg) : Q=
Object(parent)
down =3D 0;
last_pos=3D -1;
current_pos =3D -1;
- event3 =3D -1;
debug =3D dflg;
- skip_zero =3D 1;
initial_rotation=3D -1;
}
=20
@@ -88,6 +88,9 @@ void RotateHelper::start(int timeinms)
stop();
}
=20
+ // start accelerometer
+ accelerometer_start(timeinms, NULL, NULL);
+
// start up a single shot timer to check accelerometers
// it will be restarted each time
timer =3D new QTimer(this);
@@ -103,10 +106,8 @@ void RotateHelper::stop()
timer=3D NULL;
}
=20
- if(event3 !=3D -1){
- close(event3);
- event3=3D -1;
- }
+ // stop accelerometer
+ accelerometer_stop();
}
=20
void rotate(int degree)
@@ -145,6 +146,10 @@ void RotateHelper::maybe_rotate(int deg)
=20
void RotateHelper::sample()
{
+ x =3D 1000 * getacx();
+ y =3D 1000 * getacy();
+ z =3D 1000 * getacz();
+
if(packet_reader()){
int pos=3D define_position();
if(pos !=3D last_pos)
@@ -218,66 +223,9 @@ int RotateHelper::define_position(void)
return current_pos;
}
=20
-
-int RotateHelper::read_packet()
-{
- static struct input_event event_x, event_y, event_z, event_syn;
- void *packet_memcpy_result =3D NULL;
- int packet_size =3D sizeof(struct input_event);
- int size_of_packet =3D 4 * packet_size;
- int bytes_read =3D 0;
- char packet[size_of_packet];
-
- bytes_read =3D read(event3, packet, size_of_packet);
-
- if (bytes_read < packet_size)
- {
- qWarning("RotateHelper: fread failed");
- stop();
- return -1;
- }
-
- /* obtain the full packet */
- packet_memcpy_result =3D memcpy(&event_x, packet, pac=
ket_size);
- packet_memcpy_result =3D memcpy(&event_y, packet + packet_size, pac=
ket_size);
- packet_memcpy_result =3D memcpy(&event_z, packet + 2 * packet_size, pac=
ket_size);
- packet_memcpy_result =3D memcpy(&event_syn, packet + 3 * packet_size, pac=
ket_size);
-
- if(skip_zero && (event_x.value =3D=3D 0 || event_y.value =3D=3D 0 || even=
t_z.value =3D=3D 0))
- {
- // qDebug("Bad packet!");
- return(0);
- }
-
- if (event_syn.type =3D=3D EV_SYN)
- {
- x =3D event_x.value;
- y =3D event_y.value;
- z =3D event_z.value;
-
- return (1);
- }
- else
- return (0);
-}
-
bool RotateHelper::packet_reader()
{
- if(event3 =3D=3D -1){
- event3 =3D open(EVENT_PATH, O_RDONLY);
-
- if (event3 < 0){
- qWarning("Can't open '%s': %s\n", EVENT_PATH, strerror(errno));
- return false;
- }
- qDebug("Opened: %s", EVENT_PATH);
- }
-
- while(read_packet() =3D=3D 0);
-=09
- // qDebug("read packet");
-
- return true;
+ return (x || y || z);
}
=20
#else // QTOPIA
diff --git a/src/3rdparty/applications/qx/rotate.h b/src/3rdparty/applicati=
ons/qx/rotate.h
index fdce73b..cfcc608 100644
--- a/src/3rdparty/applications/qx/rotate.h
+++ b/src/3rdparty/applications/qx/rotate.h
@@ -11,8 +11,6 @@
=20
#include <QTimer>
=20
-#define EVENT_PATH "/dev/input/event3"
-
#ifdef QTOPIA
=20
/**
@@ -42,7 +40,6 @@ signals:
void maybe_rotate(int deg);
int neighbour(int value, int target, int neighbour);
int define_position(void);
- int read_packet();
bool packet_reader();
=20=09
QTimer *timer;
@@ -62,10 +59,8 @@ signals:
int down;
int last_pos;
int current_pos;
- int event3;
int debug;
int initial_rotation;
- ushort skip_zero;
};
=20
#else // QTOPIA
diff --git a/src/3rdparty/games/qtmaze/form.cpp b/src/3rdparty/games/qtmaze=
/form.cpp
index 71ebfce..f021414 100644
--- a/src/3rdparty/games/qtmaze/form.cpp
+++ b/src/3rdparty/games/qtmaze/form.cpp
@@ -854,7 +854,7 @@ Form::Form(QWidget *parent, Qt::WFlags f)
info1_lbl->setText( "<font color=3D\"#e0bc70\" size=3D\"" FONT_SIZE "\=
">Touch the screen to continue</font>" );
=20
InitState();
- accelerometer_start();
+ accelerometer_start(0, NULL, NULL);
=20
timer =3D new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(timerAction()));
diff --git a/src/libraries/accelerometer/accelerometers.cpp b/src/libraries=
/accelerometer/accelerometers.cpp
index d5f6681..0e22694 100644
--- a/src/libraries/accelerometer/accelerometers.cpp
+++ b/src/libraries/accelerometer/accelerometers.cpp
@@ -53,7 +53,17 @@
#include "accelerometers.h"
=20
pthread_t thread;
-int finished=3D0;
+
+struct thread_data_t
+{
+ int finished;
+ useconds_t interval_us;
+ accelerometer_cb_t callback;
+ void *closure;
+};
+
+struct thread_data_t global_thread_data =3D { 0, 0, NULL, NULL };
+
double acx=3D0,acy=3D0,acz=3D0;
=20
#ifdef QT_QWS_GTA04
@@ -154,6 +164,7 @@ int accelerometer_moo_gta04(AccelHandle *accel)
size_t rval;
fd_set fds;
struct timeval t;
+ int got_measurement =3D 0;
=20
FD_ZERO(&fds);
FD_SET(accel->fd, &fds);
@@ -202,6 +213,7 @@ int accelerometer_moo_gta04(AccelHandle *accel)
accel->x =3D accel->lx;
accel->y =3D accel->ly;
accel->z =3D accel->lz;
+ got_measurement =3D 1;
}
}
=20
@@ -222,7 +234,7 @@ int accelerometer_moo_gta04(AccelHandle *accel)
if (acy<-1) acy=3D-1; if (acy>1) acy=3D1;
//if (acz<-1) acz=3D-1; if (acz>1) acz=3D1;
=20=09
- return 0;
+ return got_measurement;
}
=20
int accelerometer_moo(AccelHandle *accel)
@@ -244,12 +256,24 @@ int accelerometer_moo(AccelHandle *accel)
void* accel_work(void *data)
{
AccelHandle *accel;
- int *finished =3D (int*)data;
+ thread_data_t *my_thread_data =3D (thread_data_t *)data;
=20
accel =3D accelerometer_open();
- while ( !(*finished) ) {
- accelerometer_moo(accel);
- usleep(GET_DATA_INTERVAL);
+ while ( !(my_thread_data->finished) ) {
+
+ /* Call accelerometer_moo() until we have an
+ acceleration measurement. */
+ while (!accelerometer_moo(accel))
+ ;
+
+ /* If the library user specified a callback, call
+ it. */
+ if (my_thread_data->callback)
+ (*my_thread_data->callback)(my_thread_data->closure,
+ acx, acy, acz);
+
+ /* Sleep before taking another measurement. */
+ usleep(my_thread_data->interval_us);
}
=20
accelerometer_shutdown(accel);
@@ -271,7 +295,7 @@ int pc_mode=3D0;
/* The accelerometer work thread */
void* accel_work(void *data)
{
- int *finished =3D (int*)data;
+ thread_data_t *my_thread_data =3D (thread_data_t *)data;
=20
int fd;
if ((fd =3D open(JS_DEVICE_NEO, O_RDONLY)) < 0)
@@ -298,7 +322,7 @@ void* accel_work(void *data)
axis =3D (int*)calloc(axes, sizeof(int));
//button =3D (char*)calloc(buttons, sizeof(char));
=20
- while ( !(*finished) )
+ while ( !(my_thread_data->finished) )
{
size_t rval;
fd_set fds;
@@ -346,7 +370,13 @@ void* accel_work(void *data)
/* No data */
}
=20
- usleep(GET_DATA_INTERVAL);
+ /* If the library user specified a callback, call
+ it. */
+ if (my_thread_data->callback)
+ (*my_thread_data->callback)(my_thread_data->closure,
+ acx, acy, acz);
+
+ usleep(my_thread_data->interval_us);
}
=20
close(fd);
@@ -356,15 +386,24 @@ void* accel_work(void *data)
=20
#endif
=20
-void accelerometer_start()
+void accelerometer_start(int interval_ms,
+ accelerometer_cb_t callback,
+ void *closure)
{
- finished =3D 0;
- pthread_create( &thread, NULL, accel_work, (void*)(&finished));
+ global_thread_data.finished =3D 0;
+ global_thread_data.interval_us =3D 1000 * interval_ms;
+ if (global_thread_data.interval_us < GET_DATA_INTERVAL)
+ {
+ global_thread_data.interval_us =3D GET_DATA_INTERVAL;
+ }
+ global_thread_data.callback =3D callback;
+ global_thread_data.closure =3D closure;
+ pthread_create( &thread, NULL, accel_work, &global_thread_data);
}
=20
void accelerometer_stop()
{
- finished =3D 1;
+ global_thread_data.finished =3D 1;
pthread_join(thread, NULL);
}
=20
diff --git a/src/libraries/accelerometer/accelerometers.h b/src/libraries/a=
ccelerometer/accelerometers.h
index c69ce3f..fd25319 100644
--- a/src/libraries/accelerometer/accelerometers.h
+++ b/src/libraries/accelerometer/accelerometers.h
@@ -26,7 +26,11 @@
=20
#include <qtopiaglobal.h>
=20
-QTOPIA_EXPORT void accelerometer_start();
+typedef void (*accelerometer_cb_t)(void *, double, double, double);
+
+QTOPIA_EXPORT void accelerometer_start(int interval_ms,
+ accelerometer_cb_t callback,
+ void *closure);
QTOPIA_EXPORT void accelerometer_stop();
=20
/* On the GTA04, the values returned by the following are in units of
--=20
1.7.10.4
--=-=-=
Content-Type: text/x-diff; charset=utf-8
Content-Disposition: inline;
filename=0001-Use-accelerometer-library-for-autorotation.patch
Content-Transfer-Encoding: quoted-printable
More information about the community
mailing list