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

@ -90,22 +90,26 @@ def get_coordinate_value(axis, parts):
def estimate_duration(g): def estimate_duration(g):
extra_cost_per_movement = 0.02 extra_cost_per_movement = 0.02
total_duration = 0 total_duration = 0.0
feedrate = 0 feedrate = 0.0
X_last_position = 0 avg_feedrate = 0.0
Y_last_position = 0 last_feedrate = 0.0
X_last_position = 0.0
Y_last_position = 0.0
Z_last_position = 0.0
for i in g: for i in g:
i=i.split(";")[0] 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 "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(" ") parts = i.split(" ")
X = get_coordinate_value("X", parts[1:]) X = get_coordinate_value("X", parts[1:])
Y = get_coordinate_value("Y", parts[1:]) Y = get_coordinate_value("Y", parts[1:])
#Z = get_coordinate_value("Z", parts[1:])
F = get_coordinate_value("F", parts[1:]) F = get_coordinate_value("F", parts[1:])
E = get_coordinate_value("E", parts[1:]) E = get_coordinate_value("E", parts[1:])
if (F is not None): if (F is not None):
feedrate = F / 60 feedrate = (last_feedrate + (F / 60.0))/2.0
distance = 0 distance = 0
if (X is None and Y is None and E is not None): if (X is None and Y is None and E is not None):
distance = abs(E) distance = abs(E)
@ -121,21 +125,20 @@ def estimate_duration(g):
distance = sqrt(X_distance * X_distance + Y_distance * Y_distance) distance = sqrt(X_distance * X_distance + Y_distance * Y_distance)
X_last_position = X X_last_position = X
Y_last_position = Y 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 if (feedrate == 0.0 or distance == 0.0): continue
time_for_move = distance / feedrate time_for_move = distance / feedrate
acceleration = feedrate / time_for_move total_duration += time_for_move + extra_cost_per_movement
halfway_feedrate = acceleration * time_for_move / 2 if (F is not None): feedrate = F / 60.0
duration = halfway_feedrate * 2 / acceleration return time.strftime('%H:%M:%S', time.gmtime(total_duration/60.0))
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))
class Settings: class Settings:
#def _temperature_alias(self): return {"pla":210,"abs":230,"off":0} #def _temperature_alias(self): return {"pla":210,"abs":230,"off":0}
#def _temperature_validate(self,v): #def _temperature_validate(self,v):