Skip to content

Commit aeb1dc0

Browse files
committed
Added USB HID gamepad support.
1 parent 70457af commit aeb1dc0

File tree

2 files changed

+127
-47
lines changed

2 files changed

+127
-47
lines changed

components/esp_nes/osd.c

Lines changed: 125 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -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

4343
typedef 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;
104125
static QueueHandle_t hid_queue = NULL;
105126
static app_kb_t app_kb;
106127
static 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))
126149
int 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)
184207
void 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
}

components/nofrendo/nes/nes.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,9 @@
4343

4444
/* NTSC = 60Hz, PAL = 50Hz */
4545
#ifdef PAL
46-
#define NES_REFRESH_RATE 50
46+
#define NES_REFRESH_RATE 30
4747
#else /* !PAL */
48-
#define NES_REFRESH_RATE 60
48+
#define NES_REFRESH_RATE 30
4949
#endif /* !PAL */
5050

5151
#define MAX_MEM_HANDLERS 32

0 commit comments

Comments
 (0)