Saját program, a Lamy toll radírként való használatára ReMarkable 2 tableten

Írtam egy programot a ReMarkable 2 tabletre, ami segít, hogy tudjak radírozni a Lamy tollal.

Azzal kezdeném, hogy mindenki csak saját felelősségre mókoljon a tabletjén, én ezért semmi felelősséget nem vállalok!

 

Ha ezzel megvolnánk, csapjunk a lecsóba!

 

Kezdjük az evtest-el. (Opcionális) Ez egy igen hasznos program, ha tesztelni akarjuk a ReMarakble 2 tablet beviteli perifériáit.

Ezt a programot arra használtam, hogy kiderítsem, milyen kódok aktiválódnak, ha megnyomom a radírt a kijelzőn, vagy ha megnyomom a Lamy toll gombját.

 

A a program fordítása az alábbi parancsokkal történik:

:~$ . /usr/local/oecore-x86_64/environment-setup-cortexa9hf-neon-oe-linux-gnueabi

:~$ git clone https://github.com/freedesktop-unofficial-mirror/evtest

:~$ cd evtest/

:~$ mkdir install

:~$ ./autogen.sh

:~$ ./configure --host=arm-linux-gnueabihf --prefix=/home/honka/evtest/install/

:~$ make

:~$ make install

 

Az alábbi kódokat kapom, ha megnyomom a gombot a Lamy tollon:

Event: time 1609969722.549022, type 1 (EV_KEY), code 330 (BTN_TOUCH), value 0
Event: time 1609969722.549022, type 1 (EV_KEY), code 320 (BTN_TOOL_PEN), value 0
Event: time 1609969722.556726, type 1 (EV_KEY), code 330 (BTN_TOUCH), value 1
Event: time 1609969722.556726, type 1 (EV_KEY), code 320 (BTN_TOOL_PEN), value 1

 

Az alábbi kódokat kapom, ha megnyomom a radírt a gyári ceruzán:

Event: time 1609961808.064054, type 1 (EV_KEY), code 321 (BTN_TOOL_RUBBER), value 1
Event: time 1609961808.331988, type 1 (EV_KEY), code 330 (BTN_TOUCH), value 1
Event: time 1609961811.365356, type 1 (EV_KEY), code 330 (BTN_TOUCH), value 0
Event: time 1609961811.413110, type 1 (EV_KEY), code 321 (BTN_TOOL_RUBBER), value 0

 

Az ötletem annyi volt, ha megnyomom a gombot a Lamy tollon, akkor szimuláljon egy radír gombnyomást a harveren.

Ez azért nem volt annyira egyszerű és pláne nem volt zökkenőmentes.. Próbálkoztam BASH scriptel is, de végül a saját kód megírása, plusz egy külső tool bevetése bizonyult a legjobb döntésnek.

 

Kezdjük a tool-al, ami nem más, mint az evemu. Ez a program arra szolgál, hogy gombnyomást vagy bármi mást szimuláljon a beviteli interfészen. Vagyis pont kapóra jött nekem. :)

 

Az evemu fordítása az alábbi parancsokkal történik:

:~$ . /usr/local/oecore-x86_64/environment-setup-cortexa9hf-neon-oe-linux-gnueabi

:~$ git clone https://github.com/freedesktop/evemu

:~$ cd evemu/

:~$ ./autogen.sh

:~$ mkdir install

:~$ ./configure --host=arm-linux-gnueabihf --prefix=/home/honka/evemu/install/

:~$ make

:~$ make install

 

Végül pedig írtam egy C programot (a mintát innen vettem) ami arra szolgál, hogy figyelje a hardvert, és amennyiben megtörténik a gombnyomás a Lamy tollon, akkor szimuláljon egy Radír gomb nyomást is!

 

A program kódja az alábbi:

#include <stdio.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <linux/input.h>
#include <string.h>
#include <stdbool.h>
#include <stdlib.h>

#define EVDEV "/dev/input/event1"

