Trying to parse field definitions

main
Jacob Windle 2023-04-25 09:09:32 -04:00
parent 720e7cb28b
commit 475341ffb4
1 changed files with 22 additions and 2 deletions

View File

@ -30,10 +30,17 @@ mutable struct RecordHeader
local_mesg_type::Int64
end
struct FieldDefinition
number::UInt8
sz_bytes::UInt8
base_type::AbstractString # Defined in mesg_num.jl
end
mutable struct DefinitionBody
architecture::AbstractString
global_mesg_type::AbstractString # Read from mesg_num.jl using the bytes in this field.
num_fields::UInt8
field_definitions::Vector{FieldDefinition}
end
mutable struct DataBody
@ -123,6 +130,14 @@ function decode_header(v::Vector{UInt8})::RecordHeader
record
end
function parse_field(bytes::Vector{UInt8})::FieldDefinition
FieldDefinition(
bytes[1],
bytes[2],
get_field_definition_string(bytes[3])
)
end
"""
read_record_content!(f::FITFileReader, hdr::RecordHeader)::Union{DefinitionBody, DataBody}
@ -134,7 +149,11 @@ function read_record_content!(f::FITFileReader, hdr::RecordHeader)::Union{Defini
# Read the fixed 5 bytes first.
def_header_bytes = read_bytes!(f, 5)
def_header_fields = read_bytes!(f, def_header_bytes[end] * 3)
# Should always be a multiple of 3
# TODO: There is a missing byte here that complicates parsing
field_definitions = [parse_field(def_header_bytes[i:i+2]) for i 1:3:length(def_header_fields)]
# See if there is developer data
def_header_developer_flag = read_bytes!(f, 1)
if def_header_developer_flag[1] > 0x00
@ -148,7 +167,8 @@ function read_record_content!(f::FITFileReader, hdr::RecordHeader)::Union{Defini
DefinitionBody(
def_header_bytes[2] == 0 ? "littleendian" : "bigendian",
global_mesg_type,
def_header_bytes[end]
def_header_bytes[end],
field_definitions
)
end
end