aboutsummaryrefslogtreecommitdiffstats
path: root/klippy/extras/angle.py
diff options
context:
space:
mode:
authorKevin O'Connor <kevin@koconnor.net>2023-12-16 23:26:42 -0500
committerKevin O'Connor <kevin@koconnor.net>2023-12-26 11:47:21 -0500
commit337013459303a220e1c3552583676c35b4800dd0 (patch)
treee26492dcd6d9c61e03502543a0bc941c4bac5803 /klippy/extras/angle.py
parent95c753292d7cb6f577e3ed2b644c2d84c7158e4a (diff)
downloadkutter-337013459303a220e1c3552583676c35b4800dd0.tar.gz
kutter-337013459303a220e1c3552583676c35b4800dd0.tar.xz
kutter-337013459303a220e1c3552583676c35b4800dd0.zip
bulk_sensor: Rework APIDumpHelper() to BatchBulkHelper()
The APIDumpHelper class is mainly intended to help process messages in batches. Rework the class methods to make that more clear. Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Diffstat (limited to 'klippy/extras/angle.py')
-rw-r--r--klippy/extras/angle.py51
1 files changed, 25 insertions, 26 deletions
diff --git a/klippy/extras/angle.py b/klippy/extras/angle.py
index 229e2946..0fe053df 100644
--- a/klippy/extras/angle.py
+++ b/klippy/extras/angle.py
@@ -410,6 +410,7 @@ BYTES_PER_SAMPLE = 3
SAMPLES_PER_BLOCK = 16
SAMPLE_PERIOD = 0.000400
+BATCH_UPDATES = 0.100
class Angle:
def __init__(self, config):
@@ -440,13 +441,14 @@ class Angle:
% (oid,), on_restart=True)
mcu.register_config_callback(self._build_config)
self.bulk_queue = bulk_sensor.BulkDataQueue(mcu, "spi_angle_data", oid)
- # API server endpoints
- self.api_dump = bulk_sensor.APIDumpHelper(
- self.printer, self._api_update, self._api_startstop, 0.100)
+ # Process messages in batches
+ self.batch_bulk = bulk_sensor.BatchBulkHelper(
+ self.printer, self._process_batch,
+ self._start_measurements, self._finish_measurements, BATCH_UPDATES)
self.name = config.get_name().split()[1]
api_resp = {'header': ('time', 'angle')}
- self.api_dump.add_mux_endpoint("angle/dump_angle", "sensor", self.name,
- api_resp)
+ self.batch_bulk.add_mux_endpoint("angle/dump_angle",
+ "sensor", self.name, api_resp)
def _build_config(self):
freq = self.mcu.seconds_to_clock(1.)
while float(TCODE_ERROR << self.time_shift) / freq < 0.002:
@@ -460,7 +462,9 @@ class Angle:
"spi_angle_end oid=%c sequence=%hu", oid=self.oid, cq=cmdqueue)
def get_status(self, eventtime=None):
return {'temperature': self.sensor_helper.last_temperature}
- # Measurement collection
+ def start_internal_client(self):
+ return self.batch_bulk.add_internal_client()
+ # Measurement decoding
def _extract_samples(self, raw_samples):
# Load variables to optimize inner loop below
sample_ticks = self.sample_ticks
@@ -516,19 +520,9 @@ class Angle:
self.last_angle = last_angle
del samples[count:]
return samples, error_count
- # API interface
- def _api_update(self, eventtime):
- if self.sensor_helper.is_tcode_absolute:
- self.sensor_helper.update_clock()
- raw_samples = self.bulk_queue.pull_samples()
- if not raw_samples:
- return {}
- samples, error_count = self._extract_samples(raw_samples)
- if not samples:
- return {}
- offset = self.calibration.apply_calibration(samples)
- return {'data': samples, 'errors': error_count,
- 'position_offset': offset}
+ # Start, stop, and process message batches
+ def _is_measuring(self):
+ return self.start_clock != 0
def _start_measurements(self):
logging.info("Starting angle '%s' measurements", self.name)
self.sensor_helper.start()
@@ -548,13 +542,18 @@ class Angle:
self.bulk_queue.clear_samples()
self.sensor_helper.last_temperature = None
logging.info("Stopped angle '%s' measurements", self.name)
- def _api_startstop(self, is_start):
- if is_start:
- self._start_measurements()
- else:
- self._finish_measurements()
- def start_internal_client(self):
- return self.api_dump.add_internal_client()
+ def _process_batch(self, eventtime):
+ if self.sensor_helper.is_tcode_absolute:
+ self.sensor_helper.update_clock()
+ raw_samples = self.bulk_queue.pull_samples()
+ if not raw_samples:
+ return {}
+ samples, error_count = self._extract_samples(raw_samples)
+ if not samples:
+ return {}
+ offset = self.calibration.apply_calibration(samples)
+ return {'data': samples, 'errors': error_count,
+ 'position_offset': offset}
def load_config_prefix(config):
return Angle(config)