#!/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('--serial-number', required=True, help='Serial number (e.g., SN001234)') parser.add_argument('--software-version', required=True, help='Software version (git commit hash)') parser.add_argument('--comment', default='', help='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"Serial Number: {args.serial_number}") print(f"Software: {args.software_version}") if args.comment: print(f"Comment: {args.comment}") 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(), 'serial_number': args.serial_number, 'software_version': args.software_version, 'comment': args.comment }, '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()