[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