package de.saring.exerciseviewer.parser.impl.garminfit; import com.garmin.fit.Decode; import com.garmin.fit.MesgListener; import de.saring.exerciseviewer.core.EVException; import de.saring.exerciseviewer.data.EVExercise; import de.saring.exerciseviewer.parser.AbstractExerciseParser; import de.saring.exerciseviewer.parser.ExerciseParserInfo; import java.io.File; import java.io.FileInputStream; import java.io.IOException; /** * This ExerciseParser implementation is for reading Garmin FIT files (binary * format) which contain activity (exercise) data.<br> * The parser should support all devices which store their data in FIT format, * but it's only tested with Garmin Edge 500 files.<br> * The parser uses the Java library "fit.jar" from the official Garmin FIT SDK * (open source) for accessing the FIT file content.<br> * There's many more interesting data in FIT files (e.g. device informations, * user informations, heartrate zones, events), but it can't be stored in * EVExercises (not yet). * * @author Stefan Saring * @version 1.0 */ public class GarminFitParser extends AbstractExerciseParser { /** * Informations about this parser. */ private final ExerciseParserInfo info = new ExerciseParserInfo("Garmin FIT", new String[]{"fit", "FIT"}); @Override public ExerciseParserInfo getInfo() { return info; } @Override public EVExercise parseExercise(String filename) throws EVException { FitMessageListener mesgListener = new FitMessageListener(); readFitFile(filename, mesgListener); return mesgListener.getExercise(); } /** * Reads the specified FIT file and creates the appropriate EVExcercise. * * @param filename name of ther FIT file * @param mesgListener listener for creating the exercise from the messages */ private void readFitFile(String filename, MesgListener mesgListener) throws EVException { try (FileInputStream fis = new FileInputStream(new File(filename))) { new Decode().read(fis, mesgListener); } catch (IOException ioe) { throw new EVException("Failed to read FIT file '" + filename + "'...", ioe); } } }