diff --git a/src/graph_creators/graph_belts.py b/src/graph_creators/graph_belts.py index edbb316..ed4fd38 100644 --- a/src/graph_creators/graph_belts.py +++ b/src/graph_creators/graph_belts.py @@ -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)!') diff --git a/src/graph_creators/graph_shaper.py b/src/graph_creators/graph_shaper.py index aec74db..9b851c1 100644 --- a/src/graph_creators/graph_shaper.py +++ b/src/graph_creators/graph_shaper.py @@ -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!') diff --git a/src/graph_creators/graph_vibrations.py b/src/graph_creators/graph_vibrations.py index ff551ee..8462839 100644 --- a/src/graph_creators/graph_vibrations.py +++ b/src/graph_creators/graph_vibrations.py @@ -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 diff --git a/src/helpers/common_func.py b/src/helpers/common_func.py index 14b9a24..49831a5 100644 --- a/src/helpers/common_func.py +++ b/src/helpers/common_func.py @@ -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):