ipcm_plat/flextimer_api/inc/rflextimer.h
author hgs
Mon, 24 May 2010 20:51:35 +0300
changeset 32 5c4486441ae6
permissions -rw-r--r--
201021
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
32
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
 * Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
hgs
parents:
diff changeset
     3
 * All rights reserved.
hgs
parents:
diff changeset
     4
 * This component and the accompanying materials are made available
hgs
parents:
diff changeset
     5
 * under the terms of "Eclipse Public License v1.0"
hgs
parents:
diff changeset
     6
 * which accompanies this distribution, and is available
hgs
parents:
diff changeset
     7
 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
hgs
parents:
diff changeset
     8
 *
hgs
parents:
diff changeset
     9
 * Initial Contributors:
hgs
parents:
diff changeset
    10
 * Nokia Corporation - initial contribution.
hgs
parents:
diff changeset
    11
 *
hgs
parents:
diff changeset
    12
 * Contributors:
hgs
parents:
diff changeset
    13
 *
hgs
parents:
diff changeset
    14
 * Description:  RFlexTimer class for Flexible Timer server access.
hgs
parents:
diff changeset
    15
 *
hgs
parents:
diff changeset
    16
 */
hgs
parents:
diff changeset
    17
hgs
parents:
diff changeset
    18
/*
hgs
parents:
diff changeset
    19
 * %version: 1 %
hgs
parents:
diff changeset
    20
 */
hgs
parents:
diff changeset
    21
hgs
parents:
diff changeset
    22
#ifndef RFLEXTIMER_H
hgs
parents:
diff changeset
    23
#define RFLEXTIMER_H
hgs
parents:
diff changeset
    24
hgs
parents:
diff changeset
    25
// INCLUDE FILES
hgs
parents:
diff changeset
    26
#include <e32std.h> 
hgs
parents:
diff changeset
    27
hgs
parents:
diff changeset
    28
// CLASS DECLARATION
hgs
parents:
diff changeset
    29
