qmk_firmware/docs/feature_digitizer.md
a-chol 75b49aff56
Digitizer HID interface : absolute coordinates for mouse cursor (#12851)
* Add digitizer HID interface for setting the mouse cursor position at
absolute screen coordinates. Tested on Pro Micro, Proton C and
Blackpill.

* Update docs/feature_digitizer.md

Co-authored-by: Ryan <fauxpark@gmail.com>

* Update tmk_core/protocol/usb_descriptor.c

Co-authored-by: Ryan <fauxpark@gmail.com>

* Add missing copyrights
Add V-USB support

* Add support for digitizer dedicated endpoint for lufa and chibios.
Fix formatting issues
Move digitizer_task definition to the feature's base implementation file

* Run cformat on modified files

* Change digitizer report usage to Digitizer instead of Pen to avoid
pointer disappearing on Windows.

* Update tmk_core/protocol/vusb/vusb.c

Co-authored-by: Ryan <fauxpark@gmail.com>

* Run cformat from docker image

* Remove send_digitizer from host_driver_t and instead rely on the
declaration being the interface to the implementation in each
HW-specific usb implementation.

* Fix build : send_digitizer shouldn't be static in vusb and add
weak-linkage implementation for tests without usb implementation

* Change digitizer user interface to match pointing device's

* Update documentation with new API

Co-authored-by: a-chol <nothing@none.com>
Co-authored-by: Ryan <fauxpark@gmail.com>
2021-08-18 04:52:44 +10:00

1.4 KiB

Digitizer

The digitizer HID interface allows setting the mouse cursor position at absolute coordinates, unlike the Pointing Device feature that applies relative displacements.

To enable the digitizer interface, add the following line to your rules.mk:

DIGITIZER_ENABLE = yes

In order to change the mouse cursor position from your keymap.c file, include the digitizer header :

#include "digitizer.h"

This gives you access to the digitizer structure which members allow you to change the cursor position.

The coordinates are normalized, meaning there value must be set between 0 and 1. For the x coordinate, the value 0 is the leftmost position, whereas the value 1 is the rightmost position. For the y coordinate, 0 is at the top and 1 at the bottom.

Here is an example setting the cursor in the middle of the screen:

digitizer_t digitizer;
digitizer.x = 0.5;
digitizer.y = 0.5;
digitizer.tipswitch = 0;
digitizer.inrange = 1;
digitizer_set_report(digitizer);

The tipswitch member triggers what equates to a click when set to 1. The inrange member is required for the change in coordinates to be taken. It can then be set to 0 in a new report to signal the end of the digitizer interaction, but it is not strictly required.

Once all members are set to the desired value, the status member needs its bitmask DZ_UPDATED to be set so the report is sent during the next main loop iteration.