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.
- Honkydoo blogja
- A hozzászóláshoz be kell jelentkezni
- 171 megtekintés