Skip to content

Commit

Permalink
Merge pull request OpenInterpreter#236 from Abdullah-Gohar/main
Browse files Browse the repository at this point in the history
Fixed the ctrl-c bug, Fixes OpenInterpreter#231
  • Loading branch information
KillianLucas authored May 4, 2024
2 parents f1b9d7f + 325fcea commit b3e1655
Show file tree
Hide file tree
Showing 3 changed files with 45 additions and 8 deletions.
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 @@ -127,13 +127,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

0 comments on commit b3e1655

Please sign in to comment.