From 4efc3a4893efc9796b391cdea49b1a01bc30780a Mon Sep 17 00:00:00 2001 From: dbarzin Date: Thu, 23 Mar 2023 14:14:48 +0100 Subject: [PATCH] fix mouse or enter --- ROADMAP.md | 9 +++-- pandora-box.py | 73 ++++++++++++++++++++++++++++--------- tests/mouse-click-or-key.py | 21 +++++------ 3 files changed, 71 insertions(+), 32 deletions(-) diff --git a/ROADMAP.md b/ROADMAP.md index 60d5d0b..77de291 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -5,17 +5,18 @@ User interface - [x] Animations during scan - [ ] Internationalisation +- [ ] Change display from text mode to graphic mode with function key Technical -- [x] Multi threading -- [ ] ~~Deployment on Raspberry Pi~~ (too slow) - [x] logrotate on pandora-box.log - [x] place logs in /var/logs +- [x] Multi threading +- [ ] ~~Deployment on Raspberry Pi~~ (too slow) - [x] update procedure -- [ ] Docker script for github continuous integration - [x] Improve logs during scan +- [ ] Docker script for github continuous integration Known issues -- [ ] mouse click not detcted in console mode on Ubuntu (see: tests/screen.py) +- [x] mouse click not detcted in console mode on Ubuntu (see: tests/screen.py) diff --git a/pandora-box.py b/pandora-box.py index 93babfd..2ea8196 100755 --- a/pandora-box.py +++ b/pandora-box.py @@ -242,19 +242,6 @@ def display_image(status): os.system(f"fim -qa {image} /dev/null >/dev/null &") -# ----------------------------------------------------------- - -def wait_mouse_click(): - """ Wait for mouse click event """ - with open("/dev/input/mice", "rb") as mouse: - down = False - while True: - buf = mouse.read(3) - if (buf[0] & 0x1) == 1: - down = True - if ((buf[0] & 0x1) == 0) and down: - break - # ----------------------------------------------------------- # has_curses Screen # ----------------------------------------------------------- @@ -695,6 +682,59 @@ def error(): display_image("ERROR") return "WAIT" +# ----------------------------------------------------------- +# Wait for mouse click or enter +# ----------------------------------------------------------- + + +mouseEvent = threading.Event() +enterEvent = threading.Event() +mouseOrEnterCondition = threading.Condition() + + +def mouseClickThread(): + mouse = open("/dev/input/mice", "rb") + os.set_blocking(mouse.fileno(), False) + + down = False + while not enterEvent.is_set(): + buf = mouse.read(3) + if not (buf is None): + if ((buf[0] & 0x1) == 1): + down = True + if (((buf[0] & 0x1) == 0) and down): + break + time.sleep(0.1) + mouse.close() + + mouseEvent.set() + with mouseOrEnterCondition: + mouseOrEnterCondition.notify() + + +def enterKeyThread(): + os.set_blocking(sys.stdin.fileno(), False) + + while not mouseEvent.is_set(): + input = sys.stdin.readline() + if (len(input) > 0): + break + time.sleep(0.1) + + enterEvent.set() + with mouseOrEnterCondition: + mouseOrEnterCondition.notify() + + +def waitMouseOrEnter(): + with mouseOrEnterCondition: + threading.Thread(target=mouseClickThread, args=()).start() + threading.Thread(target=enterKeyThread, args=()).start() + + mouseEvent.clear() + enterEvent.clear() + while not (mouseEvent.is_set() or enterEvent.is_set()): + mouseOrEnterCondition.wait() # -------------------------------------- @@ -709,7 +749,6 @@ def clean(): if not has_curses: display_image("BAD") - wait_mouse_click() else: # print list of files cnt = 0 @@ -721,7 +760,8 @@ def clean(): break # wait for clean log('PRESS KEY TO CLEAN', flush=True) - wait_mouse_click() + + waitMouseOrEnter() # TODO: check device is still present @@ -793,8 +833,7 @@ def startup(): logo = file1.readlines() # Print logo screen print_screen() - # First unmount remaining device - umount_device() + return "WAIT" diff --git a/tests/mouse-click-or-key.py b/tests/mouse-click-or-key.py index 365333e..e334733 100755 --- a/tests/mouse-click-or-key.py +++ b/tests/mouse-click-or-key.py @@ -3,12 +3,11 @@ import os import sys import time +import threading -from threading import Thread, Event, Condition - -mouseEvent = Event() -enterEvent = Event() -mouseOrEnterCondition = Condition() +mouseEvent = threading.Event() +enterEvent = threading.Event() +mouseOrEnterCondition = threading.Condition() def mouseClickThread(): @@ -23,7 +22,7 @@ def mouseClickThread(): down = True if (((buf[0] & 0x1) == 0) and down): break - time.sleep(0.5) + time.sleep(0.1) mouse.close() mouseEvent.set() @@ -38,7 +37,7 @@ def enterKeyThread(): input = sys.stdin.readline() if (len(input) > 0): break - time.sleep(0.5) + time.sleep(0.1) enterEvent.set() with mouseOrEnterCondition: @@ -46,17 +45,17 @@ def enterKeyThread(): def waitMouseOrEnter(): - print("Wait mouse click or enter") with mouseOrEnterCondition: - Thread(target=mouseClickThread, args=()).start() - Thread(target=enterKeyThread, args=()).start() + threading.Thread(target=mouseClickThread, args=()).start() + threading.Thread(target=enterKeyThread, args=()).start() mouseEvent.clear() enterEvent.clear() while not (mouseEvent.is_set() or enterEvent.is_set()): mouseOrEnterCondition.wait() - print("Done.") +print("Wait mouse click or enter") waitMouseOrEnter() +print("Done.")