⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 builtinkeypad_0409.cpp

📁 windows ce 6.0 keyboard driver
💻 CPP
字号:
//
// Copyright (c) Microsoft Corporation.  All rights reserved.
//
//
// Use of this sample source code is subject to the terms of the Microsoft
// license agreement under which you licensed this sample source code. If
// you did not accept the terms of the license agreement, you are not
// authorized to use this sample source code. For the terms of the license,
// please see the license agreement between you and Microsoft or, if applicable,
// see the LICENSE.RTF on your install media or the root of your tools installation.
// THE SAMPLE SOURCE CODE IS PROVIDED "AS IS", WITH NO WARRANTIES OR INDEMNITIES.
//
//
// (C) Copyright 2006 Marvell International Ltd.
// All Rights Reserved
//
/*++
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    EXTERNAL

@module BuiltInKeypad.cpp |

Sample implementation of the platform dependent scan code to
Virtual Key mapping for a built-in keypad driver.
    
*/
/******************************************************************************
**
** INTEL CONFIDENTIAL
** Copyright 2000-2004 Intel Corporation All Rights Reserved.
**
** The source code contained or described herein and all documents
** related to the source code (Material) are owned by Intel Corporation
** or its suppliers or licensors.  Title to the Material remains with
** Intel Corporation or its suppliers and licensors. The Material contains
** trade secrets and proprietary and confidential information of Intel
** or its suppliers and licensors. The Material is protected by worldwide
** copyright and trade secret laws and treaty provisions. No part of the
** Material may be used, copied, reproduced, modified, published, uploaded,
** posted, transmitted, distributed, or disclosed in any way without Intel抯
** prior express written permission.
**
** No license under any patent, copyright, trade secret or other intellectual
** property right is granted to or conferred upon you by disclosure or
** delivery of the Materials, either expressly, by implication, inducement,
** estoppel or otherwise. Any license under such intellectual property rights
** must be express and approved by Intel in writing.
**
/*****************************************************************************/


#include <windows.h>
#include <keybddr.h>
#include <laymgr.h>
#include <devicelayout.h>
#include "winuserm.h"

#include "keypad_soc.h"

#define NUM_SCAN_CODE_MAX            0x40

#define UNIQUE_KEY_SC_RAW_BEGIN      0x30
#define UNIQUE_KEY_SC_RAW_END        0x3F


#define KEY_STATE_ALL_SHIFTS_MSK (KeyShiftAnyShiftFlag | KeyShiftCapitalFlag |\
                                  KeyShiftLeftShiftFlag | KeyShiftRightShiftFlag)


// This is how we get most of the Zylonite's non-
//  alphanumeric characters translated properly to
//  Unicode.

typedef struct _FnTransform
{
    UINT32 ulVKey;
    BOOL   bReportAsShifted;
}FnTransform;

typedef struct _FnRemap
{
    FnTransform UnToggledTranform;
    FnTransform ToggledTranform;
}FnRemap;


