亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? tchmain.c

?? 觸摸屏驅動的程序
?? C
?? 第 1 頁 / 共 2 頁
字號:
//
// Copyright (c) Microsoft Corporation.  All rights reserved.
//
//
// Use of this source code is subject to the terms of the Microsoft end-user
// license agreement (EULA) under which you licensed this SOFTWARE PRODUCT.
// If you did not accept the terms of the EULA, you are not authorized to use
// this source code. For a copy of the EULA, please see the LICENSE.RTF on your
// install media.
//
/*++
THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
PARTICULAR PURPOSE.

@doc EX_TOUCH_DDI INTERNAL DRIVERS MDD TOUCH_PANEL

Module Name:  

@module mdd.c

Abstract:  
    This module contains the DDI implementation and the supporting administriva.
    if DBGCAL is defined, the results of the calibration calculations are
    displayed following the setting of calibration data. <nl>


Functions:
TouchPanelpDetach
TouchPanelpAttach
TouchPanelpISR
TouchPanelGetDeviceCaps
TouchPanelSetMode
TouchPanelPowerHandler
TouchPanelEnable
TouchPanelDisable
TouchPanelReadCalibrationPoint
TouchPanelReadCalibrationAbort
Notes: 


--*/

#include    <windows.h>
#include	<types.h>
#include    <memory.h>
#include    <nkintr.h>
#include    <tchddi.h>
#include    <tchddsi.h>

extern PFN_TOUCH_PANEL_CALLBACK v_pfnCgrPointCallback;
extern PFN_TOUCH_PANEL_CALLBACK v_pfnCgrCallback;
// To track if we are in OOM state.
BOOL _bTchThreadHighPriority = FALSE;
//
// Run at high priority so that we can service our interrupts quickly.
//
#define DEFAULT_THREAD_PRIORITY  		109
#define DEFAULT_THREAD_HIGH_PRIORITY  	109

#define CAL_DELTA_RESET			20
#define CAL_HOLD_STEADY_TIME	1500


// If we are a DLL, we can define our dpCurSettings
#ifdef DEBUG
DBGPARAM dpCurSettings = {
    TEXT("Touch"), { 
    TEXT("Samples"),TEXT("Calibrate"),TEXT("Stats"),TEXT("Thread"),
    TEXT("TipState"),TEXT("Init"),TEXT(""),TEXT(""),
    TEXT(""),TEXT("Misc"),TEXT("Delays"),TEXT("Timing"),
    TEXT("Alloc"),TEXT("Function"),TEXT("Warning"),TEXT("Error") },
    0xC020              // warning, error, init
};
#endif

//
// Calibration State defintions
//
// @const LONG | CalibrationAvailable |
// Indicates that calibration is not in progress and is available for use.
//
// @const LONG | CalibrationActive |
// Indicates that calibration is active.
//
// @const LONG | CalibrationInactive |
// Indicates that calibration is inactive and waiting for completion.
//
// @const LONG | CalibrationAborted |
// Indicates that calibration is in the process of aborting via user request.
//

#define	CalibrationInactive		0x00
#define	CalibrationWaiting		0x01
#define CalibrationDown			0x02
#define	CalibrationValid		0x03
#define	CalibrationAborted		0x04


// Scale factor to support sub-pixel resolutions
#define X_SCALE_FACTOR 4
#define Y_SCALE_FACTOR 4

//
// Macro for absolute value.
//

#define ABS(x)  ((x) >= 0 ? (x) : (-(x)))

//
// Internal Function Prototypes
//

static ULONG
TouchPanelpISR(
    PVOID   Reserved
    );


ULONG   culReferenceCount;              //@globalvar ULONG | culReferenceCount | Count of attached threads

HANDLE  hThread=NULL;                        //@globalvar HANDLE | hThread | Handle of attached thread

CRITICAL_SECTION    csMutex;            //@globalvar CRITICAL_SECTION | csMutex | Critical section

HANDLE  hTouchPanelEvent;               //@globalvar HANDLE | hTouchPanelEvent | Holds the event handle for
                                            // touch panel event notification.

HANDLE  hCalibrationSampleAvailable;    //@globalvar HANDLE  | hCalibrationSampleAvailable | Holds the event handle for
                                            // notification that a calibration
                                            // mapping point is available.

INT		CalibrationState;             //@globalvar INT | CalibrationState | Flag which indicates the
                                            // state of calibration: Available,
											// Active or Inactive.

