Drobnicky

Drobničky 008 – Potlačení akcelerace Arduino myši na Linuxu

Zatímco u normální myši je akcelerace přijemná, protože dosáhneme na celou obrazovku a přitom se dá kurzor umístit celkem přesně, tak u robotické myši je dost nevýhodná, protože chybí zpětná vazba a velice záleží na délce pohybů, pauzách mezi nimi a i jejich řazení.

Myš umožňuje pohyb jen o +/- 127 v každém směru v jedné akci, přitom přes celou obrazovku to může být i několik tisíc – jednoduché řešení je si napsat funkci, která delší požadovaný pohyb rozloží na několik menších, které SW zvládne.

Nejjednodušší funkce vezme cíl, ořízne nějakou hodnotou (127, 100, …), udělá tento pohyb a odečte od cíle, takto pokračuje, dokud nezbude 0,0 a má hotovo.

Problém je, že s výjimkou pohybu po osách a úhlopříčkách se cesta tam a zpátky liší a kvůli urychlení se nevrátíte do počátečního bodu. Nemluvě o tom, že skládání pohybů obecně vede k dost nepředvidatelným výsledkům – nejde například jednoduše proskákat a proklikat pravoúhlou síť tlačítek. Myš totiž neumožňuje zjištění aktuální polohy, ani pohyb na absolutní souřadnice.

Řešením je akceleraci vypnout, ale jen pro robotickou myš (ta si bude muset jet lineární rychlostí, tedy víc úseků, ale zato budou přesně dlouhé), normální nechat pohodlnou, akcelerovanou.

Nejdřív je potřeba zjistit, jak se nám robomyš hlásí v systému:

xinput --list
- Virtual core pointer                          id=2    [master pointer  (3)]
-   - Virtual core XTEST pointer                id=4    [slave  pointer  (2)]
-   - SONiX USB DEVICE Consumer Control         id=11   [slave  pointer  (2)]
-   - SONiX USB DEVICE Mouse                    id=12   [slave  pointer  (2)]
-   - BY Tech Usb Gaming Keyboard Consumer Control      id=15   [slave  pointer  (2)]
-   - BY Tech Usb Gaming Keyboard Mouse         id=17   [slave  pointer  (2)]
-   - USB Optical Mouse                         id=20   [slave  pointer  (2)]
-   - Arduino LLC Arduino Micro Mouse           id=19   [slave  pointer  (2)]
- Virtual core keyboard                         id=3    [master keyboard (2)]
- Virtual core XTEST keyboard               id=5    [slave  keyboard (3)]
- Power Button                              id=6    [slave  keyboard (3)]
- Power Button                              id=7    [slave  keyboard (3)]
- SONiX USB DEVICE                          id=8    [slave  keyboard (3)]
- SONiX USB DEVICE Keyboard                 id=9    [slave  keyboard (3)]
- SONiX USB DEVICE System Control           id=10   [slave  keyboard (3)]
- BY Tech Usb Gaming Keyboard               id=13   [slave  keyboard (3)]
- BY Tech Usb Gaming Keyboard System Control        id=14   [slave  keyboard (3)]
- BY Tech Usb Gaming Keyboard               id=16   [slave  keyboard (3)]
- SONiX USB DEVICE Consumer Control         id=21   [slave  keyboard (3)]
- BY Tech Usb Gaming Keyboard Consumer Control      id=22   [slave  keyboard (3)]
- Arduino LLC Arduino Micro Keyboard        id=18   [slave  keyboard (3)]

Myš je zjevně Arduino LLC Arduino Micro Mouse a má id=19. V názvu je první slovo do mezery Vendor, zbytek Produkt, takže vytvoříme soubor /etc/X11/xorg.conf.d/mouse-acceleration.conf, který ji akceleraci zakáže a restartujeme Xka

# Stop acceleration on mouse
Section "InputClass"
    Identifier "My Mouse"
    MatchIsPointer "yes"
    MatchVendor "Arduino"
    MatchProduct "LLC Arduino Micro Mouse"
    Option "AccelerationProfile" "-1"
    Option "AccelerationScheme" "none"
    Option "AccelSpeed" "-1"
EndSection