--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/kernel/eka/include/drivers/xyin.h Mon Oct 19 15:55:17 2009 +0100
@@ -0,0 +1,187 @@
+// 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