Самодельный «драйвер» для графического планшета 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
import pyautogui   	#https://pyautogui.readthedocs.io/en/latest/mouse.html#the-mousedown-and-mouseup-functions

#init
f = open("/dev/hidraw2", "rb")
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 = f.read(8) # 8 is for my GAOMON M106K
	a = struct.unpack('HHHH',data)
	print("Buttons: " + hex(a[0]) + \
		"; X: " + hex(a[1]) +\
		"; Y: " + hex(a[2]) +\
		"; Press: " + hex(a[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 = a[1] * 1400 / 0x7fff
		y = a[2] * 1050 / 0x7fff
		buttons = a[0]
		press = a[3]
		pyautogui.moveTo(x, y)
		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

f.close()

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

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

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

Ваш адрес email не будет опубликован.

Protected by WP Anti Spam