diff --git a/src/androidTest/java/de/dennisguse/opentracks/io/file/exporter/FITv2TrackExporterTest.java b/src/androidTest/java/de/dennisguse/opentracks/io/file/exporter/FITv2TrackExporterTest.java new file mode 100644 index 000000000..6c6c70e0d --- /dev/null +++ b/src/androidTest/java/de/dennisguse/opentracks/io/file/exporter/FITv2TrackExporterTest.java @@ -0,0 +1,44 @@ +package de.dennisguse.opentracks.io.file.exporter; + +import org.junit.Test; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +public class FITv2TrackExporterTest { + + private final byte FIT_PROTOCOL_VERSION = 2 << 4 + 0; + private final short FIT_PROFILE_VERSION = 21 * 1000 + 158; + + private long checksum; + private final byte FILE_HEADER_SIZE = 14; + + @Test + public void run() { + ByteBuffer littleEndian = ByteBuffer + .allocate(FILE_HEADER_SIZE) + .order(ByteOrder.LITTLE_ENDIAN); + + littleEndian.put(0, FILE_HEADER_SIZE); + littleEndian.put(1, FIT_PROTOCOL_VERSION); + + // Profile version: 1513 + littleEndian.putShort(2, FIT_PROFILE_VERSION); + + // Data size: 32bit + littleEndian.putInt(4, 0); // We do not calculate the data size. + + // .FIT + littleEndian.putChar(8, '.'); + littleEndian.putChar(9, 'F'); + littleEndian.putChar(10, 'I'); + littleEndian.putChar(11, 'T'); + + // CRC (not implemented) + littleEndian.put(12, (byte) 0); + littleEndian.put(13, (byte) 0); + + var a = littleEndian.array(); + littleEndian.array(); + } +} \ No newline at end of file diff --git a/src/main/java/de/dennisguse/opentracks/io/file/exporter/FITv2TrackExporter.java b/src/main/java/de/dennisguse/opentracks/io/file/exporter/FITv2TrackExporter.java new file mode 100644 index 000000000..937029e4f --- /dev/null +++ b/src/main/java/de/dennisguse/opentracks/io/file/exporter/FITv2TrackExporter.java @@ -0,0 +1,74 @@ +package de.dennisguse.opentracks.io.file.exporter; + +import androidx.annotation.NonNull; +import androidx.annotation.VisibleForTesting; + +import java.io.OutputStream; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.nio.channels.Channels; +import java.nio.channels.WritableByteChannel; +import java.util.List; + +import de.dennisguse.opentracks.data.models.Track; + +/** + * FIT v2.0 + * https://developer.garmin.com/fit/ + *
+ * Encoding is little endian. + */ +public class FITv2TrackExporter implements TrackExporter { + + private final byte FIT_PROTOCOL_VERSION = 2 << 4 + 0; + private final short FIT_PROFILE_VERSION = 21 * 1000 + 158; + + private long checksum; + private final byte FILE_HEADER_SIZE = 14; + + + @Override + public boolean writeTrack(List