whitepeak.org

Fortius File Formats

Preamble

The following information has been obtained by dissecting the files using a hex editor and using a tool to study how the Tacx Analyser program reads the files. There are some gaps in the information - I do not know the purpose of every byte in the file, and some of my assumptions are no doubt wrong.

If you have any information which would help me fill in these gaps, or spot any errors, I'd be grateful if you could let me know.

I only have an i-Magic trainer, not a Fortius, so this data has been obtained from files created by an i-Magic trainer running the Fortius software. In theory it should apply to files created using a Fortius trainer as well.

Introduction

Fortius Catalyst run files, program files, virtual world (VR) run files and Real Life Video (RLV) definition files share a common structure.

At the start of the file there is an 8 byte header block. This includes a number indicating the file type and the number of blocks that follow.

Each data block comprises of a 12 byte info block, followed by the data itself. The info block contains the number of data records and the size of each record.

Wherever fields have units associated with them, such as weight, distance etc., the Tacx software stores the SI unit any only converts to the Imperial system for display purposes.

Data Types

I use .NET data types throughout; the following table gives sizes and explanations of each.

NameSize (Bytes)Comment
Byte1Byte
Char2Character (size can be 1 byte if the encoding is set to ASCII)
Int162Signed 16 bit integer
UInt162Unsigned 16 bit integer
Int324Signed 32 bit integer
Single4Single precision IEEE floating point number
UInt324Unsigned 32 bit integer
Double8Double precision IEEE floating point number

NB 1: The use of square brackets [] after a type indicates an array of that type. For example, Char[] is an array of char.

NB 2: Note that the size of the Char type depends on the encoding being used; in Fortius files this is always unicode, i.e. 2 bytes per character

The Header Block

An 8 byte block detailing the number of data blocks in the file, and a number indicating the type of file (i.e. whether it's a VR run file or a Catalyst one).

FieldOffset (bytes)Size (bytes).NET TypeNotes
FileFingerprint02Int161000 = Catalyst Program (.pgmf), 2000 = RLV (.rlv), 3000 = Catalyst Run (.caf), 4000 = VR Run (.imf)
FileVersion22Int16A 3 digit number indicating the file version, e.g. 100 or 110
BlockCount44Int32Number of blocks in the file
Total8

Note that a file fingerprint of 2000 will not occur in an RLV run file (which is a .caf file), but only in an .rlv file.

The Info Block

A 12 byte block giving the number and size of records in the following data.

FieldOffset (bytes)Size (bytes).NET TypeNotes
BlockFingerprint02Int16Identifies the data to follow
BlockVersion22Int16A 3 digit number indicating the block version, e.g. 100 or 110
RecordCount44Int32Number of records in the block
RecordSize84 Int32Size of each record in the block
Total12

The block fingerprints are listed below. Note that not all blocks appear in all files.

FingerprintBlock 
110Lap dataDetails
120NotesDetails
130Unknown RLVDetails
210Rider informationDetails
1010General informationDetails
1020ProgramDetails
2010RLV Video InfoDetails
2020RLV Frame/Distance MappingDetails
2030RLV InfoBox infoDetails
2040Course informationDetails
3010Ride informationDetails
3020Ride dataDetails
4010General informationDetails
4020Course dataDetails
4030Ride informationDetails
4040Ride dataDetails
6010RLV Multi-course informationDetails
6020RLV ItemMultiSectDetails