diff --git a/.gitignore b/.gitignore index 09cef89..7ecd06f 100644 --- a/.gitignore +++ b/.gitignore @@ -18,3 +18,4 @@ fdr1gui.2.py gzip os plt +data/ diff --git a/BlockStackApp.py b/BlockStackApp.py index f360e4d..ea24ee5 100644 --- a/BlockStackApp.py +++ b/BlockStackApp.py @@ -211,6 +211,8 @@ class BlockStackApp(QWidget): worker.block.min_label.setText(f"{worker.diameter_min:.3f} ") worker.block.max_label.setText(f"{worker.diameter_max:.3f} ") + worker.position_value = position_value + # push data to memory for report worker.data_list.append((ts, dial_number, position_value, diameter_value)) @@ -290,6 +292,21 @@ class BlockStackApp(QWidget): 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}") + # worker running, trim number of values to keep graph aligned + else: + nvalues = min(len(y_data1), len(y_data2), len(y_data3)) + 1 + + # if len(y_data1) > 200: + y_data1 = y_data1[-nvalues:] + y_data2 = y_data2[-nvalues:] + y_data3 = y_data3[-nvalues:] + + # 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))) + + diameter_calc = worker.diameter_value1 diameter_n = 1 # Update the lines with the new data diff --git a/UpdateWorker.py b/UpdateWorker.py index f861996..9d465af 100644 --- a/UpdateWorker.py +++ b/UpdateWorker.py @@ -76,40 +76,69 @@ class UpdateWorker(QThread): if ser.in_waiting > 0: data = ser.readline().decode('utf-8').strip() if data: + print(f"id{self.bench_id}:\t{data}") self.parse_data(data) - if self.reset_flag and self.prepare_flag: - if self.position_value > 100 and self.reset_flag: - self.ignore_stop = True - self.change_color_signal.emit(self.block_id, 'btn_prepare', "#5A5A5A") - ser.write(b'R') + + # if self.ignore_stop: + # print("ignore_stop ACTIVE") + # else: + # print("ignore_stop inactive") + + # stop received, initiated by program or firmware + if data == '%S': + print(f"id{self.bench_id}:\tSTOP received") + + # if not preparing + if not self.ignore_stop: + print(f"id{self.bench_id}:\tprocess STOP") + self.change_color_signal.emit(self.block_id, 'btn_start', "#A00000") + # self.is_running = False + self.save_data_to_file() + #if preparing + else: + print(f"id{self.bench_id}:\tignore STOP") + self.ignore_stop = False self.prepare_flag = False - if ((1.65 < self.diameter_value) and (self.diameter_value < 1.85)) or ((2.70 < self.diameter_value) and (self.diameter_value < 2.95)): + + print(f"position: {self.position_value} diameter: {self.diameter_value}") + + if (self.position_value > 200) and ((1.65 < self.diameter_value) and (self.diameter_value < 1.85)) or ((2.70 < self.diameter_value) and (self.diameter_value < 2.95)): + self.prepare_ok = True + print(f"preparation VALID") else: self.prepare_ok = False + print(f"preparation FAIL") + if self.prepare_ok: self.change_color_signal.emit(self.block_id, 'btn_prepare', "#00A000") self.change_color_signal.emit(self.block_id, 'btn_start', "#A0A000") else: self.change_color_signal.emit(self.block_id, 'btn_prepare', "#A00000") - else: + self.change_color_signal.emit(self.block_id, 'btn_start', "#a00000") + + # if preparing and data has been reset + if self.prepare_flag and self.reset_flag: + + # # if not running anymore + # if self.is_running: + + # if still running + # else: self.change_color_signal.emit(self.block_id, 'btn_prepare', "#0000FF") - else: - if data == '%STOP': - self.stop_running() - # if not self.ignore_stop: - # self.change_color_signal.emit(self.block_id, 'btn_start', "#A00000") - # self.is_running = False - # self.save_data_to_file() - # else: - # self.ignore_stop = False - elif data == '$NOTHOMED': - self.homed = False - self.change_color_signal.emit(self.block_id, 'btn_home', "#a0a000") - elif data == '$HOMED': - # print(f"id{self.bench_id} :\tHoming ok") - self.homed = True - self.change_color_signal.emit(self.block_id, 'btn_home', "#5a5a5a") + # send stop command if position reached | while preparing, after data reset + if (self.position_value > 200): + print(f"id{self.bench_id}:\tposition reached, sending STOP") + self.stop_running() + + + elif data == '$NH': + self.homed = False + self.change_color_signal.emit(self.block_id, 'btn_home', "#a0a000") + elif data == '$H': + # print(f"id{self.bench_id} :\tHoming ok") + self.homed = True + self.change_color_signal.emit(self.block_id, 'btn_home', "#5a5a5a") except serial.SerialException as e: print(f"Error with port {self.port}: {e}") @@ -133,9 +162,11 @@ class UpdateWorker(QThread): # d:1.820,dm:1.690,dM:1.820,p:1614324.250,s:1.1,m:972.0096,q:2,ap:1180/3598 # MOTOR DISABLED: FILAMENT OUT OF RANGE # #end: 20250224_232750 - - - print(f"id{self.bench_id}:\tsaving job: {self.current_job}") + if self.current_job is None: + print(f"id{self.bench_id}:\tjob empty, not saving") + return + else: + print(f"id{self.bench_id}:\tsaving job: {self.current_job}") spool, vendor, material, batch, description, startstamp = self.current_job endstamp = datetime.now().strftime("%Y%m%d_%H%M%S") @@ -150,8 +181,9 @@ class UpdateWorker(QThread): outfile.write(F"#spool: {spool}\n") outfile.write(F"#material: {vendor} {material} {batch} {description}\n") - for ts, position, diameter in self.data_list: - outfile.write(f"t:{ts},d:{diameter},p:{position}\n") + #worker.data_list.append((ts, dial_number, position_value, diameter_value)) + for ts, dial, position, diameter in self.data_list: + outfile.write(f"t:{ts},d{dial}:{diameter},p:{position}\n") outfile.write(F"#end: {endstamp}\n") @@ -163,6 +195,10 @@ class UpdateWorker(QThread): r = requests.post(url, files=files) def parse_data(self, data): + if data[0] != '#': + self.is_running = True + else: + self.is_running = False match = re.match(r"^[#d](\d):(-?[\d]+),p:(-?[\d\.]+)$", data) if match: @@ -178,7 +214,8 @@ class UpdateWorker(QThread): self.diameter_max = diameter_value self.update_signal.emit(self.is_running, dial_number, diameter_value, position_value) - self.reset_flag = True + if position_value < 0.1: + self.reset_flag = True offset_match = re.match(r"^#h:(\d+)", data) if offset_match: @@ -244,11 +281,13 @@ class UpdateWorker(QThread): self.position_value = 0 self.prepare_flag = True self.reset_flag = False - + self.ignore_stop = True + self.is_running = True + def start_running(self): if self.prepare_ok and self.can_start: self.reset_data = True - self.is_running = True + # self.is_running = True self.current_job = ( self.api_job['spool'], @@ -267,21 +306,10 @@ class UpdateWorker(QThread): def stop_running(self): if self.is_running: self.send_command('R') - + self.block.data_label.setText( f"Job done, processing..." ) - - # for position, diameter in self.data_list: - # print(f"{position} -> {diameter}") - - self.change_color_signal.emit(self.block_id, 'btn_start', "#a00000") - self.change_color_signal.emit(self.block_id, 'btn_prepare', "#5A5A5A") - - self.is_running = False - self.save_data_to_file() - self.prepare_ok = False - def clear_graph(self): self.line1.set_data([], []) @@ -415,7 +443,7 @@ class UpdateWorker(QThread): right_layout_1.addWidget(btn_start) btn_reset = QPushButton("Reset/Zero") - btn_reset.clicked.connect(lambda: self.send_command('r')) + btn_reset.clicked.connect(lambda: self.send_command(' ')) btn_reset.clicked.connect(lambda: self.change_color_signal.emit(self.block_id, 'btn_start', "#5A5A5A")) right_layout_1.addWidget(btn_reset)