Commit cc40719e authored by Christopher Keller's avatar Christopher Keller

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.
parent 02f14d50
...@@ -90,22 +90,26 @@ def get_coordinate_value(axis, parts): ...@@ -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): ...@@ -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):
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment