Updates to mapping table for Wyse KB3926

This commit is contained in:
Philip Smart
2022-01-30 18:18:27 +00:00
parent 8c5cb2fa8e
commit 0206d45472
4 changed files with 529 additions and 406 deletions

View File

@@ -46,30 +46,32 @@
// Row D7 D6 D5 D4 D3 D2 D1 D0
//----------------------------------------------------------------------------------
// 0 F8 F7 F6 F5 F4 F3 F2 F1
// 1 - + . , 9 8 F1O F9
// 2 7 6 5 4 3 2 1 0
// 1 KP - KP + KP . KP , KP 9 KP 8 F1O F9
// 2 KP 7 KP 6 KP 5 KP 4 KP 3 KP 2 KP 1 KP 0
// 3 BREAK RIGHT LEFT DOWN UP RETURN SPACE TAB
// 4 G F E D C B A ?
// 5 O N M L K J I H
// 6 W V U T S R Q P
// 7 <¿ .>¿ ¿¿ ¿ | '¿ Z ¿ Y X ¿
// 8 7' 6& 5% 4$ 3# 2" 1! 0
// 9 [( @ -= ;+ :* 9) 8(
// 10 / * ESC BACKSPACE INST/DEL CLR/HOME COPY ]}
// 11 CTRL ¿¿ SHIFT LOCK GRAPH
// 12 ¿¿ ¿¿¿
// 13 HELP ARGO
// 4 G F E D C B A / ?
// 5 O N M L K J I H
// 6 W V U T S R Q P
// 7 , < . > _ YEN | ^ '¿ Z ¿ Y X ¿
// 8 7 ' 6 & 5 % 4 $ 3 # 2 " 1 ! 0
// 9 [ { @ ` - = ; + : * 9 ) 8 (
// 10 KP / KP * ESC BACKSPACE INST/DEL CLR/HOME COPY ] }
// 11 CTRL KANA SHIFT LOCK GRAPH
// 12 KJ2 KJ1
// 13 HELP ARGO
//
// Col 0 1 2 3 4 5 6 7 8 9 10 11 12 13
// --------------------------------------------------------------------------------------------------------------------------------------
// D0 F1 F9 0 TAB ? H P 0 8( ]} GRAPH ¿¿¿ ARGO
// D1 F2 F10 1 SPACE A I Q T 1! 9) COPY LOCK ¿¿ HELP
// D2 F3 8 2 RETURN B J R Z ¿ 2" :* CLR/HOME SHIFT
// D3 F4 9 3 UP C K S | '¿ 3# ;+ INST/DEL ¿¿
// D4 F5 , 4 DOWN D L T ¿ 4$ -= BACKSPACE CTRL
// D5 F6 . 5 LEFT E M U ¿¿ 5% @ ESC
// D6 F7 + 6 RIGHT F N V .>¿ 6& [( *
// D7 F8 - 7 BREAK G O W <¿ 7' /
// D0 F1 F9 KP 0 TAB / ? H P X 0 8 ( ] } GRAPH KJ1 ARGO
// D1 F2 F10 KP 1 SPACE A I Q Y 1 ! 9 ) COPY LOCK KJ2 HELP
// D2 F3 KP 8 KP 2 RETURN B J R Z 2 " : * CLR/HOME SHIFT
// D3 F4 KP 9 KP 3 UP C K S ^ '¿ 3 # ; + INST/DEL KANA
// D4 F5 KP , KP 4 DOWN D L T YEN | 4 $ - = BACKSPACE CTRL
// D5 F6 KP . KP 5 LEFT E M U _ 5 % @ ` ESC
// D6 F7 KP + KP 6 RIGHT F N V . > 6 & [ { KP *
// D7 F8 KP - KP 7 BREAK G O W , < 7 ' KP /
//
//
#define PSMZTBL_KEYPOS 0
#define PSMZTBL_SHIFTPOS 1
@@ -77,121 +79,190 @@
#define PSMZTBL_CTRLPOS 3
#define PSMZTBL_ALTPOS 4
#define PSMZTBL_ALTGRPOS 5
#define PSMZTBL_MXROW1 6
#define PSMZTBL_MXKEY1 7
#define PSMZTBL_MXROW2 8
#define PSMZTBL_MXKEY2 9
#define PSMZTBL_MXROW3 10
#define PSMZTBL_MXKEY3 11
#define PSMZTBL_MAXROWS 12
#define PSMZTBL_GUIPOS 6
#define PSMZTBL_MXROW1 7
#define PSMZTBL_MXKEY1 8
#define PSMZTBL_MXROW2 9
#define PSMZTBL_MXKEY2 10
#define PSMZTBL_MXROW3 11
#define PSMZTBL_MXKEY3 12
#define PSMZTBL_MAXROWS 13
// Lookup table to matrix row/column co-ordinates. If a PS2 key is matched, then the Matrix is updated
// using ROW to point into the array, equivalent of strobe line, and the KEY defines the bits to be set.
// A set bit = 0, reset bits = 1. The KEY value needs to be inverted and masked with the matrix
// to affect change.
const unsigned char PS2toMZ[][PSMZTBL_MAXROWS] =
{
// PS2 Code Shift Function Ctrl ALT ALT-Gr MXROW1 MXKEY1 MXROW2 MXKEY2 MXROW3 MXKEY3
PS2_KEY_F1, 0, 0, 0, 0, 0, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF,
PS2_KEY_F2, 0, 0, 0, 0, 0, 0x00, 0x02, 0xFF, 0xFF, 0xFF, 0xFF,
PS2_KEY_F3, 0, 0, 0, 0, 0, 0x00, 0x04, 0xFF, 0xFF, 0xFF, 0xFF,
PS2_KEY_F4, 0, 0, 0, 0, 0, 0x00, 0x08, 0xFF, 0xFF, 0xFF, 0xFF,
PS2_KEY_F5, 0, 0, 0, 0, 0, 0x00, 0x10, 0xFF, 0xFF, 0xFF, 0xFF,
PS2_KEY_F6, 0, 0, 0, 0, 0, 0x00, 0x20, 0xFF, 0xFF, 0xFF, 0xFF,
PS2_KEY_F7, 0, 0, 0, 0, 0, 0x00, 0x40, 0xFF, 0xFF, 0xFF, 0xFF,
PS2_KEY_F8, 0, 0, 0, 0, 0, 0x00, 0x80, 0xFF, 0xFF, 0xFF, 0xFF,
PS2_KEY_F9, 0, 0, 0, 0, 0, 0x01, 0x01, 0xFF, 0xFF, 0xFF, 0xFF,
PS2_KEY_F10, 0, 0, 0, 0, 0, 0x01, 0x02, 0xFF, 0xFF, 0xFF, 0xFF,
PS2_KEY_F11, 0, 0, 0, 0, 0, 0x0D, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, // HELP
PS2_KEY_F12, 0, 0, 0, 0, 0, 0x03, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, // BREAK
PS2_KEY_TAB, 0, 0, 0, 0, 0, 0x03, 0x01, 0xFF, 0xFF, 0xFF, 0xFF,
PS2_KEY_PIPE, 0, 0, 0, 0, 0, 0x07, 0x08, 0xFF, 0xFF, 0xFF, 0xFF,
PS2_KEY_L_ALT, 0, 0, 0, 0, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
PS2_KEY_R_ALT, 0, 0, 0, 0, 0, 0x0B, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, // GRAPH
PS2_KEY_L_SHIFT, 0, 0, 0, 0, 0, 0x0B, 0x04, 0xFF, 0xFF, 0xFF, 0xFF,
PS2_KEY_L_CTRL, 0, 0, 0, 0, 0, 0x0B, 0x10, 0xFF, 0xFF, 0xFF, 0xFF,
PS2_KEY_R_CTRL, 0, 0, 0, 0, 0, 0x0B, 0x10, 0xFF, 0xFF, 0xFF, 0xFF,
PS2_KEY_0, 0, 0, 0, 0, 0, 0x02, 0x01, 0xFF, 0xFF, 0xFF, 0xFF,
PS2_KEY_1, 0, 0, 0, 0, 0, 0x02, 0x02, 0xFF, 0xFF, 0xFF, 0xFF,
PS2_KEY_2, 0, 0, 0, 0, 0, 0x02, 0x04, 0xFF, 0xFF, 0xFF, 0xFF,
PS2_KEY_3, 0, 0, 0, 0, 0, 0x02, 0x08, 0xFF, 0xFF, 0xFF, 0xFF,
PS2_KEY_4, 0, 0, 0, 0, 0, 0x02, 0x10, 0xFF, 0xFF, 0xFF, 0xFF,
PS2_KEY_5, 0, 0, 0, 0, 0, 0x02, 0x20, 0xFF, 0xFF, 0xFF, 0xFF,
PS2_KEY_6, 0, 0, 0, 0, 0, 0x02, 0x40, 0xFF, 0xFF, 0xFF, 0xFF,
PS2_KEY_7, 0, 0, 0, 0, 0, 0x02, 0x80, 0xFF, 0xFF, 0xFF, 0xFF,
PS2_KEY_8, 0, 0, 0, 0, 0, 0x01, 0x04, 0xFF, 0xFF, 0xFF, 0xFF,
PS2_KEY_9, 0, 0, 0, 0, 0, 0x01, 0x08, 0xFF, 0xFF, 0xFF, 0xFF,
PS2_KEY_A, 0, 0, 0, 0, 0, 0x04, 0x02, 0xFF, 0xFF, 0xFF, 0xFF,
PS2_KEY_B, 0, 0, 0, 0, 0, 0x04, 0x04, 0xFF, 0xFF, 0xFF, 0xFF,
PS2_KEY_C, 0, 0, 0, 0, 0, 0x04, 0x08, 0xFF, 0xFF, 0xFF, 0xFF,
PS2_KEY_D, 0, 0, 0, 0, 0, 0x04, 0x10, 0xFF, 0xFF, 0xFF, 0xFF,
PS2_KEY_E, 0, 0, 0, 0, 0, 0x04, 0x20, 0xFF, 0xFF, 0xFF, 0xFF,
PS2_KEY_F, 0, 0, 0, 0, 0, 0x04, 0x40, 0xFF, 0xFF, 0xFF, 0xFF,
PS2_KEY_G, 0, 0, 0, 0, 0, 0x04, 0x80, 0xFF, 0xFF, 0xFF, 0xFF,
PS2_KEY_H, 0, 0, 0, 0, 0, 0x05, 0x01, 0xFF, 0xFF, 0xFF, 0xFF,
PS2_KEY_I, 0, 0, 0, 0, 0, 0x05, 0x02, 0xFF, 0xFF, 0xFF, 0xFF,
PS2_KEY_J, 0, 0, 0, 0, 0, 0x05, 0x04, 0xFF, 0xFF, 0xFF, 0xFF,
PS2_KEY_K, 0, 0, 0, 0, 0, 0x05, 0x08, 0xFF, 0xFF, 0xFF, 0xFF,
PS2_KEY_L, 0, 0, 0, 0, 0, 0x05, 0x10, 0xFF, 0xFF, 0xFF, 0xFF,
PS2_KEY_M, 0, 0, 0, 0, 0, 0x05, 0x20, 0xFF, 0xFF, 0xFF, 0xFF,
PS2_KEY_N, 0, 0, 0, 0, 0, 0x05, 0x40, 0xFF, 0xFF, 0xFF, 0xFF,
PS2_KEY_O, 0, 0, 0, 0, 0, 0x05, 0x80, 0xFF, 0xFF, 0xFF, 0xFF,
PS2_KEY_P, 0, 0, 0, 0, 0, 0x06, 0x01, 0xFF, 0xFF, 0xFF, 0xFF,
PS2_KEY_Q, 0, 0, 0, 0, 0, 0x06, 0x02, 0xFF, 0xFF, 0xFF, 0xFF,
PS2_KEY_R, 0, 0, 0, 0, 0, 0x06, 0x04, 0xFF, 0xFF, 0xFF, 0xFF,
PS2_KEY_S, 0, 0, 0, 0, 0, 0x06, 0x08, 0xFF, 0xFF, 0xFF, 0xFF,
PS2_KEY_T, 0, 0, 0, 0, 0, 0x06, 0x10, 0xFF, 0xFF, 0xFF, 0xFF,
PS2_KEY_U, 0, 0, 0, 0, 0, 0x06, 0x20, 0xFF, 0xFF, 0xFF, 0xFF,
PS2_KEY_V, 0, 0, 0, 0, 0, 0x06, 0x40, 0xFF, 0xFF, 0xFF, 0xFF,
PS2_KEY_W, 0, 0, 0, 0, 0, 0x06, 0x80, 0xFF, 0xFF, 0xFF, 0xFF,
PS2_KEY_X, 0, 0, 0, 0, 0, 0x07, 0x01, 0xFF, 0xFF, 0xFF, 0xFF,
PS2_KEY_Y, 0, 0, 0, 0, 0, 0x07, 0x02, 0xFF, 0xFF, 0xFF, 0xFF,
PS2_KEY_Z, 0, 0, 0, 0, 0, 0x07, 0x04, 0xFF, 0xFF, 0xFF, 0xFF,
PS2_KEY_SPACE, 0, 0, 0, 0, 0, 0x03, 0x02, 0xFF, 0xFF, 0xFF, 0xFF,
PS2_KEY_COMMA, 0, 0, 0, 0, 0, 0x01, 0x10, 0xFF, 0xFF, 0xFF, 0xFF,
PS2_KEY_SEMI, 0, 0, 0, 0, 0, 0x09, 0x08, 0xFF, 0xFF, 0xFF, 0xFF,
PS2_KEY_STOP, 0, 0, 0, 0, 0, 0x01, 0x20, 0xFF, 0xFF, 0xFF, 0xFF,
PS2_KEY_DIV, 0, 0, 0, 0, 0, 0x0A, 0x80, 0xFF, 0xFF, 0xFF, 0xFF,
PS2_KEY_MINUS, 0, 0, 0, 0, 0, 0x01, 0x80, 0xFF, 0xFF, 0xFF, 0xFF,
PS2_KEY_APOS, 0, 0, 0, 0, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
PS2_KEY_OPEN_SQ, 0, 0, 0, 0, 0, 0x09, 0x40, 0xFF, 0xFF, 0xFF, 0xFF,
PS2_KEY_EQUAL, 0, 0, 0, 0, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
PS2_KEY_CAPS, 0, 0, 0, 0, 0, 0x08, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, // LOCK
PS2_KEY_R_SHIFT, 0, 0, 0, 0, 0, 0x0B, 0x04, 0xFF, 0xFF, 0xFF, 0xFF,
PS2_KEY_ENTER, 0, 0, 0, 0, 0, 0x03, 0x04, 0xFF, 0xFF, 0xFF, 0xFF,
PS2_KEY_CLOSE_SQ, 0, 0, 0, 0, 0, 0x0A, 0x01, 0xFF, 0xFF, 0xFF, 0xFF,
PS2_KEY_BACK, 0, 0, 0, 0, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
PS2_KEY_LESSTHAN, 0, 0, 0, 0, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
PS2_KEY_BS, 0, 0, 0, 0, 0, 0x0A, 0x10, 0xFF, 0xFF, 0xFF, 0xFF,
PS2_KEY_ESC, 0, 0, 0, 0, 0, 0x0A, 0x20, 0xFF, 0xFF, 0xFF, 0xFF,
PS2_KEY_KP1, 0, 0, 0, 0, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
PS2_KEY_KP2, 0, 0, 0, 0, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
PS2_KEY_KP3, 0, 0, 0, 0, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
PS2_KEY_KP4, 0, 0, 0, 0, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
PS2_KEY_KP5, 0, 0, 0, 0, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
PS2_KEY_KP6, 0, 0, 0, 0, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
PS2_KEY_KP7, 0, 0, 0, 0, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
PS2_KEY_KP8, 0, 0, 0, 0, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
PS2_KEY_KP9, 0, 0, 0, 0, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
PS2_KEY_KP0, 0, 0, 0, 0, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
PS2_KEY_KP_COMMA, 0, 0, 0, 0, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
PS2_KEY_KP_PLUS, 0, 0, 0, 0, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
PS2_KEY_KP_MINUS, 0, 0, 0, 0, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
PS2_KEY_KP_TIMES, 0, 0, 0, 0, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
PS2_KEY_KP_DIV, 0, 0, 0, 0, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
PS2_KEY_SCROLL, 0, 0, 0, 0, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
PS2_KEY_INSERT, 0, 0, 0, 0, 0, 0x0A, 0x08, 0x0B, 0x04, 0xFF, 0xFF, // SHIFT + INST/DEL
PS2_KEY_HOME, 0, 0, 0, 0, 0, 0x0A, 0x04, 0xFF, 0xFF, 0xFF, 0xFF, // CLR/HOME
PS2_KEY_PGUP, 0, 0, 0, 0, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
PS2_KEY_DELETE, 0, 0, 0, 0, 0, 0x0A, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, // INST/DEL
PS2_KEY_END, 0, 0, 0, 0, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
PS2_KEY_PGDN, 0, 0, 0, 0, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
PS2_KEY_UP_ARROW, 0, 0, 0, 0, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
PS2_KEY_L_ARROW, 0, 0, 0, 0, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
PS2_KEY_DN_ARROW, 0, 0, 0, 0, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
PS2_KEY_R_ARROW, 0, 0, 0, 0, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
PS2_KEY_NUM, 0, 0, 0, 0, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0, 0, 0, 0, 0, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
};
// using ROW to point into the array with a column value, equivalent of strobe line and the KEY defines the bits to be set.
// Upto 3 matrix bits can be set (3 key presses on the MZ-2500 keyboard) per PS/2 key.
// A set bit = 1, reset bits = 0 but is inverted in the actual matrix (1 = inactive, 0 = active).
// The table is scanned for a match from top to bottom. The first match is used so order is important. Japanese characters still
// need to be added.
//
#if defined(CONFIG_KEYMAP_WYSE_KB3926) || defined(CONFIG_KEYMAP_STANDARD)
//
// This mapping is for the UK Wyse KB-3926 PS/2 keyboard
//
const unsigned char PS2toMZ[][PSMZTBL_MAXROWS] =
{
// PS2 Code Shift Function Ctrl ALT ALT-Gr GUI MXROW1 MXKEY1 MXROW2 MXKEY2 MXROW3 MXKEY3
PS2_KEY_F1, 0, 0, 0, 0, 0, 0, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, // F1
PS2_KEY_F2, 0, 0, 0, 0, 0, 0, 0x00, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, // F2
PS2_KEY_F3, 0, 0, 0, 0, 0, 0, 0x00, 0x04, 0xFF, 0xFF, 0xFF, 0xFF, // F3
PS2_KEY_F4, 0, 0, 0, 0, 0, 0, 0x00, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, // F4
PS2_KEY_F5, 0, 0, 0, 0, 0, 0, 0x00, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, // F5
PS2_KEY_F6, 0, 0, 0, 0, 0, 0, 0x00, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, // F6
PS2_KEY_F7, 0, 0, 0, 0, 0, 0, 0x00, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, // F7
PS2_KEY_F8, 0, 0, 0, 0, 0, 0, 0x00, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, // F8
PS2_KEY_F9, 0, 0, 0, 0, 0, 0, 0x01, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, // F9
PS2_KEY_F10, 0, 0, 0, 0, 0, 0, 0x01, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, // F10
PS2_KEY_F11, 0, 0, 0, 0, 0, 0, 0x0D, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, // HELP
PS2_KEY_F12, 0, 0, 0, 0, 0, 0, 0x0A, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, // COPY
PS2_KEY_TAB, 0, 0, 0, 0, 0, 0, 0x03, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, // TAB
PS2_KEY_0, 1, 0, 0, 0, 0, 0, 0x08, 0x01, 0x0B, 0x04, 0xFF, 0xFF, // Close Right Bracket )
PS2_KEY_0, 0, 0, 0, 0, 0, 0, 0x08, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, // 0
PS2_KEY_1, 1, 0, 0, 0, 0, 0, 0x08, 0x02, 0x0B, 0x04, 0xFF, 0xFF, // Exclamation
PS2_KEY_1, 0, 0, 0, 0, 0, 0, 0x08, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, // 1
PS2_KEY_2, 1, 0, 0, 0, 0, 0, 0x08, 0x04, 0x0B, 0x04, 0xFF, 0xFF, // Double quote.
PS2_KEY_2, 0, 0, 0, 0, 0, 0, 0x08, 0x04, 0xFF, 0xFF, 0xFF, 0xFF, // 2
PS2_KEY_3, 1, 0, 0, 0, 0, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, // Pound Sign
PS2_KEY_3, 0, 0, 0, 0, 0, 0, 0x08, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, // 3
PS2_KEY_4, 1, 0, 0, 0, 0, 0, 0x08, 0x10, 0x0B, 0x04, 0xFF, 0xFF, // Dollar
PS2_KEY_4, 0, 0, 0, 0, 0, 0, 0x08, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, // 4
PS2_KEY_5, 1, 0, 0, 0, 0, 0, 0x08, 0x20, 0x0B, 0x04, 0xFF, 0xFF, // Percent
PS2_KEY_5, 0, 0, 0, 0, 0, 0, 0x08, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, // 5
PS2_KEY_6, 1, 0, 0, 0, 0, 0, 0x07, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, // Kappa
PS2_KEY_6, 0, 0, 0, 0, 0, 0, 0x08, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, // 6
PS2_KEY_7, 1, 0, 0, 0, 0, 0, 0x08, 0x40, 0x0B, 0x04, 0xFF, 0xFF, // Ampersand
PS2_KEY_7, 0, 0, 0, 0, 0, 0, 0x08, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, // 7
PS2_KEY_8, 1, 0, 0, 0, 0, 0, 0x09, 0x04, 0x0B, 0x04, 0xFF, 0xFF, // Star
PS2_KEY_8, 0, 0, 0, 0, 0, 0, 0x09, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, // 8
PS2_KEY_9, 1, 0, 0, 0, 0, 0, 0x09, 0x02, 0x0B, 0x04, 0xFF, 0xFF, // Open Left Bracket (
PS2_KEY_9, 0, 0, 0, 0, 0, 0, 0x09, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, // 9
PS2_KEY_A, 1, 0, 0, 0, 0, 0, 0x04, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, // a
PS2_KEY_A, 0, 0, 0, 0, 0, 0, 0x04, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, // A
PS2_KEY_B, 1, 0, 0, 0, 0, 0, 0x04, 0x04, 0xFF, 0xFF, 0xFF, 0xFF, // b
PS2_KEY_B, 0, 0, 0, 0, 0, 0, 0x04, 0x04, 0xFF, 0xFF, 0xFF, 0xFF, // B
PS2_KEY_C, 1, 0, 0, 0, 0, 0, 0x04, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, // c
PS2_KEY_C, 0, 0, 0, 0, 0, 0, 0x04, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, // C
PS2_KEY_D, 1, 0, 0, 0, 0, 0, 0x04, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, // d
PS2_KEY_D, 0, 0, 0, 0, 0, 0, 0x04, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, // D
PS2_KEY_E, 1, 0, 0, 0, 0, 0, 0x04, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, // e
PS2_KEY_E, 0, 0, 0, 0, 0, 0, 0x04, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, // E
PS2_KEY_F, 1, 0, 0, 0, 0, 0, 0x04, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, // f
PS2_KEY_F, 0, 0, 0, 0, 0, 0, 0x04, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, // F
PS2_KEY_G, 1, 0, 0, 0, 0, 0, 0x04, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, // g
PS2_KEY_G, 0, 0, 0, 0, 0, 0, 0x04, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, // G
PS2_KEY_H, 1, 0, 0, 0, 0, 0, 0x05, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, // h
PS2_KEY_H, 0, 0, 0, 0, 0, 0, 0x05, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, // H
PS2_KEY_I, 1, 0, 0, 0, 0, 0, 0x05, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, // i
PS2_KEY_I, 0, 0, 0, 0, 0, 0, 0x05, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, // I
PS2_KEY_J, 1, 0, 0, 0, 0, 0, 0x05, 0x04, 0xFF, 0xFF, 0xFF, 0xFF, // j
PS2_KEY_J, 0, 0, 0, 0, 0, 0, 0x05, 0x04, 0xFF, 0xFF, 0xFF, 0xFF, // J
PS2_KEY_K, 1, 0, 0, 0, 0, 0, 0x05, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, // k
PS2_KEY_K, 0, 0, 0, 0, 0, 0, 0x05, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, // K
PS2_KEY_L, 1, 0, 0, 0, 0, 0, 0x05, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, // l
PS2_KEY_L, 0, 0, 0, 0, 0, 0, 0x05, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, // L
PS2_KEY_M, 1, 0, 0, 0, 0, 0, 0x05, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, // m
PS2_KEY_M, 0, 0, 0, 0, 0, 0, 0x05, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, // M
PS2_KEY_N, 1, 0, 0, 0, 0, 0, 0x05, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, // n
PS2_KEY_N, 0, 0, 0, 0, 0, 0, 0x05, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, // N
PS2_KEY_O, 1, 0, 0, 0, 0, 0, 0x05, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, // o
PS2_KEY_O, 0, 0, 0, 0, 0, 0, 0x05, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, // O
PS2_KEY_P, 1, 0, 0, 0, 0, 0, 0x06, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, // p
PS2_KEY_P, 0, 0, 0, 0, 0, 0, 0x06, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, // P
PS2_KEY_Q, 1, 0, 0, 0, 0, 0, 0x06, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, // q
PS2_KEY_Q, 0, 0, 0, 0, 0, 0, 0x06, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, // Q
PS2_KEY_R, 1, 0, 0, 0, 0, 0, 0x06, 0x04, 0xFF, 0xFF, 0xFF, 0xFF, // r
PS2_KEY_R, 0, 0, 0, 0, 0, 0, 0x06, 0x04, 0xFF, 0xFF, 0xFF, 0xFF, // R
PS2_KEY_S, 1, 0, 0, 0, 0, 0, 0x06, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, // s
PS2_KEY_S, 0, 0, 0, 0, 0, 0, 0x06, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, // S
PS2_KEY_T, 1, 0, 0, 0, 0, 0, 0x06, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, // t
PS2_KEY_T, 0, 0, 0, 0, 0, 0, 0x06, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, // T
PS2_KEY_U, 1, 0, 0, 0, 0, 0, 0x06, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, // u
PS2_KEY_U, 0, 0, 0, 0, 0, 0, 0x06, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, // U
PS2_KEY_V, 1, 0, 0, 0, 0, 0, 0x06, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, // v
PS2_KEY_V, 0, 0, 0, 0, 0, 0, 0x06, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, // V
PS2_KEY_W, 1, 0, 0, 0, 0, 0, 0x06, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, // w
PS2_KEY_W, 0, 0, 0, 0, 0, 0, 0x06, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, // W
PS2_KEY_X, 1, 0, 0, 0, 0, 0, 0x07, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, // x
PS2_KEY_X, 0, 0, 0, 0, 0, 0, 0x07, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, // X
PS2_KEY_Y, 1, 0, 0, 0, 0, 0, 0x07, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, // y
PS2_KEY_Y, 0, 0, 0, 0, 0, 0, 0x07, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, // Y
PS2_KEY_Z, 1, 0, 0, 0, 0, 0, 0x07, 0x04, 0xFF, 0xFF, 0xFF, 0xFF, // z
PS2_KEY_Z, 0, 0, 0, 0, 0, 0, 0x07, 0x04, 0xFF, 0xFF, 0xFF, 0xFF, // Z
// PS2 Code Shift Function Ctrl ALT ALT-Gr GUI MXROW1 MXKEY1 MXROW2 MXKEY2 MXROW3 MXKEY3
PS2_KEY_SPACE, 0, 0, 0, 0, 0, 0, 0x03, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, // Space
PS2_KEY_COMMA, 1, 0, 0, 0, 0, 0, 0x07, 0x80, 0x0B, 0x04, 0xFF, 0xFF, // Less Than <
PS2_KEY_COMMA, 0, 0, 0, 0, 0, 0, 0x07, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, // Comma ,
PS2_KEY_SEMI, 1, 0, 0, 0, 0, 0, 0x09, 0x04, 0xFF, 0xFF, 0xFF, 0xFF, // Colon :
PS2_KEY_SEMI, 0, 0, 0, 0, 0, 0, 0x09, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, // Semi-Colon ;
PS2_KEY_DOT, 1, 0, 0, 0, 0, 0, 0x07, 0x40, 0x0B, 0x04, 0xFF, 0xFF, // Greater Than >
PS2_KEY_DOT, 0, 0, 0, 0, 0, 0, 0x07, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, // Full stop .
PS2_KEY_DIV, 1, 0, 0, 0, 0, 0, 0x04, 0x01, 0x0B, 0x04, 0xFF, 0xFF, // Question ?
PS2_KEY_DIV, 0, 0, 0, 0, 0, 0, 0x04, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, // Divide /
PS2_KEY_MINUS, 1, 0, 0, 0, 0, 0, 0x07, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, // Underscore
PS2_KEY_MINUS, 0, 0, 0, 0, 0, 0, 0x09, 0x10, 0xFF, 0xFF, 0xFF, 0xFF,
PS2_KEY_APOS, 1, 0, 0, 0, 0, 0, 0x09, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, // At @
PS2_KEY_APOS, 0, 0, 0, 0, 0, 0, 0x08, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, // Single quote '
PS2_KEY_OPEN_SQ, 1, 0, 0, 0, 0, 0, 0x09, 0x40, 0x0B, 0x04, 0xFF, 0xFF, // Open Left Brace {
PS2_KEY_OPEN_SQ, 0, 0, 0, 0, 0, 0, 0x09, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, // Open Left Square Bracket [
PS2_KEY_EQUAL, 1, 0, 0, 0, 0, 0, 0x09, 0x08, 0x0B, 0x04, 0xFF, 0xFF, // Plus +
PS2_KEY_EQUAL, 0, 0, 0, 0, 0, 0, 0x09, 0x10, 0x0B, 0x04, 0xFF, 0xFF, // Equal =
PS2_KEY_CAPS, 0, 0, 0, 0, 0, 0, 0x0B, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, // LOCK
PS2_KEY_ENTER, 0, 0, 0, 0, 0, 0, 0x03, 0x04, 0xFF, 0xFF, 0xFF, 0xFF, // ENTER/RETURN
PS2_KEY_CLOSE_SQ, 0, 0, 0, 0, 0, 0, 0x0A, 0x01, 0x0B, 0x04, 0xFF, 0xFF, // Close Right Brace }
PS2_KEY_CLOSE_SQ, 0, 0, 0, 0, 0, 0, 0x0A, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, // Close Right Square Bracket ]
PS2_KEY_BACK, 0, 0, 0, 0, 0, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, //
PS2_KEY_BTICK, 0, 0, 0, 0, 0, 0, 0x09, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, // Back tick `
PS2_KEY_HASH, 0, 0, 0, 0, 0, 0, 0x08, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, // Hash
PS2_KEY_BS, 0, 0, 0, 0, 0, 0, 0x0A, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, // Backspace
PS2_KEY_ESC, 0, 0, 0, 0, 0, 0, 0x0A, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, // ESCape
PS2_KEY_SCROLL, 0, 0, 0, 0, 0, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, // Not assigned.
PS2_KEY_INSERT, 0, 0, 0, 0, 0, 0, 0x0A, 0x08, 0x0B, 0x04, 0xFF, 0xFF, // INSERT
PS2_KEY_HOME, 1, 0, 0, 0, 0, 0, 0x0A, 0x04, 0x0B, 0x04, 0xFF, 0xFF, // CLR
PS2_KEY_HOME, 0, 0, 0, 0, 0, 0, 0x0A, 0x04, 0xFF, 0xFF, 0xFF, 0xFF, // HOME
PS2_KEY_PGUP, 0, 0, 0, 0, 0, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, // Not assigned.
PS2_KEY_DELETE, 0, 0, 0, 0, 0, 0, 0x0A, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, // DELETE
PS2_KEY_END, 0, 0, 0, 0, 0, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, // Not assigned.
PS2_KEY_PGDN, 0, 0, 0, 0, 0, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
PS2_KEY_UP_ARROW, 0, 0, 0, 0, 0, 0, 0x03, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, // Up Arrow
PS2_KEY_L_ARROW, 0, 0, 0, 0, 0, 0, 0x03, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, // Left Arrow
PS2_KEY_DN_ARROW, 0, 0, 0, 0, 0, 0, 0x03, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, // Down Arrow
PS2_KEY_R_ARROW, 0, 0, 0, 0, 0, 0, 0x03, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, // Right Arrow
PS2_KEY_NUM, 0, 0, 0, 0, 0, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, // Not assigned.
// Keypad.
PS2_KEY_KP0, 0, 0, 0, 0, 0, 0, 0x02, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, // Keypad 0
PS2_KEY_KP1, 0, 0, 0, 0, 0, 0, 0x02, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, // Keypad 1
PS2_KEY_KP2, 0, 0, 0, 0, 0, 0, 0x02, 0x04, 0xFF, 0xFF, 0xFF, 0xFF, // Keypad 2
PS2_KEY_KP3, 0, 0, 0, 0, 0, 0, 0x02, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, // Keypad 3
PS2_KEY_KP4, 0, 0, 0, 0, 0, 0, 0x02, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, // Keypad 4
PS2_KEY_KP5, 0, 0, 0, 0, 0, 0, 0x02, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, // Keypad 5
PS2_KEY_KP6, 0, 0, 0, 0, 0, 0, 0x02, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, // Keypad 6
PS2_KEY_KP7, 0, 0, 0, 0, 0, 0, 0x02, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, // Keypad 7
PS2_KEY_KP8, 0, 0, 0, 0, 0, 0, 0x01, 0x04, 0xFF, 0xFF, 0xFF, 0xFF, // Keypad 8
PS2_KEY_KP9, 0, 0, 0, 0, 0, 0, 0x01, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, // Keypad 9
PS2_KEY_KP_COMMA, 0, 0, 0, 0, 0, 0, 0x01, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, // Keypad Comma ,
PS2_KEY_KP_DOT, 0, 0, 0, 0, 0, 0, 0x01, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, // Keypad Full stop .
PS2_KEY_KP_PLUS, 0, 0, 0, 0, 0, 0, 0x01, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, // Keypad Plus +
PS2_KEY_KP_MINUS, 0, 0, 0, 0, 0, 0, 0x01, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, // Keypad Minus -
PS2_KEY_KP_TIMES, 0, 0, 0, 0, 0, 0, 0x0A, 0x40, 0xFF, 0xFF, 0xFF, 0xFF, // Keypad Times *
PS2_KEY_KP_DIV, 0, 0, 0, 0, 0, 0, 0x0A, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, // Keypad Divide /
// PS2 Code Shift Function Ctrl ALT ALT-Gr GUI MXROW1 MXKEY1 MXROW2 MXKEY2 MXROW3 MXKEY3
// Special keys.
PS2_KEY_PRTSCR, 0, 1, 0, 0, 0, 0, 0x0D, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, // ARGO KEY
PS2_KEY_BREAK, 0, 0, 0, 0, 0, 0, 0x03, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, // BREAK KEY
PS2_KEY_L_GUI, 0, 1, 0, 0, 0, 1, 0x0B, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, // GRAPH KEY
PS2_KEY_L_ALT, 0, 1, 0, 1, 0, 0, 0x0C, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, // KJ1 Sentence
PS2_KEY_R_ALT, 0, 1, 0, 0, 1, 0, 0x0C, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, // KJ2 Transform
PS2_KEY_R_GUI, 0, 1, 0, 0, 0, 1, 0x0B, 0x08, 0xFF, 0xFF, 0xFF, 0xFF, // KANA KEY
PS2_KEY_MENU, 0, 1, 0, 0, 0, 1, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, // Not assigned.
// Modifiers are last, only being selected if an earlier match isnt made.
PS2_KEY_L_SHIFT, 0, 0, 0, 0, 0, 0, 0x0B, 0x04, 0xFF, 0xFF, 0xFF, 0xFF,
PS2_KEY_R_SHIFT, 0, 0, 0, 0, 0, 0, 0x0B, 0x04, 0xFF, 0xFF, 0xFF, 0xFF,
PS2_KEY_L_CTRL, 0, 0, 0, 0, 0, 0, 0x0B, 0x10, 0xFF, 0xFF, 0xFF, 0xFF,
PS2_KEY_R_CTRL, 0, 0, 0, 0, 0, 0, 0x0B, 0x10, 0xFF, 0xFF, 0xFF, 0xFF,
0, 0, 0, 0, 0, 0, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
};
#endif
#endif // KEYTABLE_H

