forked from https://github.com/Evidlo/remarkable_mouse | patches include cool mapping mode that actually does proper aspect ratio conversion and fixing it for smartcard ssh setups
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
113 lines
3.7 KiB
113 lines
3.7 KiB
#!/bin/env python |
|
# Evan Widloski - 2019-02-23 |
|
# Use reMarkable as mouse input |
|
|
|
import argparse |
|
import logging |
|
import os |
|
import sys |
|
import struct |
|
from getpass import getpass |
|
|
|
import paramiko |
|
|
|
logging.basicConfig(format='%(message)s') |
|
log = logging.getLogger(__name__) |
|
|
|
|
|
def open_remote_device(args, file='/dev/input/event0'): |
|
""" |
|
Open a remote input device via SSH. |
|
|
|
Args: |
|
args: argparse arguments |
|
file (str): path to the input device on the device |
|
Returns: |
|
(paramiko.ChannelFile): read-only stream of input events |
|
""" |
|
log.info("Connecting to input '{}' on '{}'".format(file, args.address)) |
|
|
|
if args.key is not None: |
|
password = None |
|
try: |
|
pkey = paramiko.RSAKey.from_private_key_file(os.path.expanduser(args.key)) |
|
except paramiko.ssh_exception.PasswordRequiredException: |
|
passphrase = getpass( |
|
"Enter passphrase for key '{}': ".format(os.path.expanduser(args.key)) |
|
) |
|
pkey = paramiko.RSAKey.from_private_key_file( |
|
os.path.expanduser(args.key), |
|
password=passphrase |
|
) |
|
elif args.password: |
|
password = args.password |
|
pkey = None |
|
else: |
|
password = getpass( |
|
"Password for '{}': ".format(args.address) |
|
) |
|
pkey = None |
|
|
|
client = paramiko.SSHClient() |
|
client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) |
|
client.connect( |
|
args.address, |
|
username='root', |
|
password=password, |
|
pkey=pkey, |
|
look_for_keys=False |
|
) |
|
|
|
# Start reading events |
|
_, stdout, _ = client.exec_command('cat ' + file) |
|
|
|
return stdout |
|
|
|
|
|
def main(): |
|
try: |
|
parser = argparse.ArgumentParser(description="use reMarkable tablet as a mouse input") |
|
parser.add_argument('--debug', action='store_true', default=False, help="enable debug messages") |
|
parser.add_argument('--key', type=str, metavar='PATH', help="ssh private key") |
|
parser.add_argument('--password', default=None, type=str, help="ssh password") |
|
parser.add_argument('--address', default='10.11.99.1', type=str, help="device address") |
|
parser.add_argument('--orientation', default='left', choices=['vertical', 'left', 'right']) |
|
parser.add_argument('--monitor', default=0, type=int, metavar='NUM', help="monitor to use") |
|
parser.add_argument('--threshold', default=1000, type=int, help="stylus pressure threshold (default 1000)") |
|
parser.add_argument('--evdev', action='store_true', default=False, help="use evdev to support pen tilt (requires root, no OSX support)") |
|
|
|
args = parser.parse_args() |
|
|
|
remote_device = open_remote_device(args) |
|
|
|
if args.debug: |
|
logging.getLogger('').setLevel(logging.DEBUG) |
|
log.setLevel(logging.DEBUG) |
|
log.info('Debugging enabled...') |
|
else: |
|
log.setLevel(logging.INFO) |
|
|
|
if args.evdev: |
|
from remarkable_mouse.evdev import create_local_device, pipe_device |
|
|
|
try: |
|
local_device = create_local_device() |
|
log.info("Created virtual input device '{}'".format(local_device.devnode)) |
|
except PermissionError: |
|
log.error('Insufficient permissions for creating a virtual input device') |
|
log.error('Make sure you run this program as root') |
|
sys.exit(1) |
|
|
|
pipe_device(args, remote_device, local_device) |
|
|
|
else: |
|
from remarkable_mouse.pynput import read_tablet |
|
read_tablet(args, remote_device) |
|
|
|
except KeyboardInterrupt: |
|
pass |
|
except EOFError: |
|
pass |
|
|
|
if __name__ == '__main__': |
|
main()
|
|
|