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
|
gzip
|
||||||
os
|
os
|
||||||
plt
|
plt
|
||||||
|
data/
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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)
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user