wlan_bearer/wlanengine/wlan_common/wlanengine_common_3.1/src/core_operation_update_power_mode.cpp
changeset 0 c40eb8fe8501
equal deleted inserted replaced
-1:000000000000 0:c40eb8fe8501
       
     1 /*
       
     2 * Copyright (c) 2005-2006 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 the License "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:  Statemachine for updating power mode
       
    15 *
       
    16 */
       
    17 
       
    18 
       
    19 #include "core_operation_update_power_mode.h"
       
    20 #include "core_server.h"
       
    21 #include "core_tools.h"
       
    22 #include "am_debug.h"
       
    23 
       
    24 // ======== MEMBER FUNCTIONS ========
       
    25 
       
    26 // ---------------------------------------------------------------------------
       
    27 // ---------------------------------------------------------------------------
       
    28 //
       
    29 core_operation_update_power_mode_c::core_operation_update_power_mode_c(
       
    30     u32_t request_id,
       
    31     core_server_c* server,
       
    32     abs_core_driverif_c* drivers,
       
    33     abs_core_server_callback_c* adaptation ) :
       
    34     core_operation_base_c( core_operation_update_power_mode, request_id, server, drivers, adaptation,
       
    35         core_base_flag_connection_needed | core_base_flag_only_one_instance ),
       
    36     preferred_mode_m(
       
    37         server_m->get_core_settings().preferred_power_save_mode() ),
       
    38     power_mode_m( CORE_POWER_MODE_CAM )
       
    39     {
       
    40     DEBUG( "core_operation_update_power_mode_c::core_operation_update_power_mode_c()" );
       
    41     }
       
    42 
       
    43 // ---------------------------------------------------------------------------
       
    44 // ---------------------------------------------------------------------------
       
    45 //
       
    46 core_operation_update_power_mode_c::core_operation_update_power_mode_c(
       
    47     u32_t request_id,
       
    48     core_server_c* server,
       
    49     abs_core_driverif_c* drivers,
       
    50     abs_core_server_callback_c* adaptation,
       
    51     const core_power_save_mode_s& mode ) :
       
    52     core_operation_base_c( core_operation_update_power_mode, request_id, server, drivers, adaptation,
       
    53         core_base_flag_connection_needed | core_base_flag_only_one_instance ),
       
    54     preferred_mode_m( mode ),
       
    55     power_mode_m( CORE_POWER_MODE_CAM )
       
    56     {
       
    57     DEBUG( "core_operation_update_power_mode_c::core_operation_update_power_mode_c()" );
       
    58     }
       
    59 
       
    60 // ---------------------------------------------------------------------------
       
    61 // ---------------------------------------------------------------------------
       
    62 //
       
    63 core_operation_update_power_mode_c::~core_operation_update_power_mode_c()
       
    64     {
       
    65     DEBUG( "core_operation_update_power_mode_c::~core_operation_update_power_mode_c()" );
       
    66     }
       
    67     
       
    68 // ---------------------------------------------------------------------------
       
    69 // ---------------------------------------------------------------------------
       
    70 //
       
    71 core_error_e core_operation_update_power_mode_c::next_state()
       
    72     {
       
    73     DEBUG( "core_operation_update_power_mode_c::next_state()" );
       
    74     
       
    75     switch ( operation_state_m )
       
    76         {
       
    77         case core_state_init:
       
    78             {
       
    79             operation_state_m = core_state_req_set_power_mode;
       
    80 
       
    81             if ( !server_m->get_core_settings().is_driver_loaded() ||
       
    82                  !server_m->get_connection_data() )
       
    83                 {
       
    84                 DEBUG( "core_operation_update_power_mode_c::next_state() - not connected, no reason to set power save mode" );
       
    85 
       
    86                 return core_error_ok;
       
    87                 }
       
    88 
       
    89             /**
       
    90              * Determine the correct mode to use.
       
    91              */
       
    92             power_mode_m = determine_power_mode();
       
    93 
       
    94             const core_power_mode_s& current_mode(
       
    95                 server_m->get_core_settings().power_mode() );
       
    96 
       
    97             if( power_mode_m.mode == current_mode.mode &&
       
    98                 power_mode_m.wakeup_mode_light == current_mode.wakeup_mode_light &&
       
    99                 power_mode_m.wakeup_interval_light == current_mode.wakeup_interval_light &&
       
   100                 power_mode_m.wakeup_mode_deep == current_mode.wakeup_mode_deep &&
       
   101                 power_mode_m.wakeup_interval_deep == current_mode.wakeup_interval_deep )                
       
   102                 {
       
   103                 DEBUG1( "core_operation_update_power_mode_c::next_state() - power save mode (%u) already set",
       
   104                     power_mode_m.mode );
       
   105 
       
   106                 return core_error_ok;
       
   107                 }
       
   108 
       
   109 #ifdef _DEBUG
       
   110             if( power_mode_m.mode == core_power_mode_cam )
       
   111                 {
       
   112                 DEBUG( "core_operation_update_power_mode_c::next_state() - setting power mode to core_power_mode_cam" );
       
   113                 }
       
   114             else
       
   115                 {
       
   116                 DEBUG4( "core_operation_update_power_mode_c::next_state() - setting power mode to core_power_mode_ps (light %u, %u) (deep %u, %u)",
       
   117                     power_mode_m.wakeup_mode_light, power_mode_m.wakeup_interval_light,
       
   118                     power_mode_m.wakeup_mode_deep, power_mode_m.wakeup_interval_deep );
       
   119                 }
       
   120 #endif // _DEBUG
       
   121 
       
   122             drivers_m->set_power_mode(
       
   123                 request_id_m,
       
   124                 power_mode_m );
       
   125 
       
   126             break;
       
   127             }
       
   128         case core_state_req_set_power_mode:
       
   129             {
       
   130             DEBUG1( "core_operation_update_power_mode_c::next_state() - power save mode (%u) successfully set",
       
   131                 power_mode_m.mode );
       
   132 
       
   133             server_m->get_core_settings().set_power_mode( power_mode_m );
       
   134 
       
   135             return core_error_ok;
       
   136             }
       
   137         default:
       
   138             {
       
   139             ASSERT( false_t );
       
   140             }
       
   141         }
       
   142 
       
   143     return core_error_request_pending;
       
   144     }
       
   145 
       
   146 // ---------------------------------------------------------------------------
       
   147 // ---------------------------------------------------------------------------
       
   148 //
       
   149 core_power_mode_s core_operation_update_power_mode_c::determine_power_mode() const
       
   150     {
       
   151     DEBUG( "core_operation_update_power_mode_c::determine_power_mode()" );
       
   152 
       
   153     if( !server_m->get_device_settings().power_save_enabled )
       
   154         {
       
   155         DEBUG( "core_operation_update_power_mode_c::determine_power_mode() - CORE_POWER_MODE_CAM, disabled in settings" );
       
   156         
       
   157         return CORE_POWER_MODE_CAM;
       
   158         }
       
   159 
       
   160     if ( server_m->get_connection_data() &&
       
   161          server_m->get_connection_data()->iap_data().operating_mode() == core_operating_mode_ibss )
       
   162         {
       
   163         DEBUG( "core_operation_update_power_mode_c::determine_power_mode() - CORE_POWER_MODE_CAM, IBSS network" );
       
   164 
       
   165         return CORE_POWER_MODE_CAM;
       
   166         }
       
   167 
       
   168     if( preferred_mode_m.mode == core_power_save_mode_none )
       
   169         {
       
   170         DEBUG( "core_operation_update_power_mode_c::determine_power_mode() - CORE_POWER_MODE_CAM, preferred mode" );
       
   171 
       
   172         return CORE_POWER_MODE_CAM;        
       
   173         }
       
   174 
       
   175     if( preferred_mode_m.mode == core_power_save_mode_beacon )
       
   176         {
       
   177         DEBUG( "core_operation_update_power_mode_c::determine_power_mode() - CORE_POWER_MODE_PS_BEACON, preferred mode" );
       
   178 
       
   179         core_power_mode_s mode( CORE_POWER_MODE_PS_BEACON );
       
   180         mode.wakeup_interval_light = preferred_mode_m.wakeup_interval;
       
   181         mode.wakeup_interval_deep = preferred_mode_m.wakeup_interval;
       
   182 
       
   183         return mode;
       
   184         }
       
   185 
       
   186     if( preferred_mode_m.mode == core_power_save_mode_dtim )
       
   187         {
       
   188         DEBUG( "core_operation_update_power_mode_c::determine_power_mode() - CORE_POWER_MODE_PS_DTIM, preferred mode" );
       
   189 
       
   190         core_power_mode_s mode( CORE_POWER_MODE_PS_DTIM );
       
   191         mode.wakeup_interval_light = preferred_mode_m.wakeup_interval;
       
   192         mode.wakeup_interval_deep = preferred_mode_m.wakeup_interval;
       
   193 
       
   194         return mode;
       
   195         }
       
   196 
       
   197     u8_t wakeup_interval( 1 );
       
   198     bool_t is_power_save_test_success( true_t );
       
   199     if( server_m->get_connection_data() &&
       
   200         server_m->get_connection_data()->current_ap_data() )
       
   201         {                
       
   202         u32_t dtim_skip_interval(
       
   203             server_m->get_connection_data()->current_ap_data()->dtim_period() *
       
   204             server_m->get_connection_data()->current_ap_data()->beacon_interval() *
       
   205             MILLISECONDS_FROM_MICROSECONDS );
       
   206 
       
   207         /**
       
   208          * DTIM period can be zero if we haven't received a beacon from
       
   209          * the AP yet.
       
   210          */        
       
   211         if( dtim_skip_interval )
       
   212             {
       
   213             DEBUG1( "core_operation_update_power_mode_c::determine_power_mode() - max_dtim_skip_interval: %u",
       
   214                 server_m->get_device_settings().max_dtim_skip_interval );
       
   215             DEBUG1( "core_operation_update_power_mode_c::determine_power_mode() - dtim_skip_interval: %u",
       
   216                 dtim_skip_interval );
       
   217 
       
   218             while( dtim_skip_interval * ( wakeup_interval + 1 ) <= server_m->get_device_settings().max_dtim_skip_interval )
       
   219                 {
       
   220                 ++wakeup_interval;
       
   221                 }
       
   222             }
       
   223 
       
   224         core_mac_address_s bssid(
       
   225             server_m->get_connection_data()->current_ap_data()->bssid() );
       
   226         server_m->get_connection_data()->is_ap_power_save_test_run(
       
   227             bssid, is_power_save_test_success );
       
   228         }
       
   229 
       
   230     if( preferred_mode_m.mode == core_power_save_mode_dtim_skipping )
       
   231         {
       
   232         DEBUG( "core_operation_update_power_mode_c::determine_power_mode() - CORE_POWER_MODE_PS_DTIM, preferred mode" );
       
   233 
       
   234         core_power_mode_s mode( CORE_POWER_MODE_PS_DTIM );
       
   235         mode.wakeup_interval_light = wakeup_interval;
       
   236         mode.wakeup_interval_deep = wakeup_interval;
       
   237 
       
   238         return mode;
       
   239         }
       
   240 
       
   241     if( !is_power_save_test_success )
       
   242         {
       
   243         DEBUG( "core_operation_update_power_mode_c::determine_power_mode() - CORE_POWER_MODE_CAM, AP power save test failure" );
       
   244 
       
   245         return CORE_POWER_MODE_CAM;
       
   246         }
       
   247 
       
   248     DEBUG( "core_operation_update_power_mode_c::determine_power_mode() - CORE_POWER_MODE_PS" );
       
   249 
       
   250     core_power_mode_s mode( CORE_POWER_MODE_PS );
       
   251     mode.wakeup_interval_deep = wakeup_interval;
       
   252 
       
   253     return mode;
       
   254     }