1 /******************************************************************************************************************************************
2 * 文件名称: usbh_hid_keybd.c
3 * 功能说明:
4 * 技术支持: http://www.synwit.com.cn/e/tool/gbook/?bid=1
5 * 注意事项:
6 * 版本日期: V1.1.0      2020年11月3日
7 * 升级记录:
8 *
9 *
10 *******************************************************************************************************************************************
11 * @attention
12 *
13 * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS WITH CODING INFORMATION
14 * REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. AS A RESULT, SYNWIT SHALL NOT BE HELD LIABLE
15 * FOR ANY DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE CONTENT
16 * OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING INFORMATION CONTAINED HEREIN IN CONN-
17 * -ECTION WITH THEIR PRODUCTS.
18 *
19 * COPYRIGHT 2012 Synwit Technology
20 *******************************************************************************************************************************************/
21 #include <string.h>
22 #include "SWM341.h"
23 #include "usbh_hid_core.h"
24 #include "usbh_hid_keybd.h"
25 
26 
27 USBH_HID_cb_t USBH_HID_KeyBD_cb =
28 {
29     USBH_HID_KeyBD_Init,
30     USBH_HID_KeyBD_Decode
31 };
32 
33 
34 static const uint8_t HID_KEYBRD_Codes[] = {
35       0,   0,   0,   0,  31,  50,  48,  33,  19,  34,  35,  36,  24,  37,  38,  39,
36      52,  51,  25,  26,  17,  20,  32,  21,  23,  49,  18,  47,  22,  46,   2,   3,
37       4,   5,   6,   7,   8,   9,  10,  11,  43, 110,  15,  16,  61,  12,  13,  27,
38      28,  29,  42,  40,  41,   1,  53,  54,  55,  30, 112, 113, 114, 115, 116, 117,
39     118, 119, 120, 121, 122, 123, 124, 125, 126,  75,  80,  85,  76,  81,  86,  89,
40      79,  84,  83,  90,  95, 100, 105, 106, 108,  93,  98, 103,  92,  97, 102,  91,
41      96, 101,  99, 104,  45, 129,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
42       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
43       0,   0,   0,   0,   0, 107,   0,  56,   0,   0,   0,   0,   0,   0,   0,   0,
44       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
45       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
46       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
47       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
48       0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
49      58,  44,  60, 127,  64,  57,  62, 128,
50 };
51 
52 static const uint8_t HID_KEYBRD_Key[] = {
53     '\0', '`',  '1',  '2',  '3',  '4',  '5',  '6',  '7',  '8',
54     '9',  '0',  '-',  '=',  '\0', '\r', '\t', 'q',  'w',  'e',
55     'r',  't',  'y',  'u',  'i',  'o',  'p',  '[',  ']',  '\\',
56     '\0', 'a',  's',  'd',  'f',  'g',  'h',  'j',  'k',  'l',
57     ';',  '\'', '\0', '\n', '\0', '\0', 'z',  'x',  'c',  'v',
58     'b',  'n',  'm',  ',',  '.',  '/',  '\0', '\0', '\0', '\0',
59     '\0', ' ',  '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
60     '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
61     '\r', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
62     '\0', '7',  '4',  '1',  '\0', '/',  '8',  '5',  '2',  '0',
63     '*',  '9',  '6',  '3',  '.',  '-',  '+',  '\0', '\n', '\0',
64     '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
65     '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0'
66 };
67 
68 static const uint8_t HID_KEYBRD_ShiftKey[] = {
69     '\0', '~',  '!',  '@',  '#',  '$',  '%',  '^',  '&',  '*',
70     '(',  ')',  '_',  '+',  '\0', '\0', '\0', 'Q',  'W',  'E',
71     'R',  'T',  'Y',  'U',  'I',  'O',  'P',  '{',  '}',  '|',
72     '\0', 'A',  'S',  'D',  'F',  'G',  'H',  'J',  'K',  'L',
73     ':',  '"',  '\0', '\n', '\0', '\0', 'Z',  'X',  'C',  'V',
74     'B',  'N',  'M',  '<',  '>',  '?',  '\0', '\0', '\0', '\0',
75     '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
76     '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
77     '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
78     '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
79     '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
80     '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
81     '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0'
82 };
83 
84 
85 static uint8_t keys_last[6];
86 static uint8_t nbr_keys_last;
87 
88 
USBH_HID_KeyBD_Init(void)89 void USBH_HID_KeyBD_Init(void)
90 {
91     nbr_keys_last = 0;
92     memset(keys_last, 0x00, 6);
93 }
94 
95 
USBH_HID_KeyBD_Decode(uint8_t * pbuf)96 void USBH_HID_KeyBD_Decode(uint8_t *pbuf)
97 {
98     char key;
99     uint8_t i, j;
100     uint8_t keys[6];
101     uint8_t keys_new[6];
102     uint8_t nbr_keys;
103     uint8_t nbr_keys_new;
104 
105     for(i = 2; i < 8; i++)
106     {
107         if((pbuf[i] == 0x01) || (pbuf[i] == 0x02) || (pbuf[i] == 0x03))
108             return;
109     }
110 
111     nbr_keys     = 0;
112     nbr_keys_new = 0;
113     for(i = 2; i < 8; i++)
114     {
115         if(pbuf[i] != 0x00)
116         {
117             keys[nbr_keys++] = pbuf[i];
118 
119             for(j = 0; j < nbr_keys_last; j++)
120             {
121                 if(pbuf[i] == keys_last[j])
122                     break;
123             }
124 
125             if(j == nbr_keys_last)  // 遍历到了最后,说明 pbuf[i] 不在 keys_last 中,是新按下的
126                 keys_new[nbr_keys_new++] = pbuf[i];
127         }
128     }
129 
130     if(nbr_keys_new == 1)
131     {
132         if((pbuf[0] & KBD_LEFT_SHIFT) || (pbuf[0] & KBD_RIGHT_SHIFT))
133         {
134             key = HID_KEYBRD_ShiftKey[HID_KEYBRD_Codes[keys_new[0]]];
135         }
136         else
137         {
138             key = HID_KEYBRD_Key[HID_KEYBRD_Codes[keys_new[0]]];
139         }
140 
141         USBH_HID_KeyBD_Handle(pbuf[0], key);    // call user process handle
142     }
143 
144     memcpy(keys_last, keys, 6);
145     nbr_keys_last = nbr_keys;
146 }
147 
148 
149 __attribute__((weak))
USBH_HID_KeyBD_Handle(uint8_t ctrl,char key)150 void USBH_HID_KeyBD_Handle(uint8_t ctrl, char key)
151 {
152     if((ctrl & KBD_LEFT_CTRL) | (ctrl & KBD_RIGHT_CTRL))
153         printf("Ctrl-");
154 
155     if((ctrl & KBD_LEFT_ALT) | (ctrl & KBD_RIGHT_ALT))
156         printf("Alt-");
157 
158     printf("%c\r\n", key);
159 }
160