int main(int argc, char **argv) {
    unsigned char key_states[KEY_MAX/8 + 1];
    struct input_event evt, evt_w;
    int fd;
    bool flag0t = false;
    bool flag0b = false;

    bool flag1t = false;
    bool flag1b = false;
    char comm[] = "evemu-event ";

    const char comm1[] = " --type EV_KEY --code BTN_TOOL_RUBBER --value 1 --sync";
    const char comm2[] = " --type EV_KEY --code BTN_TOUCH --value 1 --sync";
    const char comm3[] = " --type EV_KEY --code BTN_TOUCH --value 0 --sync";
    const char comm4[] = " --type EV_KEY --code BTN_TOOL_RUBBER --value 0 --sync";
    
    char *res = malloc(strlen(comm) + strlen(EVDEV) + 1);
    char *res1 = malloc(strlen(comm) + strlen(EVDEV) + strlen(comm1) + 1);
    char *res2 = malloc(strlen(comm) + strlen(EVDEV) + strlen(comm2) + 1);
    char *res3 = malloc(strlen(comm) + strlen(EVDEV) + strlen(comm3) + 1);
    char *res4 = malloc(strlen(comm) + strlen(EVDEV) + strlen(comm4) + 1);

    strcpy(stpcpy(res, comm), EVDEV);
    strcpy(stpcpy(res1, res), comm1);
    strcpy(stpcpy(res2, res), comm2);
    strcpy(stpcpy(res3, res), comm3);
    strcpy(stpcpy(res4, res), comm4);

    memset(key_states, 0, sizeof(key_states));
    fd = open(EVDEV, O_RDWR);
    ioctl(fd, EVIOCGKEY(sizeof(key_states)), key_states);

    // Create some inconsistency
    //printf("Type (lots) now to make evdev drop events from the queue\n");
    //sleep(5);
    //printf("\n");

    while(read(fd, &evt, sizeof(struct input_event)) > 0) {
        if(evt.type == EV_SYN && evt.code == SYN_DROPPED) {
            printf("Received SYN_DROPPED. Restart.\n");
            fsync(fd);
            ioctl(fd, EVIOCGKEY(sizeof(key_states)), key_states);
        }
	else if (evt.type == EV_KEY && (evt.code == BTN_TOUCH || evt.code == BTN_TOOL_PEN)){
        	if((evt.code == BTN_TOUCH && !flag0t) && evt.value == 0) {
			flag0t = true;
		}
		else if(flag0t && ((evt.code == BTN_TOOL_PEN && !flag0b) && evt.value == 0)) {
			flag0b = true;
		}
		else if(flag0t && flag0b && ((evt.code == BTN_TOUCH && !flag1t) && evt.value == 1)) {
			flag1t = true;
		}
		else if(flag0t && flag0b && flag1t && ((evt.code == BTN_TOOL_PEN && !flag1b) && evt.value == 1)) {
			printf("Rubber On\n");
			system(res1);
			system(res2);
			system(res3);
			system(res4);
			flag0t = false;
			flag0b = false;
			flag1t = false;
			flag1b = false;
		}
		else {
                	flag0t = false;
                	flag0b = false;
                	flag1t = false;
                	flag1b = false;
		}
	}
    }
}

 

A programot így tudjuk fordítani (egyszerű mit a faék):

:~$ . /usr/local/oecore-x86_64/environment-setup-cortexa9hf-neon-oe-linux-gnueabi

:~$ vim program.c

:~$  $CC program.c

 

Ezzel gyakorlatilag kész is vagyunk!

 

A programot ha futtatjuk és megnyomjuk a Lamy tollon a gombot az alábbi kimenetet kapjuk (természetesen a radír funkció aktiválódása mellett):

reMarkable: ~/ rubber_check 
Rubber On
Received SYN_DROPPED. Restart.
Rubber On
Received SYN_DROPPED. Restart.
Rubber On
Received SYN_DROPPED. Restart.

 

Pár apró megjegyzés:

  • A fordított programok binárisait (az enyémet rubber_check-nek neveztem el), tegyük valamelyik bin vagy sbin könyvtárba! (Vagyis olyan helyre ahova  a $PATH változó be van állítva.)
  • A programom a fejlesztő környezetben az a.out nevet kapta, ez már futtatható a ReMarkable tableten.
  • A program még nem tökéletes, de lehet fogom még finomítani a jövőben. (Vagy ha valaki kedvet érez hozzá, nyugodtan! :) )
  • Lehet csinálok a programomhoz egy git repót és egy install scriptet, hogy olyan is telepíteni tudja aki nincs megálda IT vénával.