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

Parents
  • Hi,

    thanks for your quick response.

    Yes i have seen that video, and i believe i have implemented the report map correctly. i've now attached the nRFgo studio file.

    The keyboard part of it is working correctly, only the added media keys that are not working.

    my query is more around the transmission of the data once paired. If you look at my function to send the data, i'm not sure if i'm sending the correct number of bytes, and if the data should be in the first byte, or second byte, etc.

    Or i could be completely wrong, like i said, i'm new at this.

    thanks again, Damian

    hid_keyboard_with_media_keys.xml

Reply
  • Hi,

    thanks for your quick response.

    Yes i have seen that video, and i believe i have implemented the report map correctly. i've now attached the nRFgo studio file.

    The keyboard part of it is working correctly, only the added media keys that are not working.

    my query is more around the transmission of the data once paired. If you look at my function to send the data, i'm not sure if i'm sending the correct number of bytes, and if the data should be in the first byte, or second byte, etc.

    Or i could be completely wrong, like i said, i'm new at this.

    thanks again, Damian

    hid_keyboard_with_media_keys.xml

Children
No Data
Related