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.
- 229 megtekintés
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 ) ...
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
Az előző kódban akkor volt egy bug:
& 1 != evt.value
volt
&& 1 != evt.value
helyett
- A hozzászóláshoz be kell jelentkezni