const UINT8 RawScanCodeToWinCeScanCodeTable[NUM_SCAN_CODE_MAX] =
{
    0x00,  //  Scan Code 0x00     ['A'] 
    0x01,  //  Scan Code 0x01     ['B'] 
    0x02,  //  Scan Code 0x02     ['C'] 
    0x3A,  //  Scan Code 0x03     [VK_APP1] 
    0x3C,  //  Scan Code 0x04     [VK_APP3] 
    0x03,  //  Scan Code 0x05     ['D'] 
    0x20,  //  Scan Code 0x06     [VK_TSOFT1] 
    0x1B,  //  Scan Code 0x07     [VK_TUP] 
    0x04,  //  Scan Code 0x08     ['E'] 
    0x05,  //  Scan Code 0x09     ['F'] 
    0x06,  //  Scan Code 0x0A     ['G'] 
    0x31,  //  Scan Code 0x0B     ['1' and '@'] 
    0x33,  //  Scan Code 0x0C     ['3' and '?'] 
    0x07,  //  Scan Code 0x0D     ['H'] 
    0x21,  //  Scan Code 0x0E     [VK_TSOFT2] 
    0x1C,  //  Scan Code 0x0F     [VK_TDOWN] 

    0x08,  //  Scan Code 0x10     ['I'] 
    0x09,  //  Scan Code 0x11     ['J'] 
    0x0A,  //  Scan Code 0x12     ['K'] 
    0x34,  //  Scan Code 0x13     ['4' and '-'] 
    0x36,  //  Scan Code 0x14     ['6' and '\'] 
    0x0B,  //  Scan Code 0x15     ['L'] 
    0x22,  //  Scan Code 0x16     [VK_THOME]
    0x1D,  //  Scan Code 0x17     [VK_TLEFT]
    0x0C,  //  Scan Code 0x18     ['M'] 
    0x0D,  //  Scan code 0x19     ['N'] 
    0x0E,  //  Scan Code 0x1A     ['O'] 
    0x37,  //  Scan Code 0x1B     ['7' and ':'] 
    0x39,  //  Scan Code 0x1C     ['9' and '"'] 
    0x0F,  //  Scan Code 0x1D     ['P'] 
    0x23,  //  Scan Code 0x1E     [VK_TBACK]
    0x1E,  //  Scan Code 0x1F     [VK_TRIGHT] 

    0x3B,  //  Scan Code 0x20     [VK_APP2] 
    0x32,  //  Scan Code 0x21     ['2' and '&'] 
    0x35,  //  Scan Code 0x22     ['5' and '''] 
    0x38,  //  Scan Code 0x23     ['8' and ';'] 
    0x30,  //  Scan Code 0x24     ['0' and '+'] 
    0x1A,  //  Scan Code 0x25     [VK_SPACE] 
    0x1F,  //  Scan Code 0x26     [WHEEL_PRESS]
    0xFF,  //  Scan Code 0x27
    0x10,  //  Scan Code 0x28     ['Q'] 
    0x11,  //  Scan Code 0x29     ['R'] 
    0x12,  //  Scan Code 0x2A     ['S'] 
    0x3D,  //  Scan Code 0x2B     ['*' and ','] 
    0x3E,  //  Scan Code 0x2C     ['#' and '.'] 
    0x13,  //  Scan Code 0x2D     ['T'] 
    0x24,  //  Scan Code 0x2E     [VK_TTALK]
    0x1F,  //  Scan Code 0x2F     [VK_RETURN]

    0x14,  //  Scan Code 0x30     ['U'] 
    0x15,  //  Scan Code 0x31     ['V'] 
    0x16,  //  Scan Code 0x32     ['W'] 
    0x26,  //  Scan Code 0x33     [VK_CAPITAL] 
    0x3F,  //  Scan Code 0x34     [VK_RETURN] 
    0x17,  //  scan code 0x35      ['X'] 
    0x25,  //  Scan Code 0x36     [VK_TEND]
    0xFF,  //  Scan Code 0x37     [Up left Corner]
    0xFF,  //  Scan Code 0x38
    0x18,  //  Scan Code 0x39     ['Y'] 
    0x19,  //  Scan Code 0x3A     ['Z'] 
    0xFF,  //  Scan Code 0x3B
    0x29,  //  Scan Code 0x3C     [WHEEL_UP]
    0x2A,  //  Scan Code 0x3D     [WHEEL_DOWN] 
    0xFF,  //  Scan Code 0x3E     [Right Corner] 
    0xFF   //  Scan Code 0x3F     [Down left Corner] 
};  //RawScanCodeToWinCeScanCodeTable[]


