[Megoldva] Lamy toll gomb, radírként való használata ReMarkable 2 tableten

Fórumok

Sziasztok!

 

Adott egy ReMarkable tablet és egy Lamy toll. A tablethez jár egy ceruza amin van egy radírként funkcionáló gomb. Eddig minden szép és jó, viszont a Lamy tollon is van egy gomb, amit hiába nyomkodok, mivel más event kódja van mint a radír gombnak.

Ezért úgy döntöttem, írok valami trigger szerű programot, ami ha megnyomom a Lamy tollon a gombot, küld egy virtuális gombnyomást a radír kódjával.

 

A gond csak annyi, hogy én nem vagyok profi programozó és sikerült betévedni abba a bizonyos erdőbe... Vagyis a program nem igazán akar működni.

Örülnék ha valaki meg tudná mondani, hogy legalább jó úton járok e? Vagy, hogy mi a megoldás, remélem valami faék egyszerű.. 

A példa amiből dolgoztam itt található.

#include <stdio.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <linux/input.h>
#include <string.h>
#include <stdbool.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 flag = false;
    
    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_TOOL_PEN) {
            // Ignore repetitions
            if(evt.value == 1) continue;

	    
            key_states[evt.code / 8] ^= 1 << (evt.code % 8);
            if((key_states[evt.code / 8] >> (evt.code % 8)) & 1 != evt.value) {
                printf("Inconsistency detected: Keycode %d is reported as %d, but %d is stored\n", evt.code, evt.value,
                        (key_states[evt.code / 8] >> (evt.code % 8)) & 1);
            	flag = ! flag;
		evt_w = evt;
		evt_w.code = BTN_TOOL_RUBBER;
		if (flag) {
			evt_w.value  = 1;
		}
		else {
			evt_w.value  = 0;
		}
		write(fd, evt_w, sizeof(struct input_event));
	    }
        }
    }
}

 

UI.: Tudom létezik erre ReMarkable hack, de az nekem valamiért nem működik..

UI2.: Próbáltam, kicserélni a gombok kiosztását is, de természetesen az sem megy... link

 

 

Sikerült megcsinálni! Később megírom részlettesen egy blogbejegyzésben és belinkelem ide.

Szerk: Az ígért link.

Hozzászólások

Nem kéne figyelned arra is, hogy up/down -e az esemény? Vagy az a bitmágia arra lenne való?
Pl ilyesmire gondoltam

if( event.value == EV_DOWN ) ...

Egyszerűsítettem a kódon.. A bitmágiát kivettem, mert azt én sem értem mire jó..

#include <stdio.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <linux/input.h>
#include <string.h>
#include <stdbool.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 flag = false;

    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_TOOL_PEN && evt.value == 1) {
                printf("Mukodik");
                evt.code = BTN_TOOL_RUBBER;
                write(fd, &evt, sizeof(struct input_event));
        }
        printf("0");
    }
}

 

Nem radíroz, de kiírja a konzolra, hogy "Mukodik", meg a rengeteg nullákat.

Viszont ha kiveszem a printf(0) parancsot, akkor a "Mukodik" szöveget sem írja ki..

Szerk.: Pont a kérdésedre nem válaszoltam.. Azt hogy le van nyomva a gomb az evt.value == 1-el ellenőrzöm.