rustyfit 0.4.1

This project hosts the Rust implementation for The Flexible and Interoperable Data Transfer (FIT) Protocol
Documentation
// Code generated by fitgen/main.go. DO NOT EDIT.

// Copyright 2025 The RustyFIT Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

#![allow(unused, clippy::comparison_to_empty, clippy::manual_range_patterns)]

use crate::profile::{ProfileType, typedef};
use crate::proto::*;

#[derive(Debug, Clone)]
/// BarometerData is a BarometerData message.
pub struct BarometerData {
    /// Units: s; Whole second part of the timestamp
    pub timestamp: typedef::DateTime,
    /// Units: ms; Millisecond part of the timestamp.
    pub timestamp_ms: u16,
    /// Units: ms; Each time in the array describes the time at which the barometer sample with the corresponding index was taken. The samples may span across seconds. Array size must match the number of samples in baro_cal
    pub sample_time_offset: Vec<u16>,
    /// Units: Pa; These are the raw ADC reading. The samples may span across seconds. A conversion will need to be done on this data once read.
    pub baro_pres: Vec<u32>,
    /// unknown_fields are fields that are exist but they are not defined in Profile.xlsx
    pub unknown_fields: Vec<Field>,
    /// developer_fields are custom data fields (Added since protocol version 2.0)
    pub developer_fields: Vec<DeveloperField>,
}

impl BarometerData {
    /// Value's type: `u32`; Units: `s`
    pub const TIMESTAMP: u8 = 253;
    /// Value's type: `u16`; Units: `ms`
    pub const TIMESTAMP_MS: u8 = 0;
    /// Value's type: `Vec<u16>`; Units: `ms`
    pub const SAMPLE_TIME_OFFSET: u8 = 1;
    /// Value's type: `Vec<u32>`; Units: `Pa`
    pub const BARO_PRES: u8 = 2;

    /// Create new BarometerData with all fields being set to its corresponding invalid value.
    pub const fn new() -> Self {
        Self {
            timestamp: typedef::DateTime(u32::MAX),
            timestamp_ms: u16::MAX,
            sample_time_offset: Vec::<u16>::new(),
            baro_pres: Vec::<u32>::new(),
            unknown_fields: Vec::new(),
            developer_fields: Vec::new(),
        }
    }
}

impl Default for BarometerData {
    fn default() -> Self {
        Self::new()
    }
}

impl From<&Message> for BarometerData {
    /// from creates new BarometerData struct based on given mesg.
    fn from(mesg: &Message) -> Self {
        let mut vals: [&Value; 254] = [const { &Value::Invalid }; 254];

        const KNOWN_NUMS: [u64; 4] = [7, 0, 0, 2305843009213693952];
        let mut n = 0u64;
        for field in &mesg.fields {
            n += (KNOWN_NUMS[field.num as usize >> 6] >> (field.num & 63)) & 1 ^ 1
        }
        let mut unknown_fields: Vec<Field> = Vec::with_capacity(n as usize);

        for field in &mesg.fields {
            if (KNOWN_NUMS[field.num as usize >> 6] >> (field.num & 63)) & 1 == 0 {
                unknown_fields.push(field.clone());
                continue;
            }
            vals[field.num as usize] = &field.value;
        }

        Self {
            timestamp: typedef::DateTime(vals[253].as_u32()),
            timestamp_ms: vals[0].as_u16(),
            sample_time_offset: vals[1].as_vec_u16(),
            baro_pres: vals[2].as_vec_u32(),
            unknown_fields,
            developer_fields: mesg.developer_fields.clone(),
        }
    }
}

impl From<BarometerData> for Message {
    fn from(m: BarometerData) -> Self {
        let mut arr = [const {
            Field {
                num: 0,
                profile_type: ProfileType(0),
                value: Value::Invalid,
                is_expanded: false,
            }
        }; 4];
        let mut len = 0usize;

        if m.timestamp != typedef::DateTime(u32::MAX) {
            arr[len] = Field {
                num: 253,
                profile_type: ProfileType::DATE_TIME,
                value: Value::Uint32(m.timestamp.0),
                is_expanded: false,
            };
            len += 1;
        }
        if m.timestamp_ms != u16::MAX {
            arr[len] = Field {
                num: 0,
                profile_type: ProfileType::UINT16,
                value: Value::Uint16(m.timestamp_ms),
                is_expanded: false,
            };
            len += 1;
        }
        if m.sample_time_offset != Vec::<u16>::new() {
            arr[len] = Field {
                num: 1,
                profile_type: ProfileType::UINT16,
                value: Value::VecUint16(m.sample_time_offset),
                is_expanded: false,
            };
            len += 1;
        }
        if m.baro_pres != Vec::<u32>::new() {
            arr[len] = Field {
                num: 2,
                profile_type: ProfileType::UINT32,
                value: Value::VecUint32(m.baro_pres),
                is_expanded: false,
            };
            len += 1;
        }

        Message {
            header: 0,
            num: typedef::MesgNum::BAROMETER_DATA,
            fields: {
                let mut fields: Vec<Field> = Vec::with_capacity(len + m.unknown_fields.len());
                fields.extend_from_slice(&arr[..len]);
                fields.extend_from_slice(&m.unknown_fields);
                fields
            },
            developer_fields: m.developer_fields,
        }
    }
}