usbengines/usbotgwatcher/src/cusbstatehostdelayhandle.cpp
author hgs
Fri, 23 Apr 2010 23:42:54 +0300
changeset 45 718eb10f3711
parent 44 5323ec7dc425
child 20 a15c582fbf97
permissions -rw-r--r--
201005_3
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
44
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
* Copyright (c) 2008-2009 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:  Implementation
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
#include <usbuinotif.h>
hgs
parents:
diff changeset
    20
hgs
parents:
diff changeset
    21
#include "cusbstatehostdelayhandle.h"
hgs
parents:
diff changeset
    22
#ifndef STIF
hgs
parents:
diff changeset
    23
#include "cusbnotifmanager.h"
hgs
parents:
diff changeset
    24
#else
hgs
parents:
diff changeset
    25
#include "mockcusbnotifmanager.h"
hgs
parents:
diff changeset
    26
#endif
hgs
parents:
diff changeset
    27
hgs
parents:
diff changeset
    28
#include "errors.h"
hgs
parents:
diff changeset
    29
#include "debug.h"
hgs
parents:
diff changeset
    30
#include "panic.h"
hgs
parents:
diff changeset
    31
hgs
parents:
diff changeset
    32
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    33
// 
hgs
parents:
diff changeset
    34
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    35
//
hgs
parents:
diff changeset
    36
CUsbStateHostDelayHandle::CUsbStateHostDelayHandle(CUsbOtgWatcher* aWatcher) :
hgs
parents:
diff changeset
    37
    CUsbStateHostHandle(aWatcher)
hgs
parents:
diff changeset
    38
    {
hgs
parents:
diff changeset
    39
    }
hgs
parents:
diff changeset
    40
hgs
parents:
diff changeset
    41
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    42
// 
hgs
parents:
diff changeset
    43
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    44
//
hgs
parents:
diff changeset
    45
CUsbStateHostDelayHandle* CUsbStateHostDelayHandle::NewL(CUsbOtgWatcher* aWatcher)
hgs
parents:
diff changeset
    46
    {
hgs
parents:
diff changeset
    47
        FLOG( _L( "[USBOTGWATCHER]\tCUsbStateHostDelayHandle::NewL" ) );
hgs
parents:
diff changeset
    48
hgs
parents:
diff changeset
    49
    CUsbStateHostDelayHandle* self = new (ELeave) CUsbStateHostDelayHandle(aWatcher);
hgs
parents:
diff changeset
    50
    CleanupStack::PushL(self);
hgs
parents:
diff changeset
    51
    self->ConstructL();
hgs
parents:
diff changeset
    52
    CleanupStack::Pop(self);
hgs
parents:
diff changeset
    53
    return self;
hgs
parents:
diff changeset
    54
    }
hgs
parents:
diff changeset
    55
hgs
parents:
diff changeset
    56
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    57
// 
hgs
parents:
diff changeset
    58
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    59
//
hgs
parents:
diff changeset
    60
void CUsbStateHostDelayHandle::ConstructL()
hgs
parents:
diff changeset
    61
    {
hgs
parents:
diff changeset
    62
        FLOG( _L( "[USBOTGWATCHER]\tCUsbStateHostDelayHandle::ConstructL" ) );
hgs
parents:
diff changeset
    63
hgs
parents:
diff changeset
    64
    iTooMuchPowerTimer = CUsbTimer::NewL(this, ETooMuchPowerRequiredTimer);
hgs
parents:
diff changeset
    65
    iDriversNotFoundTimer = CUsbTimer::NewL(this, EDriversNotFoundTimer);
hgs
parents:
diff changeset
    66
hgs
parents:
diff changeset
    67
    }
hgs
parents:
diff changeset
    68
hgs
parents:
diff changeset
    69
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    70
// 
hgs
parents:
diff changeset
    71
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    72
//
hgs
parents:
diff changeset
    73
CUsbStateHostDelayHandle::~CUsbStateHostDelayHandle()
hgs
parents:
diff changeset
    74
    {
hgs
parents:
diff changeset
    75
        FLOG( _L( "[USBOTGWATCHER]\tCUsbStateHostDelayHandle::~CUsbStateHostDelayHandle" ) );
hgs
parents:
diff changeset
    76
hgs
parents:
diff changeset
    77
    delete iTooMuchPowerTimer;
hgs
parents:
diff changeset
    78
    delete iDriversNotFoundTimer;
hgs
parents:
diff changeset
    79
    }
hgs
parents:
diff changeset
    80
