BLE HID device Gamepad button click not recognised on iOS
Posted: Sun Jun 16, 2024 5:57 pm
Hi. I'm working on a Gamepad device, following esp_hid_device example.
I have modified the example to run under bluedroid, modify the demo function to:
esp_hid_ble_gap_adv_init(ESP_HID_APPEARANCE_GAMEPAD, ble_hid_config.device_name);
const unsigned char mediaReportMap[] = {
0x05, 0x01, // USAGE_PAGE (Generic Desktop)
0x09, 0x04, // USAGE (Gamepad)
0xa1, 0x01, // COLLECTION (Application)
0x85, 0x00, // Report id 0
0x05, 0x09, // USAGE_PAGE (Button)
0x19, 0x01, // USAGE_MINIMUM (Button 1)
0x29, 0x03, // USAGE_MAXIMUM (Button 3)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x25, 0x01, // LOGICAL_MAXIMUM (1)
0x95, 0x03, // REPORT_COUNT (3)
0x75, 0x01, // REPORT_SIZE (1)
0x81, 0x02, // INPUT (Data,Var,Abs)
// padding
0x95, 0x01, // REPORT_COUNT (1)
0x75, 0x05, // REPORT_SIZE (5)
0x81, 0x03, // Input(Constant, Variable, Absolute, NoWrap, Linear, PreferredState, NoNullPosition, BitField)
0xc0 // END_COLLECTION
};
void esp_hidd_send_consumer_value(uint8_t key_cmd, bool key_pressed)
{
uint8_t buffer[1] = {0};
if (key_pressed)
{
buffer[0] = 1;
}
esp_err_t res = esp_hidd_dev_input_set(s_ble_hid_param.hid_dev, 0, 0x00, buffer, 1);
return;
}
The device is recognised as a Gamepade device on iOS and Android.
On Android this sample works as expected. The button clicks are recognised.
However, on iOS the pairing works but clicks are not recognised.
I have tried the same operation with a PS4 joystick. After connecting it, I go to the Switch Access setting on iOS, and add an external switch. When I click the button, it is recognised. But with my ESP32C3 device, the is no reaction to button click.
This issues is only happening on iOS, because Android does react to the button click in Switch Access.
Please help me to configure the device.
I have modified the example to run under bluedroid, modify the demo function to:
esp_hid_ble_gap_adv_init(ESP_HID_APPEARANCE_GAMEPAD, ble_hid_config.device_name);
const unsigned char mediaReportMap[] = {
0x05, 0x01, // USAGE_PAGE (Generic Desktop)
0x09, 0x04, // USAGE (Gamepad)
0xa1, 0x01, // COLLECTION (Application)
0x85, 0x00, // Report id 0
0x05, 0x09, // USAGE_PAGE (Button)
0x19, 0x01, // USAGE_MINIMUM (Button 1)
0x29, 0x03, // USAGE_MAXIMUM (Button 3)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x25, 0x01, // LOGICAL_MAXIMUM (1)
0x95, 0x03, // REPORT_COUNT (3)
0x75, 0x01, // REPORT_SIZE (1)
0x81, 0x02, // INPUT (Data,Var,Abs)
// padding
0x95, 0x01, // REPORT_COUNT (1)
0x75, 0x05, // REPORT_SIZE (5)
0x81, 0x03, // Input(Constant, Variable, Absolute, NoWrap, Linear, PreferredState, NoNullPosition, BitField)
0xc0 // END_COLLECTION
};
void esp_hidd_send_consumer_value(uint8_t key_cmd, bool key_pressed)
{
uint8_t buffer[1] = {0};
if (key_pressed)
{
buffer[0] = 1;
}
esp_err_t res = esp_hidd_dev_input_set(s_ble_hid_param.hid_dev, 0, 0x00, buffer, 1);
return;
}
The device is recognised as a Gamepade device on iOS and Android.
On Android this sample works as expected. The button clicks are recognised.
However, on iOS the pairing works but clicks are not recognised.
I have tried the same operation with a PS4 joystick. After connecting it, I go to the Switch Access setting on iOS, and add an external switch. When I click the button, it is recognised. But with my ESP32C3 device, the is no reaction to button click.
This issues is only happening on iOS, because Android does react to the button click in Switch Access.
Please help me to configure the device.