This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

sending media keys over the keyboard HID

Hi,

sorry if this is a stupid question, but i'm fairly new to BLE (nRF8001), and even newer at report descriptors.

I'm trying to send some media keys, just volume up/down to start with.

i've edited the HID_keyboard template file in the arduino SDK, using the HID_mouse as an example - as it has media keys.

Please see my report descriptor below.

in the nRFgo studio program, i've edited the report descriptor/report map, added the new report ID characteristic and assigned a pipe to it, set to notify. Again i got this from the HID_mouse example.

My questions are:

    • how many bytes do i need to send (i notice the max is set to 3)
    • i know i need to send 0x10 for volume down, 0x20 for volume up, but what other data do i need to send? e.g. do i need to reference the report ID

can anyone suggest why it might not be working on iOS7

Note: the keyboard portion of the code works correctly.


report descriptor:

0x05, 0x01, // Usage Page (Generic Desktop) 0x09, 0x06, // Usage (Keyboard) 0xA1, 0x01, // Collection (Application)

0x85, 0x01, // Report Id 1 0x05, 0x07, // Usage Page (Key Codes) 0x19, 0xe0, // Usage Minimum (224) 0x29, 0xe7, // Usage Maximum (231) 0x15, 0x00, // Logical Minimum (0) 0x25, 0x01, // Logical Maximum (1) 0x75, 0x01, // Report Size (1) 0x95, 0x08, // Report Count (8) 0x81, 0x02, // Input (Data, Variable, Absolute)

0x95, 0x01, // Report Count (1) 0x75, 0x08, // Report Size (8) 0x81, 0x01, // Input (Constant) reserved byte(1)

0x95, 0x05, // Report Count (5) 0x75, 0x01, // Report Size (1) 0x05, 0x08, // Usage Page (Page# for LEDs) 0x19, 0x01, // Usage Minimum (1) 0x29, 0x05, // Usage Maximum (5) 0x91, 0x02, // Output (Data, Variable, Absolute), Led report 0x95, 0x01, // Report Count (1) 0x75, 0x03, // Report Size (3) 0x91, 0x01, // Output (Data, Variable, Absolute), Led report padding

0x95, 0x06, // Report Count (6) 0x75, 0x08, // Report Size (8) 0x15, 0x00, // Logical Minimum (0) 0x25, 0x65, // Logical Maximum (101) 0x05, 0x07, // Usage Page (Key codes) 0x19, 0x00, // Usage Minimum (0) 0x29, 0x65, // Usage Maximum (101) 0x81, 0x00, // Input (Data, Array) Key array(6 bytes)

0x09, 0x05, // Usage (Vendor Defined) 0x15, 0x00, // Logical Minimum (0) 0x26, 0xFF, 0x00, // Logical Maximum (255) 0x75, 0x08, // Report Count (2) 0x95, 0x02, // Report Size (8 bit) 0xB1, 0x02, // Feature (Data, Variable, Absolute) 0xC0 // End Collection (Application)

// Report ID 2: Advanced buttons

0x05, 0x0C, // Usage Page (Consumer) 0x09, 0x01, // Usage (Consumer Control) 0xA1, 0x01, // Collection (Application) 0x85, 0x02, // Report Id 2

0x15, 0x00, // Logical minimum (0) 0x25, 0x01, // Logical maximum (1) 0x75, 0x01, // Report Size (1) 0x95, 0x01, // Report Count (1)

0x09, 0xCD, // Usage (Play/Pause) 0x81, 0x06, // Input (Data,Value,Relative,Bit Field) 0x0A, 0x83, 0x01, // Usage (AL Consumer Control Configuration) 0x81, 0x06, // Input (Data,Value,Relative,Bit Field) 0x09, 0xB5, // Usage (Scan Next Track) 0x81, 0x06, // Input (Data,Value,Relative,Bit Field)
0x09, 0xB6, // Usage (Scan Previous Track) 0x81, 0x06, // Input (Data,Value,Relative,Bit Field)

0x09, 0xEA, //Usage (Volume Down)
0x81, 0x06, // Input (Data,Value,Relative,Bit Field) 0x09, 0xE9, //Usage (Volume Up) 0x81, 0x06, // Input (Data,Value,Relative,Bit Field) 0x0A, 0x25, 0x02, // Usage (AC Forward) 0x81, 0x06, // Input (Data,Value,Relative,Bit Field) 0x0A, 0x24, 0x02, // Usage (AC Back) 0x81, 0x06, // Input (Data,Value,Relative,Bit Field)

0xC0 // End Collection (Application)


function to send the data:

if (lib_aci_is_pipe_available(&aci_state, PIPE_HID_SERVICE_HID_REPORT_ID2_TX) && (aci_state.data_credit_available == 2)) {

sendMedia[0] = 0X20;		//volume up data
sendMedia[1] = 0x00;		
sendMedia[2] = 0x00;


lib_aci_send_data(PIPE_HID_SERVICE_HID_REPORT_ID2_TX, &sendMedia[0], 3);
aci_state.data_credit_available--;


sendMedia[0] = 0x00;		//no press data
sendMedia[1] = 0x00;
sendMedia[2] = 0x00;


lib_aci_send_data(PIPE_HID_SERVICE_HID_REPORT_ID2_TX, &sendMedia[0], 3);
aci_state.data_credit_available--;

} //available credit


kind regards, Damian

Related