aboutsummaryrefslogtreecommitdiffstats
path: root/scripts
diff options
context:
space:
mode:
authorKevin O'Connor <kevin@koconnor.net>2018-02-04 11:57:22 -0500
committerKevin O'Connor <kevin@koconnor.net>2018-02-05 11:38:13 -0500
commit8121a4a29f8940c8f6d0d34b494bdc117303f70e (patch)
tree9240ca4df82f6c605840a7cf0b32476475eaf195 /scripts
parentd1c209c689f15f99edce1f6adf160edee800a222 (diff)
downloadkutter-8121a4a29f8940c8f6d0d34b494bdc117303f70e.tar.gz
kutter-8121a4a29f8940c8f6d0d34b494bdc117303f70e.tar.xz
kutter-8121a4a29f8940c8f6d0d34b494bdc117303f70e.zip
avrsim: Rework pacing mechanism
Rework the pacing mechanism to make it more stable. Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Diffstat (limited to 'scripts')
-rwxr-xr-xscripts/avrsim.py24
1 files changed, 11 insertions, 13 deletions
diff --git a/scripts/avrsim.py b/scripts/avrsim.py
index afed444e..1d3d332a 100755
--- a/scripts/avrsim.py
+++ b/scripts/avrsim.py
@@ -1,10 +1,9 @@
#!/usr/bin/env python2
# Script to interact with simulavr by simulating a serial port.
#
-# Copyright (C) 2015 Kevin O'Connor <kevin@koconnor.net>
+# Copyright (C) 2015-2018 Kevin O'Connor <kevin@koconnor.net>
#
# This file may be distributed under the terms of the GNU GPLv3 license.
-
import sys, optparse, time, os, pty, fcntl, termios, errno
import pysimulavr
@@ -107,23 +106,22 @@ class Pacing(pysimulavr.PySimulationMember):
pysimulavr.PySimulationMember.__init__(self)
self.sc = pysimulavr.SystemClock.Instance()
self.pacing_rate = 1. / (rate * SIMULAVR_FREQ)
- self.rel_time = self.next_rel_time = time.time()
- self.rel_clock = self.next_rel_clock = self.sc.GetCurrentTime()
+ self.next_check_clock = 0
+ self.rel_time = time.time()
+ self.best_offset = 0.
self.delay = SIMULAVR_FREQ / 10000
self.sc.Add(self)
def DoStep(self, trueHwStep):
curtime = time.time()
clock = self.sc.GetCurrentTime()
- clock_diff = clock - self.rel_clock
- time_diff = curtime - self.rel_time
- offset = clock_diff * self.pacing_rate - time_diff
+ offset = clock * self.pacing_rate - (curtime - self.rel_time)
+ self.best_offset = max(self.best_offset, offset)
if offset > 0.000050:
- time.sleep(offset)
- if clock_diff > self.delay * 20:
- self.rel_clock = self.next_rel_clock
- self.rel_time = self.next_rel_time
- self.next_rel_clock = clock
- self.next_rel_time = curtime
+ time.sleep(offset - 0.000040)
+ if clock >= self.next_check_clock:
+ self.rel_time -= min(self.best_offset, 0.)
+ self.next_check_clock = clock + self.delay * 500
+ self.best_offset = -999999999.
return self.delay
# Forward data from a terminal device to the serial port pins