Skip to content

Fixed the ctrl-c bug, Fixes #231 #236

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
May 4, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 34 additions & 7 deletions software/source/clients/base_device.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
load_dotenv() # take environment variables from .env.

import os
import sys
import asyncio
import threading
import pyaudio
Expand Down Expand Up @@ -58,7 +59,16 @@

# Specify OS
current_platform = get_system_info()
is_win10 = lambda: platform.system() == "Windows" and "10" in platform.version()

def is_win11():
return sys.getwindowsversion().build >= 22000

def is_win10():
try:
return platform.system() == "Windows" and "10" in platform.version() and not is_win11()
except:
return False


# Initialize PyAudio
p = pyaudio.PyAudio()
Expand All @@ -72,6 +82,7 @@ def __init__(self):
self.captured_images = []
self.audiosegments = []
self.server_url = ""
self.ctrl_pressed = False

def fetch_image_from_camera(self, camera_index=CAMERA_DEVICE_INDEX):
"""Captures an image from the specified camera device and saves it to a temporary file. Adds the image to the captured_images list."""
Expand Down Expand Up @@ -256,23 +267,39 @@ def toggle_recording(self, state):
def on_press(self, key):
"""Detect spacebar press and Ctrl+C combination."""
self.pressed_keys.add(key) # Add the pressed key to the set


if keyboard.Key.space in self.pressed_keys:
self.toggle_recording(True)
elif {keyboard.Key.ctrl, keyboard.KeyCode.from_char("c")} <= self.pressed_keys:
elif {keyboard.Key.ctrl, keyboard.KeyCode.from_char('c')} <= self.pressed_keys:
logger.info("Ctrl+C pressed. Exiting...")
kill_process_tree()
os._exit(0)

# Windows alternative to the above
if key == keyboard.Key.ctrl_l:
self.ctrl_pressed = True

try:
if key.vk == 67 and self.ctrl_pressed:
logger.info("Ctrl+C pressed. Exiting...")
kill_process_tree()
os._exit(0)
# For non-character keys
except:
pass



def on_release(self, key):
"""Detect spacebar release and 'c' key press for camera, and handle key release."""
self.pressed_keys.discard(
key
) # Remove the released key from the key press tracking set
self.pressed_keys.discard(key) # Remove the released key from the key press tracking set

if key == keyboard.Key.ctrl_l:
self.ctrl_pressed = False
if key == keyboard.Key.space:
self.toggle_recording(False)
elif CAMERA_ENABLED and key == keyboard.KeyCode.from_char("c"):
elif CAMERA_ENABLED and key == keyboard.KeyCode.from_char('c'):
self.fetch_image_from_camera()

async def message_sender(self, websocket):
Expand Down Expand Up @@ -342,7 +369,7 @@ async def exec_ws_communication(websocket):
code = message["content"]
result = interpreter.computer.run(language, code)
send_queue.put(result)

if is_win10():
logger.info("Windows 10 detected")
# Workaround for Windows 10 not latching to the websocket server.
Expand Down
6 changes: 5 additions & 1 deletion software/source/server/utils/process_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,11 @@ def kill_process_tree():
pid = os.getpid() # Get the current process ID
try:
# Send SIGTERM to the entire process group to ensure all processes are targeted
os.killpg(os.getpgid(pid), signal.SIGKILL)
try:
os.killpg(os.getpgid(pid), signal.SIGKILL)
# Windows implementation
except AttributeError:
os.kill(pid, signal.SIGTERM)
parent = psutil.Process(pid)
children = parent.children(recursive=True)
for child in children:
Expand Down
6 changes: 6 additions & 0 deletions software/start.py
Original file line number Diff line number Diff line change
Expand Up @@ -122,13 +122,19 @@ def _run(
# llm_service = "llamafile"
stt_service = "local-whisper"
select_local_model()

system_type = platform.system()
if system_type == "Windows":
server_host = "localhost"

if not server_url:
server_url = f"{server_host}:{server_port}"

if not server and not client:
server = True
client = True



def handle_exit(signum, frame):
os._exit(0)
Expand Down