static DWORD gThreadPriority;			//@globalvar DWORD | gThreadPriority | Interrupt thread normal priority
static DWORD gThreadHighPriority;		//@globalvar DWORD | gThreadHighPriority | Interrupt thread high priority
static BOOL bTerminate=FALSE;


// The MIN_CAL_COUNT is defined in the PDD, since each touch panel
// has different characteristics.  The value should be high enough
// to prevent spurious touches, but low enough that the user doesn't
// have to hold the pen on each crosshair too long.
extern int MIN_CAL_COUNT;

LONG	lCalibrationXCoord;				//@globalvar LONG | lCalibrationXCoord | Holds the X coordinate
											// corresponding to the touch.
LONG	lCalibrationYCoord;				//@globalvar  LONG | lCalibrationYCoord | Holds the Y coordinate
											// corresponding to the touch.


INT32 DisplayWidth;
INT32 DisplayHeight;

DWORD gdwTouchIstTimeout = INFINITE;    // hold csMutex when accessing this

//
//@globalvar PFN_TOUCH_PANEL_CALLBACK | v_pfnPointCallback |
// Pointer to the application supplied function for receiving points.
//
PFN_TOUCH_PANEL_CALLBACK v_pfnPointCallback;

//**********************************************************************
// The following routines are internal helpers, and are not visible to
// the DDI layer.
// @doc IN_TOUCH_DDI INTERNAL DRIVERS MDD TOUCH_PANEL
//**********************************************************************

/*++

Autodoc Information:

    @func VOID | TouchPanelpDetach |
    Performs cleanup and frees memory when owning process detaches.

    @devnote
    We let ExitProcess handle the shutting down of the ISR thread.

--*/
static VOID
TouchPanelpDetach(
    VOID
    )
{

}


/*++


Autodoc Information:

    @func BOOL | TouchPanelpAttach |
    This routine performs the initialization for the touch panel.

    @rdesc
    If the function succeeds the return value is TRUE, otherwise, it is FALSE.

--*/
static BOOL
TouchPanelpAttach(
    VOID
    )
{
    //
    // Create the event for touch panel events.
    // If creation fails, return failure.
    //

    hTouchPanelEvent = CreateEvent( NULL,
                                                     FALSE,		//	Not manual reset
                                                     FALSE,		//	Not signalled
                                                     NULL
                                                     );

    if ( !hTouchPanelEvent )
        return ( FALSE );

    //
    // Create the event for signaling when a calibration sample has been sent.
    //

    hCalibrationSampleAvailable =
        CreateEvent( NULL,
                     FALSE,     //  Not manual reset
                     FALSE,     //  Not signalled
                     NULL
                    );

    if ( !hCalibrationSampleAvailable )
        return ( FALSE );

    DdsiTouchPanelDisable();    // Insure the device is disabled

    //
    // Initialize the critical section, flags, callbacks, reference count,
    // sample rate.
    //

    InitializeCriticalSection( &csMutex );
    CalibrationState = CalibrationInactive;
    v_pfnPointCallback = NULL;
    culReferenceCount = 0;


    //
    // Initialize calibration info used to convert uncalibrated to calibrated
    // points so that function is a noop.
    //

    TouchPanelSetCalibration( 0, NULL, NULL, NULL, NULL );

    return ( TRUE );
}

