-rw-r--r-- | libopie2/opiecore/device/device.pro | 2 | ||||
-rw-r--r-- | libopie2/opiecore/device/odevice.cpp | 14 | ||||
-rw-r--r-- | libopie2/opiecore/device/odevice_abstractmobiledevice.cpp | 119 | ||||
-rw-r--r-- | libopie2/opiecore/device/odevice_abstractmobiledevice.h | 64 | ||||
-rw-r--r-- | libopie2/opiecore/device/odevice_beagle.h | 4 | ||||
-rw-r--r-- | libopie2/opiecore/device/odevice_ipaq.h | 4 | ||||
-rw-r--r-- | libopie2/opiecore/device/odevice_jornada.cpp | 21 | ||||
-rw-r--r-- | libopie2/opiecore/device/odevice_jornada.h | 5 | ||||
-rw-r--r-- | libopie2/opiecore/device/odevice_ramses.h | 2 | ||||
-rw-r--r-- | libopie2/opiecore/device/odevice_simpad.cpp | 2 | ||||
-rw-r--r-- | libopie2/opiecore/device/odevice_simpad.h | 6 | ||||
-rw-r--r-- | libopie2/opiecore/device/odevice_yopy.h | 4 | ||||
-rw-r--r-- | libopie2/opiecore/device/odevice_zaurus.cpp | 36 | ||||
-rw-r--r-- | libopie2/opiecore/device/odevice_zaurus.h | 5 |
14 files changed, 204 insertions, 84 deletions
diff --git a/libopie2/opiecore/device/device.pro b/libopie2/opiecore/device/device.pro index 9a409e1..08bd4e1 100644 --- a/libopie2/opiecore/device/device.pro +++ b/libopie2/opiecore/device/device.pro @@ -1,21 +1,23 @@ HEADERS += device/odevice.h \ device/odevicebutton.h \ + device/odevice_abstractmobiledevice.h \ device/odevice_beagle.h \ device/odevice_ipaq.h \ device/odevice_jornada.h \ device/odevice_ramses.h \ device/odevice_simpad.h \ device/odevice_zaurus.h \ device/odevice_genuineintel.h \ device/odevice_yopy.h SOURCES += device/odevice.cpp \ device/odevicebutton.cpp \ + device/odevice_abstractmobiledevice.cpp \ device/odevice_beagle.cpp \ device/odevice_ipaq.cpp \ device/odevice_jornada.cpp\ device/odevice_ramses.cpp \ device/odevice_simpad.cpp \ device/odevice_zaurus.cpp \ device/odevice_genuineintel.cpp \ device/odevice_yopy.cpp diff --git a/libopie2/opiecore/device/odevice.cpp b/libopie2/opiecore/device/odevice.cpp index 2c5190c..ed705a6 100644 --- a/libopie2/opiecore/device/odevice.cpp +++ b/libopie2/opiecore/device/odevice.cpp @@ -249,46 +249,32 @@ void ODevice::initButtons() ODevice::~ODevice() { // we leak m_devicebuttons and m_cpu_frequency // but it's a singleton and it is not so importantant // -zecke delete d; } -//#include <linux/apm_bios.h> - -#define APM_IOC_SUSPEND OD_IO( 'A', 2 ) - /** * This method will try to suspend the device * It only works if the user is the QWS Server and the apm application * is installed. * It tries to suspend and then waits some time cause some distributions * do have asynchronus apm implementations. * This method will either fail and return false or it'll suspend the * device and return once the device got woken up * * @return if the device got suspended */ bool ODevice::suspend() { return false; // default implementation == unknown device or qvfb } -//#include <linux/fb.h> better not rely on kernel headers in userspace ... - -#define FBIOBLANK OD_IO( 'F', 0x11 ) // 0x4611 - -/* VESA Blanking Levels */ -#define VESA_NO_BLANKING 0 -#define VESA_VSYNC_SUSPEND 1 -#define VESA_HSYNC_SUSPEND 2 -#define VESA_POWERDOWN 3 - /** * This sets the display on or off */ bool ODevice::setDisplayStatus( bool on ) { qDebug( "ODevice::setDisplayStatus( %d ) - please override me.", on ); return false; // don't do anything for unknown models } diff --git a/libopie2/opiecore/device/odevice_abstractmobiledevice.cpp b/libopie2/opiecore/device/odevice_abstractmobiledevice.cpp new file mode 100644 index 0000000..f3f6af5 --- a/dev/null +++ b/libopie2/opiecore/device/odevice_abstractmobiledevice.cpp @@ -0,0 +1,119 @@ +/* + This file is part of the Opie Project + Copyright (C) 2004, 2005 Holger Hans Peter Freyther <freyther@handhelds.org> + Copyright (C) 2004, 2005 Michael 'mickey' Lauer <mickeyl@handhelds.org> + Copyright (C) 2002, 2003 Robert Griebl <sandman@handhelds.org> + + + =. + .=l. + .>+-= + _;:, .> :=|. This program is free software; you can +.> <`_, > . <= redistribute it and/or modify it under +:`=1 )Y*s>-.-- : the terms of the GNU Library General Public +.="- .-=="i, .._ License as published by the Free Software + - . .-<_> .<> Foundation; either version 2 of the License, + ._= =} : or (at your option) any later version. + .%`+i> _;_. + .i_,=:_. -<s. This program is distributed in the hope that + + . -:. = it will be useful, but WITHOUT ANY WARRANTY; + : .. .:, . . . without even the implied warranty of + =_ + =;=|` MERCHANTABILITY or FITNESS FOR A + _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU +..}^=.= = ; Library General Public License for more +++= -. .` .: details. + : = ...= . :.=- + -. .:....=;==+<; You should have received a copy of the GNU + -_. . . )=. = Library General Public License along with + -- :-=` this library; see the file COPYING.LIB. + If not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. +*/ + +#include "odevice_abstractmobiledevice.h" + +#include <sys/time.h> +#include <sys/ioctl.h> + +#include <time.h> +#include <fcntl.h> +#include <unistd.h> +#include <stdlib.h> + +namespace Opie { +namespace Core { +OAbstractMobileDevice::OAbstractMobileDevice() + : m_timeOut( 1500 ) +{} + +/** + * @short Time to wait for the asynchronos APM implementation to suspend + * + * Milli Seconds to wait before returning from the suspend method. + * This is needed due asynchrnonus implementations of the APM bios. + * + */ +void OAbstractMobileDevice::setAPMTimeOut( int time ) { + m_timeOut = time; +} + + +bool OAbstractMobileDevice::suspend() { + if ( !isQWS( ) ) // only qwsserver is allowed to suspend + return false; + + bool res = false; + ODevice::sendSuspendmsg(); + + struct timeval tvs, tvn; + ::gettimeofday ( &tvs, 0 ); + + ::sync(); // flush fs caches + res = ( ::system ( "apm --suspend" ) == 0 ); + + // This is needed because some apm implementations are 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 ) { + do { // wait at most 1.5 sec: either suspend didn't work or the device resumed + ::usleep ( 200 * 1000 ); + ::gettimeofday ( &tvn, 0 ); + } while ((( tvn. tv_sec - tvs. tv_sec ) * 1000 + ( tvn. tv_usec - tvs. tv_usec ) / 1000 ) < m_timeOut ); + } + + return res; +} + +//#include <linux/fb.h> better not rely on kernel headers in userspace ... + +// _IO and friends are only defined in kernel headers ... +#define OD_IOC(dir,type,number,size) (( dir << 30 ) | ( type << 8 ) | ( number ) | ( size << 16 )) +#define OD_IO(type,number) OD_IOC(0,type,number,0) + +#define FBIOBLANK OD_IO( 'F', 0x11 ) // 0x4611 + +/* VESA Blanking Levels */ +#define VESA_NO_BLANKING 0 +#define VESA_VSYNC_SUSPEND 1 +#define VESA_HSYNC_SUSPEND 2 +#define VESA_POWERDOWN 3 + +bool OAbstractMobileDevice::setDisplayStatus ( bool on ) { + bool res = false; + int fd; + +#ifdef QT_QWS_DEVFS + if (( fd = ::open ( "/dev/fb/0", O_RDWR )) >= 0 ) { +#else + if (( fd = ::open ( "/dev/fb0", O_RDWR )) >= 0 ) { +#endif + res = ( ::ioctl ( fd, FBIOBLANK, on ? VESA_NO_BLANKING : VESA_POWERDOWN ) == 0 ); + ::close ( fd ); + } + + return res; +} +} +} diff --git a/libopie2/opiecore/device/odevice_abstractmobiledevice.h b/libopie2/opiecore/device/odevice_abstractmobiledevice.h new file mode 100644 index 0000000..9467e82 --- a/dev/null +++ b/libopie2/opiecore/device/odevice_abstractmobiledevice.h @@ -0,0 +1,64 @@ +/* + This file is part of the Opie Project + Copyright (C) 2004, 2005 Holger Hans Peter Freyther <freyther@handhelds.org> + Copyright (C) 2004, 2005 Michael 'mickey' Lauer <mickeyl@handhelds.org> + + + =. + .=l. + .>+-= + _;:, .> :=|. This program is free software; you can +.> <`_, > . <= redistribute it and/or modify it under +:`=1 )Y*s>-.-- : the terms of the GNU Library General Public +.="- .-=="i, .._ License as published by the Free Software + - . .-<_> .<> Foundation; either version 2 of the License, + ._= =} : or (at your option) any later version. + .%`+i> _;_. + .i_,=:_. -<s. This program is distributed in the hope that + + . -:. = it will be useful, but WITHOUT ANY WARRANTY; + : .. .:, . . . without even the implied warranty of + =_ + =;=|` MERCHANTABILITY or FITNESS FOR A + _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU +..}^=.= = ; Library General Public License for more +++= -. .` .: details. + : = ...= . :.=- + -. .:....=;==+<; You should have received a copy of the GNU + -_. . . )=. = Library General Public License along with + -- :-=` this library; see the file COPYING.LIB. + If not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. +*/ + +#ifndef OPIE_CORE_DEVICE_ABSTRACT_MOBILE_DEVICE +#define OPIE_CORE_DEVICE_ABSTRACT_MOBILE_DEVICE + +#include "odevice.h" + +namespace Opie { +namespace Core { +/** + * @short Common Implementations for Linux Handheld Devices + * + * Abstract Class with implementation for suspending using + * asynchrnonus apm implementations and displaystatus using + * the Linux Frame Buffer API + * + */ +class OAbstractMobileDevice : public ODevice { + Q_OBJECT +protected: + OAbstractMobileDevice(); + void setAPMTimeOut( int time ); +public: + virtual bool suspend(); + virtual bool setDisplayStatus(bool); + +private: + int m_timeOut; +}; +} +} + + +#endif diff --git a/libopie2/opiecore/device/odevice_beagle.h b/libopie2/opiecore/device/odevice_beagle.h index 17b040c..697d689 100644 --- a/libopie2/opiecore/device/odevice_beagle.h +++ b/libopie2/opiecore/device/odevice_beagle.h @@ -25,22 +25,22 @@ If not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef OPIE_CORE_DEVICE_BEAGLE_H #define OPIE_CORE_DEVICE_BEAGLE_H -#include "odevice.h" +#include "odevice_abstractmobiledevice.h" namespace Opie { namespace Core { namespace Internal { -class Beagle : public ODevice { +class Beagle : public OAbstractMobileDevice { public: Beagle(); ~Beagle(); //@{ void init( const QString& init ); void initButtons(); //@} diff --git a/libopie2/opiecore/device/odevice_ipaq.h b/libopie2/opiecore/device/odevice_ipaq.h index b1dac74..1889467 100644 --- a/libopie2/opiecore/device/odevice_ipaq.h +++ b/libopie2/opiecore/device/odevice_ipaq.h @@ -25,26 +25,26 @@ If not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef ODEVICE_IPAQ #define ODEVICE_IPAQ -#include "odevice.h" +#include "odevice_abstractmobiledevice.h" /* QT */ #include <qwindowsystem_qws.h> namespace Opie { namespace Core { namespace Internal { -class iPAQ : public ODevice, public QWSServer::KeyboardFilter +class iPAQ : public OAbstractMobileDevice, public QWSServer::KeyboardFilter { protected: virtual void init(const QString&); virtual void initButtons(); public: virtual bool setDisplayBrightness( int b ); diff --git a/libopie2/opiecore/device/odevice_jornada.cpp b/libopie2/opiecore/device/odevice_jornada.cpp index 8141f1c..5f95e42 100644 --- a/libopie2/opiecore/device/odevice_jornada.cpp +++ b/libopie2/opiecore/device/odevice_jornada.cpp @@ -165,37 +165,16 @@ bool Jornada::setDisplayBrightness( int bright ) cmdline = QString().sprintf( "echo 0 > /sys/class/backlight/sa1100fb/power; echo %d > /sys/class/backlight/sa1100fb/brightness", bright ); res = ( ::system( (const char*) cmdline ) == 0 ); return res; } -bool Jornada::suspend( ) -{ - qDebug("ODevice::suspend"); - if ( !isQWS( ) ) // only qwsserver is allowed to suspend - return false; - - if ( d->m_model == Model_Unknown ) // better don't suspend in qvfb / on unkown devices - return false; - - bool res = false; - ODevice::sendSuspendmsg(); - - struct timeval tvs; - ::gettimeofday ( &tvs, 0 ); - - ::sync(); // flush fs caches - res = ( ::system ( "apm --suspend" ) == 0 ); - - return res; -} - bool Jornada::setDisplayStatus ( bool on ) { bool res = false; QString cmdline = QString( "echo %1 > /sys/class/lcd/sa1100fb/power; echo %2 > /sys/class/backlight/sa1100fb/power").arg( on ? "0" : "4" ).arg( on ? "0" : "4" ); res = ( ::system( (const char*) cmdline ) == 0 ); diff --git a/libopie2/opiecore/device/odevice_jornada.h b/libopie2/opiecore/device/odevice_jornada.h index b17fa8b..480efff 100644 --- a/libopie2/opiecore/device/odevice_jornada.h +++ b/libopie2/opiecore/device/odevice_jornada.h @@ -25,30 +25,29 @@ If not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef ODEVICE_JORNADA #define ODEVICE_JORNADA -#include <opie2/odevice.h> +#include "odevice_abstractmobiledevice.h" namespace Opie { namespace Core { namespace Internal { -class Jornada : public ODevice +class Jornada : public OAbstractMobileDevice { protected: virtual void init(const QString&); virtual void initButtons(); public: - virtual bool suspend ( ); virtual bool setDisplayBrightness ( int b ); virtual bool setDisplayStatus ( bool on); virtual int displayBrightnessResolution() const; }; struct j_button { uint model; Qt::Key code; diff --git a/libopie2/opiecore/device/odevice_ramses.h b/libopie2/opiecore/device/odevice_ramses.h index bbd3862..50963dc 100644 --- a/libopie2/opiecore/device/odevice_ramses.h +++ b/libopie2/opiecore/device/odevice_ramses.h @@ -25,17 +25,17 @@ If not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef ODEVICE_RAMSES #define ODEVICE_RAMSES -#include <opie2/odevice.h> +#include "odevice_abstractmobiledevice.h" /* QT */ #include <qwindowsystem_qws.h> #ifndef OD_IOC #define OD_IOC(dir,type,number,size) (( dir << 30 ) | ( type << 8 ) | ( number ) | ( size << 16 )) #define OD_IO(type,number) OD_IOC(0,type,number,0) #define OD_IOW(type,number,size) OD_IOC(1,type,number,sizeof(size)) diff --git a/libopie2/opiecore/device/odevice_simpad.cpp b/libopie2/opiecore/device/odevice_simpad.cpp index d6c2c80..550da5e 100644 --- a/libopie2/opiecore/device/odevice_simpad.cpp +++ b/libopie2/opiecore/device/odevice_simpad.cpp @@ -327,17 +327,17 @@ void SIMpad::playAlarmSound() } bool SIMpad::suspend() // Must override because SIMpad does NOT have apm { if ( !isQWS( ) ) // only qwsserver is allowed to suspend return false; - bool res = ODevice::suspend(); + bool res = OAbstractMobileDevice::suspend(); /* * restore the screen content if we really * supended the device */ if ( res ) updateAllWidgets(); diff --git a/libopie2/opiecore/device/odevice_simpad.h b/libopie2/opiecore/device/odevice_simpad.h index 41b94d1..1276603 100644 --- a/libopie2/opiecore/device/odevice_simpad.h +++ b/libopie2/opiecore/device/odevice_simpad.h @@ -25,27 +25,27 @@ If not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef ODEVICE_SIMPAD #define ODEVICE_SIMPAD -#include <opie2/odevice.h> +#include "odevice_abstractmobiledevice.h" /* QT */ #include <qwindowsystem_qws.h> namespace Opie { namespace Core { namespace Internal { -class SIMpad : public ODevice -{ +class SIMpad : public OAbstractMobileDevice +{ protected: virtual void init(const QString&); virtual void initButtons(); public: virtual bool suspend(); virtual bool setDisplayStatus( bool on ); diff --git a/libopie2/opiecore/device/odevice_yopy.h b/libopie2/opiecore/device/odevice_yopy.h index f6bf061..02a19c9 100644 --- a/libopie2/opiecore/device/odevice_yopy.h +++ b/libopie2/opiecore/device/odevice_yopy.h @@ -25,22 +25,22 @@ _;:, .> :=|. This program is free software; you can If not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef ODEVICE_YOPY #define ODEVICE_YOPY -#include <opie2/odevice.h> +#include "odevice_abstractmobiledevice.h" namespace Opie { namespace Core { namespace Internal { -class Yopy : public ODevice +class Yopy : public OAbstractMobileDevice { protected: virtual void init(const QString&); virtual void initButtons(); public: virtual bool suspend(); diff --git a/libopie2/opiecore/device/odevice_zaurus.cpp b/libopie2/opiecore/device/odevice_zaurus.cpp index 82e127e..67dfa41 100644 --- a/libopie2/opiecore/device/odevice_zaurus.cpp +++ b/libopie2/opiecore/device/odevice_zaurus.cpp @@ -127,16 +127,20 @@ struct z_button z_buttons_c700 [] = { // Only question right now is: Do we really need to do it? Because as soon // as the OpenZaurus kernel is ready, there will be a unified interface for all // Zaurus models (concerning apm, backlight, buttons, etc.) // // Comments? - mickeyl. void Zaurus::init(const QString& cpu_info) { + // Set the time to wait until the system is realy suspended + // the delta between apm --suspend and sleeping + setAPMTimeOut( 15000 ); + // generic distribution code already scanned /etc/issue at that point - // embedix releases contain "Embedix <version> | Linux for Embedded Devices" if ( d->m_sysverstr.contains( "embedix", false ) ) { d->m_vendorstr = "Sharp"; d->m_vendor = Vendor_Sharp; d->m_systemstr = "Zaurus"; d->m_system = System_Zaurus; @@ -477,48 +481,16 @@ bool Zaurus::setDisplayStatus( bool on ) buf[1] = '\0'; res = ( ::write( fd, &buf[0], 2 ) == 0 ); ::close( fd ); } } return res; } -bool Zaurus::suspend() -{ - qDebug("ODevice::suspend"); - if ( !isQWS( ) ) // only qwsserver is allowed to suspend - return false; - - if ( d->m_model == Model_Unknown ) // better don't suspend on unknown devices - return false; - - bool res = false; - ODevice::sendSuspendmsg(); - - struct timeval tvs, tvn; - ::gettimeofday ( &tvs, 0 ); - - ::sync(); // flush fs caches - res = ( ::system ( "apm --suspend" ) == 0 ); - - // This is needed because the apm implementation is asynchronous and we - // can not be sure when exactly the device is really suspended - if ( res ) { - do { // Yes, wait 15 seconds. This APM sucks big time. - ::usleep ( 200 * 1000 ); - ::gettimeofday ( &tvn, 0 ); - } while ((( tvn. tv_sec - tvs. tv_sec ) * 1000 + ( tvn. tv_usec - tvs. tv_usec ) / 1000 ) < 15000 ); - } - - QCopEnvelope ( "QPE/Rotation", "rotateDefault()" ); - return res; -} - - Transformation Zaurus::rotation() const { qDebug( "Zaurus::rotation()" ); Transformation rot; switch ( d->m_model ) { case Model_Zaurus_SLC3000: // fallthrough case Model_Zaurus_SLC7x0: diff --git a/libopie2/opiecore/device/odevice_zaurus.h b/libopie2/opiecore/device/odevice_zaurus.h index 80593ce..6e6ca46 100644 --- a/libopie2/opiecore/device/odevice_zaurus.h +++ b/libopie2/opiecore/device/odevice_zaurus.h @@ -25,17 +25,17 @@ If not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef ODEVICE_ZAURUS #define ODEVICE_ZAURUS -#include <opie2/odevice.h> +#include "odevice_abstractmobiledevice.h" #ifndef ARRAY_SIZE #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) #endif // _IO and friends are only defined in kernel headers ... #define OD_IOC(dir,type,number,size) (( dir << 30 ) | ( type << 8 ) | ( number ) | ( size << 16 )) #define OD_IO(type,number) OD_IOC(0,type,number,0) @@ -86,17 +86,17 @@ // Vesa Standard #define FB_BLANK_UNBLANK 0 #define FB_BLANK_POWERDOWN 4 namespace Opie { namespace Core { namespace Internal { -class Zaurus : public ODevice +class Zaurus : public OAbstractMobileDevice { protected: virtual void init(const QString&); virtual void initButtons(); public: virtual bool setDisplayBrightness( int b ); virtual bool setDisplayStatus( bool on ); @@ -109,17 +109,16 @@ class Zaurus : public ODevice 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 hasHingeSensor() const; virtual OHingeStatus readHingeSensor() const; - virtual bool suspend(); virtual Transformation rotation() const; virtual ODirection direction() const; protected: virtual void buzzer( int snd ); OLedState m_leds[1]; bool m_embedix; |