View File

@@ -5,7 +5,7 @@
Created September 2014
Updated January 2016 - Paul Carpenter - add tested on Due and tidy ups for V1.5 Library Management
January 2020 Fix typos, correct keyboard reset status improve library.properties
and additional platform handling and some documentation
and additional platform handling and some documentation
March 2020 Add SAMD1 as recognised support as has been tested by user
Improve different architecture handling
November 2020 Add support for STM32 from user Hiabuto-de
@@ -303,7 +303,7 @@ else
send_next( ); // Check for more to send
}
}
_bitcount = 0; // end of byte
_bitcount = 0; // end of byte
break;
default: // in case of weird error and end of byte reception re-sync
_bitcount = 0;
@@ -455,7 +455,7 @@ switch( _bitcount )
_tx_ready &= ~_COMMAND;
if( !( _ps2mode & _WAIT_RESPONSE ) ) // if not wait response
send_next( ); // check anything else to queue up
_bitcount = 0; // end of byte
_bitcount = 0; // end of byte
break;
default: // in case of weird error and end of byte reception re-sync
_bitcount = 0;
@@ -642,155 +642,194 @@ _ps2mode = 0;
*/
uint16_t translate( void )
{
uint8_t index, length, data;
uint16_t retdata;
uint8_t index, length, data;
uint16_t retdata;
// get next character
// Check first something to fetch
index = _tail;
// check for empty buffer
if( index == _head )
return 0;
index++;
if( index >= _RX_BUFFER_SIZE )
index = 0;
_tail = index;
// Get the flags byte break modes etc in this order
data = _rx_buffer[ index ] & 0xFF;
index = ( _rx_buffer[ index ] & 0xFF00 ) >> 8;
// get next character
// Check first something to fetch
index = _tail;
// Catch special case of PAUSE key
if( index & _E1_MODE )
return PS2_KEY_PAUSE + _FUNCTION;
// check for empty buffer
if( index == _head )
return 0;
index++;
if( index >= _RX_BUFFER_SIZE )
index = 0;
_tail = index;
// Get the flags byte break modes etc in this order
data = _rx_buffer[ index ] & 0xFF;
index = ( _rx_buffer[ index ] & 0xFF00 ) >> 8;
// Ignore anything not actual keycode but command/response
// Return untranslated as valid
if( ( data >= PS2_KC_BAT && data != PS2_KC_LANG1 && data != PS2_KC_LANG2 )
|| ( index & _WAIT_RESPONSE ) )
return ( uint16_t )data;
// Gather the break of key status
if( index & _BREAK_KEY )
PS2_keystatus |= _BREAK;
else
PS2_keystatus &= ~_BREAK;
retdata = 0; // error code by default
// Scan appropriate table
if( index & _E0_MODE )
{
length = sizeof( extended_key ) / sizeof( extended_key[ 0 ] );
for( index = 0; index < length; index++ )
#if defined( PS2_REQUIRES_PROGMEM )
if( data == pgm_read_byte( &extended_key[ index ][ 0 ] ) )
{
retdata = pgm_read_byte( &extended_key[ index ][ 1 ] );
#else
if( data == extended_key[ index ][ 0 ] )
{
retdata = extended_key[ index ][ 1 ];
#endif
break;
}
}
else
{
length = sizeof( single_key ) / sizeof( single_key[ 0 ] );
for( index = 0; index < length; index++ )
#if defined( PS2_REQUIRES_PROGMEM )
if( data == pgm_read_byte( &single_key[ index ][ 0 ] ) )
{
retdata = pgm_read_byte( &single_key[ index ][ 1 ] );
#else
if( data == single_key[ index ][ 0 ] )
{
retdata = single_key[ index ][ 1 ];
#endif
break;
}
}
// trap not found key
if( index == length )
retdata = 0;
/* valid found values only */
if( retdata > 0 )
{
if( retdata <= PS2_KEY_CAPS )
{ // process lock keys need second make to turn off
if( PS2_keystatus & _BREAK )
{
PS2_lockstate[ retdata ] = 0; // Set received a break so next make toggles LOCK status
retdata = PS2_KEY_IGNORE; // ignore key
}
else
{
if( PS2_lockstate[ retdata ] == 1 )
retdata = PS2_KEY_IGNORE; // ignore key if make and not received break
else
{
PS2_lockstate[ retdata ] = 1;
switch( retdata )
{
case PS2_KEY_CAPS: index = PS2_LOCK_CAPS;
// Set CAPS lock if not set before
if( PS2_keystatus & _CAPS )
PS2_keystatus &= ~_CAPS;
else
PS2_keystatus |= _CAPS;
break;
case PS2_KEY_SCROLL: index = PS2_LOCK_SCROLL;
break;
case PS2_KEY_NUM: index = PS2_LOCK_NUM;
break;
}
// Now update PS2_led_lock status to match
if( PS2_led_lock & index )
{
PS2_led_lock &= ~index;
PS2_keystatus |= _BREAK; // send as break
}
else
PS2_led_lock |= index;
set_lock( );
}
}
// Catch special case of PAUSE key
if( index & _E1_MODE )
{
return PS2_KEY_PAUSE + _FUNCTION;
}
else
if( retdata >= PS2_KEY_L_SHIFT && retdata <= PS2_KEY_R_GUI )
{ // Update bits for _SHIFT, _CTRL, _ALT, _ALT GR, _GUI in status
#if defined( PS2_REQUIRES_PROGMEM )
index = pgm_read_byte( &control_flags[ retdata - PS2_KEY_L_SHIFT ] );
#else
index = control_flags[ retdata - PS2_KEY_L_SHIFT ];
#endif
if( PS2_keystatus & _BREAK )
PS2_keystatus &= ~index;
else
// if already set ignore repeats if flag set
if( ( PS2_keystatus & index ) && ( _mode & _NO_REPEATS ) )
retdata = PS2_KEY_IGNORE; // ignore repeat _SHIFT, _CTRL, _ALT, _GUI
else
PS2_keystatus |= index;
}
else
// Numeric keypad ONLY works in numlock state or when _SHIFT status
if( retdata >= PS2_KEY_KP0 && retdata <= PS2_KEY_KP_DOT )
if( !( PS2_led_lock & PS2_LOCK_NUM ) || ( PS2_keystatus & _SHIFT ) )
#if defined( PS2_REQUIRES_PROGMEM )
retdata = pgm_read_byte( &scroll_remap[ retdata - PS2_KEY_KP0 ] );
#else
retdata = scroll_remap[ retdata - PS2_KEY_KP0 ];
#endif
// Sort break code handling or ignore for all having processed the _SHIFT etc status
if( ( PS2_keystatus & _BREAK ) && ( _mode & _NO_BREAKS ) )
return ( uint16_t )PS2_KEY_IGNORE;
// Assign Function keys _mode
if( ( retdata <= PS2_KEY_SPACE || retdata >= PS2_KEY_F1 ) && retdata != PS2_KEY_EUROPE2 )
PS2_keystatus |= _FUNCTION;
else
PS2_keystatus &= ~_FUNCTION;
}
return ( retdata | ( (uint16_t)PS2_keystatus << 8 ) );
// Ignore anything not actual keycode but command/response
// Return untranslated as valid
if( ( data >= PS2_KC_BAT && data != PS2_KC_LANG1 && data != PS2_KC_LANG2 ) || ( index & _WAIT_RESPONSE ) )
{
return ( uint16_t )data;
}
// Gather the break of key status
if( index & _BREAK_KEY )
{
PS2_keystatus |= _BREAK;
} else
{
PS2_keystatus &= ~_BREAK;
}
retdata = 0; // error code by default
// Scan appropriate table
if( index & _E0_MODE )
{
length = sizeof( extended_key ) / sizeof( extended_key[ 0 ] );
for( index = 0; index < length; index++ )
{
#if defined( PS2_REQUIRES_PROGMEM )
if( data == pgm_read_byte( &extended_key[ index ][ 0 ] ) )
{
retdata = pgm_read_byte( &extended_key[ index ][ 1 ] );
#else
if( data == extended_key[ index ][ 0 ] )
{
retdata = extended_key[ index ][ 1 ];
#endif
break;
}
}
} else
{
length = sizeof( single_key ) / sizeof( single_key[ 0 ] );
for( index = 0; index < length; index++ )
{
#if defined( PS2_REQUIRES_PROGMEM )
if( data == pgm_read_byte( &single_key[ index ][ 0 ] ) )
{
retdata = pgm_read_byte( &single_key[ index ][ 1 ] );
#else
if( data == single_key[ index ][ 0 ] )
{
retdata = single_key[ index ][ 1 ];
#endif
break;
}
}
}
// trap not found key
if( index == length )
{
retdata = 0;
}
/* valid found values only */
if( retdata > 0 )
{
if( retdata <= PS2_KEY_CAPS )
{ // process lock keys need second make to turn off
if( PS2_keystatus & _BREAK )
{
PS2_lockstate[ retdata ] = 0; // Set received a break so next make toggles LOCK status
retdata = PS2_KEY_IGNORE; // ignore key
} else {
if( PS2_lockstate[ retdata ] == 1 )
{
retdata = PS2_KEY_IGNORE; // ignore key if make and not received break
} else
{
PS2_lockstate[ retdata ] = 1;
switch( retdata )
{
case PS2_KEY_CAPS: index = PS2_LOCK_CAPS;
// Set CAPS lock if not set before
if( PS2_keystatus & _CAPS )
{
PS2_keystatus &= ~_CAPS;
} else
{
PS2_keystatus |= _CAPS;
}
break;
case PS2_KEY_SCROLL: index = PS2_LOCK_SCROLL;
break;
case PS2_KEY_NUM: index = PS2_LOCK_NUM;
break;
}
// Now update PS2_led_lock status to match
if( PS2_led_lock & index )
{
PS2_led_lock &= ~index;
PS2_keystatus |= _BREAK; // send as break
} else
{
PS2_led_lock |= index;
}
set_lock( );
}
}
} else
{
if( retdata >= PS2_KEY_L_SHIFT && retdata <= PS2_KEY_R_GUI )
{ // Update bits for _SHIFT, _CTRL, _ALT, _ALT GR, _GUI in status
#if defined( PS2_REQUIRES_PROGMEM )
index = pgm_read_byte( &control_flags[ retdata - PS2_KEY_L_SHIFT ] );
#else
index = control_flags[ retdata - PS2_KEY_L_SHIFT ];
#endif
if( PS2_keystatus & _BREAK )
{
PS2_keystatus &= ~index;
}
// if already set ignore repeats if flag set
else if( ( PS2_keystatus & index ) && ( _mode & _NO_REPEATS ) )
{
retdata = PS2_KEY_IGNORE; // ignore repeat _SHIFT, _CTRL, _ALT, _GUI
} else
{
PS2_keystatus |= index;
}
} else
{
// Numeric keypad ONLY works in numlock state or when _SHIFT status
if( retdata >= PS2_KEY_KP0 && retdata <= PS2_KEY_KP_DOT )
{
if( !( PS2_led_lock & PS2_LOCK_NUM ) || ( PS2_keystatus & _SHIFT ) )
{
#if defined( PS2_REQUIRES_PROGMEM )
retdata = pgm_read_byte( &scroll_remap[ retdata - PS2_KEY_KP0 ] );
#else
retdata = scroll_remap[ retdata - PS2_KEY_KP0 ];
#endif
}
}
}
// Sort break code handling or ignore for all having processed the _SHIFT etc status
if( ( PS2_keystatus & _BREAK ) && ( _mode & _NO_BREAKS ) )
{
return ( uint16_t )PS2_KEY_IGNORE;
}
// Assign Function keys _mode
if( ( retdata <= PS2_KEY_SPACE || retdata >= PS2_KEY_F1 ) && retdata != PS2_KEY_EUROPE2 )
{
PS2_keystatus |= _FUNCTION;
} else
{
PS2_keystatus &= ~_FUNCTION;
}
}
}
return ( retdata | ( (uint16_t)PS2_keystatus << 8 ) );
}
@@ -803,12 +842,12 @@ void set_lock( )
// Workaround: Send one byte, wait for one response with a delay loop, send next byte.
send_byte( PS2_KC_LOCK ); // send command
if( ( send_byte( PS2_KEY_IGNORE ) ) ) // wait ACK
send_next( ); // if idle start transmission
send_next( ); // if idle start transmission
// A delay of less than 10mS will cause lockup or abort!!!
delayMicroseconds( 10000 );
send_byte( PS2_led_lock ); // send data from internal variable
if( ( send_byte( PS2_KEY_IGNORE ) ) ) // wait ACK
send_next( ); // if idle start transmission
send_next( ); // if idle start transmission
}

View File

@@ -236,26 +236,26 @@
#define PS2_KEY_INSERT 0x19
#define PS2_KEY_DELETE 0x1A
#define PS2_KEY_ESC 0x1B
#define PS2_KEY_BS 0x08
#define PS2_KEY_TAB 0x09
#define PS2_KEY_ENTER 0x0D
#define PS2_KEY_SPACE 0x20
#define PS2_KEY_KP0 0xA0
#define PS2_KEY_KP1 0xA1
#define PS2_KEY_KP2 0xA2
#define PS2_KEY_KP3 0xA3
#define PS2_KEY_KP4 0xA4
#define PS2_KEY_KP5 0xA5
#define PS2_KEY_KP6 0xA6
#define PS2_KEY_KP7 0xA7
#define PS2_KEY_KP8 0xA8
#define PS2_KEY_KP9 0xA9
#define PS2_KEY_KP_DOT 0xAA
#define PS2_KEY_KP_ENTER 0xAB
#define PS2_KEY_KP_PLUS 0xAC
#define PS2_KEY_KP_MINUS 0xAD
#define PS2_KEY_KP_TIMES 0xAE
#define PS2_KEY_KP_DIV 0xAF
#define PS2_KEY_BS 0x1C
#define PS2_KEY_TAB 0x1D
#define PS2_KEY_ENTER 0x1E
#define PS2_KEY_SPACE 0x1F
#define PS2_KEY_KP0 0x20
#define PS2_KEY_KP1 0x21
#define PS2_KEY_KP2 0x22
#define PS2_KEY_KP3 0x23
#define PS2_KEY_KP4 0x24
#define PS2_KEY_KP5 0x25
#define PS2_KEY_KP6 0x26
#define PS2_KEY_KP7 0x27
#define PS2_KEY_KP8 0x28
#define PS2_KEY_KP9 0x29
#define PS2_KEY_KP_DOT 0x2A
#define PS2_KEY_KP_ENTER 0x2B
#define PS2_KEY_KP_PLUS 0x2C
#define PS2_KEY_KP_MINUS 0x2D
#define PS2_KEY_KP_TIMES 0x2E
#define PS2_KEY_KP_DIV 0x2F
#define PS2_KEY_0 0X30
#define PS2_KEY_1 0X31
#define PS2_KEY_2 0X32
@@ -266,12 +266,15 @@
#define PS2_KEY_7 0X37
#define PS2_KEY_8 0X38
#define PS2_KEY_9 0X39
#define PS2_KEY_APOS 0X27
#define PS2_KEY_COMMA 0X2C
#define PS2_KEY_MINUS 0X2D
#define PS2_KEY_DOT 0X2E
#define PS2_KEY_DIV 0X2F
#define PS2_KEY_AT 0X40
#define PS2_KEY_APOS 0X3A
#define PS2_KEY_COMMA 0X3B
#define PS2_KEY_MINUS 0X3C
#define PS2_KEY_DOT 0X3D
#define PS2_KEY_DIV 0X3E
/* Some Numeric keyboards have an '=' on right keypad */
#define PS2_KEY_KP_EQUAL 0x3F
/* Single quote or back quote */
#define PS2_KEY_SINGLE 0X40
#define PS2_KEY_A 0X41
#define PS2_KEY_B 0X42
#define PS2_KEY_C 0X43
@@ -298,63 +301,71 @@
#define PS2_KEY_X 0X58
#define PS2_KEY_Y 0X59
#define PS2_KEY_Z 0X5A
#define PS2_KEY_SEMI 0X3B
#define PS2_KEY_SEMI 0X5B
#define PS2_KEY_BACK 0X5C
#define PS2_KEY_OPEN_SQ 0X5B
#define PS2_KEY_CLOSE_SQ 0X5D
#define PS2_KEY_EQUAL 0X3D
#define PS2_KEY_HASH 0x23
#define PS2_KEY_PIPE 0x7C
#define PS2_KEY_LESSTHAN 0x3C
#define PS2_KEY_BTICK 0x60
#define PS2_KEY_OPEN_SQ 0X5D
#define PS2_KEY_CLOSE_SQ 0X5E
#define PS2_KEY_EQUAL 0X5F
/* Some Numeric keypads have a comma key */
#define PS2_KEY_KP_COMMA 0xB0
#define PS2_KEY_F1 0XB1
#define PS2_KEY_F2 0XB2
#define PS2_KEY_F3 0XB3
#define PS2_KEY_F4 0XB4
#define PS2_KEY_F5 0XB5
#define PS2_KEY_F6 0XB6
#define PS2_KEY_F7 0XB7
#define PS2_KEY_F8 0XB8
#define PS2_KEY_F9 0XB9
#define PS2_KEY_F10 0XBA
#define PS2_KEY_F11 0XBB
#define PS2_KEY_F12 0XBC
#define PS2_KEY_NEXT_TR 0XBD
#define PS2_KEY_PREV_TR 0XBE
#define PS2_KEY_STOP 0XBF
#define PS2_KEY_PLAY 0XC0
#define PS2_KEY_MUTE 0XC1
#define PS2_KEY_VOL_UP 0XC2
#define PS2_KEY_VOL_DN 0XC3
#define PS2_KEY_MEDIA 0XC4
#define PS2_KEY_EMAIL 0XC5
#define PS2_KEY_CALC 0XC6
#define PS2_KEY_COMPUTER 0XC7
#define PS2_KEY_WEB_SEARCH 0XC8
#define PS2_KEY_WEB_HOME 0XC9
#define PS2_KEY_WEB_BACK 0XCA
#define PS2_KEY_WEB_FORWARD 0XCB
#define PS2_KEY_WEB_STOP 0XCC
#define PS2_KEY_WEB_REFRESH 0XCD
#define PS2_KEY_WEB_FAVOR 0XCE
#define PS2_KEY_EUROPE2 0XCF
#define PS2_KEY_POWER 0XD0
#define PS2_KEY_SLEEP 0XD1
#define PS2_KEY_WAKE 0XD2
#define PS2_KEY_INTL1 0XD3
#define PS2_KEY_INTL2 0XD4
#define PS2_KEY_INTL3 0XD5
#define PS2_KEY_INTL4 0XD6
#define PS2_KEY_INTL5 0XD7
#define PS2_KEY_LANG1 0XD8
#define PS2_KEY_LANG2 0XD9
#define PS2_KEY_LANG3 0XDA
#define PS2_KEY_LANG4 0XDB
#define PS2_KEY_LANG5 0xDC
/* Some Numeric keyboards have an '=' on right keypad */
#define PS2_KEY_KP_EQUAL 0xDD
#define PS2_KEY_KP_COMMA 0x60
#define PS2_KEY_F1 0X61
#define PS2_KEY_F2 0X62
#define PS2_KEY_F3 0X63
#define PS2_KEY_F4 0X64
#define PS2_KEY_F5 0X65
#define PS2_KEY_F6 0X66
#define PS2_KEY_F7 0X67
#define PS2_KEY_F8 0X68
#define PS2_KEY_F9 0X69
#define PS2_KEY_F10 0X6A
#define PS2_KEY_F11 0X6B
#define PS2_KEY_F12 0X6C
#define PS2_KEY_F13 0X6D
#define PS2_KEY_F14 0X6E
#define PS2_KEY_F15 0X6F
#define PS2_KEY_F16 0X70
#define PS2_KEY_F17 0X71
#define PS2_KEY_F18 0X72
#define PS2_KEY_F19 0X73
#define PS2_KEY_F20 0X74
#define PS2_KEY_F21 0X75
#define PS2_KEY_F22 0X76
#define PS2_KEY_F23 0X77
#define PS2_KEY_F24 0X78
#define PS2_KEY_NEXT_TR 0X79
#define PS2_KEY_PREV_TR 0X7A
#define PS2_KEY_STOP 0X7B
#define PS2_KEY_PLAY 0X7C
#define PS2_KEY_MUTE 0X7D
#define PS2_KEY_VOL_UP 0X7E
#define PS2_KEY_VOL_DN 0X7F
#define PS2_KEY_MEDIA 0X80
#define PS2_KEY_EMAIL 0X81
#define PS2_KEY_CALC 0X82
#define PS2_KEY_COMPUTER 0X83
#define PS2_KEY_WEB_SEARCH 0X84
#define PS2_KEY_WEB_HOME 0X85
#define PS2_KEY_WEB_BACK 0X86
#define PS2_KEY_WEB_FORWARD 0X87
#define PS2_KEY_WEB_STOP 0X88
#define PS2_KEY_WEB_REFRESH 0X89
#define PS2_KEY_WEB_FAVOR 0X8A
#define PS2_KEY_EUROPE2 0X8B
#define PS2_KEY_POWER 0X8C
#define PS2_KEY_SLEEP 0X8D
#define PS2_KEY_WAKE 0X90
#define PS2_KEY_INTL1 0X91
#define PS2_KEY_INTL2 0X92
#define PS2_KEY_INTL3 0X93
#define PS2_KEY_INTL4 0X94
#define PS2_KEY_INTL5 0X95
#define PS2_KEY_LANG1 0X96
#define PS2_KEY_LANG2 0X97
#define PS2_KEY_LANG3 0X98
#define PS2_KEY_LANG4 0X99
#define PS2_KEY_LANG5 0xA0
#define PS2_KEY_BTICK 0X9A
#define PS2_KEY_HASH 0X9B
/*
Purpose: Provides advanced access to PS2 keyboards
@@ -374,7 +385,8 @@ class PS2KeyAdvanced {
The best place to call this method is in the setup routine. */
void begin( uint8_t, uint8_t );
uint8_t keyAvailable();
// Additional key available check which doesnt affect the queue.
uint8_t keyAvailable(void);
/* Returns number of codes available or 0 for none */
uint8_t available( );
@@ -391,7 +403,7 @@ class PS2KeyAdvanced {
/* Sets the current status of Locks and LEDs
Use macro defines added together from
PS2_LOCK_NUM PS2_LOCK_CAPS PS2_LOCK_SCROLL */
void setLock( uint8_t );
void setLock( byte );
/* Set library to not send break key codes
1 = no break codes

View File

@@ -251,11 +251,12 @@ IRAM_ATTR unsigned char updateMatrix(uint16_t data)
uint8_t idx;
uint8_t idx2;
uint8_t changed = 0;
uint8_t matchExact = 0;
// Loop through the entire conversion table to find a match on this key, if found appy the conversion to the virtual
// switch matrix.
//
for(idx=0; idx < NUMELEM(PS2toMZ); idx++)
for(idx=0, changed=0, matchExact=0; idx < NUMELEM(PS2toMZ) && (changed == 0 || (changed == 1 && matchExact == 0)); idx++)
{
// Match key code?
if(PS2toMZ[idx][PSMZTBL_KEYPOS] == (uint8_t)(data&0xFF))
@@ -263,11 +264,21 @@ IRAM_ATTR unsigned char updateMatrix(uint16_t data)
// Match Raw, Shift, Function, Control, ALT or ALT-Gr?
if( (PS2toMZ[idx][PSMZTBL_SHIFTPOS] == 0 && PS2toMZ[idx][PSMZTBL_FUNCPOS] == 0 && PS2toMZ[idx][PSMZTBL_CTRLPOS] == 0 && PS2toMZ[idx][PSMZTBL_ALTPOS] == 0 && PS2toMZ[idx][PSMZTBL_ALTGRPOS] == 0) ||
((data & PS2_SHIFT) && PS2toMZ[idx][PSMZTBL_SHIFTPOS] == 1) ||
((data & PS2_FUNCTION) && PS2toMZ[idx][PSMZTBL_FUNCPOS] == 1) ||
((data & PS2_CTRL) && PS2toMZ[idx][PSMZTBL_CTRLPOS] == 1) ||
((data & PS2_ALT) && PS2toMZ[idx][PSMZTBL_ALTPOS] == 1) ||
((data & PS2_ALT_GR) && PS2toMZ[idx][PSMZTBL_ALTGRPOS] == 1) )
((data & PS2_ALT_GR) && PS2toMZ[idx][PSMZTBL_ALTGRPOS] == 1) ||
((data & PS2_GUI) && PS2toMZ[idx][PSMZTBL_SHIFTPOS] == 1) ||
((data & PS2_FUNCTION) && PS2toMZ[idx][PSMZTBL_FUNCPOS] == 1) )
{
// Exact entry match, data + control key? On an exact match we only process the first key. On a data only match we fall through to include the data and control key matches to allow for un-coded keys, ie. Japanese characters.
matchExact = ((data & PS2_SHIFT) && PS2toMZ[idx][PSMZTBL_SHIFTPOS] == 1) ||
((data & PS2_CTRL) && PS2toMZ[idx][PSMZTBL_CTRLPOS] == 1) ||
((data & PS2_ALT_GR) && PS2toMZ[idx][PSMZTBL_ALTGRPOS] == 1) ||
((data & PS2_ALT) && PS2toMZ[idx][PSMZTBL_ALTPOS] == 1) ||
((data & PS2_GUI) && PS2toMZ[idx][PSMZTBL_ALTPOS] == 1) ||
((data & PS2_FUNCTION) && PS2toMZ[idx][PSMZTBL_FUNCPOS] == 1) ? 1 : 0;
// RELEASE (PS2_BREAK == 1) or PRESS?
if((data & PS2_BREAK))
{
@@ -359,17 +370,8 @@ IRAM_ATTR void ps2Interface( void * pvParameters )
uint16_t scanCode = 0x0000;
#if defined(CONFIG_DEBUG_OLED) || !defined(CONFIG_OLED_DISABLED)
uint8_t dataChange = 0;
static int clrScreen = 1;
static int scanPrtCol = 0;
static uint32_t clrTimer = 0;
#endif
#if defined(CONFIG_DEBUG_OLED) || !defined(CONFIG_OLED_DISABLED)
if((clrTimer > 0 && --clrTimer == 0) || ((scanCode&0xFF) == PS2_KEY_C && scanCode & PS2_BREAK ))
{
// Clear old scan code data. Add OLED code if needed.
scanPrtCol = 0;
}
static uint32_t rfshTimer = 0;
#endif
while(1)
@@ -379,17 +381,9 @@ IRAM_ATTR void ps2Interface( void * pvParameters )
{
printf("%04x\n", scanCode);
#if defined(CONFIG_DEBUG_OLED) || !defined(CONFIG_OLED_DISABLED)
// Clear screen as requested.
if(clrScreen == 1)
{
// ssd1306_clear_screen(&SSD1306, false);
clrScreen = 0;
}
// Output the scan code for verification.
dbgprintf("%04x,", scanCode);
if(scanPrtCol++ >= 3) scanPrtCol = 0;
clrTimer = 2000000;
#endif
// Update the virtual matrix with the new key value.
@@ -411,27 +405,34 @@ IRAM_ATTR void ps2Interface( void * pvParameters )
(((mzControl.keyMatrix[idx] >> 1) & 0x01) ^ 0x01) << CONFIG_MZ_KDO1 |
(((mzControl.keyMatrix[idx] ) & 0x01) ^ 0x01) << CONFIG_MZ_KDO0 ;
}
#if defined(CONFIG_DEBUG_OLED) || !defined(CONFIG_OLED_DISABLED)
// Output the MZ virtual keyboard matrix for verification.
uint8_t oledBuf[8][16];
for(int idx=0; idx < 15; idx++)
{
for(int idx2=0; idx2 < 8; idx2++)
{
oledBuf[idx2][idx] = ((mzControl.keyMatrix[idx] >> idx2)&0x01) == 1 ? '1' : '0';
}
}
// Print out the matrix, transposed - see MZKeyTable.h for the map, second table.
for(int idx=0; idx < 8; idx++)
{
ssd1306_display_text(&SSD1306, idx, (char *)oledBuf[idx], 15, false);
}
#endif
}
}
#if defined(CONFIG_DEBUG_OLED) || !defined(CONFIG_OLED_DISABLED)
if(dataChange || (rfshTimer > 0 && --rfshTimer == 0))
{
// Output the MZ virtual keyboard matrix for verification.
uint8_t oledBuf[8][16];
for(int idx=0; idx < 15; idx++)
{
for(int idx2=0; idx2 < 8; idx2++)
{
oledBuf[idx2][idx] = ((mzControl.keyMatrix[idx] >> idx2)&0x01) == 1 ? '1' : '0';
}
}
// Print out the matrix, transposed - see MZKeyTable.h for the map, second table.
for(int idx=0; idx < 8; idx++)
{
ssd1306_display_text(&SSD1306, idx, (char *)oledBuf[idx], 15, false);
}
// Clear timer for next refresh.
rfshTimer = 2000000;
dataChange = 0;
}
#endif
// Let other tasks run.
vTaskDelay(0);
}