camerauis/cameraapp/generic/src/CamSelfTimer.cpp
changeset 19 d9aefe59d544
parent 3 8b2d6d0384b0
child 21 fa6d9f75d6a6
child 28 3075d9b614e6
--- a/camerauis/cameraapp/generic/src/CamSelfTimer.cpp	Tue Feb 02 00:01:39 2010 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,535 +0,0 @@
-/*
-* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies). 
-* All rights reserved.
-* This component and the accompanying materials are made available
-* under the terms of "Eclipse Public License v1.0"
-* which accompanies this distribution, and is available
-* at the URL "http://www.eclipse.org/legal/epl-v10.html".
-*
-* Initial Contributors:
-* Nokia Corporation - initial contribution.
-*
-* Contributors:
-*
-* Description:  Provides the flashing icon/LED & timing capability of the*
-*/
-
-
-
-// INCLUDE FILES
-#include <e32base.h>
-#include <e32std.h>
-#include <eikbtgpc.h>
-#include <cameraapp.rsg>
-#include <vgacamsettings.rsg>
-#include "CamSelfTimer.h"
-#include "CamPanic.h"
-#include "CamAppUi.h"
-#include "CamUtility.h"
-#include "Cam.hrh"  // For ECamSelfTimerSoundId def
-#include "OstTraceDefinitions.h"
-#ifdef OST_TRACE_COMPILER_IN_USE
-#include "CamSelfTimerTraces.h"
-#endif
-
-// CONSTANTS
-const TInt    KCamSelfTimerToneHz  = 1760;         
-const TReal32 KCamSelfTimerToneVol = 0.75f;    
-
-
-// MACROS
-
-// LOCAL CONSTANTS AND MACROS
-
-// MODULE DATA STRUCTURES
-
-// LOCAL FUNCTION PROTOTYPES
-
-// FORWARD DECLARATIONS
-
-// ============================= LOCAL FUNCTIONS ===============================
-
-
-
-
-// ============================ MEMBER FUNCTIONS ===============================
-
-// -----------------------------------------------------------------------------
-// CCamSelfTimer::NewL
-// Two-phased constructor.
-// -----------------------------------------------------------------------------
-//
-CCamSelfTimer* CCamSelfTimer::NewL( CCamAppController& aController )
-    {
-    CCamSelfTimer* self = new( ELeave ) CCamSelfTimer( aController );
-    CleanupStack::PushL( self );
-    self->ConstructL();
-    CleanupStack::Pop( self );
-    return self;
-    }
-
-    
-// Destructor
-CCamSelfTimer::~CCamSelfTimer()
-  {
-  PRINT( _L("Camera => ~CCamSelfTimer") );
-  // If self-timer is active, stop it
-  if ( IsActive() )
-      {
-      Cancel();
-      }
-
-  // close up observers array
-  iObservers.Close();
-
-  delete iPeriodicTimer;    
-  PRINT( _L("Camera <= ~CCamSelfTimer") );
-  }
-
-// -----------------------------------------------------------------------------
-// CCamSelfTimer::StartSelfTimer
-// Will be called to start self timer.  If self timer is already running, the 
-// timer is cancelled and the capture operation is run immediately.
-// -----------------------------------------------------------------------------
-//
-void CCamSelfTimer::StartSelfTimer()
-  {
-  // Check it is not already running
-  if ( ECamSelfTimerStandby == iState )
-    {
-    ChangeState( ECamSelfTimerActive1 );
-    }
-  // If the timer is already running, then we must cancel the timer
-  // and do the capture operation now!
-  else  
-    { 
-    // Cancel the timer
-    Cancel();
-
-    if( ECamControllerImage == iMode )
-      {
-      switch ( iImageMode )
-        {
-        case ECamImageCaptureBurst:
-        case ECamImageCaptureTimeLapse:
-          {
-          // Start the autofocus operation now, the capture will be queued
-          // after focus completes
-          OstTrace0( CAMERAAPP_PERFORMANCE, DUP7_CCAMSELFTIMER_STARTSELFTIMER, "e_CAM_APP_AF 1" );
-          iController.StartAutoFocus();
-          // Softkeys are blank/cancel if doing burst capture
-          // but cancel means cancel ongoing burst, not cancel self-timer
-          // replace the buttons with the correct command set
-          CCamAppUi* appUi = static_cast<CCamAppUi*>( CEikonEnv::Static()->AppUi() );
-          if ( appUi )
-            {
-            // blank the softkeys in preparation for capture
-            TRAP_IGNORE( appUi->SetSoftKeysL( R_CAM_SOFTKEYS_BLANK_STOP ) );
-            }
-          }
-          //lint -fallthrough
-        case ECamImageCaptureSingle: 
-          {
-          // If still Self-Timer is interrupted, take the photo NOW.
-          // If we were in multi-shot, this capture is queued
-          OstTrace0( CAMERAAPP_PERFORMANCE, CCAMSELFTIMER_STARTSELFTIMER, "e_CAM_APP_SHOT_TO_SNAPSHOT 1" );
-          OstTrace0( CAMERAAPP_PERFORMANCE, DUP1_CCAMSELFTIMER_STARTSELFTIMER, "e_CAM_PRI_SHOT_TO_SNAPSHOT 1" );
-          OstTrace0( CAMERAAPP_PERFORMANCE, DUP2_CCAMSELFTIMER_STARTSELFTIMER, "e_CAM_PRI_SHOT_TO_SAVE 1" );
-          OstTrace0( CAMERAAPP_PERFORMANCE, DUP3_CCAMSELFTIMER_STARTSELFTIMER, "e_CAM_PRI_SHOT_TO_SHOT 1" );
-          OstTrace0( CAMERAAPP_PERFORMANCE, DUP4_CCAMSELFTIMER_STARTSELFTIMER, "e_CAM_APP_SHOT_TO_STILL 1" );
-          OstTrace0( CAMERAAPP_PERFORMANCE, DUP5_CCAMSELFTIMER_STARTSELFTIMER, "e_CAM_APP_CAPTURE_START 1" );
-          OstTrace0( CAMERAAPP_PERFORMANCE, DUP6_CCAMSELFTIMER_STARTSELFTIMER, "e_CAM_PRI_SERIAL_SHOOTING 1" );
-
-          iController.Capture();
-          break;
-          }
-        default:
-          break;
-        }
-      }
-    else
-      {
-      // Start recording now
-      TRAP_IGNORE( iController.StartVideoRecordingL() );
-      }
-    }
-  }
-
-// -----------------------------------------------------------------------------
-// CCamSelfTimer::SetModeL
-// Called when the current capture method (Video or Still) changes.
-// Updates the internal state (so correct capture method is called when self
-// timer expires) and if timer is already running, cancels the outstanding
-// timer (as the view has changed).
-// -----------------------------------------------------------------------------
-//
-void CCamSelfTimer::SetModeL( TCamCameraMode         aMode, 
-                             TCamImageCaptureMode   aImageMode,
-                             TCamSelfTimerFunctions aFunc )
-  {
-  iMode      = aMode;
-  iImageMode = aImageMode;
-  
-  // Based on the supplied selftimer function (specifying periods) load the 
-  // individual data from PSI.
-  TPckgBuf <TSelfTimerSetting> pckg;
-  
-  TInt ret = KErrNone;
-  switch ( aFunc )
-    {
-    case ECamSelfTimerMode1:
-      ret = CamUtility::GetPsiAnyL( ECamPsiSelfTimerPeriod1, &pckg );
-      break;
-    case ECamSelfTimerMode2:
-      ret = CamUtility::GetPsiAnyL( ECamPsiSelfTimerPeriod2, &pckg );
-      break;
-    case ECamSelfTimerMode3:
-      ret = CamUtility::GetPsiAnyL( ECamPsiSelfTimerPeriod3, &pckg );
-      break;            
-    case ECamSelfTimerDisabled:
-      //Fall-through
-    default:
-      break;
-    }
-  // Check it is supported.  
-  __ASSERT_ALWAYS( ret == KErrNone, CamPanic( ECamPanicUnhandledCommand ) );
-
-  iSettings = pckg();
-  // Set time remaining and update observers.
-  iTimeRemaining = iSettings.iThreshold[ECamSelfTimerMode1];    
-  NotifyObservers( ECamSelfTimerEventTimerOn );
-  }
-
-// -----------------------------------------------------------------------------
-// CCamSelfTimer::Cancel
-// Cancels the timer if already running, and returns the self timer to 
-// self-timer standby state.
-// -----------------------------------------------------------------------------
-//
-void CCamSelfTimer::Cancel()
-    {
-    ChangeState( ECamSelfTimerStandby );
-    }
-
-// -----------------------------------------------------------------------------
-// CCamSelfTimer::IsActive
-// Returns whether or not the SelfTimer is currently active (counting down)
-// -----------------------------------------------------------------------------
-//
-TBool CCamSelfTimer::IsActive()
-    {
-    if ( iState == ECamSelfTimerStandby )
-        {
-        return EFalse;
-        }
-    else
-        {
-        return ETrue;        
-        }           
-    }
-
-// -----------------------------------------------------------------------------
-// CCamSelfTimer::CCamSelfTimer
-// C++ default constructor can NOT contain any code, that
-// might leave.
-// -----------------------------------------------------------------------------
-//
-CCamSelfTimer::CCamSelfTimer( CCamAppController& aController ) :                                 
-                                 iState( ECamSelfTimerStandby ),
-                                 iController( aController )
-    {                                     
-    iCallback = TCallBack( TimerCallback, this );
-    }
-
-// -----------------------------------------------------------------------------
-// CCamSelfTimer::ConstructL
-// Symbian 2nd phase constructor can leave.
-// -----------------------------------------------------------------------------
-//
-void CCamSelfTimer::ConstructL()
-    {
-    iPeriodicTimer = CPeriodic::NewL( CActive::EPriorityHigh );    
-    }
-
-// -----------------------------------------------------------------------------
-// CCamSelfTimer::ChangeState
-// Called to move between the internal self-timer states.
-// -----------------------------------------------------------------------------
-//
-void CCamSelfTimer::ChangeState( TCamSelfTimer aState )
-    {  
-    // if the timer object has not been created
-    __ASSERT_DEBUG( iPeriodicTimer != NULL, CamPanic( ECamPanicNullPointer ) );
-
-    // If the state has been changed
-    iState = aState;
-
-    switch ( iState )
-        {
-        case ECamSelfTimerActive1:
-            iController.StopIdleTimer(); // no standby mode if time is running
-            iIndication = ETrue;
-            //lint -fallthrough
-        case ECamSelfTimerActive2:
-        case ECamSelfTimerActive3:
-            iTimeRemaining = iSettings.iThreshold[iState];    
-            // Use smallest time period as tick period. This assumes that
-            // smallest time period is divisble into larger time period.
-            iTimerTickPeriod = iSettings.iFlashPeriod[iState];    // Need half-periods
-            if ( iTimerTickPeriod.Int() > iSettings.iBeepPeriod[iState] )
-                {
-                iTimerTickPeriod = iSettings.iBeepPeriod[iState];
-                }
-            
-            if ( iTimerTickPeriod.Int() == KMaxTInt ) // If state is timer based (always on)
-              {
-              iIndication = ETrue;
-              iPeriodicTimer->Cancel();
-              iTimerTickPeriod = iTimeRemaining;// Force period to be time left
-
-              // Reschedule the timer to go off when the remaining time has completed
-              iPeriodicTimer->Start( iTimeRemaining, iTimeRemaining, iCallback );
-              }
-            else if ( iTimerTickPeriod.Int() == 0 ) // Always off
-              {
-              iIndication = EFalse;
-              iPeriodicTimer->Cancel();
-              iTimerTickPeriod = iTimeRemaining;// Force period to be time left
-
-              // Reschedule the timer to go off when the remaining time has completed
-              iPeriodicTimer->Start( iTimeRemaining, iTimeRemaining, iCallback );
-              }
-            else if ( iTimerTickPeriod.Int() != KErrNotSupported )    // This is a valid period
-              {
-              TInt period = iTimerTickPeriod.Int();
-              iPeriodicTimer->Cancel();
-              iPeriodicTimer->Start( period, period, iCallback );
-              }
-            // otherwise, do nothing
-            else
-              {
-              // empty statement to remove Lint error.
-              }
-            
-            // Check if we need to start autofocus
-            if ( iSettings.iAutoFocus != KErrNotSupported && 
-                 iTimeRemaining.Int() == iSettings.iAutoFocus )
-              {
-              if ( ECamControllerVideo != iMode )
-                {
-                // Start the AutoFocus operation
-                OstTrace0( CAMERAAPP_PERFORMANCE, CCAMSELFTIMER_CHANGESTATE, "e_CAM_APP_AF 1" );
-                iController.StartAutoFocus();
-                }
-              }
-            DoIndication( iIndication );
-            break;
-        
-        case ECamSelfTimerStandby:           
-            iPeriodicTimer->Cancel();
-            if ( !iController.IsSlideInSelfTimerPreview() )
-              {
-              iController.SetDynamicSettingToDefault(ECamSettingItemDynamicSelfTimer);
-              }
-            NotifyObservers( ECamSelfTimerEventTimerOff );
-            break;
-
-        default:
-            break;
-        }    
-    }
-
-// -----------------------------------------------------------------------------
-// TimerCallback Callback used for self timer class to be informed of periodic
-// timer events
-// Returns: TInt: KErrNone if successful.
-// -----------------------------------------------------------------------------
-//
-TInt CCamSelfTimer::TimerCallback( TAny* aPtr )
-    {
-    CCamSelfTimer* timer = static_cast< CCamSelfTimer* >( aPtr );
-    __ASSERT_DEBUG( timer != NULL, CamPanic( ECamPanicNullPointer ) ); 
-
-    timer->Tick();        
-
-    return KErrNone;
-    }
-
-// -----------------------------------------------------------------------------
-// CCamSelfTimer::Tick
-// Called when the periodic timer "ticks", used to 
-// -----------------------------------------------------------------------------
-//
-void CCamSelfTimer::Tick()
-  {
-  PRINT(_L("Camera => CCamSelfTimer::Tick()"));    
-  // Adjust the time remaining
-  iTimeRemaining = iTimeRemaining.Int() - iTimerTickPeriod.Int();
-
-  // Adjust the time elapsed since last beep and indicator state change.
-  iTimeElapsedSinceIndication += iTimerTickPeriod.Int();
-
-  // Adjust the indicator state if necessary.
-  __ASSERT_DEBUG( iState < ECamSelfTimerStandby, CamPanic( ECamPanicUnhandledCreateSettingItem ) );
-  if ( iTimeElapsedSinceIndication >= iSettings.iFlashPeriod[iState] )
-    {
-    iIndication = !iIndication;
-    iTimeElapsedSinceIndication = 0;
-    }
-  
-  // If we have reached the end of the timer period...
-  if ( iTimeRemaining == TTimeIntervalMicroSeconds32( 0 ) )
-    {
-    // Cancel the timer, reset internal state.
-    Cancel();
-
-    // The Controller takes care of the synchronisation of this.
-    // If AutoFocus is complete, start Capture now
-    // If AutoFocus still ongoing, it will wait until autofocus is 
-    // complete THEN Capture.
-    if ( ECamControllerImage == iMode )
-      {  
-      CCamAppUi* appUi = static_cast<CCamAppUi*>( CEikonEnv::Static()->AppUi() );
-      if( appUi )
-        {
-        // Blank all softkeys if doing still capture
-        if ( iImageMode == ECamImageCaptureSingle )
-          {
-          // blank the softkeys in preparation for capture
-          TRAP_IGNORE( appUi->SetSoftKeysL( R_CAM_SOFTKEYS_BLANK ) );
-          }
-                
-        // Softkeys are blank/cancel if doing burst capture
-        // but cancel means cancel ongoing burst, not cancel self-timer        
-        else if ( ECamImageCaptureBurst     == iImageMode 
-               || ECamImageCaptureTimeLapse == iImageMode )
-          {
-          // blank the softkeys in preparation for capture
-          TRAP_IGNORE( appUi->SetSoftKeysL( R_CAM_SOFTKEYS_BLANK_STOP ) )
-          }
-        }
-
-      // Ensure everything is OFF
-      DoIndication( EFalse );
-
-      // Do capture
-      OstTrace0( CAMERAAPP_PERFORMANCE, CCAMSELFTIMER_TICK, "e_CAM_APP_SHOT_TO_SNAPSHOT 1" );
-      OstTrace0( CAMERAAPP_PERFORMANCE, DUP1_CCAMSELFTIMER_TICK, "e_CAM_PRI_SHOT_TO_SNAPSHOT 1" );
-      OstTrace0( CAMERAAPP_PERFORMANCE, DUP2_CCAMSELFTIMER_TICK, "e_CAM_PRI_SHOT_TO_SAVE 1" );
-      OstTrace0( CAMERAAPP_PERFORMANCE, DUP3_CCAMSELFTIMER_TICK, "e_CAM_PRI_SHOT_TO_SHOT 1" );
-      OstTrace0( CAMERAAPP_PERFORMANCE, DUP4_CCAMSELFTIMER_TICK, "e_CAM_APP_SHOT_TO_STILL 1" );
-      OstTrace0( CAMERAAPP_PERFORMANCE, DUP5_CCAMSELFTIMER_TICK, "e_CAM_APP_CAPTURE_START 1" );
-      OstTrace0( CAMERAAPP_PERFORMANCE, DUP6_CCAMSELFTIMER_TICK, "e_CAM_PRI_SERIAL_SHOOTING 1" );
-
-      iController.Capture();
-      }
-    else // video mode
-      {   
-      TRAP_IGNORE( iController.StartVideoRecordingL() )
-      }            
-    }
-
-  // The timer is ongoing
-  else 
-    {
-    TInt remaining = iTimeRemaining.Int();
-    // Work out if we need to change period.
-    if ( remaining        == iSettings.iThreshold[ECamSelfTimerActive2] 
-      && KErrNotSupported != iSettings.iThreshold[ECamSelfTimerActive2] )
-      {
-      ChangeState( ECamSelfTimerActive2 );
-      }
-    else if ( remaining        == iSettings.iThreshold[ECamSelfTimerActive3] 
-           && KErrNotSupported != iSettings.iThreshold[ECamSelfTimerActive3])
-      {
-      ChangeState( ECamSelfTimerActive3 );
-      }
-    else
-      {
-      // Update the indicators (done as part of change state as well)
-      DoIndication( iIndication );
-      }
-  
-    // Check if we need to start autofocus
-    if ( KErrNotFound != iSettings.iAutoFocus 
-      && remaining    == iSettings.iAutoFocus )
-      {
-      if ( ECamControllerImage == iMode )
-        {
-        // Start the AutoFocus operation
-        OstTrace0( CAMERAAPP_PERFORMANCE, DUP7_CCAMSELFTIMER_TICK, "e_CAM_APP_AF 1" );
-        iController.StartAutoFocus();
-        }
-      }
-    }
-  PRINT(_L("Camera <= CCamSelfTimer::Tick()"));    
-  }
-
-// -----------------------------------------------------------------------------
-// CCamSelfTimer::DoIndication
-// Send event to self timer observers
-// -----------------------------------------------------------------------------
-//                    
-void CCamSelfTimer::DoIndication( TBool aOn )
-    {
-    iIndication = aOn;
-
-    if ( aOn )        
-        {        
-        NotifyObservers( ECamSelfTimerEventTimerOn );
-        iController.PlayTone( KCamSelfTimerToneHz, iTimerTickPeriod.Int()/2, KCamSelfTimerToneVol, EFalse );
-        }
-    else
-        {
-        NotifyObservers( ECamSelfTimerEventTimerOff );
-        }
-    }
-
-// -----------------------------------------------------------------------------
-// CCamSelfTimer::AddObserverL
-// Add a self timer observer 
-// -----------------------------------------------------------------------------
-//
-void CCamSelfTimer::AddObserverL( const MCamSelfTimerObserver* aObserver )
-    {
-    User::LeaveIfError( iObservers.Append( aObserver ) );
-    }
-
-// -----------------------------------------------------------------------------
-// CCamSelfTimer::RemoveObserver
-// Remove a self timer observer
-// -----------------------------------------------------------------------------
-//
-void CCamSelfTimer::RemoveObserver( const MCamSelfTimerObserver* aObserver )
-    {
-    TInt i;
-    TInt numobservers = iObservers.Count();
-    for ( i = 0; i < numobservers; i++ )
-        {
-        // if the observer is the one to remove
-        if ( iObservers[i] == aObserver )
-            {
-            iObservers.Remove( i );
-            return;
-            }
-        }
-    }
-
-// -----------------------------------------------------------------------------
-// CCamSelfTimer::NotifyObservers
-// Send self timer event to observers
-// -----------------------------------------------------------------------------
-//
-void CCamSelfTimer::NotifyObservers( TCamSelfTimerEvent aEvent )
-    {
-    const TInt KMicroSecsPerSec = 1000000;
-    TInt timeRem = iTimeRemaining.Int() / KMicroSecsPerSec;
-    TInt i;
-    TInt numobservers = iObservers.Count();
-    for ( i = 0; i < numobservers; i++ )
-        {
-        iObservers[i]->HandleSelfTimerEvent( aEvent, timeRem );
-        }
-    }
-
-//  End of File