1+ #include "test_keyboard.h"
2+ #include "bsp/input.h"
3+ #include "common/display.h"
4+ #include "common/theme.h"
5+ #include "freertos/idf_additions.h"
6+ #include "gui_style.h"
7+ #include "icons.h"
8+ #include "menu/message_dialog.h"
9+ #include "pax_fonts.h"
10+ #include "pax_gfx.h"
11+ #include "pax_text.h"
12+ #include "projdefs.h"
13+ #include "shapes/pax_misc.h"
14+ #include "shapes/pax_rects.h"
15+
16+ static const char * title = "Keyboard test" ;
17+
18+ typedef struct {
19+ const char * name ;
20+ bsp_input_scancode_t scancode ;
21+ bool pressed ;
22+ bool was_pressed ;
23+ bool changed ;
24+ } key_t ;
25+
26+ key_t keys [] = {
27+ {.name = "ESC" , .scancode = BSP_INPUT_SCANCODE_ESC , .pressed = false, .was_pressed = false, .changed = true},
28+ {.name = "F1" , .scancode = BSP_INPUT_SCANCODE_F1 , .pressed = false, .was_pressed = false, .changed = true},
29+ {.name = "F2" , .scancode = BSP_INPUT_SCANCODE_F2 , .pressed = false, .was_pressed = false, .changed = true},
30+ {.name = "F3" , .scancode = BSP_INPUT_SCANCODE_F3 , .pressed = false, .was_pressed = false, .changed = true},
31+ {.name = "F4" , .scancode = BSP_INPUT_SCANCODE_F4 , .pressed = false, .was_pressed = false, .changed = true},
32+ {.name = "F5" , .scancode = BSP_INPUT_SCANCODE_F5 , .pressed = false, .was_pressed = false, .changed = true},
33+ {.name = "F6" , .scancode = BSP_INPUT_SCANCODE_F6 , .pressed = false, .was_pressed = false, .changed = true},
34+ {.name = "BS" , .scancode = BSP_INPUT_SCANCODE_BACKSPACE , .pressed = false, .was_pressed = false, .changed = true},
35+ {.name = "`" , .scancode = BSP_INPUT_SCANCODE_GRAVE , .pressed = false, .was_pressed = false, .changed = true},
36+ {.name = "1" , .scancode = BSP_INPUT_SCANCODE_1 , .pressed = false, .was_pressed = false, .changed = true},
37+ {.name = "2" , .scancode = BSP_INPUT_SCANCODE_2 , .pressed = false, .was_pressed = false, .changed = true},
38+ {.name = "3" , .scancode = BSP_INPUT_SCANCODE_3 , .pressed = false, .was_pressed = false, .changed = true},
39+ {.name = "4" , .scancode = BSP_INPUT_SCANCODE_4 , .pressed = false, .was_pressed = false, .changed = true},
40+ {.name = "5" , .scancode = BSP_INPUT_SCANCODE_5 , .pressed = false, .was_pressed = false, .changed = true},
41+ {.name = "6" , .scancode = BSP_INPUT_SCANCODE_6 , .pressed = false, .was_pressed = false, .changed = true},
42+ {.name = "7" , .scancode = BSP_INPUT_SCANCODE_7 , .pressed = false, .was_pressed = false, .changed = true},
43+ {.name = "8" , .scancode = BSP_INPUT_SCANCODE_8 , .pressed = false, .was_pressed = false, .changed = true},
44+ {.name = "9" , .scancode = BSP_INPUT_SCANCODE_9 , .pressed = false, .was_pressed = false, .changed = true},
45+ {.name = "0" , .scancode = BSP_INPUT_SCANCODE_0 , .pressed = false, .was_pressed = false, .changed = true},
46+ {.name = "-" , .scancode = BSP_INPUT_SCANCODE_MINUS , .pressed = false, .was_pressed = false, .changed = true},
47+ {.name = "=" , .scancode = BSP_INPUT_SCANCODE_EQUAL , .pressed = false, .was_pressed = false, .changed = true},
48+ {.name = "TAB" , .scancode = BSP_INPUT_SCANCODE_TAB , .pressed = false, .was_pressed = false, .changed = true},
49+ {.name = "Q" , .scancode = BSP_INPUT_SCANCODE_Q , .pressed = false, .was_pressed = false, .changed = true},
50+ {.name = "W" , .scancode = BSP_INPUT_SCANCODE_W , .pressed = false, .was_pressed = false, .changed = true},
51+ {.name = "E" , .scancode = BSP_INPUT_SCANCODE_E , .pressed = false, .was_pressed = false, .changed = true},
52+ {.name = "R" , .scancode = BSP_INPUT_SCANCODE_R , .pressed = false, .was_pressed = false, .changed = true},
53+ {.name = "T" , .scancode = BSP_INPUT_SCANCODE_T , .pressed = false, .was_pressed = false, .changed = true},
54+ {.name = "Y" , .scancode = BSP_INPUT_SCANCODE_Y , .pressed = false, .was_pressed = false, .changed = true},
55+ {.name = "U" , .scancode = BSP_INPUT_SCANCODE_U , .pressed = false, .was_pressed = false, .changed = true},
56+ {.name = "I" , .scancode = BSP_INPUT_SCANCODE_I , .pressed = false, .was_pressed = false, .changed = true},
57+ {.name = "O" , .scancode = BSP_INPUT_SCANCODE_O , .pressed = false, .was_pressed = false, .changed = true},
58+ {.name = "P" , .scancode = BSP_INPUT_SCANCODE_P , .pressed = false, .was_pressed = false, .changed = true},
59+ {.name = "[" , .scancode = BSP_INPUT_SCANCODE_LEFTBRACE , .pressed = false, .was_pressed = false, .changed = true},
60+ {.name = "]" , .scancode = BSP_INPUT_SCANCODE_RIGHTBRACE , .pressed = false, .was_pressed = false, .changed = true},
61+ {.name = "Fn" , .scancode = BSP_INPUT_SCANCODE_FN , .pressed = false, .was_pressed = false, .changed = true},
62+ {.name = "A" , .scancode = BSP_INPUT_SCANCODE_A , .pressed = false, .was_pressed = false, .changed = true},
63+ {.name = "S" , .scancode = BSP_INPUT_SCANCODE_S , .pressed = false, .was_pressed = false, .changed = true},
64+ {.name = "D" , .scancode = BSP_INPUT_SCANCODE_D , .pressed = false, .was_pressed = false, .changed = true},
65+ {.name = "F" , .scancode = BSP_INPUT_SCANCODE_F , .pressed = false, .was_pressed = false, .changed = true},
66+ {.name = "G" , .scancode = BSP_INPUT_SCANCODE_G , .pressed = false, .was_pressed = false, .changed = true},
67+ {.name = "H" , .scancode = BSP_INPUT_SCANCODE_H , .pressed = false, .was_pressed = false, .changed = true},
68+ {.name = "J" , .scancode = BSP_INPUT_SCANCODE_J , .pressed = false, .was_pressed = false, .changed = true},
69+ {.name = "K" , .scancode = BSP_INPUT_SCANCODE_K , .pressed = false, .was_pressed = false, .changed = true},
70+ {.name = "L" , .scancode = BSP_INPUT_SCANCODE_L , .pressed = false, .was_pressed = false, .changed = true},
71+ {.name = ";" , .scancode = BSP_INPUT_SCANCODE_SEMICOLON , .pressed = false, .was_pressed = false, .changed = true},
72+ {.name = "'" , .scancode = BSP_INPUT_SCANCODE_APOSTROPHE , .pressed = false, .was_pressed = false, .changed = true},
73+ {.name = "ENTER" , .scancode = BSP_INPUT_SCANCODE_ENTER , .pressed = false, .was_pressed = false, .changed = true},
74+ {.name = "LSHIFT" ,
75+ .scancode = BSP_INPUT_SCANCODE_LEFTSHIFT ,
76+ .pressed = false,
77+ .was_pressed = false,
78+ .changed = true},
79+ {.name = "Z" , .scancode = BSP_INPUT_SCANCODE_Z , .pressed = false, .was_pressed = false, .changed = true},
80+ {.name = "X" , .scancode = BSP_INPUT_SCANCODE_X , .pressed = false, .was_pressed = false, .changed = true},
81+ {.name = "C" , .scancode = BSP_INPUT_SCANCODE_C , .pressed = false, .was_pressed = false, .changed = true},
82+ {.name = "V" , .scancode = BSP_INPUT_SCANCODE_V , .pressed = false, .was_pressed = false, .changed = true},
83+ {.name = "B" , .scancode = BSP_INPUT_SCANCODE_B , .pressed = false, .was_pressed = false, .changed = true},
84+ {.name = "N" , .scancode = BSP_INPUT_SCANCODE_N , .pressed = false, .was_pressed = false, .changed = true},
85+ {.name = "M" , .scancode = BSP_INPUT_SCANCODE_M , .pressed = false, .was_pressed = false, .changed = true},
86+ {.name = "," , .scancode = BSP_INPUT_SCANCODE_COMMA , .pressed = false, .was_pressed = false, .changed = true},
87+ {.name = "." , .scancode = BSP_INPUT_SCANCODE_DOT , .pressed = false, .was_pressed = false, .changed = true},
88+ {.name = "/" , .scancode = BSP_INPUT_SCANCODE_SLASH , .pressed = false, .was_pressed = false, .changed = true},
89+ {.name = "UP" ,
90+ .scancode = BSP_INPUT_SCANCODE_ESCAPED_GREY_UP ,
91+ .pressed = false,
92+ .was_pressed = false,
93+ .changed = true},
94+ {.name = "RSHIFT" ,
95+ .scancode = BSP_INPUT_SCANCODE_RIGHTSHIFT ,
96+ .pressed = false,
97+ .was_pressed = false,
98+ .changed = true},
99+ {.name = "CTRL" , .scancode = BSP_INPUT_SCANCODE_LEFTCTRL , .pressed = false, .was_pressed = false, .changed = true},
100+ {.name = "META" ,
101+ .scancode = BSP_INPUT_SCANCODE_ESCAPED_LEFTMETA ,
102+ .pressed = false,
103+ .was_pressed = false,
104+ .changed = true},
105+ {.name = "ALT" , .scancode = BSP_INPUT_SCANCODE_LEFTALT , .pressed = false, .was_pressed = false, .changed = true},
106+ {.name = "S" , .scancode = BSP_INPUT_SCANCODE_SPACE , .pressed = false, .was_pressed = false, .changed = true},
107+ {.name = "P" , .scancode = BSP_INPUT_SCANCODE_SPACE , .pressed = false, .was_pressed = false, .changed = true},
108+ {.name = "A" , .scancode = BSP_INPUT_SCANCODE_SPACE , .pressed = false, .was_pressed = false, .changed = true},
109+ {.name = "C" , .scancode = BSP_INPUT_SCANCODE_SPACE , .pressed = false, .was_pressed = false, .changed = true},
110+ {.name = "E" , .scancode = BSP_INPUT_SCANCODE_SPACE , .pressed = false, .was_pressed = false, .changed = true},
111+ {.name = "\\" , .scancode = BSP_INPUT_SCANCODE_BACKSLASH , .pressed = false, .was_pressed = false, .changed = true},
112+ {.name = "ALTGR" ,
113+ .scancode = BSP_INPUT_SCANCODE_ESCAPED_RALT ,
114+ .pressed = false,
115+ .was_pressed = false,
116+ .changed = true},
117+ {.name = "LEFT" ,
118+ .scancode = BSP_INPUT_SCANCODE_ESCAPED_GREY_LEFT ,
119+ .pressed = false,
120+ .was_pressed = false,
121+ .changed = true},
122+ {.name = "DOWN" ,
123+ .scancode = BSP_INPUT_SCANCODE_ESCAPED_GREY_DOWN ,
124+ .pressed = false,
125+ .was_pressed = false,
126+ .changed = true},
127+ {.name = "RIGHT" ,
128+ .scancode = BSP_INPUT_SCANCODE_ESCAPED_GREY_RIGHT ,
129+ .pressed = false,
130+ .was_pressed = false,
131+ .changed = true},
132+ };
133+
134+ static void draw_keyboard (void ) {
135+ pax_buf_t * buffer = display_get_buffer ();
136+
137+ for (int column = 0 ; column < 8 ; column ++ ) {
138+ uint32_t index = column ;
139+ if (keys [index ].changed ) {
140+ keys [index ].changed = false;
141+ uint32_t color = keys [index ].pressed ? 0xFFFFFF00 : keys [index ].was_pressed ? 0xFFFFFFFF : 0xFF000000 ;
142+ float x = 10 + column * 95 + (column >= 4 ? 20 : 0 );
143+ pax_simple_rect (buffer , color , x , 0 , 95 , 60 );
144+ pax_outline_rect (buffer , 0xFF0000FF , x , 0 , 95 , 60 );
145+ pax_center_text (buffer , (keys [index ].pressed || keys [index ].was_pressed ) ? 0xFF000000 : 0xFFFFFFFF ,
146+ pax_font_sky_mono , 12 , x + (95.0f / 2.0f ), 30 , keys [index ].name );
147+ }
148+ }
149+
150+ for (int row = 1 ; row < 6 ; row ++ ) {
151+ for (int column = 0 ; column < 13 ; column ++ ) {
152+ uint32_t index = 8 + column + (row - 1 ) * 13 ;
153+ if (keys [index ].changed ) {
154+ keys [index ].changed = false;
155+ uint32_t color = keys [index ].pressed ? 0xFFFFFF00 : keys [index ].was_pressed ? 0xFFFFFFFF : 0xFF000000 ;
156+ float x = 10 + column * 60 ;
157+ float y = row * 60 ;
158+ pax_simple_rect (buffer , color , x , y , 60 , 60 );
159+ pax_outline_rect (buffer , 0xFF0000FF , x , y , 60 , 60 );
160+ pax_center_text (buffer , (keys [index ].pressed || keys [index ].was_pressed ) ? 0xFF000000 : 0xFFFFFFFF ,
161+ pax_font_sky_mono , 12 , x + (60.0f / 2.0f ), y + 30 , keys [index ].name );
162+ }
163+ }
164+ }
165+
166+ display_blit_buffer (buffer );
167+ }
168+
169+ void test_keyboard (void ) {
170+ QueueHandle_t input_event_queue = NULL ;
171+ ESP_ERROR_CHECK (bsp_input_get_queue (& input_event_queue ));
172+
173+ pax_buf_t * buffer = display_get_buffer ();
174+ pax_background (buffer , 0xFF000000 );
175+ pax_draw_text (buffer , 0xFFFFFFFF , pax_font_sky_mono , 16 , 16 , pax_buf_get_height (buffer ) - 48 ,
176+ "Press ESC and backspace simultaneously to exit" );
177+
178+ bool esc_pressed = false;
179+ bool backspace_pressed = false;
180+ bool exiting = false;
181+
182+ for (uint32_t i = 0 ; i < sizeof (keys ) / sizeof (keys [0 ]); i ++ ) {
183+ keys [i ].pressed = false;
184+ keys [i ].was_pressed = false;
185+ keys [i ].changed = true;
186+ }
187+
188+ while (1 ) {
189+ bsp_input_event_t event ;
190+
191+ if (xQueueReceive (input_event_queue , & event , pdMS_TO_TICKS (100 )) == pdTRUE ) {
192+ if (event .type == INPUT_EVENT_TYPE_SCANCODE ) {
193+ bsp_input_scancode_t scancode = event .args_scancode .scancode & ~BSP_INPUT_SCANCODE_RELEASE_MODIFIER ;
194+ for (uint32_t i = 0 ; i < sizeof (keys ) / sizeof (keys [0 ]); i ++ ) {
195+ if (keys [i ].scancode == scancode ) {
196+ keys [i ].was_pressed = keys [i ].pressed ;
197+ keys [i ].pressed = !(event .args_scancode .scancode & BSP_INPUT_SCANCODE_RELEASE_MODIFIER );
198+ keys [i ].changed = true;
199+ }
200+ }
201+ if (scancode == BSP_INPUT_SCANCODE_ESC ) {
202+ esc_pressed = !(event .args_scancode .scancode & BSP_INPUT_SCANCODE_RELEASE_MODIFIER );
203+ } else if (scancode == BSP_INPUT_SCANCODE_BACKSPACE ) {
204+ backspace_pressed = !(event .args_scancode .scancode & BSP_INPUT_SCANCODE_RELEASE_MODIFIER );
205+ }
206+ if (esc_pressed && backspace_pressed ) {
207+ exiting = true;
208+ }
209+ if (!esc_pressed && !backspace_pressed && exiting ) {
210+ return ;
211+ }
212+ draw_keyboard ();
213+ }
214+ }
215+ }
216+ }
0 commit comments