public static void OnFieldDescriptionMesg(object sender, MesgEventArgs e) { FieldDescriptionValues values = new FieldDescriptionValues(); FieldDescriptionMesg mesg = (FieldDescriptionMesg)e.mesg; try { values._developerDataIndex = mesg.GetDeveloperDataIndex(); values._fieldDefinitionNumber = mesg.GetFieldDefinitionNumber(); values._fitBaseTypeId = mesg.GetFitBaseTypeId(); int num3 = mesg.GetNumFieldValues(3); values._fieldName = new string[num3]; values._units = new string[num3]; for (int i = 0; i < num3; i++) { values._fieldName[i] = (mesg.GetFieldNameAsString(i)); values._units[i] = (mesg.GetUnitsAsString(i)); } } catch (FitException exception) { Console.WriteLine("\tOnFileIDMesg Error {0}", exception.Message); Console.WriteLine("\t{0}", exception.InnerException); } DataManager.Instance.FieldDescriptionValues.Add(values); }
static void EncodeActivityFile() { // Generate some FIT messages var fileIdMesg = new FileIdMesg(); // Every FIT file MUST contain a 'File ID' message as the first message var developerIdMesg = new DeveloperDataIdMesg(); var fieldDescMesg = new FieldDescriptionMesg(); var records = new List <RecordMesg>(); byte[] appId = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 }; fileIdMesg.SetType(Dynastream.Fit.File.Activity); fileIdMesg.SetManufacturer(Manufacturer.Development); fileIdMesg.SetProduct(1); fileIdMesg.SetSerialNumber(12345); fileIdMesg.SetTimeCreated(new DateTime(621463080)); for (int i = 0; i < appId.Length; i++) { developerIdMesg.SetApplicationId(i, appId[i]); } developerIdMesg.SetDeveloperDataIndex(0); fieldDescMesg.SetDeveloperDataIndex(0); fieldDescMesg.SetFieldDefinitionNumber(0); fieldDescMesg.SetFitBaseTypeId(FitBaseType.Sint8); fieldDescMesg.SetFieldName(0, "doughnuts_earned"); fieldDescMesg.SetUnits(0, "doughnuts"); for (int i = 0; i < 3; i++) { var newRecord = new RecordMesg(); var doughnutsEarnedField = new DeveloperField(fieldDescMesg, developerIdMesg); newRecord.SetDeveloperField(doughnutsEarnedField); newRecord.SetHeartRate((byte)(140 + (i * 2))); newRecord.SetCadence((byte)(88 + (i * 2))); newRecord.SetDistance(510 + (i * 100)); newRecord.SetSpeed(2.8f + (i * 0.4f)); doughnutsEarnedField.SetValue(i + 1); records.Add(newRecord); } // Create file encode object Encode encodeDemo = new Encode(ProtocolVersion.V20); FileStream fitDest = new FileStream("ExampleActivity.fit", FileMode.Create, FileAccess.ReadWrite, FileShare.Read); // Write our header encodeDemo.Open(fitDest); // Encode each message, a definition message is automatically generated and output if necessary encodeDemo.Write(fileIdMesg); encodeDemo.Write(developerIdMesg); encodeDemo.Write(fieldDescMesg); encodeDemo.Write(records); // Update header datasize and file CRC encodeDemo.Close(); fitDest.Close(); Console.WriteLine("Encoded FIT file ExampleActivity.fit"); }
static public void CreateTimeBasedActivity() { const double TwoPI = Math.PI * 2.0; const double SemicirclesPerMeter = 107.173; const string FileName = "ActivityEncodeRecipe.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 the Developer Id message for the developer data fields. var developerIdMesg = new DeveloperDataIdMesg(); // It is a BEST PRACTICE to reuse the same Guid for all FIT files created by your platform byte[] appId = new Guid("00010203-0405-0607-0809-0A0B0C0D0E0F").ToByteArray(); for (int i = 0; i < appId.Length; i++) { developerIdMesg.SetApplicationId(i, appId[i]); } developerIdMesg.SetDeveloperDataIndex(0); developerIdMesg.SetApplicationVersion(110); messages.Add(developerIdMesg); // Create the Developer Data Field Descriptions var doughnutsFieldDescMesg = new FieldDescriptionMesg(); doughnutsFieldDescMesg.SetDeveloperDataIndex(0); doughnutsFieldDescMesg.SetFieldDefinitionNumber(0); doughnutsFieldDescMesg.SetFitBaseTypeId(FitBaseType.Float32); doughnutsFieldDescMesg.SetFieldName(0, "Doughnuts Earned"); doughnutsFieldDescMesg.SetUnits(0, "doughnuts"); doughnutsFieldDescMesg.SetNativeMesgNum(MesgNum.Session); messages.Add(doughnutsFieldDescMesg); FieldDescriptionMesg hrFieldDescMesg = new FieldDescriptionMesg(); hrFieldDescMesg.SetDeveloperDataIndex(0); hrFieldDescMesg.SetFieldDefinitionNumber(1); hrFieldDescMesg.SetFitBaseTypeId(FitBaseType.Uint8); hrFieldDescMesg.SetFieldName(0, "Heart Rate"); hrFieldDescMesg.SetUnits(0, "bpm"); hrFieldDescMesg.SetNativeFieldNum(RecordMesg.FieldDefNum.HeartRate); hrFieldDescMesg.SetNativeMesgNum(MesgNum.Record); messages.Add(hrFieldDescMesg); // Every FIT ACTIVITY file MUST contain Record messages var timestamp = new Dynastream.Fit.DateTime(startTime); // Create one hour (3600 seconds) of Record data for (uint i = 0; i <= 3600; i++) { // Create a new Record message and set the timestamp var recordMesg = new RecordMesg(); recordMesg.SetTimestamp(timestamp); // Fake Record Data of Various Signal Patterns recordMesg.SetDistance(i); // Ramp recordMesg.SetSpeed(1); // Flatline recordMesg.SetHeartRate((byte)((Math.Sin(TwoPI * (0.01 * i + 10)) + 1.0) * 127.0)); // Sine recordMesg.SetCadence((byte)(i % 255)); // Sawtooth recordMesg.SetPower((ushort)((i % 255) < 127 ? 150 : 250)); // Square recordMesg.SetAltitude((float)Math.Abs(((double)i % 255.0) - 127.0)); // Triangle recordMesg.SetPositionLat(0); recordMesg.SetPositionLong((int)Math.Round(i * SemicirclesPerMeter)); // Add a Developer Field to the Record Message var hrDevField = new DeveloperField(hrFieldDescMesg, developerIdMesg); recordMesg.SetDeveloperField(hrDevField); hrDevField.SetValue((byte)((Math.Sin(TwoPI * (0.01 * i + 10)) + 1.0) * 127.0)); // Sine // Write the Rercord message to the output stream messages.Add(recordMesg); // Increment the timestamp by one second timestamp.Add(1); } // 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 Lap message var lapMesg = new LapMesg(); lapMesg.SetMessageIndex(0); lapMesg.SetTimestamp(timestamp); lapMesg.SetStartTime(startTime); lapMesg.SetTotalElapsedTime(timestamp.GetTimeStamp() - startTime.GetTimeStamp()); lapMesg.SetTotalTimerTime(timestamp.GetTimeStamp() - startTime.GetTimeStamp()); messages.Add(lapMesg); // 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(timestamp.GetTimeStamp() - startTime.GetTimeStamp()); sessionMesg.SetTotalTimerTime(timestamp.GetTimeStamp() - startTime.GetTimeStamp()); sessionMesg.SetSport(Sport.StandUpPaddleboarding); sessionMesg.SetSubSport(SubSport.Generic); sessionMesg.SetFirstLapIndex(0); sessionMesg.SetNumLaps(1); // Add a Developer Field to the Session message var doughnutsEarnedDevField = new DeveloperField(doughnutsFieldDescMesg, developerIdMesg); doughnutsEarnedDevField.SetValue(sessionMesg.GetTotalElapsedTime() / 1200.0f); sessionMesg.SetDeveloperField(doughnutsEarnedDevField); 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(timestamp.GetTimeStamp() - startTime.GetTimeStamp()); messages.Add(activityMesg); CreateActivityFile(messages, FileName, startTime); }