/**
hgs
parents:
diff changeset
    30
 *  Resource class providing access to flexible timer server.
hgs
parents:
diff changeset
    31
 *  
hgs
parents:
diff changeset
    32
 *  This timer class is in many ways similar to RTimer in its use. The
hgs
parents:
diff changeset
    33
 *  main difference is the option to set a timer expiry window. When the timer
hgs
parents:
diff changeset
    34
 *  expiry window has been set to a value greater than zero, requested
hgs
parents:
diff changeset
    35
 *  timeouts may expire at any point of time inside this window. This timer
hgs
parents:
diff changeset
    36
 *  should be used for timed air-interface operations, such as keep-alive
hgs
parents:
diff changeset
    37
 *  messages. The use of normal timers is recommended if the timeouts are not
hgs
parents:
diff changeset
    38
 *  related to data transmission or reception activity in the device.
hgs
parents:
diff changeset
    39
 *  
hgs
parents:
diff changeset
    40
 *  The purpose for a flexible timer is to allow the system the opportunity to
hgs
parents:
diff changeset
    41
 *  align timed behaviour that uses radio resources. For example, when a
hgs
parents:
diff changeset
    42
 *  radio device is otherwise in an idle state, simple keep-alive messaging
hgs
parents:
diff changeset
    43
 *  can be grouped together so that all traffic happens in single bursts
hgs
parents:
diff changeset
    44
 *  instead of being distributed evenly along time timeline. This maximises
hgs
parents:
diff changeset
    45
 *  radio idle time and therefore also battery lifetime.
hgs
parents:
diff changeset
    46
 *  
hgs
parents:
diff changeset
    47
 *  This class defines a client interface for flexible timer server
hgs
parents:
diff changeset
    48
 *  (CFlexTimerServer). When a user requests timeout with RFlexTimer, the
hgs
parents:
diff changeset
    49
 *  server will expire the request non-deterministically within an time window
hgs
parents:
diff changeset
    50
 *  configured by the user. Timer resolution is one second.
hgs
parents:
diff changeset
    51
 *  
hgs
parents:
diff changeset
    52
 *  The timer returns one of the following values for TRequestStatus or any
hgs
parents:
diff changeset
    53
 *  other system-wide error codes:
hgs
parents:
diff changeset
    54
 *  
hgs
parents:
diff changeset
    55
 *  <table border=1 bordercolor="#84B0C7" cellspacing="0" align="center">
hgs
parents:
diff changeset
    56
 *  <tr>
hgs
parents:
diff changeset
    57
 *      <th>Return value</th>
hgs
parents:
diff changeset
    58
 *      <th>Description</th>
hgs
parents:
diff changeset
    59
 *      <th>@c At()</th>
hgs
parents:
diff changeset
    60
 *      <th>@c AtUTC()</th>
hgs
parents:
diff changeset
    61
 *      <th>@c After()</th>
hgs
parents:
diff changeset
    62
 *      <th>@c AfterTicks()</th>
hgs
parents:
diff changeset
    63
 *  </tr>
hgs
parents:
diff changeset
    64
 *  <tr>
hgs
parents:
diff changeset
    65
 *      <td>@c KErrNone</td>
hgs
parents:
diff changeset
    66
 *      <td>Timer has expired normally</td>
hgs
parents:
diff changeset
    67
 *      <td align="center">X</td>
hgs
parents:
diff changeset
    68
 *      <td align="center">X</td>  
hgs
parents:
diff changeset
    69
 *      <td align="center">X</td>
hgs
parents:
diff changeset
    70
 *      <td align="center">X</td>
hgs
parents:
diff changeset
    71
 *  </tr>
hgs
parents:
diff changeset
    72
 *  <tr>
hgs
parents:
diff changeset
    73
 *      <td>@c KErrCancel</td>
hgs
parents:
diff changeset
    74
 *      <td>Timer has been cancelled by @c Cancel()</td>
hgs
parents:
diff changeset
    75
 *      <td align="center">X</td>
hgs
parents:
diff changeset
    76
 *      <td align="center">X</td>
hgs
parents:
diff changeset
    77
 *      <td align="center">X</td>
hgs
parents:
diff changeset
    78
 *      <td align="center">X</td>
hgs
parents:
diff changeset
    79
 *  </tr>
hgs
parents:
diff changeset
    80
 *  <tr>
hgs
parents:
diff changeset
    81
 *      <td>@c KErrAbort</td>
hgs
parents:
diff changeset
    82
 *      <td>Timer has been aborted due time change</td>
hgs
parents:
diff changeset
    83
 *      <td align="center">X</td>
hgs
parents:
diff changeset
    84
 *      <td align="center">X</td>
hgs
parents:
diff changeset
    85
 *      <td align="center">&nbsp;</td>
hgs
parents:
diff changeset
    86
 *      <td align="center">&nbsp;</td>
hgs
parents:
diff changeset
    87
 *  </tr>
hgs
parents:
diff changeset
    88
 *  </table>
hgs
parents:
diff changeset
    89
 *  
hgs
parents:
diff changeset
    90
 *  Example: A user uses Configure-function to set the timer window to
hgs
parents:
diff changeset
    91
 *  2,000,000 microseconds. Next the user requests a timeout with an interval
hgs
parents:
diff changeset
    92
 *  value of 3,000,000 microseconds. Now the timer may expire at any moment
hgs
parents:
diff changeset
    93
 *  after 1,000,000 microseconds and at latest after 3,000,000 microseconds
hgs
parents:
diff changeset
    94
 *  (+ possible timer inaccuracy (timer resolution) ) has passed from the 
hgs
parents:
diff changeset
    95
 *  timeout request. 
hgs
parents:
diff changeset
    96
 *
hgs
parents:
diff changeset
    97
 *  Passing a negative timer interval value or a past time instant 
hgs
parents:
diff changeset
    98
 *  to timer functions will cause a panic . Restarting a timer that is already
hgs
parents:
diff changeset
    99
 *  running will cause panic. Cancel must be used before starting timer again.
hgs
parents:
diff changeset
   100
 *
hgs
parents:
diff changeset
   101
 *  @see CFlexTimer
hgs
parents:
diff changeset
   102
 *  @see CFlexPeriodic
hgs
parents:
diff changeset
   103
 *  @see RTimer
hgs
parents:
diff changeset
   104
 *
hgs
parents:
diff changeset
   105
 *  Examples:
hgs
parents:
diff changeset
   106
 *
hgs
parents:
diff changeset
   107
 *  Synchronous usage of RFlexTimer:
hgs
parents:
diff changeset
   108
 *  @code
hgs
parents:
diff changeset
   109
 *      const TTimeIntervalMicroSeconds KInterval( 900000000 ); // 15 mins
hgs
parents:
diff changeset
   110
 *      const TTimeIntervalMicroSeconds KWindow( 300000000 ); // 5 mins
hgs
parents:
diff changeset
   111
 *
hgs
parents:
diff changeset
   112
 *      TRequestStatus status;
hgs
parents:
diff changeset
   113
 *
hgs
parents:
diff changeset
   114
 *      RFlexTimer timer;
hgs
parents:
diff changeset
   115
 *      User::LeaveIfError( timer.Connect() );
hgs
parents:
diff changeset
   116
 *
hgs
parents:
diff changeset
   117
 *      timer.Configure( KWindow );
hgs
parents:
diff changeset
   118
 *      timer.After( status, KInterval );
hgs
parents:
diff changeset
   119
 *
hgs
parents:
diff changeset
   120
 *      User::WaitForRequest( status );     // Wait till the timer expires
hgs
parents:
diff changeset
   121
 *
hgs
parents:
diff changeset
   122
 *      // Check the request's status
hgs
parents:
diff changeset
   123
 *      if ( status == KErrNone )
hgs
parents:
diff changeset
   124
 *          {
hgs
parents:
diff changeset
   125
 *          // Timer was expired ok
hgs
parents:
diff changeset
   126
 *          }
hgs
parents:
diff changeset
   127
 *      else if ( status == KErrAborted )
hgs
parents:
diff changeset
   128
 *          {
hgs
parents:
diff changeset
   129
 *          // Only for At() and AtUTC()
hgs
parents:
diff changeset
   130
 *          // Timer was aborted by time change
hgs
parents:
diff changeset
   131
 *          }
hgs
parents:
diff changeset
   132
 *      else if ( status == KErrCancel )
hgs
parents:
diff changeset
   133
 *          {
hgs
parents:
diff changeset
   134
 *          // timer.Cancel() was called while the timer was active
hgs
parents:
diff changeset
   135
 *          }
hgs
parents:
diff changeset
   136
 *      else
hgs
parents:
diff changeset
   137
 *          {
hgs
parents:
diff changeset
   138
 *          // Some other error has happened
hgs
parents:
diff changeset
   139
 *          }
hgs
parents:
diff changeset
   140
 *          .
hgs
parents:
diff changeset
   141
 *          .
hgs
parents:
diff changeset
   142
 *          .
hgs
parents:
diff changeset
   143
 *      timer.Close();
hgs
parents:
diff changeset
   144
 *  @endcode
hgs
parents:
diff changeset
   145
 *
hgs
parents:
diff changeset
   146
 *  Asynchronous usage of RFlexTimer (consider using CFlexTimer or 
hgs
parents:
diff changeset
   147
 *  CFlexPeriodic instead of own implementation):
hgs
parents:
diff changeset
   148
 *  
hgs
parents:
diff changeset
   149
 *  Class definition
hgs
parents:
diff changeset
   150
 *  @code
hgs
parents:
diff changeset
   151
 *      class CMyNetworkServiceMonitor : public CActive
hgs
parents:
diff changeset
   152
 *      {
hgs
parents:
diff changeset
   153
 *      public: // Members
hgs
parents:
diff changeset
   154
 *
hgs
parents:
diff changeset
   155
 *          // Public two-phased constructor
hgs
parents:
diff changeset
   156
 *          static CMyNetworkServiceMonitor* NewL(
hgs
parents:
diff changeset
   157
 *              TTimeIntervalMicroSeconds aWindow,
hgs
parents:
diff changeset
   158
 *              TTimeIntervalMicroSeconds aInterval );
hgs
parents:
diff changeset
   159
 *
hgs
parents:
diff changeset
   160
 *          // Destructor
hgs
parents:
diff changeset
   161
 *          virtual ~CMyNetworkServiceMonitor();
hgs
parents:
diff changeset
   162
 *
hgs
parents:
diff changeset
   163
 *      protected: // From CActive
hgs
parents:
diff changeset
   164
 *
hgs
parents:
diff changeset
   165
 *          // Cancel outstanding request. Called by CActive::Cancel().
hgs
parents:
diff changeset
   166
 *          virtual void DoCancel();
hgs
parents:
diff changeset
   167
 *
hgs
parents:
diff changeset
   168
 *          // Handle request completion event  
hgs
parents:
diff changeset
   169
 *          virtual void RunL();
hgs
parents:
diff changeset
   170
 *      
hgs
parents:
diff changeset
   171
 *      private: // Members
hgs
parents:
diff changeset
   172
 *
hgs
parents:
diff changeset
   173
 *          // Constructor
hgs
parents:
diff changeset
   174
 *          CMyNetworkServiceMonitor( TTimeIntervalMicroSeconds aInterval );
hgs
parents:
diff changeset
   175
 *
hgs
parents:
diff changeset
   176
 *          // Second phase constructor
hgs
parents:
diff changeset
   177
 *          void ConstructL( TTimeIntervalMicroSeconds aWindow );
hgs
parents:
diff changeset
   178
 *
hgs
parents:
diff changeset
   179
 *          // Does the network server monitoring.
hgs
parents:
diff changeset
   180
 *          // Implementation is not provided by this example.
hgs
parents:
diff changeset
   181
 *          void DoNetworkServiceMonitoring();
hgs
parents:
diff changeset
   182
 *      
hgs
parents:
diff changeset
   183
 *      private: // Data
hgs
parents:
diff changeset
   184
 *          RFlexTimer iTimer;
hgs
parents:
diff changeset
   185
 *          TTimeIntervalMicroSeconds iInterval;
hgs
parents:
diff changeset
   186
 *      };
hgs
parents:
diff changeset
   187
 *  @endcode
hgs
parents:
diff changeset
   188
 *
hgs
parents:
diff changeset
   189
 *  @code
hgs
parents:
diff changeset
   190
 *  CMyNetworkServiceMonitor::CMyNetworkServiceMonitor( 
hgs
parents:
diff changeset
   191
 *      TTimeIntervalMicroSeconds aInterval ):
hgs
parents:
diff changeset
   192
 *      CActive( CActive::EPriorityStandard ),
hgs
parents:
diff changeset
   193
 *      iInterval( aInterval )
hgs
parents:
diff changeset
   194
 *      {
hgs
parents:
diff changeset
   195
 *      // Nothing to do
hgs
parents:
diff changeset
   196
 *      } 
hgs
parents:
diff changeset
   197
 *
hgs
parents:
diff changeset
   198
 *  // -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   199
 *  //
hgs
parents:
diff changeset
   200
 *  void CMyNetworkServiceMonitor::ConstructL( 
hgs
parents:
diff changeset
   201
 *      TTimeIntervalMicroSeconds aWindow )
hgs
parents:
diff changeset
   202
 *      {
hgs
parents:
diff changeset
   203
 *      User::LeaveIfError( iTimer.Connect() );
hgs
parents:
diff changeset
   204
 *      iTimer.Configure( aWindow );
hgs
parents:
diff changeset
   205
 *      }
hgs
parents:
diff changeset
   206
 *
hgs
parents:
diff changeset
   207
 *  // -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   208
 *  //
hgs
parents:
diff changeset
   209
 *  CMyNetworkServiceMonitor* CMyNetworkServiceMonitor::NewL( 
hgs
parents:
diff changeset
   210
 *      TTimeIntervalMicroSeconds aWindow,
hgs
parents:
diff changeset
   211
 *      TTimeIntervalMicroSeconds aInterval )
hgs
parents:
diff changeset
   212
 *      {
hgs
parents:
diff changeset
   213
 *      CMyNetworkServerMonitor* self =
hgs
parents:
diff changeset
   214
 *          new (ELeave) CMyNetworkServerMonitor( aInterval );
hgs
parents:
diff changeset
   215
 *      CleanupStack::PushL( self );
hgs
parents:
diff changeset
   216
 *      self->ConstructL( aWindow );
hgs
parents:
diff changeset
   217
 *      CleanupStack::Pop( self );
hgs
parents:
diff changeset
   218
 *
hgs
parents:
diff changeset
   219
 *      iTimer.After( TTimeIntervalMicroSeconds( 0 ) );
hgs
parents:
diff changeset
   220
 *      SetActive();
hgs
parents:
diff changeset
   221
 *
hgs
parents:
diff changeset
   222
 *      return self;
hgs
parents:
diff changeset
   223
 *      }
hgs
parents:
diff changeset
   224
 *
hgs
parents:
diff changeset
   225
 *  // -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   226
 *  //
hgs
parents:
diff changeset
   227
 *  CMyNetworkServiceMonitor::~CMyNetworkServiceMonitor()
hgs
parents:
diff changeset
   228
 *      {
hgs
parents:
diff changeset
   229
 *      Cancel();       // Calls CActive::Cancel()
hgs
parents:
diff changeset
   230
 *      iTimer.Close(); // Close the timer handle
hgs
parents:
diff changeset
   231
 *      }
hgs
parents:
diff changeset
   232
 *      
hgs
parents:
diff changeset
   233
 *  // -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   234
 *  //
hgs
parents:
diff changeset
   235
 *  void CMyNetworkServiceMonitor::DoCancel()
hgs
parents:
diff changeset
   236
 *      {
hgs
parents:
diff changeset
   237
 *      iTimer.Cancel();
hgs
parents:
diff changeset
   238
 *      }
hgs
parents:
diff changeset
   239
 *
hgs
parents:
diff changeset
   240
 *  // -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   241
 *  //
hgs
parents:
diff changeset
   242
 *  void CMyNetworkServiceMonitor::RunL()
hgs
parents:
diff changeset
   243
 *      {
hgs
parents:
diff changeset
   244
 *      // Note! If used RFlexTimer::At() or RFlexTimer::AtUTC()
hgs
parents:
diff changeset
   245
 *      // iStatus == KErrAbort should also be handled.
hgs
parents:
diff changeset
   246
 *      
hgs
parents:
diff changeset
   247
 *      if ( iStatus == KErrNone )
hgs
parents:
diff changeset
   248
 *          {
hgs
parents:
diff changeset
   249
 *          // Do the network server monitor actions
hgs
parents:
diff changeset
   250
 *          DoNetworkServiceMonitoring();
hgs
parents:
diff changeset
   251
 *
hgs
parents:
diff changeset
   252
 *           // Refresh the timer
hgs
parents:
diff changeset
   253
 *          iTimer.After( iInterval );
hgs
parents:
diff changeset
   254
 *          SetActive();
hgs
parents:
diff changeset
   255
 *          }
hgs
parents:
diff changeset
   256
 *      else if ( iStatus == KErrCancel )
hgs
parents:
diff changeset
   257
 *          {
hgs
parents:
diff changeset
   258
 *          // Timer was cancelled. Do not activate it again... 
hgs
parents:
diff changeset
   259
 *          }
hgs
parents:
diff changeset
   260
 *      else
hgs
parents:
diff changeset
   261
 *          {
hgs
parents:
diff changeset
   262
 *          // Handle the error by implementing RunError()
hgs
parents:
diff changeset
   263
 *          // See also: CActive::RunError()
hgs
parents:
diff changeset
   264
 *          User::Leave( iStatus );
hgs
parents:
diff changeset
   265
 *          }
hgs
parents:
diff changeset
   266
 *      }
hgs
parents:
diff changeset
   267
 *  @endcode
hgs
parents:
diff changeset
   268
 */
