fix state machine
fix preparation add graph sync
This commit is contained in:
parent
21dbc18a54
commit
2d7c3c4995
1
.gitignore
vendored
1
.gitignore
vendored
@ -18,3 +18,4 @@ fdr1gui.2.py
|
||||
gzip
|
||||
os
|
||||
plt
|
||||
data/
|
||||
|
||||
@ -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
|
||||
|
||||
@ -76,37 +76,66 @@ 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_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()
|
||||
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.ignore_stop = False
|
||||
elif data == '$NOTHOMED':
|
||||
self.change_color_signal.emit(self.block_id, 'btn_prepare', "#0000FF")
|
||||
# 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 == '$HOMED':
|
||||
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")
|
||||
@ -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
|
||||
# MOTOR DISABLED: FILAMENT OUT OF RANGE
|
||||
# #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}")
|
||||
|
||||
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"#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,6 +214,7 @@ class UpdateWorker(QThread):
|
||||
self.diameter_max = diameter_value
|
||||
|
||||
self.update_signal.emit(self.is_running, dial_number, diameter_value, position_value)
|
||||
if position_value < 0.1:
|
||||
self.reset_flag = True
|
||||
|
||||
offset_match = re.match(r"^#h:(\d+)", data)
|
||||
@ -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'],
|
||||
@ -272,17 +311,6 @@ class UpdateWorker(QThread):
|
||||
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([], [])
|
||||
self.line2.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)
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user