From 186bdeb08c0d9ccd78177310cf9f69ea80b76a96 Mon Sep 17 00:00:00 2001 From: sandman Date: Wed, 28 Aug 2002 23:11:30 +0000 Subject: Use the new iPAQ suspend code for all supported platforms (that is OZ right now ;) ) --- (limited to 'libopie') diff --git a/libopie/odevice.cpp b/libopie/odevice.cpp index bf64676..6572fb6 100644 --- a/libopie/odevice.cpp +++ b/libopie/odevice.cpp @@ -18,11 +18,21 @@ */ #include +#include +#include +#include +#include +#include +#include + +#include #include #include #include #include +#include + #include "odevice.h" @@ -49,16 +59,11 @@ protected: virtual void init ( ); public: - virtual bool suspend ( ); - virtual void alarmSound ( ); virtual uint hasLeds ( ) const; virtual OLedState led ( uint which ) const; - virtual bool setLed ( uint which, OLedState st ); - -private: - static void tstp_sighandler ( int ); + virtual bool setLed ( uint which, OLedState st ); }; class ODeviceZaurus : public ODevice { @@ -120,16 +125,54 @@ ODevice::~ODevice ( ) delete d; } +//#include + +//#define APM_IOC_SUSPEND _IO('A',2) + +#define APM_IOC_SUSPEND (( 0<<30 ) | ( 'A'<<8 ) | ( 2 ) | ( 0<<16 )) + + +void ODevice::tstp_sighandler ( int ) +{ +} + + bool ODevice::suspend ( ) { - int rc = ::system ( "apm --suspend" ); - - if (( rc == 127 ) || ( rc == -1 )) + if ( d-> m_model == OMODEL_Unknown ) // better don't suspend in qvfb / on unkown devices return false; - else - return true; + + int fd; + bool res = false; + + if ((( fd = ::open ( "/dev/apm_bios", O_RDWR )) >= 0 ) || + (( fd = ::open ( "/dev/misc/apm_bios",O_RDWR )) >= 0 )) { + struct timeval tvs, tvn; + + ::signal ( SIGTSTP, tstp_sighandler ); // we don't want to be stopped + ::gettimeofday ( &tvs, 0 ); + + res = ( ::ioctl ( fd, APM_IOC_SUSPEND ) == 0 ); // tell the kernel to "start" suspending + ::close ( fd ); + + if ( res ) { + ::kill ( -::getpid ( ), SIGTSTP ); // stop everthing in out process group + + 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 ) < 1500 ); + + ::kill ( -::getpid ( ), SIGCONT ); // continue everything in our process group + } + + ::signal ( SIGTSTP, SIG_DFL ); + } + + return res; } + QString ODevice::vendorString ( ) { return d-> m_vendorstr; @@ -265,15 +308,6 @@ void ODeviceIPAQ::init ( ) d-> m_leds [0] = OLED_Off; } -#include -#include -#include -#include -#include -#include -#include -#include - //#include // including kernel headers is evil ... typedef struct h3600_ts_led { @@ -289,51 +323,6 @@ typedef struct h3600_ts_led { #define LED_ON (( 1<<30 ) | ( 'f'<<8 ) | ( 5 ) | ( sizeof(struct h3600_ts_led)<<16 )) // _IOW only defined in kernel headers :( -//#include - -//#define APM_IOC_SUSPEND _IO('A',2) - -#define APM_IOC_SUSPEND (( 0<<30 ) | ( 'A'<<8 ) | ( 2 ) | ( 0<<16 )) - - -void ODeviceIPAQ::tstp_sighandler ( int ) -{ -} - - -bool ODeviceIPAQ::suspend ( ) -{ - int fd; - bool res = false; - - if ((( fd = ::open ( "/dev/apm_bios", O_RDWR )) >= 0 ) || - (( fd = ::open ( "/dev/misc/apm_bios",O_RDWR )) >= 0 )) { - struct timeval tvs, tvn; - - ::signal ( SIGTSTP, tstp_sighandler ); - ::gettimeofday ( &tvs, 0 ); - - res = ( ::ioctl ( fd, APM_IOC_SUSPEND ) == 0 ); - ::close ( fd ); - - if ( res ) { - ::kill ( -::getpid ( ), SIGTSTP ); - - do { - ::usleep ( 200 * 1000 ); - ::gettimeofday ( &tvn, 0 ); - } while ((( tvn. tv_sec - tvs. tv_sec ) * 1000 + ( tvn. tv_usec - tvs. tv_usec ) / 1000 ) < 1500 ); - - ::kill ( -::getpid ( ), SIGCONT ); - } - - ::signal ( SIGTSTP, SIG_DFL ); - } - - return res; -} - - void ODeviceIPAQ::alarmSound ( ) { #if defined( QT_QWS_IPAQ ) // IPAQ diff --git a/libopie/odevice.h b/libopie/odevice.h index eeae357..cda504a 100644 --- a/libopie/odevice.h +++ b/libopie/odevice.h @@ -103,6 +103,7 @@ protected: private: ODevice ( const ODevice & ); + static void tstp_sighandler ( int ); }; #endif -- cgit v0.9.0.2