From 94eca6fd1ba30633e6d0670e277fb7b0c04bc678 Mon Sep 17 00:00:00 2001 From: Jonne Date: Wed, 13 Mar 2024 18:30:25 +0200 Subject: [PATCH 01/10] Add 'reset_button_label' to messages dictionary --- src/labels.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/labels.py b/src/labels.py index c3afabc..586801c 100644 --- a/src/labels.py +++ b/src/labels.py @@ -37,6 +37,7 @@ def __init__(self): 'disconnected_from_server': 'Disconnected from server!', 'opening_camera': 'Opening camera...', 'draw_boxes_label': 'Draw boxes', + 'reset_button_label': 'Reset', } self.settings = self.mgr.load_or_create_settings(messages) From 5145dd47599884ca8090b4d3aeb6489e24fac765 Mon Sep 17 00:00:00 2001 From: Jonne Date: Wed, 13 Mar 2024 18:30:31 +0200 Subject: [PATCH 02/10] Refactor broadcast functions to handle client errors --- server.py | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/server.py b/server.py index 6359de1..dfd29d1 100644 --- a/server.py +++ b/server.py @@ -34,13 +34,22 @@ def broadcast(message): - for client in clients: - client.send(message) + for client in clients[:]: # Iterate over a copy of the list + try: + client.send(message) + except Exception as e: + print(f"Error broadcasting to client: {e}") + clients.remove(client) + client.close() # Ensure client socket is properly closed def broadcast_except(message, sender): for client in clients: if client != sender: - client.send(message) + try: + client.send(message) + except Exception as e: + print(f"Error broadcasting to client: {e}") + clients.remove(client) def handle_client(client): while True: From fa6ef67af0f2ce68428cb0757317369b6efc1f50 Mon Sep 17 00:00:00 2001 From: Jonne Date: Wed, 13 Mar 2024 18:30:40 +0200 Subject: [PATCH 03/10] Refactor GUI buttons and add reset functionality --- gui.py | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/gui.py b/gui.py index cc7ef16..1717caf 100644 --- a/gui.py +++ b/gui.py @@ -85,7 +85,7 @@ def create_gui(self): self.console_box.grid(row=0, column=5, columnspan=4, padx=10, pady=10, sticky="w") self.console_box.config(state="disabled") - self.draw_boxes_checkbox = tk.Checkbutton(self.gui_frame, text=f"{self.labels.get('draw_boxes_label')}") + #self.draw_boxes_checkbox = tk.Checkbutton(self.gui_frame, text=f"{self.labels.get('draw_boxes_label')}") #TODO: Add functionality to toggle drawing detection boxes # Buttons @@ -95,6 +95,7 @@ def create_gui(self): self.emergency_button = tk.Button(self.gui_frame, text=f"{self.labels.get('emergency_stop_label')}", command=self.emergency_stop) self.load_detection_model_button = tk.Button(self.gui_frame, text=f"{self.labels.get('load_model_label')}", command=self.load_detection_model) # self.load_cameras_button = tk.Button(self.gui_frame, text=f"{self.labels.get('load_cameras_label')}", command=self.update_webcam_list) + self.reset_button = tk.Button(self.gui_frame, text=f"{self.labels.get('reset_button_label')}", command=self.reset) self.connect_camera_button.grid(row=0, column=4, padx=10, pady=10, sticky="w") self.connect_camera_button.config(state="disabled") @@ -103,6 +104,7 @@ def create_gui(self): self.stop_button.grid(row=2, column=3, padx=10, pady=10, sticky="w") self.emergency_button.grid(row=3, column=3, columnspan=2, padx=10, pady=10, sticky="w") self.load_detection_model_button.grid(row=4, column=1, padx=10, pady=10, sticky="w") + self.reset_button.grid(row=4, column=2, padx=10, pady=10, sticky="w") @@ -165,12 +167,12 @@ def update_frame(self): self.console_box.see(tk.END) self.console_box.config(state="disabled") - if self.now + 1000 < int(round(time.time() * 1000)): + if self.now + 250 < int(round(time.time() * 1000)): self.now = int(round(time.time() * 1000)) if self.socketclient.is_connected() and self.state == State.RUNNING: if len(detected_objects) > 0: # self.socketclient.send_message(f"{self.class_names[cls]}: {confidence}") - self.socketclient.send_message(f"{detected_objects[0]}") + self.socketclient.send_message(f"{detected_objects[0]}\n") # Convert the annotated frame back to ImageTk format @@ -265,6 +267,15 @@ def stop(self): self.stop_button.config(state="disabled") self.emergency_button.config(state="normal") + def reset(self): + self.status_label.config(text=f"{self.labels.get('status_label')}: {State.IDLE.name}") + self.socketclient.send_message("Reset") + self.state = State.IDLE + + self.start_button.config(state="normal") + self.stop_button.config(state="disabled") + self.emergency_button.config(state="disabled") + def set_screen_blank(self): blank_image = Image.new('RGB', (640, 480), (0, 0, 0)) blank_photo = ImageTk.PhotoImage(blank_image) From 8ff25a1169c070ed3c816e9bd223c86c7fce3ff6 Mon Sep 17 00:00:00 2001 From: Jonne Date: Mon, 18 Mar 2024 05:11:45 +0200 Subject: [PATCH 04/10] Add titles to run_client.bat and run_server.bat --- run_client.bat | 1 + run_server.bat | 1 + 2 files changed, 2 insertions(+) diff --git a/run_client.bat b/run_client.bat index 149b721..de3cd92 100644 --- a/run_client.bat +++ b/run_client.bat @@ -1,4 +1,5 @@ @echo off +title Client call .\venv\Scripts\activate.bat "py" "client.py" pause \ No newline at end of file diff --git a/run_server.bat b/run_server.bat index 0a3e838..d069b1f 100644 --- a/run_server.bat +++ b/run_server.bat @@ -1,4 +1,5 @@ @echo off +title Server call .\venv\Scripts\activate.bat "py" "server.py" pause \ No newline at end of file From bdc657ba6f11e56f26d9a73028f775beea3bf690 Mon Sep 17 00:00:00 2001 From: Jonne Date: Mon, 18 Mar 2024 05:11:53 +0200 Subject: [PATCH 05/10] Update error message in receive function --- client.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client.py b/client.py index 6ed5976..0b55aa3 100644 --- a/client.py +++ b/client.py @@ -20,7 +20,7 @@ def receive(): message = client.recv(1024).decode('utf-8') print(message) except Exception as e: - print("An error occured!") + print(f"Error receiving message: {e}") client.close() break From 80d9fe3a7fb8fcd4842f4c4621a40e141a8d89f1 Mon Sep 17 00:00:00 2001 From: Jonne Date: Mon, 18 Mar 2024 05:12:01 +0200 Subject: [PATCH 06/10] Add newline to end of client message --- server.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/server.py b/server.py index dfd29d1..3b1d3d8 100644 --- a/server.py +++ b/server.py @@ -57,8 +57,9 @@ def handle_client(client): message = client.recv(1024) if not message: raise ConnectionError("Client disconnected") - + # add newline to the end of the message decoded_message = message.decode('utf-8') + decoded_message = decoded_message.strip() + '\n' broadcast(decoded_message.encode('utf-8')) print(f"Message from {client.getpeername()}: {decoded_message}") except ConnectionError: From 6cc4617e492a8b995d5cbee5dfa216e77f895c5d Mon Sep 17 00:00:00 2001 From: Jonne Date: Mon, 18 Mar 2024 05:12:08 +0200 Subject: [PATCH 07/10] Fix emergency stop message capitalization --- gui.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gui.py b/gui.py index 1717caf..063436d 100644 --- a/gui.py +++ b/gui.py @@ -243,7 +243,7 @@ def stop_camera(self): def emergency_stop(self): self.status_label.config(text=f"{self.labels.get('status_label')}: {State.EMERGENCY_STOPPED.name}") - self.socketclient.send_message("EMERGENCY") + self.socketclient.send_message("Emergency") self.state = State.EMERGENCY_STOPPED self.start_button.config(state="normal") From c47e078e3958f98619085a6aa4d6ec379d8a4b78 Mon Sep 17 00:00:00 2001 From: Jonne Date: Wed, 20 Mar 2024 06:02:27 +0200 Subject: [PATCH 08/10] Update .gitignore file to include tests and *.old files --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 71b3650..54fd399 100644 --- a/.gitignore +++ b/.gitignore @@ -3,4 +3,5 @@ venv *.pt *.yaml __pycache__ -tests \ No newline at end of file +tests +*.old \ No newline at end of file From 21f30ac79dfce2d2357574dd19340f651f78c56c Mon Sep 17 00:00:00 2001 From: Jonne Date: Wed, 20 Mar 2024 06:02:35 +0200 Subject: [PATCH 09/10] Disable buttons and enable reset button in MonitorClient class --- gui.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/gui.py b/gui.py index 063436d..da0ffd1 100644 --- a/gui.py +++ b/gui.py @@ -246,9 +246,10 @@ def emergency_stop(self): self.socketclient.send_message("Emergency") self.state = State.EMERGENCY_STOPPED - self.start_button.config(state="normal") - self.stop_button.config(state="normal") + self.start_button.config(state="disabled") + self.stop_button.config(state="disabled") self.emergency_button.config(state="disabled") + self.reset_button.config(state="normal") def start(self): self.status_label.config(text=f"{self.labels.get('status_label')}: {State.RUNNING.name}") @@ -257,6 +258,7 @@ def start(self): self.start_button.config(state="disabled") self.stop_button.config(state="normal") self.emergency_button.config(state="normal") + self.reset_button.config(state="normal") def stop(self): self.status_label.config(text=f"{self.labels.get('status_label')}: {State.STOPPED.name}") @@ -266,6 +268,7 @@ def stop(self): self.start_button.config(state="normal") self.stop_button.config(state="disabled") self.emergency_button.config(state="normal") + self.emergency_button.config(state="normal") def reset(self): self.status_label.config(text=f"{self.labels.get('status_label')}: {State.IDLE.name}") @@ -273,8 +276,9 @@ def reset(self): self.state = State.IDLE self.start_button.config(state="normal") - self.stop_button.config(state="disabled") - self.emergency_button.config(state="disabled") + self.stop_button.config(state="normal") + self.emergency_button.config(state="normal") + self.reset_button.config(state="normal") def set_screen_blank(self): blank_image = Image.new('RGB', (640, 480), (0, 0, 0)) From 561577f5834094baa45f5d14ffe27454a49888cc Mon Sep 17 00:00:00 2001 From: Jonne Date: Wed, 20 Mar 2024 06:03:57 +0200 Subject: [PATCH 10/10] Update window title label in Labels class --- src/labels.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/labels.py b/src/labels.py index 586801c..f60ad96 100644 --- a/src/labels.py +++ b/src/labels.py @@ -7,7 +7,7 @@ def __init__(self): self.mgr = SettingsManager("messages.yaml") messages = { - "window_title_label": "Linjasto Valvomo", + "window_title_label": "AI Sorter", "confirm_exit": "Do you want to quit?", "start_button_label": "Start", "stop_button_label": "Stop",