better CSV file filtering
This commit is contained in:
@@ -457,8 +457,8 @@ def belts_calibration(lognames, klipperdir='~/klipper', max_freq=200.0, st_versi
|
||||
global shaper_calibrate
|
||||
shaper_calibrate = setup_klipper_import(klipperdir)
|
||||
|
||||
# Parse data
|
||||
datas = [parse_log(fn) for fn in lognames]
|
||||
# Parse data from the log files while ignoring CSV in the wrong format
|
||||
datas = [data for data in (parse_log(fn) for fn in lognames) if data is not None]
|
||||
if len(datas) > 2:
|
||||
raise ValueError('Incorrect number of .csv files used (this function needs exactly two files to compare them)!')
|
||||
|
||||
|
||||
@@ -299,8 +299,8 @@ def shaper_calibration(lognames, klipperdir='~/klipper', max_smoothing=None, scv
|
||||
global shaper_calibrate
|
||||
shaper_calibrate = setup_klipper_import(klipperdir)
|
||||
|
||||
# Parse data
|
||||
datas = [parse_log(fn) for fn in lognames]
|
||||
# Parse data from the log files while ignoring CSV in the wrong format
|
||||
datas = [data for data in (parse_log(fn) for fn in lognames) if data is not None]
|
||||
if len(datas) > 1:
|
||||
print_with_c_locale('Warning: incorrect number of .csv files detected. Only the first one will be used!')
|
||||
|
||||
|
||||
@@ -651,6 +651,8 @@ def vibrations_profile(
|
||||
|
||||
for logname in lognames:
|
||||
data = parse_log(logname)
|
||||
if data is None:
|
||||
continue # File is not in the expected format, skip it
|
||||
angle, speed = extract_angle_and_speed(logname)
|
||||
freq_response = calc_freq_response(data)
|
||||
first_freqs = freq_response.freq_bins
|
||||
|
||||
@@ -15,19 +15,47 @@ from scipy.signal import spectrogram
|
||||
|
||||
|
||||
def parse_log(logname):
|
||||
with open(logname) as f:
|
||||
for header in f:
|
||||
if not header.startswith('#'):
|
||||
break
|
||||
if not header.startswith('freq,psd_x,psd_y,psd_z,psd_xyz'):
|
||||
# Raw accelerometer data
|
||||
return np.loadtxt(logname, comments='#', delimiter=',')
|
||||
# Power spectral density data or shaper calibration data
|
||||
raise ValueError(
|
||||
'File %s does not contain raw accelerometer data and therefore '
|
||||
'is not supported by Shake&Tune. Please use the official Klipper '
|
||||
'script to process it instead.' % (logname,)
|
||||
)
|
||||
try:
|
||||
with open(logname) as f:
|
||||
header = None
|
||||
for line in f:
|
||||
cleaned_line = line.strip()
|
||||
|
||||
# Check for a PSD file generated by Klipper and raise a warning
|
||||
if cleaned_line.startswith('#freq,psd_x,psd_y,psd_z,psd_xyz'):
|
||||
print(
|
||||
'Warning: %s does not contain raw accelerometer data. '
|
||||
'Please use the official Klipper script to process it instead. '
|
||||
'It will be ignored by Shake&Tune!' % (logname,)
|
||||
)
|
||||
return None
|
||||
|
||||
# Check for the expected header for Shake&Tune (raw accelerometer data from Klipper)
|
||||
elif cleaned_line.startswith('#time,accel_x,accel_y,accel_z'):
|
||||
header = cleaned_line
|
||||
break
|
||||
|
||||
if not header:
|
||||
print(
|
||||
'Warning: file %s has an incorrect header and will be ignored by Shake&Tune!\n'
|
||||
"Expected '#time,accel_x,accel_y,accel_z', but got '%s'." % (logname, header.strip())
|
||||
)
|
||||
return None
|
||||
|
||||
# If we have the correct raw data header, proceed to load the data
|
||||
data = np.loadtxt(logname, comments='#', delimiter=',', skiprows=1)
|
||||
if data.ndim == 1 or data.shape[1] != 4:
|
||||
print(
|
||||
'Warning: %s does not have the correct data format; expected 4 columns. '
|
||||
'It will be ignored by Shake&Tune!' % (logname,)
|
||||
)
|
||||
return None
|
||||
|
||||
return data
|
||||
|
||||
except Exception as err:
|
||||
print(f'Error while reading {logname}: {err}. It will be ignored by Shake&Tune!')
|
||||
return None
|
||||
|
||||
|
||||
def setup_klipper_import(kdir):
|
||||
|
||||
Reference in New Issue
Block a user