summaryrefslogtreecommitdiff
path: root/libopie2/opiecore/device/odevice_abstractmobiledevice.cpp
blob: b446d05edf8e2bb8724e3c14b8232e0b494c60fc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
/*
                             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 <mickey@Vanille.de>
            .=l.             Copyright (C) 2002, 2003 Robert Griebl <sandman@handhelds.org>
           .>+-=
 _;:,     .>    :=|.         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; version 2 of the License.
     ._= =}       :
    .%`+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 <qpe/qcopenvelope_qws.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;

    {
        QCopEnvelope( "QPE/System", "aboutToSuspend()" );
    }
    qApp->processEvents(); // ensure the qcop call is being processed asap

    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 );
    }

    {
        QCopEnvelope( "QPE/System", "returnFromSuspend()" );
    }
    qApp->processEvents(); // ensure the qcop call is being processed asap

    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;
}
}
}