1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
// 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::manual_range_patterns)]
use crate::profile::{ProfileType, typedef};
use crate::proto::*;
use alloc::vec::Vec;
#[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::new(),
baro_pres: Vec::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 = [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>::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].to_vec_u16(),
baro_pres: vals[2].to_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.is_empty() {
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.is_empty() {
arr[len] = Field {
num: 2,
profile_type: ProfileType::UINT32,
value: Value::VecUint32(m.baro_pres),
is_expanded: false,
};
len += 1;
}
Self {
header: 0,
num: typedef::MesgNum::BAROMETER_DATA,
fields: {
let mut fields = Vec::<Field>::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,
}
}
}