author | sandman <sandman> | 2002-08-04 02:25:54 (UTC) |
---|---|---|
committer | sandman <sandman> | 2002-08-04 02:25:54 (UTC) |
commit | 8fd0780faa16abbcf7db9220af1bc333ae484ec8 (patch) (side-by-side diff) | |
tree | ffacd596daa0ab07890f185510275667649d55db /libopie | |
parent | 549df674d7af9fe1347751e6a63d6ed8249d2503 (diff) | |
download | opie-8fd0780faa16abbcf7db9220af1bc333ae484ec8.zip opie-8fd0780faa16abbcf7db9220af1bc333ae484ec8.tar.gz opie-8fd0780faa16abbcf7db9220af1bc333ae484ec8.tar.bz2 |
1) Fixes for suspend/resume (improved it for iPAQ, shouldn't have changed
anything for Z) -- It seems that this also fixes the 70% CPU load
problem (needs more testing/feedback though)
2) the launcher now creates a /var/run/opie.pid file containing its pid
3) the launcher catches SIGTERM and kills all its child processes
-rw-r--r-- | libopie/odevice.cpp | 62 | ||||
-rw-r--r-- | libopie/odevice.h | 4 |
2 files changed, 65 insertions, 1 deletions
diff --git a/libopie/odevice.cpp b/libopie/odevice.cpp index bc8014a..057c344 100644 --- a/libopie/odevice.cpp +++ b/libopie/odevice.cpp @@ -12,16 +12,18 @@ 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 <stdlib.h> + #include <qfile.h> #include <qtextstream.h> #include <qpe/sound.h> #include <qpe/resource.h> #include "odevice.h" @@ -42,21 +44,26 @@ public: OLedState m_leds [4]; // just for convenience ... }; class ODeviceIPAQ : public ODevice { 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 ); }; class ODeviceZaurus : public ODevice { protected: virtual void init ( ); public: virtual void alarmSound ( ); @@ -108,16 +115,26 @@ void ODevice::init ( ) { } ODevice::~ODevice ( ) { delete d; } +bool ODevice::suspend ( ) +{ + int rc = ::system ( "apm --suspend" ); + + if (( rc == 127 ) || ( rc == -1 )) + return false; + else + return true; +} + QString ODevice::vendorString ( ) { return d-> m_vendorstr; } OVendor ODevice::vendor ( ) { return d-> m_vendor; @@ -246,16 +263,18 @@ void ODeviceIPAQ::init ( ) } d-> m_leds [0] = OLED_Off; } #include <unistd.h> #include <fcntl.h> #include <sys/ioctl.h> +#include <signal.h> +#include <sys/time.h> #include <linux/soundcard.h> #include <qapplication.h> #include <qpe/config.h> //#include <linux/h3600_ts.h> // including kernel headers is evil ... typedef struct h3600_ts_led { unsigned char OffOnBlink; /* 0=off 1=on 2=Blink */ @@ -265,16 +284,59 @@ typedef struct h3600_ts_led { } LED_IN; // #define IOC_H3600_TS_MAGIC 'f' // #define LED_ON _IOW(IOC_H3600_TS_MAGIC, 5, 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 <linux/apm_bios.h> + +//#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 ) { + 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 #ifndef QT_NO_SOUND static Sound snd ( "alarm" ); int fd; int vol; bool vol_reset = false; diff --git a/libopie/odevice.h b/libopie/odevice.h index b54e576..eeae357 100644 --- a/libopie/odevice.h +++ b/libopie/odevice.h @@ -60,17 +60,19 @@ enum OLedState { class ODevice { public: public: static ODevice *inst ( ); - + +// system + virtual bool suspend ( ); // information QString modelString ( ); OModel model ( ); QString vendorString ( ); OVendor vendor ( ); |