public static void ExportWorkoutToFIT(IWorkout workout, Stream exportStream, bool updateExportDate) { MemoryStream dataStream = new MemoryStream(); // Reserve size for header dataStream.Write(new Byte[12], 0, 12); // File id message FITMessage fileIdMessage = new FITMessage(FITGlobalMessageIds.FileId); FITMessageField fileType = new FITMessageField((Byte)FITFileIdFieldsIds.FileType); FITMessageField manufacturerId = new FITMessageField((Byte)FITFileIdFieldsIds.ManufacturerId); FITMessageField productId = new FITMessageField((Byte)FITFileIdFieldsIds.ProductId); FITMessageField serialNumber = new FITMessageField((Byte)FITFileIdFieldsIds.SerialNumber); FITMessageField exportDate = new FITMessageField((Byte)FITFileIdFieldsIds.ExportDate); FITMessageField number = new FITMessageField((Byte)FITFileIdFieldsIds.Number); fileType.SetEnum((Byte)FITFileTypes.Workout); manufacturerId.SetUInt16(1); productId.SetUInt16(20119); serialNumber.SetUInt32z(0); exportDate.SetUInt32(workout.CreationTimestamp); number.SetUInt16(0xFFFF); fileIdMessage.AddField(serialNumber); fileIdMessage.AddField(exportDate); fileIdMessage.AddField(manufacturerId); fileIdMessage.AddField(productId); fileIdMessage.AddField(number); fileIdMessage.AddField(fileType); fileIdMessage.Serialize(dataStream); // File creator message FITMessage fileCreatorMessage = new FITMessage(FITGlobalMessageIds.FileCreator); FITMessageField software = new FITMessageField((Byte)FITFileCreatorFieldsIds.SoftwareVersion); FITMessageField hardware = new FITMessageField((Byte)FITFileCreatorFieldsIds.HardwareVersion); software.SetUInt16(3605); hardware.SetUInt8(0); fileCreatorMessage.AddField(software); fileCreatorMessage.AddField(hardware); fileCreatorMessage.Serialize(dataStream); // Write workout workout.SerializeToFIT(dataStream); // Write FIT header at the start of the stream GarminFitnessByteRange headerSize = new GarminFitnessByteRange(12); GarminFitnessByteRange protocolVersion = new GarminFitnessByteRange((Byte)((FITConstants.FITProtocolMajorVersion << 4) | FITConstants.FITProtocolMinorVersion)); GarminFitnessUInt16Range profileVersion = new GarminFitnessUInt16Range((UInt16)((FITConstants.FITProfileMajorVersion * FITConstants.FITProfileMajorVersionMultiplier) + FITConstants.FITProfileMinorVersion)); GarminFitnessInt32Range dataSize = new GarminFitnessInt32Range(0); dataStream.Seek(0, SeekOrigin.Begin); dataSize.Value = (int)dataStream.Length - 12; headerSize.Serialize(dataStream); protocolVersion.Serialize(dataStream); profileVersion.Serialize(dataStream); dataSize.Serialize(dataStream); dataStream.Write(Encoding.UTF8.GetBytes(FITConstants.FITFileDescriptor), 0, 4); // Write CRC GarminFitnessUInt16Range crc = new GarminFitnessUInt16Range(FITUtils.ComputeStreamCRC(dataStream)); dataStream.Seek(0, SeekOrigin.End); crc.Serialize(dataStream); // Write all data to output stream exportStream.Write(dataStream.GetBuffer(), 0, (int)dataStream.Length); if (updateExportDate) { workout.LastExportDate = DateTime.Now; } }
public virtual void SerializeFITZonesTarget(Stream outputStream) { FITMessage zonesTargetMessage = new FITMessage(FITGlobalMessageIds.ZonesTarget); FITMessageField maxHR = new FITMessageField((Byte)FITZonesTargetFieldIds.MaxHR); FITMessageField FTP = new FITMessageField((Byte)FITZonesTargetFieldIds.FTP); FITMessageField HRCalcType = new FITMessageField((Byte)FITZonesTargetFieldIds.HRCalcType); FITMessageField powerCalcType = new FITMessageField((Byte)FITZonesTargetFieldIds.PowerCalcType); maxHR.SetUInt8(MaximumHeartRate); FTP.SetUInt16(0); HRCalcType.SetEnum((Byte)FITHRCalcTypes.Custom); powerCalcType.SetEnum((Byte)FITPowerCalcTypes.Custom); zonesTargetMessage.AddField(maxHR); zonesTargetMessage.AddField(FTP); zonesTargetMessage.AddField(HRCalcType); zonesTargetMessage.AddField(powerCalcType); zonesTargetMessage.Serialize(outputStream); }
public void SerializeToFITSettings(Stream outputStream) { FITMessage userProfileMessage = new FITMessage(FITGlobalMessageIds.UserProfile); FITMessageField profileName = new FITMessageField((Byte)FITUserProfileFieldIds.FriendlyName); FITMessageField gender = new FITMessageField((Byte)FITUserProfileFieldIds.Gender); FITMessageField weight = new FITMessageField((Byte)FITUserProfileFieldIds.Weight); FITMessageField restingHR = new FITMessageField((Byte)FITUserProfileFieldIds.RestingHR); profileName.SetString(ProfileName, (Byte)(Constants.MaxNameLength + 1)); userProfileMessage.AddField(profileName); gender.SetEnum(IsMale ? (Byte)FITGenders.Male : (Byte)FITGenders.Female); userProfileMessage.AddField(gender); weight.SetUInt16((UInt16)(WeightInKilos * 10)); userProfileMessage.AddField(weight); restingHR.SetUInt8(RestingHeartRate); userProfileMessage.AddField(restingHR); userProfileMessage.Serialize(outputStream); (m_ActivityProfiles[(int)GarminCategories.Biking] as GarminBikingActivityProfile).SerializeBikeProfiles(outputStream); }
public virtual void SerializeFITHRZones(Stream outputStream) { UInt16 i = 0; foreach (GarminFitnessValueRange<GarminFitnessDoubleRange> zone in m_HeartRateZones) { FITMessage zonesTargetMessage = new FITMessage(FITGlobalMessageIds.HRZones); FITMessageField index = new FITMessageField((Byte)FITHRZonesFieldIds.MessageIndex); FITMessageField zoneName = new FITMessageField((Byte)FITHRZonesFieldIds.Name); FITMessageField highBPM = new FITMessageField((Byte)FITHRZonesFieldIds.HighBPM); if (i == 0) { index.SetUInt16(i); zoneName.SetString(String.Format("HR Zone {0}", i), (Byte)(Constants.MaxNameLength + 1)); highBPM.SetUInt8((Byte)(zone.Lower * MaximumHeartRate)); zonesTargetMessage.AddField(index); zonesTargetMessage.AddField(zoneName); zonesTargetMessage.AddField(highBPM); zonesTargetMessage.Serialize(outputStream); zonesTargetMessage.Clear(); } index.SetUInt16((UInt16)(i + 1)); zoneName.SetString(String.Format("HR Zone {0}", i + 1), (Byte)(Constants.MaxNameLength + 1)); highBPM.SetUInt8((Byte)(zone.Upper * MaximumHeartRate)); zonesTargetMessage.AddField(index); zonesTargetMessage.AddField(zoneName); zonesTargetMessage.AddField(highBPM); zonesTargetMessage.Serialize(outputStream, false); ++i; } }