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.
master
Christopher Keller 2011-11-28 20:36:04 -08:00
parent 02f14d5090
commit cc40719e6c
1 changed files with 48 additions and 45 deletions

View File

@ -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):