summaryrefslogtreecommitdiff
path: root/libopie2
authorerik <erik>2007-02-08 21:46:07 (UTC)
committer erik <erik>2007-02-08 21:46:07 (UTC)
commit497621fb3ba39ea511842a30cddfcdbda090e7ba (patch) (unidiff)
tree13e70fb1840b7cc1c7b3a16ff9b6e71925b76b57 /libopie2
parent63f64a9733d5504bb04d5f06cdf52b42a4b8006c (diff)
downloadopie-497621fb3ba39ea511842a30cddfcdbda090e7ba.zip
opie-497621fb3ba39ea511842a30cddfcdbda090e7ba.tar.gz
opie-497621fb3ba39ea511842a30cddfcdbda090e7ba.tar.bz2
This commit provides the necessary changes and new files for Opie to
have partial support for the Palm LD, TX and Z72 handheld computers. This commit is based on a patch submitted by Cristiano to the opie-devel list. The patch itself comprises work done by Alex Osborne, Cristiano, Sergey Lapin, Jan Herman and Aaron. Thanks goes to them for sticking with the patch and expanding the number of devices Opie works on.
Diffstat (limited to 'libopie2') (more/less context) (ignore whitespace changes)
-rw-r--r--libopie2/opiecore/device/device.pro6
-rw-r--r--libopie2/opiecore/device/odevice.cpp2
-rw-r--r--libopie2/opiecore/device/odevice.h7
-rw-r--r--libopie2/opiecore/device/odevice_palm.cpp282
-rw-r--r--libopie2/opiecore/device/odevice_palm.h72
5 files changed, 367 insertions, 2 deletions
diff --git a/libopie2/opiecore/device/device.pro b/libopie2/opiecore/device/device.pro
index b517032..2fd5ded 100644
--- a/libopie2/opiecore/device/device.pro
+++ b/libopie2/opiecore/device/device.pro
@@ -11,7 +11,8 @@ HEADERS += device/odevice.h \
11 device/odevice_yopy.h \ 11 device/odevice_yopy.h \
12 device/odevice_mypal.h \ 12 device/odevice_mypal.h \
13 device/odevice_htc.h \ 13 device/odevice_htc.h \
14 device/odevice_motorola_ezx.h 14 device/odevice_motorola_ezx.h \
15 device/odevice_palm.h
15 16
16SOURCES += device/odevice.cpp \ 17SOURCES += device/odevice.cpp \
17 device/odevicebutton.cpp \ 18 device/odevicebutton.cpp \
@@ -26,5 +27,6 @@ SOURCES += device/odevice.cpp \
26 device/odevice_yopy.cpp \ 27 device/odevice_yopy.cpp \
27 device/odevice_mypal.cpp \ 28 device/odevice_mypal.cpp \
28 device/odevice_htc.cpp \ 29 device/odevice_htc.cpp \
29 device/odevice_motorola_ezx.cpp 30 device/odevice_motorola_ezx.cpp \
31 device/odevice_palm.cpp
30 32
diff --git a/libopie2/opiecore/device/odevice.cpp b/libopie2/opiecore/device/odevice.cpp
index 8f5be8b..e4233eb 100644
--- a/libopie2/opiecore/device/odevice.cpp
+++ b/libopie2/opiecore/device/odevice.cpp
@@ -39,6 +39,7 @@
39#include "odevice_genuineintel.h" 39#include "odevice_genuineintel.h"
40#include "odevice_htc.h" 40#include "odevice_htc.h"
41#include "odevice_motorola_ezx.h" 41#include "odevice_motorola_ezx.h"
42#include "odevice_palm.h"
42 43
43/* QT */ 44/* QT */
44#include <qapplication.h> 45#include <qapplication.h>
@@ -148,6 +149,7 @@ ODevice *ODevice::inst()
148 else if ( line.contains( "Tradesquare.NL", false ) ) dev = new Internal::Beagle(); 149 else if ( line.contains( "Tradesquare.NL", false ) ) dev = new Internal::Beagle();
149 else if ( line.contains( "HTC", false ) ) dev = new Internal::HTC(); 150 else if ( line.contains( "HTC", false ) ) dev = new Internal::HTC();
150 else if ( line.contains( "Motorola", false ) ) dev = new Internal::Motorola_EZX(); 151 else if ( line.contains( "Motorola", false ) ) dev = new Internal::Motorola_EZX();
152 else if ( line.contains( "Palm", false ) ) dev = new Internal::Palm();
151 153
152 else qWarning( "ODevice() - unknown hardware - using default." ); 154 else qWarning( "ODevice() - unknown hardware - using default." );
153 break; 155 break;
diff --git a/libopie2/opiecore/device/odevice.h b/libopie2/opiecore/device/odevice.h
index a8362cd..1eb5959 100644
--- a/libopie2/opiecore/device/odevice.h
+++ b/libopie2/opiecore/device/odevice.h
@@ -138,6 +138,12 @@ enum OModel {
138 Model_Motorola_All = ( Model_Motorola | 0xffff ), 138 Model_Motorola_All = ( Model_Motorola | 0xffff ),
139 Model_Motorola_EZX = ( Model_Motorola | 0x0001 ), 139 Model_Motorola_EZX = ( Model_Motorola | 0x0001 ),
140 140
141 Model_Palm = ( 10 << 16),
142 Model_Palm_All = ( Model_Palm | 0xffff ),
143 Model_Palm_LD = ( Model_Palm | 0x0001 ),
144 Model_Palm_TX = ( Model_Palm | 0x0002 ),
145 Model_Palm_Z72 = ( Model_Palm | 0x0003 ),
146
141}; 147};
142 148
143/** 149/**
@@ -156,6 +162,7 @@ enum OVendor {
156 Vendor_Asus, 162 Vendor_Asus,
157 Vendor_HTC, 163 Vendor_HTC,
158 Vendor_Motorola, 164 Vendor_Motorola,
165 Vendor_Palm,
159}; 166};
160 167
161/** 168/**
diff --git a/libopie2/opiecore/device/odevice_palm.cpp b/libopie2/opiecore/device/odevice_palm.cpp
new file mode 100644
index 0000000..76399f8
--- a/dev/null
+++ b/libopie2/opiecore/device/odevice_palm.cpp
@@ -0,0 +1,282 @@
1/*
2                 This file is part of the Opie Project
3
4 Copyright (C)2002-2005 The Opie Team <opie-devel@handhelds.org>
5 =.
6 .=l.
7           .>+-=
8 _;:,     .>    :=|. This program is free software; you can
9.> <`_,   >  .   <= redistribute it and/or modify it under
10:`=1 )Y*s>-.--   : the terms of the GNU Library General Public
11.="- .-=="i,     .._ License as published by the Free Software
12 - .   .-<_>     .<> Foundation; either version 2 of the License,
13     ._= =}       : or (at your option) any later version.
14    .%`+i>       _;_.
15    .i_,=:_.      -<s. This program is distributed in the hope that
16     +  .  -:.       = it will be useful, but WITHOUT ANY WARRANTY;
17 : ..    .:,     . . . without even the implied warranty of
18    =_        +     =;=|` MERCHANTABILITY or FITNESS FOR A
19  _.=:.       :    :=>`: PARTICULAR PURPOSE. See the GNU
20..}^=.=       =       ; Library General Public License for more
21++=   -.     .`     .: details.
22:     =  ...= . :.=-
23 -.   .:....=;==+<; You should have received a copy of the GNU
24  -_. . .   )=.  = Library General Public License along with
25    --        :-=` this library; see the file COPYING.LIB.
26 If not, write to the Free Software Foundation,
27 Inc., 59 Temple Place - Suite 330,
28 Boston, MA 02111-1307, USA.
29*/
30
31#include "odevice_palm.h"
32
33/* QT */
34#include <qapplication.h>
35#include <qfile.h>
36#include <qtextstream.h>
37#include <qwindowsystem_qws.h>
38#include <qgfx_qws.h>
39
40/* OPIE */
41#include <qpe/config.h>
42#include <qpe/sound.h>
43#include <qpe/qcopenvelope_qws.h>
44
45#include <opie2/okeyfilter.h>
46#include <opie2/oresource.h>
47
48/* STD */
49#include <fcntl.h>
50#include <math.h>
51#include <stdlib.h>
52#include <signal.h>
53#include <sys/ioctl.h>
54#include <sys/time.h>
55#include <unistd.h>
56#ifndef QT_NO_SOUND
57#include <linux/soundcard.h>
58#endif
59
60using namespace Opie::Core;
61using namespace Opie::Core::Internal;
62
63struct palm_button palm_buttons [] = {
64 { Model_Palm_TX | Model_Palm_LD | Model_Palm_Z72,
65 Qt::Key_F9, QT_TRANSLATE_NOOP( "Button", "Home Button" ),
66 "devicebuttons/palm_home",
67 "QPE/Launcher", "home()",
68 "buttonsettings", "raise()" },
69 { Model_Palm_TX | Model_Palm_LD | Model_Palm_Z72,
70 Qt::Key_F10, QT_TRANSLATE_NOOP( "Button", "Calendar Button" ),
71 "devicebuttons/palm_calendar",
72 "datebook", "nextView()",
73 "today", "raise()" },
74 { Model_Palm_TX | Model_Palm_LD | Model_Palm_Z72,
75 Qt::Key_F11, QT_TRANSLATE_NOOP( "Button", "Todo Button" ),
76 "devicebuttons/palm_todo",
77 "todolist", "raise()",
78 "todolist", "create()" },
79 { Model_Palm_TX | Model_Palm_LD | Model_Palm_Z72,
80 Qt::Key_F12, QT_TRANSLATE_NOOP( "Button", "Mail Button" ),
81 "devicebuttons/palm_mail",
82 "opiemail", "raise()",
83 "opiemail", "newmail()" },
84 { Model_Palm_LD,
85 Qt::Key_F7, QT_TRANSLATE_NOOP( "Button", "Voice Memo Button" ),
86 "devicebuttons/palm_voice_memo",
87 "QPE/TaskBar", "toggleMenu()",
88 "QPE/TaskBar", "toggleStartMenu()" },
89 { Model_Palm_LD,
90 Qt::Key_F8, QT_TRANSLATE_NOOP( "Button", "Rotate Button" ),
91 "devicebuttons/palm_rotate",
92 "QPE/Rotation", "flip()",0},
93};
94
95void Palm::init(const QString& cpu_info)
96{
97 d->m_vendorstr = "Palm";
98 d->m_vendor = Vendor_Palm;
99
100 QString model = "unknown";
101
102 int loc = cpu_info.find( ":" );
103 if ( loc != -1 )
104 model = cpu_info.mid( loc+2 ).simplifyWhiteSpace();
105 else
106 model = cpu_info;
107
108 if ( model == "Palm LifeDrive" ) {
109 d->m_modelstr = "Palm LifeDrive";
110 d->m_model = Model_Palm_LD;
111 }
112 else if ( model == "Palm TX" ) {
113 d->m_modelstr = "Palm TX";
114 d->m_model = Model_Palm_TX;
115 }
116 else if ( model == "Palm Zire 72" ) {
117 d->m_modelstr = "Palm Zire 72";
118 d->m_model = Model_Palm_Z72;
119 }
120 else
121 d->m_model = Model_Unknown;
122
123 switch ( d->m_model )
124 {
125 case Model_Palm_LD:
126 case Model_Palm_TX:
127 case Model_Palm_Z72:
128 m_backlightdev = "/sys/class/backlight/pxapwm-bl/";
129 d->m_rotation = Rot0;
130 d->m_direction = CCW;
131 d->m_qteDriver = "Transformed";
132 break;
133 default:
134 m_backlightdev = "";
135 }
136
137}
138
139
140void Palm::initButtons()
141{
142
143 if ( d->m_buttons )
144 return ;
145
146 if ( isQWS( ) ) {
147 addPreHandler(this);
148 }
149
150 d->m_buttons = new QValueList <ODeviceButton>;
151
152 for ( uint i = 0; i < ( sizeof( palm_buttons ) / sizeof( palm_button ) ); i++ )
153 {
154 palm_button *ib = palm_buttons + i;
155 ODeviceButton b;
156
157 if (( ib->model & d->m_model ) == d->m_model ) {
158 b. setKeycode ( ib->code );
159 b. setUserText ( QObject::tr ( "Button", ib->utext ));
160 b. setPixmap ( OResource::loadPixmap ( ib->pix ));
161 b. setFactoryPresetPressedAction ( OQCopMessage ( makeChannel ( ib->fpressedservice ), ib->fpressedaction ));
162 b. setFactoryPresetHeldAction ( OQCopMessage ( makeChannel ( ib->fheldservice ), ib->fheldaction ));
163
164 d->m_buttons->append ( b );
165 }
166 }
167 reloadButtonMapping();
168}
169
170
171bool Palm::filter ( int /*unicode*/, int keycode, int modifiers, bool isPress, bool autoRepeat )
172{
173 int newkeycode = keycode;
174
175 if (qt_screen->transformOrientation() != Rot0){
176
177 switch ( keycode ) {
178 case Key_Left :
179 case Key_Right:
180 case Key_Up :
181 case Key_Down :
182 newkeycode = Key_Left + ( keycode - Key_Left + (int) qt_screen->transformOrientation() ) % 4;
183 default:
184 break;
185 }
186
187 if (newkeycode!=keycode) {
188 if ( newkeycode != Key_unknown ) {
189 QWSServer::sendKeyEvent ( -1, newkeycode, modifiers, isPress, autoRepeat );
190 }
191 return true;
192 }
193
194 }
195
196 return false;
197}
198
199
200bool Palm::suspend()
201{
202 // some Palms do not implement their own power management at the moment.
203
204 bool res = false;
205
206 if ( !isQWS( ) ) // only qwsserver is allowed to suspend
207 return false;
208
209 switch ( d->m_model ) {
210 case Model_Palm_LD:
211 case Model_Palm_Z72:
212 {
213 QCopChannel::send( "QPE/System", "aboutToSuspend()" );
214
215 ::sync(); // flush fs caches
216 res = ( ::system ( "apm --suspend" ) == 0 );
217
218 QCopChannel::send( "QPE/System", "returnFromSuspend()" );
219 }
220 break;
221 }
222
223 return res;
224}
225
226
227int Palm::displayBrightnessResolution() const
228{
229 int res = 1;
230
231 switch ( d->m_model )
232 {
233 case Model_Palm_LD:
234 case Model_Palm_TX:
235 case Model_Palm_Z72:
236 int fd = ::open( m_backlightdev + "max_brightness", O_RDONLY|O_NONBLOCK );
237 if ( fd )
238 {
239 char buf[100];
240 if ( ::read( fd, &buf[0], sizeof buf ) ) ::sscanf( &buf[0], "%d", &res );
241 ::close( fd );
242 }
243 break;
244
245 default:
246 res = 1;
247 }
248
249 return res;
250}
251
252
253bool Palm::setDisplayBrightness( int bright )
254{
255 bool res = false;
256
257 if ( bright > 255 ) bright = 255;
258 if ( bright < 0 ) bright = 0;
259
260 int numberOfSteps = displayBrightnessResolution();
261 int val = ( bright == 1 ) ? 1 : ( bright * numberOfSteps ) / 255;
262
263 switch ( d->m_model )
264 {
265
266 case Model_Palm_LD:
267 case Model_Palm_TX:
268 case Model_Palm_Z72:
269 int fd = ::open( m_backlightdev + "brightness", O_WRONLY|O_NONBLOCK );
270 if ( fd )
271 {
272 char buf[100];
273 int len = ::snprintf( &buf[0], sizeof buf, "%d", val );
274 res = ( ::write( fd, &buf[0], len ) == 0 );
275 ::close( fd );
276 }
277 break;
278
279 default: res = false;
280 }
281 return res;
282}
diff --git a/libopie2/opiecore/device/odevice_palm.h b/libopie2/opiecore/device/odevice_palm.h
new file mode 100644
index 0000000..3ce786c
--- a/dev/null
+++ b/libopie2/opiecore/device/odevice_palm.h
@@ -0,0 +1,72 @@
1/*
2                This file is part of the Opie Project
3             Copyright (C) The Opie Team <opie-devel@handhelds.org>
4 =.
5 .=l.
6          .>+-=
7_;:,     .>    :=|. This program is free software; you can
8.> <`_,   >  .   <= redistribute it and/or modify it under
9:`=1 )Y*s>-.--   : the terms of the GNU Library General Public
10.="- .-=="i,     .._ License as published by the Free Software
11- .   .-<_>     .<> Foundation; either version 2 of the License,
12    ._= =}       : or (at your option) any later version.
13   .%`+i>       _;_.
14   .i_,=:_.      -<s. This program is distributed in the hope that
15    +  .  -:.       = it will be useful, but WITHOUT ANY WARRANTY;
16   : ..    .:,     . . . without even the implied warranty of
17   =_        +     =;=|` MERCHANTABILITY or FITNESS FOR A
18 _.=:.       :    :=>`: PARTICULAR PURPOSE. See the GNU
19..}^=.=       =       ; Library General Public License for more
20++=   -.     .`     .: details.
21:     =  ...= . :.=-
22-.   .:....=;==+<; You should have received a copy of the GNU
23 -_. . .   )=.  = Library General Public License along with
24   --        :-=` this library; see the file COPYING.LIB.
25 If not, write to the Free Software Foundation,
26 Inc., 59 Temple Place - Suite 330,
27 Boston, MA 02111-1307, USA.
28*/
29
30#ifndef ODEVICE_PALM
31#define ODEVICE_PALM
32
33#include "odevice_abstractmobiledevice.h"
34
35namespace Opie {
36namespace Core {
37namespace Internal {
38class Palm : public OAbstractMobileDevice, public QWSServer::KeyboardFilter
39{
40 protected:
41
42 virtual void init(const QString&);
43 virtual void initButtons();
44 virtual bool filter( int unicode, int keycode, int modifiers, bool isPress, bool autoRepeat );
45
46 QString m_backlightdev;
47
48 public:
49 virtual bool suspend();
50
51 virtual bool setDisplayBrightness ( int b );
52 virtual int displayBrightnessResolution() const;
53
54};
55
56struct palm_button
57{
58 uint model;
59 Qt::Key code;
60 char *utext;
61 char *pix;
62 char *fpressedservice;
63 char *fpressedaction;
64 char *fheldservice;
65 char *fheldaction;
66};
67
68}
69}
70}
71
72#endif