emulator/emulatorbsp/inc/variant.h
changeset 0 cec860690d41
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/emulator/emulatorbsp/inc/variant.h	Tue Feb 02 01:39:10 2010 +0200
@@ -0,0 +1,192 @@
+// Copyright (c) 1998-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:
+// wins\inc\variant.h
+// Wins Variant Header
+// 
+//
+
+#ifndef __VA_STD_H__
+#define __VA_STD_H__
+
+#include <assp.h>
+#include "vwins.h"
+#include "nk_priv.h"
+#pragma warning(disable : 4201) // nonstandard extension used : nameless struct/union
+#include <mmsystem.h>
+#pragma warning(default : 4201)
+#include <kernel/kpower.h>
+
+#ifdef _DEBUG
+const TInt KDefaultDebugMask = 1<<KPANIC; //KPANIC, override this with "DebugMask 0" in EPOC.INI
+#else
+const TInt KDefaultDebugMask = 0;
+#endif
+
+typedef void (*TMediaChangeCallBack)(TAny*);
+
+class WinsTimer
+	{
+public:
+	enum
+		{
+		EDefaultPeriod = 5,		// milliseconds
+		EMaxLag = 100,			// milliseconds
+		};
+public:
+	WinsTimer();
+	void Init(TUint aPeriod);
+	void Enable();
+	inline TUint Period() const
+		{return iPeriod;}
+	inline void SetIdleThread()
+		{if (!iIdleThread) iIdleThread = NKern::CurrentThread();}
+	inline void Nobble(TUint aNobbleFactor)
+		{iNobbleNanos = aNobbleFactor * iPeriod;}
+	TInt SystemTime() const;
+	void SetSystemTime(TInt aTime);
+	void Standby();
+	void Wakeup();
+private:
+	void EventThread(NTimerQ& aTimerQ);
+	static DWORD WINAPI Thread(LPVOID);
+	static void CALLBACK Tick(UINT, UINT, DWORD, DWORD, DWORD);
+private:
+	TUint iPeriod;
+	TUint iNobbleNanos;
+	TInt iMaxLagTicks;
+	HANDLE iSemaphore;
+	UINT iTimer;
+	TInt iSuspend;
+	Int64 iTime;
+	NThread* iIdleThread;
+	TBool iStandby;
+	};
+
+class Properties
+	{
+	struct SEntry
+		{
+		char* iProperty;
+		char* iValue;
+		};
+public:
+	Properties();
+	const char* Append(const char* aProperty, const char* aValue);
+	const char* Replace(const char* aProperty, const char* aValue);
+	TInt GetString(const char* aProperty, const char*& aValue) const;
+	TInt GetInt(const char* aProperty, TInt& aValue) const;
+	TInt GetBool(const char* aProperty, TBool& aValue, TBool aDefaultValue=EFalse) const;
+	//
+	void Dump() const;
+private:
+	TInt Find(const char* aProperty) const;
+	const char* Insert(TInt aIndex, const char* aProperty, const char* aValue);
+private:
+	SEntry* iEntries;
+	TInt iCount;
+	TInt iSize;
+	};
+
+class Wins : public Asic
+	{
+public:
+	Wins();
+	//
+	TInt Init(TBool aRunExe);
+	inline void InstallUi(DWinsUiBase& aUi);
+	TInt EmulatorHal(TInt aFunction, TAny* a1, TAny* a2);
+private:
+	// initialisation
+	void Init1();
+	void Init3();
+	void AddressInfo(SAddressInfo& anInfo);
+
+	// power management
+	void Idle();
+
+	// timing
+	TInt MsTickPeriod();
+	TInt SystemTimeInSecondsFrom2000(TInt& aTime);
+	TInt SetSystemTimeInSecondsFrom2000(TInt aTime);
+
+	// HAL
+	TInt VariantHal(TInt aFunction, TAny* a1, TAny* a2);
+
+	// Machine configuration
+	TPtr8 MachineConfiguration();
+	const char* EmulatorMediaPath();
+
+	// Debug trace
+	void DebugPrint(const TDesC8& aDes);
+	TBool ErrorDialog(TError aType, const TDesC8& aPanic, TInt aVal);
+	void EarlyLogging(const char* aMessage1,const char* aMessage2);
+private:
+	TInt InitProperties(TBool aRunExe);
+	TInt DebugMask();
+	TUint32 KernelConfigFlags();
+	TInt ParseCapabilitiesArg(SCapabilitySet& aCapabilities, const char *aText);
+	void DisabledCapabilities(SCapabilitySet& aCapabilities);
+	void CalibrateCpuSpeed();
+	TInt SetCpuSpeed(TUint aSpeed);
+	TInt AddProperty(char* aProperty, const char* aEol);
+	TInt ProcessCommandLine(TBool aRunExe, char* aCDrive);
+	TInt LoadProperties();
+	TInt ReadProperties(char* aData);
+	TInt ReadIniFile(const char* aFileName, char*& aContents);
+	TInt SetupPaths();
+	TInt SetupMediaPath();
+	TInt SetupDrive(int aDrive, const char* aPath);
+	TInt MapFilename(const TDesC& aFilename, TDes& aBuffer) const;
+	TInt MapDrive(int aDrive, TDes& aBuffer) const;
+	HANDLE DebugOutput();
+	void PurgeImages();
+	TBool ConfigSpecificProperty(const char * aProperty);
+	TInt LoadConfigSpecificProperties(const char * pFile);
+	TBool ScreenSpecificProperty(const char * aProperty);
+
+private:
+	friend class DWinsPowerController;
+	DWinsUiBase* iUi;
+	WinsTimer iTimer;
+	Properties iProperties;
+	TUint iRealCpuSpeed;
+	TUint iCpuSpeed;
+	HANDLE iDebugOutput;
+	TBool iLogTimeStamp;
+	TBool iPurgedImages;
+	TBool iLogToDebugger;
+	TBool iLogToFile;
+	TBool iConfigPropertySet;
+	TInt iConfigId;
+
+	class DWinsPowerController* iPowerController;
+	// For MMC emulation
+	static TBool MediaDoorOpen;
+	static TInt CurrentPBusDevice;
+	static TAny* MediaChangeCallbackParam;
+	static TMediaChangeCallBack MediaChangeCallBackPtr;
+public:
+	static Wins* Self()
+		{ return (Wins*) Arch::TheAsic();}
+	IMPORT_C void AssertWakeupSignal();
+	IMPORT_C void WakeupEvent();
+	IMPORT_C static TBool* MediaDoorOpenPtr();
+	IMPORT_C static TInt* CurrentPBusDevicePtr();
+	IMPORT_C static void SetMediaChangeCallBackPtr(TMediaChangeCallBack aPtr, TAny* aParam);
+	IMPORT_C static void MediaChangeCallBack();
+	};
+
+GLREF_D Wins TheVariant;
+
+#endif