summaryrefslogtreecommitdiff
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--libopie/odevice.cpp232
1 files changed, 124 insertions, 108 deletions
diff --git a/libopie/odevice.cpp b/libopie/odevice.cpp
index cea4f35..9b2a954 100644
--- a/libopie/odevice.cpp
+++ b/libopie/odevice.cpp
@@ -54,82 +54,82 @@ using namespace Opie;
54class ODeviceData { 54class ODeviceData {
55public: 55public:
56 bool m_qwsserver; 56 bool m_qwsserver;
57 57
58 QString m_vendorstr; 58 QString m_vendorstr;
59 OVendor m_vendor; 59 OVendor m_vendor;
60 60
61 QString m_modelstr; 61 QString m_modelstr;
62 OModel m_model; 62 OModel m_model;
63 63
64 QString m_systemstr; 64 QString m_systemstr;
65 OSystem m_system; 65 OSystem m_system;
66 66
67 QString m_sysverstr; 67 QString m_sysverstr;
68 68
69 Transformation m_rotation; 69 Transformation m_rotation;
70 70
71 QValueList <ODeviceButton> *m_buttons; 71 QValueList <ODeviceButton> *m_buttons;
72 uint m_holdtime; 72 uint m_holdtime;
73}; 73};
74 74
75 75
76class iPAQ : public ODevice, public QWSServer::KeyboardFilter { 76class iPAQ : public ODevice, public QWSServer::KeyboardFilter {
77protected: 77protected:
78 virtual void init ( ); 78 virtual void init ( );
79 virtual void initButtons ( ); 79 virtual void initButtons ( );
80 80
81public: 81public:
82 virtual bool setSoftSuspend ( bool soft ); 82 virtual bool setSoftSuspend ( bool soft );
83 83
84 virtual bool setDisplayBrightness ( int b ); 84 virtual bool setDisplayBrightness ( int b );
85 virtual int displayBrightnessResolution ( ) const; 85 virtual int displayBrightnessResolution ( ) const;
86 86
87 virtual void alarmSound ( ); 87 virtual void alarmSound ( );
88 88
89 virtual QValueList <OLed> ledList ( ) const; 89 virtual QValueList <OLed> ledList ( ) const;
90 virtual QValueList <OLedState> ledStateList ( OLed led ) const; 90 virtual QValueList <OLedState> ledStateList ( OLed led ) const;
91 virtual OLedState ledState ( OLed led ) const; 91 virtual OLedState ledState ( OLed led ) const;
92 virtual bool setLedState ( OLed led, OLedState st ); 92 virtual bool setLedState ( OLed led, OLedState st );
93 93
94 virtual bool hasLightSensor ( ) const; 94 virtual bool hasLightSensor ( ) const;
95 virtual int readLightSensor ( ); 95 virtual int readLightSensor ( );
96 virtual int lightSensorResolution ( ) const; 96 virtual int lightSensorResolution ( ) const;
97 97
98protected: 98protected:
99 virtual bool filter ( int unicode, int keycode, int modifiers, bool isPress, bool autoRepeat ); 99 virtual bool filter ( int unicode, int keycode, int modifiers, bool isPress, bool autoRepeat );
100 virtual void timerEvent ( QTimerEvent *te ); 100 virtual void timerEvent ( QTimerEvent *te );
101 101
102 int m_power_timer; 102 int m_power_timer;
103 103
104 OLedState m_leds [2]; 104 OLedState m_leds [2];
105}; 105};
106 106
107class Zaurus : public ODevice { 107class Zaurus : public ODevice {
108protected: 108protected:
109 virtual void init ( ); 109 virtual void init ( );
110 virtual void initButtons ( ); 110 virtual void initButtons ( );
111 111
112 public: 112public:
113 virtual bool setSoftSuspend ( bool soft ); 113 virtual bool setSoftSuspend ( bool soft );
114 114
115 virtual bool setDisplayBrightness ( int b ); 115 virtual bool setDisplayBrightness ( int b );
116 virtual int displayBrightnessResolution ( ) const; 116 virtual int displayBrightnessResolution ( ) const;
117 117
118 virtual void alarmSound ( ); 118 virtual void alarmSound ( );
119 virtual void keySound ( ); 119 virtual void keySound ( );
120 virtual void touchSound ( ); 120 virtual void touchSound ( );
121 121
122 virtual QValueList <OLed> ledList ( ) const; 122 virtual QValueList <OLed> ledList ( ) const;
123 virtual QValueList <OLedState> ledStateList ( OLed led ) const; 123 virtual QValueList <OLedState> ledStateList ( OLed led ) const;
124 virtual OLedState ledState ( OLed led ) const; 124 virtual OLedState ledState ( OLed led ) const;
125 virtual bool setLedState ( OLed led, OLedState st ); 125 virtual bool setLedState ( OLed led, OLedState st );
126 126
127protected: 127protected:
128 virtual void buzzer ( int snd ); 128 virtual void buzzer ( int snd );
129 129
130 OLedState m_leds [1]; 130 OLedState m_leds [1];
131}; 131};
132 132
133 133
134struct i_button { 134struct i_button {
135 uint model; 135 uint model;
@@ -138,40 +138,40 @@ struct i_button {
138 char *pix; 138 char *pix;
139 char *fpressedservice; 139 char *fpressedservice;
140 char *fpressedaction; 140 char *fpressedaction;
141 char *fheldservice; 141 char *fheldservice;
142 char *fheldaction; 142 char *fheldaction;
143} ipaq_buttons [] = { 143} ipaq_buttons [] = {
144 { Model_iPAQ_H31xx | Model_iPAQ_H36xx | Model_iPAQ_H37xx | Model_iPAQ_H38xx | Model_iPAQ_H39xx, 144 { Model_iPAQ_H31xx | Model_iPAQ_H36xx | Model_iPAQ_H37xx | Model_iPAQ_H38xx | Model_iPAQ_H39xx,
145 Qt::Key_F9, QT_TRANSLATE_NOOP("Button", "Calendar Button"), 145 Qt::Key_F9, QT_TRANSLATE_NOOP("Button", "Calendar Button"),
146 "devicebuttons/ipaq_calendar", 146 "devicebuttons/ipaq_calendar",
147 "datebook", "nextView()", 147 "datebook", "nextView()",
148 "today", "raise()" }, 148 "today", "raise()" },
149 { Model_iPAQ_H31xx | Model_iPAQ_H36xx | Model_iPAQ_H37xx | Model_iPAQ_H38xx | Model_iPAQ_H39xx, 149 { Model_iPAQ_H31xx | Model_iPAQ_H36xx | Model_iPAQ_H37xx | Model_iPAQ_H38xx | Model_iPAQ_H39xx,
150 Qt::Key_F10, QT_TRANSLATE_NOOP("Button", "Contacts Button"), 150 Qt::Key_F10, QT_TRANSLATE_NOOP("Button", "Contacts Button"),
151 "devicebuttons/ipaq_contact", 151 "devicebuttons/ipaq_contact",
152 "addressbook", "raise()", 152 "addressbook", "raise()",
153 "addressbook", "beamBusinessCard()" }, 153 "addressbook", "beamBusinessCard()" },
154 { Model_iPAQ_H31xx | Model_iPAQ_H36xx | Model_iPAQ_H37xx, 154 { Model_iPAQ_H31xx | Model_iPAQ_H36xx | Model_iPAQ_H37xx,
155 Qt::Key_F11, QT_TRANSLATE_NOOP("Button", "Menu Button"), 155 Qt::Key_F11, QT_TRANSLATE_NOOP("Button", "Menu Button"),
156 "devicebuttons/ipaq_menu", 156 "devicebuttons/ipaq_menu",
157 "QPE/TaskBar", "toggleMenu()", 157 "QPE/TaskBar", "toggleMenu()",
158 "QPE/TaskBar", "toggleStartMenu()" }, 158 "QPE/TaskBar", "toggleStartMenu()" },
159 { Model_iPAQ_H38xx | Model_iPAQ_H39xx, 159 { Model_iPAQ_H38xx | Model_iPAQ_H39xx,
160 Qt::Key_F13, QT_TRANSLATE_NOOP("Button", "Mail Button"), 160 Qt::Key_F13, QT_TRANSLATE_NOOP("Button", "Mail Button"),
161 "devicebuttons/ipaq_mail", 161 "devicebuttons/ipaq_mail",
162 "mail", "raise()", 162 "mail", "raise()",
163 "mail", "newMail()" }, 163 "mail", "newMail()" },
164 { Model_iPAQ_H31xx | Model_iPAQ_H36xx | Model_iPAQ_H37xx | Model_iPAQ_H38xx | Model_iPAQ_H39xx, 164 { Model_iPAQ_H31xx | Model_iPAQ_H36xx | Model_iPAQ_H37xx | Model_iPAQ_H38xx | Model_iPAQ_H39xx,
165 Qt::Key_F12, QT_TRANSLATE_NOOP("Button", "Home Button"), 165 Qt::Key_F12, QT_TRANSLATE_NOOP("Button", "Home Button"),
166 "devicebuttons/ipaq_home", 166 "devicebuttons/ipaq_home",
167 "QPE/Launcher", "home()", 167 "QPE/Launcher", "home()",
168 "buttonsettings", "raise()" }, 168 "buttonsettings", "raise()" },
169 { Model_iPAQ_H31xx | Model_iPAQ_H36xx | Model_iPAQ_H37xx | Model_iPAQ_H38xx | Model_iPAQ_H39xx, 169 { Model_iPAQ_H31xx | Model_iPAQ_H36xx | Model_iPAQ_H37xx | Model_iPAQ_H38xx | Model_iPAQ_H39xx,
170 Qt::Key_F24, QT_TRANSLATE_NOOP("Button", "Record Button"), 170 Qt::Key_F24, QT_TRANSLATE_NOOP("Button", "Record Button"),
171 "devicebuttons/ipaq_record", 171 "devicebuttons/ipaq_record",
172 "QPE/VMemo", "toggleRecord()", 172 "QPE/VMemo", "toggleRecord()",
173 "sound", "raise()" }, 173 "sound", "raise()" },
174}; 174};
175 175
176struct z_button { 176struct z_button {
177 Qt::Key code; 177 Qt::Key code;
@@ -215,21 +215,21 @@ static QCString makeChannel ( const char *str )
215 215
216 216
217 217
218ODevice *ODevice::inst ( ) 218ODevice *ODevice::inst ( )
219{ 219{
220 static ODevice *dev = 0; 220 static ODevice *dev = 0;
221 221
222 if ( !dev ) { 222 if ( !dev ) {
223 if ( QFile::exists ( "/proc/hal/model" )) 223 if ( QFile::exists ( "/proc/hal/model" ))
224 dev = new iPAQ ( ); 224 dev = new iPAQ ( );
225 else if ( QFile::exists ( "/dev/sharp_buz" ) || QFile::exists ( "/dev/sharp_led" )) 225 else if ( QFile::exists ( "/dev/sharp_buz" ) || QFile::exists ( "/dev/sharp_led" ))
226 dev = new Zaurus ( ); 226 dev = new Zaurus ( );
227 else 227 else
228 dev = new ODevice ( ); 228 dev = new ODevice ( );
229 229
230 dev-> init ( ); 230 dev-> init ( );
231 } 231 }
232 return dev; 232 return dev;
233} 233}
234 234
235 235
@@ -251,22 +251,22 @@ ODevice::ODevice ( )
251 d-> m_vendorstr = "Unknown"; 251 d-> m_vendorstr = "Unknown";
252 d-> m_vendor = Vendor_Unknown; 252 d-> m_vendor = Vendor_Unknown;
253 d-> m_systemstr = "Unknown"; 253 d-> m_systemstr = "Unknown";
254 d-> m_system = System_Unknown; 254 d-> m_system = System_Unknown;
255 d-> m_sysverstr = "0.0"; 255 d-> m_sysverstr = "0.0";
256 d-> m_rotation = Rot0; 256 d-> m_rotation = Rot0;
257 257
258 d-> m_holdtime = 1000; // 1000ms 258 d-> m_holdtime = 1000; // 1000ms
259 d-> m_buttons = 0; 259 d-> m_buttons = 0;
260} 260}
261 261
262void ODevice::systemMessage ( const QCString &msg, const QByteArray & ) 262void ODevice::systemMessage ( const QCString &msg, const QByteArray & )
263{ 263{
264 if ( msg == "deviceButtonMappingChanged()" ) { 264 if ( msg == "deviceButtonMappingChanged()" ) {
265 reloadButtonMapping ( ); 265 reloadButtonMapping ( );
266 } 266 }
267} 267}
268 268
269void ODevice::init ( ) 269void ODevice::init ( )
270{ 270{
271} 271}
272 272
@@ -278,28 +278,28 @@ void ODevice::initButtons ( )
278 // Simulation uses iPAQ 3660 device buttons 278 // Simulation uses iPAQ 3660 device buttons
279 279
280 qDebug ( "init Buttons" ); 280 qDebug ( "init Buttons" );
281 d-> m_buttons = new QValueList <ODeviceButton>; 281 d-> m_buttons = new QValueList <ODeviceButton>;
282 282
283 for ( uint i = 0; i < ( sizeof( ipaq_buttons ) / sizeof( i_button )); i++ ) { 283 for ( uint i = 0; i < ( sizeof( ipaq_buttons ) / sizeof( i_button )); i++ ) {
284 i_button *ib = ipaq_buttons + i; 284 i_button *ib = ipaq_buttons + i;
285 ODeviceButton b; 285 ODeviceButton b;
286 286
287 if (( ib-> model & Model_iPAQ_H36xx ) == Model_iPAQ_H36xx ) { 287 if (( ib-> model & Model_iPAQ_H36xx ) == Model_iPAQ_H36xx ) {
288 b. setKeycode ( ib-> code ); 288 b. setKeycode ( ib-> code );
289 b. setUserText ( QObject::tr ( "Button", ib-> utext )); 289 b. setUserText ( QObject::tr ( "Button", ib-> utext ));
290 b. setPixmap ( Resource::loadPixmap ( ib-> pix )); 290 b. setPixmap ( Resource::loadPixmap ( ib-> pix ));
291 b. setFactoryPresetPressedAction ( OQCopMessage ( makeChannel ( ib-> fpressedservice ), ib-> fpressedaction )); 291 b. setFactoryPresetPressedAction ( OQCopMessage ( makeChannel ( ib-> fpressedservice ), ib-> fpressedaction ));
292 b. setFactoryPresetHeldAction ( OQCopMessage ( makeChannel ( ib-> fheldservice ), ib-> fheldaction )); 292 b. setFactoryPresetHeldAction ( OQCopMessage ( makeChannel ( ib-> fheldservice ), ib-> fheldaction ));
293 d-> m_buttons-> append ( b ); 293 d-> m_buttons-> append ( b );
294 } 294 }
295 } 295 }
296 reloadButtonMapping ( ); 296 reloadButtonMapping ( );
297 297
298 QCopChannel *sysch = new QCopChannel ( "QPE/System", this ); 298 QCopChannel *sysch = new QCopChannel ( "QPE/System", this );
299 connect ( sysch, SIGNAL( received( const QCString &, const QByteArray & )), this, SLOT( systemMessage ( const QCString &, const QByteArray & ))); 299 connect ( sysch, SIGNAL( received( const QCString &, const QByteArray & )), this, SLOT( systemMessage ( const QCString &, const QByteArray & )));
300} 300}
301 301
302ODevice::~ODevice ( ) 302ODevice::~ODevice ( )
303{ 303{
304 delete d; 304 delete d;
305} 305}
@@ -320,30 +320,30 @@ bool ODevice::suspend ( )
320 return false; 320 return false;
321 321
322 if ( d-> m_model == Model_Unknown ) // better don't suspend in qvfb / on unkown devices 322 if ( d-> m_model == Model_Unknown ) // better don't suspend in qvfb / on unkown devices
323 return false; 323 return false;
324 324
325 bool res = false; 325 bool res = false;
326 326
327 struct timeval tvs, tvn; 327 struct timeval tvs, tvn;
328 ::gettimeofday ( &tvs, 0 ); 328 ::gettimeofday ( &tvs, 0 );
329 329
330 ::sync ( ); // flush fs caches 330 ::sync ( ); // flush fs caches
331 res = ( ::system ( "apm --suspend" ) == 0 ); 331 res = ( ::system ( "apm --suspend" ) == 0 );
332 332
333 // This is needed because the iPAQ apm implementation is asynchronous and we 333 // This is needed because the iPAQ apm implementation is asynchronous and we
334 // can not be sure when exactly the device is really suspended 334 // can not be sure when exactly the device is really suspended
335 // This can be deleted as soon as a stable familiar with a synchronous apm implementation exists. 335 // This can be deleted as soon as a stable familiar with a synchronous apm implementation exists.
336 336
337 if ( res ) { 337 if ( res ) {
338 do { // wait at most 1.5 sec: either suspend didn't work or the device resumed 338 do { // wait at most 1.5 sec: either suspend didn't work or the device resumed
339 ::usleep ( 200 * 1000 ); 339 ::usleep ( 200 * 1000 );
340 ::gettimeofday ( &tvn, 0 ); 340 ::gettimeofday ( &tvn, 0 );
341 } while ((( tvn. tv_sec - tvs. tv_sec ) * 1000 + ( tvn. tv_usec - tvs. tv_usec ) / 1000 ) < 1500 ); 341 } while ((( tvn. tv_sec - tvs. tv_sec ) * 1000 + ( tvn. tv_usec - tvs. tv_usec ) / 1000 ) < 1500 );
342 } 342 }
343 343
344 return res; 344 return res;
345} 345}
346 346
347//#include <linux/fb.h> better not rely on kernel headers in userspace ... 347//#include <linux/fb.h> better not rely on kernel headers in userspace ...
348 348
349#define FBIOBLANK OD_IO( 'F', 0x11 ) // 0x4611 349#define FBIOBLANK OD_IO( 'F', 0x11 ) // 0x4611
@@ -359,17 +359,17 @@ bool ODevice::setDisplayStatus ( bool on )
359{ 359{
360 if ( d-> m_model == Model_Unknown ) 360 if ( d-> m_model == Model_Unknown )
361 return false; 361 return false;
362 362
363 bool res = false; 363 bool res = false;
364 int fd; 364 int fd;
365 365
366 if (( fd = ::open ( "/dev/fb0", O_RDWR )) >= 0 ) { 366 if (( fd = ::open ( "/dev/fb0", O_RDWR )) >= 0 ) {
367 res = ( ::ioctl ( fd, FBIOBLANK, on ? VESA_NO_BLANKING : VESA_POWERDOWN ) == 0 ); 367 res = ( ::ioctl ( fd, FBIOBLANK, on ? VESA_NO_BLANKING : VESA_POWERDOWN ) == 0 );
368 ::close ( fd ); 368 ::close ( fd );
369 } 369 }
370 return res; 370 return res;
371} 371}
372 372
373bool ODevice::setDisplayBrightness ( int ) 373bool ODevice::setDisplayBrightness ( int )
374{ 374{
375 return false; 375 return false;
@@ -512,47 +512,47 @@ const ODeviceButton *ODevice::buttonForKeycode ( ushort code )
512 512
513void ODevice::reloadButtonMapping ( ) 513void ODevice::reloadButtonMapping ( )
514{ 514{
515 initButtons ( ); 515 initButtons ( );
516 516
517 Config cfg ( "ButtonSettings" ); 517 Config cfg ( "ButtonSettings" );
518 518
519 for ( uint i = 0; i < d-> m_buttons-> count ( ); i++ ) { 519 for ( uint i = 0; i < d-> m_buttons-> count ( ); i++ ) {
520 ODeviceButton &b = ( *d-> m_buttons ) [i]; 520 ODeviceButton &b = ( *d-> m_buttons ) [i];
521 QString group = "Button" + QString::number ( i ); 521 QString group = "Button" + QString::number ( i );
522 522
523 QCString pch, hch; 523 QCString pch, hch;
524 QCString pm, hm; 524 QCString pm, hm;
525 QByteArray pdata, hdata; 525 QByteArray pdata, hdata;
526 526
527 if ( cfg. hasGroup ( group )) { 527 if ( cfg. hasGroup ( group )) {
528 cfg. setGroup ( group ); 528 cfg. setGroup ( group );
529 pch = cfg. readEntry ( "PressedActionChannel" ). latin1 ( ); 529 pch = cfg. readEntry ( "PressedActionChannel" ). latin1 ( );
530 pm = cfg. readEntry ( "PressedActionMessage" ). latin1 ( ); 530 pm = cfg. readEntry ( "PressedActionMessage" ). latin1 ( );
531 // pdata = decodeBase64 ( buttonFile. readEntry ( "PressedActionArgs" )); 531 // pdata = decodeBase64 ( buttonFile. readEntry ( "PressedActionArgs" ));
532 532
533 hch = cfg. readEntry ( "HeldActionChannel" ). latin1 ( ); 533 hch = cfg. readEntry ( "HeldActionChannel" ). latin1 ( );
534 hm = cfg. readEntry ( "HeldActionMessage" ). latin1 ( ); 534 hm = cfg. readEntry ( "HeldActionMessage" ). latin1 ( );
535 // hdata = decodeBase64 ( buttonFile. readEntry ( "HeldActionArgs" )); 535 // hdata = decodeBase64 ( buttonFile. readEntry ( "HeldActionArgs" ));
536 } 536 }
537 537
538 b. setPressedAction ( OQCopMessage ( pch, pm, pdata )); 538 b. setPressedAction ( OQCopMessage ( pch, pm, pdata ));
539 539
540 b. setHeldAction ( OQCopMessage ( hch, hm, hdata )); 540 b. setHeldAction ( OQCopMessage ( hch, hm, hdata ));
541 } 541 }
542} 542}
543 543
544void ODevice::remapPressedAction ( int button, const OQCopMessage &action ) 544void ODevice::remapPressedAction ( int button, const OQCopMessage &action )
545{ 545{
546 initButtons ( ); 546 initButtons ( );
547 547
548 QString mb_chan; 548 QString mb_chan;
549 549
550 if ( button >= (int) d-> m_buttons-> count ( )) 550 if ( button >= (int) d-> m_buttons-> count ( ))
551 return; 551 return;
552 552
553 ODeviceButton &b = ( *d-> m_buttons ) [button]; 553 ODeviceButton &b = ( *d-> m_buttons ) [button];
554 b. setPressedAction ( action ); 554 b. setPressedAction ( action );
555 555
556 mb_chan=b. pressedAction ( ). channel ( ); 556 mb_chan=b. pressedAction ( ). channel ( );
557 557
558 Config buttonFile ( "ButtonSettings" ); 558 Config buttonFile ( "ButtonSettings" );
@@ -568,13 +568,13 @@ void ODevice::remapPressedAction ( int button, const OQCopMessage &action )
568void ODevice::remapHeldAction ( int button, const OQCopMessage &action ) 568void ODevice::remapHeldAction ( int button, const OQCopMessage &action )
569{ 569{
570 initButtons ( ); 570 initButtons ( );
571 571
572 if ( button >= (int) d-> m_buttons-> count ( )) 572 if ( button >= (int) d-> m_buttons-> count ( ))
573 return; 573 return;
574 574
575 ODeviceButton &b = ( *d-> m_buttons ) [button]; 575 ODeviceButton &b = ( *d-> m_buttons ) [button];
576 b. setHeldAction ( action ); 576 b. setHeldAction ( action );
577 577
578 Config buttonFile ( "ButtonSettings" ); 578 Config buttonFile ( "ButtonSettings" );
579 buttonFile. setGroup ( "Button" + QString::number ( button )); 579 buttonFile. setGroup ( "Button" + QString::number ( button ));
580 buttonFile. writeEntry ( "HeldActionChannel", (const char *) b. heldAction ( ). channel ( )); 580 buttonFile. writeEntry ( "HeldActionChannel", (const char *) b. heldAction ( ). channel ( ));
@@ -633,53 +633,69 @@ void iPAQ::init ( )
633 default: 633 default:
634 d-> m_rotation = Rot270; 634 d-> m_rotation = Rot270;
635 break; 635 break;
636 } 636 }
637 637
638 f. setName ( "/etc/familiar-version" ); 638 f. setName ( "/etc/familiar-version" );
639 if ( f. open ( IO_ReadOnly )) { 639 if ( f. open ( IO_ReadOnly )) {
640 d-> m_systemstr = "Familiar"; 640 d-> m_systemstr = "Familiar";
641 d-> m_system = System_Familiar; 641 d-> m_system = System_Familiar;
642 642
643 QTextStream ts ( &f ); 643 QTextStream ts ( &f );
644 d-> m_sysverstr = ts. readLine ( ). mid ( 10 ); 644 d-> m_sysverstr = ts. readLine ( ). mid ( 10 );
645 645
646 f. close ( ); 646 f. close ( );
647 } 647 } else {
648 f. setName ( "/etc/oz_version" );
649
650 if ( f. open ( IO_ReadOnly )) {
651 d-> m_systemstr = "OpenEmbedded/iPaq";
652 d-> m_system = System_Familiar;
653
654 QTextStream ts ( &f );
655 ts.setDevice ( &f );
656 d-> m_sysverstr = ts. readLine ( );
657 f. close ( );
658 }
659 }
660
661
662
663
648 664
649 m_leds [0] = m_leds [1] = Led_Off; 665 m_leds [0] = m_leds [1] = Led_Off;
650 666
651 m_power_timer = 0; 667 m_power_timer = 0;
652 668
653 if ( d-> m_qwsserver ) 669 if ( d-> m_qwsserver )
654 QWSServer::setKeyboardFilter ( this ); 670 QWSServer::setKeyboardFilter ( this );
655} 671}
656 672
657void iPAQ::initButtons ( ) 673void iPAQ::initButtons ( )
658{ 674{
659 if ( d-> m_buttons ) 675 if ( d-> m_buttons )
660 return; 676 return;
661 677
662 d-> m_buttons = new QValueList <ODeviceButton>; 678 d-> m_buttons = new QValueList <ODeviceButton>;
663 679
664 for ( uint i = 0; i < ( sizeof( ipaq_buttons ) / sizeof( i_button )); i++ ) { 680 for ( uint i = 0; i < ( sizeof( ipaq_buttons ) / sizeof( i_button )); i++ ) {
665 i_button *ib = ipaq_buttons + i; 681 i_button *ib = ipaq_buttons + i;
666 ODeviceButton b; 682 ODeviceButton b;
667 683
668 if (( ib-> model & d-> m_model ) == d-> m_model ) { 684 if (( ib-> model & d-> m_model ) == d-> m_model ) {
669 b. setKeycode ( ib-> code ); 685 b. setKeycode ( ib-> code );
670 b. setUserText ( QObject::tr ( "Button", ib-> utext )); 686 b. setUserText ( QObject::tr ( "Button", ib-> utext ));
671 b. setPixmap ( Resource::loadPixmap ( ib-> pix )); 687 b. setPixmap ( Resource::loadPixmap ( ib-> pix ));
672 b. setFactoryPresetPressedAction ( OQCopMessage ( makeChannel ( ib-> fpressedservice ), ib-> fpressedaction )); 688 b. setFactoryPresetPressedAction ( OQCopMessage ( makeChannel ( ib-> fpressedservice ), ib-> fpressedaction ));
673 b. setFactoryPresetHeldAction ( OQCopMessage ( makeChannel ( ib-> fheldservice ), ib-> fheldaction )); 689 b. setFactoryPresetHeldAction ( OQCopMessage ( makeChannel ( ib-> fheldservice ), ib-> fheldaction ));
674 690
675 d-> m_buttons-> append ( b ); 691 d-> m_buttons-> append ( b );
676 } 692 }
677 } 693 }
678 reloadButtonMapping ( ); 694 reloadButtonMapping ( );
679 695
680 QCopChannel *sysch = new QCopChannel ( "QPE/System", this ); 696 QCopChannel *sysch = new QCopChannel ( "QPE/System", this );
681 connect ( sysch, SIGNAL( received( const QCString &, const QByteArray & )), this, SLOT( systemMessage ( const QCString &, const QByteArray & ))); 697 connect ( sysch, SIGNAL( received( const QCString &, const QByteArray & )), this, SLOT( systemMessage ( const QCString &, const QByteArray & )));
682} 698}
683 699
684 700
685//#include <linux/h3600_ts.h> // including kernel headers is evil ... 701//#include <linux/h3600_ts.h> // including kernel headers is evil ...
@@ -716,29 +732,29 @@ QValueList <OLedState> iPAQ::ledStateList ( OLed l ) const
716 QValueList <OLedState> vl; 732 QValueList <OLedState> vl;
717 733
718 if ( l == Led_Power ) 734 if ( l == Led_Power )
719 vl << Led_Off << Led_On << Led_BlinkSlow << Led_BlinkFast; 735 vl << Led_Off << Led_On << Led_BlinkSlow << Led_BlinkFast;
720 else if ( l == Led_BlueTooth && d-> m_model == Model_iPAQ_H38xx ) 736 else if ( l == Led_BlueTooth && d-> m_model == Model_iPAQ_H38xx )
721 vl << Led_Off; // << Led_On << ??? 737 vl << Led_Off; // << Led_On << ???
722 738
723 return vl; 739 return vl;
724} 740}
725 741
726OLedState iPAQ::ledState ( OLed l ) const 742OLedState iPAQ::ledState ( OLed l ) const
727 { 743{
728 switch ( l ) { 744 switch ( l ) {
729 case Led_Power: 745 case Led_Power:
730 return m_leds [0]; 746 return m_leds [0];
731 case Led_BlueTooth: 747 case Led_BlueTooth:
732 return m_leds [1]; 748 return m_leds [1];
733 default: 749 default:
734 return Led_Off; 750 return Led_Off;
735 } 751 }
736} 752}
737 753
738bool iPAQ::setLedState ( OLed l, OLedState st ) 754bool iPAQ::setLedState ( OLed l, OLedState st )
739{ 755{
740 static int fd = ::open ( "/dev/touchscreen/0", O_RDWR | O_NONBLOCK ); 756 static int fd = ::open ( "/dev/touchscreen/0", O_RDWR | O_NONBLOCK );
741 757
742 if ( l == Led_Power ) { 758 if ( l == Led_Power ) {
743 if ( fd >= 0 ) { 759 if ( fd >= 0 ) {
744 LED_IN leds; 760 LED_IN leds;
@@ -770,25 +786,25 @@ bool iPAQ::filter ( int /*unicode*/, int keycode, int modifiers, bool isPress, b
770 int newkeycode = keycode; 786 int newkeycode = keycode;
771 787
772 switch ( keycode ) { 788 switch ( keycode ) {
773 // H38xx/H39xx have no "Q" key anymore - this is now the Mail key 789 // H38xx/H39xx have no "Q" key anymore - this is now the Mail key
774 case HardKey_Menu: { 790 case HardKey_Menu: {
775 if (( d-> m_model == Model_iPAQ_H38xx ) || 791 if (( d-> m_model == Model_iPAQ_H38xx ) ||
776 ( d-> m_model == Model_iPAQ_H39xx )) { 792 ( d-> m_model == Model_iPAQ_H39xx )) {
777 newkeycode = HardKey_Mail; 793 newkeycode = HardKey_Mail;
778 } 794 }
779 break; 795 break;
780 } 796 }
781 797
782 // Rotate cursor keys 180° 798 // Rotate cursor keys 180°
783 case Key_Left : 799 case Key_Left :
784 case Key_Right: 800 case Key_Right:
785 case Key_Up : 801 case Key_Up :
786 case Key_Down : { 802 case Key_Down : {
787 if (( d-> m_model == Model_iPAQ_H31xx ) || 803 if (( d-> m_model == Model_iPAQ_H31xx ) ||
788 ( d-> m_model == Model_iPAQ_H38xx )) { 804 ( d-> m_model == Model_iPAQ_H38xx )) {
789 newkeycode = Key_Left + ( keycode - Key_Left + 2 ) % 4; 805 newkeycode = Key_Left + ( keycode - Key_Left + 2 ) % 4;
790 } 806 }
791 break; 807 break;
792 } 808 }
793 809
794 // map Power Button short/long press to F34/F35 810 // map Power Button short/long press to F34/F35
@@ -801,17 +817,17 @@ bool iPAQ::filter ( int /*unicode*/, int keycode, int modifiers, bool isPress, b
801 else if ( m_power_timer ) { 817 else if ( m_power_timer ) {
802 killTimer ( m_power_timer ); 818 killTimer ( m_power_timer );
803 m_power_timer = 0; 819 m_power_timer = 0;
804 QWSServer::sendKeyEvent ( -1, HardKey_Suspend, 0, true, false ); 820 QWSServer::sendKeyEvent ( -1, HardKey_Suspend, 0, true, false );
805 QWSServer::sendKeyEvent ( -1, HardKey_Suspend, 0, false, false ); 821 QWSServer::sendKeyEvent ( -1, HardKey_Suspend, 0, false, false );
806 } 822 }
807 newkeycode = Key_unknown; 823 newkeycode = Key_unknown;
808 break; 824 break;
809 } 825 }
810 } 826 }
811 827
812 if ( newkeycode != keycode ) { 828 if ( newkeycode != keycode ) {
813 if ( newkeycode != Key_unknown ) 829 if ( newkeycode != Key_unknown )
814 QWSServer::sendKeyEvent ( -1, newkeycode, modifiers, isPress, autoRepeat ); 830 QWSServer::sendKeyEvent ( -1, newkeycode, modifiers, isPress, autoRepeat );
815 return true; 831 return true;
816 } 832 }
817 else 833 else
@@ -866,33 +882,33 @@ void iPAQ::alarmSound ( )
866 882
867 883
868bool iPAQ::setSoftSuspend ( bool soft ) 884bool iPAQ::setSoftSuspend ( bool soft )
869{ 885{
870 bool res = false; 886 bool res = false;
871 int fd; 887 int fd;
872 888
873 if (( fd = ::open ( "/proc/sys/ts/suspend_button_mode", O_WRONLY )) >= 0 ) { 889 if (( fd = ::open ( "/proc/sys/ts/suspend_button_mode", O_WRONLY )) >= 0 ) {
874 if ( ::write ( fd, soft ? "1" : "0", 1 ) == 1 ) 890 if ( ::write ( fd, soft ? "1" : "0", 1 ) == 1 )
875 res = true; 891 res = true;
876 else 892 else
877 ::perror ( "write to /proc/sys/ts/suspend_button_mode" ); 893 ::perror ( "write to /proc/sys/ts/suspend_button_mode" );
878 894
879 ::close ( fd ); 895 ::close ( fd );
880 } 896 }
881 else 897 else
882 ::perror ( "/proc/sys/ts/suspend_button_mode" ); 898 ::perror ( "/proc/sys/ts/suspend_button_mode" );
883 899
884 return res; 900 return res;
885} 901}
886 902
887 903
888bool iPAQ::setDisplayBrightness ( int bright ) 904bool iPAQ::setDisplayBrightness ( int bright )
889{ 905{
890 bool res = false; 906 bool res = false;
891 int fd; 907 int fd;
892 908
893 if ( bright > 255 ) 909 if ( bright > 255 )
894 bright = 255; 910 bright = 255;
895 if ( bright < 0 ) 911 if ( bright < 0 )
896 bright = 0; 912 bright = 0;
897 913
898 if (( fd = ::open ( "/dev/touchscreen/0", O_WRONLY )) >= 0 ) { 914 if (( fd = ::open ( "/dev/touchscreen/0", O_WRONLY )) >= 0 ) {
@@ -910,45 +926,45 @@ int iPAQ::displayBrightnessResolution ( ) const
910{ 926{
911 switch ( model ( )) { 927 switch ( model ( )) {
912 case Model_iPAQ_H31xx: 928 case Model_iPAQ_H31xx:
913 case Model_iPAQ_H36xx: 929 case Model_iPAQ_H36xx:
914 case Model_iPAQ_H37xx: 930 case Model_iPAQ_H37xx:
915 return 128; // really 256, but >128 could damage the LCD 931 return 128; // really 256, but >128 could damage the LCD
916 932
917 case Model_iPAQ_H38xx: 933 case Model_iPAQ_H38xx:
918 case Model_iPAQ_H39xx: 934 case Model_iPAQ_H39xx:
919 return 64; 935 return 64;
920 936
921 default: 937 default:
922 return 2; 938 return 2;
923 } 939 }
924} 940}
925 941
926 942
927bool iPAQ::hasLightSensor ( ) const 943bool iPAQ::hasLightSensor ( ) const
928{ 944{
929 return true; 945 return true;
930} 946}
931 947
932int iPAQ::readLightSensor ( ) 948int iPAQ::readLightSensor ( )
933{ 949{
934 int fd; 950 int fd;
935 int val = -1; 951 int val = -1;
936 952
937 if (( fd = ::open ( "/proc/hal/light_sensor", O_RDONLY )) >= 0 ) { 953 if (( fd = ::open ( "/proc/hal/light_sensor", O_RDONLY )) >= 0 ) {
938 char buffer [8]; 954 char buffer [8];
939 955
940 if ( ::read ( fd, buffer, 5 ) == 5 ) { 956 if ( ::read ( fd, buffer, 5 ) == 5 ) {
941 char *endptr; 957 char *endptr;
942 958
943 buffer [4] = 0; 959 buffer [4] = 0;
944 val = ::strtol ( buffer + 2, &endptr, 16 ); 960 val = ::strtol ( buffer + 2, &endptr, 16 );
945 961
946 if ( *endptr != 0 ) 962 if ( *endptr != 0 )
947 val = -1; 963 val = -1;
948 } 964 }
949 ::close ( fd ); 965 ::close ( fd );
950 } 966 }
951 967
952 return val; 968 return val;
953} 969}
954 970
@@ -977,13 +993,13 @@ void Zaurus::init ( )
977 d-> m_systemstr = "OpenZaurus"; 993 d-> m_systemstr = "OpenZaurus";
978 d-> m_system = System_OpenZaurus; 994 d-> m_system = System_OpenZaurus;
979 995
980 f. close ( ); 996 f. close ( );
981 997
982 f. setName ( "/etc/oz_version" ); 998 f. setName ( "/etc/oz_version" );
983 if ( f. open ( IO_ReadOnly )) { 999 if ( f. open ( IO_ReadOnly )) {
984 QTextStream ts ( &f ); 1000 QTextStream ts ( &f );
985 d-> m_sysverstr = ts. readLine ( );//. mid ( 10 ); 1001 d-> m_sysverstr = ts. readLine ( );//. mid ( 10 );
986 f. close ( ); 1002 f. close ( );
987 } 1003 }
988 } 1004 }
989 else { 1005 else {
@@ -1033,30 +1049,30 @@ void Zaurus::init ( )
1033} 1049}
1034 1050
1035void Zaurus::initButtons ( ) 1051void Zaurus::initButtons ( )
1036{ 1052{
1037 if ( d-> m_buttons ) 1053 if ( d-> m_buttons )
1038 return; 1054 return;
1039 1055
1040 d-> m_buttons = new QValueList <ODeviceButton>; 1056 d-> m_buttons = new QValueList <ODeviceButton>;
1041 1057
1042 for ( uint i = 0; i < ( sizeof( z_buttons ) / sizeof( z_button )); i++ ) { 1058 for ( uint i = 0; i < ( sizeof( z_buttons ) / sizeof( z_button )); i++ ) {
1043 z_button *zb = z_buttons + i; 1059 z_button *zb = z_buttons + i;
1044 ODeviceButton b; 1060 ODeviceButton b;
1045 1061
1046 b. setKeycode ( zb-> code ); 1062 b. setKeycode ( zb-> code );
1047 b. setUserText ( QObject::tr ( "Button", zb-> utext )); 1063 b. setUserText ( QObject::tr ( "Button", zb-> utext ));
1048 b. setPixmap ( Resource::loadPixmap ( zb-> pix )); 1064 b. setPixmap ( Resource::loadPixmap ( zb-> pix ));
1049 b. setFactoryPresetPressedAction ( OQCopMessage ( makeChannel ( zb-> fpressedservice ), zb-> fpressedaction )); 1065 b. setFactoryPresetPressedAction ( OQCopMessage ( makeChannel ( zb-> fpressedservice ), zb-> fpressedaction ));
1050 b. setFactoryPresetHeldAction ( OQCopMessage ( makeChannel ( zb-> fheldservice ), zb-> fheldaction )); 1066 b. setFactoryPresetHeldAction ( OQCopMessage ( makeChannel ( zb-> fheldservice ), zb-> fheldaction ));
1051 1067
1052 d-> m_buttons-> append ( b ); 1068 d-> m_buttons-> append ( b );
1053 } 1069 }
1054 1070
1055 reloadButtonMapping ( ); 1071 reloadButtonMapping ( );
1056 1072
1057 QCopChannel *sysch = new QCopChannel ( "QPE/System", this ); 1073 QCopChannel *sysch = new QCopChannel ( "QPE/System", this );
1058 connect ( sysch, SIGNAL( received( const QCString &, const QByteArray & )), this, SLOT( systemMessage ( const QCString &, const QByteArray & ))); 1074 connect ( sysch, SIGNAL( received( const QCString &, const QByteArray & )), this, SLOT( systemMessage ( const QCString &, const QByteArray & )));
1059} 1075}
1060 1076
1061#include <unistd.h> 1077#include <unistd.h>
1062#include <fcntl.h> 1078#include <fcntl.h>
@@ -1125,31 +1141,31 @@ typedef struct sharp_led_status {
1125#define FL_IOCTL_STEP_CONTRAST 100 1141#define FL_IOCTL_STEP_CONTRAST 100
1126 1142
1127 1143
1128void Zaurus::buzzer ( int sound ) 1144void Zaurus::buzzer ( int sound )
1129{ 1145{
1130 static int fd = ::open ( "/dev/sharp_buz", O_WRONLY|O_NONBLOCK ); 1146 static int fd = ::open ( "/dev/sharp_buz", O_WRONLY|O_NONBLOCK );
1131 1147
1132 if ( fd >= 0 ) { 1148 if ( fd >= 0 ) {
1133 ::ioctl ( fd, SHARP_BUZZER_MAKESOUND, sound ); 1149 ::ioctl ( fd, SHARP_BUZZER_MAKESOUND, sound );
1134 ::close ( fd ); 1150 ::close ( fd );
1135 } 1151 }
1136} 1152}
1137 1153
1138 1154
1139void Zaurus::alarmSound ( ) 1155void Zaurus::alarmSound ( )
1140{ 1156{
1141 buzzer ( SHARP_BUZ_SCHEDULE_ALARM ); 1157 buzzer ( SHARP_BUZ_SCHEDULE_ALARM );
1142} 1158}
1143 1159
1144void Zaurus::touchSound ( ) 1160void Zaurus::touchSound ( )
1145{ 1161{
1146 buzzer ( SHARP_BUZ_TOUCHSOUND ); 1162 buzzer ( SHARP_BUZ_TOUCHSOUND );
1147} 1163}
1148 1164
1149void Zaurus::keySound ( ) 1165void Zaurus::keySound ( )
1150{ 1166{
1151 buzzer ( SHARP_BUZ_KEYSOUND ); 1167 buzzer ( SHARP_BUZ_KEYSOUND );
1152} 1168}
1153 1169
1154 1170
1155QValueList <OLed> Zaurus::ledList ( ) const 1171QValueList <OLed> Zaurus::ledList ( ) const
@@ -1159,49 +1175,49 @@ QValueList <OLed> Zaurus::ledList ( ) const
1159 return vl; 1175 return vl;
1160} 1176}
1161 1177
1162QValueList <OLedState> Zaurus::ledStateList ( OLed l ) const 1178QValueList <OLedState> Zaurus::ledStateList ( OLed l ) const
1163{ 1179{
1164 QValueList <OLedState> vl; 1180 QValueList <OLedState> vl;
1165 1181
1166 if ( l == Led_Mail ) 1182 if ( l == Led_Mail )
1167 vl << Led_Off << Led_On << Led_BlinkSlow; 1183 vl << Led_Off << Led_On << Led_BlinkSlow;
1168 return vl; 1184 return vl;
1169} 1185}
1170 1186
1171OLedState Zaurus::ledState ( OLed which ) const 1187OLedState Zaurus::ledState ( OLed which ) const
1172{ 1188{
1173 if ( which == Led_Mail ) 1189 if ( which == Led_Mail )
1174 return m_leds [0]; 1190 return m_leds [0];
1175 else 1191 else
1176 return Led_Off; 1192 return Led_Off;
1177} 1193}
1178 1194
1179bool Zaurus::setLedState ( OLed which, OLedState st ) 1195bool Zaurus::setLedState ( OLed which, OLedState st )
1180{ 1196{
1181 static int fd = ::open ( "/dev/sharp_led", O_RDWR|O_NONBLOCK ); 1197 static int fd = ::open ( "/dev/sharp_led", O_RDWR|O_NONBLOCK );
1182 1198
1183 if ( which == Led_Mail ) { 1199 if ( which == Led_Mail ) {
1184 if ( fd >= 0 ) { 1200 if ( fd >= 0 ) {
1185 struct sharp_led_status leds; 1201 struct sharp_led_status leds;
1186 ::memset ( &leds, 0, sizeof( leds )); 1202 ::memset ( &leds, 0, sizeof( leds ));
1187 leds. which = SHARP_LED_MAIL_EXISTS; 1203 leds. which = SHARP_LED_MAIL_EXISTS;
1188 bool ok = true; 1204 bool ok = true;
1189 1205
1190 switch ( st ) { 1206 switch ( st ) {
1191 case Led_Off : leds. status = LED_MAIL_NO_UNREAD_MAIL; break; 1207 case Led_Off : leds. status = LED_MAIL_NO_UNREAD_MAIL; break;
1192 case Led_On : leds. status = LED_MAIL_NEWMAIL_EXISTS; break; 1208 case Led_On : leds. status = LED_MAIL_NEWMAIL_EXISTS; break;
1193 case Led_BlinkSlow: leds. status = LED_MAIL_UNREAD_MAIL_EX; break; 1209 case Led_BlinkSlow: leds. status = LED_MAIL_UNREAD_MAIL_EX; break;
1194 default : ok = false; 1210 default : ok = false;
1195 } 1211 }
1196 1212
1197 if ( ok && ( ::ioctl ( fd, SHARP_LED_SETSTATUS, &leds ) >= 0 )) { 1213 if ( ok && ( ::ioctl ( fd, SHARP_LED_SETSTATUS, &leds ) >= 0 )) {
1198 m_leds [0] = st; 1214 m_leds [0] = st;
1199 return true; 1215 return true;
1200 } 1216 }
1201 } 1217 }
1202 } 1218 }
1203 return false; 1219 return false;
1204} 1220}
1205 1221
1206bool Zaurus::setSoftSuspend ( bool soft ) 1222bool Zaurus::setSoftSuspend ( bool soft )
1207{ 1223{
@@ -1223,43 +1239,43 @@ bool Zaurus::setSoftSuspend ( bool soft )
1223 res = true; 1239 res = true;
1224 else 1240 else
1225 perror ( "APM_IOCGEVTSRC" ); 1241 perror ( "APM_IOCGEVTSRC" );
1226 } 1242 }
1227 else 1243 else
1228 perror ( "APM_IOCGEVTSRC" ); 1244 perror ( "APM_IOCGEVTSRC" );
1229 1245
1230 ::close ( fd ); 1246 ::close ( fd );
1231 } 1247 }
1232 else 1248 else
1233 perror ( "/dev/apm_bios or /dev/misc/apm_bios" ); 1249 perror ( "/dev/apm_bios or /dev/misc/apm_bios" );
1234 1250
1235 return res; 1251 return res;
1236} 1252}
1237 1253
1238 1254
1239bool Zaurus::setDisplayBrightness ( int bright ) 1255bool Zaurus::setDisplayBrightness ( int bright )
1240{ 1256{
1241 bool res = false; 1257 bool res = false;
1242 int fd; 1258 int fd;
1243 1259
1244 if ( bright > 255 ) 1260 if ( bright > 255 )
1245 bright = 255; 1261 bright = 255;
1246 if ( bright < 0 ) 1262 if ( bright < 0 )
1247 bright = 0; 1263 bright = 0;
1248 1264
1249 if (( fd = ::open ( "/dev/fl", O_WRONLY )) >= 0 ) { 1265 if (( fd = ::open ( "/dev/fl", O_WRONLY )) >= 0 ) {
1250 int bl = ( bright * 4 + 127 ) / 255; // only 4 steps on zaurus 1266 int bl = ( bright * 4 + 127 ) / 255; // only 4 steps on zaurus
1251 if ( bright && !bl ) 1267 if ( bright && !bl )
1252 bl = 1; 1268 bl = 1;
1253 res = ( ::ioctl ( fd, FL_IOCTL_STEP_CONTRAST, bl ) == 0 ); 1269 res = ( ::ioctl ( fd, FL_IOCTL_STEP_CONTRAST, bl ) == 0 );
1254 ::close ( fd ); 1270 ::close ( fd );
1255 } 1271 }
1256 return res; 1272 return res;
1257} 1273}
1258 1274
1259 1275
1260int Zaurus::displayBrightnessResolution ( ) const 1276int Zaurus::displayBrightnessResolution ( ) const
1261{ 1277{
1262 return 5; 1278 return 5;
1263} 1279}
1264 1280
1265 1281