fix random Timer too close or Move queue overflow errors (#123)
This commit is contained in:
@@ -9,15 +9,18 @@
|
||||
# accelerometer measurements and write the data to a file in a blocking manner.
|
||||
|
||||
|
||||
import os
|
||||
import time
|
||||
|
||||
# from ..helpers.console_output import ConsoleOutput
|
||||
from multiprocessing import Process, Queue
|
||||
|
||||
|
||||
class Accelerometer:
|
||||
def __init__(self, klipper_accelerometer):
|
||||
self._k_accelerometer = klipper_accelerometer
|
||||
|
||||
self._bg_client = None
|
||||
self._write_queue = Queue()
|
||||
self._write_processes = []
|
||||
|
||||
@staticmethod
|
||||
def find_axis_accelerometer(printer, axis: str = 'xy'):
|
||||
@@ -32,7 +35,6 @@ class Accelerometer:
|
||||
def start_measurement(self):
|
||||
if self._bg_client is None:
|
||||
self._bg_client = self._k_accelerometer.start_internal_client()
|
||||
# ConsoleOutput.print('Accelerometer measurements started')
|
||||
else:
|
||||
raise ValueError('measurements already started!')
|
||||
|
||||
@@ -54,12 +56,30 @@ class Accelerometer:
|
||||
bg_client.finish_measurements()
|
||||
|
||||
filename = f'/tmp/shaketune-{name}.csv'
|
||||
self._write_to_file(bg_client, filename)
|
||||
# ConsoleOutput.print(f'Accelerometer measurements stopped. Data written to {filename}')
|
||||
self._queue_file_write(bg_client, filename)
|
||||
|
||||
def _queue_file_write(self, bg_client, filename):
|
||||
self._write_queue.put(filename)
|
||||
write_proc = Process(target=self._write_to_file, args=(bg_client, filename))
|
||||
write_proc.daemon = True
|
||||
write_proc.start()
|
||||
self._write_processes.append(write_proc)
|
||||
|
||||
def _write_to_file(self, bg_client, filename):
|
||||
try:
|
||||
os.nice(20)
|
||||
except Exception:
|
||||
pass
|
||||
with open(filename, 'w') as f:
|
||||
f.write('#time,accel_x,accel_y,accel_z\n')
|
||||
samples = bg_client.samples or bg_client.get_samples()
|
||||
for t, accel_x, accel_y, accel_z in samples:
|
||||
f.write(f'{t:.6f},{accel_x:.6f},{accel_y:.6f},{accel_z:.6f}\n')
|
||||
self._write_queue.get()
|
||||
|
||||
def wait_for_file_writes(self):
|
||||
while not self._write_queue.empty():
|
||||
time.sleep(0.1)
|
||||
for proc in self._write_processes:
|
||||
proc.join()
|
||||
self._write_processes = []
|
||||
|
||||
Reference in New Issue
Block a user