From 51dfac5ea33406800cc7bca2c44e60b5b694cf48 Mon Sep 17 00:00:00 2001 From: BOTAlex Date: Fri, 7 Mar 2025 23:32:50 +0100 Subject: [PATCH] Fixed serial cam --- EyeTrackApp/Camera/CameraFactory.py | 4 +++- EyeTrackApp/Camera/ICameraSource.py | 24 ++++++++++++++++++++++++ EyeTrackApp/Camera/SerialCamera.py | 28 ++++------------------------ EyeTrackApp/camera_widget.py | 1 - 4 files changed, 31 insertions(+), 26 deletions(-) diff --git a/EyeTrackApp/Camera/CameraFactory.py b/EyeTrackApp/Camera/CameraFactory.py index 9da8fc3..027ec88 100644 --- a/EyeTrackApp/Camera/CameraFactory.py +++ b/EyeTrackApp/Camera/CameraFactory.py @@ -22,10 +22,12 @@ class CameraFactory: @staticmethod def get_camera_from_string_type(sourceName: str) -> ICameraSource: sourceName = str(sourceName) # prevents int to be entered - if sourceName.lower().startswith("COM") or sourceName.lower().startswith("/dev/cu") or sourceName.lower().startswith("/dev/tty"): # Windows # macOS # Linux + if sourceName.lower().startswith("com") or sourceName.lower().startswith("/dev/cu") or sourceName.lower().startswith("/dev/tty"): # Windows # macOS # Linux + print(f"{Fore.CYAN}[INFO] Serial camera selected {Fore.RESET}") return SerialCamera elif sourceName.lower() == "udp": print(f"{Fore.YELLOW}[WARN] UDP selected. Prepare for bugs from BOTAlex. Unfinished and extreme alpha. {Fore.RESET}") return UDP_Camera else: + print(f"{Fore.CYAN}[INFO] System camera selected {Fore.RESET}") return SystemCamera \ No newline at end of file diff --git a/EyeTrackApp/Camera/ICameraSource.py b/EyeTrackApp/Camera/ICameraSource.py index 8fe80fc..4eec3e5 100644 --- a/EyeTrackApp/Camera/ICameraSource.py +++ b/EyeTrackApp/Camera/ICameraSource.py @@ -88,3 +88,27 @@ class ICameraSource: def set_output_queue(self, camera_output_outgoing: "queue.Queue"): self.camera_output_outgoing = camera_output_outgoing + + def get_stream_fps(self): + """Based on how many times this method gets called""" + + # Calculate the fps. + current_frame_time = time.time() + delta_time = current_frame_time - self.last_frame_time + self.last_frame_time = current_frame_time + + # Avoid division by zero + if delta_time > 0: + fps = 1.0 / delta_time + else: + fps = 0 + + # Smooth the FPS using a moving average + self.fl.append(fps) + if len(self.fl) > 60: + self.fl.pop(0) # Keep the list length constant + + # Compute average FPS + fps = sum(self.fl) / len(self.fl) + + return fps diff --git a/EyeTrackApp/Camera/SerialCamera.py b/EyeTrackApp/Camera/SerialCamera.py index cfd0dfc..64bca3e 100644 --- a/EyeTrackApp/Camera/SerialCamera.py +++ b/EyeTrackApp/Camera/SerialCamera.py @@ -15,6 +15,7 @@ from Camera.CameraState import CameraState from Camera.ICameraSource import ICameraSource import socket +WAIT_TIME = 0.1 # Serial communication protocol: # header-begin (2 bytes) # header-type (2 bytes) @@ -105,32 +106,11 @@ class SerialCamera(ICameraSource): print(f"{Fore.CYAN}[INFO] Discarding the serial buffer ({conn.in_waiting} bytes){Fore.RESET}") conn.reset_input_buffer() self.buffer = b"" - # Calculate the fps. - current_frame_time = time.time() - delta_time = current_frame_time - self.last_frame_time - self.last_frame_time = current_frame_time + + fps = self.get_stream_fps() - # Avoid division by zero - if delta_time > 0: - fps = 1.0 / delta_time - else: - fps = 0 - - # Smooth the FPS using a moving average - self.fl.append(fps) - if len(self.fl) > 60: - self.fl.pop(0) # Keep the list length constant - - # Compute average FPS - self.fps = sum(self.fl) / len(self.fl) - - # Compute bandwidth per second (bps) - self.bps = image.nbytes * self.fps - - # Increment frame count - self.frame_number += 1 if should_push: - self.push_image_to_queue(image, self.frame_number, self.fps) + self.push_image_to_queue(image, self.frame_number, fps) except Exception: print( f"{Fore.YELLOW}[WARN] Serial capture source problem, assuming camera disconnected, waiting for reconnect.{Fore.RESET}" diff --git a/EyeTrackApp/camera_widget.py b/EyeTrackApp/camera_widget.py index f7e83a9..7d9151a 100644 --- a/EyeTrackApp/camera_widget.py +++ b/EyeTrackApp/camera_widget.py @@ -105,7 +105,6 @@ class CameraWidget: ) self.camera_status_queue = Queue() - CameraFactory if not self.config.capture_source is None: self.camera = CameraFactory.get_camera_from_string_type(self.config.capture_source)(