using Klipper reactor for file write process handling
This commit is contained in:
@@ -13,10 +13,13 @@ import os
|
||||
import time
|
||||
from multiprocessing import Process, Queue
|
||||
|
||||
FILE_WRITE_TIMEOUT = 10 # seconds
|
||||
|
||||
|
||||
class Accelerometer:
|
||||
def __init__(self, klipper_accelerometer):
|
||||
def __init__(self, reactor, klipper_accelerometer):
|
||||
self._k_accelerometer = klipper_accelerometer
|
||||
self._reactor = reactor
|
||||
|
||||
self._bg_client = None
|
||||
self._write_queue = Queue()
|
||||
@@ -70,16 +73,35 @@ class Accelerometer:
|
||||
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)
|
||||
eventtime = self._reactor.monotonic()
|
||||
self._reactor.pause(eventtime + 0.1)
|
||||
|
||||
for proc in self._write_processes:
|
||||
proc.join()
|
||||
if proc is None:
|
||||
continue
|
||||
eventtime = self._reactor.monotonic()
|
||||
endtime = eventtime + FILE_WRITE_TIMEOUT
|
||||
complete = False
|
||||
while eventtime < endtime:
|
||||
eventtime = self._reactor.pause(eventtime + 0.05)
|
||||
if not proc.is_alive():
|
||||
complete = True
|
||||
break
|
||||
if not complete:
|
||||
raise TimeoutError(
|
||||
'Shake&Tune was not able to write the accelerometer data into the CSV file. '
|
||||
'This might be due to a slow SD card or a busy or full filesystem.'
|
||||
)
|
||||
|
||||
self._write_processes = []
|
||||
|
||||
Reference in New Issue
Block a user