[email protected] writes:
> Also, in QX the option "rotate screen" does nothing, what should it do?
I have some theoretical patches for that (attached), but I haven't
offered them to Radek because I haven't really got QX working much at
all, and so I couldn't be sure if the QX rotation support was working.
The first attached patch is for the main QtMoko repository; the second
is for the Arora submodule.
Regards,
Neil
>From 2cdb6f0b0e8393379670efe7e4aee6e89056995d Mon Sep 17 00:00:00 2001
From: Neil Jerram <[email protected]>
Date: Tue, 17 Jul 2012 22:55:15 +0200
Subject: [PATCH] Improve accelerometer library, and use it in Arora and QX
for autorotation
---
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/arora
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/applications/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=qx
CONFIG+=qtopia
LIBS+=-lX11 -lXtst
DEFINES+=QTOPIA
+MODULES*=accelerometer
# I18n info
STRING_LANGUAGE=en_US
diff --git a/src/3rdparty/applications/qx/rotate.cpp b/src/3rdparty/applications/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 @@
#include <stdlib.h>
+#include <accelerometers.h>
+
/**
* The acceleromer algorithms and code taken from omnewrotate-0.5.4
* Copyright © 2008 Rui Miguel Silva Seabra <[email protected]>
@@ -55,9 +57,7 @@ RotateHelper::RotateHelper(QObject *parent, int dflg) : QObject(parent)
down = 0;
last_pos= -1;
current_pos = -1;
- event3 = -1;
debug = dflg;
- skip_zero = 1;
initial_rotation= -1;
}
@@ -88,6 +88,9 @@ void RotateHelper::start(int timeinms)
stop();
}
+ // start accelerometer
+ accelerometer_start(timeinms, NULL, NULL);
+
// start up a single shot timer to check accelerometers
// it will be restarted each time
timer = new QTimer(this);
@@ -103,10 +106,8 @@ void RotateHelper::stop()
timer= NULL;
}
- if(event3 != -1){
- close(event3);
- event3= -1;
- }
+ // stop accelerometer
+ accelerometer_stop();
}
void rotate(int degree)
@@ -145,6 +146,10 @@ void RotateHelper::maybe_rotate(int deg)
void RotateHelper::sample()
{
+ x = 1000 * getacx();
+ y = 1000 * getacy();
+ z = 1000 * getacz();
+
if(packet_reader()){
int pos= define_position();
if(pos != last_pos)
@@ -218,66 +223,9 @@ int RotateHelper::define_position(void)
return current_pos;
}
-
-int RotateHelper::read_packet()
-{
- static struct input_event event_x, event_y, event_z, event_syn;
- void *packet_memcpy_result = NULL;
- int packet_size = sizeof(struct input_event);
- int size_of_packet = 4 * packet_size;
- int bytes_read = 0;
- char packet[size_of_packet];
-
- bytes_read = 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 = memcpy(&event_x, packet, packet_size);
- packet_memcpy_result = memcpy(&event_y, packet + packet_size, packet_size);
- packet_memcpy_result = memcpy(&event_z, packet + 2 * packet_size, packet_size);
- packet_memcpy_result = memcpy(&event_syn, packet + 3 * packet_size, packet_size);
-
- if(skip_zero && (event_x.value == 0 || event_y.value == 0 || event_z.value == 0))
- {
- // qDebug("Bad packet!");
- return(0);
- }
-
- if (event_syn.type == EV_SYN)
- {
- x = event_x.value;
- y = event_y.value;
- z = event_z.value;
-
- return (1);
- }
- else
- return (0);
-}
-
bool RotateHelper::packet_reader()
{
- if(event3 == -1){
- event3 = 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() == 0);
-
- // qDebug("read packet");
-
- return true;
+ return (x || y || z);
}
#else // QTOPIA
diff --git a/src/3rdparty/applications/qx/rotate.h b/src/3rdparty/applications/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 @@
#include <QTimer>
-#define EVENT_PATH "/dev/input/event3"
-
#ifdef QTOPIA
/**
@@ -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();
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;
};
#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=\"#e0bc70\" size=\"" FONT_SIZE "\">Touch the screen to continue</font>" );
InitState();
- accelerometer_start();
+ accelerometer_start(0, NULL, NULL);
timer = 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"
pthread_t thread;
-int finished=0;
+
+struct thread_data_t
+{
+ int finished;
+ useconds_t interval_us;
+ accelerometer_cb_t callback;
+ void *closure;
+};
+
+struct thread_data_t global_thread_data = { 0, 0, NULL, NULL };
+
double acx=0,acy=0,acz=0;
#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 = 0;
FD_ZERO(&fds);
FD_SET(accel->fd, &fds);
@@ -202,6 +213,7 @@ int accelerometer_moo_gta04(AccelHandle *accel)
accel->x = accel->lx;
accel->y = accel->ly;
accel->z = accel->lz;
+ got_measurement = 1;
}
}
@@ -222,7 +234,7 @@ int accelerometer_moo_gta04(AccelHandle *accel)
if (acy<-1) acy=-1; if (acy>1) acy=1;
//if (acz<-1) acz=-1; if (acz>1) acz=1;
- return 0;
+ return got_measurement;
}
int accelerometer_moo(AccelHandle *accel)
@@ -244,12 +256,24 @@ int accelerometer_moo(AccelHandle *accel)
void* accel_work(void *data)
{
AccelHandle *accel;
- int *finished = (int*)data;
+ thread_data_t *my_thread_data = (thread_data_t *)data;
accel = 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);
}
accelerometer_shutdown(accel);
@@ -271,7 +295,7 @@ int pc_mode=0;
/* The accelerometer work thread */
void* accel_work(void *data)
{
- int *finished = (int*)data;
+ thread_data_t *my_thread_data = (thread_data_t *)data;
int fd;
if ((fd = open(JS_DEVICE_NEO, O_RDONLY)) < 0)
@@ -298,7 +322,7 @@ void* accel_work(void *data)
axis = (int*)calloc(axes, sizeof(int));
//button = (char*)calloc(buttons, sizeof(char));
- while ( !(*finished) )
+ while ( !(my_thread_data->finished) )
{
size_t rval;
fd_set fds;
@@ -346,7 +370,13 @@ void* accel_work(void *data)
/* No data */
}
- 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);
}
close(fd);
@@ -356,15 +386,24 @@ void* accel_work(void *data)
#endif
-void accelerometer_start()
+void accelerometer_start(int interval_ms,
+ accelerometer_cb_t callback,
+ void *closure)
{
- finished = 0;
- pthread_create( &thread, NULL, accel_work, (void*)(&finished));
+ global_thread_data.finished = 0;
+ global_thread_data.interval_us = 1000 * interval_ms;
+ if (global_thread_data.interval_us < GET_DATA_INTERVAL)
+ {
+ global_thread_data.interval_us = GET_DATA_INTERVAL;
+ }
+ global_thread_data.callback = callback;
+ global_thread_data.closure = closure;
+ pthread_create( &thread, NULL, accel_work, &global_thread_data);
}
void accelerometer_stop()
{
- finished = 1;
+ global_thread_data.finished = 1;
pthread_join(thread, NULL);
}
diff --git a/src/libraries/accelerometer/accelerometers.h b/src/libraries/accelerometer/accelerometers.h
index c69ce3f..fd25319 100644
--- a/src/libraries/accelerometer/accelerometers.h
+++ b/src/libraries/accelerometer/accelerometers.h
@@ -26,7 +26,11 @@
#include <qtopiaglobal.h>
-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();
/* On the GTA04, the values returned by the following are in units of
--
1.7.10.4
>From c4938dce05b27426334cd32d594084fbd055880d Mon Sep 17 00:00:00 2001
From: Neil Jerram <[email protected]>
Date: Tue, 17 Jul 2012 22:33:31 +0200
Subject: [PATCH] Use accelerometer library for autorotation
---
src/qbuild.pro | 1 +
src/utils/rotate.cpp | 102 ++++++++++++--------------------------------------
src/utils/rotate.h | 13 +++----
3 files changed, 31 insertions(+), 85 deletions(-)
diff --git a/src/qbuild.pro b/src/qbuild.pro
index 33f294e..4db82b6 100644
--- a/src/qbuild.pro
+++ b/src/qbuild.pro
@@ -3,6 +3,7 @@ TARGET = arora
CONFIG += qtopia
QT += webkit network
+MODULES*=accelerometer
#DEFINES += QT_NO_CAST_FROM_ASCII
DEFINES += QT_NO_UITOOLS
diff --git a/src/utils/rotate.cpp b/src/utils/rotate.cpp
index c5a82b7..32b0399 100644
--- a/src/utils/rotate.cpp
+++ b/src/utils/rotate.cpp
@@ -5,6 +5,8 @@
#include <stdlib.h>
+#include <accelerometers.h>
+
/**
* The acceleromer algorithms and code taken from omnewrotate-0.5.4
* Copyright © 2008 Rui Miguel Silva Seabra <[email protected]>
@@ -37,7 +39,6 @@
RotateHelper::RotateHelper(QObject *parent, int dflg) : QObject(parent)
{
- timer= NULL;
x = 0;
y = 0;
z = 0;
@@ -51,9 +52,7 @@ RotateHelper::RotateHelper(QObject *parent, int dflg) : QObject(parent)
down = 0;
last_pos= -1;
current_pos = -1;
- event3 = -1;
debug = dflg;
- skip_zero = 1;
initial_rotation= -1;
}
@@ -77,32 +76,16 @@ void RotateHelper::start(int timeinms)
{
// remember where we were when we started
QValueSpaceItem vsiRot("/UI/Rotation/Current");
- initial_rotation= vsiRot.value().toUInt();
-
- // don't allow multiple timers to run
- if(timer != NULL){
- stop();
- }
+ initial_rotation= vsiRot.value().toUInt();
- // start up a single shot timer to check accelerometers
- // it will be restarted each time
- timer = new QTimer(this);
- connect(timer, SIGNAL(timeout()), this, SLOT(sample()));
- timer->start(timeinms);
+ // start accelerometer
+ accelerometer_start(timeinms, RotateHelper::accel_callback, this);
}
void RotateHelper::stop()
{
- if(timer != NULL){
- timer->stop();
- delete timer;
- timer= NULL;
- }
-
- if(event3 != -1){
- close(event3);
- event3= -1;
- }
+ // stop accelerometer
+ accelerometer_stop();
}
// restore to whatever the rotation was when we started
@@ -204,64 +187,27 @@ int RotateHelper::define_position(void)
return current_pos;
}
-
-int RotateHelper::read_packet()
+bool RotateHelper::packet_reader()
{
- static struct input_event event_x, event_y, event_z, event_syn;
- void *packet_memcpy_result = NULL;
- int packet_size = sizeof(struct input_event);
- int size_of_packet = 4 * packet_size;
- int bytes_read = 0;
- char packet[size_of_packet];
-
- bytes_read = 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 = memcpy(&event_x, packet, packet_size);
- packet_memcpy_result = memcpy(&event_y, packet + packet_size, packet_size);
- packet_memcpy_result = memcpy(&event_z, packet + 2 * packet_size, packet_size);
- packet_memcpy_result = memcpy(&event_syn, packet + 3 * packet_size, packet_size);
-
- if(skip_zero && (event_x.value == 0 || event_y.value == 0 || event_z.value == 0))
- {
- // qDebug("Bad packet!");
- return(0);
- }
-
- if (event_syn.type == EV_SYN)
- {
- x = event_x.value;
- y = event_y.value;
- z = event_z.value;
-
- return (1);
- }
- else
- return (0);
+ return (x || y || z);
}
-bool RotateHelper::packet_reader()
+void RotateHelper::accel_sample(double acx,
+ double acy,
+ double acz)
{
- if(event3 == -1){
- event3 = 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);
- }
+ x = 1000 * acx;
+ y = 1000 * acy;
+ z = 1000 * acz;
- while(read_packet() == 0);
-
- // qDebug("read packet");
+ sample();
+}
- return true;
+void RotateHelper::accel_callback(void *closure,
+ double acx,
+ double acy,
+ double acz)
+{
+ RotateHelper *rotHelper = (RotateHelper *)closure;
+ rotHelper->accel_sample(acx, acy, acz);
}
diff --git a/src/utils/rotate.h b/src/utils/rotate.h
index 30957a1..792cbba 100644
--- a/src/utils/rotate.h
+++ b/src/utils/rotate.h
@@ -11,8 +11,6 @@
#include <QTimer>
-#define EVENT_PATH "/dev/input/event3"
-
/**
* Detects the orientation of the device, and will rotate the screen
@@ -30,6 +28,7 @@ class RotateHelper : public QObject
void stop();
void restore();
bool isLandscape();
+ void accel_sample(double acx, double acy, double acz);
private slots:
void sample();
@@ -41,10 +40,7 @@ signals:
void maybe_rotate(int deg);
int neighbour(int value, int target, int neighbour);
int define_position(void);
- int read_packet();
bool packet_reader();
-
- QTimer *timer;
enum Orientation {UP=0, RIGHT=90, DOWN=180, LEFT=270};
@@ -61,9 +57,12 @@ signals:
int down;
int last_pos;
int current_pos;
- int event3;
int debug;
int initial_rotation;
- ushort skip_zero;
+
+ static void accel_callback(void *closure,
+ double acx,
+ double acy,
+ double acz);
};
#endif
--
1.7.10.4
_______________________________________________
Openmoko community mailing list
[email protected]
http://lists.openmoko.org/mailman/listinfo/community