const UINT8 WinCeScanCodeToVKeyTable[NUM_SCAN_CODE_MAX]=
{
    'A',           // 0x00
    'B',           // 0x01
    'C',           // 0x02
    'D',           // 0x03
    'E',           // 0x04
    'F',           // 0x05
    'G',           // 0x06
    'H',           // 0x07
    'I',           // 0x08
    'J',           // 0x09
    'K',           // 0x0A
    'L',           // 0x0B
    'M',           // 0x0C
    'N',           // 0x0D
    'O',           // 0x0E
    'P',           // 0x0F
    'Q',           // 0x10
    'R',           // 0x11
    'S',           // 0x12
    'T',           // 0x13
    'U',           // 0x14
    'V',           // 0x15
    'W',           // 0x16
    'X',           // 0x17
    'Y',           // 0x18
    'Z',           // 0x19
    VK_SPACE,      // 0X1A
    VK_TUP,        // 0X1B
    VK_TDOWN,      // 0X1C
    VK_TLEFT,      // 0X1D
    VK_TRIGHT,     // 0X1E
    VK_RETURN,     // 0X1F
    VK_TAB, //VK_TSOFT1,     // 0X20
    VK_TSOFT2,     // 0X21
    VK_THOME,      // 0X22
    VK_TBACK,      // 0x23
    VK_TTALK,      // 0x24
    VK_TEND,       // 0x25
    VK_CAPITAL,    // 0x26
    VK_TVOLUMEUP,  // 0x27
    VK_TVOLUMEDOWN,// 0x28
    VK_UP,         // 0x29
    VK_DOWN,       // 0x2A
    0,             // 0x2B
    0,             // 0x2C
    0,             // 0x2D
    0,             // 0x2E
    0,             // 0x2F
    
    VK_T0,         // 0x30
    VK_T1,         // 0x31
    VK_T2,         // 0x32
    VK_T3,         // 0x33
    VK_T4,         // 0x34
    VK_T5,         // 0x35
    VK_T6,         // 0x36
    VK_T7,         // 0x37
    VK_T8,         // 0x38
    VK_T9,         // 0x39
    VK_APP1,       // 0x3A
    VK_APP2,       // 0x3B
    VK_APP3,       // 0x3C
    VK_COMMA,      // 0x3D
    VK_PERIOD,     // 0x3E
    VK_RETURN,     // 0x3F
};

// transform:    vk           shifted?      vk           shifted?
static FnRemap FnRampTable[] =
{
    { {VK_T0,   FALSE}, {VK_ADD,        FALSE} },     // 0x00
    { {VK_T1,   FALSE}, {'2',           TRUE } },     // 0x01
    { {VK_T2,   FALSE}, {'7',           TRUE } },     // 0x02
    { {VK_T3,   FALSE}, {VK_SLASH,      TRUE } },     // 0x03
    { {VK_T4,   FALSE}, {VK_HYPHEN,     FALSE} },     // 0x04
    { {VK_T5,   FALSE}, {VK_APOSTROPHE, FALSE} },     // 0x05
    { {VK_T6,   FALSE}, {VK_BACKSLASH,  FALSE} },     // 0x06
    { {VK_T7,   FALSE}, {VK_SEMICOLON,  TRUE } },     // 0x07
    { {VK_T8,   FALSE}, {VK_SEMICOLON,  FALSE} },     // 0x08
    { {VK_T9,   FALSE}, {VK_APOSTROPHE, TRUE } },     // 0x09
    { {VK_APP1, FALSE}, {'9',           TRUE } },     // 0x0A
    { {VK_APP2, FALSE}, {'0',           TRUE } },     // 0x0B
    { {VK_APP3, FALSE}, {'1',           TRUE } },     // 0x0C
    { {'8',     TRUE }, {VK_COMMA,      FALSE} },     // 0x0D
    { {'3',     TRUE }, {VK_PERIOD,     FALSE} },     // 0x0E
    { {VK_BACK, FALSE}, {VK_RETURN,     FALSE} },     // 0x0F
};

static ScanCodeToVKeyData  MainScanCodeToVKeyTableInfo  = 
{
    0,
    0,
    NUM_SCAN_CODE_MAX - 1,
    (UINT8 *)&WinCeScanCodeToVKeyTable[0]
};


static ScanCodeToVKeyData *rgscvkBuiltInKeypad_Tables[] = 
    { &MainScanCodeToVKeyTableInfo };


UINT8 KbdPlatGetWinCeScanCode(UINT8 ucRawSc)
{
    if (ucRawSc < NUM_SCAN_CODE_MAX)
    {
        return RawScanCodeToWinCeScanCodeTable[ucRawSc];
    }

    return 0xFF;
}