/*++

Autodoc Information:

    @func ULONG | TouchPanelpISR |
    This routine is the thread which handles touch panel events.
    The event that this thread synchronizes on is signaled by the PDD based on
    the sampling rate, typically 10ms.

    @rdesc
    Never returns.

--*/
static ULONG
TouchPanelpISR(
    PVOID   Reserved  //@parm Reserved, not used.
    )
{
    TOUCH_PANEL_SAMPLE_FLAGS	SampleFlags = 0;
	INT32                       RawX, CalX;
	INT32						RawY, CalY;
    UINT32                      MaxX =  DisplayWidth * X_SCALE_FACTOR;
    UINT32                      MaxY =  DisplayHeight * Y_SCALE_FACTOR;
	UINT32						CurrentDown = 0;
    static LONG CX;
    static LONG CY;
	static LONG XBase;
	static LONG YBase;
	static int	CalibrationSampleCount;
	static BOOL 	fSetBase;
	static DWORD	BaseTime;
	static BOOL		fGotSample;

    PFN_TOUCH_PANEL_CALLBACK pfnCallback;

    while  ( !bTerminate )
    {

        WaitForSingleObject( hTouchPanelEvent, gdwTouchIstTimeout );
        EnterCriticalSection( &csMutex );
        DEBUGMSG(ZONE_THREAD, (TEXT("TCH_INTR\r\n")) );

		// Give the pdd the down state of the previous sample
		if ( CurrentDown )
			SampleFlags |= TouchSamplePreviousDownFlag;
		else
			SampleFlags &= ~TouchSamplePreviousDownFlag;

        DdsiTouchPanelGetPoint( &SampleFlags, &RawX, &RawY );    // Get the point info
        
		if ( SampleFlags & TouchSampleIgnore )
		{
			// do nothing, not a valid sample
			LeaveCriticalSection( &csMutex );
			continue;
		}

		if ( SampleFlags & TouchSampleValidFlag )
			{
			// Set the previous down state for our use, since the pdd may not
			// have preserved it.
			if ( CurrentDown )
				SampleFlags |= TouchSamplePreviousDownFlag;
			else
				SampleFlags &= ~TouchSamplePreviousDownFlag;

			CurrentDown = SampleFlags & TouchSampleDownFlag;
			}

        if ( CalibrationState )
        {
            //
            // At this point we know that calibration is active.
            //
            // Typically, the user touches the panel then converges to the
            // displayed crosshair. When the tip state transitions to
            // the up state, we forward the last valid point to the callback
            // function.
            //
            DEBUGMSG(ZONE_SAMPLES, (TEXT("**** Calibration point (%d, %d), flags 0x%4.4X\r\n"),
                   RawX, RawY, SampleFlags) );

//	Skip if not valid.
			if ( !(SampleFlags & TouchSampleValidFlag) )
				{
				LeaveCriticalSection( &csMutex );
				continue;
				}

//	Must see down transition.
			if ( (SampleFlags & (TouchSampleDownFlag|TouchSamplePreviousDownFlag)) ==
						TouchSampleDownFlag )
				{
				CalibrationState = CalibrationDown;
				fSetBase = TRUE;
				CalibrationSampleCount = 0;
				fGotSample = FALSE;
				}

//	Only look at stuff if we saw a down transition.
			if ( (CalibrationState == CalibrationDown) && !fGotSample )
				{
				if ( SampleFlags & TouchSampleDownFlag )
					{
					long DeltaX, DeltaY;

					CalibrationSampleCount++;
					CX = RawX;
					CY = RawY;
					if ( fSetBase )
						{
						XBase = CX;
						YBase = CY;
						BaseTime = GetTickCount();
						fSetBase = FALSE;
						}
					DeltaX = CX - XBase;
					DeltaY = CY - YBase;
					if ( (GetTickCount() - BaseTime) > CAL_HOLD_STEADY_TIME )
						{
						fGotSample = TRUE;
						}
					else if ( ( ABS(DeltaX) > CAL_DELTA_RESET ) ||
							  ( ABS(DeltaY) > CAL_DELTA_RESET ) )
						{
						RETAILMSG(1, (TEXT("M %ld,%ld  %ld,%ld  %ld,%ld"),
							XBase,YBase, CX,CY, DeltaX,DeltaY));
						fSetBase = TRUE;
						}
					}
				else
					{
					 // They lifted the pen, see if we will accept coordinate.
					if ( CalibrationSampleCount >= MIN_CAL_COUNT )
						{
						fGotSample = TRUE;
						}
					else
						{
						CalibrationState = CalibrationWaiting;
						}
					}

				if ( fGotSample )
					{
					CalibrationState = CalibrationValid;
					lCalibrationXCoord = CX;
					lCalibrationYCoord = CY;
					SetEvent(hCalibrationSampleAvailable);
					}
				}
            LeaveCriticalSection( &csMutex );
        }
        else
        {
            pfnCallback = v_pfnPointCallback;
            if ( pfnCallback != NULL )
            {
                if( SampleFlags & TouchSampleIsCalibratedFlag )
                {   // Sample already calibrated by PDD
                    CalX = RawX;
                    CalY = RawY;
                }
                else
                {   // Not previously calibrated, do it now.
                    TouchPanelCalibrateAPoint( RawX, RawY, &CalX, &CalY );
                    SampleFlags |= TouchSampleIsCalibratedFlag;
                }
                
                LeaveCriticalSection( &csMutex );

                 // Bounds check this value
                if( CalX < 0 )
                    CalX = 0;
                else if( MaxX && ((UINT32)CalX >= MaxX) )
                    CalX = MaxX - X_SCALE_FACTOR;
                if( CalY < 0 )
                    CalY = 0;
                else if( MaxY && ((UINT32)CalY >= MaxY) )
                    CalY = MaxY - Y_SCALE_FACTOR ;
                
                DEBUGMSG( ZONE_SAMPLES,
                          (TEXT("**** Queuing point (%d, %d), flags 0x%4.4X\r\n"),
                           CalX, CalY, SampleFlags) );
#ifdef DEBUG
                {
                    static DWORD SampleCt;
                    
                    if( SampleFlags & TouchSampleDownFlag )
                        SampleCt++;
                    else
                    {
                        DEBUGMSG( ZONE_TIMING,
                                  (TEXT("%d down samples queued\r\n"),
                                   SampleCt) );
                        SampleCt = 0;
                    }
                }
                
#endif                
                (pfnCallback)( SampleFlags, CalX, CalY);
            }
			else
			{
				LeaveCriticalSection( &csMutex );
			}

        }
    }
    ExitThread(1);
    return ( TRUE );
}