hgs
parents:
diff changeset
   269
class RFlexTimer : public RSessionBase
hgs
parents:
diff changeset
   270
    {
hgs
parents:
diff changeset
   271
public:
hgs
parents:
diff changeset
   272
    // Constructors and destructors
hgs
parents:
diff changeset
   273
hgs
parents:
diff changeset
   274
    /**
hgs
parents:
diff changeset
   275
     * Constructs the object.
hgs
parents:
diff changeset
   276
     */
hgs
parents:
diff changeset
   277
    IMPORT_C RFlexTimer();
hgs
parents:
diff changeset
   278
hgs
parents:
diff changeset
   279
    /**
hgs
parents:
diff changeset
   280
     * Destructs the object.
hgs
parents:
diff changeset
   281
     */
hgs
parents:
diff changeset
   282
    IMPORT_C ~RFlexTimer();
hgs
parents:
diff changeset
   283
hgs
parents:
diff changeset
   284
    /**
hgs
parents:
diff changeset
   285
     * Connects to the timer server. This function needs to be called before
hgs
parents:
diff changeset
   286
     * any timeouts can be requested.
hgs
parents:
diff changeset
   287
     * 
hgs
parents:
diff changeset
   288
     * @return KErrNone on success. KErrNotSupported if client's and server's
hgs
parents:
diff changeset
   289
     * versions don't match. Otherwise returns one of the system-wide error
hgs
parents:
diff changeset
   290
     * codes.
hgs
parents:
diff changeset
   291
     * @panic RFlexTimer 33 Connected is called twice without closing the
hgs
parents:
diff changeset
   292
     * handle first
hgs
parents:
diff changeset
   293
     * 
hgs
parents:
diff changeset
   294
     * Example:
hgs
parents:
diff changeset
   295
     * @code
hgs
parents:
diff changeset
   296
     *      RFlexTimer timer;
hgs
parents:
diff changeset
   297
     *      User::LeaveIfError( timer.Connect() );
hgs
parents:
diff changeset
   298
     *          .
hgs
parents:
diff changeset
   299
     *          . // Set timer/wait for expiration.
hgs
parents:
diff changeset
   300
     *          .
hgs
parents:
diff changeset
   301
     *      timer.Close();  // Close the handle
hgs
parents:
diff changeset
   302
     * @endcode
hgs
parents:
diff changeset
   303
     */
hgs
parents:
diff changeset
   304
    IMPORT_C TInt Connect();
hgs
parents:
diff changeset
   305
hgs
parents:
diff changeset
   306
    /**
hgs
parents:
diff changeset
   307
     * Cancels the timer. Active timer will be completed with status 
hgs
parents:
diff changeset
   308
     * KErrCancel. If there are no active timer, Cancel() does nothing.
hgs
parents:
diff changeset
   309
     * 
hgs
parents:
diff changeset
   310
     * @panic KERN-EXEC 0 Cancel() was called before Connect()
hgs
parents:
diff changeset
   311
     * 
hgs
parents:
diff changeset
   312
     * Example:
hgs
parents:
diff changeset
   313
     * @code
hgs
parents:
diff changeset
   314
     *      RFlexTimer timer;
hgs
parents:
diff changeset
   315
     *      User::LeaveIfError( timer.Connect() );
hgs
parents:
diff changeset
   316
     *          .
hgs
parents:
diff changeset
   317
     *          .
hgs
parents:
diff changeset
   318
     *          .
hgs
parents:
diff changeset
   319
     *      // Oops, no need to wait the timer expiration
hgs
parents:
diff changeset
   320
     *      timer.Cancel(); // Cancel the pending timer    
hgs
parents:
diff changeset
   321
     *          .
hgs
parents:
diff changeset
   322
     *          .
hgs
parents:
diff changeset
   323
     *          .  
hgs
parents:
diff changeset
   324
     *      timer.Close();  // Close the handle
hgs
parents:
diff changeset
   325
     * @endcode
hgs
parents:
diff changeset
   326
     */
hgs
parents:
diff changeset
   327
    IMPORT_C void Cancel();
hgs
parents:
diff changeset
   328
hgs
parents:
diff changeset
   329
    /**
hgs
parents:
diff changeset
   330
     * An asynchronous timeout request to the flexible timer server.
hgs
parents:
diff changeset
   331
     * Fire timer at latest on the given 32-bit interval.
hgs
parents:
diff changeset
   332
     * 
hgs
parents:
diff changeset
   333
     * @param aStatus active object to be used for getting responses.	
hgs
parents:
diff changeset
   334
     * @param aInterval the interval value until which the timer must expire.
hgs
parents:
diff changeset
   335
     * 
hgs
parents:
diff changeset
   336
     * @panic RFlexTimer 1  aInterval is negative
hgs
parents:
diff changeset
   337
     * @panic RFlexTimer 15 Timer is already active. Wait it to expire or
hgs
parents:
diff changeset
   338
     * cancel it first.
hgs
parents:
diff changeset
   339
     *
hgs
parents:
diff changeset
   340
     * Example:
hgs
parents:
diff changeset
   341
     * @code
hgs
parents:
diff changeset
   342
     *      const TTimeIntervalMicroSeconds32 KInterval32( 300000000 ); // 5 mins  
hgs
parents:
diff changeset
   343
     *      const TTimeIntervalMicroSeconds32 KWindow32( 120000000 ); // 2 mins  
hgs
parents:
diff changeset
   344
     *      
hgs
parents:
diff changeset
   345
     *      TRequestStatus status;
hgs
parents:
diff changeset
   346
     *      RFlexTimer timer;
hgs
parents:
diff changeset
   347
     *      
hgs
parents:
diff changeset
   348
     *      User:LeaveIfError( timer.Connect() );
hgs
parents:
diff changeset
   349
     *      timer.Configure( KWindow32 );
hgs
parents:
diff changeset
   350
     *      timer.After( status, KInterval32 );
hgs
parents:
diff changeset
   351
     *      
hgs
parents:
diff changeset
   352
     *      User::WaitForRequest( status ); // Wait timer to expire, synchronous
hgs
parents:
diff changeset
   353
     *          .
hgs
parents:
diff changeset
   354
     *          .
hgs
parents:
diff changeset
   355
     *          .
hgs
parents:
diff changeset
   356
     *      timer.Close();  // Close the handle
hgs
parents:
diff changeset
   357
     * @endcode 
hgs
parents:
diff changeset
   358
     */
hgs
parents:
diff changeset
   359
    IMPORT_C void After( TRequestStatus& aStatus,
hgs
parents:
diff changeset
   360
                         TTimeIntervalMicroSeconds32 aInterval );
hgs
parents:
diff changeset
   361
    
hgs
parents:
diff changeset
   362
    /**
hgs
parents:
diff changeset
   363
     * An asynchronous timeout request to the flexible timer server.
hgs
parents:
diff changeset
   364
     * Fire timer at latest on the given 64-bit interval.
hgs
parents:
diff changeset
   365
     * @param aStatus active object to be used for getting responses.   
hgs
parents:
diff changeset
   366
     * @param aInterval the interval value until which the timer must expire.   
hgs
parents:
diff changeset
   367
     * @panic RFlexTimer 1  aInterval is negative
hgs
parents:
diff changeset
   368
     * @panic RFlexTimer 15 Timer is already active. Wait it to expire or
hgs
parents:
diff changeset
   369
     * cancel it first.
hgs
parents:
diff changeset
   370
     * @panic RFlexTimer 24 aInterval is too big (max 730 days)
hgs
parents:
diff changeset
   371
     * 
hgs
parents:
diff changeset
   372
     * Example:
hgs
parents:
diff changeset
   373
     * @code
hgs
parents:
diff changeset
   374
     *      const TTimeIntervalMicroSeconds KInterval64( 300000000 ); // 5 mins
hgs
parents:
diff changeset
   375
     *
hgs
parents:
diff changeset
   376
     *      TRequestStatus status;
hgs
parents:
diff changeset
   377
     *      RFlexTimer timer;
hgs
parents:
diff changeset
   378
     *      
hgs
parents:
diff changeset
   379
     *      User::LeaveIfError( timer.Connect() );
hgs
parents:
diff changeset
   380
     *      timer.After( status, KInterval64 );
hgs
parents:
diff changeset
   381
     *      
hgs
parents:
diff changeset
   382
     *      User::WaitForRequest( status ); // Wait timer to expire, synchronous
hgs
parents:
diff changeset
   383
     *          .
hgs
parents:
diff changeset
   384
     *          .
hgs
parents:
diff changeset
   385
     *          .
hgs
parents:
diff changeset
   386
     *      timer.Close();  // Close the handle
hgs
parents:
diff changeset
   387
     * @endcode
hgs
parents:
diff changeset
   388
     */
hgs
parents:
diff changeset
   389
    IMPORT_C void After( TRequestStatus& aStatus,
hgs
parents:
diff changeset
   390
                         TTimeIntervalMicroSeconds aInterval );
hgs
parents:
diff changeset
   391
hgs
parents:
diff changeset
   392
    /**
hgs
parents:
diff changeset
   393
     * An asynchronous timeout request to the flexible timer server.
hgs
parents:
diff changeset
   394
     * Fire timer at latest after the given number of system ticks.
hgs
parents:
diff changeset
   395
     * 
hgs
parents:
diff changeset
   396
     * By default the system tick is 1/64 second. The exact value for one
hgs
parents:
diff changeset
   397
     * system tick can be retrieve via Symbian OS HAL API:
hgs
parents:
diff changeset
   398
     * 
hgs
parents:
diff changeset
   399
     * @code
hgs
parents:
diff changeset
   400
     *      TInt tickInMicroSeconds;
hgs
parents:
diff changeset
   401
     *      HAL::Get( HAL::ESystemTickPeriod, tickInMicroSeconds );
hgs
parents:
diff changeset
   402
     * @endcode
hgs
parents:
diff changeset
   403
     * 
hgs
parents:
diff changeset
   404
     * @param aStatus active object to be used for getting responses.
hgs
parents:
diff changeset
   405
     * @param aTicks the interval value until which the timer must expire. 	
hgs
parents:
diff changeset
   406
     * @panic RFlexTimer 2  aTicks is negative
hgs
parents:
diff changeset
   407
     * @panic RFlexTimer 15 Timer is already active. Wait it to expire or
hgs
parents:
diff changeset
   408
     * cancel it first.
hgs
parents:
diff changeset
   409
     * 
hgs
parents:
diff changeset
   410
     * Example:
hgs
parents:
diff changeset
   411
     * @code
hgs
parents:
diff changeset
   412
     *      const TInt KIntervalInTicks( 57600 ); // 15 mins (1 tick = 15625 microseconds)
hgs
parents:
diff changeset
   413
     *
hgs
parents:
diff changeset
   414
     *      TRequestStatus status;
hgs
parents:
diff changeset
   415
     *      RFlexTimer timer;
hgs
parents:
diff changeset
   416
     *      
hgs
parents:
diff changeset
   417
     *      User::LeaveIfError( timer.Connect() );
hgs
parents:
diff changeset
   418
     *      timer.AfterTicks( status, KIntervalInTicks );
hgs
parents:
diff changeset
   419
     *      
hgs
parents:
diff changeset
   420
     *      User::WaitForRequest( status ); // Wait timer to expire, synchronous
hgs
parents:
diff changeset
   421
     *          .
hgs
parents:
diff changeset
   422
     *          .
hgs
parents:
diff changeset
   423
     *          .
hgs
parents:
diff changeset
   424
     *      timer.Close();  // Close the handle
hgs
parents:
diff changeset
   425
     * @endcode
hgs
parents:
diff changeset
   426
     */
hgs
parents:
diff changeset
   427
    IMPORT_C void AfterTicks( TRequestStatus& aStatus, TInt aTicks );
hgs
parents:
diff changeset
   428
hgs
parents:
diff changeset
   429
    /**
hgs
parents:
diff changeset
   430
     * An asynchronous timeout request to the flexible timer server.
hgs
parents:
diff changeset
   431
     * Fire timer between at latest by the given time value. If the system
hgs
parents:
diff changeset
   432
     * time changes before the timer requested with At-function expires, it
hgs
parents:
diff changeset
   433
     * will cancel itself. This will result in the aStatus argument to have
hgs
parents:
diff changeset
   434
     * KErrAbort-value.
hgs
parents:
diff changeset
   435
     * @param aStatus active object to be used for getting responses.
hgs
parents:
diff changeset
   436
     * @param aTime indicates the latest system-time when this timer should
hgs
parents:
diff changeset
   437
     * be fired.
hgs
parents:
diff changeset
   438
     * @panic RFlexTimer 3  aTime is in the past
hgs
parents:
diff changeset
   439
     * @panic RFlexTimer 15 Timer is already active. Wait it to expire or
hgs
parents:
diff changeset
   440
     * cancel it first.
hgs
parents:
diff changeset
   441
     * @panic RFlexTimer 24 aTime is too far in the future (max 730 days)
hgs
parents:
diff changeset
   442
     * 
hgs
parents:
diff changeset
   443
     * Example:
hgs
parents:
diff changeset
   444
     * @code
hgs
parents:
diff changeset
   445
     *      const TTimeIntervalMinutes KWaitTime( 5 );
hgs
parents:
diff changeset
   446
     *      
hgs
parents:
diff changeset
   447
     *      TRequestStatus status;
hgs
parents:
diff changeset
   448
     *      RFlexTimer timer;
hgs
parents:
diff changeset
   449
     *      User::LeaveIfError( timer.Connect() );
hgs
parents:
diff changeset
   450
     *      
hgs
parents:
diff changeset
   451
     *      TTime now;
hgs
parents:
diff changeset
   452
     *      now.HomeTime();
hgs
parents:
diff changeset
   453
     *
hgs
parents:
diff changeset
   454
     *      timer.At( status, now + KWaitTime );
hgs
parents:
diff changeset
   455
     *      
hgs
parents:
diff changeset
   456
     *      User::WaitForRequest( status ); // Wait timer to expire, synchronous
hgs
parents:
diff changeset
   457
     *          .
hgs
parents:
diff changeset
   458
     *          .
hgs
parents:
diff changeset
   459
     *          .
hgs
parents:
diff changeset
   460
     *      timer.Close();  // Close the handle
hgs
parents:
diff changeset
   461
     * @endcode
hgs
parents:
diff changeset
   462
     */
hgs
parents:
diff changeset
   463
    IMPORT_C void At( TRequestStatus& aStatus, const TTime& aTime );
hgs
parents:
diff changeset
   464
hgs
parents:
diff changeset
   465
    /**
hgs
parents:
diff changeset
   466
     * An asynchronous timeout request to the flexible timer server.
hgs
parents:
diff changeset
   467
     * Fire timer between at latest by the given UTC (Coordinated Universal
hgs
parents:
diff changeset
   468
     * Time) time value. If the system time changes before the timer requested
hgs
parents:
diff changeset
   469
     * with AtUTC-function expires, it will cancel itself. This will result in
hgs
parents:
diff changeset
   470
     * the aStatus argument to have KErrAbort-value.
hgs
parents:
diff changeset
   471
     * @param aStatus active object to be used for getting responses.
hgs
parents:
diff changeset
   472
     * @param aTime indicates the latest UTC time when this timer should be
hgs
parents:
diff changeset
   473
     * fired. 
hgs
parents:
diff changeset
   474
     * @panic RFlexTimer 4  aTime is in the past
hgs
parents:
diff changeset
   475
     * @panic RFlexTimer 15 Timer is already active. Wait it to expire or
hgs
parents:
diff changeset
   476
     * cancel it first.
hgs
parents:
diff changeset
   477
     * @panic RFlexTimer 24 aTime is too far in the future (max 730 days)
hgs
parents:
diff changeset
   478
     * 
hgs
parents:
diff changeset
   479
     * Example:
hgs
parents:
diff changeset
   480
     * @code
hgs
parents:
diff changeset
   481
     *      const TTimeIntervalMinutes KWaitTime( 5 );
hgs
parents:
diff changeset
   482
     *
hgs
parents:
diff changeset
   483
     *      TRequestStatus status;
hgs
parents:
diff changeset
   484
     *      RFlexTimer timer;
hgs
parents:
diff changeset
   485
     *      User::LeaveIfError( timer.Connect() );
hgs
parents:
diff changeset
   486
     *
hgs
parents:
diff changeset
   487
     *      TTime nowUtc;
hgs
parents:
diff changeset
   488
     *      nowUtc.UniversalTime();
hgs
parents:
diff changeset
   489
     *
hgs
parents:
diff changeset
   490
     *      timer.At( status, nowUtc + KWaitTime );
hgs
parents:
diff changeset
   491
     *
hgs
parents:
diff changeset
   492
     *      User::WaitForRequest( status ); // Wait timer to expire, synchronous
hgs
parents:
diff changeset
   493
     *          .
hgs
parents:
diff changeset
   494
     *          .
hgs
parents:
diff changeset
   495
     *          .
hgs
parents:
diff changeset
   496
     *      timer.Close();  // Close the handle
hgs
parents:
diff changeset
   497
     * @endcode
hgs
parents:
diff changeset
   498
     */
hgs
parents:
diff changeset
   499
    IMPORT_C void AtUTC( TRequestStatus& aStatus, const TTime& aTime );
hgs
parents:
diff changeset
   500
hgs
parents:
diff changeset
   501
    /**
hgs
parents:
diff changeset
   502
     * Sets the window size in which alignment is possible for the timer.
hgs
parents:
diff changeset
   503
     * This is a synchronous command - it will return only after the server
hgs
parents:
diff changeset
   504
     * has completed the configuration message. If the timer is already
hgs
parents:
diff changeset
   505
     * running, it will return KErrInUse.
hgs
parents:
diff changeset
   506
     * 
hgs
parents:
diff changeset
   507
     * If user is not calling this function in prior to start timer, default
hgs
parents:
diff changeset
   508
     * value will be used as time window. Default value is currently 20%
hgs
parents:
diff changeset
   509
     * of total timer running time 
hgs
parents:
diff changeset
   510
     * (0.2 * (requested_expiry_time - current_time)) and this value is in 
hgs
parents:
diff changeset
   511
     * subject to change.
hgs
parents:
diff changeset
   512
     * 
hgs
parents:
diff changeset
   513
	 * If the user wishes to restore the default window size behaviour,
hgs
parents:
diff changeset
   514
     * a new timer is needed. 
hgs
parents:
diff changeset
   515
	 *
hgs
parents:
diff changeset
   516
     * Giving zero value as aWindowSize parameter, means that timer is fired
hgs
parents:
diff changeset
   517
     * precisely at requested time.
hgs
parents:
diff changeset
   518
	 *
hgs
parents:
diff changeset
   519
     * @param aWindowSize is the window size in 32-bit microseconds in which
hgs
parents:
diff changeset
   520
     * alignment is possible.
hgs
parents:
diff changeset
   521
     *
hgs
parents:
diff changeset
   522
     * @return KErrNone on success, KErrInUse if timer is set (wait it to be
hgs
parents:
diff changeset
   523
     * expired or cancel it before configuring). Otherwise returns one of the 
hgs
parents:
diff changeset
   524
     * system-wide error codes.
hgs
parents:
diff changeset
   525
     *
hgs
parents:
diff changeset
   526
     * @panic RFlexTimer 5  aWindowSize is negative
hgs
parents:
diff changeset
   527
     * 
hgs
parents:
diff changeset
   528
     * Example:
hgs
parents:
diff changeset
   529
     * @code
hgs
parents:
diff changeset
   530
     *      const TTimeIntervalMicroSeconds32 KWindow32( 120000000 ); // 2 mins
hgs
parents:
diff changeset
   531
     *
hgs
parents:
diff changeset
   532
     *      RFlexTimer timer;
hgs
parents:
diff changeset
   533
     *      User::LeaveIfError( timer.Connect() );
hgs
parents:
diff changeset
   534
     *      
hgs
parents:
diff changeset
   535
     *      timer.Configure( KWindow32 );
hgs
parents:
diff changeset
   536
     *          .
hgs
parents:
diff changeset
   537
     *          .
hgs
parents:
diff changeset
   538
     *          .
hgs
parents:
diff changeset
   539
     *      timer.Close();  // Close the handle
hgs
parents:
diff changeset
   540
     * @endcode
hgs
parents:
diff changeset
   541
     */
hgs
parents:
diff changeset
   542
    IMPORT_C TInt Configure( TTimeIntervalMicroSeconds32 aWindowSize );
hgs
parents:
diff changeset
   543
    
hgs
parents:
diff changeset
   544
    /**
hgs
parents:
diff changeset
   545
     * This function overloads the Configure-function with 64-bit parameters.
hgs
parents:
diff changeset
   546
     * 
hgs
parents:
diff changeset
   547
     * @param aWindowSize is the window size in 64-bit microseconds in which
hgs
parents:
diff changeset
   548
     * alignment is possible.
hgs
parents:
diff changeset
   549
     * 
hgs
parents:
diff changeset
   550
     * @return KErrNone on success, KErrInUse if timer is set, wait it to 
hgs
parents:
diff changeset
   551
     * expire or cancel it before configuring. Otherwise returns one of the 
hgs
parents:
diff changeset
   552
     * system-wide error codes.
hgs
parents:
diff changeset
   553
     * 
hgs
parents:
diff changeset
   554
     * @panic RFlexTimer 5  aWindowSize is negative
hgs
parents:
diff changeset
   555
     * @panic RFlexTimer 24 aWindowSize is too big (max 730 days)
hgs
parents:
diff changeset
   556
     * 
hgs
parents:
diff changeset
   557
     * @see TInt Configure( TTimeIntervalMicroSeconds32 )
hgs
parents:
diff changeset
   558
     * 
hgs
parents:
diff changeset
   559
     * Example:
hgs
parents:
diff changeset
   560
     * @code
hgs
parents:
diff changeset
   561
     *      const TTimeIntervalMicroSeconds KWindow64( 120000000 ); // 2 mins
hgs
parents:
diff changeset
   562
     *
hgs
parents:
diff changeset
   563
     *      RFlexTimer timer;
hgs
parents:
diff changeset
   564
     *      User::LeaveIfError( timer.Connect() );
hgs
parents:
diff changeset
   565
     *      
hgs
parents:
diff changeset
   566
     *      timer.Configure( KWindow64 );
hgs
parents:
diff changeset
   567
     *          .
hgs
parents:
diff changeset
   568
     *          .
hgs
parents:
diff changeset
   569
     *          .
hgs
parents:
diff changeset
   570
     *      timer.Close();  // Close the handle
hgs
parents:
diff changeset
   571
     * @endcode
hgs
parents:
diff changeset
   572
     */
hgs
parents:
diff changeset
   573
    IMPORT_C TInt Configure( TTimeIntervalMicroSeconds aWindowSize );
hgs
parents:
diff changeset
   574
hgs
parents:
diff changeset
   575
private:
hgs
parents:
diff changeset
   576
    
hgs
parents:
diff changeset
   577
    /**
hgs
parents:
diff changeset
   578
     * Gets the version number.
hgs
parents:
diff changeset
   579
     * @return The version.
hgs
parents:
diff changeset
   580
     */
hgs
parents:
diff changeset
   581
    TVersion Version() const;
hgs
parents:
diff changeset
   582
hgs
parents:
diff changeset
   583
    /**
hgs
parents:
diff changeset
   584
     * Connects to the server. If server does not exist, it is created.
hgs
parents:
diff changeset
   585
     * @return KErrNone on success. Otherwise returns one of the system-wide
hgs
parents:
diff changeset
   586
     * error codes.
hgs
parents:
diff changeset
   587
     */
hgs
parents:
diff changeset
   588
    TInt StartServer();
hgs
parents:
diff changeset
   589
hgs
parents:
diff changeset
   590
    };
hgs
parents:
diff changeset
   591
hgs
parents:
diff changeset
   592
#endif // RFLEXTIMER_H
hgs
parents:
diff changeset
   593
hgs
parents:
diff changeset
   594
// End of File