diff --git a/BlockStackApp.py b/BlockStackApp.py index 52b2136..207c4d8 100644 --- a/BlockStackApp.py +++ b/BlockStackApp.py @@ -155,21 +155,6 @@ class BlockStackApp(QWidget): if confirmation == QMessageBox.Yes: self.close() - - - - - - - - - - - - - - - def change_button_color(self, block_id, button_name, color): block = self.blocks.get(block_id) if block: @@ -200,17 +185,17 @@ class BlockStackApp(QWidget): # Handle the data received from the serial port print(f"Data received: {data}") - def update_block(self, is_running, diameter_value, position_value): + def update_block(self, is_running, dial_number, diameter_value, position_value): ts = round(time.time() * 1000) # Update the block with diameter_value and position_value worker = self.sender() diameter_avg = 0.0000 est_wgh = 0 - worker.block.dia_label.setText(f"{diameter_value:.3f} ") - worker.block.len_label.setText(f"{position_value/1000:.3f}") + if dial_number == 0: + worker.block.len_label.setText(f"{position_value/1000:.3f}") - if is_running: + if True: if worker.reset_data: worker.diameter_total = diameter_value worker.diameter_count = 1 @@ -220,26 +205,22 @@ class BlockStackApp(QWidget): worker.data_list.clear() worker.reset_data = False else: - worker.diameter_total += diameter_value # to calc average diameter - worker.diameter_count += 1 - - if diameter_value < worker.diameter_min: # process min/max - worker.diameter_min = diameter_value - if diameter_value > worker.diameter_max: - worker.diameter_max = diameter_value - - worker.block.min_label.setText(f"{worker.diameter_min:.3f} ") - worker.block.max_label.setText(f"{worker.diameter_max:.3f} ") + if is_running: + worker.diameter_total += diameter_value # to calc average diameter + worker.diameter_count += 1 + worker.block.min_label.setText(f"{worker.diameter_min:.3f} ") + worker.block.max_label.setText(f"{worker.diameter_max:.3f} ") # push data to memory for report - worker.data_list.append((ts, position_value, diameter_value)) + worker.data_list.append((ts, dial_number, position_value, diameter_value)) # push data to graph and update it - self.update_graph(worker, diameter_value) + self.update_graph(worker, dial_number, diameter_value) # calculate and display average diameter - diameter_avg = worker.diameter_total / worker.diameter_count if worker.diameter_count > 0 else 0.0 - worker.block.avg_label.setText(f"{diameter_avg:.4f}") + if is_running: + diameter_avg = worker.diameter_total / worker.diameter_count if worker.diameter_count > 0 else 0.0 + worker.block.avg_label.setText(f"{diameter_avg:.4f}") # calculate and display estimated weight vol = math.pi * (diameter_avg / 2) ** 2 * position_value # all in mm → mm³ @@ -247,23 +228,87 @@ class BlockStackApp(QWidget): worker.block.wht_label.setText(f"{est_wgh/1000:.3f} ") - def update_graph(self, worker, diameter_value): - # Update the graph with the new diameter value - x_data = worker.line.get_xdata() - y_data = worker.line.get_ydata() - x_data = list(x_data) - y_data = list(y_data) + def update_graph(self, worker, dial_number,diameter_value): + # def update_graph(self, worker, dial_number, diameter_value, diameter_value2, diameter_value3): + - # Append new data point - x_data.append(len(x_data)) - y_data.append(diameter_value) + # diameter_value2 = diameter_value + random.randrange(-300, 300, 10)/1000 + # diameter_value3 = diameter_value + random.randrange(-300, 300, 10)/1000 + + # Update the graph with the new diameter values + x_data1 = worker.line1.get_xdata() + y_data1 = worker.line1.get_ydata() + x_data2 = worker.line2.get_xdata() + y_data2 = worker.line2.get_ydata() + x_data3 = worker.line3.get_xdata() + y_data3 = worker.line3.get_ydata() - # Update the line with the new data - worker.line.set_data(x_data, y_data) + x_data1 = list(x_data1) + y_data1 = list(y_data1) + x_data2 = list(x_data2) + y_data2 = list(y_data2) + x_data3 = list(x_data3) + y_data3 = list(y_data3) + + # Append new data points + match dial_number: + case 0: + x_data1.append(len(x_data1)) + y_data1.append(diameter_value) + worker.diameter_value1 = diameter_value + case 1: + x_data2.append(len(x_data2)) + y_data2.append(diameter_value) + worker.diameter_value2 = diameter_value + case 2: + x_data3.append(len(x_data3)) + y_data3.append(diameter_value) + worker.diameter_value3 = diameter_value + + + # Keep only the last 100 values + if not worker.is_running: + # Keep only the last 100 values + if len(y_data1) > 100: + y_data1 = y_data1[-100:] + y_data2 = y_data2[-100:] + y_data3 = y_data3[-100:] + + # Update x-axis values to reflect the rolling window + x_data1 = list(range(len(y_data1))) + x_data2 = list(range(len(y_data2))) + x_data3 = list(range(len(y_data3))) + + all_y_data = y_data1 + y_data2 + y_data3 + + worker.diameter_min = min(all_y_data) + worker.diameter_max = max(all_y_data) + + worker.block.min_label.setText(f"{worker.diameter_min:.3f} ") + worker.block.max_label.setText(f"{worker.diameter_max:.3f} ") + + diameter_avg = sum(all_y_data) / len(all_y_data) if all_y_data else 0 + worker.block.avg_label.setText(f"{diameter_avg:.4f}") + + diameter_calc = worker.diameter_value1 + diameter_n = 1 + # Update the lines with the new data + worker.line1.set_data(x_data1, y_data1) + if len(y_data2) > 0: + worker.line2.set_data(x_data2, y_data2) + diameter_calc += worker.diameter_value2 + diameter_n += 1 + if len(y_data3) > 0: + worker.line3.set_data(x_data3, y_data3) + diameter_calc += worker.diameter_value3 + diameter_n += 1 + + worker.diameter_value = diameter_calc / diameter_n + worker.block.dia_label.setText(f"{worker.diameter_value:.3f} ") # Rescale the graph - worker.line.axes.relim() - worker.line.axes.autoscale_view() + worker.line1.axes.relim() + worker.line1.axes.autoscale_view() # Redraw the canvas worker.canvas.draw() diff --git a/UpdateWorker.py b/UpdateWorker.py index cd6aedf..76e4f18 100644 --- a/UpdateWorker.py +++ b/UpdateWorker.py @@ -16,7 +16,7 @@ from datetime import datetime from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas class UpdateWorker(QThread): - update_signal = pyqtSignal(bool, float, float, float, float) + update_signal = pyqtSignal(bool, int, float, float) data_received = pyqtSignal(str) stop_signal = pyqtSignal() mode_signal = pyqtSignal(int) @@ -39,6 +39,9 @@ class UpdateWorker(QThread): self.diameter_total = 0.0 # for average calculation self.diameter_count = 0 self.diameter_value = 0.0 + self.diameter_value1 = 0.0 + self.diameter_value2 = 0.0 + self.diameter_value3 = 0.0 self.diameter_min = 0.0 self.diameter_max = 0.0 self.density = 1.0 @@ -161,12 +164,21 @@ class UpdateWorker(QThread): def parse_data(self, data): - match = re.match(r"^[#d]:(-?[\d\.]+),p:(-?[\d\.]+)$", data) + match = re.match(r"^[#d](\d):(-?[\d]+),p:(-?[\d\.]+)$", data) if match: - self.diameter_value = float(match.group(1)) - self.position_value = float(match.group(2)) - self.update_signal.emit(self.is_running, self.diameter_value, self.position_value, self.diameter_min, self.diameter_max) - self.reset_flag = True + diameter_int = int(match.group(2)) + if diameter_int<65000: + dial_number = int(match.group(1)) + position_value = float(match.group(3)) + diameter_value = float(diameter_int)/1000 + + if diameter_value < self.diameter_min: # process min/max + self.diameter_min = diameter_value + if diameter_value > self.diameter_max: + self.diameter_max = diameter_value + + self.update_signal.emit(self.is_running, dial_number, diameter_value, position_value) + self.reset_flag = True offset_match = re.match(r"^#h:(\d+)", data) if offset_match: @@ -272,7 +284,9 @@ class UpdateWorker(QThread): def clear_graph(self): - self.line.set_data([], []) + self.line1.set_data([], []) + self.line2.set_data([], []) + self.line3.set_data([], []) self.canvas.draw() def add_block(self, serial_number, bench_id, port, block_id, main_app): @@ -505,7 +519,11 @@ class UpdateWorker(QThread): ax.set_xticks([]) # Hide x-axis values ax.set_frame_on(True) # ax.set_ylabel('Diameter (mm)') # Show y-axis label - self.line, = ax.plot([], [], '#ff5000', linewidth=0.5) + + self.line2, = ax.plot([], [], '#00ff50', linewidth=0.5) + self.line3, = ax.plot([], [], '#fffb00', linewidth=0.5) + self.line1, = ax.plot([], [], '#ff5000', linewidth=1.5) + self.canvas = FigureCanvas(fig) self.canvas.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Ignored) center_layout.addWidget(self.canvas)