@@ -38,7 +38,7 @@ static const char *TAG = "OSD";
3838
3939#define APP_DEFAULT_WIDTH 256
4040#define APP_DEFAULT_HEIGHT 240
41- #define APP_DEFAULT_ZOOM 512
41+ #define APP_DEFAULT_ZOOM 256
4242
4343typedef struct {
4444 int16_t x ; /* Mouse X coordinate */
@@ -56,6 +56,27 @@ typedef struct {
5656 void * arg ;
5757} app_usb_hid_event_t ;
5858
59+ typedef struct
60+ {
61+ uint8_t reserved1 ;
62+ uint8_t reserved2 ;
63+
64+ bool btn_select :1 ;
65+ bool btn_res1 :1 ;
66+ bool btn_res2 :1 ;
67+ bool btn_start :1 ;
68+ bool btn_up :1 ;
69+ bool btn_right :1 ;
70+ bool btn_down :1 ;
71+ bool btn_left :1 ;
72+
73+ bool btn_res3 :4 ;
74+ bool btn_triangle :1 ;
75+ bool btn_circle :1 ;
76+ bool btn_cross :1 ;
77+ bool btn_square :1 ;
78+ } __attribute__((packed )) gamepad_t ;
79+
5980/*******************************************************************************
6081* Function definitions
6182*******************************************************************************/
@@ -104,6 +125,8 @@ static lv_img_dsc_t vid_tmp_img;
104125static QueueHandle_t hid_queue = NULL ;
105126static app_kb_t app_kb ;
106127static app_mouse_t app_mouse ;
128+ static gamepad_t app_gamepad ;
129+ static gamepad_t app_gamepad_tmp ;
107130/*******************************************************************************
108131* Public API functions
109132*******************************************************************************/
@@ -126,24 +149,24 @@ void osd_setsound(void (*playfunc)(void *buffer, int size))
126149int osd_init (void )
127150{
128151 uint32_t buf_size = APP_DEFAULT_WIDTH * APP_DEFAULT_HEIGHT * sizeof (uint16_t );
129- vid_buffer = heap_caps_malloc (4 * buf_size , MALLOC_CAP_DEFAULT );
152+ vid_buffer = heap_caps_malloc (buf_size , MALLOC_CAP_DEFAULT );
130153 assert (vid_buffer );
131154 memset (vid_buffer , 0x00 , buf_size );
132- vid_buffer_tmp = heap_caps_malloc (buf_size , MALLOC_CAP_DEFAULT );
133- assert (vid_buffer_tmp );
134- memset (vid_buffer_tmp , 0x00 , buf_size );
155+ // vid_buffer_tmp = heap_caps_malloc(buf_size, MALLOC_CAP_DEFAULT);
156+ // assert(vid_buffer_tmp);
157+ // memset(vid_buffer_tmp, 0x00, buf_size);
135158
136- vid_tmp_img .data = (void * )vid_buffer_tmp ;
159+ /* vid_tmp_img.data = (void *)vid_buffer_tmp;
137160 vid_tmp_img.header.cf = LV_IMG_CF_TRUE_COLOR;
138161 vid_tmp_img.header.w = APP_DEFAULT_WIDTH;
139- vid_tmp_img .header .h = APP_DEFAULT_HEIGHT ;
162+ vid_tmp_img.header.h = APP_DEFAULT_HEIGHT;*/
140163
141- // app_hid_init();
164+ app_hid_init ();
142165
143166 bsp_display_lock (0 );
144167 lv_obj_set_style_bg_color (lv_scr_act (), lv_color_black (), 0 );
145168 lvgl_video_canvas = lv_canvas_create (lv_scr_act ());
146- lv_canvas_set_buffer (lvgl_video_canvas , vid_buffer , 2 * APP_DEFAULT_WIDTH , 2 * APP_DEFAULT_HEIGHT , LV_IMG_CF_TRUE_COLOR );
169+ lv_canvas_set_buffer (lvgl_video_canvas , vid_buffer , APP_DEFAULT_WIDTH , APP_DEFAULT_HEIGHT , LV_IMG_CF_TRUE_COLOR );
147170 lv_obj_center (lvgl_video_canvas );
148171 bsp_display_unlock ();
149172
@@ -184,44 +207,94 @@ char *osd_newextension(char *string, char *ext)
184207void osd_getinput (void )
185208{
186209 event_t evh = NULL ;
187-
188- int pressed = (app_kb .pressed ? INP_STATE_MAKE : INP_STATE_BREAK );
189- if (app_kb .last_key == 's' ) {
190- ESP_LOGW (TAG , "select" );
210+ int pressed = 0 ;
211+
212+ if (app_gamepad_tmp .btn_select != app_gamepad .btn_select )
213+ {
214+ pressed = (app_gamepad .btn_select ? INP_STATE_MAKE : INP_STATE_BREAK );
191215 evh = event_get (event_joypad1_select );
192- } else if (app_kb .last_key == LV_KEY_ENTER ) {
193- ESP_LOGW (TAG , "start" );
216+ app_gamepad_tmp .btn_select = app_gamepad .btn_select ;
217+
218+ if (evh ) {
219+ evh (pressed );
220+ }
221+ }
222+
223+ if (app_gamepad_tmp .btn_start != app_gamepad .btn_start )
224+ {
225+ pressed = (app_gamepad .btn_start ? INP_STATE_MAKE : INP_STATE_BREAK );
194226 evh = event_get (event_joypad1_start );
195- } else if (app_kb .last_key == LV_KEY_UP ) {
196- ESP_LOGW (TAG , "up" );
227+ app_gamepad_tmp .btn_start = app_gamepad .btn_start ;
228+
229+ if (evh ) {
230+ evh (pressed );
231+ }
232+ }
233+
234+ if (app_gamepad_tmp .btn_up != app_gamepad .btn_up )
235+ {
236+ pressed = (app_gamepad .btn_up ? INP_STATE_MAKE : INP_STATE_BREAK );
197237 evh = event_get (event_joypad1_up );
198- } else if (app_kb .last_key == LV_KEY_DOWN ) {
199- ESP_LOGW (TAG , "down" );
238+ app_gamepad_tmp .btn_up = app_gamepad .btn_up ;
239+
240+ if (evh ) {
241+ evh (pressed );
242+ }
243+ }
244+
245+ if (app_gamepad_tmp .btn_down != app_gamepad .btn_down )
246+ {
247+ pressed = (app_gamepad .btn_down ? INP_STATE_MAKE : INP_STATE_BREAK );
200248 evh = event_get (event_joypad1_down );
201- } else if (app_kb .last_key == LV_KEY_RIGHT ) {
202- ESP_LOGW (TAG , "right" );
249+ app_gamepad_tmp .btn_down = app_gamepad .btn_down ;
250+
251+ if (evh ) {
252+ evh (pressed );
253+ }
254+ }
255+
256+ if (app_gamepad_tmp .btn_right != app_gamepad .btn_right )
257+ {
258+ pressed = (app_gamepad .btn_right ? INP_STATE_MAKE : INP_STATE_BREAK );
203259 evh = event_get (event_joypad1_right );
204- } else if (app_kb .last_key == LV_KEY_LEFT ) {
205- ESP_LOGW (TAG , "left" );
260+ app_gamepad_tmp .btn_right = app_gamepad .btn_right ;
261+
262+ if (evh ) {
263+ evh (pressed );
264+ }
265+ }
266+
267+ if (app_gamepad_tmp .btn_left != app_gamepad .btn_left )
268+ {
269+ pressed = (app_gamepad .btn_left ? INP_STATE_MAKE : INP_STATE_BREAK );
206270 evh = event_get (event_joypad1_left );
207- }else if (app_kb .last_key == ' ' ) {
208- ESP_LOGW (TAG , "A" );
209- evh = event_get (event_joypad1_a );
210- }else if (app_kb .last_key == 'b' ) {
211- ESP_LOGW (TAG , "B" );
212- evh = event_get (event_joypad1_b );
271+ app_gamepad_tmp .btn_left = app_gamepad .btn_left ;
272+
273+ if (evh ) {
274+ evh (pressed );
275+ }
213276 }
277+
278+ if (app_gamepad_tmp .btn_cross != app_gamepad .btn_cross )
279+ {
280+ pressed = (app_gamepad .btn_cross ? INP_STATE_MAKE : INP_STATE_BREAK );
281+ evh = event_get (event_joypad1_a );
282+ app_gamepad_tmp .btn_cross = app_gamepad .btn_cross ;
214283
215- if (evh ) {
216- evh (pressed );
284+ if (evh ) {
285+ evh (pressed );
286+ }
217287 }
288+
289+ if (app_gamepad_tmp .btn_circle != app_gamepad .btn_circle )
290+ {
291+ pressed = (app_gamepad .btn_circle ? INP_STATE_MAKE : INP_STATE_BREAK );
292+ evh = event_get (event_joypad1_b );
293+ app_gamepad_tmp .btn_circle = app_gamepad .btn_circle ;
218294
219- if (app_kb .pressed ) {
220- ESP_LOGW (TAG , "1" );
221- //app_kb.pressed = false;
222- } else {
223- //ESP_LOGW(TAG, "0");
224- app_kb .last_key = 0 ;
295+ if (evh ) {
296+ evh (pressed );
297+ }
225298 }
226299}
227300
@@ -306,14 +379,14 @@ static void app_osd_video_custom_blit(bitmap_t *primary, int num_dirties, rect_t
306379 {
307380 for (int y = 0 ; y < APP_DEFAULT_HEIGHT ; y ++ )
308381 {
309- vid_buffer_tmp [(x * APP_DEFAULT_HEIGHT * 2 ) + (y * 2 )] = HIBYTE (colorPalette [data [0 ]]);
310- vid_buffer_tmp [(x * APP_DEFAULT_HEIGHT * 2 ) + (y * 2 )+ 1 ] = LOBYTE (colorPalette [data [0 ]]);
382+ vid_buffer [(x * APP_DEFAULT_HEIGHT * 2 ) + (y * 2 )] = HIBYTE (colorPalette [data [0 ]]);
383+ vid_buffer [(x * APP_DEFAULT_HEIGHT * 2 ) + (y * 2 )+ 1 ] = LOBYTE (colorPalette [data [0 ]]);
311384 data ++ ;
312385 }
313386 }
314387
315388 bsp_display_lock (0 );
316- lv_canvas_transform (lvgl_video_canvas , & vid_tmp_img , 0 , APP_DEFAULT_ZOOM , 0 , 0 , 0 , 0 , true);
389+ // lv_canvas_transform(lvgl_video_canvas, &vid_tmp_img, 0, APP_DEFAULT_ZOOM, 0, 0, 0, 0, true);
317390 lv_obj_invalidate (lvgl_video_canvas );
318391 bsp_display_unlock ();
319392}
@@ -407,14 +480,11 @@ static void app_usb_hid_host_interface_callback(hid_host_device_handle_t hid_dev
407480 if (dev -> proto == HID_PROTOCOL_KEYBOARD ) {
408481 hid_keyboard_input_report_boot_t * keyboard = (hid_keyboard_input_report_boot_t * )data ;
409482 if (data_length < sizeof (hid_keyboard_input_report_boot_t )) {
410- ESP_LOGW (TAG , "kb 1" );
411483 return ;
412484 }
413485 for (int i = 0 ; i < HID_KEYBOARD_KEY_MAX ; i ++ ) {
414- ESP_LOGW (TAG , "kb 2" );
415486 if (keyboard -> key [i ] > HID_KEY_ERROR_UNDEFINED ) {
416487 char key = 0 ;
417- ESP_LOGW (TAG , "kb 3" );
418488
419489 /* LVGL special keys */
420490 if (keyboard -> key [i ] == HID_KEY_TAB ) {
@@ -458,7 +528,6 @@ static void app_usb_hid_host_interface_callback(hid_host_device_handle_t hid_dev
458528 }
459529
460530 }
461- ESP_LOGW (TAG , "kb 5" );
462531
463532 } else if (dev -> proto == HID_PROTOCOL_MOUSE ) {
464533 hid_mouse_input_report_boot_t * mouse = (hid_mouse_input_report_boot_t * )data ;
@@ -468,6 +537,14 @@ static void app_usb_hid_host_interface_callback(hid_host_device_handle_t hid_dev
468537 app_mouse .left_button = mouse -> buttons .button1 ;
469538 app_mouse .x += mouse -> x_displacement ;
470539 app_mouse .y += mouse -> y_displacement ;
540+ } else {
541+ gamepad_t * gamepad = (gamepad_t * )data ;
542+ if (data_length < 1 ) {
543+ break ;
544+ }
545+ memcpy (& app_gamepad , gamepad , sizeof (gamepad_t ));
546+ osd_getinput ();
547+ //ESP_LOGW(TAG, "Gamepad... len: %d; 0x%02x 0x%02x 0x%02x 0x%02x ", data_length, data[0], data[1], data[2], data[3]);
471548 }
472549 break ;
473550 case HID_HOST_INTERFACE_EVENT_TRANSFER_ERROR :
@@ -495,7 +572,7 @@ static void app_usb_hid_task(void *arg)
495572 switch (msg .event ) {
496573 case HID_HOST_DRIVER_EVENT_CONNECTED :
497574 /* Handle mouse or keyboard */
498- if (dev -> proto == HID_PROTOCOL_KEYBOARD || dev -> proto == HID_PROTOCOL_MOUSE ) {
575+ if (dev -> proto == HID_PROTOCOL_NONE || dev -> proto == HID_PROTOCOL_KEYBOARD || dev -> proto == HID_PROTOCOL_MOUSE ) {
499576 const hid_host_device_config_t dev_config = {
500577 .callback = app_usb_hid_host_interface_callback ,
501578 };
@@ -504,9 +581,12 @@ static void app_usb_hid_task(void *arg)
504581 ESP_ERROR_CHECK ( hid_class_request_set_idle (hid_device_handle , 0 , 0 ) );
505582 ESP_ERROR_CHECK ( hid_class_request_set_protocol (hid_device_handle , HID_REPORT_PROTOCOL_BOOT ) );
506583 ESP_ERROR_CHECK ( hid_host_device_start (hid_device_handle ) );
584+ } else {
585+ ESP_LOGE (TAG , "Other HID device connected! Proto: %d" , dev -> proto );
507586 }
508587 break ;
509588 default :
589+ ESP_LOGE (TAG , "Not handled HID event!" );
510590 break ;
511591 }
512592 }
0 commit comments