Самодельный «драйвер» для графического планшета GAOMON M106K для Linux на Python

Для графического планшета GAOMON M106K пару лет назад драйвера для Linux не было. Скорее всего, до сих пор нет. Поэтому пару лет назад написал для себя скрипт на Python, с помощью которого планшет у меня заработал в Ubuntu и Raspbian.

Сначала про подготовку к запуску скрипта. Нужно будет кое-что установить (под root`ом):

# apt-get install python3-pip && \
pip3 install --upgrade pip && \
pip3 install setuptools && \
pip3 install Xlib && \
pip3 install pyautogui

Библиотека pyautogui по умолчанию работает не очень (перемещение курсора дёрганое), поэтому нужно поправить в ней один файл (версия питона может отличаться):

# cp __init__.py /usr/local/lib/python3.4/dist-packages/pyautogui/__init__.py

После этого нужно проверить в скрипте planshet.py имя файла устройства (у меня он подключался под именем /dev/hidraw2) и запустить его под root`ом (иначе не будет прав на чтение из файла устройства).

Сам «драйвер» planshet.py:

#!/usr/bin/python3
# -*- coding: utf-8 -*-
"""
"driver" for GAOMON M106K by Maxim Kuznetsov http://kmsvsr.ru
To install needed packages and modules run "install.sh" as superuser
Don`t forget to replace or edit /usr/local/lib/python.../dist-packages/pyautogui/__init__.py
before use
"sudo ./planshet.py" to run. Sudo is for access to read from device /dev/hidraw0
Works in Linux Mint 18
"""

import time
import struct
# https://pyautogui.readthedocs.io/en/latest/mouse.html#the-mousedown-and-mouseup-functions
import pyautogui


MONITOR_HEIGHT = 1050
MONITOR_WIDTH = 1400


def start_driver():
    """Open device and start to process input actions"""
    # init
    with open("/dev/hidraw2", "rb") as device_file:
        lm_pressed = False
        rm_pressed = False
        mm_pressed = False
        last_move_time = int(round(time.time() * 1000))

        # endless cycle of reading data from device
        while True:
            data = device_file.read(8) # 8 is for my GAOMON M106K
            values = struct.unpack('HHHH',data)
            print(
                f"Buttons: {hex(values[0])}; "
                f"X: {hex(values[1])}; "
                f"Y: {hex(values[2])}; "
                f"Press: {hex(values[3])}"
            )
            # https://stackoverflow.com/questions/1181464/controlling-mouse-with-python
            current_time = int(round(time.time() * 1000))
            deadline_time = last_move_time + 15
            if deadline_time < current_time:
                x_pos = values[1] * MONITOR_WIDTH / 0x7fff
                y_pos = values[2] * MONITOR_HEIGHT / 0x7fff
                buttons = values[0]
                press = values[3]
                pyautogui.moveTo(x_pos, y_pos)
                last_move_time = current_time
                # Left mouse button is touch by pen
                if press > 0:
                    if not lm_pressed:
                        pyautogui.mouseDown(button='left')
                        lm_pressed = True
                else:
                    if lm_pressed:
                        pyautogui.mouseUp(button='left')
                        lm_pressed = False

                # Right mouse button is touch by pen with bottom button on it
                if buttons == 0xc20a:
                    if not rm_pressed:
                        pyautogui.mouseDown(button='right')
                        rm_pressed = True
                else:
                    if rm_pressed:
                        pyautogui.mouseUp(button='right')
                        rm_pressed = False

                # Middle mouse button is touch by pen with top button on it
                if buttons == 0xc40a:
                    if not mm_pressed:
                        pyautogui.mouseDown(button='middle')
                        mm_pressed = True
                else:
                    if mm_pressed:
                        pyautogui.mouseUp(button='middle')
                        mm_pressed = False


if __name__ == "__main__":
    start_driver()

Весь «драйвер» получился чуть больше 50 строчек кода. Может быть кому-нибудь пригодится подключить так же другую модель планшета или ещё какое-нибудь необычное устройство ввода, для которого нет нормального драйвера под Linux.

Из недоделок: не работают кнопки на планшете, либо они подключаются другим устройством, либо через /dev вообще не доступны, лишку не разбирался.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Protected by WP Anti Spam