Skip to content

Commit 279a278

Browse files
committed
Hardcoded USB HID SNES gamepad support.
1 parent 8870bcd commit 279a278

File tree

1 file changed

+25
-23
lines changed

1 file changed

+25
-23
lines changed

components/esp_nes/osd.c

Lines changed: 25 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -47,25 +47,17 @@ typedef struct {
4747
} app_usb_hid_event_t;
4848

4949
typedef struct
50-
{
51-
uint8_t reserved1;
52-
uint8_t reserved2;
53-
50+
{
5451
bool btn_select:1;
55-
bool btn_res1:1;
56-
bool btn_res2:1;
5752
bool btn_start:1;
5853
bool btn_up:1;
59-
bool btn_right:1;
6054
bool btn_down:1;
55+
bool btn_right:1;
6156
bool btn_left:1;
62-
63-
bool btn_res3:4;
64-
bool btn_triangle:1;
65-
bool btn_circle:1;
66-
bool btn_cross:1;
67-
bool btn_square:1;
68-
} __attribute__((packed)) gamepad_t;
57+
58+
bool btn_a:1;
59+
bool btn_b:1;
60+
} gamepad_t;
6961

7062
/*******************************************************************************
7163
* Function definitions
@@ -253,22 +245,22 @@ void osd_getinput(void)
253245
}
254246
}
255247

256-
if(app_gamepad_tmp.btn_cross != app_gamepad.btn_cross)
248+
if(app_gamepad_tmp.btn_a != app_gamepad.btn_a)
257249
{
258-
pressed = (app_gamepad.btn_cross ? INP_STATE_MAKE : INP_STATE_BREAK);
250+
pressed = (app_gamepad.btn_a ? INP_STATE_MAKE : INP_STATE_BREAK);
259251
evh = event_get(event_joypad1_a);
260-
app_gamepad_tmp.btn_cross = app_gamepad.btn_cross;
252+
app_gamepad_tmp.btn_a = app_gamepad.btn_a;
261253

262254
if(evh) {
263255
evh(pressed);
264256
}
265257
}
266258

267-
if(app_gamepad_tmp.btn_circle != app_gamepad.btn_circle)
259+
if(app_gamepad_tmp.btn_b != app_gamepad.btn_b)
268260
{
269-
pressed = (app_gamepad.btn_circle ? INP_STATE_MAKE : INP_STATE_BREAK);
261+
pressed = (app_gamepad.btn_b ? INP_STATE_MAKE : INP_STATE_BREAK);
270262
evh = event_get(event_joypad1_b);
271-
app_gamepad_tmp.btn_circle = app_gamepad.btn_circle;
263+
app_gamepad_tmp.btn_b = app_gamepad.btn_b;
272264

273265
if(evh) {
274266
evh(pressed);
@@ -384,12 +376,22 @@ static void app_usb_hid_host_interface_callback(hid_host_device_handle_t hid_dev
384376
data = hid_host_device_get_data(hid_device_handle, &data_length);
385377
if (dev->proto == HID_PROTOCOL_NONE) {
386378
gamepad_t *gamepad = (gamepad_t*)data;
387-
if (data_length < 1) {
379+
if (data_length < 8) {
388380
break;
389381
}
390-
memcpy(&app_gamepad, gamepad, sizeof(gamepad_t));
382+
383+
app_gamepad.btn_up = (data[1] == 0x00 ? true : false);
384+
app_gamepad.btn_down = (data[1] == 0xFF ? true : false);
385+
app_gamepad.btn_left = (data[0] == 0x00 ? true : false);
386+
app_gamepad.btn_right = (data[0] == 0xFF ? true : false);
387+
388+
app_gamepad.btn_select = (data[6]&0x10 ? true : false);
389+
app_gamepad.btn_start = (data[6]&0x20 ? true : false);
390+
app_gamepad.btn_a = (data[5]&0x20 ? true : false);
391+
app_gamepad.btn_b = (data[5]&0x40 ? true : false);
392+
391393
osd_getinput();
392-
//ESP_LOGW(TAG, "Gamepad... len: %d; 0x%02x 0x%02x 0x%02x 0x%02x ", data_length, data[0], data[1], data[2], data[3]);
394+
//ESP_LOGW(TAG, "Gamepad... len: %d; 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x", data_length, data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7]);
393395
}
394396
break;
395397
case HID_HOST_INTERFACE_EVENT_TRANSFER_ERROR:

0 commit comments

Comments
 (0)