From cc40719e6c9f336880e338f6c521424fcb4abc9d Mon Sep 17 00:00:00 2001 From: Christopher Keller Date: Mon, 28 Nov 2011 20:36:04 -0800 Subject: [PATCH] Fixed the time estimator in pronsole.py at beginning of move set feedrate to average of last and current feedrate. do move with that feedrate. then set the feedrate to the current feedrate. if it's just a feedrate change, then the feedrate will become the feedrate. if there is no feedrate in current move, feedrate will be last feedrate if there is a move and a new feedrate then the move will take however long the average feedrate would take. estimation is a bit more optimistic than pessimistic. however it seems to be a lot more accurate. --- pronsole.py | 93 +++++++++++++++++++++++++++-------------------------- 1 file changed, 48 insertions(+), 45 deletions(-) diff --git a/pronsole.py b/pronsole.py index 1be8371..c5d29e9 100755 --- a/pronsole.py +++ b/pronsole.py @@ -89,53 +89,56 @@ def get_coordinate_value(axis, parts): def estimate_duration(g): - extra_cost_per_movement = 0.02 - total_duration = 0 - feedrate = 0 - X_last_position = 0 - Y_last_position = 0 - for i in g: - i=i.split(";")[0] - if "G1" in i and ("X" in i or "Y" in i or "F" in i or "E" in i): - parts = i.split(" ") - X = get_coordinate_value("X", parts[1:]) - Y = get_coordinate_value("Y", parts[1:]) - F = get_coordinate_value("F", parts[1:]) - E = get_coordinate_value("E", parts[1:]) + extra_cost_per_movement = 0.02 + total_duration = 0.0 + feedrate = 0.0 + avg_feedrate = 0.0 + last_feedrate = 0.0 + X_last_position = 0.0 + Y_last_position = 0.0 + Z_last_position = 0.0 + for i in g: + i=i.split(";")[0] + if "G1" in i and ("X" in i or "Y" in i or "F" in i or "E" in i): + #if "G1" in i and ("X" in i or "Y" in i or "Z" in i or "F" in i or "E" in i): + parts = i.split(" ") + X = get_coordinate_value("X", parts[1:]) + Y = get_coordinate_value("Y", parts[1:]) + #Z = get_coordinate_value("Z", parts[1:]) + F = get_coordinate_value("F", parts[1:]) + E = get_coordinate_value("E", parts[1:]) - if (F is not None): - feedrate = F / 60 - - distance = 0 - if (X is None and Y is None and E is not None): - distance = abs(E) - elif (X is not None and Y is None): - distance = X - X_last_position - X_last_position = X - elif (X is None and Y is not None): - distance = Y - Y_last_position - Y_last_position = Y - elif (X is not None and Y is not None): - X_distance = X - X_last_position - Y_distance = Y - Y_last_position - distance = sqrt(X_distance * X_distance + Y_distance * Y_distance) - X_last_position = X - Y_last_position = Y + if (F is not None): + feedrate = (last_feedrate + (F / 60.0))/2.0 + distance = 0 + if (X is None and Y is None and E is not None): + distance = abs(E) + elif (X is not None and Y is None): + distance = X - X_last_position + X_last_position = X + elif (X is None and Y is not None): + distance = Y - Y_last_position + Y_last_position = Y + elif (X is not None and Y is not None): + X_distance = X - X_last_position + Y_distance = Y - Y_last_position + distance = sqrt(X_distance * X_distance + Y_distance * Y_distance) + X_last_position = X + Y_last_position = Y + #if (Z is not None): + # Z_distance = Z - Z_last_position + # if not(distance == 0.0): + # distance = sqrt(Z_distance * Z_distance + distance * distance ) + # else: + # distance = Z_distance + # Z_last_position = Z - if (feedrate == 0 or distance == 0): continue - - time_for_move = distance / feedrate - acceleration = feedrate / time_for_move - halfway_feedrate = acceleration * time_for_move / 2 - duration = halfway_feedrate * 2 / acceleration - - total_duration += duration + extra_cost_per_movement - - mod_minutes = total_duration % (60 * 60) - mod_seconds = mod_minutes % 60 - - return "{0:02d}h{1:02d}m".format(int((total_duration - mod_minutes) / (60 * 60)), int((mod_minutes - mod_seconds) / 60)) - + if (feedrate == 0.0 or distance == 0.0): continue + + time_for_move = distance / feedrate + total_duration += time_for_move + extra_cost_per_movement + if (F is not None): feedrate = F / 60.0 + return time.strftime('%H:%M:%S', time.gmtime(total_duration/60.0)) class Settings: #def _temperature_alias(self): return {"pla":210,"abs":230,"off":0} #def _temperature_validate(self,v):