summaryrefslogtreecommitdiff
authoreilers <eilers>2003-08-10 17:19:47 (UTC)
committer eilers <eilers>2003-08-10 17:19:47 (UTC)
commit538f7adcd133861f795a133a23ca184a47f81139 (patch) (unidiff)
tree9c4614f3bfa0e0430a41a79bcbe931ae0b9573c6
parent0024cf8df3d576ac4fa5921b041d0fdbd17079e1 (diff)
downloadopie-538f7adcd133861f795a133a23ca184a47f81139.zip
opie-538f7adcd133861f795a133a23ca184a47f81139.tar.gz
opie-538f7adcd133861f795a133a23ca184a47f81139.tar.bz2
Experimental odevice:
This enables real sound support for all openzaurus kernels and devices.
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--libopie/odevice.cpp142
1 files changed, 112 insertions, 30 deletions
diff --git a/libopie/odevice.cpp b/libopie/odevice.cpp
index a134810..3ff029e 100644
--- a/libopie/odevice.cpp
+++ b/libopie/odevice.cpp
@@ -2,516 +2,519 @@
2 Copyright (C) 2002 Robert Griebl (sandman@handhelds.org) 2 Copyright (C) 2002 Robert Griebl (sandman@handhelds.org)
3 3
4 This library is free software; you can redistribute it and/or 4 This library is free software; you can redistribute it and/or
5 modify it under the terms of the GNU Library General Public 5 modify it under the terms of the GNU Library General Public
6 License as published by the Free Software Foundation; either 6 License as published by the Free Software Foundation; either
7 version 2 of the License, or (at your option) any later version. 7 version 2 of the License, or (at your option) any later version.
8 8
9 This library is distributed in the hope that it will be useful, 9 This library is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of 10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 Library General Public License for more details. 12 Library General Public License for more details.
13 13
14 You should have received a copy of the GNU Library General Public License 14 You should have received a copy of the GNU Library General Public License
15 along with this library; see the file COPYING.LIB. If not, write to 15 along with this library; see the file COPYING.LIB. If not, write to
16 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 16 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17 Boston, MA 02111-1307, USA. 17 Boston, MA 02111-1307, USA.
18*/ 18*/
19 19
20#include <stdlib.h> 20#include <stdlib.h>
21#include <unistd.h> 21#include <unistd.h>
22#include <fcntl.h> 22#include <fcntl.h>
23#include <sys/ioctl.h> 23#include <sys/ioctl.h>
24#include <signal.h> 24#include <signal.h>
25#include <sys/time.h> 25#include <sys/time.h>
26#include <linux/soundcard.h> 26#include <linux/soundcard.h>
27#include <math.h> 27#include <math.h>
28 28
29#include <qapplication.h> 29#include <qapplication.h>
30 30
31#include <qfile.h> 31#include <qfile.h>
32#include <qtextstream.h> 32#include <qtextstream.h>
33#include <qpe/sound.h> 33#include <qpe/sound.h>
34#include <qpe/resource.h> 34#include <qpe/resource.h>
35#include <qpe/config.h> 35#include <qpe/config.h>
36#include <qpe/qcopenvelope_qws.h> 36#include <qpe/qcopenvelope_qws.h>
37 37
38#include "odevice.h" 38#include "odevice.h"
39 39
40#include <qwindowsystem_qws.h> 40#include <qwindowsystem_qws.h>
41 41
42#ifndef ARRAY_SIZE 42#ifndef ARRAY_SIZE
43#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) 43#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
44#endif 44#endif
45 45
46// _IO and friends are only defined in kernel headers ... 46// _IO and friends are only defined in kernel headers ...
47 47
48#define OD_IOC(dir,type,number,size) (( dir << 30 ) | ( type << 8 ) | ( number ) | ( size << 16 )) 48#define OD_IOC(dir,type,number,size) (( dir << 30 ) | ( type << 8 ) | ( number ) | ( size << 16 ))
49 49
50#define OD_IO(type,number) OD_IOC(0,type,number,0) 50#define OD_IO(type,number) OD_IOC(0,type,number,0)
51#define OD_IOW(type,number,size) OD_IOC(1,type,number,sizeof(size)) 51#define OD_IOW(type,number,size) OD_IOC(1,type,number,sizeof(size))
52#define OD_IOR(type,number,size) OD_IOC(2,type,number,sizeof(size)) 52#define OD_IOR(type,number,size) OD_IOC(2,type,number,sizeof(size))
53#define OD_IORW(type,number,size) OD_IOC(3,type,number,sizeof(size)) 53#define OD_IORW(type,number,size) OD_IOC(3,type,number,sizeof(size))
54 54
55using namespace Opie; 55using namespace Opie;
56 56
57class ODeviceData { 57class ODeviceData {
58public: 58public:
59 QString m_vendorstr; 59 QString m_vendorstr;
60 OVendor m_vendor; 60 OVendor m_vendor;
61 61
62 QString m_modelstr; 62 QString m_modelstr;
63 OModel m_model; 63 OModel m_model;
64 64
65 QString m_systemstr; 65 QString m_systemstr;
66 OSystem m_system; 66 OSystem m_system;
67 67
68 QString m_sysverstr; 68 QString m_sysverstr;
69 69
70 Transformation m_rotation; 70 Transformation m_rotation;
71 ODirection m_direction; 71 ODirection m_direction;
72 72
73 QValueList <ODeviceButton> *m_buttons; 73 QValueList <ODeviceButton> *m_buttons;
74 uint m_holdtime; 74 uint m_holdtime;
75 QStrList *m_cpu_frequencies; 75 QStrList *m_cpu_frequencies;
76}; 76};
77 77
78 78
79class iPAQ : public ODevice, public QWSServer::KeyboardFilter { 79class iPAQ : public ODevice, public QWSServer::KeyboardFilter {
80protected: 80protected:
81 virtual void init ( ); 81 virtual void init ( );
82 virtual void initButtons ( ); 82 virtual void initButtons ( );
83 83
84public: 84public:
85 virtual bool setSoftSuspend ( bool soft ); 85 virtual bool setSoftSuspend ( bool soft );
86 86
87 virtual bool setDisplayBrightness ( int b ); 87 virtual bool setDisplayBrightness ( int b );
88 virtual int displayBrightnessResolution ( ) const; 88 virtual int displayBrightnessResolution ( ) const;
89 89
90 virtual void alarmSound ( ); 90 virtual void alarmSound ( );
91 91
92 virtual QValueList <OLed> ledList ( ) const; 92 virtual QValueList <OLed> ledList ( ) const;
93 virtual QValueList <OLedState> ledStateList ( OLed led ) const; 93 virtual QValueList <OLedState> ledStateList ( OLed led ) const;
94 virtual OLedState ledState ( OLed led ) const; 94 virtual OLedState ledState ( OLed led ) const;
95 virtual bool setLedState ( OLed led, OLedState st ); 95 virtual bool setLedState ( OLed led, OLedState st );
96 96
97 virtual bool hasLightSensor ( ) const; 97 virtual bool hasLightSensor ( ) const;
98 virtual int readLightSensor ( ); 98 virtual int readLightSensor ( );
99 virtual int lightSensorResolution ( ) const; 99 virtual int lightSensorResolution ( ) const;
100 100
101protected: 101protected:
102 virtual bool filter ( int unicode, int keycode, int modifiers, bool isPress, bool autoRepeat ); 102 virtual bool filter ( int unicode, int keycode, int modifiers, bool isPress, bool autoRepeat );
103 virtual void timerEvent ( QTimerEvent *te ); 103 virtual void timerEvent ( QTimerEvent *te );
104 104
105 int m_power_timer; 105 int m_power_timer;
106 106
107 OLedState m_leds [2]; 107 OLedState m_leds [2];
108}; 108};
109 109
110class Zaurus : public ODevice { 110class Zaurus : public ODevice {
111protected: 111protected:
112 virtual void init ( ); 112 virtual void init ( );
113 virtual void initButtons ( ); 113 virtual void initButtons ( );
114 114
115public: 115public:
116 virtual bool setSoftSuspend ( bool soft ); 116 virtual bool setSoftSuspend ( bool soft );
117 117
118 virtual bool setDisplayBrightness ( int b ); 118 virtual bool setDisplayBrightness ( int b );
119 virtual int displayBrightnessResolution ( ) const; 119 virtual int displayBrightnessResolution ( ) const;
120 120
121 virtual void alarmSound ( ); 121 virtual void alarmSound ( );
122 virtual void keySound ( ); 122 virtual void keySound ( );
123 virtual void touchSound ( ); 123 virtual void touchSound ( );
124 124
125 virtual QValueList <OLed> ledList ( ) const; 125 virtual QValueList <OLed> ledList ( ) const;
126 virtual QValueList <OLedState> ledStateList ( OLed led ) const; 126 virtual QValueList <OLedState> ledStateList ( OLed led ) const;
127 virtual OLedState ledState ( OLed led ) const; 127 virtual OLedState ledState ( OLed led ) const;
128 virtual bool setLedState ( OLed led, OLedState st ); 128 virtual bool setLedState ( OLed led, OLedState st );
129 129
130 static bool isZaurus();
131
130protected: 132protected:
131 virtual void buzzer ( int snd ); 133 virtual void buzzer ( int snd );
132 134
133 OLedState m_leds [1]; 135 OLedState m_leds [1];
136 bool m_embedix;
134}; 137};
135 138
136class SIMpad : public ODevice, public QWSServer::KeyboardFilter { 139class SIMpad : public ODevice, public QWSServer::KeyboardFilter {
137protected: 140protected:
138 virtual void init ( ); 141 virtual void init ( );
139 virtual void initButtons ( ); 142 virtual void initButtons ( );
140 143
141public: 144public:
142 virtual bool setSoftSuspend ( bool soft ); 145 virtual bool setSoftSuspend ( bool soft );
143 virtual bool suspend(); 146 virtual bool suspend();
144 147
145 virtual bool setDisplayStatus( bool on ); 148 virtual bool setDisplayStatus( bool on );
146 virtual bool setDisplayBrightness ( int b ); 149 virtual bool setDisplayBrightness ( int b );
147 virtual int displayBrightnessResolution ( ) const; 150 virtual int displayBrightnessResolution ( ) const;
148 151
149 virtual void alarmSound ( ); 152 virtual void alarmSound ( );
150 153
151 virtual QValueList <OLed> ledList ( ) const; 154 virtual QValueList <OLed> ledList ( ) const;
152 virtual QValueList <OLedState> ledStateList ( OLed led ) const; 155 virtual QValueList <OLedState> ledStateList ( OLed led ) const;
153 virtual OLedState ledState ( OLed led ) const; 156 virtual OLedState ledState ( OLed led ) const;
154 virtual bool setLedState ( OLed led, OLedState st ); 157 virtual bool setLedState ( OLed led, OLedState st );
155 158
156protected: 159protected:
157 virtual bool filter ( int unicode, int keycode, int modifiers, bool isPress, bool autoRepeat ); 160 virtual bool filter ( int unicode, int keycode, int modifiers, bool isPress, bool autoRepeat );
158 virtual void timerEvent ( QTimerEvent *te ); 161 virtual void timerEvent ( QTimerEvent *te );
159 162
160 int m_power_timer; 163 int m_power_timer;
161 164
162 OLedState m_leds [1]; //FIXME check if really only one 165 OLedState m_leds [1]; //FIXME check if really only one
163}; 166};
164 167
165class Ramses : public ODevice, public QWSServer::KeyboardFilter { 168class Ramses : public ODevice, public QWSServer::KeyboardFilter {
166protected: 169protected:
167 virtual void init ( ); 170 virtual void init ( );
168 171
169public: 172public:
170 virtual bool setSoftSuspend ( bool soft ); 173 virtual bool setSoftSuspend ( bool soft );
171 virtual bool suspend ( ); 174 virtual bool suspend ( );
172 175
173 virtual bool setDisplayStatus( bool on ); 176 virtual bool setDisplayStatus( bool on );
174 virtual bool setDisplayBrightness ( int b ); 177 virtual bool setDisplayBrightness ( int b );
175 virtual int displayBrightnessResolution ( ) const; 178 virtual int displayBrightnessResolution ( ) const;
176 virtual bool setDisplayContrast ( int b ); 179 virtual bool setDisplayContrast ( int b );
177 virtual int displayContrastResolution ( ) const; 180 virtual int displayContrastResolution ( ) const;
178 181
179protected: 182protected:
180 virtual bool filter ( int unicode, int keycode, int modifiers, bool isPress, bool autoRepeat ); 183 virtual bool filter ( int unicode, int keycode, int modifiers, bool isPress, bool autoRepeat );
181 virtual void timerEvent ( QTimerEvent *te ); 184 virtual void timerEvent ( QTimerEvent *te );
182 185
183 int m_power_timer; 186 int m_power_timer;
184}; 187};
185 188
186struct i_button { 189struct i_button {
187 uint model; 190 uint model;
188 Qt::Key code; 191 Qt::Key code;
189 char *utext; 192 char *utext;
190 char *pix; 193 char *pix;
191 char *fpressedservice; 194 char *fpressedservice;
192 char *fpressedaction; 195 char *fpressedaction;
193 char *fheldservice; 196 char *fheldservice;
194 char *fheldaction; 197 char *fheldaction;
195} ipaq_buttons [] = { 198} ipaq_buttons [] = {
196 { Model_iPAQ_H31xx | Model_iPAQ_H36xx | Model_iPAQ_H37xx | Model_iPAQ_H38xx | Model_iPAQ_H39xx, 199 { Model_iPAQ_H31xx | Model_iPAQ_H36xx | Model_iPAQ_H37xx | Model_iPAQ_H38xx | Model_iPAQ_H39xx,
197 Qt::Key_F9, QT_TRANSLATE_NOOP("Button", "Calendar Button"), 200 Qt::Key_F9, QT_TRANSLATE_NOOP("Button", "Calendar Button"),
198 "devicebuttons/ipaq_calendar", 201 "devicebuttons/ipaq_calendar",
199 "datebook", "nextView()", 202 "datebook", "nextView()",
200 "today", "raise()" }, 203 "today", "raise()" },
201 { Model_iPAQ_H31xx | Model_iPAQ_H36xx | Model_iPAQ_H37xx | Model_iPAQ_H38xx | Model_iPAQ_H39xx, 204 { Model_iPAQ_H31xx | Model_iPAQ_H36xx | Model_iPAQ_H37xx | Model_iPAQ_H38xx | Model_iPAQ_H39xx,
202 Qt::Key_F10, QT_TRANSLATE_NOOP("Button", "Contacts Button"), 205 Qt::Key_F10, QT_TRANSLATE_NOOP("Button", "Contacts Button"),
203 "devicebuttons/ipaq_contact", 206 "devicebuttons/ipaq_contact",
204 "addressbook", "raise()", 207 "addressbook", "raise()",
205 "addressbook", "beamBusinessCard()" }, 208 "addressbook", "beamBusinessCard()" },
206 { Model_iPAQ_H31xx | Model_iPAQ_H36xx | Model_iPAQ_H37xx, 209 { Model_iPAQ_H31xx | Model_iPAQ_H36xx | Model_iPAQ_H37xx,
207 Qt::Key_F11, QT_TRANSLATE_NOOP("Button", "Menu Button"), 210 Qt::Key_F11, QT_TRANSLATE_NOOP("Button", "Menu Button"),
208 "devicebuttons/ipaq_menu", 211 "devicebuttons/ipaq_menu",
209 "QPE/TaskBar", "toggleMenu()", 212 "QPE/TaskBar", "toggleMenu()",
210 "QPE/TaskBar", "toggleStartMenu()" }, 213 "QPE/TaskBar", "toggleStartMenu()" },
211 { Model_iPAQ_H38xx | Model_iPAQ_H39xx, 214 { Model_iPAQ_H38xx | Model_iPAQ_H39xx,
212 Qt::Key_F13, QT_TRANSLATE_NOOP("Button", "Mail Button"), 215 Qt::Key_F13, QT_TRANSLATE_NOOP("Button", "Mail Button"),
213 "devicebuttons/ipaq_mail", 216 "devicebuttons/ipaq_mail",
214 "mail", "raise()", 217 "mail", "raise()",
215 "mail", "newMail()" }, 218 "mail", "newMail()" },
216 { Model_iPAQ_H31xx | Model_iPAQ_H36xx | Model_iPAQ_H37xx | Model_iPAQ_H38xx | Model_iPAQ_H39xx, 219 { Model_iPAQ_H31xx | Model_iPAQ_H36xx | Model_iPAQ_H37xx | Model_iPAQ_H38xx | Model_iPAQ_H39xx,
217 Qt::Key_F12, QT_TRANSLATE_NOOP("Button", "Home Button"), 220 Qt::Key_F12, QT_TRANSLATE_NOOP("Button", "Home Button"),
218 "devicebuttons/ipaq_home", 221 "devicebuttons/ipaq_home",
219 "QPE/Launcher", "home()", 222 "QPE/Launcher", "home()",
220 "buttonsettings", "raise()" }, 223 "buttonsettings", "raise()" },
221 { Model_iPAQ_H31xx | Model_iPAQ_H36xx | Model_iPAQ_H37xx | Model_iPAQ_H38xx | Model_iPAQ_H39xx, 224 { Model_iPAQ_H31xx | Model_iPAQ_H36xx | Model_iPAQ_H37xx | Model_iPAQ_H38xx | Model_iPAQ_H39xx,
222 Qt::Key_F24, QT_TRANSLATE_NOOP("Button", "Record Button"), 225 Qt::Key_F24, QT_TRANSLATE_NOOP("Button", "Record Button"),
223 "devicebuttons/ipaq_record", 226 "devicebuttons/ipaq_record",
224 "QPE/VMemo", "toggleRecord()", 227 "QPE/VMemo", "toggleRecord()",
225 "sound", "raise()" }, 228 "sound", "raise()" },
226}; 229};
227 230
228struct z_button { 231struct z_button {
229 Qt::Key code; 232 Qt::Key code;
230 char *utext; 233 char *utext;
231 char *pix; 234 char *pix;
232 char *fpressedservice; 235 char *fpressedservice;
233 char *fpressedaction; 236 char *fpressedaction;
234 char *fheldservice; 237 char *fheldservice;
235 char *fheldaction; 238 char *fheldaction;
236} z_buttons [] = { 239} z_buttons [] = {
237 { Qt::Key_F9, QT_TRANSLATE_NOOP("Button", "Calendar Button"), 240 { Qt::Key_F9, QT_TRANSLATE_NOOP("Button", "Calendar Button"),
238 "devicebuttons/z_calendar", 241 "devicebuttons/z_calendar",
239 "datebook", "nextView()", 242 "datebook", "nextView()",
240 "today", "raise()" }, 243 "today", "raise()" },
241 { Qt::Key_F10, QT_TRANSLATE_NOOP("Button", "Contacts Button"), 244 { Qt::Key_F10, QT_TRANSLATE_NOOP("Button", "Contacts Button"),
242 "devicebuttons/z_contact", 245 "devicebuttons/z_contact",
243 "addressbook", "raise()", 246 "addressbook", "raise()",
244 "addressbook", "beamBusinessCard()" }, 247 "addressbook", "beamBusinessCard()" },
245 { Qt::Key_F12, QT_TRANSLATE_NOOP("Button", "Home Button"), 248 { Qt::Key_F12, QT_TRANSLATE_NOOP("Button", "Home Button"),
246 "devicebuttons/z_home", 249 "devicebuttons/z_home",
247 "QPE/Launcher", "home()", 250 "QPE/Launcher", "home()",
248 "buttonsettings", "raise()" }, 251 "buttonsettings", "raise()" },
249 { Qt::Key_F11, QT_TRANSLATE_NOOP("Button", "Menu Button"), 252 { Qt::Key_F11, QT_TRANSLATE_NOOP("Button", "Menu Button"),
250 "devicebuttons/z_menu", 253 "devicebuttons/z_menu",
251 "QPE/TaskBar", "toggleMenu()", 254 "QPE/TaskBar", "toggleMenu()",
252 "QPE/TaskBar", "toggleStartMenu()" }, 255 "QPE/TaskBar", "toggleStartMenu()" },
253 { Qt::Key_F13, QT_TRANSLATE_NOOP("Button", "Mail Button"), 256 { Qt::Key_F13, QT_TRANSLATE_NOOP("Button", "Mail Button"),
254 "devicebuttons/z_mail", 257 "devicebuttons/z_mail",
255 "mail", "raise()", 258 "mail", "raise()",
256 "mail", "newMail()" }, 259 "mail", "newMail()" },
257}; 260};
258 261
259struct z_button z_buttons_c700 [] = { 262struct z_button z_buttons_c700 [] = {
260 { Qt::Key_F9, QT_TRANSLATE_NOOP("Button", "Calendar Button"), 263 { Qt::Key_F9, QT_TRANSLATE_NOOP("Button", "Calendar Button"),
261 "devicebuttons/z_calendar", 264 "devicebuttons/z_calendar",
262 "datebook", "nextView()", 265 "datebook", "nextView()",
263 "today", "raise()" }, 266 "today", "raise()" },
264 { Qt::Key_F10, QT_TRANSLATE_NOOP("Button", "Contacts Button"), 267 { Qt::Key_F10, QT_TRANSLATE_NOOP("Button", "Contacts Button"),
265 "devicebuttons/z_contact", 268 "devicebuttons/z_contact",
266 "addressbook", "raise()", 269 "addressbook", "raise()",
267 "addressbook", "beamBusinessCard()" }, 270 "addressbook", "beamBusinessCard()" },
268 { Qt::Key_F12, QT_TRANSLATE_NOOP("Button", "Home Button"), 271 { Qt::Key_F12, QT_TRANSLATE_NOOP("Button", "Home Button"),
269 "devicebuttons/z_home", 272 "devicebuttons/z_home",
270 "QPE/Launcher", "home()", 273 "QPE/Launcher", "home()",
271 "buttonsettings", "raise()" }, 274 "buttonsettings", "raise()" },
272 { Qt::Key_F11, QT_TRANSLATE_NOOP("Button", "Menu Button"), 275 { Qt::Key_F11, QT_TRANSLATE_NOOP("Button", "Menu Button"),
273 "devicebuttons/z_menu", 276 "devicebuttons/z_menu",
274 "QPE/TaskBar", "toggleMenu()", 277 "QPE/TaskBar", "toggleMenu()",
275 "QPE/TaskBar", "toggleStartMenu()" }, 278 "QPE/TaskBar", "toggleStartMenu()" },
276 { Qt::Key_F13, QT_TRANSLATE_NOOP("Button", "Display Rotate"), 279 { Qt::Key_F13, QT_TRANSLATE_NOOP("Button", "Display Rotate"),
277 "", 280 "",
278 "QPE/Rotation", "flip()", 281 "QPE/Rotation", "flip()",
279 "QPE/Rotation", "flip()" }, 282 "QPE/Rotation", "flip()" },
280}; 283};
281 284
282struct s_button { 285struct s_button {
283 uint model; 286 uint model;
284 Qt::Key code; 287 Qt::Key code;
285 char *utext; 288 char *utext;
286 char *pix; 289 char *pix;
287 char *fpressedservice; 290 char *fpressedservice;
288 char *fpressedaction; 291 char *fpressedaction;
289 char *fheldservice; 292 char *fheldservice;
290 char *fheldaction; 293 char *fheldaction;
291} simpad_buttons [] = { 294} simpad_buttons [] = {
292 { Model_SIMpad_CL4 | Model_SIMpad_SL4 | Model_SIMpad_SLC | Model_SIMpad_TSinus, 295 { Model_SIMpad_CL4 | Model_SIMpad_SL4 | Model_SIMpad_SLC | Model_SIMpad_TSinus,
293 Qt::Key_F9, QT_TRANSLATE_NOOP("Button", "Lower+Up"), 296 Qt::Key_F9, QT_TRANSLATE_NOOP("Button", "Lower+Up"),
294 "devicebuttons/simpad_lower_up", 297 "devicebuttons/simpad_lower_up",
295 "datebook", "nextView()", 298 "datebook", "nextView()",
296 "today", "raise()" }, 299 "today", "raise()" },
297 { Model_SIMpad_CL4 | Model_SIMpad_SL4 | Model_SIMpad_SLC | Model_SIMpad_TSinus, 300 { Model_SIMpad_CL4 | Model_SIMpad_SL4 | Model_SIMpad_SLC | Model_SIMpad_TSinus,
298 Qt::Key_F10, QT_TRANSLATE_NOOP("Button", "Lower+Down"), 301 Qt::Key_F10, QT_TRANSLATE_NOOP("Button", "Lower+Down"),
299 "devicebuttons/simpad_lower_down", 302 "devicebuttons/simpad_lower_down",
300 "addressbook", "raise()", 303 "addressbook", "raise()",
301 "addressbook", "beamBusinessCard()" }, 304 "addressbook", "beamBusinessCard()" },
302 { Model_SIMpad_CL4 | Model_SIMpad_SL4 | Model_SIMpad_SLC | Model_SIMpad_TSinus, 305 { Model_SIMpad_CL4 | Model_SIMpad_SL4 | Model_SIMpad_SLC | Model_SIMpad_TSinus,
303 Qt::Key_F11, QT_TRANSLATE_NOOP("Button", "Lower+Right"), 306 Qt::Key_F11, QT_TRANSLATE_NOOP("Button", "Lower+Right"),
304 "devicebuttons/simpad_lower_right", 307 "devicebuttons/simpad_lower_right",
305 "QPE/TaskBar", "toggleMenu()", 308 "QPE/TaskBar", "toggleMenu()",
306 "QPE/TaskBar", "toggleStartMenu()" }, 309 "QPE/TaskBar", "toggleStartMenu()" },
307 { Model_SIMpad_CL4 | Model_SIMpad_SL4 | Model_SIMpad_SLC | Model_SIMpad_TSinus, 310 { Model_SIMpad_CL4 | Model_SIMpad_SL4 | Model_SIMpad_SLC | Model_SIMpad_TSinus,
308 Qt::Key_F13, QT_TRANSLATE_NOOP("Button", "Lower+Left"), 311 Qt::Key_F13, QT_TRANSLATE_NOOP("Button", "Lower+Left"),
309 "devicebuttons/simpad_lower_left", 312 "devicebuttons/simpad_lower_left",
310 "mail", "raise()", 313 "mail", "raise()",
311 "mail", "newMail()" }, 314 "mail", "newMail()" },
312 315
313 { Model_SIMpad_CL4 | Model_SIMpad_SL4 | Model_SIMpad_SLC | Model_SIMpad_TSinus, 316 { Model_SIMpad_CL4 | Model_SIMpad_SL4 | Model_SIMpad_SLC | Model_SIMpad_TSinus,
314 Qt::Key_F5, QT_TRANSLATE_NOOP("Button", "Upper+Up"), 317 Qt::Key_F5, QT_TRANSLATE_NOOP("Button", "Upper+Up"),
315 "devicebuttons/simpad_upper_up", 318 "devicebuttons/simpad_upper_up",
316 "QPE/Launcher", "home()", 319 "QPE/Launcher", "home()",
317 "buttonsettings", "raise()" }, 320 "buttonsettings", "raise()" },
318 { Model_SIMpad_CL4 | Model_SIMpad_SL4 | Model_SIMpad_SLC | Model_SIMpad_TSinus, 321 { Model_SIMpad_CL4 | Model_SIMpad_SL4 | Model_SIMpad_SLC | Model_SIMpad_TSinus,
319 Qt::Key_F6, QT_TRANSLATE_NOOP("Button", "Upper+Down"), 322 Qt::Key_F6, QT_TRANSLATE_NOOP("Button", "Upper+Down"),
320 "devicebuttons/simpad_upper_down", 323 "devicebuttons/simpad_upper_down",
321 "addressbook", "raise()", 324 "addressbook", "raise()",
322 "addressbook", "beamBusinessCard()" }, 325 "addressbook", "beamBusinessCard()" },
323 { Model_SIMpad_CL4 | Model_SIMpad_SL4 | Model_SIMpad_SLC | Model_SIMpad_TSinus, 326 { Model_SIMpad_CL4 | Model_SIMpad_SL4 | Model_SIMpad_SLC | Model_SIMpad_TSinus,
324 Qt::Key_F7, QT_TRANSLATE_NOOP("Button", "Upper+Right"), 327 Qt::Key_F7, QT_TRANSLATE_NOOP("Button", "Upper+Right"),
325 "devicebuttons/simpad_upper_right", 328 "devicebuttons/simpad_upper_right",
326 "QPE/TaskBar", "toggleMenu()", 329 "QPE/TaskBar", "toggleMenu()",
327 "QPE/TaskBar", "toggleStartMenu()" }, 330 "QPE/TaskBar", "toggleStartMenu()" },
328 { Model_SIMpad_CL4 | Model_SIMpad_SL4 | Model_SIMpad_SLC | Model_SIMpad_TSinus, 331 { Model_SIMpad_CL4 | Model_SIMpad_SL4 | Model_SIMpad_SLC | Model_SIMpad_TSinus,
329 Qt::Key_F13, QT_TRANSLATE_NOOP("Button", "Upper+Left"), 332 Qt::Key_F13, QT_TRANSLATE_NOOP("Button", "Upper+Left"),
330 "devicebuttons/simpad_upper_left", 333 "devicebuttons/simpad_upper_left",
331 "QPE/Rotation", "flip()", 334 "QPE/Rotation", "flip()",
332 "QPE/Rotation", "flip()" }, 335 "QPE/Rotation", "flip()" },
333 /* 336 /*
334 { Model_SIMpad_CL4 | Model_SIMpad_SL4 | Model_SIMpad_SLC | Model_SIMpad_TSinus, 337 { Model_SIMpad_CL4 | Model_SIMpad_SL4 | Model_SIMpad_SLC | Model_SIMpad_TSinus,
335 Qt::Key_F12, QT_TRANSLATE_NOOP("Button", "Lower+Upper"), 338 Qt::Key_F12, QT_TRANSLATE_NOOP("Button", "Lower+Upper"),
336 "devicebuttons/simpad_lower_upper", 339 "devicebuttons/simpad_lower_upper",
337 "QPE/Launcher", "home()", 340 "QPE/Launcher", "home()",
338 "buttonsettings", "raise()" }, 341 "buttonsettings", "raise()" },
339 { Model_SIMpad_CL4 | Model_SIMpad_SL4 | Model_SIMpad_SLC | Model_SIMpad_TSinus, 342 { Model_SIMpad_CL4 | Model_SIMpad_SL4 | Model_SIMpad_SLC | Model_SIMpad_TSinus,
340 Qt::Key_F12, QT_TRANSLATE_NOOP("Button", "Lower+Upper"), 343 Qt::Key_F12, QT_TRANSLATE_NOOP("Button", "Lower+Upper"),
341 "devicebuttons/simpad_upper_lower", 344 "devicebuttons/simpad_upper_lower",
342 "QPE/Launcher", "home()", 345 "QPE/Launcher", "home()",
343 "buttonsettings", "raise()" }, 346 "buttonsettings", "raise()" },
344 */ 347 */
345}; 348};
346 349
347struct r_button { 350struct r_button {
348 uint model; 351 uint model;
349 Qt::Key code; 352 Qt::Key code;
350 char *utext; 353 char *utext;
351 char *pix; 354 char *pix;
352 char *fpressedservice; 355 char *fpressedservice;
353 char *fpressedaction; 356 char *fpressedaction;
354 char *fheldservice; 357 char *fheldservice;
355 char *fheldaction; 358 char *fheldaction;
356} ramses_buttons [] = { 359} ramses_buttons [] = {
357 { Model_Ramses_MNCI, 360 { Model_Ramses_MNCI,
358 Qt::Key_F11, QT_TRANSLATE_NOOP("Button", "Menu Button"), 361 Qt::Key_F11, QT_TRANSLATE_NOOP("Button", "Menu Button"),
359 "devicebuttons/z_menu", 362 "devicebuttons/z_menu",
360 "QPE/TaskBar", "toggleMenu()", 363 "QPE/TaskBar", "toggleMenu()",
361 "QPE/TaskBar", "toggleStartMenu()" }, 364 "QPE/TaskBar", "toggleStartMenu()" },
362 { Model_Ramses_MNCI, 365 { Model_Ramses_MNCI,
363 Qt::Key_F12, QT_TRANSLATE_NOOP("Button", "Home Button"), 366 Qt::Key_F12, QT_TRANSLATE_NOOP("Button", "Home Button"),
364 "devicebuttons/ipaq_home", 367 "devicebuttons/ipaq_home",
365 "QPE/Launcher", "home()", 368 "QPE/Launcher", "home()",
366 "buttonsettings", "raise()" }, 369 "buttonsettings", "raise()" },
367}; 370};
368 371
369static QCString makeChannel ( const char *str ) 372static QCString makeChannel ( const char *str )
370{ 373{
371 if ( str && !::strchr ( str, '/' )) 374 if ( str && !::strchr ( str, '/' ))
372 return QCString ( "QPE/Application/" ) + str; 375 return QCString ( "QPE/Application/" ) + str;
373 else 376 else
374 return str; 377 return str;
375} 378}
376 379
377static inline bool isQWS() 380static inline bool isQWS()
378{ 381{
379 return qApp ? ( qApp-> type ( ) == QApplication::GuiServer ) : false; 382 return qApp ? ( qApp-> type ( ) == QApplication::GuiServer ) : false;
380} 383}
381 384
382ODevice *ODevice::inst ( ) 385ODevice *ODevice::inst ( )
383{ 386{
384 static ODevice *dev = 0; 387 static ODevice *dev = 0;
385 388
386 if ( !dev ) { 389 if ( !dev ) {
387 if ( QFile::exists ( "/proc/hal/model" )) 390 if ( QFile::exists ( "/proc/hal/model" ))
388 dev = new iPAQ ( ); 391 dev = new iPAQ ( );
389 else if ( QFile::exists ( "/dev/sharp_buz" ) || QFile::exists ( "/dev/sharp_led" )) 392 else if ( Zaurus::isZaurus() )
390 dev = new Zaurus ( ); 393 dev = new Zaurus ( );
391 else if ( QFile::exists ( "/proc/ucb1x00" ) && QFile::exists ( "/proc/cs3" )) 394 else if ( QFile::exists ( "/proc/ucb1x00" ) && QFile::exists ( "/proc/cs3" ))
392 dev = new SIMpad ( ); 395 dev = new SIMpad ( );
393 else if ( QFile::exists ( "/proc/sys/board/name" )) 396 else if ( QFile::exists ( "/proc/sys/board/name" ))
394 dev = new Ramses ( ); 397 dev = new Ramses ( );
395 else 398 else
396 dev = new ODevice ( ); 399 dev = new ODevice ( );
397 400
398 dev-> init ( ); 401 dev-> init ( );
399 } 402 }
400 return dev; 403 return dev;
401} 404}
402 405
403 406
404/************************************************** 407/**************************************************
405 * 408 *
406 * common 409 * common
407 * 410 *
408 **************************************************/ 411 **************************************************/
409 412
410 413
411ODevice::ODevice ( ) 414ODevice::ODevice ( )
412{ 415{
413 d = new ODeviceData; 416 d = new ODeviceData;
414 417
415 d-> m_modelstr = "Unknown"; 418 d-> m_modelstr = "Unknown";
416 d-> m_model = Model_Unknown; 419 d-> m_model = Model_Unknown;
417 d-> m_vendorstr = "Unknown"; 420 d-> m_vendorstr = "Unknown";
418 d-> m_vendor = Vendor_Unknown; 421 d-> m_vendor = Vendor_Unknown;
419 d-> m_systemstr = "Unknown"; 422 d-> m_systemstr = "Unknown";
420 d-> m_system = System_Unknown; 423 d-> m_system = System_Unknown;
421 d-> m_sysverstr = "0.0"; 424 d-> m_sysverstr = "0.0";
422 d-> m_rotation = Rot0; 425 d-> m_rotation = Rot0;
423 d-> m_direction = CW; 426 d-> m_direction = CW;
424 427
425 d-> m_holdtime = 1000; // 1000ms 428 d-> m_holdtime = 1000; // 1000ms
426 d-> m_buttons = 0; 429 d-> m_buttons = 0;
427 d-> m_cpu_frequencies = new QStrList; 430 d-> m_cpu_frequencies = new QStrList;
428} 431}
429 432
430void ODevice::systemMessage ( const QCString &msg, const QByteArray & ) 433void ODevice::systemMessage ( const QCString &msg, const QByteArray & )
431{ 434{
432 if ( msg == "deviceButtonMappingChanged()" ) { 435 if ( msg == "deviceButtonMappingChanged()" ) {
433 reloadButtonMapping ( ); 436 reloadButtonMapping ( );
434 } 437 }
435} 438}
436 439
437void ODevice::init ( ) 440void ODevice::init ( )
438{ 441{
439} 442}
440 443
441/** 444/**
442 * This method initialises the button mapping 445 * This method initialises the button mapping
443 */ 446 */
444void ODevice::initButtons ( ) 447void ODevice::initButtons ( )
445{ 448{
446 if ( d-> m_buttons ) 449 if ( d-> m_buttons )
447 return; 450 return;
448 451
449 // Simulation uses iPAQ 3660 device buttons 452 // Simulation uses iPAQ 3660 device buttons
450 453
451 qDebug ( "init Buttons" ); 454 qDebug ( "init Buttons" );
452 d-> m_buttons = new QValueList <ODeviceButton>; 455 d-> m_buttons = new QValueList <ODeviceButton>;
453 456
454 for ( uint i = 0; i < ( sizeof( ipaq_buttons ) / sizeof( i_button )); i++ ) { 457 for ( uint i = 0; i < ( sizeof( ipaq_buttons ) / sizeof( i_button )); i++ ) {
455 i_button *ib = ipaq_buttons + i; 458 i_button *ib = ipaq_buttons + i;
456 ODeviceButton b; 459 ODeviceButton b;
457 460
458 if (( ib-> model & Model_iPAQ_H36xx ) == Model_iPAQ_H36xx ) { 461 if (( ib-> model & Model_iPAQ_H36xx ) == Model_iPAQ_H36xx ) {
459 b. setKeycode ( ib-> code ); 462 b. setKeycode ( ib-> code );
460 b. setUserText ( QObject::tr ( "Button", ib-> utext )); 463 b. setUserText ( QObject::tr ( "Button", ib-> utext ));
461 b. setPixmap ( Resource::loadPixmap ( ib-> pix )); 464 b. setPixmap ( Resource::loadPixmap ( ib-> pix ));
462 b. setFactoryPresetPressedAction ( OQCopMessage ( makeChannel ( ib-> fpressedservice ), ib-> fpressedaction )); 465 b. setFactoryPresetPressedAction ( OQCopMessage ( makeChannel ( ib-> fpressedservice ), ib-> fpressedaction ));
463 b. setFactoryPresetHeldAction ( OQCopMessage ( makeChannel ( ib-> fheldservice ), ib-> fheldaction )); 466 b. setFactoryPresetHeldAction ( OQCopMessage ( makeChannel ( ib-> fheldservice ), ib-> fheldaction ));
464 d-> m_buttons-> append ( b ); 467 d-> m_buttons-> append ( b );
465 } 468 }
466 } 469 }
467 reloadButtonMapping ( ); 470 reloadButtonMapping ( );
468 471
469 QCopChannel *sysch = new QCopChannel ( "QPE/System", this ); 472 QCopChannel *sysch = new QCopChannel ( "QPE/System", this );
470 connect ( sysch, SIGNAL( received( const QCString &, const QByteArray & )), this, SLOT( systemMessage ( const QCString &, const QByteArray & ))); 473 connect ( sysch, SIGNAL( received( const QCString &, const QByteArray & )), this, SLOT( systemMessage ( const QCString &, const QByteArray & )));
471} 474}
472 475
473ODevice::~ODevice ( ) 476ODevice::~ODevice ( )
474{ 477{
475// we leak m_devicebuttons and m_cpu_frequency 478// we leak m_devicebuttons and m_cpu_frequency
476// but it's a singleton and it is not so importantant 479// but it's a singleton and it is not so importantant
477// -zecke 480// -zecke
478 delete d; 481 delete d;
479} 482}
480 483
481bool ODevice::setSoftSuspend ( bool /*soft*/ ) 484bool ODevice::setSoftSuspend ( bool /*soft*/ )
482{ 485{
483 return false; 486 return false;
484} 487}
485 488
486//#include <linux/apm_bios.h> 489//#include <linux/apm_bios.h>
487 490
488#define APM_IOC_SUSPEND OD_IO( 'A', 2 ) 491#define APM_IOC_SUSPEND OD_IO( 'A', 2 )
489 492
490/** 493/**
491 * This method will try to suspend the device 494 * This method will try to suspend the device
492 * It only works if the user is the QWS Server and the apm application 495 * It only works if the user is the QWS Server and the apm application
493 * is installed. 496 * is installed.
494 * It tries to suspend and then waits some time cause some distributions 497 * It tries to suspend and then waits some time cause some distributions
495 * do have asynchronus apm implementations. 498 * do have asynchronus apm implementations.
496 * This method will either fail and return false or it'll suspend the 499 * This method will either fail and return false or it'll suspend the
497 * device and return once the device got woken up 500 * device and return once the device got woken up
498 * 501 *
499 * @return if the device got suspended 502 * @return if the device got suspended
500 */ 503 */
501bool ODevice::suspend ( ) 504bool ODevice::suspend ( )
502{ 505{
503 qDebug("ODevice::suspend"); 506 qDebug("ODevice::suspend");
504 if ( !isQWS( ) ) // only qwsserver is allowed to suspend 507 if ( !isQWS( ) ) // only qwsserver is allowed to suspend
505 return false; 508 return false;
506 509
507 if ( d-> m_model == Model_Unknown ) // better don't suspend in qvfb / on unkown devices 510 if ( d-> m_model == Model_Unknown ) // better don't suspend in qvfb / on unkown devices
508 return false; 511 return false;
509 512
510 bool res = false; 513 bool res = false;
511 514
512 struct timeval tvs, tvn; 515 struct timeval tvs, tvn;
513 ::gettimeofday ( &tvs, 0 ); 516 ::gettimeofday ( &tvs, 0 );
514 517
515 ::sync ( ); // flush fs caches 518 ::sync ( ); // flush fs caches
516 res = ( ::system ( "apm --suspend" ) == 0 ); 519 res = ( ::system ( "apm --suspend" ) == 0 );
517 520
@@ -1195,652 +1198,731 @@ void iPAQ::alarmSound ( )
1195 if (( fd = ::open ( "/dev/sound/mixer", O_RDWR )) >= 0 ) { 1198 if (( fd = ::open ( "/dev/sound/mixer", O_RDWR )) >= 0 ) {
1196 if ( ::ioctl ( fd, MIXER_READ( 0 ), &vol ) >= 0 ) { 1199 if ( ::ioctl ( fd, MIXER_READ( 0 ), &vol ) >= 0 ) {
1197 Config cfg ( "qpe" ); 1200 Config cfg ( "qpe" );
1198 cfg. setGroup ( "Volume" ); 1201 cfg. setGroup ( "Volume" );
1199 1202
1200 int volalarm = cfg. readNumEntry ( "AlarmPercent", 50 ); 1203 int volalarm = cfg. readNumEntry ( "AlarmPercent", 50 );
1201 if ( volalarm < 0 ) 1204 if ( volalarm < 0 )
1202 volalarm = 0; 1205 volalarm = 0;
1203 else if ( volalarm > 100 ) 1206 else if ( volalarm > 100 )
1204 volalarm = 100; 1207 volalarm = 100;
1205 volalarm |= ( volalarm << 8 ); 1208 volalarm |= ( volalarm << 8 );
1206 1209
1207 if ( ::ioctl ( fd, MIXER_WRITE( 0 ), &volalarm ) >= 0 ) 1210 if ( ::ioctl ( fd, MIXER_WRITE( 0 ), &volalarm ) >= 0 )
1208 vol_reset = true; 1211 vol_reset = true;
1209 } 1212 }
1210 } 1213 }
1211 1214
1212 snd. play ( ); 1215 snd. play ( );
1213 while ( !snd. isFinished ( )) 1216 while ( !snd. isFinished ( ))
1214 qApp-> processEvents ( ); 1217 qApp-> processEvents ( );
1215 1218
1216 if ( fd >= 0 ) { 1219 if ( fd >= 0 ) {
1217 if ( vol_reset ) 1220 if ( vol_reset )
1218 ::ioctl ( fd, MIXER_WRITE( 0 ), &vol ); 1221 ::ioctl ( fd, MIXER_WRITE( 0 ), &vol );
1219 ::close ( fd ); 1222 ::close ( fd );
1220 } 1223 }
1221#endif 1224#endif
1222} 1225}
1223 1226
1224 1227
1225bool iPAQ::setSoftSuspend ( bool soft ) 1228bool iPAQ::setSoftSuspend ( bool soft )
1226{ 1229{
1227 bool res = false; 1230 bool res = false;
1228 int fd; 1231 int fd;
1229 1232
1230 if (( fd = ::open ( "/proc/sys/ts/suspend_button_mode", O_WRONLY )) >= 0 ) { 1233 if (( fd = ::open ( "/proc/sys/ts/suspend_button_mode", O_WRONLY )) >= 0 ) {
1231 if ( ::write ( fd, soft ? "1" : "0", 1 ) == 1 ) 1234 if ( ::write ( fd, soft ? "1" : "0", 1 ) == 1 )
1232 res = true; 1235 res = true;
1233 else 1236 else
1234 ::perror ( "write to /proc/sys/ts/suspend_button_mode" ); 1237 ::perror ( "write to /proc/sys/ts/suspend_button_mode" );
1235 1238
1236 ::close ( fd ); 1239 ::close ( fd );
1237 } 1240 }
1238 else 1241 else
1239 ::perror ( "/proc/sys/ts/suspend_button_mode" ); 1242 ::perror ( "/proc/sys/ts/suspend_button_mode" );
1240 1243
1241 return res; 1244 return res;
1242} 1245}
1243 1246
1244 1247
1245bool iPAQ::setDisplayBrightness ( int bright ) 1248bool iPAQ::setDisplayBrightness ( int bright )
1246{ 1249{
1247 bool res = false; 1250 bool res = false;
1248 int fd; 1251 int fd;
1249 1252
1250 if ( bright > 255 ) 1253 if ( bright > 255 )
1251 bright = 255; 1254 bright = 255;
1252 if ( bright < 0 ) 1255 if ( bright < 0 )
1253 bright = 0; 1256 bright = 0;
1254 1257
1255 if (( fd = ::open ( "/dev/touchscreen/0", O_WRONLY )) >= 0 ) { 1258 if (( fd = ::open ( "/dev/touchscreen/0", O_WRONLY )) >= 0 ) {
1256 FLITE_IN bl; 1259 FLITE_IN bl;
1257 bl. mode = 1; 1260 bl. mode = 1;
1258 bl. pwr = bright ? 1 : 0; 1261 bl. pwr = bright ? 1 : 0;
1259 bl. brightness = ( bright * ( displayBrightnessResolution ( ) - 1 ) + 127 ) / 255; 1262 bl. brightness = ( bright * ( displayBrightnessResolution ( ) - 1 ) + 127 ) / 255;
1260 res = ( ::ioctl ( fd, FLITE_ON, &bl ) == 0 ); 1263 res = ( ::ioctl ( fd, FLITE_ON, &bl ) == 0 );
1261 ::close ( fd ); 1264 ::close ( fd );
1262 } 1265 }
1263 return res; 1266 return res;
1264} 1267}
1265 1268
1266int iPAQ::displayBrightnessResolution ( ) const 1269int iPAQ::displayBrightnessResolution ( ) const
1267{ 1270{
1268 switch ( model ( )) { 1271 switch ( model ( )) {
1269 case Model_iPAQ_H31xx: 1272 case Model_iPAQ_H31xx:
1270 case Model_iPAQ_H36xx: 1273 case Model_iPAQ_H36xx:
1271 case Model_iPAQ_H37xx: 1274 case Model_iPAQ_H37xx:
1272 return 128; // really 256, but >128 could damage the LCD 1275 return 128; // really 256, but >128 could damage the LCD
1273 1276
1274 case Model_iPAQ_H38xx: 1277 case Model_iPAQ_H38xx:
1275 case Model_iPAQ_H39xx: 1278 case Model_iPAQ_H39xx:
1276 return 64; 1279 return 64;
1277 1280
1278 default: 1281 default:
1279 return 2; 1282 return 2;
1280 } 1283 }
1281} 1284}
1282 1285
1283 1286
1284bool iPAQ::hasLightSensor ( ) const 1287bool iPAQ::hasLightSensor ( ) const
1285{ 1288{
1286 return true; 1289 return true;
1287} 1290}
1288 1291
1289int iPAQ::readLightSensor ( ) 1292int iPAQ::readLightSensor ( )
1290{ 1293{
1291 int fd; 1294 int fd;
1292 int val = -1; 1295 int val = -1;
1293 1296
1294 if (( fd = ::open ( "/proc/hal/light_sensor", O_RDONLY )) >= 0 ) { 1297 if (( fd = ::open ( "/proc/hal/light_sensor", O_RDONLY )) >= 0 ) {
1295 char buffer [8]; 1298 char buffer [8];
1296 1299
1297 if ( ::read ( fd, buffer, 5 ) == 5 ) { 1300 if ( ::read ( fd, buffer, 5 ) == 5 ) {
1298 char *endptr; 1301 char *endptr;
1299 1302
1300 buffer [4] = 0; 1303 buffer [4] = 0;
1301 val = ::strtol ( buffer + 2, &endptr, 16 ); 1304 val = ::strtol ( buffer + 2, &endptr, 16 );
1302 1305
1303 if ( *endptr != 0 ) 1306 if ( *endptr != 0 )
1304 val = -1; 1307 val = -1;
1305 } 1308 }
1306 ::close ( fd ); 1309 ::close ( fd );
1307 } 1310 }
1308 1311
1309 return val; 1312 return val;
1310} 1313}
1311 1314
1312int iPAQ::lightSensorResolution ( ) const 1315int iPAQ::lightSensorResolution ( ) const
1313{ 1316{
1314 return 256; 1317 return 256;
1315} 1318}
1316 1319
1317/************************************************** 1320/**************************************************
1318 * 1321 *
1319 * Zaurus 1322 * Zaurus
1320 * 1323 *
1321 **************************************************/ 1324 **************************************************/
1322 1325
1326// Check whether this device is the sharp zaurus..
1327bool Zaurus::isZaurus()
1328{
1329
1330 // If the special devices by embedix exist, it is quite simple: it is a Zaurus !
1331 if ( QFile::exists ( "/dev/sharp_buz" ) || QFile::exists ( "/dev/sharp_led" ) ){
1332 return true;
1333 }
1334
1335 // On non-embedix kenrnels, we have too look closer.
1336 bool is_zaurus = false;
1337 QFile f ( "/proc/cpuinfo" );
1338 if ( f. open ( IO_ReadOnly ) ) {
1339 QString model;
1340 QFile f ( "/proc/cpuinfo" );
1341
1342 QTextStream ts ( &f );
1343 QString line;
1344 while( line = ts. readLine ( ) ) {
1345 if ( line. left ( 8 ) == "Hardware" )
1346 break;
1347 }
1348 int loc = line. find ( ":" );
1349 if ( loc != -1 )
1350 model = line. mid ( loc + 2 ). simplifyWhiteSpace( );
1351
1352 if ( model == "Sharp-Collie"
1353 || model == "Collie"
1354 || model == "SHARP Corgi"
1355 || model == "SHARP Shepherd"
1356 || model == "SHARP Poodle"
1357 )
1358 is_zaurus = true;
1359
1360 }
1361 return is_zaurus;
1362}
1323 1363
1324 1364
1325void Zaurus::init ( ) 1365void Zaurus::init ( )
1326{ 1366{
1327 d-> m_vendorstr = "Sharp"; 1367 d-> m_vendorstr = "Sharp";
1328 d-> m_vendor = Vendor_Sharp; 1368 d-> m_vendor = Vendor_Sharp;
1369 m_embedix = true; // Not openzaurus means: It has an embedix kernel !
1329 1370
1330 // QFile f ( "/proc/filesystems" ); 1371 // QFile f ( "/proc/filesystems" );
1331 QString model; 1372 QString model;
1332 1373
1333 // It isn't a good idea to check the system configuration to 1374 // It isn't a good idea to check the system configuration to
1334 // detect the distribution ! 1375 // detect the distribution !
1335 // Otherwise it may happen that any other distribution is detected as openzaurus, just 1376 // Otherwise it may happen that any other distribution is detected as openzaurus, just
1336 // because it uses a jffs2 filesystem.. 1377 // because it uses a jffs2 filesystem..
1337 // (eilers) 1378 // (eilers)
1338 // if ( f. open ( IO_ReadOnly ) && ( QTextStream ( &f ). read ( ). find ( "\tjffs2\n" ) >= 0 )) { 1379 // if ( f. open ( IO_ReadOnly ) && ( QTextStream ( &f ). read ( ). find ( "\tjffs2\n" ) >= 0 )) {
1339 QFile f ("/etc/oz_version"); 1380 QFile f ("/etc/oz_version");
1340 if ( f.exists() ){ 1381 if ( f.exists() ){
1341 d-> m_vendorstr = "OpenZaurus Team"; 1382 d-> m_vendorstr = "OpenZaurus Team";
1342 d-> m_systemstr = "OpenZaurus"; 1383 d-> m_systemstr = "OpenZaurus";
1343 d-> m_system = System_OpenZaurus; 1384 d-> m_system = System_OpenZaurus;
1344 1385
1345 // f. close ( );
1346
1347 // f. setName ( "/etc/oz_version" );
1348 if ( f. open ( IO_ReadOnly )) { 1386 if ( f. open ( IO_ReadOnly )) {
1349 QTextStream ts ( &f ); 1387 QTextStream ts ( &f );
1350 d-> m_sysverstr = ts. readLine ( );//. mid ( 10 ); 1388 d-> m_sysverstr = ts. readLine ( );//. mid ( 10 );
1351 f. close ( ); 1389 f. close ( );
1352 } 1390 }
1391
1392 // Openzaurus sometimes uses the embedix kernel!
1393 // => Check whether this is an embedix kernel
1394 FILE *uname = popen("uname -r", "r");
1395 QString line;
1396 if ( f.open(IO_ReadOnly, uname) ) {
1397 QTextStream ts ( &f );
1398 line = ts. readLine ( );
1399 int loc = line. find ( "embedix" );
1400 if ( loc != -1 )
1401 m_embedix = true;
1402 else
1403 m_embedix = false;
1404 f. close ( );
1405 }
1406 pclose(uname);
1353 } 1407 }
1354 else { 1408 else {
1355 d-> m_systemstr = "Zaurus"; 1409 d-> m_systemstr = "Zaurus";
1356 d-> m_system = System_Zaurus; 1410 d-> m_system = System_Zaurus;
1357 } 1411 }
1358 1412
1359 f. setName ( "/proc/cpuinfo" ); 1413 f. setName ( "/proc/cpuinfo" );
1360 if ( f. open ( IO_ReadOnly ) ) { 1414 if ( f. open ( IO_ReadOnly ) ) {
1361 QTextStream ts ( &f ); 1415 QTextStream ts ( &f );
1362 QString line; 1416 QString line;
1363 while( line = ts. readLine ( ) ) { 1417 while( line = ts. readLine ( ) ) {
1364 if ( line. left ( 8 ) == "Hardware" ) 1418 if ( line. left ( 8 ) == "Hardware" )
1365 break; 1419 break;
1366 } 1420 }
1367 int loc = line. find ( ":" ); 1421 int loc = line. find ( ":" );
1368 if ( loc != -1 ) 1422 if ( loc != -1 )
1369 model = line. mid ( loc + 2 ). simplifyWhiteSpace( ); 1423 model = line. mid ( loc + 2 ). simplifyWhiteSpace( );
1370 } 1424 }
1371 1425
1372 if ( model == "SHARP Corgi" ) { 1426 if ( model == "SHARP Corgi" ) {
1373 d-> m_model = Model_Zaurus_SLC700; 1427 d-> m_model = Model_Zaurus_SLC700;
1374 d-> m_modelstr = "Zaurus SL-C700"; 1428 d-> m_modelstr = "Zaurus SL-C700";
1375 } else if ( model == "SHARP Shepherd" ) { 1429 } else if ( model == "SHARP Shepherd" ) {
1376 d-> m_model = Model_Zaurus_SLC700; // Do we need a special type for the C750 ? (eilers) 1430 d-> m_model = Model_Zaurus_SLC700; // Do we need a special type for the C750 ? (eilers)
1377 d-> m_modelstr = "Zaurus SL-C750"; 1431 d-> m_modelstr = "Zaurus SL-C750";
1378 }else if ( model == "SHARP Poodle" ) { 1432 } else if ( model == "SHARP Poodle" ) {
1379 d-> m_model = Model_Zaurus_SLB600; 1433 d-> m_model = Model_Zaurus_SLB600;
1380 d-> m_modelstr = "Zaurus SL-B500 or SL-5600"; 1434 d-> m_modelstr = "Zaurus SL-B500 or SL-5600";
1381 } else if ( model = "Sharp-Collie" ) { 1435 } else if ( model == "Sharp-Collie" || model == "Collie" ) {
1382 d-> m_model = Model_Zaurus_SL5500; 1436 d-> m_model = Model_Zaurus_SL5500;
1383 d-> m_modelstr = "Zaurus SL-5500 or SL-5000d"; 1437 d-> m_modelstr = "Zaurus SL-5500 or SL-5000d";
1384 } else { 1438 } else {
1385 d-> m_model = Model_Zaurus_SL5500; 1439 d-> m_model = Model_Zaurus_SL5500;
1386 d-> m_modelstr = "Zaurus (Model unknown)"; 1440 d-> m_modelstr = "Zaurus (Model unknown)";
1387 } 1441 }
1388 1442
1389 bool flipstate = false; 1443 bool flipstate = false;
1390 switch ( d-> m_model ) { 1444 switch ( d-> m_model ) {
1391 case Model_Zaurus_SLA300: 1445 case Model_Zaurus_SLA300:
1392 d-> m_rotation = Rot0; 1446 d-> m_rotation = Rot0;
1393 break; 1447 break;
1394 case Model_Zaurus_SLC700: 1448 case Model_Zaurus_SLC700:
1395 // Note: need to 1) set flipstate based on physical screen orientation 1449 // Note: need to 1) set flipstate based on physical screen orientation
1396 // and 2) check to see if the user overrode the rotation direction 1450 // and 2) check to see if the user overrode the rotation direction
1397 // using appearance, and if so, remove that item from the Config to 1451 // using appearance, and if so, remove that item from the Config to
1398 // ensure the rotate applet flips us back to the previous state. 1452 // ensure the rotate applet flips us back to the previous state.
1399 if ( flipstate ) { 1453 if ( flipstate ) {
1400 // 480x640 1454 // 480x640
1401 d-> m_rotation = Rot0; 1455 d-> m_rotation = Rot0;
1402 d-> m_direction = CW; 1456 d-> m_direction = CW;
1403 } else { 1457 } else {
1404 // 640x480 1458 // 640x480
1405 d-> m_rotation = Rot270; 1459 d-> m_rotation = Rot270;
1406 d-> m_direction = CCW; 1460 d-> m_direction = CCW;
1407 } 1461 }
1408 break; 1462 break;
1409 case Model_Zaurus_SLB600: 1463 case Model_Zaurus_SLB600:
1410 case Model_Zaurus_SL5500: 1464 case Model_Zaurus_SL5500:
1411 case Model_Zaurus_SL5000: 1465 case Model_Zaurus_SL5000:
1412 default: 1466 default:
1413 d-> m_rotation = Rot270; 1467 d-> m_rotation = Rot270;
1414 break; 1468 break;
1415 } 1469 }
1416 m_leds [0] = Led_Off; 1470 m_leds [0] = Led_Off;
1417} 1471}
1418 1472
1419void Zaurus::initButtons ( ) 1473void Zaurus::initButtons ( )
1420{ 1474{
1421 if ( d-> m_buttons ) 1475 if ( d-> m_buttons )
1422 return; 1476 return;
1423 1477
1424 d-> m_buttons = new QValueList <ODeviceButton>; 1478 d-> m_buttons = new QValueList <ODeviceButton>;
1425 1479
1426 struct z_button * pz_buttons; 1480 struct z_button * pz_buttons;
1427 int buttoncount; 1481 int buttoncount;
1428 switch ( d-> m_model ) { 1482 switch ( d-> m_model ) {
1429 case Model_Zaurus_SLC700: 1483 case Model_Zaurus_SLC700:
1430 pz_buttons = z_buttons_c700; 1484 pz_buttons = z_buttons_c700;
1431 buttoncount = ARRAY_SIZE(z_buttons_c700); 1485 buttoncount = ARRAY_SIZE(z_buttons_c700);
1432 break; 1486 break;
1433 default: 1487 default:
1434 pz_buttons = z_buttons; 1488 pz_buttons = z_buttons;
1435 buttoncount = ARRAY_SIZE(z_buttons); 1489 buttoncount = ARRAY_SIZE(z_buttons);
1436 break; 1490 break;
1437 } 1491 }
1438 1492
1439 for ( int i = 0; i < buttoncount; i++ ) { 1493 for ( int i = 0; i < buttoncount; i++ ) {
1440 struct z_button *zb = pz_buttons + i; 1494 struct z_button *zb = pz_buttons + i;
1441 ODeviceButton b; 1495 ODeviceButton b;
1442 1496
1443 b. setKeycode ( zb-> code ); 1497 b. setKeycode ( zb-> code );
1444 b. setUserText ( QObject::tr ( "Button", zb-> utext )); 1498 b. setUserText ( QObject::tr ( "Button", zb-> utext ));
1445 b. setPixmap ( Resource::loadPixmap ( zb-> pix )); 1499 b. setPixmap ( Resource::loadPixmap ( zb-> pix ));
1446 b. setFactoryPresetPressedAction ( OQCopMessage ( makeChannel ( zb-> fpressedservice ), zb-> fpressedaction )); 1500 b. setFactoryPresetPressedAction ( OQCopMessage ( makeChannel ( zb-> fpressedservice ),
1447 b. setFactoryPresetHeldAction ( OQCopMessage ( makeChannel ( zb-> fheldservice ), zb-> fheldaction )); 1501 zb-> fpressedaction ));
1502 b. setFactoryPresetHeldAction ( OQCopMessage ( makeChannel ( zb-> fheldservice ),
1503 zb-> fheldaction ));
1448 1504
1449 d-> m_buttons-> append ( b ); 1505 d-> m_buttons-> append ( b );
1450 } 1506 }
1451 1507
1452 reloadButtonMapping ( ); 1508 reloadButtonMapping ( );
1453 1509
1454 QCopChannel *sysch = new QCopChannel ( "QPE/System", this ); 1510 QCopChannel *sysch = new QCopChannel ( "QPE/System", this );
1455 connect ( sysch, SIGNAL( received( const QCString &, const QByteArray & )), this, SLOT( systemMessage ( const QCString &, const QByteArray & ))); 1511 connect ( sysch, SIGNAL( received( const QCString &, const QByteArray & )),
1512 this, SLOT( systemMessage ( const QCString &, const QByteArray & )));
1456} 1513}
1457 1514
1458#include <unistd.h> 1515#include <unistd.h>
1459#include <fcntl.h> 1516#include <fcntl.h>
1460#include <sys/ioctl.h> 1517#include <sys/ioctl.h>
1461 1518
1462//#include <asm/sharp_char.h> // including kernel headers is evil ... 1519//#include <asm/sharp_char.h> // including kernel headers is evil ...
1463 1520
1464#define SHARP_DEV_IOCTL_COMMAND_START 0x5680 1521#define SHARP_DEV_IOCTL_COMMAND_START 0x5680
1465 1522
1466 #defineSHARP_BUZZER_IOCTL_START (SHARP_DEV_IOCTL_COMMAND_START) 1523 #defineSHARP_BUZZER_IOCTL_START (SHARP_DEV_IOCTL_COMMAND_START)
1467#define SHARP_BUZZER_MAKESOUND (SHARP_BUZZER_IOCTL_START) 1524#define SHARP_BUZZER_MAKESOUND (SHARP_BUZZER_IOCTL_START)
1468 1525
1469#define SHARP_BUZ_TOUCHSOUND 1 /* touch panel sound */ 1526#define SHARP_BUZ_TOUCHSOUND 1 /* touch panel sound */
1470#define SHARP_BUZ_KEYSOUND 2 /* key sound */ 1527#define SHARP_BUZ_KEYSOUND 2 /* key sound */
1471#define SHARP_BUZ_SCHEDULE_ALARM 11 /* schedule alarm */ 1528#define SHARP_BUZ_SCHEDULE_ALARM 11 /* schedule alarm */
1472 1529
1473/* --- for SHARP_BUZZER device --- */ 1530/* --- for SHARP_BUZZER device --- */
1474 1531
1475 //#defineSHARP_BUZZER_IOCTL_START (SHARP_DEV_IOCTL_COMMAND_START) 1532 //#defineSHARP_BUZZER_IOCTL_START (SHARP_DEV_IOCTL_COMMAND_START)
1476//#define SHARP_BUZZER_MAKESOUND (SHARP_BUZZER_IOCTL_START) 1533//#define SHARP_BUZZER_MAKESOUND (SHARP_BUZZER_IOCTL_START)
1477 1534
1478#define SHARP_BUZZER_SETVOLUME (SHARP_BUZZER_IOCTL_START+1) 1535#define SHARP_BUZZER_SETVOLUME (SHARP_BUZZER_IOCTL_START+1)
1479#define SHARP_BUZZER_GETVOLUME (SHARP_BUZZER_IOCTL_START+2) 1536#define SHARP_BUZZER_GETVOLUME (SHARP_BUZZER_IOCTL_START+2)
1480#define SHARP_BUZZER_ISSUPPORTED (SHARP_BUZZER_IOCTL_START+3) 1537#define SHARP_BUZZER_ISSUPPORTED (SHARP_BUZZER_IOCTL_START+3)
1481#define SHARP_BUZZER_SETMUTE (SHARP_BUZZER_IOCTL_START+4) 1538#define SHARP_BUZZER_SETMUTE (SHARP_BUZZER_IOCTL_START+4)
1482#define SHARP_BUZZER_STOPSOUND (SHARP_BUZZER_IOCTL_START+5) 1539#define SHARP_BUZZER_STOPSOUND (SHARP_BUZZER_IOCTL_START+5)
1483 1540
1484//#define SHARP_BUZ_TOUCHSOUND 1 /* touch panel sound */ 1541//#define SHARP_BUZ_TOUCHSOUND 1 /* touch panel sound */
1485//#define SHARP_BUZ_KEYSOUND 2 /* key sound */ 1542//#define SHARP_BUZ_KEYSOUND 2 /* key sound */
1486 1543
1487//#define SHARP_PDA_ILLCLICKSOUND 3 /* illegal click */ 1544//#define SHARP_PDA_ILLCLICKSOUND 3 /* illegal click */
1488//#define SHARP_PDA_WARNSOUND 4 /* warning occurred */ 1545//#define SHARP_PDA_WARNSOUND 4 /* warning occurred */
1489//#define SHARP_PDA_ERRORSOUND 5 /* error occurred */ 1546//#define SHARP_PDA_ERRORSOUND 5 /* error occurred */
1490//#define SHARP_PDA_CRITICALSOUND 6 /* critical error occurred */ 1547//#define SHARP_PDA_CRITICALSOUND 6 /* critical error occurred */
1491//#define SHARP_PDA_SYSSTARTSOUND 7 /* system start */ 1548//#define SHARP_PDA_SYSSTARTSOUND 7 /* system start */
1492//#define SHARP_PDA_SYSTEMENDSOUND 8 /* system shutdown */ 1549//#define SHARP_PDA_SYSTEMENDSOUND 8 /* system shutdown */
1493//#define SHARP_PDA_APPSTART 9 /* application start */ 1550//#define SHARP_PDA_APPSTART 9 /* application start */
1494//#define SHARP_PDA_APPQUIT 10 /* application ends */ 1551//#define SHARP_PDA_APPQUIT 10 /* application ends */
1495 1552
1496//#define SHARP_BUZ_SCHEDULE_ALARM 11 /* schedule alarm */ 1553//#define SHARP_BUZ_SCHEDULE_ALARM 11 /* schedule alarm */
1497//#define SHARP_BUZ_DAILY_ALARM 12 /* daily alarm */ 1554//#define SHARP_BUZ_DAILY_ALARM 12 /* daily alarm */
1498//#define SHARP_BUZ_GOT_PHONE_CALL 13 /* phone call sound */ 1555//#define SHARP_BUZ_GOT_PHONE_CALL 13 /* phone call sound */
1499//#define SHARP_BUZ_GOT_MAIL 14 /* mail sound */ 1556//#define SHARP_BUZ_GOT_MAIL 14 /* mail sound */
1500// 1557//
1501 1558
1502 #defineSHARP_LED_IOCTL_START (SHARP_DEV_IOCTL_COMMAND_START) 1559 #defineSHARP_LED_IOCTL_START (SHARP_DEV_IOCTL_COMMAND_START)
1503#define SHARP_LED_SETSTATUS (SHARP_LED_IOCTL_START+1) 1560#define SHARP_LED_SETSTATUS (SHARP_LED_IOCTL_START+1)
1504 1561
1505typedef struct sharp_led_status { 1562typedef struct sharp_led_status {
1506 int which; /* select which LED status is wanted. */ 1563 int which; /* select which LED status is wanted. */
1507 int status; /* set new led status if you call SHARP_LED_SETSTATUS */ 1564 int status; /* set new led status if you call SHARP_LED_SETSTATUS */
1508} sharp_led_status; 1565} sharp_led_status;
1509 1566
1510#define SHARP_LED_MAIL_EXISTS 9 /* mail status (exists or not) */ 1567#define SHARP_LED_MAIL_EXISTS 9 /* mail status (exists or not) */
1511 1568
1512#define LED_MAIL_NO_UNREAD_MAIL 0 /* for SHARP_LED_MAIL_EXISTS */ 1569#define LED_MAIL_NO_UNREAD_MAIL 0 /* for SHARP_LED_MAIL_EXISTS */
1513#define LED_MAIL_NEWMAIL_EXISTS 1 /* for SHARP_LED_MAIL_EXISTS */ 1570#define LED_MAIL_NEWMAIL_EXISTS 1 /* for SHARP_LED_MAIL_EXISTS */
1514#define LED_MAIL_UNREAD_MAIL_EX 2 /* for SHARP_LED_MAIL_EXISTS */ 1571#define LED_MAIL_UNREAD_MAIL_EX 2 /* for SHARP_LED_MAIL_EXISTS */
1515 1572
1516// #include <asm/sharp_apm.h> // including kernel headers is evil ... 1573// #include <asm/sharp_apm.h> // including kernel headers is evil ...
1517 1574
1518#define APM_IOCGEVTSRC OD_IOR( 'A', 203, int ) 1575#define APM_IOCGEVTSRC OD_IOR( 'A', 203, int )
1519#define APM_IOCSEVTSRC OD_IORW( 'A', 204, int ) 1576#define APM_IOCSEVTSRC OD_IORW( 'A', 204, int )
1520#define APM_EVT_POWER_BUTTON (1 << 0) 1577#define APM_EVT_POWER_BUTTON (1 << 0)
1521 1578
1522#define FL_IOCTL_STEP_CONTRAST 100 1579#define FL_IOCTL_STEP_CONTRAST 100
1523 1580
1524 1581
1525void Zaurus::buzzer ( int sound ) 1582void Zaurus::buzzer ( int sound )
1526{ 1583{
1527 // Not all devices have real sound.
1528#ifndef QT_NO_SOUND 1584#ifndef QT_NO_SOUND
1529 switch ( d-> m_model ) { 1585 QString soundname;
1530 case Model_Zaurus_SLC700:{ 1586
1531 int fd; 1587 // Not all devices have real sound. But I expect
1532 int vol; 1588 // that Openzaurus now has a sound driver which
1533 bool vol_reset = false; 1589 // I will use instead the buzzer...
1590 if ( ( d->m_model == Model_Zaurus_SLC700 )
1591 || d->m_system == System_OpenZaurus ){
1534 1592
1535 QString soundname;
1536
1537 switch ( sound ){ 1593 switch ( sound ){
1538 case SHARP_BUZ_SCHEDULE_ALARM: 1594 case SHARP_BUZ_SCHEDULE_ALARM:
1539 soundname = "alarm"; 1595 soundname = "alarm";
1540 break; 1596 break;
1541 case SHARP_BUZ_TOUCHSOUND: 1597 case SHARP_BUZ_TOUCHSOUND:
1542 soundname = "touchsound"; 1598 soundname = "touchsound";
1543 break; 1599 break;
1544 case SHARP_BUZ_KEYSOUND: 1600 case SHARP_BUZ_KEYSOUND:
1545 soundname = "keysound"; 1601 soundname = "keysound";
1546 break; 1602 break;
1547 default: 1603 default:
1548 soundname = "alarm"; 1604 soundname = "alarm";
1549 1605
1550 } 1606 }
1607 }
1608
1609 // If a soundname is defined, we expect that this device has
1610 // sound capabilities.. Otherwise we expect to have the buzzer
1611 // device..
1612 if ( !soundname.isEmpty() ){
1613 int fd;
1614 int vol;
1615 bool vol_reset = false;
1551 1616
1552 Sound snd ( soundname ); 1617 Sound snd ( soundname );
1553 1618
1554 if (( fd = ::open ( "/dev/sound/mixer", O_RDWR )) >= 0 ) { 1619 if (( fd = ::open ( "/dev/sound/mixer", O_RDWR )) >= 0 ) {
1555 if ( ::ioctl ( fd, MIXER_READ( 0 ), &vol ) >= 0 ) { 1620 if ( ::ioctl ( fd, MIXER_READ( 0 ), &vol ) >= 0 ) {
1556 Config cfg ( "qpe" ); 1621 Config cfg ( "qpe" );
1557 cfg. setGroup ( "Volume" ); 1622 cfg. setGroup ( "Volume" );
1558 1623
1559 int volalarm = cfg. readNumEntry ( "AlarmPercent", 50 ); 1624 int volalarm = cfg. readNumEntry ( "AlarmPercent", 50 );
1560 if ( volalarm < 0 ) 1625 if ( volalarm < 0 )
1561 volalarm = 0; 1626 volalarm = 0;
1562 else if ( volalarm > 100 ) 1627 else if ( volalarm > 100 )
1563 volalarm = 100; 1628 volalarm = 100;
1564 volalarm |= ( volalarm << 8 ); 1629 volalarm |= ( volalarm << 8 );
1565 1630
1566 if ( ::ioctl ( fd, MIXER_WRITE( 0 ), &volalarm ) >= 0 ) 1631 if ( ::ioctl ( fd, MIXER_WRITE( 0 ), &volalarm ) >= 0 )
1567 vol_reset = true; 1632 vol_reset = true;
1568 } 1633 }
1569 } 1634 }
1570 1635
1571 snd. play ( ); 1636 snd. play ( );
1572 while ( !snd. isFinished ( )) 1637 while ( !snd. isFinished ( ))
1573 qApp-> processEvents ( ); 1638 qApp-> processEvents ( );
1574 1639
1575 if ( fd >= 0 ) { 1640 if ( fd >= 0 ) {
1576 if ( vol_reset ) 1641 if ( vol_reset )
1577 ::ioctl ( fd, MIXER_WRITE( 0 ), &vol ); 1642 ::ioctl ( fd, MIXER_WRITE( 0 ), &vol );
1578 ::close ( fd ); 1643 ::close ( fd );
1579 } 1644 }
1580 break; 1645 } else {
1581 }
1582 default:{ // Devices with buzzer
1583 int fd = ::open ( "/dev/sharp_buz", O_WRONLY|O_NONBLOCK ); 1646 int fd = ::open ( "/dev/sharp_buz", O_WRONLY|O_NONBLOCK );
1584 1647
1585 if ( fd >= 0 ) { 1648 if ( fd >= 0 ) {
1586 ::ioctl ( fd, SHARP_BUZZER_MAKESOUND, sound ); 1649 ::ioctl ( fd, SHARP_BUZZER_MAKESOUND, sound );
1587 ::close ( fd ); 1650 ::close ( fd );
1588 } 1651 }
1589 } 1652
1590 } 1653 }
1591#endif 1654#endif
1592} 1655}
1593 1656
1594 1657
1595void Zaurus::alarmSound ( ) 1658void Zaurus::alarmSound ( )
1596{ 1659{
1597 buzzer ( SHARP_BUZ_SCHEDULE_ALARM ); 1660 buzzer ( SHARP_BUZ_SCHEDULE_ALARM );
1598} 1661}
1599 1662
1600void Zaurus::touchSound ( ) 1663void Zaurus::touchSound ( )
1601{ 1664{
1602 buzzer ( SHARP_BUZ_TOUCHSOUND ); 1665 buzzer ( SHARP_BUZ_TOUCHSOUND );
1603} 1666}
1604 1667
1605void Zaurus::keySound ( ) 1668void Zaurus::keySound ( )
1606{ 1669{
1607 buzzer ( SHARP_BUZ_KEYSOUND ); 1670 buzzer ( SHARP_BUZ_KEYSOUND );
1608} 1671}
1609 1672
1610 1673
1611QValueList <OLed> Zaurus::ledList ( ) const 1674QValueList <OLed> Zaurus::ledList ( ) const
1612{ 1675{
1613 QValueList <OLed> vl; 1676 QValueList <OLed> vl;
1614 vl << Led_Mail; 1677 vl << Led_Mail;
1615 return vl; 1678 return vl;
1616} 1679}
1617 1680
1618QValueList <OLedState> Zaurus::ledStateList ( OLed l ) const 1681QValueList <OLedState> Zaurus::ledStateList ( OLed l ) const
1619{ 1682{
1620 QValueList <OLedState> vl; 1683 QValueList <OLedState> vl;
1621 1684
1622 if ( l == Led_Mail ) 1685 if ( l == Led_Mail )
1623 vl << Led_Off << Led_On << Led_BlinkSlow; 1686 vl << Led_Off << Led_On << Led_BlinkSlow;
1624 return vl; 1687 return vl;
1625} 1688}
1626 1689
1627OLedState Zaurus::ledState ( OLed which ) const 1690OLedState Zaurus::ledState ( OLed which ) const
1628{ 1691{
1629 if ( which == Led_Mail ) 1692 if ( which == Led_Mail )
1630 return m_leds [0]; 1693 return m_leds [0];
1631 else 1694 else
1632 return Led_Off; 1695 return Led_Off;
1633} 1696}
1634 1697
1635bool Zaurus::setLedState ( OLed which, OLedState st ) 1698bool Zaurus::setLedState ( OLed which, OLedState st )
1636{ 1699{
1700 if (!m_embedix) // Currently not supported on non_embedix kernels
1701 return false;
1702
1637 static int fd = ::open ( "/dev/sharp_led", O_RDWR|O_NONBLOCK ); 1703 static int fd = ::open ( "/dev/sharp_led", O_RDWR|O_NONBLOCK );
1638 1704
1639 if ( which == Led_Mail ) { 1705 if ( which == Led_Mail ) {
1640 if ( fd >= 0 ) { 1706 if ( fd >= 0 ) {
1641 struct sharp_led_status leds; 1707 struct sharp_led_status leds;
1642 ::memset ( &leds, 0, sizeof( leds )); 1708 ::memset ( &leds, 0, sizeof( leds ));
1643 leds. which = SHARP_LED_MAIL_EXISTS; 1709 leds. which = SHARP_LED_MAIL_EXISTS;
1644 bool ok = true; 1710 bool ok = true;
1645 1711
1646 switch ( st ) { 1712 switch ( st ) {
1647 case Led_Off : leds. status = LED_MAIL_NO_UNREAD_MAIL; break; 1713 case Led_Off : leds. status = LED_MAIL_NO_UNREAD_MAIL; break;
1648 case Led_On : leds. status = LED_MAIL_NEWMAIL_EXISTS; break; 1714 case Led_On : leds. status = LED_MAIL_NEWMAIL_EXISTS; break;
1649 case Led_BlinkSlow: leds. status = LED_MAIL_UNREAD_MAIL_EX; break; 1715 case Led_BlinkSlow: leds. status = LED_MAIL_UNREAD_MAIL_EX; break;
1650 default : ok = false; 1716 default : ok = false;
1651 } 1717 }
1652 1718
1653 if ( ok && ( ::ioctl ( fd, SHARP_LED_SETSTATUS, &leds ) >= 0 )) { 1719 if ( ok && ( ::ioctl ( fd, SHARP_LED_SETSTATUS, &leds ) >= 0 )) {
1654 m_leds [0] = st; 1720 m_leds [0] = st;
1655 return true; 1721 return true;
1656 } 1722 }
1657 } 1723 }
1658 } 1724 }
1659 return false; 1725 return false;
1660} 1726}
1661 1727
1662bool Zaurus::setSoftSuspend ( bool soft ) 1728bool Zaurus::setSoftSuspend ( bool soft )
1663{ 1729{
1730 if (!m_embedix) {
1731 /* non-Embedix kernels dont have kernel autosuspend */
1732 return ODevice::setSoftSuspend( soft );
1733 }
1734
1664 bool res = false; 1735 bool res = false;
1665 int fd; 1736 int fd;
1666 1737
1667 if ((( fd = ::open ( "/dev/apm_bios", O_RDWR )) >= 0 ) || 1738 if ((( fd = ::open ( "/dev/apm_bios", O_RDWR )) >= 0 ) ||
1668 (( fd = ::open ( "/dev/misc/apm_bios",O_RDWR )) >= 0 )) { 1739 (( fd = ::open ( "/dev/misc/apm_bios",O_RDWR )) >= 0 )) {
1669 1740
1670 int sources = ::ioctl ( fd, APM_IOCGEVTSRC, 0 ); // get current event sources 1741 int sources = ::ioctl ( fd, APM_IOCGEVTSRC, 0 ); // get current event sources
1671 1742
1672 if ( sources >= 0 ) { 1743 if ( sources >= 0 ) {
1673 if ( soft ) 1744 if ( soft )
1674 sources &= ~APM_EVT_POWER_BUTTON; 1745 sources &= ~APM_EVT_POWER_BUTTON;
1675 else 1746 else
1676 sources |= APM_EVT_POWER_BUTTON; 1747 sources |= APM_EVT_POWER_BUTTON;
1677 1748
1678 if ( ::ioctl ( fd, APM_IOCSEVTSRC, sources ) >= 0 ) // set new event sources 1749 if ( ::ioctl ( fd, APM_IOCSEVTSRC, sources ) >= 0 ) // set new event sources
1679 res = true; 1750 res = true;
1680 else 1751 else
1681 perror ( "APM_IOCGEVTSRC" ); 1752 perror ( "APM_IOCGEVTSRC" );
1682 } 1753 }
1683 else 1754 else
1684 perror ( "APM_IOCGEVTSRC" ); 1755 perror ( "APM_IOCGEVTSRC" );
1685 1756
1686 ::close ( fd ); 1757 ::close ( fd );
1687 } 1758 }
1688 else 1759 else
1689 perror ( "/dev/apm_bios or /dev/misc/apm_bios" ); 1760 perror ( "/dev/apm_bios or /dev/misc/apm_bios" );
1690 1761
1691 return res; 1762 return res;
1692} 1763}
1693 1764
1694 1765
1695bool Zaurus::setDisplayBrightness ( int bright ) 1766bool Zaurus::setDisplayBrightness ( int bright )
1696{ 1767{
1697 bool res = false; 1768 bool res = false;
1698 int fd; 1769 int fd;
1699 1770
1700 if ( bright > 255 ) 1771 if ( bright > 255 )
1701 bright = 255; 1772 bright = 255;
1702 if ( bright < 0 ) 1773 if ( bright < 0 )
1703 bright = 0; 1774 bright = 0;
1704 1775
1705 if (( fd = ::open ( "/dev/fl", O_WRONLY )) >= 0 ) { 1776 if (m_embedix) {
1706 int bl = ( bright * 4 + 127 ) / 255; // only 4 steps on zaurus 1777 if (( fd = ::open ( "/dev/fl", O_WRONLY )) >= 0 ) {
1707 if ( bright && !bl ) 1778 int bl = ( bright * 4 + 127 ) / 255; // only 4 steps on zaurus
1708 bl = 1; 1779 if ( bright && !bl )
1709 res = ( ::ioctl ( fd, FL_IOCTL_STEP_CONTRAST, bl ) == 0 ); 1780 bl = 1;
1710 ::close ( fd ); 1781 res = ( ::ioctl ( fd, FL_IOCTL_STEP_CONTRAST, bl ) == 0 );
1782 ::close ( fd );
1783 }
1784 } else {
1785#define FB_BACKLIGHT_SET_BRIGHTNESS _IOW('F', 1, u_int) /* set brightness */
1786 if (( fd = ::open ( "/dev/fb0", O_WRONLY )) >= 0 ) {
1787 res = ( ::ioctl ( fd , FB_BACKLIGHT_SET_BRIGHTNESS, bright ) == 0 );
1788 ::close ( fd );
1789 }
1711 } 1790 }
1712 return res; 1791 return res;
1713} 1792}
1714 1793
1715 1794
1716int Zaurus::displayBrightnessResolution ( ) const 1795int Zaurus::displayBrightnessResolution ( ) const
1717{ 1796{
1718 return 5; 1797 if (m_embedix)
1798 return 5;
1799 else
1800 return 256;
1719} 1801}
1720 1802
1721/************************************************** 1803/**************************************************
1722 * 1804 *
1723 * SIMpad 1805 * SIMpad
1724 * 1806 *
1725 **************************************************/ 1807 **************************************************/
1726 1808
1727void SIMpad::init ( ) 1809void SIMpad::init ( )
1728{ 1810{
1729 d-> m_vendorstr = "SIEMENS"; 1811 d-> m_vendorstr = "SIEMENS";
1730 d-> m_vendor = Vendor_SIEMENS; 1812 d-> m_vendor = Vendor_SIEMENS;
1731 1813
1732 QFile f ( "/proc/hal/model" ); 1814 QFile f ( "/proc/hal/model" );
1733 1815
1734 //TODO Implement model checking 1816 //TODO Implement model checking
1735 //FIXME For now we assume an SL4 1817 //FIXME For now we assume an SL4
1736 1818
1737 d-> m_modelstr = "SL4"; 1819 d-> m_modelstr = "SL4";
1738 d-> m_model = Model_SIMpad_SL4; 1820 d-> m_model = Model_SIMpad_SL4;
1739 1821
1740 switch ( d-> m_model ) { 1822 switch ( d-> m_model ) {
1741 default: 1823 default:
1742 d-> m_rotation = Rot0; 1824 d-> m_rotation = Rot0;
1743 d-> m_direction = CCW; 1825 d-> m_direction = CCW;
1744 d-> m_holdtime = 1000; // 1000ms 1826 d-> m_holdtime = 1000; // 1000ms
1745 1827
1746 break; 1828 break;
1747 } 1829 }
1748 1830
1749 f. setName ( "/etc/familiar-version" ); 1831 f. setName ( "/etc/familiar-version" );
1750 if ( f. open ( IO_ReadOnly )) { 1832 if ( f. open ( IO_ReadOnly )) {
1751 d-> m_systemstr = "Familiar"; 1833 d-> m_systemstr = "Familiar";
1752 d-> m_system = System_Familiar; 1834 d-> m_system = System_Familiar;
1753 1835
1754 QTextStream ts ( &f ); 1836 QTextStream ts ( &f );
1755 d-> m_sysverstr = ts. readLine ( ). mid ( 10 ); 1837 d-> m_sysverstr = ts. readLine ( ). mid ( 10 );
1756 1838
1757 f. close ( ); 1839 f. close ( );
1758 } else { 1840 } else {
1759 f. setName ( "/etc/oz_version" ); 1841 f. setName ( "/etc/oz_version" );
1760 1842
1761 if ( f. open ( IO_ReadOnly )) { 1843 if ( f. open ( IO_ReadOnly )) {
1762 d-> m_systemstr = "OpenEmbedded/SIMpad"; 1844 d-> m_systemstr = "OpenEmbedded/SIMpad";
1763 d-> m_system = System_OpenZaurus; 1845 d-> m_system = System_OpenZaurus;
1764 1846
1765 QTextStream ts ( &f ); 1847 QTextStream ts ( &f );
1766 ts.setDevice ( &f ); 1848 ts.setDevice ( &f );
1767 d-> m_sysverstr = ts. readLine ( ); 1849 d-> m_sysverstr = ts. readLine ( );
1768 f. close ( ); 1850 f. close ( );
1769 } 1851 }
1770 } 1852 }
1771 1853
1772 m_leds [0] = m_leds [1] = Led_Off; 1854 m_leds [0] = m_leds [1] = Led_Off;
1773 1855
1774 m_power_timer = 0; 1856 m_power_timer = 0;
1775 1857
1776} 1858}
1777 1859
1778void SIMpad::initButtons ( ) 1860void SIMpad::initButtons ( )
1779{ 1861{
1780 if ( d-> m_buttons ) 1862 if ( d-> m_buttons )
1781 return; 1863 return;
1782 1864
1783 if ( isQWS( ) ) 1865 if ( isQWS( ) )
1784 QWSServer::setKeyboardFilter ( this ); 1866 QWSServer::setKeyboardFilter ( this );
1785 1867
1786 d-> m_buttons = new QValueList <ODeviceButton>; 1868 d-> m_buttons = new QValueList <ODeviceButton>;
1787 1869
1788 for ( uint i = 0; i < ( sizeof( simpad_buttons ) / sizeof( s_button )); i++ ) { 1870 for ( uint i = 0; i < ( sizeof( simpad_buttons ) / sizeof( s_button )); i++ ) {
1789 s_button *sb = simpad_buttons + i; 1871 s_button *sb = simpad_buttons + i;
1790 ODeviceButton b; 1872 ODeviceButton b;
1791 1873
1792 if (( sb-> model & d-> m_model ) == d-> m_model ) { 1874 if (( sb-> model & d-> m_model ) == d-> m_model ) {
1793 b. setKeycode ( sb-> code ); 1875 b. setKeycode ( sb-> code );
1794 b. setUserText ( QObject::tr ( "Button", sb-> utext )); 1876 b. setUserText ( QObject::tr ( "Button", sb-> utext ));
1795 b. setPixmap ( Resource::loadPixmap ( sb-> pix )); 1877 b. setPixmap ( Resource::loadPixmap ( sb-> pix ));
1796 b. setFactoryPresetPressedAction ( OQCopMessage ( makeChannel ( sb-> fpressedservice ), sb-> fpressedaction )); 1878 b. setFactoryPresetPressedAction ( OQCopMessage ( makeChannel ( sb-> fpressedservice ), sb-> fpressedaction ));
1797 b. setFactoryPresetHeldAction ( OQCopMessage ( makeChannel ( sb-> fheldservice ), sb-> fheldaction )); 1879 b. setFactoryPresetHeldAction ( OQCopMessage ( makeChannel ( sb-> fheldservice ), sb-> fheldaction ));
1798 1880
1799 d-> m_buttons-> append ( b ); 1881 d-> m_buttons-> append ( b );
1800 } 1882 }
1801 } 1883 }
1802 reloadButtonMapping ( ); 1884 reloadButtonMapping ( );
1803 1885
1804 QCopChannel *sysch = new QCopChannel ( "QPE/System", this ); 1886 QCopChannel *sysch = new QCopChannel ( "QPE/System", this );
1805 connect ( sysch, SIGNAL( received( const QCString &, const QByteArray & )), this, SLOT( systemMessage ( const QCString &, const QByteArray & ))); 1887 connect ( sysch, SIGNAL( received( const QCString &, const QByteArray & )), this, SLOT( systemMessage ( const QCString &, const QByteArray & )));
1806} 1888}
1807 1889
1808// SIMpad boardcontrol register CS3 1890// SIMpad boardcontrol register CS3
1809#define SIMPAD_BOARDCONTROL "/proc/cs3" 1891#define SIMPAD_BOARDCONTROL "/proc/cs3"
1810#define SIMPAD_VCC_5V_EN 0x0001 // For 5V PCMCIA 1892#define SIMPAD_VCC_5V_EN 0x0001 // For 5V PCMCIA
1811#define SIMPAD_VCC_3V_EN 0x0002 // FOR 3.3V PCMCIA 1893#define SIMPAD_VCC_3V_EN 0x0002 // FOR 3.3V PCMCIA
1812#define SIMPAD_EN1 0x0004 // This is only for EPROM's 1894#define SIMPAD_EN1 0x0004 // This is only for EPROM's
1813#define SIMPAD_EN0 0x0008 // Both should be enable for 3.3V or 5V 1895#define SIMPAD_EN0 0x0008 // Both should be enable for 3.3V or 5V
1814#define SIMPAD_DISPLAY_ON 0x0010 1896#define SIMPAD_DISPLAY_ON 0x0010
1815#define SIMPAD_PCMCIA_BUFF_DIS 0x0020 1897#define SIMPAD_PCMCIA_BUFF_DIS 0x0020
1816#define SIMPAD_MQ_RESET 0x0040 1898#define SIMPAD_MQ_RESET 0x0040
1817#define SIMPAD_PCMCIA_RESET 0x0080 1899#define SIMPAD_PCMCIA_RESET 0x0080
1818#define SIMPAD_DECT_POWER_ON 0x0100 1900#define SIMPAD_DECT_POWER_ON 0x0100
1819#define SIMPAD_IRDA_SD 0x0200 // Shutdown for powersave 1901#define SIMPAD_IRDA_SD 0x0200 // Shutdown for powersave
1820#define SIMPAD_RS232_ON 0x0400 1902#define SIMPAD_RS232_ON 0x0400
1821#define SIMPAD_SD_MEDIAQ 0x0800 // Shutdown for powersave 1903#define SIMPAD_SD_MEDIAQ 0x0800 // Shutdown for powersave
1822#define SIMPAD_LED2_ON 0x1000 1904#define SIMPAD_LED2_ON 0x1000
1823#define SIMPAD_IRDA_MODE 0x2000 // Fast/Slow IrDA mode 1905#define SIMPAD_IRDA_MODE 0x2000 // Fast/Slow IrDA mode
1824#define SIMPAD_ENABLE_5V 0x4000 // Enable 5V circuit 1906#define SIMPAD_ENABLE_5V 0x4000 // Enable 5V circuit
1825#define SIMPAD_RESET_SIMCARD 0x8000 1907#define SIMPAD_RESET_SIMCARD 0x8000
1826 1908
1827//SIMpad touchscreen backlight strength control 1909//SIMpad touchscreen backlight strength control
1828#define SIMPAD_BACKLIGHT_CONTROL "/proc/driver/mq200/registers/PWM_CONTROL" 1910#define SIMPAD_BACKLIGHT_CONTROL "/proc/driver/mq200/registers/PWM_CONTROL"
1829#define SIMPAD_BACKLIGHT_MASK 0x00a10044 1911#define SIMPAD_BACKLIGHT_MASK 0x00a10044
1830 1912
1831QValueList <OLed> SIMpad::ledList ( ) const 1913QValueList <OLed> SIMpad::ledList ( ) const
1832{ 1914{
1833 QValueList <OLed> vl; 1915 QValueList <OLed> vl;
1834 vl << Led_Power; //FIXME which LED is LED2 ? The green one or the amber one? 1916 vl << Led_Power; //FIXME which LED is LED2 ? The green one or the amber one?
1835 //vl << Led_Mail; //TODO find out if LED1 is accessible anyway 1917 //vl << Led_Mail; //TODO find out if LED1 is accessible anyway
1836 return vl; 1918 return vl;
1837} 1919}
1838 1920
1839QValueList <OLedState> SIMpad::ledStateList ( OLed l ) const 1921QValueList <OLedState> SIMpad::ledStateList ( OLed l ) const
1840{ 1922{
1841 QValueList <OLedState> vl; 1923 QValueList <OLedState> vl;
1842 1924
1843 if ( l == Led_Power ) //FIXME which LED is LED2 ? The green one or the amber one? 1925 if ( l == Led_Power ) //FIXME which LED is LED2 ? The green one or the amber one?
1844 vl << Led_Off << Led_On; 1926 vl << Led_Off << Led_On;
1845 //else if ( l == Led_Mail ) //TODO find out if LED1 is accessible anyway 1927 //else if ( l == Led_Mail ) //TODO find out if LED1 is accessible anyway
1846 //vl << Led_Off; 1928 //vl << Led_Off;