From a6c74c1c04eaf6565f1ec4ffd3aac9e5187a27d2 Mon Sep 17 00:00:00 2001 From: Pinapelz Date: Thu, 22 May 2025 17:58:07 -0700 Subject: add configurable sensor sensitivity --- chuni-hands-evolved.py | 25 +++++++++++++++++-------- requirements.txt | Bin 0 -> 168 bytes 2 files changed, 17 insertions(+), 8 deletions(-) create mode 100644 requirements.txt diff --git a/chuni-hands-evolved.py b/chuni-hands-evolved.py index 3bce15c..9a6fee3 100644 --- a/chuni-hands-evolved.py +++ b/chuni-hands-evolved.py @@ -65,7 +65,7 @@ def calculate_preview_size(width, height, max_height=720): return new_width, new_height def setup_gui(camera_width: int, camera_height: int, preview_width: int, preview_height: int) -> tk.Tk: - global current_camera_index, x_slider, y_slider, spacing_slider, keystrokes_enabled, chuniio_enabled, update_rate, video_canvas + global current_camera_index, x_slider, y_slider, spacing_slider, sensitivity_var, keystrokes_enabled, chuniio_enabled, update_rate, video_canvas root = tk.Tk() root.title("chuni-hands-evolved") @@ -175,6 +175,14 @@ def setup_gui(camera_width: int, camera_height: int, preview_width: int, preview pass width_spinbox.config(command=update_width) + # Sensitivity control + sensitivity_frame = tk.Frame(inputs_frame, bg=style["frame_bg"]) + sensitivity_frame.pack(fill="x", pady=(0, 5)) + tk.Label(sensitivity_frame, text="Sensitivity:", font=style["label_font"], bg=style["frame_bg"], width=15).pack(side="left") + sensitivity_var = StringVar(value="20") # Default sensitivity value + sensitivity_spinbox = tk.Spinbox(sensitivity_frame, from_=1, to=100, textvariable=sensitivity_var, width=5) + sensitivity_spinbox.pack(side="left", padx=5) + # Buttons buttons_frame = tk.Frame(main_container, bg=style["frame_bg"], relief="ridge", bd=2, padx=10, pady=10) buttons_frame.pack(fill="x") @@ -242,7 +250,7 @@ def setup_gui(camera_width: int, camera_height: int, preview_width: int, preview video_canvas.configure(width=canvas_width, height=canvas_height) root.bind("", on_window_resize) - return (root, video_canvas, x_slider, y_slider, width_var, spacing_slider, + return (root, video_canvas, x_slider, y_slider, width_var, spacing_slider, sensitivity_var, keystrokes_enabled, chuniio_enabled, update_rate) def calibrate(frame): @@ -261,14 +269,15 @@ def camera_loop(preview_width, preview_height, chuniio_shared_memory): print("Error: Could not capture frame.") continue frame = cv2.flip(frame, 1) - # Get offsets and spacing from the UI controls (assumed to be safe for reading) + # Get offsets, spacing, and sensitivity from the UI controls try: x_offset = int(x_slider.get()) y_offset = int(y_slider.get()) spacing = int(spacing_slider.get()) + sensitivity = int(sensitivity_var.get()) except Exception: - x_offset, y_offset, spacing = 0, 0, 100 - + x_offset, y_offset, spacing, sensitivity = 0, 0, 100, 20 + # Update zone positions for i, zone in enumerate(zones): zone["x"] = base_positions[i]["x"] + x_offset @@ -277,7 +286,7 @@ def camera_loop(preview_width, preview_height, chuniio_shared_memory): # Process zones for i, zone in enumerate(zones): current_brightness = get_avg_brightness(frame, zone) - if abs(current_brightness - zone_color_state[i]) > 20: + if abs(current_brightness - zone_color_state[i]) > sensitivity: # Use sensitivity value if not ZONE_TRIGGERED_STATE[i]: if keystrokes_enabled.get(): print(f"Key '{_UMIGIRI_32_AIRZONE_LAYOUT[i]}' pressed.") @@ -345,7 +354,7 @@ def load_config() -> dict: return {} def main(): - global root, current_camera_index, cap, video_canvas, x_slider, y_slider, width_var, spacing_slider, keystrokes_enabled, chuniio_enabled, update_rate, CAMERA_WIDTH, CAMERA_HEIGHT, latest_frame, running + global root, current_camera_index, cap, video_canvas, x_slider, y_slider, width_var, spacing_slider, sensitivity_var, keystrokes_enabled, chuniio_enabled, update_rate, CAMERA_WIDTH, CAMERA_HEIGHT, latest_frame, running print("Now starting up... please wait a bit...") config = load_config() current_camera_index = config.get("camera_index", 0) @@ -370,7 +379,7 @@ def main(): else: print("Error: Could not capture initial frame. Check your camera.") - (root, video_canvas, x_slider, y_slider, width_var, spacing_slider, + (root, video_canvas, x_slider, y_slider, width_var, spacing_slider, sensitivity_var, keystrokes_enabled, chuniio_enabled, update_rate) = setup_gui(CAMERA_WIDTH, CAMERA_HEIGHT, preview_width, preview_height) x_slider.set(config.get("x_offset", 0)) diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..c65763c Binary files /dev/null and b/requirements.txt differ -- cgit v1.2.3