• Hi! What you're doing looks kind of right, but you'll also need the code to enable HID mode and to send the HID report in the right format (it's usually an array rather than a single byte).

    What I'd suggest is to use the existing HID keyboard example as a base: http://www.espruino.com/BLE+Keyboard - and the library is http://www.espruino.com/modules/ble_hid_­keyboard.js

    So something like this might work:

    var report = new Uint8Array([
      0x05, 0x01,       // Usage Page (Generic Desktop)
      0x09, 0x06,       // Usage (Keyboard)
      0xA1, 0x01,       // Collection (Application)
      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, 0xff,       // Logical Maximum (255 - for lenovo mic)
      0x05, 0x07,       // Usage Page (Key codes)
      0x19, 0x00,       // Usage Minimum (0)
      0x29, 0xff,       // Usage Maximum (255 - for lenovo mic)
      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)
    ]);
    NRF.setServices(undefined, { hid : report });
    
    function tap(keyCode, modifiers, callback) {
      NRF.sendHIDReport([modifiers,0,keyCode,0­,0,0,0,0], function() {
        NRF.sendHIDReport([0,0,0,0,0,0,0,0], function() {
          if (callback) callback();
        });    
      });
    };
    
    function btnPressed() {
      tap(0xF1, 0, function() {  });
    }
    
    setWatch(btnPressed, BTN, {edge:"rising",repeat:true,debounce:50})­;
    

    What I've done is used the HID report that's normally used for keyboards - but modified it so that instead of saying 115 is the maximum keycode sent, it says 255 is, so you can then send 0xF1.

    I'm not sure if that'll do it, but it's worth a try. Failing that you could see if you can get the report descriptor your actual Lenovo keyboard uses, and then copy that

About

Avatar for Gordon @Gordon started