hgs
parents:
diff changeset
    81
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    82
// 
hgs
parents:
diff changeset
    83
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    84
//
hgs
parents:
diff changeset
    85
TUsbStateIds CUsbStateHostDelayHandle::Id()
hgs
parents:
diff changeset
    86
    {
hgs
parents:
diff changeset
    87
        FLOG( _L( "[USBOTGWATCHER]\tCUsbStateHostDelayHandle::Id" ) );
hgs
parents:
diff changeset
    88
hgs
parents:
diff changeset
    89
    return EUsbStateHostDelayHandle;
hgs
parents:
diff changeset
    90
    }
hgs
parents:
diff changeset
    91
hgs
parents:
diff changeset
    92
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    93
// 
hgs
parents:
diff changeset
    94
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    95
//
hgs
parents:
diff changeset
    96
void CUsbStateHostDelayHandle::JustAdvancedToThisStateL()
hgs
parents:
diff changeset
    97
    {
hgs
parents:
diff changeset
    98
        FLOG( _L( "[USBOTGWATCHER]\tCUsbStateHostDelayHandle::JustAdvancedToThisStateL" ) );
hgs
parents:
diff changeset
    99
        // first do something specific to entering this state
hgs
parents:
diff changeset
   100
        // nothing by now, but something in the future
hgs
parents:
diff changeset
   101
        
hgs
parents:
diff changeset
   102
        // then do general things, defined in superclass
hgs
parents:
diff changeset
   103
        CUsbStateHostHandle::JustAdvancedToThisStateL();
hgs
parents:
diff changeset
   104
    }
hgs
parents:
diff changeset
   105
hgs
parents:
diff changeset
   106
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   107
// 
hgs
parents:
diff changeset
   108
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   109
//
hgs
parents:
diff changeset
   110
void CUsbStateHostDelayHandle::JustBeforeLeavingThisStateL()
hgs
parents:
diff changeset
   111
    {
hgs
parents:
diff changeset
   112
    iTooMuchPowerTimer->Cancel();
hgs
parents:
diff changeset
   113
    iDriversNotFoundTimer->Cancel();
hgs
parents:
diff changeset
   114
    
hgs
parents:
diff changeset
   115
    // do general things for error handling 
hgs
parents:
diff changeset
   116
    CUsbStateHostHandle::JustBeforeLeavingThisStateL();
hgs
parents:
diff changeset
   117
    }
hgs
parents:
diff changeset
   118
hgs
parents:
diff changeset
   119
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   120
// 
hgs
parents:
diff changeset
   121
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   122
//
hgs
parents:
diff changeset
   123
void CUsbStateHostDelayHandle::DoHandleL()
hgs
parents:
diff changeset
   124
    {
hgs
parents:
diff changeset
   125
        FTRACE( FPrint(_L( "[USBOTGWATCHER]\tCUsbStateHostDelayHandle::DoHandleL iWhat = %d" ), iWhat));
hgs
parents:
diff changeset
   126
hgs
parents:
diff changeset
   127
    switch (iWhat)
hgs
parents:
diff changeset
   128
        {
hgs
parents:
diff changeset
   129
        case EUsbWatcherErrDriversNotFound:
hgs
parents:
diff changeset
   130
            {
hgs
parents:
diff changeset
   131
            FLOG( _L( "[USBOTGWATCHER]\tCUsbStateHostDelayHandle::DoHandleL DriversNotFound" ) );
hgs
parents:
diff changeset
   132
                
hgs
parents:
diff changeset
   133
            iDriversNotFoundTimer->After(KTimeDriversNotFound);
hgs
parents:
diff changeset
   134
            break;
hgs
parents:
diff changeset
   135
                
hgs
parents:
diff changeset
   136
            }
hgs
parents:
diff changeset
   137
hgs
parents:
diff changeset
   138
        case EUsbWatcherErrDeviceRequiresTooMuchPowerOnEnumeration:
hgs
parents:
diff changeset
   139
            {
hgs
parents:
diff changeset
   140
                FLOG( _L( "[USBOTGWATCHER]\tCUsbStateHostDelayHandle::DoHandleL EUsbWatcherErrDeviceRequiresTooMuchPowerOnEnumeration" ) );
hgs
parents:
diff changeset
   141
hgs
parents:
diff changeset
   142
            iTooMuchPowerTimer->After(KTimeTooMuchPowerRequired);
hgs
parents:
diff changeset
   143
            break;
hgs
parents:
diff changeset
   144
            }
hgs
parents:
diff changeset
   145
hgs
parents:
diff changeset
   146
        default:
hgs
parents:
diff changeset
   147
            {
hgs
parents:
diff changeset
   148
                FLOG( _L( "[USBOTGWATCHER]\tCUsbStateHostDelayHandle::DoHandleL Pass request to CUsbStateHostHandle" ) );
hgs
parents:
diff changeset
   149
                Panic(EUnexpectedSituationToHandle);
hgs
parents:
diff changeset
   150
            break;
hgs
parents:
diff changeset
   151
            }
hgs
parents:
diff changeset
   152
        }
hgs
parents:
diff changeset
   153
    }
