from evdev import InputDevice, categorize, ecodes
def ky(num):
keys = {
71: "7",
72: "8",
73: "9",
75: "4",
76: "5",
77: "6",
79: "1",
80: "2",
81: "3",
82: "0",
96: "enter"
}
return keys.get(num)
device = InputDevice("/dev/input/by-path/platform-fd500000.pcie-pci-0000:01:00.0-usb-0:1.1:1.0-event-kbd") # my keyboard
for event in device.read_loop():
if event.type == ecodes.EV_KEY:
if (event.value == 1):
print(ky(event.code))
all you need is to find right path for your InputDevice
After some time of googling, i found interesting solution, how to get and set pins as bits in arduino
union myunion {
struct {
unsigned int b7: 1;
unsigned int b6: 1;
unsigned int b5: 1;
unsigned int b4: 1;
unsigned int b3: 1;
unsigned int b2: 1;
unsigned int b1: 1;
unsigned int b0: 1;
};
unsigned int num;
} mu;
with this union with struct, we can read pins to 1 big number invidual bits and display it on for example - led's in binary.
mu.b0 = digitalRead(2);
mu.b1 = digitalRead(3);
mu.b2 = digitalRead(4);
mu.b3 = digitalRead(5);
mu.b4 = digitalRead(6);
mu.b5 = digitalRead(7);
mu.b6 = digitalRead(8);
mu.b7 = digitalRead(9);
and vuola, now we can get number with "mu.num" depending on HIGH pins
Serial.println(mu.num);
and in reverse, we can set "mu.num = 127" and write individual bits to pins.
digitalWrite(mu.b0);
digitalWrite(mu.b1);
digitalWrite(mu.b2);
digitalWrite(mu.b3);
digitalWrite(mu.b4);
digitalWrite(mu.b5);
digitalWrite(mu.b6);
digitalWrite(mu.b7);
whole program:
// parallel to serial
// serial to parallel
union mu1 {
struct {
unsigned int b7: 1;
unsigned int b6: 1;
unsigned int b5: 1;
unsigned int b4: 1;
unsigned int b3: 1;
unsigned int b2: 1;
unsigned int b1: 1;
unsigned int b0: 1;
};
unsigned int num;
} mu;
void setup() {
Serial.begin(9600);
}
void loop() {
mu.b0 = digitalRead(2); // switch 1
mu.b1 = digitalRead(3); // switch 2
mu.b2 = digitalRead(4); // switch 3
mu.b3 = digitalRead(5); // switch 4
mu.b4 = digitalRead(6); // switch 5
mu.b5 = digitalRead(7); // switch 6
mu.b6 = digitalRead(8); // switch 7
mu.b7 = digitalRead(9); // switch 8
Serial.println(mu.num);
delay(5000);
}
thats it. union acts as "shift in" and "shift out" register, if you set mu.num than you can read individual bits(pins) if you set pins you can read mu.num and it works then like shift in register.
You can send command without any libraries to arduino. in this example "message" ( protocol) is "2 chars + number + number" -> "GO 123 -512"
void setup() {
Serial.begin(9600);
}
void loop() {
// check if something on Serial
if(Serial.available()) {
// define variables
long number1, number2;
char cmd[2];
memset(cmd, 0, 2);
// read data from Serial
String s = Serial.readStringUntil('\n');
char buff[64];
memset(buff, 0, 64);
// convert string to char array
s.toCharArray(buff, 64);
// parse cmd to variables
sscanf(buff, "%2c %ld %ld",cmd, &number1, &number2);
char pr[128];
memset(pr, 0, 128);
// print template to buffer
sprintf(pr, "got 2 numbers from serial: %ld and %ld and command %s", number1, number2, cmd);
// print buffer back to Serial
Serial.println(pr);
}
}
https://pyinfra.com/ - manage your infrastructure like a pro
package main
import (
"sync"
"time"
)
var mu = sync.Mutex{}
var sc = sync.NewCond(&mu)
var setME string
func main() {
go func() {
for {
}
}()
// start 10 gourintines
for i := 0; i < 10; i++ {
go func(i int) {
println("go routine started")
sc.L.Lock()
sc.Wait()
println(setME, "release", i)
sc.L.Unlock()
}(i)
}
time.Sleep(1 * time.Second)
// set variable and
// signal sync.cond to release 3 random locks
// from waiting go routines
for i := 0; i < 3; i++ {
sc.L.Lock()
setME = "test signal"
sc.Signal()
sc.L.Unlock()
}
time.Sleep(2 * time.Second)
// release all waiting go routines to use global variable
sc.L.Lock()
setME = "test broadcast"
sc.Broadcast()
sc.L.Unlock()
time.Sleep(3 * time.Second)
}