static UINT WINAPI
BuiltInKeypad_RemapVKey(
    const KEYBD_EVENT *pKbdEvents,
    UINT               cKbdEvents,
    KEYBD_EVENT       *pRmpKbdEvents,
    UINT               cMaxRmpKbdEvents
    )
{
    SETFNAME(_T("BuiltInKeypad_RemapVKey"));

    UINT uiSumRemapped = 0;
    UINT i;

    if (NULL == pRmpKbdEvents)
    {
        return cKbdEvents * 3;
    }

    for (i=0; i<cKbdEvents; i++)
    {
        if ((pKbdEvents->uiSc >= UNIQUE_KEY_SC_RAW_BEGIN) && 
                (pKbdEvents->uiSc <= UNIQUE_KEY_SC_RAW_END))
        {
            UINT8 ucFnTransIndex;
            FnTransform *pFnTrans;

            ucFnTransIndex = pKbdEvents->uiSc - UNIQUE_KEY_SC_RAW_BEGIN;

            if (pKbdEvents->KeyStateFlags & KeyShiftCapitalFlag)
            {
                pFnTrans = &(FnRampTable[ucFnTransIndex].ToggledTranform);
            }
            else
            {
                pFnTrans = &(FnRampTable[ucFnTransIndex].UnToggledTranform);
            }

            if (pFnTrans->bReportAsShifted)
            {
                pRmpKbdEvents->KeyStateFlags = KeyStateDownFlag;
                pRmpKbdEvents->uiVk = VK_SHIFT;  // set shift state to true
                pRmpKbdEvents->uiSc = 0x4D; // invent a scan code
                pRmpKbdEvents++;
                uiSumRemapped++;

                pRmpKbdEvents->KeyStateFlags = pKbdEvents->KeyStateFlags;
                pRmpKbdEvents->uiVk = pFnTrans->ulVKey;
                pRmpKbdEvents->uiSc = pKbdEvents->uiSc;
                pRmpKbdEvents++;
                uiSumRemapped++;

                pRmpKbdEvents->KeyStateFlags = 0;
                pRmpKbdEvents->uiVk = VK_SHIFT; // set shift state to true
                pRmpKbdEvents->uiSc = 0x4D; // invent a scan code
            }
            else
            {
                pRmpKbdEvents->uiVk = pFnTrans->ulVKey;
                pRmpKbdEvents->KeyStateFlags = pKbdEvents->KeyStateFlags & (~KEY_STATE_ALL_SHIFTS_MSK);
                pRmpKbdEvents->uiSc = pKbdEvents->uiSc;
            }
        }
        else
        {
            // Standard key.  Normal processing.
            pRmpKbdEvents->uiVk = pKbdEvents->uiVk;
            pRmpKbdEvents->uiSc = pKbdEvents->uiSc;
            pRmpKbdEvents->KeyStateFlags = pKbdEvents->KeyStateFlags;
        }

        pRmpKbdEvents++;
        pKbdEvents++;
        uiSumRemapped++;
    }

    return uiSumRemapped;
} // BuiltInKeypad_RemapVKey()
    

static DEVICE_LAYOUT dlBuiltInKeypad =
{
    sizeof(DEVICE_LAYOUT),
    KEYPAD_PDD_ID,
    rgscvkBuiltInKeypad_Tables,
    dim(rgscvkBuiltInKeypad_Tables),
    BuiltInKeypad_RemapVKey,
};


// Suffix  _00000409 is required for layouts that support
// (US English)
extern "C" BOOL
BuiltInKeypad_00000409(
    PDEVICE_LAYOUT pDeviceLayout
    )
{
    DEBUGCHK(pDeviceLayout != NULL);

    if (pDeviceLayout->dwSize != sizeof(DEVICE_LAYOUT))
    {
        RETAILMSG(1, (_T("BuiltInKeypad_00000409: data structure size mismatch\r\n")));
        return FALSE;
    }

    *pDeviceLayout = dlBuiltInKeypad;

    return TRUE;
}


#ifdef DEBUG
// Verify function declaration against the typedef.
static PFN_DEVICE_LAYOUT_ENTRY v_pfnDeviceLayout = BuiltInKeypad_00000409;
#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -