kernel/eka/include/drivers/xyin.h
author Tom Cosgrove <tom.cosgrove@nokia.com>
Fri, 28 May 2010 16:29:07 +0100
changeset 30 8aab599e3476
parent 0 a41df078684a
child 36 bbf8bed59bcb
permissions -rw-r--r--
Fix for bug 2283 (RVCT 4.0 support is missing from PDK 3.0.h) Have multiple extension sections in the bld.inf, one for each version of the compiler. The RVCT version building the tools will build the runtime libraries for its version, but make sure we extract all the other versions from zip archives. Also add the archive for RVCT4.

// 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 the License "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:
// e32\include\drivers\xyin.h
// Generic digitiser driver header
//
//

/**
 @file
 @internalComponent
*/

#ifndef __M32XYIN_H__
#define __M32XYIN_H__
#include <kernel/kpower.h>
#include <platform.h>
#include <e32hal.h>

#ifdef _DEBUG
//#define __DIGITISER_DEBUG1__
//#define __DIGITISER_DEBUG2__
#endif
#ifdef __DIGITISER_DEBUG1__
#define __KTRACE_XY1(s) s;
#else
#define __KTRACE_XY1(s)
#endif
#ifdef __DIGITISER_DEBUG2__
#define __KTRACE_XY2(s) s;
#else
#define __KTRACE_XY2(s)
#endif

/**
@internalComponent
*/
const TInt KMaxXYSamples=4;

/**
@publishedPartner
@released
*/
struct SDigitiserConfig
	{
	TInt iPenDownDiscard;	// number of samples to discard on entering the detection volume (area if 2 dimensional)
	TInt iPenUpDiscard;		// number of samples to discard on leaving the detection volume (area if 2 dimensional)
	TInt iDriveXRise;		// number of milliseconds to wait when driving horizontal edges
	TInt iDriveYRise;		// number of milliseconds to wait when driving vertical edges
	TInt iMinX;				// minimum valid X value
	TInt iMaxX;				// maximum valid X value
	TInt iSpreadX;			// maximum valid X spread
	TInt iMinY;				// minimum valid Y value
	TInt iMaxY;				// maximum valid Y value
	TInt iSpreadY;			// maximum valid Y spread
	TInt iMaxJumpX;			// maximum X movement per sample (pixels)
	TInt iMaxJumpY;			// maximum Y movement per sample (pixels)
	TInt iAccThresholdX;	// accumulated offset in pixels to cause movement in X direction
	TInt iAccThresholdY;	// accumulated offset in pixels to cause movement in Y direction
	TInt iNumXYSamples;		// number of samples to average
	TBool iDisregardMinMax;	// TRUE if we want to disregard minimum and maximum
	};

/**
@publishedPartner
@prototype
*/
struct SDigitiserConfigV01
	{
	SDigitiserConfig i2dConfig;
	TInt iMinZ;				// minimum valid Z value (distance to screen): 0 when lighlty touching (no pressure applied)
	TInt iMaxZ;				// maximum valid Z value: positive for distance to screen, negative for pressure
	TInt iSpreadZ;			// maximum valid Z spread (in distance to screen units)
	TInt iMaxJumpZ;			// maximum Z movement per sample (in distance to screen units)
	TInt iAccThresholdX;	// accumulated offset in distance to screen units to cause movement in Z direction
	};

/**
@publishedPartner
@released
*/
NONSHARABLE_CLASS(DDigitiser) : public DPowerHandler
	{
public:
/**
@internalComponent
*/
	enum TState
		{
		EIdle=0,			// waiting for pen to go down
		EDiscardOnPenDown,	// discarding just after pen down
		EBufferFilling,		// buffer filling with samples
		EBufferFull,		// delay line is now full
		EPenDown,			// pen-down event has been delivered
		};
public:
	// initialisation
	static DDigitiser* New();
	DDigitiser();
	TInt Create();
	virtual TInt DoCreate()=0;
public:
	// signals from hardware-dependent code
	void RawSampleValid();
	void PenUp();
public:
	// signals to hardware-dependent code
	virtual void WaitForPenDown()=0;
	virtual void WaitForPenUp()=0;
	virtual void WaitForPenUpDebounce()=0;
	virtual void DigitiserOn()=0;
	virtual void DigitiserOff()=0;
public:
	// machine-configuration related things
	virtual TInt DigitiserToScreen(const TPoint& aDigitiserPoint, TPoint& aScreenPoint)=0;
	virtual void ScreenToDigitiser(TInt& aX, TInt& aY)=0;
	virtual TInt SetXYInputCalibration(const TDigitizerCalibration& aCalibration)=0;
	virtual TInt CalibrationPoints(TDigitizerCalibration& aCalibration)=0;
	virtual TInt SaveXYInputCalibration()=0;
	virtual TInt RestoreXYInputCalibration(TDigitizerCalibrationType aType)=0;
	virtual void DigitiserInfo(TDigitiserInfoV01& aInfo)=0;
public:
	// Generic stuff
/**
@internalComponent
*/
	void ProcessRawSample();
/**
@internalComponent
*/
	void ProcessPenUp();
/**
@internalComponent
*/
	TBool SamplesToPoint(TPoint& aPoint);
/**
@internalComponent
*/
	TInt DelayAndConvertSample(const TPoint& aSample, TPoint& aScreenPoint);
/**
@internalComponent
*/
	void IssuePenDownEvent();
/**
@internalComponent
*/
	void IssuePenUpEvent();
	void IssuePenMoveEvent(const TPoint& aPoint);
	virtual void FilterPenMove(const TPoint& aPoint)=0;
	virtual void ResetPenMoveFilter()=0;
/**
@internalComponent
*/
	virtual TInt HalFunction(TInt aFunction, TAny* a1, TAny* a2);
/**
@internalComponent
*/
 	void HandleMsg(TMessageBase* aMsg);
public:
	TDfcQue* iDfcQ;
 	TMessageQue iMsgQ;
	TDfc iSampleDfc;				// called when a raw sample is available
	TDfc iPenUpDfc;					// called when the pen goes up
	TInt iX[KMaxXYSamples];			// raw X samples from hardware
	TInt iY[KMaxXYSamples];			// raw Y samples from hardware
	SDigitiserConfig iCfg;			// configuration
	TInt iBufferIndex;				// delay line index
	TPoint* iBuffer;				// delay line for samples
	TPoint iLastPos;				// last pen position
	TState iState;
	TInt iCount;
	TUint8 iPointerOn;
	};



#endif