public Int32?GetInt32(int fieldDefinitionNumber) { var field = GetFieldByFieldDefinitionNumber(fieldDefinitionNumber); return(field == null ? (Int32?)null : FITUtil.ChangeEndianness(BitConverter.ToInt32(data, field.Position), definitionMessage.Architecture)); }
public DefinitionMessage(BinaryReader dataReader) { dataReader.ReadByte(); // reserved Architecture = dataReader.ReadByte(); GlobalMessageNumber = FITUtil.ChangeEndianness(dataReader.ReadUInt16(), Architecture); var numberOfFields = dataReader.ReadByte(); Fields = new Field[numberOfFields]; for (var i = 0; i < numberOfFields; i++) { Fields[i] = new Field() { FieldDefinitionNumber = dataReader.ReadByte(), Size = dataReader.ReadByte(), BaseType = dataReader.ReadByte(), Position = DataLength }; DataLength += Fields[i].Size; } }
public Data(BinaryReader reader, UInt32 dataSize) { Waypoints = new List <FITWaypoint>(); Laps = new List <FITLap>(); var bytes = reader.ReadBytes((int)dataSize); using (var stream = new MemoryStream(bytes)) { using (var dataReader = new BinaryReader(stream)) { var recordHeader = new RecordHeader(dataReader); if (!recordHeader.IsDefinitionMessage) { throw new Exception("First record is not a definition message."); } var def = new DefinitionMessage(dataReader); if (def.GlobalMessageNumber != (ushort)MesgNum.file_id) { throw new Exception("First record's global message number is not file_id."); } recordHeader = new RecordHeader(dataReader); if (recordHeader.IsDefinitionMessage) { throw new Exception("Encountered a definition message, but expected a data message."); } var d = new DataMessage(dataReader, def); var fileType = d.GetByte(0); if (fileType != 4) { throw new Exception("Not a FIT activity file."); } var messageTypeTranslator = new Dictionary <byte, DefinitionMessage>(); UInt32 lastTimestamp = 0; while (dataReader.BaseStream.Position < dataReader.BaseStream.Length) { recordHeader = new RecordHeader(dataReader); if (recordHeader.IsDefinitionMessage) { def = new DefinitionMessage(dataReader); FITUtil.AddOrReplace(messageTypeTranslator, recordHeader.LocalMessageType, def); } else { var currentDef = messageTypeTranslator[recordHeader.LocalMessageType]; d = new DataMessage(dataReader, currentDef); var timestamp = d.GetUInt32(253); if (timestamp == null) { timestamp = FITUtil.AddCompressedTimestamp(lastTimestamp, recordHeader.TimeOffset); } var time = FITUtil.ToDateTime(timestamp.Value); var gmn = currentDef.GlobalMessageNumber; if (gmn == (byte)MesgNum.record) { var lat = d.GetInt32(0); var lng = d.GetInt32(1); var alt = d.GetUInt16(2); var hr = d.GetByte(3); if (lng != null && lng != invalidInt32 && lat != null && lat != invalidInt32) { Waypoints.Add(new FITWaypoint() { Time = time, Latitude = positionFactor * lat.Value, Longitude = positionFactor * lng.Value, Altitude = alt == null || alt == invalidUInt16 ? (double?)null : (double)alt.Value / 5 - 500, HeartRate = hr == null || hr == invalidByte ? null : hr }); } } else if (gmn == (byte)MesgNum.lap) { Laps.Add(new FITLap() { Time = time }); } else if (gmn == 22) { } lastTimestamp = timestamp.Value; } } } } }