keepalive/flextimer/doc_pub/flextimer_for_clients_doxygen/flextimer_for_clients.dox
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:
hgs
parents:
diff changeset
    15
 *      Flexible timer documentation's main page
hgs
parents:
diff changeset
    16
 *
hgs
parents:
diff changeset
    17
 */
hgs
parents:
diff changeset
    18
hgs
parents:
diff changeset
    19
/*
hgs
parents:
diff changeset
    20
 * %version: 1 %
hgs
parents:
diff changeset
    21
 */
hgs
parents:
diff changeset
    22
hgs
parents:
diff changeset
    23
/**
hgs
parents:
diff changeset
    24
@mainpage
hgs
parents:
diff changeset
    25
hgs
parents:
diff changeset
    26
@section mainGeneral General
hgs
parents:
diff changeset
    27
hgs
parents:
diff changeset
    28
Flexible timers are timers for synchronizing network access. This is achieved
hgs
parents:
diff changeset
    29
by providing a timer service that instead of generating timeout at exact moment
hgs
parents:
diff changeset
    30
of time, generates timeout within given window of time. This allows several
hgs
parents:
diff changeset
    31
timeouts to be aligned, and only one wakeup is needed instead of many. This
hgs
parents:
diff changeset
    32
improves battery life. The improvement depends on the used bearer and its 
hgs
parents:
diff changeset
    33
configuration.
hgs
parents:
diff changeset
    34
hgs
parents:
diff changeset
    35
Flexible timers are designed to provided similar API with existing Symbian
hgs
parents:
diff changeset
    36
timers (RTimer, CTimer and CPeriodic), and (besides they extend the interfaces
hgs
parents:
diff changeset
    37
by providing 64-bit interface for After(). I.e. using At() for longer than 35
hgs
parents:
diff changeset
    38
minutes timers is not required.
hgs
parents:
diff changeset
    39
hgs
parents:
diff changeset
    40
@subsection mainYes When you should consider using Flexible timers 
hgs
parents:
diff changeset
    41
- If your timer can handle several minutes variation in expiration times @b AND
hgs
parents:
diff changeset
    42
- If your timer is used to trigger network connectivity @b AND
hgs
parents:
diff changeset
    43
- If your timer is long enough (> 5 min)
hgs
parents:
diff changeset
    44
hgs
parents:
diff changeset
    45
@subsection mainNo Who should NOT use Flexible timers
hgs
parents:
diff changeset
    46
- If you need accurate timing (in resolution of minutes) @b OR
hgs
parents:
diff changeset
    47
- If your timer is too rapid, i.e. less than 5 minutes @b OR
hgs
parents:
diff changeset
    48
- If you need timeout when phone is powered off @b OR
hgs
parents:
diff changeset
    49
- If you need reboot-proof timeouts
hgs
parents:
diff changeset
    50
hgs
parents:
diff changeset
    51
@section mainTimerWindow Concept
hgs
parents:
diff changeset
    52
hgs
parents:
diff changeset
    53
The main idea of flexible timer concept is that timers can expire @a early.
hgs
parents:
diff changeset
    54
The time how much earlier timer can expire, is called @b timer @b expiration 
hgs
parents:
diff changeset
    55
@b window (or just window).
hgs
parents:
diff changeset
    56
hgs
parents:
diff changeset
    57
For example, a timer that is started to expire after 10 minutes timer that 
hgs
parents:
diff changeset
    58
window is configured to 2 minutes can expire at any time between 8 to 10 
hgs
parents:
diff changeset
    59
minutes. See the figure below.
hgs
parents:
diff changeset
    60
hgs
parents:
diff changeset
    61
\image html FlexTimerWindowConcept.png
hgs
parents:
diff changeset
    62
hgs
parents:
diff changeset
    63
There are two reasons when timer can expire:
hgs
parents:
diff changeset
    64
-# The timer has reached the time it's set to be expired
hgs
parents:
diff changeset
    65
-# Another timer is expiring within this timer's window
hgs
parents:
diff changeset
    66
hgs
parents:
diff changeset
    67
In picture below is shown two set of periodical timers; normal timers and
hgs
parents:
diff changeset
    68
flexible timers. Each time a timer expires, it causes network access.
hgs
parents:
diff changeset
    69
hgs
parents:
diff changeset
    70
\image html FlexTimersExample.png
hgs
parents:
diff changeset
    71
hgs
parents:
diff changeset
    72
The picture also illustrates main differences between using normal and flexible
hgs
parents:
diff changeset
    73
timers:
hgs
parents:
diff changeset
    74
- number of network initializations decreases (12 vs. 6).
hgs
parents:
diff changeset
    75
- timers are being "drifted" (e.g. interval of Timer 2 is actually 12 minutes)
hgs
parents:
diff changeset
    76
hgs
parents:
diff changeset
    77
@section mainArchitecture Architecture
hgs
parents:
diff changeset
    78
hgs
parents:
diff changeset
    79
In picture below is illustrated components of flexible timers.
hgs
parents:
diff changeset
    80
hgs
parents:
diff changeset
    81
\image html FlexTimerComponents.png
hgs
parents:
diff changeset
    82
hgs
parents:
diff changeset
    83
When a client uses flexible timers, the actual timer request is forwarded to
hgs
parents:
diff changeset
    84
Flex Timer Server using Symbian's inter process communication (IPC). The
hgs
parents:
diff changeset
    85
biggest difference to normal timers is that flexible timers actually are run in
hgs
parents:
diff changeset
    86
different process than the client as the normal timers are run in local thread.
hgs
parents:
diff changeset
    87
hgs
parents:
diff changeset
    88
@section mainLimitations Limitations of flexible timers
hgs
parents:
diff changeset
    89
hgs
parents:
diff changeset
    90
@subsection mainTimerAccuracy Timer Accuracy
hgs
parents:
diff changeset
    91
hgs
parents:
diff changeset
    92
Although the timer can be set to expire in 1 microsecond accuracy, the actual
hgs
parents:
diff changeset
    93
accuracy can vary from 1/64 second (one system tick) to 1 second. It depends
hgs
parents:
diff changeset
    94
when the timer is set; timers are "rounded" to the next full second.
hgs
parents:
diff changeset
    95
hgs
parents:
diff changeset
    96
This implies that e.g. 1 microsecond periodic timer's period is 1 second; not
hgs
parents:
diff changeset
    97
1 microsecond.
hgs
parents:
diff changeset
    98
hgs
parents:
diff changeset
    99
As the flexible timer's implementation relies on system ticks, it's possible 
hgs
parents:
diff changeset
   100
that the timer expires 1/64 second (one system tick) too early.
hgs
parents:
diff changeset
   101
hgs
parents:
diff changeset
   102
I.e. the timer can expire from -1/64 second to +1 second when it is set.
hgs
parents:
diff changeset
   103
hgs
parents:
diff changeset
   104
@note If timer accuracy at this resolution is concern for you, you should not
hgs
parents:
diff changeset
   105
use flexible timers at all. Use normal timers instead.
hgs
parents:
diff changeset
   106
hgs
parents:
diff changeset
   107
@subsection mainMinValue Minimum timer value
hgs
parents:
diff changeset
   108
hgs
parents:
diff changeset
   109
The minimum timer value is 0 microsecond. Only exception is CFlexPeriodic's
hgs
parents:
diff changeset
   110
interval that can be 1 microseconds. 
hgs
parents:
diff changeset
   111
hgs
parents:
diff changeset
   112
@subsection mainMaxValue Maximum timer value
hgs
parents:
diff changeset
   113
hgs
parents:
diff changeset
   114
Maximum value for timer is 2 years (i.e. 730 days, 63072000 seconds).
hgs
parents:
diff changeset
   115
hgs
parents:
diff changeset
   116
@subsection mainMinWindow Minimum window value
hgs
parents:
diff changeset
   117
hgs
parents:
diff changeset
   118
The minimum value for timer window is zero microseconds.
hgs
parents:
diff changeset
   119
hgs
parents:
diff changeset
   120
@subsection mainMaxWindow Maximum window value
hgs
parents:
diff changeset
   121
hgs
parents:
diff changeset
   122
The maximum value for timer window is two years (i.e. 730 days, 63072000 
hgs
parents:
diff changeset
   123
seconds). 
hgs
parents:
diff changeset
   124
hgs
parents:
diff changeset
   125
The default value for window is 20% of the timer's value (e.g. 10 minutes timer
hgs
parents:
diff changeset
   126
has 2 minutes default window).
hgs
parents:
diff changeset
   127
hgs
parents:
diff changeset
   128
@subsection mainTimerDrifting Timer drifting
hgs
parents:
diff changeset
   129
hgs
parents:
diff changeset
   130
As the timer expiration can happen in timer expiration window, it usually
hgs
parents:
diff changeset
   131
causes periodic timers to "drift".
hgs
parents:
diff changeset
   132
hgs
parents:
diff changeset
   133
For example:
hgs
parents:
diff changeset
   134
hgs
parents:
diff changeset
   135
@c CPeriodic is started at 8 o'clock with 30 minute interval.
hgs
parents:
diff changeset
   136
It will then expire at 8.30, 9.00, ... 15.30, 16.00
hgs
parents:
diff changeset
   137
hgs
parents:
diff changeset
   138
If @c CFlexPeriodic is used as a timer it can possibly expire at
hgs
parents:
diff changeset
   139
8.30, 9.00, 9.28, 9.55, ... 15.15, 15.42 etc. 
hgs
parents:
diff changeset
   140
hgs
parents:
diff changeset
   141
@subsection mainReboot Reboot-proof
hgs
parents:
diff changeset
   142
hgs
parents:
diff changeset
   143
Flexible timers are @b not reboot-proof. I.e. after reboot all timers has to
hgs
parents:
diff changeset
   144
be set again.
hgs
parents:
diff changeset
   145
hgs
parents:
diff changeset
   146
@section mainHowTo How to start using flexible timers
hgs
parents:
diff changeset
   147
hgs
parents:
diff changeset
   148
The flexible timer API is designed to be as similar to normal Symbian timers
hgs
parents:
diff changeset
   149
as possible. 
hgs
parents:
diff changeset
   150
hgs
parents:
diff changeset
   151
In the table below is described Symbian OS timer and its corresponding flexible
hgs
parents:
diff changeset
   152
timer.
hgs
parents:
diff changeset
   153
hgs
parents:
diff changeset
   154
<table border=1 bordercolor="#84B0C7" cellspacing="0" align="center">
hgs
parents:
diff changeset
   155
<tr><td><b>Symbian OS timer</b></td><td><b>Flexible timer</b></td></tr>
hgs
parents:
diff changeset
   156
<tr><td><code>CPeriodic</code></td><td><code>CFlexPeriodic</code></td></tr>
hgs
parents:
diff changeset
   157
<tr><td><code>CTimer</code></td><td><code>CFlexTimer</code></td></tr>
hgs
parents:
diff changeset
   158
<tr><td><code>RTimer</code></td><td><code>RFlexTimer</code></td></tr>
hgs
parents:
diff changeset
   159
</table>
hgs
parents:
diff changeset
   160
hgs
parents:
diff changeset
   161
Using of flexible timer is easy and fun. There are only three following steps;
hgs
parents:
diff changeset
   162
hgs
parents:
diff changeset
   163
-# Add following line to MMP-file
hgs
parents:
diff changeset
   164
   @code 
hgs
parents:
diff changeset
   165
   LIBRARY flextimer.lib 
hgs
parents:
diff changeset
   166
   @endcode
hgs
parents:
diff changeset
   167
-# Include flexible timer's header to your code files, e.g. for periodic timer
hgs
parents:
diff changeset
   168
   @code
hgs
parents:
diff changeset
   169
   #include <flexperiodic.h>
hgs
parents:
diff changeset
   170
   @endcode
hgs
parents:
diff changeset
   171
-# Convert the used Symbian OS timers to flexible timers, e.g.
hgs
parents:
diff changeset
   172
   @code
hgs
parents:
diff changeset
   173
   //Old: CPeriodic* myTimer = CPeriodic::NewL( CActive::EPriorityStandard );
hgs
parents:
diff changeset
   174
   CFlexPeriodic* myTimer = CFlexPeriodic::NewL( CActive::EPriorityStandard );
hgs
parents:
diff changeset
   175
   ...
hgs
parents:
diff changeset
   176
   // By default the window is 20% of timer's values
hgs
parents:
diff changeset
   177
   myTimer->Start( myDelay, myInterval, myCallback ); // No changes
hgs
parents:
diff changeset
   178
   ...
hgs
parents:
diff changeset
   179
   myTimer->Cancel(); // No changes
hgs
parents:
diff changeset
   180
   delete myTimer; // No changes
hgs
parents:
diff changeset
   181
hgs
parents:
diff changeset
   182
   @endcode
hgs
parents:
diff changeset
   183
hgs
parents:
diff changeset
   184
More examples available in flexible timer's class documentation.
hgs
parents:
diff changeset
   185
hgs
parents:
diff changeset
   186
*/