src/screensaverbase.cpp
branchRCL_3
changeset 26 e8d784ac1a4b
child 29 65be1d84df1f
equal deleted inserted replaced
25:aaeeca1f15af 26:e8d784ac1a4b
       
     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     StartCaptureScreenTimer();
       
   106     }
       
   107 
       
   108 // -----------------------------------------------------------------------------
       
   109 // CScreensaverBase::View
       
   110 // -----------------------------------------------------------------------------
       
   111 //
       
   112 CScreensaverView* CScreensaverBase::View() const
       
   113     {
       
   114     return STATIC_CAST( CScreensaverAppUi*, CCoeEnv::Static()->AppUi() )->ScreensaverView();
       
   115     }
       
   116 
       
   117 // -----------------------------------------------------------------------------
       
   118 // CScreensaverBase::Model
       
   119 // -----------------------------------------------------------------------------
       
   120 //
       
   121 const CScreensaverEngine& CScreensaverBase::Model() const
       
   122     { 
       
   123     return STATIC_CAST( CScreensaverAppUi*, CCoeEnv::Static()->AppUi() )->Model(); 
       
   124     }
       
   125 
       
   126 // -----------------------------------------------------------------------------
       
   127 // CScreensaverBase::Array
       
   128 // -----------------------------------------------------------------------------
       
   129 //
       
   130 CScreensaverIndicatorArray& CScreensaverBase::Array() const 
       
   131     { 
       
   132     return Model().IndicatorArray(); 
       
   133     }
       
   134 
       
   135 // -----------------------------------------------------------------------------
       
   136 // CScreensaverBase::SetPowerSaveDisplayActiveArea
       
   137 // -----------------------------------------------------------------------------
       
   138 //
       
   139 TInt CScreensaverBase::SetPowerSaveDisplayActiveArea( TRect& aRect )
       
   140     {
       
   141     // Save the requested area
       
   142     iPowerSaveDisplayActiveArea = aRect;
       
   143     return KErrNone;
       
   144     }
       
   145 
       
   146 // -----------------------------------------------------------------------------
       
   147 // CScreensaverBase::ActivatePowerSaveDisplay
       
   148 // -----------------------------------------------------------------------------
       
   149 //
       
   150 TInt CScreensaverBase::ActivatePowerSaveDisplay( TBool aFullColors ) const
       
   151     {
       
   152     SCRLOGGER_WRITEF( _L("SCR:CScreensaverBase::ActivatePowerSaveDisplay start") );
       
   153     TInt err = KErrNone;
       
   154 
       
   155     if ( ( Model().ScreenSaverIsOn()
       
   156         && ( !iPowerSaveDisplayActiveArea.IsEmpty() ) ) )
       
   157         {
       
   158         TInt startLine = 0;
       
   159         TInt endLine = 0;
       
   160 
       
   161         // Normal mode - using saver bar height
       
   162         startLine = iPowerSaveDisplayActiveArea.iTl.iY;
       
   163         endLine = iPowerSaveDisplayActiveArea.iBr.iY;
       
   164 
       
   165         SCRLOGGER_WRITEF( _L("SCR: Powersave supports %d lines"),
       
   166             LcdPartialMode()->MaxLines() );
       
   167 
       
   168         // Check whether power save mode should be used
       
   169         // When local variation added, PS will override if local says
       
   170         // yes, but PS says no
       
   171         if ( Model().SharedDataInterface()->IsUsePowerSaveMode() )
       
   172             {
       
   173             SCRLOGGER_WRITEF( _L("SCR: Requesting powersave, lines: %d, %d"),
       
   174                 startLine, endLine );
       
   175             TUint16* addr = ( TUint16* )iOffScrnBmp->DataAddress();
       
   176             err = LcdPartialMode()->Set( startLine, endLine, addr, aFullColors );
       
   177 
       
   178             Model().SharedDataInterface()->SetSSForcedLightsOn( 0 );
       
   179             }
       
   180         else
       
   181             {
       
   182             SCRLOGGER_WRITE("Power save mode not in use, not requested");
       
   183             err = KErrCancel;
       
   184             }
       
   185         }
       
   186     else
       
   187         {
       
   188         // Screensaver not on - cannot set power save mode on
       
   189         err = KErrNotReady;
       
   190         }
       
   191 
       
   192     return err;
       
   193     }
       
   194 
       
   195 // -----------------------------------------------------------------------------
       
   196 // CScreensaverBase::DrawPictographArea
       
   197 // -----------------------------------------------------------------------------
       
   198 //
       
   199 void CScreensaverBase::DrawPictographArea()
       
   200     {
       
   201     // Currently animation is not supported - do nothing
       
   202     }
       
   203 
       
   204 // ----------------------------------------------------------------------------
       
   205 // CScreensaverBase::StartCaptureScreenTimer
       
   206 // -----------------------------------------------------------------------------
       
   207 //
       
   208 void CScreensaverBase::StartCaptureScreenTimer()
       
   209     {
       
   210     SCRLOGGER_WRITEF( _L("SCR:CScreensaverBase::StartCaptureScreenTimer start") );
       
   211     DeleteTimer( iCaptureScreenTimer );
       
   212     
       
   213     TRAP_IGNORE( iCaptureScreenTimer = CPeriodic::NewL( CActive::EPriorityStandard ) );
       
   214     
       
   215     iCaptureScreenTimer->Start( KCaptureDelay , KCaptureDelay ,
       
   216         TCallBack( HandleCaptureTimerExpiry, this ) );
       
   217     }
       
   218 
       
   219 // -----------------------------------------------------------------------------
       
   220 // CScreensaverBase::InitialRefreshRate
       
   221 // -----------------------------------------------------------------------------
       
   222 //
       
   223 TInt CScreensaverBase::InitialRefreshRate()
       
   224     {
       
   225     SCRLOGGER_WRITEF( _L("SCR:CScreensaverBase::InitialRefreshRate start") );
       
   226     TTime homeTime, timeTmp;
       
   227     TTimeIntervalSeconds interval;
       
   228     TInt initialRefresh = KRefreshRate;
       
   229     homeTime.HomeTime();
       
   230     timeTmp = homeTime;
       
   231     timeTmp.RoundUpToNextMinute();
       
   232     if ( timeTmp.SecondsFrom( homeTime, interval ) == KErrNone )
       
   233         {
       
   234         initialRefresh = interval.Int() * 1000000;
       
   235         }
       
   236     
       
   237     return initialRefresh;
       
   238     }
       
   239 
       
   240 // -----------------------------------------------------------------------------
       
   241 // CScreensaverBase::DeleteTimer
       
   242 // -----------------------------------------------------------------------------
       
   243 //
       
   244 void CScreensaverBase::DeleteTimer( CPeriodic*& aTimer )
       
   245     {
       
   246     if ( aTimer )
       
   247         {
       
   248         aTimer->Cancel();
       
   249         delete aTimer;
       
   250         aTimer = NULL;
       
   251         }
       
   252     }
       
   253 
       
   254 // -----------------------------------------------------------------------------
       
   255 // CScreensaverBase::ConstructAndConnectLCDL
       
   256 // -----------------------------------------------------------------------------
       
   257 //
       
   258 void CScreensaverBase::ConstructAndConnectLCDL()
       
   259     {
       
   260     SCRLOGGER_WRITEF( _L("SCR:CScreensaverBase::ConstructAndConnectLCD start") );
       
   261     // User side handle object is created
       
   262     TRAPD( err, iPowerSaveDisplayMode = CPowerSaveDisplayMode::NewL() );
       
   263     if ( ( err != KErrNone ) || ( !iPowerSaveDisplayMode ) )
       
   264         {
       
   265         SCRLOGGER_WRITEF( _L("SCR: Model: No power save mode (err = %d)"), err );
       
   266         }
       
   267 
       
   268     iOffScrnBmp = new ( ELeave ) CFbsBitmap;
       
   269     User::LeaveIfError( iOffScrnBmp->Create( Size(), EColor64K ) );
       
   270     }
       
   271 
       
   272 // -----------------------------------------------------------------------------
       
   273 // CScreensaverBase::LcdPartialMode
       
   274 // -----------------------------------------------------------------------------
       
   275 //
       
   276 CPowerSaveDisplayMode* CScreensaverBase::LcdPartialMode() const
       
   277     {
       
   278     return iPowerSaveDisplayMode;
       
   279     }
       
   280 
       
   281 // -----------------------------------------------------------------------------
       
   282 // CScreensaverBase::HandleRefreshTimerExpiry
       
   283 // -----------------------------------------------------------------------------
       
   284 //
       
   285 TInt CScreensaverBase::HandleRefreshTimerExpiry( TAny* aPtr )
       
   286     {
       
   287     SCRLOGGER_WRITEF( _L("SCR:CScreensaverBase::HandleRefreshTimerExpiry start") );
       
   288     CScreensaverBase* control = STATIC_CAST(CScreensaverBase*, aPtr);
       
   289     
       
   290     SCRLOGGER_WRITEF( _L("SCR: Inside CScreensaverView::HandleRefreshTimerExpiry()") );
       
   291     
       
   292     control->DrawObject();
       
   293     
       
   294     return KErrNone;
       
   295     }
       
   296 
       
   297 // -----------------------------------------------------------------------------
       
   298 // CScreensaverBase::HandleCaptureTimerExpiry
       
   299 // Handles capture screen timer timeout
       
   300 // -----------------------------------------------------------------------------
       
   301 //
       
   302 TInt CScreensaverBase::HandleCaptureTimerExpiry( TAny* aPtr )
       
   303     {
       
   304     SCRLOGGER_WRITEF( _L("SCR:CScreensaverBase::HandleCaptureTimerExpiry start") );
       
   305     CScreensaverBase *control= STATIC_CAST( CScreensaverBase*, aPtr );
       
   306     
       
   307     SCRLOGGER_WRITEF( _L("SCR: Inside CScreensaverView::HandleWsHbStopTimerTimeout()") );
       
   308     
       
   309     if ( control )
       
   310         {
       
   311         TInt err = control->CaptureScreen();
       
   312         control->DeleteTimer( control->iCaptureScreenTimer );
       
   313         ScreensaverUtility::StopWServHeartBeat();
       
   314         
       
   315 #ifdef RD_UI_TRANSITION_EFFECTS_PHASE2
       
   316 
       
   317         if ( KErrNone == err )
       
   318             {
       
   319             control->ActivatePowerSaveDisplay();
       
   320             }
       
   321 
       
   322 #endif
       
   323         }
       
   324     
       
   325     return KErrNone;
       
   326     }
       
   327 
       
   328 // -----------------------------------------------------------------------------
       
   329 // CScreensaverBase::CaptureScreen
       
   330 // -----------------------------------------------------------------------------
       
   331 //
       
   332 TInt CScreensaverBase::CaptureScreen()
       
   333     {
       
   334     CWsScreenDevice* device = iCoeEnv->ScreenDevice();
       
   335     TInt err = device->CopyScreenToBitmap( iOffScrnBmp, iPowerSaveDisplayActiveArea );
       
   336     return err;
       
   337     }
       
   338 
       
   339 //End of file