telephonyserverplugins/multimodetsy/Multimode/Mbattery.cpp
changeset 0 3553901f7fa8
child 24 6638e7f4bd8f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/telephonyserverplugins/multimodetsy/Multimode/Mbattery.cpp	Tue Feb 02 01:41:59 2010 +0200
@@ -0,0 +1,214 @@
+// Copyright (c) 1997-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:
+// GBATTERY.CPP
+// Queries the ME battery. Retrieves charge level and battery status
+// 
+//
+
+#include <et_phone.h>
+#include "Mbattery.h"
+#include "mSLOGGER.H"
+#include "ATIO.H"
+#include "Matstd.h"
+
+CATGetBattery* CATGetBattery::NewL(CATIO* aIo,CTelObject* aTelObject,CATInit* aInit,CPhoneGlobals* aPhoneGlobals)
+	{
+	CATGetBattery* battery = new(ELeave) CATGetBattery(aIo, aTelObject, aInit, aPhoneGlobals);
+	CleanupStack::PushL(battery);
+	battery->ConstructL();
+	CleanupStack::Pop();
+	return battery;
+	}
+
+CATGetBattery::CATGetBattery(CATIO* aIo, CTelObject* aTelObject, CATInit* aInit,CPhoneGlobals* aPhoneGlobals)
+: CATCommands(aIo,aTelObject,aInit,aPhoneGlobals),iPhoneGlobals(aPhoneGlobals)
+{}
+
+void CATGetBattery::ConstructL()
+	{
+	CATCommands::ConstructL();
+	}
+
+CATGetBattery::~CATGetBattery()
+	{
+	iIo->RemoveExpectStrings(this);
+	iOKExpectString=NULL;
+	iErrorExpectString=NULL;
+	}
+
+void CATGetBattery::Start(TTsyReqHandle aTsyReqHandle,TAny* aParams)
+	{
+	LOGTEXT(_L8("MMTsy:\tCATGetBattery:\tStarting ME Battery query."));
+	iReqHandle = aTsyReqHandle;
+	iBatteryInfo = (RMobilePhone::TMobilePhoneBatteryInfoV1*) aParams;
+	iTxBuffer.Format(KGetBatteryChargeCommand);
+	iIo->Write(this, iTxBuffer);
+	iIo->SetTimeOut(this, 5000);
+	iState=EATBatteryWaitForWriteComplete;
+	}
+
+void CATGetBattery::EventSignal(TEventSource aSource)
+	{
+	if (aSource==ETimeOutCompletion)
+		{
+		LOGTEXT(_L8("MMTsy:\tCATGetBattery:\tTimeout Error during battery-strength query"));
+		RemoveStdExpectStrings();
+		Complete(KErrTimedOut,aSource);
+		return;
+		}
+
+	switch(iState)
+		{
+		case EATBatteryWaitForWriteComplete:
+		__ASSERT_ALWAYS(aSource==EWriteCompletion,Panic(EATCommand_IllegalCompletionWriteExpected));
+			{
+			iIo->WriteAndTimerCancel(this);
+			StandardWriteCompletionHandler(aSource, 5);
+			iState=EATBatteryReadComplete;
+			}
+		break;
+
+		case EATBatteryReadComplete:
+		__ASSERT_ALWAYS(aSource==EReadCompletion,Panic(EATCommand_IllegalCompletionReadExpected));
+			{	
+			iIo->WriteAndTimerCancel(this);
+			TInt ret(ValidateExpectString());
+			RemoveStdExpectStrings();
+			if (ret)
+				{
+				iBatteryInfo->iStatus = RMobilePhone::EPowerStatusUnknown;
+				Complete(ret,aSource);
+				return;
+				}
+			TRAP(ret,ParseBatteryResponseL());
+			Complete(ret,aSource);
+			}
+		break;
+
+		default:
+		break;
+		}//switch
+	}//EventSignal
+
+void CATGetBattery::Stop(TTsyReqHandle aTsyReqHandle)
+	{
+	__ASSERT_ALWAYS(aTsyReqHandle == iReqHandle, Panic(EIllegalTsyReqHandle));
+	LOGTEXT2(_L8("CATGetBattery::Stop - Cancelling from state %d"), iState);
+	
+	if (iState==EATBatteryWaitForWriteComplete)
+		{
+		Complete(KErrCancel, EReadCompletion);
+		}
+	// else do nothing because we have already sent the AT command
+	// or have not actually started doing anything!
+	}
+
+void CATGetBattery::Complete(TInt aError,TEventSource aSource)
+	{
+	iIo->WriteAndTimerCancel(this);
+	iIo->RemoveExpectStrings(this);
+	iOKExpectString = NULL;
+	iErrorExpectString = NULL;
+
+	CATCommands::Complete(aError,aSource);
+	iTelObject->ReqCompleted(iReqHandle, aError);
+
+	LOGTEXT2(_L8("MMTsy:CATGetBattery:\tCATGetBattery completed with error code : %d"), aError);
+	iState = EATNotInProgress;
+	}
+
+void CATGetBattery::CompleteWithIOError(TEventSource /*aSource*/,TInt aStatus)
+	{
+	if (iState!=EATNotInProgress)
+		{
+		iIo->WriteAndTimerCancel(this);
+		iTelObject->ReqCompleted(iReqHandle, aStatus);
+		iState = EATNotInProgress;
+		}
+	}
+
+void CATGetBattery::ParseBatteryResponseL()
+	{
+	ParseBufferLC();
+	CATParamListEntry* entry;
+	TDblQueIter<CATParamListEntry> iter(iRxResults);
+	TBool first = ETrue;
+	TUint iCounter = 0;
+	TInt ret;
+
+	while (entry = iter++, entry != NULL)
+		{
+		if (first)
+			{
+			first = EFalse;
+			while (entry->iResultPtr != KCBCResponseString)
+				{
+				entry->Deque();
+				delete entry;
+				entry = iter++;
+				if (entry == NULL)
+					{
+					CleanupStack::PopAndDestroy();
+					User::Leave(KErrNotFound);
+					}
+				} //while
+			LOGTEXT(_L8("MMTsy:\tCATGetBattery:\tFound +CBC string!"));
+			iCounter = 1;
+			}
+		else
+			{
+			TLex8 aLex((entry->iResultPtr).Ptr());
+			if (iCounter == 1)
+				{	
+				TInt batteryStatus;
+				ret = aLex.Val(batteryStatus);
+				if (ret == KErrNone)
+					// Have to convert the answer from the AT command format
+					// to multimode representation.
+					iBatteryInfo->iStatus = ConvertBatteryStatus(batteryStatus);
+
+				}
+			else if (iCounter == 2)
+				ret = aLex.Val(iBatteryInfo->iChargeLevel);
+			iCounter++;
+			}//else
+		entry->Deque();
+		delete entry;
+		}//while
+	CleanupStack::PopAndDestroy();
+	}//ParseBatteryResponseL
+
+RMobilePhone::TMobilePhoneBatteryStatus CATGetBattery::ConvertBatteryStatus(TInt aBatteryStatus)
+
+/** * Converts the batterey status from ETSI standard to multimode representation *
+ * This method returns the proper multimode representation for the battery status. 
+ * @param aBatteryStatus points to a value representing the battery status the ETSI way(0 - 3, ).
+ * @return  Returns the battery status in multimode representation.
+*/
+
+	{
+	switch (aBatteryStatus)
+		{		
+	case 0:
+		return RMobilePhone::EPoweredByBattery; // equal to 1
+	case 1:
+		return RMobilePhone::EBatteryConnectedButExternallyPowered; // equal to 2
+	case 2:
+		return RMobilePhone::ENoBatteryConnected; // equal to 3
+	case 3:
+		return RMobilePhone::EPowerFault; // equal to 4
+	default:
+		return RMobilePhone::EPowerStatusUnknown; //equal to 0
+		}
+	}