97 lines
3.5 KiB
Python
97 lines
3.5 KiB
Python
#!/usr/bin/env python3
|
|
import argparse
|
|
import yaml
|
|
from datetime import datetime
|
|
from pathlib import Path
|
|
import sys
|
|
|
|
sys.path.insert(0, str(Path(__file__).parent))
|
|
from src.audio_tests import run_single_test, run_latency_test
|
|
|
|
|
|
def main():
|
|
parser = argparse.ArgumentParser(description='Run PCB hardware audio tests')
|
|
parser.add_argument('--pcb-version', required=True, help='PCB version (e.g., v2.1)')
|
|
parser.add_argument('--pcb-revision', required=True, help='PCB revision (e.g., A, B, C)')
|
|
parser.add_argument('--software-version', required=True, help='Software version (git commit hash)')
|
|
parser.add_argument('--notes', default='', help='Adjustments or comments about this test')
|
|
parser.add_argument('--config', default='config.yaml', help='Path to config file')
|
|
|
|
args = parser.parse_args()
|
|
|
|
with open(args.config, 'r') as f:
|
|
config = yaml.safe_load(f)
|
|
|
|
timestamp = datetime.now()
|
|
test_id = timestamp.strftime('%Y%m%d_%H%M%S')
|
|
|
|
results_dir = Path(config['output']['results_dir'])
|
|
results_dir.mkdir(exist_ok=True)
|
|
|
|
test_output_dir = results_dir / test_id
|
|
test_output_dir.mkdir(exist_ok=True)
|
|
|
|
save_plots = config['output'].get('save_plots', False)
|
|
|
|
print(f"Starting audio test run: {test_id}")
|
|
print(f"PCB: {args.pcb_version} Rev {args.pcb_revision}")
|
|
print(f"Software: {args.software_version}")
|
|
if save_plots:
|
|
print(f"Plots will be saved to: {test_output_dir}")
|
|
print("-" * 60)
|
|
|
|
print("\n[1/2] Running chirp-based latency test (5 measurements)...")
|
|
try:
|
|
latency_stats = run_latency_test(config, num_measurements=5,
|
|
save_plots=save_plots, output_dir=test_output_dir)
|
|
print(f"✓ Latency: avg={latency_stats['avg']:.3f}ms, "
|
|
f"min={latency_stats['min']:.3f}ms, max={latency_stats['max']:.3f}ms")
|
|
except Exception as e:
|
|
print(f"✗ Error: {e}")
|
|
latency_stats = {'avg': 0.0, 'min': 0.0, 'max': 0.0, 'std': 0.0, 'error': str(e)}
|
|
|
|
print("\n[2/2] Running frequency sweep tests...")
|
|
test_results = []
|
|
frequencies = config['test_tones']['frequencies']
|
|
|
|
for i, freq in enumerate(frequencies, 1):
|
|
print(f"Testing frequency {i}/{len(frequencies)}: {freq} Hz...", end=' ', flush=True)
|
|
try:
|
|
result = run_single_test(freq, config, save_plots=save_plots, output_dir=test_output_dir)
|
|
test_results.append(result)
|
|
print("✓")
|
|
except Exception as e:
|
|
print(f"✗ Error: {e}")
|
|
test_results.append({
|
|
'frequency_hz': freq,
|
|
'error': str(e)
|
|
})
|
|
|
|
output_data = {
|
|
'metadata': {
|
|
'test_id': test_id,
|
|
'timestamp': timestamp.isoformat(),
|
|
'pcb_version': args.pcb_version,
|
|
'pcb_revision': args.pcb_revision,
|
|
'software_version': args.software_version,
|
|
'notes': args.notes
|
|
},
|
|
'latency_test': latency_stats,
|
|
'test_results': test_results
|
|
}
|
|
|
|
output_file = results_dir / f"{test_id}_results.yaml"
|
|
with open(output_file, 'w') as f:
|
|
yaml.dump(output_data, f, default_flow_style=False, sort_keys=False)
|
|
|
|
print("-" * 60)
|
|
print(f"✓ Test complete! Results saved to: {output_file}")
|
|
if save_plots:
|
|
print(f"✓ Plots saved to: {test_output_dir}/")
|
|
print(f"\nTo view results: python view_results.py {output_file}")
|
|
print(f"To view plots: ls {test_output_dir}/*.png")
|
|
|
|
|
|
if __name__ == '__main__':
|
|
main()
|