From 83605b57a7cc18cd139e84e998b86e0f35a37767 Mon Sep 17 00:00:00 2001 From: gsd Date: Sun, 16 Nov 2025 14:58:12 +0300 Subject: [PATCH] async serialIO --- .DS_Store | Bin 0 -> 6148 bytes pipboyIO/config.sh => config.sh | 0 pipboyIO/pipboy-setup.sh => pipboy-setup.sh | 0 pipboyIO/.DS_Store | Bin 0 -> 6148 bytes pipboyIO/legacy/run.sh | 3 + pipboyIO/{ => legacy}/serialTest.py | 12 +- pipboyIO/{ => legacy}/serialX.py | 0 pipboyIO/next/requirements.txt | 1 + pipboyIO/next/serialAX.py | 150 ++++++++++++++++++++ pipboyIO/run.sh | 3 - {pipboyIO => pipboyUI}/pipboyUI.sh | 0 11 files changed, 163 insertions(+), 6 deletions(-) create mode 100644 .DS_Store rename pipboyIO/config.sh => config.sh (100%) rename pipboyIO/pipboy-setup.sh => pipboy-setup.sh (100%) create mode 100644 pipboyIO/.DS_Store create mode 100755 pipboyIO/legacy/run.sh rename pipboyIO/{ => legacy}/serialTest.py (83%) rename pipboyIO/{ => legacy}/serialX.py (100%) create mode 100644 pipboyIO/next/requirements.txt create mode 100644 pipboyIO/next/serialAX.py delete mode 100755 pipboyIO/run.sh rename {pipboyIO => pipboyUI}/pipboyUI.sh (100%) diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..2363b1f825e86d93d9c58e5e4267864ccb34b787 GIT binary patch literal 6148 zcmeHK%}T>S5Z<-bBorYBg&qT53#L^M#Y>3w;7Kr|2bG$TqQRIgO=^)+$XQ>=C-Hfl z+1-GpId~GWGcfzj?#%3FKFIzs#<)L?yNub4F%uM#qfsL`T_#`P4dEZKlw(Zxw&N+meDfqf=4k6im;gGemJ?o z-lY&}RM}y4m5gRXd*?)CMVMrxiA+f15ro`cCs{0JzL;ilE^`Cruq@LW+U@!L$aOo; z;X!xNapwIV+Wp>QVVS#o`^Oip2kw4+&ZAa>ofYBh$vv=TLRJ1=xHn! zf(L}FR6v!=^%H}ubQpJZoTsr=sL~miE5kf`r z{6B?XruLD)oI*WffEf5^4DjY482C_>K3iAH!?V@_y$40XxDpKzu$L|Y(7}DAEuG5m bpbc@J#!?~9g5xqBkS+p}5Ne2lUtr)1g!)W; literal 0 HcmV?d00001 diff --git a/pipboyIO/config.sh b/config.sh similarity index 100% rename from pipboyIO/config.sh rename to config.sh diff --git a/pipboyIO/pipboy-setup.sh b/pipboy-setup.sh similarity index 100% rename from pipboyIO/pipboy-setup.sh rename to pipboy-setup.sh diff --git a/pipboyIO/.DS_Store b/pipboyIO/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..1b47bf0563ba4de059446128b2a4fd951f258c1e GIT binary patch literal 6148 zcmeH~F>b>!3`IW^4*{}x?5L#&$PI)bIYBQ_H0~B8Lt3Dtj^0m-OP$PtQG5dA6Dbq6 z|6rK_Z2vv&fDyok?!>EynHlo|7kuIeU(@Y${$ccLbDoBkOER*rog)Aqo4mr`lI=O)}mAj zNP&N*fDMPY!=5jdXY1YTdHp@BzHW3fE@$}j6Trle;um@t_lqycnrxk{(DWk^GAKxa Hrz-FZu1*rf literal 0 HcmV?d00001 diff --git a/pipboyIO/legacy/run.sh b/pipboyIO/legacy/run.sh new file mode 100755 index 0000000..258f839 --- /dev/null +++ b/pipboyIO/legacy/run.sh @@ -0,0 +1,3 @@ +#!/bin/bash +cd /home/pipboy/Pipboy3Kmark4/pipboyIO/legacy +sudo -u pipboy python3 serialX.py \ No newline at end of file diff --git a/pipboyIO/serialTest.py b/pipboyIO/legacy/serialTest.py similarity index 83% rename from pipboyIO/serialTest.py rename to pipboyIO/legacy/serialTest.py index dd227d8..44e1697 100644 --- a/pipboyIO/serialTest.py +++ b/pipboyIO/legacy/serialTest.py @@ -27,14 +27,20 @@ class Pin: self.id = id self.value = initValue self.name = Const._[id] if id in Const._ else None + self.movement = MOVEMENT.NONE def updateValue(self, value): #(Pin.class, value, movement) if self.value == value: - return (self, 0, MOVEMENT.NONE) + self.value = 0 + self.movement = MOVEMENT.NONE + return (self, self.value, MOVEMENT.NONE) else: - movement = MOVEMENT.LEFT if value < self.value else MOVEMENT.RIGHT + self.movement = MOVEMENT.LEFT if value < self.value else MOVEMENT.RIGHT self.value = value - return (self, value, movement) + return (self, value, self.movement) + + def __call__(self): + return (self, self.value, self.movement) class SerialListener: ser: serial.Serial = None diff --git a/pipboyIO/serialX.py b/pipboyIO/legacy/serialX.py similarity index 100% rename from pipboyIO/serialX.py rename to pipboyIO/legacy/serialX.py diff --git a/pipboyIO/next/requirements.txt b/pipboyIO/next/requirements.txt new file mode 100644 index 0000000..c9a47a2 --- /dev/null +++ b/pipboyIO/next/requirements.txt @@ -0,0 +1 @@ +pyserial-asyncio \ No newline at end of file diff --git a/pipboyIO/next/serialAX.py b/pipboyIO/next/serialAX.py new file mode 100644 index 0000000..94569a7 --- /dev/null +++ b/pipboyIO/next/serialAX.py @@ -0,0 +1,150 @@ +import asyncio +import serial_asyncio +import os, subprocess +import argparse + +#5 - 101 - a d +#4 - xxx +#3 - 104 - 1 2 3 4 5 +#2 - 103 - hz +#1 - 102 - w s +#upButton = 1001 + +class MOVEMENT: + RIGHT = 1 + NONE = 0 + LEFT = -1 + +class Pin: + def __init__(self, id, initValue): + self.id = id + self.value = initValue + self.movement = MOVEMENT.NONE + + def updateValue(self, value): #(Pin.class, value, movement) + if self.value == value: + self.value = 0 + self.movement = MOVEMENT.NONE + return (self, self.value, MOVEMENT.NONE) + else: + self.movement = MOVEMENT.LEFT if value < self.value else MOVEMENT.RIGHT + self.value = value + return (self, value, self.movement) + + def __call__(self): + return (self, self.value, self.movement) + + +class ENTER: + def __init__(self): + self.pin = 1001 + self.enter = "xdotool key Return".split() + def __call__(self, data): + print(self.enter) + subprocess.Popen(self.enter) + +class AD: + def __init__(self): + self.pin = 101 + self.a = "xdotool key a".split() + self.d = "xdotool key d".split() + + def __call__(self, data): + if data[2] == MOVEMENT.LEFT: + print(self.a) + subprocess.Popen(self.a) + if data[2] == MOVEMENT.RIGHT: + print(self.d) + subprocess.Popen(self.d) + +class WS: + def __init__(self): + self.pin = 101 + self.w = "xdotool key w".split() + self.s = "xdotool key s".split() + + def __call__(self, data): + if data[2] == MOVEMENT.LEFT: + print(self.s) + subprocess.Popen(self.s) + if data[2] == MOVEMENT.RIGHT: + print(self.w) + subprocess.Popen(self.w) + +class MODE: + def __init__(self): + self.pin = 104 + self.min_key = 1 + self.max_key = 5 + self.current_key = 1 + + def __call__(self, data): + if data[2] == MOVEMENT.LEFT: + self.current_key -= 1 + if data[2] == MOVEMENT.RIGHT: + self.current_key += 1 + + if (self.current_key < self.min_key): + self.current_key = self.min_key + + if (self.current_key > self.max_key): + self.current_key = self.max_key + + cmd = f"xdotool key {self.current_key}".split() + print(cmd) + subprocess.Popen(cmd) + +class Listener(asyncio.Protocol): + binds = { + 101: AD(), + 104: MODE(), + 102: WS(), + 1001: ENTER() + } + + def __init__(self): + super().__init__() + self.buffer = b"" + self.store = {} + + def connection_made(self, transport): + self.transport = transport + print("Connected") + + def data_received(self, data): + self.buffer += data + lines = self.buffer.split(b'\n') + self.buffer = lines[-1] + + for line in lines[:-1]: + try: + pin, value = line.split("*") + pin = int(pin) + value = int(value) + + if pin not in self.store: + self.store[pin] = Pin(pin, value) + else: + self.store[pin].updateValue(value) + + self.useX(self.store[pin]()) + except: + print("Cannot parse") + + def useX(self, pin): + if pin[0].id in self.binds: + self.binds[pin[0]](pin) + +if __name__ == "__main__": + os.environ['DISPLAY'] = ':0' + + parser = argparse.ArgumentParser() + parser.add_argument("--serial", type=str, default="/dev/serial0") + parser.add_argument("--baudrate", type=int, default=9600) + args = parser.parse_args() + + loop = asyncio.get_event_loop() + coro = serial_asyncio.create_serial_connection(loop, Listener, args.serial, baudrate = args.baudrate) + transport, protocol = loop.run_until_complete(coro) + loop.run_forever() + loop.close() \ No newline at end of file diff --git a/pipboyIO/run.sh b/pipboyIO/run.sh deleted file mode 100755 index 24c789b..0000000 --- a/pipboyIO/run.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash -cd /home/pipboy/Pipboy3Kmark4/pipboyIO -sudo -u pipboy python3 serialX.py \ No newline at end of file diff --git a/pipboyIO/pipboyUI.sh b/pipboyUI/pipboyUI.sh similarity index 100% rename from pipboyIO/pipboyUI.sh rename to pipboyUI/pipboyUI.sh