mirror of
https://github.com/sstent/Garmin_Analyser.git
synced 2026-01-25 08:35:12 +00:00
117 lines
3.7 KiB
Python
117 lines
3.7 KiB
Python
#!/usr/bin/env python3
|
|
"""Basic example of using Garmin Analyser to process workout files."""
|
|
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
# Add the parent directory to the path so we can import the package
|
|
sys.path.insert(0, str(Path(__file__).parent.parent))
|
|
|
|
from config.settings import Settings
|
|
from parsers.file_parser import FileParser
|
|
from analyzers.workout_analyzer import WorkoutAnalyzer
|
|
from visualizers.chart_generator import ChartGenerator
|
|
from visualizers.report_generator import ReportGenerator
|
|
|
|
|
|
def analyze_workout(file_path: str, output_dir: str = "output"):
|
|
"""Analyze a single workout file and generate reports."""
|
|
|
|
# Initialize components
|
|
settings = Settings()
|
|
parser = FileParser()
|
|
analyzer = WorkoutAnalyzer(settings.zones)
|
|
chart_gen = ChartGenerator()
|
|
report_gen = ReportGenerator(settings)
|
|
|
|
# Parse the workout file
|
|
print(f"Parsing workout file: {file_path}")
|
|
workout = parser.parse_file(Path(file_path))
|
|
|
|
if workout is None:
|
|
print("Failed to parse workout file")
|
|
return
|
|
|
|
print(f"Workout type: {workout.metadata.sport}")
|
|
print(f"Duration: {workout.metadata.duration}")
|
|
print(f"Start time: {workout.metadata.start_time}")
|
|
|
|
# Analyze the workout
|
|
print("Analyzing workout data...")
|
|
analysis = analyzer.analyze_workout(workout)
|
|
|
|
# Print basic summary
|
|
summary = analysis['summary']
|
|
print("\n=== WORKOUT SUMMARY ===")
|
|
print(f"Average Power: {summary.get('avg_power', 'N/A')} W")
|
|
print(f"Average Heart Rate: {summary.get('avg_heart_rate', 'N/A')} bpm")
|
|
print(f"Average Speed: {summary.get('avg_speed', 'N/A')} km/h")
|
|
print(f"Distance: {summary.get('distance', 'N/A')} km")
|
|
print(f"Elevation Gain: {summary.get('elevation_gain', 'N/A')} m")
|
|
print(f"Training Stress Score: {summary.get('training_stress_score', 'N/A')}")
|
|
|
|
# Generate charts
|
|
print("\nGenerating charts...")
|
|
output_path = Path(output_dir)
|
|
output_path.mkdir(exist_ok=True)
|
|
|
|
# Power curve
|
|
if 'power_curve' in analysis:
|
|
chart_gen.create_power_curve_chart(
|
|
analysis['power_curve'],
|
|
output_path / "power_curve.png"
|
|
)
|
|
print("Power curve saved to power_curve.png")
|
|
|
|
# Heart rate zones
|
|
if 'heart_rate_zones' in analysis:
|
|
chart_gen.create_heart_rate_zones_chart(
|
|
analysis['heart_rate_zones'],
|
|
output_path / "hr_zones.png"
|
|
)
|
|
print("Heart rate zones saved to hr_zones.png")
|
|
|
|
# Elevation profile
|
|
if workout.samples and any(s.elevation for s in workout.samples):
|
|
chart_gen.create_elevation_profile(
|
|
workout.samples,
|
|
output_path / "elevation_profile.png"
|
|
)
|
|
print("Elevation profile saved to elevation_profile.png")
|
|
|
|
# Generate report
|
|
print("\nGenerating report...")
|
|
report_gen.generate_report(
|
|
workout,
|
|
analysis,
|
|
output_path / "workout_report.html"
|
|
)
|
|
print("Report saved to workout_report.html")
|
|
|
|
return analysis
|
|
|
|
|
|
def main():
|
|
"""Main function for command line usage."""
|
|
if len(sys.argv) < 2:
|
|
print("Usage: python basic_analysis.py <workout_file> [output_dir]")
|
|
print("Example: python basic_analysis.py workout.fit")
|
|
sys.exit(1)
|
|
|
|
file_path = sys.argv[1]
|
|
output_dir = sys.argv[2] if len(sys.argv) > 2 else "output"
|
|
|
|
if not Path(file_path).exists():
|
|
print(f"File not found: {file_path}")
|
|
sys.exit(1)
|
|
|
|
try:
|
|
analyze_workout(file_path, output_dir)
|
|
print("\nAnalysis complete!")
|
|
except Exception as e:
|
|
print(f"Error during analysis: {e}")
|
|
sys.exit(1)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main() |