00001
00002 #include "screensaver.h"
00003
00004 #include <qpe/config.h>
00005 #include <qpe/network.h>
00006
00007 #include <opie2/odevice.h>
00008 #include <opie2/odebug.h>
00009
00010
00011 using namespace Opie::Core;
00012
00013
00014
00015 OpieScreenSaver::OpieScreenSaver ( )
00016 : QObject ( 0, "screensaver" ), QWSScreenSaver ( )
00017 {
00018 m_disable_suspend = 100;
00019 m_enable_dim = false;
00020 m_enable_lightoff = false;
00021 m_enable_suspend = false;
00022 m_onlylcdoff = false;
00023
00024 m_enable_dim_ac = false;
00025 m_enable_lightoff_ac = false;
00026 m_enable_suspend_ac = false;
00027 m_onlylcdoff_ac = false;
00028
00029 m_use_light_sensor = false;
00030 m_backlight_sensor = -1;
00031 ::memset ( m_sensordata, 0xff, LS_Count * sizeof( m_sensordata [0] ));
00032
00033 m_lcd_status = true;
00034
00035 m_backlight_normal = -1;
00036 m_backlight_current = -1;
00037 m_backlight_forcedoff = false;
00038
00039 m_on_ac = false;
00040
00041 m_level = -1;
00042
00043
00044 ODevice::inst ( )-> setDisplayStatus ( true );
00045 setBacklight ( -1 );
00046 }
00047
00048
00052 void OpieScreenSaver::restore()
00053 {
00054 m_level = -1;
00055
00056 if ( !m_lcd_status ) {
00057 ODevice::inst ( ) -> setDisplayStatus ( true );
00058 m_lcd_status = true;
00059 }
00060
00061 setBacklightInternal ( -1 );
00062 }
00063
00064
00072 bool OpieScreenSaver::save( int level )
00073 {
00074 m_level = level;
00075
00076 switch ( level ) {
00077 case 0:
00078 if (( m_on_ac && m_enable_dim_ac ) ||
00079 ( !m_on_ac && m_enable_dim )) {
00080 if (( m_disable_suspend > 0 ) && ( m_backlight_current > 1 ) && !m_use_light_sensor )
00081 setBacklightInternal ( 1 );
00082 }
00083 return true;
00084 break;
00085
00086 case 1:
00087 if (( m_on_ac && m_enable_lightoff_ac ) ||
00088 ( !m_on_ac && m_enable_lightoff )) {
00089 if ( m_disable_suspend > 1 )
00090 setBacklightInternal ( 0 );
00091 }
00092 return true;
00093 break;
00094
00095 case 2:
00096 if (( m_on_ac && !m_enable_suspend_ac ) ||
00097 ( !m_on_ac && !m_enable_suspend )) {
00098 return true;
00099 }
00100
00101 if (( m_on_ac && m_onlylcdoff_ac ) ||
00102 ( !m_on_ac && m_onlylcdoff )) {
00103 ODevice::inst ( ) -> setDisplayStatus ( false );
00104 m_lcd_status = false;
00105 return true;
00106 }
00107
00108
00109
00110 if (( m_disable_suspend > 2 ) && !Network::networkOnline ( )) {
00111
00112
00113 QWSServer::sendKeyEvent( 0xffff, Qt::Key_F34, FALSE, TRUE, FALSE );
00114 return true;
00115 }
00116
00117 break;
00118 }
00119 return false;
00120 }
00121
00122
00136 void OpieScreenSaver::setIntervals ( int dim, int lightoff, int suspend )
00137 {
00138 Config config ( "apm" );
00139 config. setGroup ( m_on_ac ? "AC" : "Battery" );
00140
00141 int v[ 4 ];
00142 if ( dim < 0 )
00143 dim = config. readNumEntry ( "Dim", m_on_ac ? 60 : 30 );
00144 if ( lightoff < 0 )
00145 lightoff = config. readNumEntry ( "LightOff", m_on_ac ? 120 : 20 );
00146 if ( suspend < 0 )
00147 suspend = config. readNumEntry ( "Suspend", m_on_ac ? 0 : 60 );
00148
00149 if ( m_on_ac ) {
00150 m_enable_dim_ac = ( dim > 0 );
00151 m_enable_lightoff_ac = ( lightoff > 0 );
00152 m_enable_suspend_ac = ( suspend > 0 );
00153 m_onlylcdoff_ac = config.readBoolEntry ( "LcdOffOnly", false );
00154 }
00155 else {
00156 m_enable_dim = ( dim > 0 );
00157 m_enable_lightoff = ( lightoff > 0 );
00158 m_enable_suspend = ( suspend > 0 );
00159 m_onlylcdoff = config.readBoolEntry ( "LcdOffOnly", false );
00160 }
00161
00162
00163
00164 v [ 0 ] = QMAX( 1000 * dim, 100 );
00165 v [ 1 ] = QMAX( 1000 * lightoff, 100 );
00166 v [ 2 ] = QMAX( 1000 * suspend, 100 );
00167 v [ 3 ] = 0;
00168
00169 if ( !dim && !lightoff && !suspend )
00170 QWSServer::setScreenSaverInterval( 0 );
00171 else
00172 QWSServer::setScreenSaverIntervals( v );
00173 }
00174
00175
00182 void OpieScreenSaver::setInterval ( int interval )
00183 {
00184 setIntervals ( -1, -1, interval );
00185 }
00186
00187
00188 void OpieScreenSaver::setMode ( int mode )
00189 {
00190 if ( mode > m_disable_suspend )
00191 setInterval ( -1 );
00192 m_disable_suspend = mode;
00193 }
00194
00195
00205 void OpieScreenSaver::setBacklight ( int bright )
00206 {
00207
00208 Config config ( "apm" );
00209 config. setGroup ( m_on_ac ? "AC" : "Battery" );
00210 m_backlight_normal = config. readNumEntry ( "Brightness", m_on_ac ? 255 : 127 );
00211 int contrast = config. readNumEntry ( "Contrast", 127);
00212 m_use_light_sensor = config. readBoolEntry ( "LightSensor", false );
00213
00214
00215
00216
00217 killTimers ( );
00218 if (( bright < 0 ) && m_use_light_sensor ) {
00219 QStringList sl = config. readListEntry ( "LightSensorData", ';' );
00220
00221 m_sensordata [LS_SensorMin] = 40;
00222 m_sensordata [LS_SensorMax] = 215;
00223 m_sensordata [LS_LightMin] = 1;
00224 m_sensordata [LS_LightMax] = 255;
00225 m_sensordata [LS_Steps] = 12;
00226 m_sensordata [LS_Interval] = 2000;
00227
00228 for ( uint i = 0; i < LS_Count; i++ ) {
00229 if ( i < sl. count ( ))
00230 m_sensordata [i] = sl [i]. toInt ( );
00231 }
00232 if ( m_sensordata [LS_Steps] < 2 )
00233 m_sensordata [LS_Steps] = 2;
00234
00235 timerEvent ( 0 );
00236 startTimer ( m_sensordata [LS_Interval] );
00237 }
00238
00239 setBacklightInternal ( bright );
00240 ODevice::inst ( )-> setDisplayContrast(contrast);
00241 }
00242
00243
00253 void OpieScreenSaver::setBacklightInternal ( int bright )
00254 {
00255 if ( bright == -3 ) {
00256
00257 m_backlight_forcedoff = false;
00258 bright = -1;
00259 }
00260 if ( m_backlight_forcedoff && bright != -2 )
00261 return ;
00262 if ( bright == -2 ) {
00263
00264 bright = m_backlight_current ? 0 : -1;
00265 m_backlight_forcedoff = !bright;
00266 }
00267 if ( bright == -1 )
00268 bright = m_use_light_sensor ? m_backlight_sensor : m_backlight_normal;
00269
00270 if ( bright != m_backlight_current ) {
00271 ODevice::inst ( )-> setDisplayBrightness ( bright );
00272 m_backlight_current = bright;
00273 }
00274 }
00275
00276
00281 void OpieScreenSaver::timerEvent ( QTimerEvent * )
00282 {
00283 int s = ODevice::inst ( )-> readLightSensor ( ) * 256 / ODevice::inst ( )-> lightSensorResolution ( );
00284
00285 if ( s < m_sensordata [LS_SensorMin] )
00286 m_backlight_sensor = m_sensordata [LS_LightMax];
00287 else if ( s >= m_sensordata [LS_SensorMax] )
00288 m_backlight_sensor = m_sensordata [LS_LightMin];
00289 else {
00290 int dx = m_sensordata [LS_SensorMax] - m_sensordata [LS_SensorMin];
00291 int dy = m_sensordata [LS_LightMax] - m_sensordata [LS_LightMin];
00292
00293 int stepno = ( s - m_sensordata [LS_SensorMin] ) * m_sensordata [LS_Steps] / dx;
00294
00295 m_backlight_sensor = m_sensordata [LS_LightMax] - dy * stepno / ( m_sensordata [LS_Steps] - 1 );
00296 }
00297
00298 odebug << "f(" << s << ") = " << m_backlight_sensor << " [" << m_sensordata [LS_SensorMin]
00299 << " - " << m_sensordata [LS_SensorMax] << " ] -> [" << m_sensordata [LS_LightMin]
00300 << " - " << m_sensordata [LS_LightMax] << "] / " << m_sensordata [LS_Steps] << oendl;
00301
00302 if ( m_level <= 0 )
00303 setBacklightInternal ( -1 );
00304 }
00305
00306
00310 void OpieScreenSaver::setDisplayState ( bool on )
00311 {
00312 if ( m_lcd_status != on ) {
00313 ODevice::inst ( ) -> setDisplayStatus ( on );
00314 m_lcd_status = on;
00315 }
00316 }
00317
00318
00322 void OpieScreenSaver::powerStatusChanged ( PowerStatus ps )
00323 {
00324 bool newonac = ( ps. acStatus ( ) == PowerStatus::Online );
00325
00326 if ( newonac != m_on_ac ) {
00327 m_on_ac = newonac;
00328 setInterval ( -1 );
00329 setBacklight ( -1 );
00330 restore ( );
00331 }
00332 }