#define KEYNAME_TOUCH_DRIVER   		TEXT("\\Drivers\\BuiltIn\\Touch")
#define VALNAME_THREAD_PRIO     	TEXT("Priority256")
#define VALNAME_THREAD_HIGH_PRIO	TEXT("HighPriority256")

/*++

Autodoc Information:

    @func DWORD | TouchPanelpGetPriority |
    This routine reads the TouchPanelpISR thread priority from the registry.

--*/
static VOID TouchPanelpGetPriority(DWORD *ThrdPrio, DWORD *ThrdHighPrio)
{
    HKEY hKey;
    DWORD dwType;
    DWORD dwSize;
    DWORD dwStatus;

    dwStatus = RegOpenKeyEx(
                    HKEY_LOCAL_MACHINE,
                    KEYNAME_TOUCH_DRIVER,
                    0,
                    0,
                    &hKey
                    );
                    
    if (dwStatus)
    {
        DEBUGMSG(ZONE_INIT | ZONE_WARN,
        	(TEXT("TOUCH:TouchPanelpGetPriority - RegOpenKeyEx(%s) failed %d, using default thread priorities\n"),
            KEYNAME_TOUCH_DRIVER, dwStatus));
        *ThrdPrio = DEFAULT_THREAD_PRIORITY;
        *ThrdHighPrio = DEFAULT_THREAD_HIGH_PRIORITY;
        return;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
一区二区激情小说| 不卡一二三区首页| 国产尤物一区二区| 91国在线观看| 国产日韩v精品一区二区| 性欧美大战久久久久久久久| 懂色中文一区二区在线播放| 欧美一二三区精品| 亚洲午夜激情av| eeuss鲁一区二区三区| 欧美xxxxxxxxx| 亚洲一区二区三区自拍| 成人免费视频视频| 日韩精品中文字幕一区二区三区| 亚洲国产精品一区二区www| 国产+成+人+亚洲欧洲自线| 日韩三级在线免费观看| 亚洲成人激情综合网| 99精品国产热久久91蜜凸| 日本一区二区成人在线| 国产综合色视频| 日韩欧美亚洲另类制服综合在线 | 一区二区三区视频在线观看| 国产伦精品一区二区三区免费迷 | 中文字幕一区在线观看视频| 精品综合免费视频观看| 91麻豆精品国产91久久久久| 亚洲午夜激情av| 欧美乱妇15p| 亚洲成人av一区二区三区| 欧美三级日韩在线| 亚洲国产成人精品视频| 欧美美女直播网站| 视频一区二区三区入口| 91精品国产综合久久福利软件| 亚洲动漫第一页| 欧美视频在线观看一区二区| 亚洲一区二区三区在线| 欧美日韩国产精品自在自线| 亚洲va中文字幕| 欧美精选午夜久久久乱码6080| 亚洲成人在线网站| 日韩免费视频线观看| 国产精品一区二区在线观看网站| 久久久欧美精品sm网站| 成人一区二区三区视频在线观看| 国产精品视频看| 日本韩国欧美国产| 日韩精品亚洲一区二区三区免费| 欧美一级理论性理论a| 国产一区二区在线影院| 国产精品成人免费| 欧美亚洲一区三区| 美女一区二区三区在线观看| 久久这里只有精品首页| 94-欧美-setu| 人人狠狠综合久久亚洲| 久久久国产午夜精品| 色狠狠一区二区| 六月丁香婷婷色狠狠久久| 国产精品入口麻豆九色| 在线免费一区三区| 久久国产尿小便嘘嘘尿| 国产精品欧美一级免费| 欧美日韩一级视频| 高清av一区二区| 亚洲成人av一区二区| 国产欧美日韩精品一区| 欧美性猛交xxxx乱大交退制版| 精品一区二区三区日韩| 综合网在线视频| 欧美草草影院在线视频| 91视频观看视频| 国产综合成人久久大片91| 亚洲一区在线观看视频| 亚洲国产精品二十页| 69精品人人人人| 99久久精品国产精品久久| 久久不见久久见免费视频1| 最新久久zyz资源站| 日韩午夜在线观看| 91久久精品一区二区三| 国产乱码精品一区二区三| 亚洲一卡二卡三卡四卡| 国产精品久久影院| 精品国产乱码久久久久久夜甘婷婷| 色综合中文综合网| 成人亚洲一区二区一| 青青草精品视频| 一区二区三区在线视频观看| 久久久国产精华| 日韩三级视频在线观看| 欧美在线啊v一区| av一本久道久久综合久久鬼色| 久久精品国产色蜜蜜麻豆| 亚洲一区二区三区三| 中文字幕一区二区三区不卡| 久久综合九色综合97婷婷| 日韩一区二区在线免费观看| 欧美日韩三级在线| 欧美亚洲综合另类| 色欧美片视频在线观看在线视频| 国产mv日韩mv欧美| 国产一区二区三区四| 激情欧美一区二区三区在线观看| 日韩二区三区四区| 免费人成黄页网站在线一区二区| 婷婷成人激情在线网| 亚洲国产视频一区二区| 一区二区三区免费在线观看| 亚洲日韩欧美一区二区在线| 国产精品国产自产拍高清av王其| 久久蜜桃av一区精品变态类天堂| 26uuu另类欧美亚洲曰本| xfplay精品久久| 国产片一区二区三区| 国产欧美日韩精品在线| 国产农村妇女精品| 国产精品久久久久国产精品日日| 亚洲欧洲一区二区在线播放| 久久香蕉国产线看观看99| 久久你懂得1024| 国产精品第一页第二页第三页| 中文字幕精品综合| ...中文天堂在线一区| 亚洲久草在线视频| 亚洲成av人片| 久草精品在线观看| 丁香婷婷综合激情五月色| 99久久夜色精品国产网站| 色老汉av一区二区三区| 在线综合亚洲欧美在线视频| 欧美一区二区三区色| 精品成a人在线观看| 国产亚洲精品精华液| 中文字幕在线观看一区二区| 亚洲国产成人精品视频| 激情成人综合网| 成人国产精品免费观看| 欧美三级电影一区| 精品区一区二区| ...xxx性欧美| 美女国产一区二区| 成人h版在线观看| 欧美日韩不卡视频| 久久久亚洲精品石原莉奈| 亚洲视频一区在线| 麻豆一区二区99久久久久| av激情成人网| 日韩无一区二区| 亚洲欧洲日韩av| 精品一区二区在线看| 色综合久久久久综合| 欧美一二三区在线| 亚洲欧美国产三级| 蜜臀久久99精品久久久久宅男| 99热这里都是精品| 亚洲精品一线二线三线| 亚洲男同性视频| 国产精品一品二品| 欧美日韩高清不卡| 中文字幕av在线一区二区三区| 亚洲一区二区精品视频| 懂色av一区二区夜夜嗨| 在线成人小视频| 亚洲免费在线视频一区 二区| 男男成人高潮片免费网站| 99久久久久免费精品国产| 欧美精品一区二区三区蜜桃| 一区二区三区日韩在线观看| 国产成人av资源| 精品美女一区二区| 日韩成人免费看| 欧美性生活久久| 亚洲手机成人高清视频| 国产精品一区久久久久| 日韩久久久精品| 日韩av二区在线播放| 欧美日韩午夜在线| 国产精品久久久久久久久晋中| 国产真实乱子伦精品视频| 日韩欧美一二区| 日本中文字幕一区二区视频| 在线观看av不卡| 一区二区三区在线影院| 色香蕉久久蜜桃| 国产精品久久久久久久久免费樱桃 | 亚洲在线免费播放| eeuss鲁片一区二区三区在线看| 久久精品视频在线免费观看| 国内成人自拍视频| 欧美刺激午夜性久久久久久久| 日韩va欧美va亚洲va久久| 欧洲激情一区二区| 亚洲综合色网站| 欧美日韩综合不卡| 亚洲国产va精品久久久不卡综合| 在线观看国产一区二区| 亚洲不卡av一区二区三区| 欧美亚洲免费在线一区|