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

is multi touch HID possible with nrf51822 chip?

Hi All,

       Currently i am working on nrf51822 for multi touch HID.For that i have chosen mouse HID example as a reference, in which i have changed HID descriptor(single touch) and some other things.So, that single touch has been working.

And, if i changed the HID descriptor for multi touch, touch devices(touch laptop) were showing "Bluetooth driver error".

is it possible multi touch HID over nrf51822 as a reference of mouse HID example?

if possible, what all changes are to be required to work for multi touch.

so, please guide me how to implement multi touch HID over nrf51822.

regards

akash.

  • Hi Ovrebekk

    I was on leave for last week, since couldn't give reply.

    I have tested 5 touches over USB.

    Here, How i am sending data...

    void send (uint8_t i, uint16_t x, uint16_t y)
    {
    uint8_t my_buff1[10] = {0};

    my_buff[0] = 0xff;
    my_buff[1] = i;

    my_buff[2] = (x & 0x00ff);
    my_buff[3] = ((x >> 8) & 0xff);

    my_buff[4] = (y & 0xff);
    my_buff[5] = ((y >> 8) & 0xff);

    my_buff[6] = 0x64;
    my_buff[7] = 0x00;

    my_buff[8] = 0x06;

    // sprintf (my_buff1,"%d\r\n",my_buff[0]);
    // HAL_UART_Transmit (&huart2,&my_buff1[i],sizeof (my_buff1),100);

    USBD_CUSTOM_HID_SendReport (&hUsbDeviceFS,
    my_buff,
    9);
    USBD_LL_Delay (100);
    }

    Above wrapper is for constructing the packet.Like this i am sending 5 packets with different touch id(i value 0 to 4), 

    x and y values.(x and y are up to 10,000).

    If i construct same packet and send over Bluetooth, i have been not getting even a single touch also. 

    I have got a reference of working multi touch, but it has been working on teensy modules.

    please go through following link...

    https://github.com/PaulStoffregen/cores/tree/master/teensy3

    so, if u get any break through please let me know, that could be helped me a lot.

    best regards

    akash.

  • Hi 

    I don't think setting contact count to 6 is correct, unless you are sending 6 packets together. 

    On an Android phone I was able to get the example to work somewhat, but I used a slightly different send function:

    typedef PACKED_STRUCT
    {
    uint8_t tip_switch : 1;
    uint8_t tip_pressure : 7;
    uint8_t contact_id;
    uint16_t x;
    uint16_t y;
    uint16_t scan_time;
    uint8_t contact_count;
    uint8_t contact_count_max;
    }digitizer_report_t;

    void digitizer_send3(uint8_t id, uint8_t c_count, uint16_t x, uint16_t y, bool tip_down)
    {
    digitizer_report_t report = {0};

    report.tip_switch = (tip_down > 0) ? 1 : 0;
    report.tip_pressure = (tip_down > 0) ? 127 : 0;
    report.contact_id = id;
    report.x = x;
    report.y = y;
    report.scan_time = 0x64;
    report.contact_count = c_count;
    report.contact_count_max = 6;
    uint32_t err_code;
    err_code = ble_hids_inp_rep_send(&m_hids,
    INPUT_REP_DIGITIZER_INDEX,
    INPUT_REP_DIGITIZER_LEN,
    (uint8_t *)&report,
    m_conn_handle);
    APP_ERROR_CHECK(err_code);
    }

    Then I tried to set 5 simultaneous touch points by calling the digitizer send function repeatedly based on a button press, with the following arguments:

    digitizer_send3(0, 5, 10000, 10000, true);
    digitizer_send3(1, 5, 20000, 20000, true);
    digitizer_send3(2, 5, 15000, 15000, true);
    digitizer_send3(3, 5, 12000, 12000, true);
    digitizer_send3(4, 5, 34000, 30000, true);
    digitizer_send3(0, 5, 13000, 13000, true);
    digitizer_send3(1, 5, 23000, 26000, true);
    digitizer_send3(2, 5, 15000, 15000, true);
    digitizer_send3(3, 5, 12000, 12000, true);
    digitizer_send3(4, 5, 34000, 30000, true);
    digitizer_send3(0, 5, 10000, 10000, false);
    digitizer_send3(1, 5, 20000, 20000, false);
    digitizer_send3(2, 5, 15000, 15000, false);
    digitizer_send3(3, 5, 12000, 12000, false);
    digitizer_send3(4, 5, 34000, 30000, false);

    For some reason the first command seems to be ignored, and after the first 5 commands I will have 4 touch points appear (I use and Android app called "Multi Touch Test" to debug it). 

    After I run the next 5 lines all the 5 touch points appear, and after the last 5 lines they are all removed again. 

    I haven't been able to test this successfully on Windows, I need to continue work on that tomorrow. 

    Best regards
    Torbjørn

  • Hi Ovrebekk

    That was good news.

    At least multi touch has been working on Android mobile.

    are u using same multi touch hid which i have shared to you?

    If possible please share your entire project, so that i can test and will try it work on windows as well.

    Best regards,

    akash. 

  • Hi 

    My HID descriptor is almost identical to the one you sent, except there is a slight change around the scan time usage. The ordering of lines was a bit non standard in your version (if you compare the two I am sure you will spot it). 

    You will find the example attached:
    ble_app_hids_mouse.zip

    Unfortunately I tested this on the nRF52832, not the nRF51822. 

    Would you happen to have an nRF52DK available that you can test on?

    If not I will try to port the code to the nRF51 so you can test it there. 

    I don't expect the HID behavior to be different on the nRF52 compared to the nRF51, as long as the BLE connection works as normal. 

    Best regards
    Torbjørn

  • Hi Ovrebekk

    Thanks for sharing the file.

    yes, i have nrf52DK and will test on it.

    On which SDK you have used to implement the project?

    if you share SDK version, so that i can download and edit the main file.Because i am using nRF5_SDK_15.0.0.

    Best regards

    Akash

Related