summaryrefslogtreecommitdiff
Side-by-side diff
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
@@ -56,78 +56,78 @@ public:
bool m_qwsserver;
QString m_vendorstr;
OVendor m_vendor;
-
+
QString m_modelstr;
OModel m_model;
QString m_systemstr;
OSystem m_system;
-
+
QString m_sysverstr;
Transformation m_rotation;
-
+
QValueList <ODeviceButton> *m_buttons;
uint m_holdtime;
};
class iPAQ : public ODevice, public QWSServer::KeyboardFilter {
-protected:
+protected:
virtual void init ( );
virtual void initButtons ( );
-
+
public:
virtual bool setSoftSuspend ( bool soft );
virtual bool setDisplayBrightness ( int b );
virtual int displayBrightnessResolution ( ) const;
virtual void alarmSound ( );
-
+
virtual QValueList <OLed> ledList ( ) const;
virtual QValueList <OLedState> ledStateList ( OLed led ) const;
virtual OLedState ledState ( OLed led ) const;
virtual bool setLedState ( OLed led, OLedState st );
virtual bool hasLightSensor ( ) const;
virtual int readLightSensor ( );
virtual int lightSensorResolution ( ) const;
-
+
protected:
virtual bool filter ( int unicode, int keycode, int modifiers, bool isPress, bool autoRepeat );
virtual void timerEvent ( QTimerEvent *te );
-
+
int m_power_timer;
-
+
OLedState m_leds [2];
};
class Zaurus : public ODevice {
protected:
virtual void init ( );
virtual void initButtons ( );
-public:
+public:
virtual bool setSoftSuspend ( bool soft );
virtual bool setDisplayBrightness ( int b );
virtual int displayBrightnessResolution ( ) const;
virtual void alarmSound ( );
virtual void keySound ( );
- virtual void touchSound ( );
+ virtual void touchSound ( );
virtual QValueList <OLed> ledList ( ) const;
virtual QValueList <OLedState> ledStateList ( OLed led ) const;
virtual OLedState ledState ( OLed led ) const;
virtual bool setLedState ( OLed led, OLedState st );
-
+
protected:
virtual void buzzer ( int snd );
-
+
OLedState m_leds [1];
};
@@ -140,36 +140,36 @@ struct i_button {
char *fpressedaction;
char *fheldservice;
char *fheldaction;
} ipaq_buttons [] = {
- { Model_iPAQ_H31xx | Model_iPAQ_H36xx | Model_iPAQ_H37xx | Model_iPAQ_H38xx | Model_iPAQ_H39xx,
- Qt::Key_F9, QT_TRANSLATE_NOOP("Button", "Calendar Button"),
- "devicebuttons/ipaq_calendar",
- "datebook", "nextView()",
+ { Model_iPAQ_H31xx | Model_iPAQ_H36xx | Model_iPAQ_H37xx | Model_iPAQ_H38xx | Model_iPAQ_H39xx,
+ Qt::Key_F9, QT_TRANSLATE_NOOP("Button", "Calendar Button"),
+ "devicebuttons/ipaq_calendar",
+ "datebook", "nextView()",
"today", "raise()" },
{ Model_iPAQ_H31xx | Model_iPAQ_H36xx | Model_iPAQ_H37xx | Model_iPAQ_H38xx | Model_iPAQ_H39xx,
- Qt::Key_F10, QT_TRANSLATE_NOOP("Button", "Contacts Button"),
- "devicebuttons/ipaq_contact",
+ Qt::Key_F10, QT_TRANSLATE_NOOP("Button", "Contacts Button"),
+ "devicebuttons/ipaq_contact",
"addressbook", "raise()",
"addressbook", "beamBusinessCard()" },
- { Model_iPAQ_H31xx | Model_iPAQ_H36xx | Model_iPAQ_H37xx,
- Qt::Key_F11, QT_TRANSLATE_NOOP("Button", "Menu Button"),
+ { Model_iPAQ_H31xx | Model_iPAQ_H36xx | Model_iPAQ_H37xx,
+ Qt::Key_F11, QT_TRANSLATE_NOOP("Button", "Menu Button"),
"devicebuttons/ipaq_menu",
"QPE/TaskBar", "toggleMenu()",
"QPE/TaskBar", "toggleStartMenu()" },
{ Model_iPAQ_H38xx | Model_iPAQ_H39xx,
- Qt::Key_F13, QT_TRANSLATE_NOOP("Button", "Mail Button"),
+ Qt::Key_F13, QT_TRANSLATE_NOOP("Button", "Mail Button"),
"devicebuttons/ipaq_mail",
"mail", "raise()",
"mail", "newMail()" },
{ Model_iPAQ_H31xx | Model_iPAQ_H36xx | Model_iPAQ_H37xx | Model_iPAQ_H38xx | Model_iPAQ_H39xx,
- Qt::Key_F12, QT_TRANSLATE_NOOP("Button", "Home Button"),
- "devicebuttons/ipaq_home",
+ Qt::Key_F12, QT_TRANSLATE_NOOP("Button", "Home Button"),
+ "devicebuttons/ipaq_home",
"QPE/Launcher", "home()",
"buttonsettings", "raise()" },
{ Model_iPAQ_H31xx | Model_iPAQ_H36xx | Model_iPAQ_H37xx | Model_iPAQ_H38xx | Model_iPAQ_H39xx,
- Qt::Key_F24, QT_TRANSLATE_NOOP("Button", "Record Button"),
- "devicebuttons/ipaq_record",
+ Qt::Key_F24, QT_TRANSLATE_NOOP("Button", "Record Button"),
+ "devicebuttons/ipaq_record",
"QPE/VMemo", "toggleRecord()",
"sound", "raise()" },
};
@@ -217,17 +217,17 @@ static QCString makeChannel ( const char *str )
ODevice *ODevice::inst ( )
{
static ODevice *dev = 0;
-
+
if ( !dev ) {
if ( QFile::exists ( "/proc/hal/model" ))
dev = new iPAQ ( );
else if ( QFile::exists ( "/dev/sharp_buz" ) || QFile::exists ( "/dev/sharp_led" ))
dev = new Zaurus ( );
else
dev = new ODevice ( );
-
+
dev-> init ( );
}
return dev;
}
@@ -253,18 +253,18 @@ ODevice::ODevice ( )
d-> m_systemstr = "Unknown";
d-> m_system = System_Unknown;
d-> m_sysverstr = "0.0";
d-> m_rotation = Rot0;
-
+
d-> m_holdtime = 1000; // 1000ms
d-> m_buttons = 0;
}
void ODevice::systemMessage ( const QCString &msg, const QByteArray & )
{
if ( msg == "deviceButtonMappingChanged()" ) {
reloadButtonMapping ( );
- }
+ }
}
void ODevice::init ( )
{
@@ -280,12 +280,12 @@ void ODevice::initButtons ( )
qDebug ( "init Buttons" );
d-> m_buttons = new QValueList <ODeviceButton>;
for ( uint i = 0; i < ( sizeof( ipaq_buttons ) / sizeof( i_button )); i++ ) {
- i_button *ib = ipaq_buttons + i;
+ i_button *ib = ipaq_buttons + i;
ODeviceButton b;
-
- if (( ib-> model & Model_iPAQ_H36xx ) == Model_iPAQ_H36xx ) {
+
+ if (( ib-> model & Model_iPAQ_H36xx ) == Model_iPAQ_H36xx ) {
b. setKeycode ( ib-> code );
b. setUserText ( QObject::tr ( "Button", ib-> utext ));
b. setPixmap ( Resource::loadPixmap ( ib-> pix ));
b. setFactoryPresetPressedAction ( OQCopMessage ( makeChannel ( ib-> fpressedservice ), ib-> fpressedaction ));
@@ -293,11 +293,11 @@ void ODevice::initButtons ( )
d-> m_buttons-> append ( b );
}
}
reloadButtonMapping ( );
-
+
QCopChannel *sysch = new QCopChannel ( "QPE/System", this );
- connect ( sysch, SIGNAL( received( const QCString &, const QByteArray & )), this, SLOT( systemMessage ( const QCString &, const QByteArray & )));
+ connect ( sysch, SIGNAL( received( const QCString &, const QByteArray & )), this, SLOT( systemMessage ( const QCString &, const QByteArray & )));
}
ODevice::~ODevice ( )
{
@@ -322,26 +322,26 @@ bool ODevice::suspend ( )
if ( d-> m_model == Model_Unknown ) // better don't suspend in qvfb / on unkown devices
return false;
bool res = false;
-
+
struct timeval tvs, tvn;
::gettimeofday ( &tvs, 0 );
-
+
::sync ( ); // flush fs caches
res = ( ::system ( "apm --suspend" ) == 0 );
// This is needed because the iPAQ apm implementation is asynchronous and we
// can not be sure when exactly the device is really suspended
// This can be deleted as soon as a stable familiar with a synchronous apm implementation exists.
- if ( res ) {
+ if ( res ) {
do { // wait at most 1.5 sec: either suspend didn't work or the device resumed
::usleep ( 200 * 1000 );
- ::gettimeofday ( &tvn, 0 );
+ ::gettimeofday ( &tvn, 0 );
} while ((( tvn. tv_sec - tvs. tv_sec ) * 1000 + ( tvn. tv_usec - tvs. tv_usec ) / 1000 ) < 1500 );
}
-
+
return res;
}
//#include <linux/fb.h> better not rely on kernel headers in userspace ...
@@ -361,13 +361,13 @@ bool ODevice::setDisplayStatus ( bool on )
return false;
bool res = false;
int fd;
-
+
if (( fd = ::open ( "/dev/fb0", O_RDWR )) >= 0 ) {
res = ( ::ioctl ( fd, FBIOBLANK, on ? VESA_NO_BLANKING : VESA_POWERDOWN ) == 0 );
::close ( fd );
- }
+ }
return res;
}
bool ODevice::setDisplayBrightness ( int )
@@ -514,17 +514,17 @@ void ODevice::reloadButtonMapping ( )
{
initButtons ( );
Config cfg ( "ButtonSettings" );
-
+
for ( uint i = 0; i < d-> m_buttons-> count ( ); i++ ) {
ODeviceButton &b = ( *d-> m_buttons ) [i];
QString group = "Button" + QString::number ( i );
QCString pch, hch;
QCString pm, hm;
QByteArray pdata, hdata;
-
+
if ( cfg. hasGroup ( group )) {
cfg. setGroup ( group );
pch = cfg. readEntry ( "PressedActionChannel" ). latin1 ( );
pm = cfg. readEntry ( "PressedActionMessage" ). latin1 ( );
@@ -533,11 +533,11 @@ void ODevice::reloadButtonMapping ( )
hch = cfg. readEntry ( "HeldActionChannel" ). latin1 ( );
hm = cfg. readEntry ( "HeldActionMessage" ). latin1 ( );
// hdata = decodeBase64 ( buttonFile. readEntry ( "HeldActionArgs" ));
}
-
+
b. setPressedAction ( OQCopMessage ( pch, pm, pdata ));
-
+
b. setHeldAction ( OQCopMessage ( hch, hm, hdata ));
}
}
@@ -545,12 +545,12 @@ void ODevice::remapPressedAction ( int button, const OQCopMessage &action )
{
initButtons ( );
QString mb_chan;
-
+
if ( button >= (int) d-> m_buttons-> count ( ))
return;
-
+
ODeviceButton &b = ( *d-> m_buttons ) [button];
b. setPressedAction ( action );
mb_chan=b. pressedAction ( ). channel ( );
@@ -570,9 +570,9 @@ void ODevice::remapHeldAction ( int button, const OQCopMessage &action )
initButtons ( );
if ( button >= (int) d-> m_buttons-> count ( ))
return;
-
+
ODeviceButton &b = ( *d-> m_buttons ) [button];
b. setHeldAction ( action );
Config buttonFile ( "ButtonSettings" );
@@ -635,24 +635,40 @@ void iPAQ::init ( )
break;
}
f. setName ( "/etc/familiar-version" );
- if ( f. open ( IO_ReadOnly )) {
+ if ( f. open ( IO_ReadOnly )) {
d-> m_systemstr = "Familiar";
d-> m_system = System_Familiar;
-
+
QTextStream ts ( &f );
d-> m_sysverstr = ts. readLine ( ). mid ( 10 );
-
+
f. close ( );
- }
+ } else {
+ f. setName ( "/etc/oz_version" );
+
+ if ( f. open ( IO_ReadOnly )) {
+ d-> m_systemstr = "OpenEmbedded/iPaq";
+ d-> m_system = System_Familiar;
+
+ QTextStream ts ( &f );
+ ts.setDevice ( &f );
+ d-> m_sysverstr = ts. readLine ( );
+ f. close ( );
+ }
+ }
+
+
+
+
m_leds [0] = m_leds [1] = Led_Off;
-
+
m_power_timer = 0;
-
+
if ( d-> m_qwsserver )
- QWSServer::setKeyboardFilter ( this );
+ QWSServer::setKeyboardFilter ( this );
}
void iPAQ::initButtons ( )
{
@@ -661,23 +677,23 @@ void iPAQ::initButtons ( )
d-> m_buttons = new QValueList <ODeviceButton>;
for ( uint i = 0; i < ( sizeof( ipaq_buttons ) / sizeof( i_button )); i++ ) {
- i_button *ib = ipaq_buttons + i;
+ i_button *ib = ipaq_buttons + i;
ODeviceButton b;
-
- if (( ib-> model & d-> m_model ) == d-> m_model ) {
+
+ if (( ib-> model & d-> m_model ) == d-> m_model ) {
b. setKeycode ( ib-> code );
b. setUserText ( QObject::tr ( "Button", ib-> utext ));
b. setPixmap ( Resource::loadPixmap ( ib-> pix ));
b. setFactoryPresetPressedAction ( OQCopMessage ( makeChannel ( ib-> fpressedservice ), ib-> fpressedaction ));
b. setFactoryPresetHeldAction ( OQCopMessage ( makeChannel ( ib-> fheldservice ), ib-> fheldaction ));
-
+
d-> m_buttons-> append ( b );
}
}
- reloadButtonMapping ( );
-
+ reloadButtonMapping ( );
+
QCopChannel *sysch = new QCopChannel ( "QPE/System", this );
connect ( sysch, SIGNAL( received( const QCString &, const QByteArray & )), this, SLOT( systemMessage ( const QCString &, const QByteArray & )));
}
@@ -718,14 +734,14 @@ QValueList <OLedState> iPAQ::ledStateList ( OLed l ) const
if ( l == Led_Power )
vl << Led_Off << Led_On << Led_BlinkSlow << Led_BlinkFast;
else if ( l == Led_BlueTooth && d-> m_model == Model_iPAQ_H38xx )
vl << Led_Off; // << Led_On << ???
-
+
return vl;
}
OLedState iPAQ::ledState ( OLed l ) const
-{
+{
switch ( l ) {
case Led_Power:
return m_leds [0];
case Led_BlueTooth:
@@ -734,9 +750,9 @@ OLedState iPAQ::ledState ( OLed l ) const
return Led_Off;
}
}
-bool iPAQ::setLedState ( OLed l, OLedState st )
+bool iPAQ::setLedState ( OLed l, OLedState st )
{
static int fd = ::open ( "/dev/touchscreen/0", O_RDWR | O_NONBLOCK );
if ( l == Led_Power ) {
@@ -772,21 +788,21 @@ bool iPAQ::filter ( int /*unicode*/, int keycode, int modifiers, bool isPress, b
switch ( keycode ) {
// H38xx/H39xx have no "Q" key anymore - this is now the Mail key
case HardKey_Menu: {
if (( d-> m_model == Model_iPAQ_H38xx ) ||
- ( d-> m_model == Model_iPAQ_H39xx )) {
+ ( d-> m_model == Model_iPAQ_H39xx )) {
newkeycode = HardKey_Mail;
}
break;
}
-
+
// Rotate cursor keys 180°
- case Key_Left :
- case Key_Right:
- case Key_Up :
+ case Key_Left :
+ case Key_Right:
+ case Key_Up :
case Key_Down : {
if (( d-> m_model == Model_iPAQ_H31xx ) ||
- ( d-> m_model == Model_iPAQ_H38xx )) {
+ ( d-> m_model == Model_iPAQ_H38xx )) {
newkeycode = Key_Left + ( keycode - Key_Left + 2 ) % 4;
}
break;
}
@@ -803,13 +819,13 @@ bool iPAQ::filter ( int /*unicode*/, int keycode, int modifiers, bool isPress, b
m_power_timer = 0;
QWSServer::sendKeyEvent ( -1, HardKey_Suspend, 0, true, false );
QWSServer::sendKeyEvent ( -1, HardKey_Suspend, 0, false, false );
}
- newkeycode = Key_unknown;
- break;
+ newkeycode = Key_unknown;
+ break;
}
}
-
+
if ( newkeycode != keycode ) {
if ( newkeycode != Key_unknown )
QWSServer::sendKeyEvent ( -1, newkeycode, modifiers, isPress, autoRepeat );
return true;
@@ -868,29 +884,29 @@ void iPAQ::alarmSound ( )
bool iPAQ::setSoftSuspend ( bool soft )
{
bool res = false;
int fd;
-
+
if (( fd = ::open ( "/proc/sys/ts/suspend_button_mode", O_WRONLY )) >= 0 ) {
if ( ::write ( fd, soft ? "1" : "0", 1 ) == 1 )
res = true;
else
::perror ( "write to /proc/sys/ts/suspend_button_mode" );
-
+
::close ( fd );
}
else
::perror ( "/proc/sys/ts/suspend_button_mode" );
-
+
return res;
}
bool iPAQ::setDisplayBrightness ( int bright )
{
bool res = false;
int fd;
-
+
if ( bright > 255 )
bright = 255;
if ( bright < 0 )
bright = 0;
@@ -912,16 +928,16 @@ int iPAQ::displayBrightnessResolution ( ) const
case Model_iPAQ_H31xx:
case Model_iPAQ_H36xx:
case Model_iPAQ_H37xx:
return 128; // really 256, but >128 could damage the LCD
-
+
case Model_iPAQ_H38xx:
case Model_iPAQ_H39xx:
return 64;
-
+
default:
return 2;
- }
+ }
}
bool iPAQ::hasLightSensor ( ) const
@@ -932,21 +948,21 @@ bool iPAQ::hasLightSensor ( ) const
int iPAQ::readLightSensor ( )
{
int fd;
int val = -1;
-
+
if (( fd = ::open ( "/proc/hal/light_sensor", O_RDONLY )) >= 0 ) {
char buffer [8];
-
+
if ( ::read ( fd, buffer, 5 ) == 5 ) {
char *endptr;
-
+
buffer [4] = 0;
val = ::strtol ( buffer + 2, &endptr, 16 );
-
+
if ( *endptr != 0 )
val = -1;
- }
+ }
::close ( fd );
}
return val;
@@ -979,9 +995,9 @@ void Zaurus::init ( )
f. close ( );
f. setName ( "/etc/oz_version" );
- if ( f. open ( IO_ReadOnly )) {
+ if ( f. open ( IO_ReadOnly )) {
QTextStream ts ( &f );
d-> m_sysverstr = ts. readLine ( );//. mid ( 10 );
f. close ( );
}
@@ -1035,26 +1051,26 @@ void Zaurus::init ( )
void Zaurus::initButtons ( )
{
if ( d-> m_buttons )
return;
-
+
d-> m_buttons = new QValueList <ODeviceButton>;
for ( uint i = 0; i < ( sizeof( z_buttons ) / sizeof( z_button )); i++ ) {
- z_button *zb = z_buttons + i;
+ z_button *zb = z_buttons + i;
ODeviceButton b;
-
+
b. setKeycode ( zb-> code );
b. setUserText ( QObject::tr ( "Button", zb-> utext ));
b. setPixmap ( Resource::loadPixmap ( zb-> pix ));
b. setFactoryPresetPressedAction ( OQCopMessage ( makeChannel ( zb-> fpressedservice ), zb-> fpressedaction ));
b. setFactoryPresetHeldAction ( OQCopMessage ( makeChannel ( zb-> fheldservice ), zb-> fheldaction ));
-
+
d-> m_buttons-> append ( b );
}
-
+
reloadButtonMapping ( );
-
+
QCopChannel *sysch = new QCopChannel ( "QPE/System", this );
connect ( sysch, SIGNAL( received( const QCString &, const QByteArray & )), this, SLOT( systemMessage ( const QCString &, const QByteArray & )));
}
@@ -1127,27 +1143,27 @@ typedef struct sharp_led_status {
void Zaurus::buzzer ( int sound )
{
static int fd = ::open ( "/dev/sharp_buz", O_WRONLY|O_NONBLOCK );
-
+
if ( fd >= 0 ) {
::ioctl ( fd, SHARP_BUZZER_MAKESOUND, sound );
::close ( fd );
}
}
-void Zaurus::alarmSound ( )
+void Zaurus::alarmSound ( )
{
buzzer ( SHARP_BUZ_SCHEDULE_ALARM );
}
-void Zaurus::touchSound ( )
+void Zaurus::touchSound ( )
{
buzzer ( SHARP_BUZ_TOUCHSOUND );
}
-void Zaurus::keySound ( )
+void Zaurus::keySound ( )
{
buzzer ( SHARP_BUZ_KEYSOUND );
}
@@ -1161,9 +1177,9 @@ QValueList <OLed> Zaurus::ledList ( ) const
QValueList <OLedState> Zaurus::ledStateList ( OLed l ) const
{
QValueList <OLedState> vl;
-
+
if ( l == Led_Mail )
vl << Led_Off << Led_On << Led_BlinkSlow;
return vl;
}
@@ -1171,35 +1187,35 @@ QValueList <OLedState> Zaurus::ledStateList ( OLed l ) const
OLedState Zaurus::ledState ( OLed which ) const
{
if ( which == Led_Mail )
return m_leds [0];
- else
+ else
return Led_Off;
}
bool Zaurus::setLedState ( OLed which, OLedState st )
{
- static int fd = ::open ( "/dev/sharp_led", O_RDWR|O_NONBLOCK );
+ static int fd = ::open ( "/dev/sharp_led", O_RDWR|O_NONBLOCK );
if ( which == Led_Mail ) {
if ( fd >= 0 ) {
struct sharp_led_status leds;
::memset ( &leds, 0, sizeof( leds ));
leds. which = SHARP_LED_MAIL_EXISTS;
bool ok = true;
-
+
switch ( st ) {
case Led_Off : leds. status = LED_MAIL_NO_UNREAD_MAIL; break;
case Led_On : leds. status = LED_MAIL_NEWMAIL_EXISTS; break;
case Led_BlinkSlow: leds. status = LED_MAIL_UNREAD_MAIL_EX; break;
default : ok = false;
}
-
+
if ( ok && ( ::ioctl ( fd, SHARP_LED_SETSTATUS, &leds ) >= 0 )) {
m_leds [0] = st;
return true;
}
- }
+ }
}
return false;
}
@@ -1225,28 +1241,28 @@ bool Zaurus::setSoftSuspend ( bool soft )
perror ( "APM_IOCGEVTSRC" );
}
else
perror ( "APM_IOCGEVTSRC" );
-
+
::close ( fd );
}
else
perror ( "/dev/apm_bios or /dev/misc/apm_bios" );
-
+
return res;
}
bool Zaurus::setDisplayBrightness ( int bright )
{
bool res = false;
int fd;
-
+
if ( bright > 255 )
bright = 255;
if ( bright < 0 )
bright = 0;
-
+
if (( fd = ::open ( "/dev/fl", O_WRONLY )) >= 0 ) {
int bl = ( bright * 4 + 127 ) / 255; // only 4 steps on zaurus
if ( bright && !bl )
bl = 1;
@@ -1256,9 +1272,9 @@ bool Zaurus::setDisplayBrightness ( int bright )
return res;
}
-int Zaurus::displayBrightnessResolution ( ) const
+int Zaurus::displayBrightnessResolution ( ) const
{
return 5;
}