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