private static WorkoutStepMesg CreateWorkoutStepSwim(int messageIndex, float distance, String name = null, String notes = null, Intensity intensity = Intensity.Active, SwimStroke swimStroke = SwimStroke.Invalid, WorkoutEquipment?equipment = null) { var workoutStepMesg = new WorkoutStepMesg(); workoutStepMesg.SetMessageIndex((ushort)messageIndex); if (name != null) { workoutStepMesg.SetWktStepName(name); } if (notes != null) { workoutStepMesg.SetNotes(notes); } workoutStepMesg.SetIntensity(intensity); workoutStepMesg.SetDurationType(WktStepDuration.Distance); workoutStepMesg.SetDurationDistance(distance); workoutStepMesg.SetTargetType(WktStepTarget.SwimStroke); workoutStepMesg.SetTargetStrokeType((byte)swimStroke); if (equipment.HasValue) { workoutStepMesg.SetEquipment(equipment); } return(workoutStepMesg); }
/// <summary> /// Set SwimStroke field /// Units: swim_stroke</summary> /// <param name="swimStroke_">Nullable field value to be set</param> public void SetSwimStroke(SwimStroke? swimStroke_) { SetFieldValue(43, 0, swimStroke_, Fit.SubfieldIndexMainField); }
static public void CreateLapSwimActivity() { // Example Swim Data representing a 500 yard pool swim using different strokes and drills. var swimData = new List <Dictionary <string, object> >() { new Dictionary <string, object>() { { "type", "Active" }, { "duration", 20U }, { "stroke", "Freestyle" }, { "strokes", 30U } }, new Dictionary <string, object>() { { "type", "Active" }, { "duration", 25U }, { "stroke", "Freestyle" }, { "strokes", 20U } }, new Dictionary <string, object>() { { "type", "Active" }, { "duration", 30U }, { "stroke", "Freestyle" }, { "strokes", 10U } }, new Dictionary <string, object>() { { "type", "Active" }, { "duration", 35U }, { "stroke", "Freestyle" }, { "strokes", 20U } }, new Dictionary <string, object>() { { "type", "Lap" } }, new Dictionary <string, object>() { { "type", "Idle" }, { "duration", 60U } }, new Dictionary <string, object>() { { "type", "Lap" } }, new Dictionary <string, object>() { { "type", "Active" }, { "duration", 20U }, { "stroke", "Backstroke" }, { "strokes", 30U } }, new Dictionary <string, object>() { { "type", "Active" }, { "duration", 25U }, { "stroke", "Backstroke" }, { "strokes", 20U } }, new Dictionary <string, object>() { { "type", "Active" }, { "duration", 30U }, { "stroke", "Backstroke" }, { "strokes", 10U } }, new Dictionary <string, object>() { { "type", "Active" }, { "duration", 35U }, { "stroke", "Backstroke" }, { "strokes", 20U } }, new Dictionary <string, object>() { { "type", "Lap" } }, new Dictionary <string, object>() { { "type", "Idle" }, { "duration", 60U } }, new Dictionary <string, object>() { { "type", "Lap" } }, new Dictionary <string, object>() { { "type", "Active" }, { "duration", 20U }, { "stroke", "Breaststroke" }, { "strokes", 30U } }, new Dictionary <string, object>() { { "type", "Active" }, { "duration", 25U }, { "stroke", "Breaststroke" }, { "strokes", 20U } }, new Dictionary <string, object>() { { "type", "Active" }, { "duration", 30U }, { "stroke", "Breaststroke" }, { "strokes", 10U } }, new Dictionary <string, object>() { { "type", "Active" }, { "duration", 35U }, { "stroke", "Breaststroke" }, { "strokes", 20U } }, new Dictionary <string, object>() { { "type", "Lap" } }, new Dictionary <string, object>() { { "type", "Idle" }, { "duration", 60U } }, new Dictionary <string, object>() { { "type", "Lap" } }, new Dictionary <string, object>() { { "type", "Active" }, { "duration", 20U }, { "stroke", "Butterfly" }, { "strokes", 30U } }, new Dictionary <string, object>() { { "type", "Active" }, { "duration", 25U }, { "stroke", "Butterfly" }, { "strokes", 20U } }, new Dictionary <string, object>() { { "type", "Active" }, { "duration", 30U }, { "stroke", "Butterfly" }, { "strokes", 10U } }, new Dictionary <string, object>() { { "type", "Active" }, { "duration", 35U }, { "stroke", "Butterfly" }, { "strokes", 20U } }, new Dictionary <string, object>() { { "type", "Lap" } }, new Dictionary <string, object>() { { "type", "Idle" }, { "duration", 60U } }, new Dictionary <string, object>() { { "type", "Lap" } }, new Dictionary <string, object>() { { "type", "Active" }, { "duration", 40U }, { "stroke", "Drill" } }, new Dictionary <string, object>() { { "type", "Active" }, { "duration", 40U }, { "stroke", "Drill" } }, new Dictionary <string, object>() { { "type", "Active" }, { "duration", 40U }, { "stroke", "Drill" } }, new Dictionary <string, object>() { { "type", "Active" }, { "duration", 40U }, { "stroke", "Drill" } }, new Dictionary <string, object>() { { "type", "Lap" } }, }; const string FileName = "ActivityEncodeRecipeLapSwim.fit"; var messages = new List <Mesg>(); // The starting timestamp for the activity var startTime = new Dynastream.Fit.DateTime(System.DateTime.UtcNow); // Timer Events are a BEST PRACTICE for FIT ACTIVITY files var eventMesgStart = new EventMesg(); eventMesgStart.SetTimestamp(startTime); eventMesgStart.SetEvent(Event.Timer); eventMesgStart.SetEventType(EventType.Start); messages.Add(eventMesgStart); // // Create a Length or Lap message for each item in the sample swim data. Calculate // distance, duration, and stroke count for each lap and the overall session. // // Session Accumulators uint sessionTotalElapsedTime = 0; float sessionDistance = 0; ushort sessionNumLengths = 0; ushort sessionNumActiveLengths = 0; ushort sessionTotalStrokes = 0; ushort sessionNumLaps = 0; // Lap accumulators uint lapTotalElapsedTime = 0; float lapDistance = 0; ushort lapNumActiveLengths = 0; ushort lapNumLengths = 0; ushort lapFirstLengthIndex = 0; ushort lapTotalStrokes = 0; var lapStartTime = new Dynastream.Fit.DateTime(startTime); var poolLength = 22.86f; var poolLengthUnit = DisplayMeasure.Statute; var timestamp = new Dynastream.Fit.DateTime(startTime); ushort messageIndex = 0; foreach (var swimLength in swimData) { string type = (string)swimLength["type"]; if (type.Equals("Lap")) { // Create a Lap message, set its fields, and write it to the file var lapMesg = new LapMesg(); lapMesg.SetMessageIndex(sessionNumLaps); lapMesg.SetTimestamp(timestamp); lapMesg.SetStartTime(lapStartTime); lapMesg.SetTotalElapsedTime(lapTotalElapsedTime); lapMesg.SetTotalTimerTime(lapTotalElapsedTime); lapMesg.SetTotalDistance(lapDistance); lapMesg.SetFirstLengthIndex(lapFirstLengthIndex); lapMesg.SetNumActiveLengths(lapNumActiveLengths); lapMesg.SetNumLengths(lapNumLengths); lapMesg.SetTotalStrokes(lapTotalStrokes); lapMesg.SetAvgStrokeDistance(lapDistance / lapTotalStrokes); lapMesg.SetSport(Sport.Swimming); lapMesg.SetSubSport(SubSport.LapSwimming); messages.Add(lapMesg); sessionNumLaps++; // Reset the Lap accumulators lapFirstLengthIndex = messageIndex; lapNumActiveLengths = 0; lapNumLengths = 0; lapTotalElapsedTime = 0; lapDistance = 0; lapTotalStrokes = 0; lapStartTime = new Dynastream.Fit.DateTime(timestamp); } else { uint duration = (uint)swimLength["duration"]; var lengthType = (LengthType)Enum.Parse(typeof(LengthType), type); // Create a Length message and its fields var lengthMesg = new LengthMesg(); lengthMesg.SetMessageIndex(messageIndex++); lengthMesg.SetStartTime(timestamp); lengthMesg.SetTotalElapsedTime(duration); lengthMesg.SetTotalTimerTime(duration); lengthMesg.SetLengthType(lengthType); timestamp.Add(duration); lengthMesg.SetTimestamp(timestamp); // Create the Record message that pairs with the Length Message var recordMesg = new RecordMesg(); recordMesg.SetTimestamp(timestamp); recordMesg.SetDistance(sessionDistance + poolLength); // Is this an Active Length? if (lengthType == LengthType.Active) { // Get the Active data from the model string stroke = swimLength.ContainsKey("stroke") ? (String)swimLength["stroke"] : "Freestyle"; uint strokes = swimLength.ContainsKey("strokes") ? (uint)swimLength["strokes"] : 0; SwimStroke swimStroke = (SwimStroke)Enum.Parse(typeof(SwimStroke), stroke); // Set the Active data on the Length Message lengthMesg.SetAvgSpeed(poolLength / (float)duration); lengthMesg.SetSwimStroke(swimStroke); if (strokes > 0) { lengthMesg.SetTotalStrokes((ushort)strokes); lengthMesg.SetAvgSwimmingCadence((byte)(strokes * 60U / duration)); } // Set the Active data on the Record Message recordMesg.SetSpeed(poolLength / (float)duration); if (strokes > 0) { recordMesg.SetCadence((byte)((strokes * 60U) / duration)); } // Increment the "Active" accumulators sessionNumActiveLengths++; lapNumActiveLengths++; sessionDistance += poolLength; lapDistance += poolLength; sessionTotalStrokes += (ushort)strokes; lapTotalStrokes += (ushort)strokes; } // Write the messages to the file messages.Add(recordMesg); messages.Add(lengthMesg); // Increment the "Total" accumulators sessionTotalElapsedTime += duration; lapTotalElapsedTime += duration; sessionNumLengths++; lapNumLengths++; } } // Timer Events are a BEST PRACTICE for FIT ACTIVITY files var eventMesgStop = new EventMesg(); eventMesgStop.SetTimestamp(timestamp); eventMesgStop.SetEvent(Event.Timer); eventMesgStop.SetEventType(EventType.StopAll); messages.Add(eventMesgStop); // Every FIT ACTIVITY file MUST contain at least one Session message var sessionMesg = new SessionMesg(); sessionMesg.SetMessageIndex(0); sessionMesg.SetTimestamp(timestamp); sessionMesg.SetStartTime(startTime); sessionMesg.SetTotalElapsedTime(sessionTotalElapsedTime); sessionMesg.SetTotalTimerTime(sessionTotalElapsedTime); sessionMesg.SetTotalDistance(sessionDistance); sessionMesg.SetSport(Sport.Swimming); sessionMesg.SetSubSport(SubSport.LapSwimming); sessionMesg.SetFirstLapIndex(0); sessionMesg.SetNumLaps(sessionNumLaps); sessionMesg.SetPoolLength(poolLength); sessionMesg.SetPoolLengthUnit(poolLengthUnit); sessionMesg.SetNumLengths(sessionNumLengths); sessionMesg.SetNumActiveLengths(sessionNumActiveLengths); sessionMesg.SetTotalStrokes(sessionTotalStrokes); sessionMesg.SetAvgStrokeDistance(sessionDistance / sessionTotalStrokes); messages.Add(sessionMesg); // Every FIT ACTIVITY file MUST contain EXACTLY one Activity message var activityMesg = new ActivityMesg(); activityMesg.SetTimestamp(timestamp); activityMesg.SetNumSessions(1); var timezoneOffset = (int)TimeZoneInfo.Local.BaseUtcOffset.TotalSeconds; activityMesg.SetLocalTimestamp((uint)((int)timestamp.GetTimeStamp() + timezoneOffset)); activityMesg.SetTotalTimerTime(sessionTotalElapsedTime); messages.Add(activityMesg); CreateActivityFile(messages, FileName, startTime); }