src/screensaverbase.cpp
changeset 0 040fcad49f44
child 17 d8eca2b0590d
equal deleted inserted replaced
-1:000000000000 0:040fcad49f44
       
     1 /*
       
     2 * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description:   The control base class of display object.
       
    15 *
       
    16 */
       
    17 
       
    18 
       
    19 
       
    20 #include <coecntrl.h>
       
    21 #include <power_save_display_mode.h>
       
    22 
       
    23 #include "screensaverbase.h"
       
    24 #include "screensaverview.h"
       
    25 #include "screensaverappui.h"
       
    26 #include "ScreensaverUtils.h"
       
    27 #include "screensavershareddatai.h"
       
    28 #include "screensaverutility.h"
       
    29 
       
    30 const TInt KRefreshRate = 60000000; // 60 sec
       
    31 
       
    32 
       
    33 // Time delayed before a wserv heartbeat stop request is issued.
       
    34 // Delay is needed, because draw commands may still be handled, if
       
    35 // stop request is issued right after screen refresh.
       
    36 #ifdef RD_UI_TRANSITION_EFFECTS_PHASE2
       
    37 const TInt KCaptureDelay  = 2000000; // 2.0 sec, used to delay the capturing operation
       
    38 #else
       
    39 const TInt KCaptureDelay  = 100000; // 0.1 sec
       
    40 #endif
       
    41 
       
    42 // -----------------------------------------------------------------------------
       
    43 // CScreensaverBase::CScreensaverBase
       
    44 // -----------------------------------------------------------------------------
       
    45 //
       
    46 CScreensaverBase::CScreensaverBase()
       
    47     {
       
    48     
       
    49     }
       
    50 
       
    51 // -----------------------------------------------------------------------------
       
    52 // CScreensaverBase::~CScreensaverBase
       
    53 // -----------------------------------------------------------------------------
       
    54 //
       
    55 CScreensaverBase::~CScreensaverBase()
       
    56     {
       
    57     DeleteTimer( iCaptureScreenTimer );
       
    58 
       
    59     delete iPowerSaveDisplayMode;
       
    60 
       
    61     delete iOffScrnBmp;
       
    62     }
       
    63 
       
    64 // -----------------------------------------------------------------------------
       
    65 // CScreensaverBase::StartDrawObject
       
    66 // -----------------------------------------------------------------------------
       
    67 //
       
    68 void CScreensaverBase::StartDrawObject()
       
    69     {
       
    70     SCRLOGGER_WRITEF( _L("SCR:CScreensaverBase::StartDrawObject start") );
       
    71     StartTimer();
       
    72     
       
    73     DrawObject();
       
    74     }
       
    75 
       
    76 // -----------------------------------------------------------------------------
       
    77 // CScreensaverBase::StopDrawObject
       
    78 // -----------------------------------------------------------------------------
       
    79 //
       
    80 void CScreensaverBase::StopDrawObject()
       
    81     {
       
    82     SCRLOGGER_WRITEF( _L("SCR:CScreensaverBase::StopDrawObject start") );
       
    83     if ( LcdPartialMode() && LcdPartialMode()->Status() )
       
    84         {
       
    85         SCRLOGGER_WRITE("Model: StopScreenSaver(), exit power save");
       
    86         LcdPartialMode()->Exit();
       
    87         }
       
    88     
       
    89     CancelTimer();
       
    90     
       
    91     ClearScreen();
       
    92     }
       
    93 
       
    94 // -----------------------------------------------------------------------------
       
    95 // CScreensaverBase::DrawObject
       
    96 // -----------------------------------------------------------------------------
       
    97 //
       
    98 void CScreensaverBase::DrawObject()
       
    99     {    
       
   100     SCRLOGGER_WRITEF( _L("SCR:CScreensaverBase::DrawObject start") );
       
   101     SetRect( Rect() );
       
   102     
       
   103     DrawNow();
       
   104     }
       
   105 
       
   106 // -----------------------------------------------------------------------------
       
   107 // CScreensaverBase::View
       
   108 // -----------------------------------------------------------------------------
       
   109 //
       
   110 CScreensaverView* CScreensaverBase::View() const
       
   111     {
       
   112     return STATIC_CAST( CScreensaverAppUi*, CCoeEnv::Static()->AppUi() )->ScreensaverView();
       
   113     }
       
   114 
       
   115 // -----------------------------------------------------------------------------
       
   116 // CScreensaverBase::Model
       
   117 // -----------------------------------------------------------------------------
       
   118 //
       
   119 const CScreensaverEngine& CScreensaverBase::Model() const
       
   120     { 
       
   121     return STATIC_CAST( CScreensaverAppUi*, CCoeEnv::Static()->AppUi() )->Model(); 
       
   122     }
       
   123 
       
   124 // -----------------------------------------------------------------------------
       
   125 // CScreensaverBase::Array
       
   126 // -----------------------------------------------------------------------------
       
   127 //
       
   128 CScreensaverIndicatorArray& CScreensaverBase::Array() const 
       
   129     { 
       
   130     return Model().IndicatorArray(); 
       
   131     }
       
   132 
       
   133 // -----------------------------------------------------------------------------
       
   134 // CScreensaverBase::SetPowerSaveDisplayActiveArea
       
   135 // -----------------------------------------------------------------------------
       
   136 //
       
   137 TInt CScreensaverBase::SetPowerSaveDisplayActiveArea( TRect& aRect )
       
   138     {
       
   139     // Save the requested area
       
   140     iPowerSaveDisplayActiveArea = aRect;
       
   141     return KErrNone;
       
   142     }
       
   143 
       
   144 // -----------------------------------------------------------------------------
       
   145 // CScreensaverBase::ActivatePowerSaveDisplay
       
   146 // -----------------------------------------------------------------------------
       
   147 //
       
   148 TInt CScreensaverBase::ActivatePowerSaveDisplay( TBool aFullColors ) const
       
   149     {
       
   150     SCRLOGGER_WRITEF( _L("SCR:CScreensaverBase::ActivatePowerSaveDisplay start") );
       
   151     TInt err = KErrNone;
       
   152 
       
   153     if ( ( Model().ScreenSaverIsOn()
       
   154         && ( !iPowerSaveDisplayActiveArea.IsEmpty() ) ) )
       
   155         {
       
   156         TInt startLine = 0;
       
   157         TInt endLine = 0;
       
   158 
       
   159         // Normal mode - using saver bar height
       
   160         startLine = iPowerSaveDisplayActiveArea.iTl.iY;
       
   161         endLine = iPowerSaveDisplayActiveArea.iBr.iY;
       
   162 
       
   163         SCRLOGGER_WRITEF( _L("SCR: Powersave supports %d lines"),
       
   164             LcdPartialMode()->MaxLines() );
       
   165 
       
   166         // Check whether power save mode should be used
       
   167         // When local variation added, PS will override if local says
       
   168         // yes, but PS says no
       
   169         if ( Model().SharedDataInterface()->IsUsePowerSaveMode() )
       
   170             {
       
   171             SCRLOGGER_WRITEF( _L("SCR: Requesting powersave, lines: %d, %d"),
       
   172                 startLine, endLine );
       
   173             TUint16* addr = ( TUint16* )iOffScrnBmp->DataAddress();
       
   174             err = LcdPartialMode()->Set( startLine, endLine, addr, aFullColors );
       
   175             }
       
   176         else
       
   177             {
       
   178             SCRLOGGER_WRITE("Power save mode not in use, not requested");
       
   179             err = KErrCancel;
       
   180             }
       
   181         }
       
   182     else
       
   183         {
       
   184         // Screensaver not on - cannot set power save mode on
       
   185         err = KErrNotReady;
       
   186         }
       
   187 
       
   188     return err;
       
   189     }
       
   190 
       
   191 // -----------------------------------------------------------------------------
       
   192 // CScreensaverBase::DrawPictographArea
       
   193 // -----------------------------------------------------------------------------
       
   194 //
       
   195 void CScreensaverBase::DrawPictographArea()
       
   196     {
       
   197     // Currently animation is not supported - do nothing
       
   198     }
       
   199 
       
   200 // ----------------------------------------------------------------------------
       
   201 // CScreensaverBase::StartCaptureScreenTimer
       
   202 // -----------------------------------------------------------------------------
       
   203 //
       
   204 void CScreensaverBase::StartCaptureScreenTimer()
       
   205     {
       
   206     SCRLOGGER_WRITEF( _L("SCR:CScreensaverBase::StartCaptureScreenTimer start") );
       
   207     DeleteTimer( iCaptureScreenTimer );
       
   208     
       
   209     TRAP_IGNORE( iCaptureScreenTimer = CPeriodic::NewL( CActive::EPriorityStandard ) );
       
   210     
       
   211     iCaptureScreenTimer->Start( KCaptureDelay , KCaptureDelay ,
       
   212         TCallBack( HandleCaptureTimerExpiry, this ) );
       
   213     }
       
   214 
       
   215 // -----------------------------------------------------------------------------
       
   216 // CScreensaverBase::InitialRefreshRate
       
   217 // -----------------------------------------------------------------------------
       
   218 //
       
   219 TInt CScreensaverBase::InitialRefreshRate()
       
   220     {
       
   221     SCRLOGGER_WRITEF( _L("SCR:CScreensaverBase::InitialRefreshRate start") );
       
   222     TTime homeTime, timeTmp;
       
   223     TTimeIntervalSeconds interval;
       
   224     TInt initialRefresh = KRefreshRate;
       
   225     homeTime.HomeTime();
       
   226     timeTmp = homeTime;
       
   227     timeTmp.RoundUpToNextMinute();
       
   228     if ( timeTmp.SecondsFrom( homeTime, interval ) == KErrNone )
       
   229         {
       
   230         initialRefresh = interval.Int() * 1000000;
       
   231         }
       
   232     
       
   233     return initialRefresh;
       
   234     }
       
   235 
       
   236 // -----------------------------------------------------------------------------
       
   237 // CScreensaverBase::DeleteTimer
       
   238 // -----------------------------------------------------------------------------
       
   239 //
       
   240 void CScreensaverBase::DeleteTimer( CPeriodic*& aTimer )
       
   241     {
       
   242     if ( aTimer )
       
   243         {
       
   244         aTimer->Cancel();
       
   245         delete aTimer;
       
   246         aTimer = NULL;
       
   247         }
       
   248     }
       
   249 
       
   250 // -----------------------------------------------------------------------------
       
   251 // CScreensaverBase::ConstructAndConnectLCDL
       
   252 // -----------------------------------------------------------------------------
       
   253 //
       
   254 void CScreensaverBase::ConstructAndConnectLCDL()
       
   255     {
       
   256     SCRLOGGER_WRITEF( _L("SCR:CScreensaverBase::ConstructAndConnectLCD start") );
       
   257     // User side handle object is created
       
   258     TRAPD( err, iPowerSaveDisplayMode = CPowerSaveDisplayMode::NewL() );
       
   259     if ( ( err != KErrNone ) || ( !iPowerSaveDisplayMode ) )
       
   260         {
       
   261         SCRLOGGER_WRITEF( _L("SCR: Model: No power save mode (err = %d)"), err );
       
   262         }
       
   263 
       
   264     iOffScrnBmp = new ( ELeave ) CFbsBitmap;
       
   265     User::LeaveIfError( iOffScrnBmp->Create( Size(), EColor64K ) );
       
   266     }
       
   267 
       
   268 // -----------------------------------------------------------------------------
       
   269 // CScreensaverBase::LcdPartialMode
       
   270 // -----------------------------------------------------------------------------
       
   271 //
       
   272 CPowerSaveDisplayMode* CScreensaverBase::LcdPartialMode() const
       
   273     {
       
   274     return iPowerSaveDisplayMode;
       
   275     }
       
   276 
       
   277 // -----------------------------------------------------------------------------
       
   278 // CScreensaverBase::HandleRefreshTimerExpiry
       
   279 // -----------------------------------------------------------------------------
       
   280 //
       
   281 TInt CScreensaverBase::HandleRefreshTimerExpiry( TAny* aPtr )
       
   282     {
       
   283     SCRLOGGER_WRITEF( _L("SCR:CScreensaverBase::HandleRefreshTimerExpiry start") );
       
   284     CScreensaverBase* control = STATIC_CAST(CScreensaverBase*, aPtr);
       
   285     
       
   286     SCRLOGGER_WRITEF( _L("SCR: Inside CScreensaverView::HandleRefreshTimerExpiry()") );
       
   287     
       
   288     control->DrawObject();
       
   289     control->StartCaptureScreenTimer();
       
   290     
       
   291     return KErrNone;
       
   292     }
       
   293 
       
   294 // -----------------------------------------------------------------------------
       
   295 // CScreensaverBase::HandleCaptureTimerExpiry
       
   296 // Handles capture screen timer timeout
       
   297 // -----------------------------------------------------------------------------
       
   298 //
       
   299 TInt CScreensaverBase::HandleCaptureTimerExpiry( TAny* aPtr )
       
   300     {
       
   301     SCRLOGGER_WRITEF( _L("SCR:CScreensaverBase::HandleCaptureTimerExpiry start") );
       
   302     CScreensaverBase *control= STATIC_CAST( CScreensaverBase*, aPtr );
       
   303     
       
   304     SCRLOGGER_WRITEF( _L("SCR: Inside CScreensaverView::HandleWsHbStopTimerTimeout()") );
       
   305     
       
   306     if ( control )
       
   307         {
       
   308         TInt err = control->CaptureScreen();
       
   309         control->DeleteTimer( control->iCaptureScreenTimer );
       
   310         ScreensaverUtility::StopWServHeartBeat();
       
   311         
       
   312 #ifdef RD_UI_TRANSITION_EFFECTS_PHASE2
       
   313 
       
   314         if ( KErrNone == err )
       
   315             {
       
   316             control->ActivatePowerSaveDisplay();
       
   317             }
       
   318 
       
   319 #endif
       
   320         }
       
   321     
       
   322     return KErrNone;
       
   323     }
       
   324 
       
   325 // -----------------------------------------------------------------------------
       
   326 // CScreensaverBase::CaptureScreen
       
   327 // -----------------------------------------------------------------------------
       
   328 //
       
   329 TInt CScreensaverBase::CaptureScreen()
       
   330     {
       
   331     CWsScreenDevice* device = iCoeEnv->ScreenDevice();
       
   332     TInt err = device->CopyScreenToBitmap( iOffScrnBmp, iPowerSaveDisplayActiveArea );
       
   333     return err;
       
   334     }
       
   335 
       
   336 //End of file