diff --git a/.gitignore b/.gitignore index e7653a7..c4a149f 100644 --- a/.gitignore +++ b/.gitignore @@ -23,7 +23,7 @@ env/ # Logs *.log -Data_log +Data_log/ # OS generated files Thumbs.db diff --git a/HMI/src/ehg_leaktest_dev.py b/HMI/src/ehg_leaktest.py similarity index 92% rename from HMI/src/ehg_leaktest_dev.py rename to HMI/src/ehg_leaktest.py index 7d3ea34..9b37739 100644 --- a/HMI/src/ehg_leaktest_dev.py +++ b/HMI/src/ehg_leaktest.py @@ -1,3 +1,4 @@ + import sys import os import serial @@ -12,6 +13,7 @@ from PyQt6.QtCore import QTimer from PyQt6.QtGui import QIcon from PyQt6.QtCore import QSettings from openpyxl import load_workbook +from collections import deque # -------------------------- Get resource path -------------------------- def resource_path(relative_path): @@ -36,7 +38,16 @@ def find_arduino(): return None arduino_port = find_arduino() -ser = serial.Serial(arduino_port, 9600, timeout=10) if arduino_port else None +ser = None +if arduino_port: + ser = serial.Serial( + arduino_port, + 9600, + timeout=0, # Non-blocking + write_timeout=0 + ) + ser.reset_input_buffer() + ser.reset_output_buffer() # --------------------------- Config JSON helpers --------------------------- def get_presets_path(): @@ -102,9 +113,10 @@ class HMI(QWidget): # -------------------------- Data Storage -------------------------- self.start_time = time.time() - self.time_data = [] - self.pressure_data = [] self.marker_items = [] + self.time_data = deque(maxlen=5000) + self.pressure_data = deque(maxlen=5000) + self.serial_buffer = bytearray() # -------------------------- Default / Saved Configurations -------------------------- self.setpoint_start = float(self.settings.value("setpoint_start", 25)) @@ -299,31 +311,65 @@ class HMI(QWidget): self.marker_input.setText("") # -------------------------- Plot & Cursor Methods -------------------------- + def moving_average_fast(self, window=5): + data = list(self.pressure_data) + if len(data) < window: + return data + + result = [] + running_sum = 0 + + for i in range(len(data)): + running_sum += data[i] + + if i >= window: + running_sum -= data[i - window] + + if i >= window - 1: + result.append(running_sum / window) + else: + result.append(data[i]) + + return result + def update_plot(self): - if ser and ser.in_waiting > 0: - data = ser.read(2) - if len(data) < 2: - return - try: - raw_pressure = struct.unpack('= 2: + packet = self.serial_buffer[:2] + del self.serial_buffer[:2] + + raw_pressure = struct.unpack(' 100000: - self.time_data.pop(0) - self.pressure_data.pop(0) + # Update plot only if new data exists + if self.time_data: + smoothed = self.moving_average_fast() + self.plot.setData(list(self.time_data), smoothed) - self.plot.setData([t for t in self.time_data], - [self.moving_average(self.pressure_data[:i + 1]) for i in range(len(self.pressure_data))]) + self.actual_value_label.setText( + f"{self.pressure_data[-1]:.2f} kPa" + ) + self.actual_value_label.setPos( + self.time_data[-1], + self.pressure_data[-1] + ) - if self.time_data and self.pressure_data: - self.actual_value_label.setText(f"{eng_pressure:.2f} kPa") - self.actual_value_label.setPos(self.time_data[-1], self.pressure_data[-1]) - except ValueError: - pass + except Exception as e: + print("Serial read error:", e) def sync_cursors(self, moved_cursor, other_cursor): new_pos = moved_cursor.value() + self.setwindow if moved_cursor is self.cursor_start else moved_cursor.value() - self.setwindow @@ -372,8 +418,6 @@ class HMI(QWidget): self.update_marker_interval() self.reset_hmi() - - def save_configuration(self): try: if self.current_preset is None: diff --git a/bckp.zip b/bckp.zip deleted file mode 100644 index 6e8a296..0000000 Binary files a/bckp.zip and /dev/null differ