hgs
parents:
diff changeset
   154
hgs
parents:
diff changeset
   155
/////////////////////////////////////////////////////////////////////////////////////
hgs
parents:
diff changeset
   156
// From VBus observer
hgs
parents:
diff changeset
   157
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   158
// 
hgs
parents:
diff changeset
   159
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   160
//
hgs
parents:
diff changeset
   161
void CUsbStateHostDelayHandle::VBusUpL()
hgs
parents:
diff changeset
   162
    {
hgs
parents:
diff changeset
   163
        FLOG( _L( "[USBOTGWATCHER]\tCUsbStateHostDelayHandle::VBusUpL" ) );
hgs
parents:
diff changeset
   164
        // this is not expected, due to in this state vbus already up, since entering the state
hgs
parents:
diff changeset
   165
        Panic(EVBusUpNotExpected);
hgs
parents:
diff changeset
   166
    }
hgs
parents:
diff changeset
   167
hgs
parents:
diff changeset
   168
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   169
// 
hgs
parents:
diff changeset
   170
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   171
//
hgs
parents:
diff changeset
   172
void CUsbStateHostDelayHandle::VBusDownL()
hgs
parents:
diff changeset
   173
    {
hgs
parents:
diff changeset
   174
        FLOG( _L( "[USBOTGWATCHER]\tCUsbStateHostDelayHandle::VBusDownL" ) );
hgs
parents:
diff changeset
   175
        // this is not expected, due to in this state vbus up during all the lifetime
hgs
parents:
diff changeset
   176
        Panic(EVBusDownNotExpected);
hgs
parents:
diff changeset
   177
    }
hgs
parents:
diff changeset
   178
hgs
parents:
diff changeset
   179
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   180
// 
hgs
parents:
diff changeset
   181
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   182
//
hgs
parents:
diff changeset
   183
void CUsbStateHostDelayHandle::VBusErrorL()
hgs
parents:
diff changeset
   184
    {
hgs
parents:
diff changeset
   185
        FLOG( _L( "[USBOTGWATCHER]\tCUsbStateHostDelayHandle::VBusErrorL" ) );
hgs
parents:
diff changeset
   186
        iWatcher->Usb().BusClearError();
hgs
parents:
diff changeset
   187
        HandleL(EUsbWatcherErrDeviceRequiresTooMuchPower, EUsbStateHostHandle);
hgs
parents:
diff changeset
   188
    }
hgs
parents:
diff changeset
   189
hgs
parents:
diff changeset
   190
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   191
// this will drop VBus in a while => 
hgs
parents:
diff changeset
   192
// handle it in another state
hgs
parents:
diff changeset
   193
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   194
//
hgs
parents:
diff changeset
   195
void CUsbStateHostDelayHandle::AVBusErrorL()
hgs
parents:
diff changeset
   196
    {
hgs
parents:
diff changeset
   197
        FLOG( _L( "[USBOTGWATCHER]\tCUsbStateHostDelayHandle::AVBusErrorL" ) );
hgs
parents:
diff changeset
   198
        HandleL(EUsbWatcherErrDeviceRequiresTooMuchPower, EUsbStateHostHandle);
hgs
parents:
diff changeset
   199
    }
hgs
parents:
diff changeset
   200
hgs
parents:
diff changeset
   201
// From Host Event notification observer
hgs
parents:
diff changeset
   202
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   203
// 
hgs
parents:
diff changeset
   204
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   205
//
hgs
parents:
diff changeset
   206
void CUsbStateHostDelayHandle::DeviceAttachedL(
hgs
parents:
diff changeset
   207
        TDeviceEventInformation aDevEventInfo)
hgs
parents:
diff changeset
   208
    {
hgs
parents:
diff changeset
   209
        FLOG( _L( "[USBOTGWATCHER]\tCUsbStateHostDelayHandle::DeviceAttachedL" ) );
hgs
parents:
diff changeset
   210
hgs
parents:
diff changeset
   211
        ChangeHostStateL(EUsbStateHostAInitiate);
hgs
parents:
diff changeset
   212
        iWatcher->DeviceAttachedL(aDevEventInfo);
hgs
parents:
diff changeset
   213
    }
