fix state machine

fix preparation
add graph sync
This commit is contained in:
Jonathan Roth 2025-04-29 14:14:24 +02:00
parent 21dbc18a54
commit 2d7c3c4995
3 changed files with 90 additions and 44 deletions

1
.gitignore vendored
View File

@ -18,3 +18,4 @@ fdr1gui.2.py
gzip gzip
os os
plt plt
data/

View File

@ -211,6 +211,8 @@ class BlockStackApp(QWidget):
worker.block.min_label.setText(f"{worker.diameter_min:.3f} ") worker.block.min_label.setText(f"{worker.diameter_min:.3f} ")
worker.block.max_label.setText(f"{worker.diameter_max:.3f} ") worker.block.max_label.setText(f"{worker.diameter_max:.3f} ")
worker.position_value = position_value
# push data to memory for report # push data to memory for report
worker.data_list.append((ts, dial_number, position_value, diameter_value)) 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 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.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_calc = worker.diameter_value1
diameter_n = 1 diameter_n = 1
# Update the lines with the new data # Update the lines with the new data

View File

@ -76,37 +76,66 @@ class UpdateWorker(QThread):
if ser.in_waiting > 0: if ser.in_waiting > 0:
data = ser.readline().decode('utf-8').strip() data = ser.readline().decode('utf-8').strip()
if data: if data:
print(f"id{self.bench_id}:\t{data}")
self.parse_data(data) self.parse_data(data)
if self.reset_flag and self.prepare_flag:
if self.position_value > 100 and self.reset_flag: # if self.ignore_stop:
self.ignore_stop = True # print("ignore_stop ACTIVE")
self.change_color_signal.emit(self.block_id, 'btn_prepare', "#5A5A5A") # else:
ser.write(b'R') # 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 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 self.prepare_ok = True
print(f"preparation VALID")
else: else:
self.prepare_ok = False self.prepare_ok = False
print(f"preparation FAIL")
if self.prepare_ok: if self.prepare_ok:
self.change_color_signal.emit(self.block_id, 'btn_prepare', "#00A000") self.change_color_signal.emit(self.block_id, 'btn_prepare', "#00A000")
self.change_color_signal.emit(self.block_id, 'btn_start', "#A0A000") self.change_color_signal.emit(self.block_id, 'btn_start', "#A0A000")
else: else:
self.change_color_signal.emit(self.block_id, 'btn_prepare', "#A00000") self.change_color_signal.emit(self.block_id, 'btn_prepare', "#A00000")
else: self.change_color_signal.emit(self.block_id, 'btn_start', "#a00000")
self.change_color_signal.emit(self.block_id, 'btn_prepare', "#0000FF")
else: # if preparing and data has been reset
if data == '%STOP': if self.prepare_flag and self.reset_flag:
self.stop_running()
# if not self.ignore_stop: # # if not running anymore
# self.change_color_signal.emit(self.block_id, 'btn_start', "#A00000") # if self.is_running:
# self.is_running = False
# self.save_data_to_file() # if still running
# else: # else:
# self.ignore_stop = False self.change_color_signal.emit(self.block_id, 'btn_prepare', "#0000FF")
elif data == '$NOTHOMED': # 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.homed = False
self.change_color_signal.emit(self.block_id, 'btn_home', "#a0a000") self.change_color_signal.emit(self.block_id, 'btn_home', "#a0a000")
elif data == '$HOMED': elif data == '$H':
# print(f"id{self.bench_id} :\tHoming ok") # print(f"id{self.bench_id} :\tHoming ok")
self.homed = True self.homed = True
self.change_color_signal.emit(self.block_id, 'btn_home', "#5a5a5a") self.change_color_signal.emit(self.block_id, 'btn_home', "#5a5a5a")
@ -133,8 +162,10 @@ 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 # 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 # MOTOR DISABLED: FILAMENT OUT OF RANGE
# #end: 20250224_232750 # #end: 20250224_232750
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}") print(f"id{self.bench_id}:\tsaving job: {self.current_job}")
spool, vendor, material, batch, description, startstamp = self.current_job spool, vendor, material, batch, description, startstamp = self.current_job
@ -150,8 +181,9 @@ class UpdateWorker(QThread):
outfile.write(F"#spool: {spool}\n") outfile.write(F"#spool: {spool}\n")
outfile.write(F"#material: {vendor} {material} {batch} {description}\n") outfile.write(F"#material: {vendor} {material} {batch} {description}\n")
for ts, position, diameter in self.data_list: #worker.data_list.append((ts, dial_number, position_value, diameter_value))
outfile.write(f"t:{ts},d:{diameter},p:{position}\n") 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") outfile.write(F"#end: {endstamp}\n")
@ -163,6 +195,10 @@ class UpdateWorker(QThread):
r = requests.post(url, files=files) r = requests.post(url, files=files)
def parse_data(self, data): 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) match = re.match(r"^[#d](\d):(-?[\d]+),p:(-?[\d\.]+)$", data)
if match: if match:
@ -178,6 +214,7 @@ class UpdateWorker(QThread):
self.diameter_max = diameter_value self.diameter_max = diameter_value
self.update_signal.emit(self.is_running, dial_number, diameter_value, position_value) self.update_signal.emit(self.is_running, dial_number, diameter_value, position_value)
if position_value < 0.1:
self.reset_flag = True self.reset_flag = True
offset_match = re.match(r"^#h:(\d+)", data) offset_match = re.match(r"^#h:(\d+)", data)
@ -244,11 +281,13 @@ class UpdateWorker(QThread):
self.position_value = 0 self.position_value = 0
self.prepare_flag = True self.prepare_flag = True
self.reset_flag = False self.reset_flag = False
self.ignore_stop = True
self.is_running = True
def start_running(self): def start_running(self):
if self.prepare_ok and self.can_start: if self.prepare_ok and self.can_start:
self.reset_data = True self.reset_data = True
self.is_running = True # self.is_running = True
self.current_job = ( self.current_job = (
self.api_job['spool'], self.api_job['spool'],
@ -272,17 +311,6 @@ class UpdateWorker(QThread):
f"Job done, processing..." 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): def clear_graph(self):
self.line1.set_data([], []) self.line1.set_data([], [])
self.line2.set_data([], []) self.line2.set_data([], [])
@ -415,7 +443,7 @@ class UpdateWorker(QThread):
right_layout_1.addWidget(btn_start) right_layout_1.addWidget(btn_start)
btn_reset = QPushButton("Reset/Zero") 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")) btn_reset.clicked.connect(lambda: self.change_color_signal.emit(self.block_id, 'btn_start', "#5A5A5A"))
right_layout_1.addWidget(btn_reset) right_layout_1.addWidget(btn_reset)