diff -r 000000000000 -r 1e05558e2206 usbengines/usbotgwatcher/src/cusbstatehosthandle.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/usbengines/usbotgwatcher/src/cusbstatehosthandle.cpp Thu Dec 17 09:14:30 2009 +0200 @@ -0,0 +1,606 @@ +/* +* Copyright (c) 2008-2009 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: Implementation + * +*/ + + +#include + +#include "cusbstatehosthandle.h" +#ifndef STIF +#include "cusbnotifmanager.h" +#else +#include "mockcusbnotifmanager.h" +#endif + +#include "errors.h" +#include "debug.h" +#include "panic.h" + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +CUsbStateHostHandle::CUsbStateHostHandle(CUsbOtgWatcher* aWatcher) : + CUsbState(aWatcher) + { + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +CUsbStateHostHandle* CUsbStateHostHandle::NewL(CUsbOtgWatcher* aWatcher) + { + FLOG( _L( "[USBOTGWATCHER]\tCUsbStateHostAHost::NewL" ) ); + + CUsbStateHostHandle* self = new (ELeave) CUsbStateHostHandle(aWatcher); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return self; + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CUsbStateHostHandle::ConstructL() + { + FLOG( _L( "[USBOTGWATCHER]\tCUsbStateHostHandle::ConstructL" ) ); + + iTooMuchPowerTimer = CUsbTimer::NewL(this, ETooMuchPowerRequiredTimer); + + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +CUsbStateHostHandle::~CUsbStateHostHandle() + { + FLOG( _L( "[USBOTGWATCHER]\tCUsbStateHostHandle::~CUsbStateHostHandle" ) ); + + delete iTooMuchPowerTimer; + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +TUsbStateIds CUsbStateHostHandle::Id() + { + FLOG( _L( "[USBOTGWATCHER]\tCUsbStateHostHandle::Id" ) ); + + return EUsbStateHostHandle; + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CUsbStateHostHandle::JustAdvancedToThisStateL() + { + FLOG( _L( "[USBOTGWATCHER]\tCUsbStateHostHandle::JustAdvancedToThisStateL" ) ); + iWatcher->PrintStateToLog(); + + DoHandleL(); + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CUsbStateHostHandle::JustBeforeLeavingThisStateL() + { + iTooMuchPowerTimer->Cancel(); + iWatcher->NotifManager()->CloseAllNotifiers(); + } +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CUsbStateHostHandle::SetWhat(TInt aWhat) + { + iWhat = aWhat; + } + +// this means only one wait notifier at a time can be shown by this state +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CUsbStateHostHandle::WaitNotifierCompletedL(TInt /*aFeedback*/) + { + FLOG( _L( "[USBOTGWATCHER]\tCUsbStateHostHandle::WaitNotifierCompletedL" ) ); + switch (iWhat) + { + case EUsbWatcherErrDriversNotFound: + { + FLOG( _L( "[USBOTGWATCHER]\tCUsbStateHostHandle::WaitNotifierCompletedL DriversNotFound" ) ); + ChangeHostStateL(EUsbStateHostAInitiate); + break; + } + case EUsbWatcherHubsNotSupported: + { + FLOG( _L( "[USBOTGWATCHER]\tCUsbStateHostHandle::WaitNotifierCompletedL EUsbWatcherHubsNotSupported" ) ); + ChangeHostStateL(EUsbStateHostAInitiate); + break; + } + case EUsbWatcherErrDeviceRequiresTooMuchPower: + { + FLOG( _L( "[USBOTGWATCHER]\tCUsbStateHostHandle::WaitNotifierCompletedL EUsbWatcherErrDeviceRequiresTooMuchPower" ) ); + ChangeHostStateL(EUsbStateHostAInitiate); + break; + } + case EUsbWatcherErrDeviceRequiresTooMuchPowerOnEnumeration: + { + FLOG( _L( "[USBOTGWATCHER]\tCUsbStateHostHandle::WaitNotifierCompletedL EUsbWatcherErrDeviceRequiresTooMuchPowerOnEnumeration" ) ); + ChangeHostStateL(EUsbStateHostAInitiate); + break; + } + case EUsbWatcherErrUnsupportedDevice: + { + FLOG( _L( "[USBOTGWATCHER]\tCUsbStateHostHandle::WaitNotifierCompletedL EUsbWatcherErrUnsupportedDevice" ) ); + ChangeHostStateL(EUsbStateHostAInitiate); + break; + } + case EUsbWatcherConnectedToOTG: + { + FLOG( _L( "[USBOTGWATCHER]\tCUsbStateHostHandle::WaitNotifierCompletedL EUsbWatcherConnectedToOTG" ) ); + ChangeHostStateL(EUsbStateHostAInitiate); + break; + } + case EUsbWatcherErrDandlingCable: + { + FLOG( _L( "[USBOTGWATCHER]\tCUsbStateHostHandle::WaitNotifierCompletedL EUsbWatcherErrDandlingCable" ) ); + ChangeHostStateL(EUsbStateHostAInitiate); + break; + } + case EUsbWatcherNoActivity: + { + FLOG( _L( "[USBOTGWATCHER]\tCUsbStateHostHandle::WaitNotifierCompletedL EUsbWatcherNoActivity" ) ); + ChangeHostStateL(EUsbStateHostAInitiate); + break; + } + case EUsbWatcherErrorInConnection: + { + FLOG( _L( "[USBOTGWATCHER]\tCUsbStateHostHandle::WaitNotifierCompletedL EUsbWatcherErrorInConnection" ) ); + ChangeHostStateL(EUsbStateHostAInitiate); + break; + } + case EUsbWatcherCanNotStartUsbServices: + { + FLOG( _L( "[USBOTGWATCHER]\tCUsbStateHostHandle::WaitNotifierCompletedL EUsbWatcherCanNotStartUsbServices" ) ); + + break; + } + // errors from observers mapped to one + case EUsbWatcherIdPinError: + case EUsbWatcherVBusObserverError: + case EUsbWatcherHostEventNotificationError: + case EUsbWatcherOtgStateError: + case EUsbWatcherMessageNotificationError: + { + // try to restore + FLOG( _L( "[USBOTGWATCHER]\tCUsbStateHostHandle::WaitNotifierCompletedL Error in observer" ) ); + ChangeHostStateL(EUsbStateHostAInitiate); + break; + } + default: + { + FLOG( _L( "[USBOTGWATCHER]\tCUsbStateHostHandle::WaitNotifierCompletedL Unexpected situation to be handled" ) ); + Panic(EUnexpectedSituationToHandle); + break; + } + + } + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CUsbStateHostHandle::DoHandleL() + { + FTRACE( FPrint(_L( "[USBOTGWATCHER]\tCUsbStateHostHandle::DoHandleL iWhat = %d" ), iWhat)); + + if (iTooMuchPowerTimer) + iTooMuchPowerTimer->Cancel(); + + switch (iWhat) + { + case EUsbWatcherErrDriversNotFound: + { + FLOG( _L( "[USBOTGWATCHER]\tCUsbStateHostHandle::DoHandleL DriversNotFound" ) ); + // Ignore any errors when calling BusDrop(). Those indicate that VBus already dropped + iWatcher->Usb().BusDrop(); + iWatcher->NotifManager()->ShowIndicatorL(EFalse); + iWatcher->NotifManager()->ShowNotifierL(KUsbUiNotifOtgError, + EUsbOtgUnsupportedDevice, this); + + break; + } + case EUsbWatcherHubsNotSupported: + { + FLOG( _L( "[USBOTGWATCHER]\tCUsbStateHostHandle::DoHandleL EUsbWatcherHubsNotSupported" ) ); + // Ignore any errors when calling BusDrop(). Those indicate that VBus already dropped + iWatcher->Usb().BusDrop(); + iWatcher->NotifManager()->ShowIndicatorL(EFalse); + iWatcher->NotifManager()->ShowNotifierL(KUsbUiNotifOtgError, + EUsbOtgHubUnsupported, this); + break; + } + case EUsbWatcherErrDeviceRequiresTooMuchPowerOnEnumeration: + { + FLOG( _L( "[USBOTGWATCHER]\tCUsbStateHostHandle::DoHandleL EUsbWatcherErrDeviceRequiresTooMuchPowerOnEnumeration" ) ); + + iTooMuchPowerTimer->After(KTimeTooMuchPowerRequired); + break; + } + case EUsbWatcherErrDeviceRequiresTooMuchPower: + { + FLOG( _L( "[USBOTGWATCHER]\tCUsbStateHostHandle::DoHandleL EUsbWatcherErrDeviceRequiresTooMuchPower" ) ); + // Ignore any errors when calling BusDrop(). Those indicate that VBus already dropped + iWatcher->Usb().BusDrop(); + iWatcher->NotifManager()->ShowIndicatorL(EFalse); + iWatcher->NotifManager()->ShowNotifierL(KUsbUiNotifOtgError, + EUsbOtgTooMuchPower, this); + break; + } + case EUsbWatcherErrUnsupportedDevice: + { + FLOG( _L( "[USBOTGWATCHER]\tCUsbStateHostHandle::DoHandleL EUsbWatcherErrUnsupportedDevice" ) ); + // Ignore any errors when calling BusDrop(). Those indicate that VBus already dropped + iWatcher->Usb().BusDrop(); + iWatcher->NotifManager()->ShowIndicatorL(EFalse); + iWatcher->NotifManager()->ShowNotifierL(KUsbUiNotifOtgError, + EUsbOtgUnsupportedDevice, this); + break; + } + case EUsbWatcherConnectedToOTG: + { + FLOG( _L( "[USBOTGWATCHER]\tCUsbStateHostHandle::DoHandleL EUsbWatcherConnectedToOTG" ) ); + + // Ignore any errors when calling BusDrop(). Those indicate that VBus already dropped + iWatcher->Usb().BusDrop(); + iWatcher->NotifManager()->ShowIndicatorL(EFalse); + iWatcher->NotifManager()->ShowNotifierL(KUsbUiNotifOtgError, + EUsbOtgUnsupportedDevice, this); + break; + } + case EUsbWatcherErrDandlingCable: + { + FLOG( _L( "[USBOTGWATCHER]\tCUsbStateHostHandle::DoHandleL EUsbWatcherErrDandlingCable" ) ); + // Ignore any errors when calling BusDrop(). Those indicate that VBus already dropped + iWatcher->Usb().BusDrop(); + iWatcher->NotifManager()->ShowIndicatorL(EFalse); + iWatcher->NotifManager()->ShowNotifierL(KUsbUiNotifOtgError, + EUsbOtgErrorAttachTimedOut, this); + break; + } + case EUsbWatcherNoActivity: + { + FLOG( _L( "[USBOTGWATCHER]\tCUsbStateHostHandle::DoHandleL EUsbWatcherNoActivity" ) ); + // Ignore any errors when calling BusDrop(). Those indicate that VBus already dropped + iWatcher->Usb().BusDrop(); + iWatcher->NotifManager()->ShowIndicatorL(EFalse); + iWatcher->NotifManager()->ShowNotifierL(KUsbUiNotifOtgError, + EUsbOtgUnsupportedDevice, this); + + break; + } + case EUsbWatcherErrorInConnection: + { + FLOG( _L( "[USBOTGWATCHER]\tCUsbStateHostHandle::DoHandleL EUsbWatcherErrorInConnection" ) ); + // Ignore any errors when calling BusDrop(). Those indicate that VBus already dropped + iWatcher->Usb().BusDrop(); + iWatcher->NotifManager()->ShowIndicatorL(EFalse); + iWatcher->NotifManager()->ShowNotifierL(KUsbUiNotifOtgError, + EUsbOtgErrorInConnection, this); + break; + } + case EUsbWatcherCanNotStartUsbServices: + { + FLOG( _L( "[USBOTGWATCHER]\tCUsbStateHostHandle::DoHandleL EUsbWatcherCanNotStartUsbServices" ) ); + iWatcher->NotifManager()->ShowIndicatorL(EFalse); + iWatcher->NotifManager()->ShowNotifierL(KUsbUiNotifOtgError, + EUsbOtgErrorInConnection, this); + break; + } + // errors from observers mapped to one + case EUsbWatcherIdPinError: + case EUsbWatcherVBusObserverError: + case EUsbWatcherHostEventNotificationError: + case EUsbWatcherOtgStateError: + case EUsbWatcherMessageNotificationError: + { + FLOG( _L( "[USBOTGWATCHER]\tCUsbStateHostHandle::DoHandleL Error from observer" ) ); + // Ignore any errors when calling BusDrop(). Those indicate that VBus already dropped + iWatcher->Usb().BusDrop(); + iWatcher->NotifManager()->ShowIndicatorL(EFalse); + iWatcher->NotifManager()->ShowNotifierL(KUsbUiNotifOtgError, + EUsbOtgErrorInConnection, this); + break; + } + default: + { + FLOG( _L( "[USBOTGWATCHER]\tCUsbStateHostHandle::WaitNotifierCompletedL Unexpected situation to be handled" ) ); + Panic(EUnexpectedSituationToHandle); + break; + } + } + } + +///////////////////////////////////////////////////////////////////////////////////// +// just ignore all the events +// From VBus observer +void CUsbStateHostHandle::VBusDownL() + { + FLOG( _L( "[USBOTGWATCHER]\tCUsbStateHostHandle::VBusDownL" ) ); + } + +// From OTG state observer +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CUsbStateHostHandle::AIdleL() + { + FLOG( _L( "[USBOTGWATCHER]\tCUsbStateHostHandle::AIdleL" ) ); + + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CUsbStateHostHandle::AHostL() + { + FLOG( _L( "[USBOTGWATCHER]\tCUsbStateHostHandle::AHostL" ) ); + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CUsbStateHostHandle::APeripheralL() + { + FLOG( _L( "[USBOTGWATCHER]\tCUsbStateHostHandle::APeripheralL" ) ); + + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CUsbStateHostHandle::AVBusErrorL() + { + FLOG( _L( "[USBOTGWATCHER]\tCUsbStateHostHandle::AVBusErrorL" ) ); + + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CUsbStateHostHandle::BIdleL() + { + FLOG( _L( "[USBOTGWATCHER]\tCUsbStateHostHandle::BIdleL" ) ); + + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CUsbStateHostHandle::BPeripheralL() + { + FLOG( _L( "[USBOTGWATCHER]\tCUsbStateHostHandle::BPeripheralL" ) ); + + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CUsbStateHostHandle::BHostL() + { + FLOG( _L( "[USBOTGWATCHER]\tCUsbStateHostHandle::BHostL" ) ); + + } + +// From bus activity observer +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CUsbStateHostHandle::BusIdleL() + { + FLOG( _L( "[USBOTGWATCHER]\tCUsbStateHostHandle::BusIdleL" ) ); + + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CUsbStateHostHandle::BusActiveL() + { + FLOG( _L( "[USBOTGWATCHER]\tCUsbStateHostHandle::BusActiveL" ) ); + + } + +// From Host Event notification observer +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CUsbStateHostHandle::DeviceAttachedL( + TDeviceEventInformation aDevEventInfo) + { + FLOG( _L( "[USBOTGWATCHER]\tCUsbStateHostHandle::DeviceAttachedL" ) ); + + if (iTooMuchPowerTimer->IsActive()) + { + ChangeHostStateL(EUsbStateHostAInitiate); + iWatcher->DeviceAttachedL(aDevEventInfo); + } + else + { + FLOG( _L( "[USBOTGWATCHER]\tCUsbStateHostHandle::DeviceAttachedL Unexpected situation" ) ); + } + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CUsbStateHostHandle::DeviceDetachedL(TDeviceEventInformation) + { + FLOG( _L( "[USBOTGWATCHER]\tCUsbStateHostHandle::DeviceDetachedL" ) ); + + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CUsbStateHostHandle::DriverLoadSuccessL(TDeviceEventInformation) + { + FLOG( _L( "[USBOTGWATCHER]\tCUsbState::DriverLoadSuccessL" ) ); + + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CUsbStateHostHandle::DriverLoadPartialSuccessL(TDeviceEventInformation) + { + FLOG( _L( "[USBOTGWATCHER]\tCUsbState::DriverLoadPartialSuccessL" ) ); + + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CUsbStateHostHandle::DriverLoadFailureL(TDeviceEventInformation) + { + FLOG( _L( "[USBOTGWATCHER]\tCUsbState::DriverLoadFailureL" ) ); + + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CUsbStateHostHandle::BadHubPositionL() + { + FLOG( _L( "[USBOTGWATCHER]\tCUsbStateHostHandle::BadHubPositionL" ) ); + + if (iTooMuchPowerTimer->IsActive()) + { + ChangeHostStateL(EUsbStateHostAInitiate); + iWatcher->BadHubPositionL(); + } + else + { + FLOG( _L( "[USBOTGWATCHER]\tCUsbStateHostHandle::DeviceAttachedL Unexpected situation" ) ); + } + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CUsbStateHostHandle::VBusErrorL() + { + FLOG( _L( "[USBOTGWATCHER]\tCUsbStateHostHandle::VBusErrorL" ) ); + + iWatcher->Usb().BusClearError(); + FLOG( _L( "[USBOTGWATCHER]\tCUsbStateHostHandle::VBusErrorL Unexpected situation" ) ); + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CUsbStateHostHandle::MessageNotificationReceivedL(TInt) + { + FLOG( _L( "[USBOTGWATCHER]\tCUsbStateHostHandle::MessageNotificationReceivedL" ) ); + + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CUsbStateHostHandle::SrpReceivedL() + { + FLOG( _L( "[USBOTGWATCHER]\tCUsbStateHostHandle::SrpReceivedL" ) ); + + if (CUsbVBusObserver::EVBusUp != iWatcher->VBusObserver()->VBus()) + { + TInt err = iWatcher->Usb().BusRespondSrp(); + if (KErrNone != err) + { + FLOG( _L( "[USBOTGWATCHER]\tCUsbStateHostHandle::SrpReceivedL BusRespondSrp error" ) ); + iWatcher->HandleHostProblemL(EUsbWatcherErrorInConnection); + } + else + { + ChangeHostStateL(EUsbStateHostAInitiate); + } + } + + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CUsbStateHostHandle::SessionRequestedL() + { + FLOG( _L( "[USBOTGWATCHER]\tCUsbStateHostHandle::SessionRequestedL" ) ); + + } + +// From TimerObserver +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CUsbStateHostHandle::TimerElapsedL(TUsbTimerId aTimerId) + { + switch (aTimerId) + { + case ETooMuchPowerRequiredTimer: + { + FLOG( _L( "[USBOTGWATCHER]\tCUsbStateHostHandle::TimerElapsedL - ETooMuchPowerRequiredTimer" ) ); + iWatcher->Usb().BusDrop(); + iWatcher->NotifManager()->ShowIndicatorL(EFalse); + iWatcher->NotifManager()->ShowNotifierL(KUsbUiNotifOtgError, + EUsbOtgTooMuchPowerRequired, this); + break; + } + default: + { + FLOG( _L( "[USBOTGWATCHER]\tCUsbStateHostHandle::TimerElapsedL - Unknown timer" ) ); + Panic(EWrongTimerId); + } + } + }