hgs
parents:
diff changeset
   214
hgs
parents:
diff changeset
   215
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   216
// 
hgs
parents:
diff changeset
   217
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   218
//
hgs
parents:
diff changeset
   219
void CUsbStateHostDelayHandle::DeviceDetachedL(TDeviceEventInformation)
hgs
parents:
diff changeset
   220
    {
hgs
parents:
diff changeset
   221
        FLOG( _L( "[USBOTGWATCHER]\tCUsbStateHostDelayHandle::DeviceDetachedL" ) );
hgs
parents:
diff changeset
   222
        ChangeHostStateL(EUsbStateHostAInitiate);
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
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   228
//
hgs
parents:
diff changeset
   229
void CUsbStateHostDelayHandle::BadHubPositionL()
hgs
parents:
diff changeset
   230
    {
hgs
parents:
diff changeset
   231
        FLOG( _L( "[USBOTGWATCHER]\tCUsbStateHostDelayHandle::BadHubPositionL" ) );
hgs
parents:
diff changeset
   232
hgs
parents:
diff changeset
   233
        HandleL(EUsbWatcherHubsNotSupported, EUsbStateHostHandle);
hgs
parents:
diff changeset
   234
    }
hgs
parents:
diff changeset
   235
hgs
parents:
diff changeset
   236
hgs
parents:
diff changeset
   237
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   238
// 
hgs
parents:
diff changeset
   239
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   240
//
hgs
parents:
diff changeset
   241
void CUsbStateHostDelayHandle::SrpReceivedL()
hgs
parents:
diff changeset
   242
    {
hgs
parents:
diff changeset
   243
    FLOG( _L( "[USBOTGWATCHER]\tCUsbStateHostDelayHandle::SrpReceivedL" ) );
hgs
parents:
diff changeset
   244
    // srp is not expected due to vbus is up in thes state   
hgs
parents:
diff changeset
   245
    Panic(ESrpNotExpected);
hgs
parents:
diff changeset
   246
    }
hgs
parents:
diff changeset
   247
hgs
parents:
diff changeset
   248
// From TimerObserver
hgs
parents:
diff changeset
   249
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   250
// 
hgs
parents:
diff changeset
   251
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   252
//
hgs
parents:
diff changeset
   253
void CUsbStateHostDelayHandle::TimerElapsedL(TUsbTimerId aTimerId)
hgs
parents:
diff changeset
   254
    {
hgs
parents:
diff changeset
   255
    switch (aTimerId)
hgs
parents:
diff changeset
   256
        {
hgs
parents:
diff changeset
   257
        case ETooMuchPowerRequiredTimer:
hgs
parents:
diff changeset
   258
            {
hgs
parents:
diff changeset
   259
                FLOG( _L( "[USBOTGWATCHER]\tCUsbStateHostDelayHandle::TimerElapsedL - ETooMuchPowerRequiredTimer" ) );
hgs
parents:
diff changeset
   260
                HandleL(EUsbWatcherErrDeviceRequiresTooMuchPower, EUsbStateHostHandle);
hgs
parents:
diff changeset
   261
            break;
hgs
parents:
diff changeset
   262
            }
hgs
parents:
diff changeset
   263
        case EDriversNotFoundTimer:
hgs
parents:
diff changeset
   264
            {
hgs
parents:
diff changeset
   265
            FLOG( _L( "[USBOTGWATCHER]\tCUsbStateHostDelayHandle::TimerElapsedL - EDriversNotFoundTimer" ) );
hgs
parents:
diff changeset
   266
            HandleL(EUsbWatcherErrUnsupportedDevice, EUsbStateHostHandle);
hgs
parents:
diff changeset
   267
hgs
parents:
diff changeset
   268
            break;
hgs
parents:
diff changeset
   269
            }
hgs
parents:
diff changeset
   270
        default:
hgs
parents:
diff changeset
   271
            {
hgs
parents:
diff changeset
   272
                FLOG( _L( "[USBOTGWATCHER]\tCUsbStateHostDelayHandle::TimerElapsedL - Unknown timer" ) );
hgs
parents:
diff changeset
   273
            Panic(EWrongTimerId);
hgs
parents:
diff changeset
   274
            }
hgs
parents:
diff changeset
   275
        }
hgs
parents:
diff changeset
   276
    }