rubyfit 0.0.5 → 0.0.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/ext/rubyfit/fit.c +82 -22
- data/ext/rubyfit/fit.h +75 -31
- data/ext/rubyfit/fit_config.h +3 -3
- data/ext/rubyfit/fit_convert.c +122 -18
- data/ext/rubyfit/fit_convert.h +49 -5
- data/ext/rubyfit/fit_crc.c +5 -5
- data/ext/rubyfit/fit_crc.h +5 -5
- data/ext/rubyfit/fit_example.c +501 -14
- data/ext/rubyfit/fit_example.h +3030 -485
- data/ext/rubyfit/fit_include.h +19 -0
- data/ext/rubyfit/fit_ram.c +3 -3
- data/ext/rubyfit/fit_ram.h +3 -3
- data/lib/rubyfit/version.rb +1 -1
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 33df17859113bfabf926430108e48e832a16609d
|
4
|
+
data.tar.gz: 67bf9d1069e605c1bd4fe8402c442a3eb9d55531
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c79dd06cb89f79330f458b2a7aae56cbd9dd7dbd30a1bfc7054931c960623b66097226a8c6a729e75dda582c4928d652438eadc4c82f631fbde07636652739f7
|
7
|
+
data.tar.gz: 5ba13d8485c785f17f2e25a90e940b04eb54272e099eea0f1167615acf432813e5b7023eb702c04679b62b2d098ee6cbdf03271151ff00ec309a6467570e0469
|
data/ext/rubyfit/fit.c
CHANGED
@@ -7,18 +7,17 @@
|
|
7
7
|
// warranties of merchantability, non-infringement, or fitness for a particular
|
8
8
|
// purpose, are specifically disclaimed.
|
9
9
|
//
|
10
|
-
// Copyright
|
10
|
+
// Copyright 2016 Dynastream Innovations Inc.
|
11
11
|
////////////////////////////////////////////////////////////////////////////////
|
12
12
|
// ****WARNING**** This file is auto-generated! Do NOT edit this file.
|
13
|
-
// Profile Version =
|
14
|
-
// Tag =
|
13
|
+
// Profile Version = 20.16Release
|
14
|
+
// Tag = production/akw/20.16.00-0-gce20b51
|
15
15
|
// Product = EXAMPLE
|
16
16
|
// Alignment = 4 bytes, padding disabled.
|
17
17
|
////////////////////////////////////////////////////////////////////////////////
|
18
18
|
|
19
19
|
|
20
20
|
#include "string.h"
|
21
|
-
#include "fit.h"
|
22
21
|
#include "fit_example.h"
|
23
22
|
|
24
23
|
|
@@ -42,8 +41,33 @@ const FIT_UINT8 fit_base_type_sizes[FIT_BASE_TYPES] =
|
|
42
41
|
sizeof(FIT_UINT16Z),
|
43
42
|
sizeof(FIT_UINT32Z),
|
44
43
|
sizeof(FIT_BYTE),
|
44
|
+
sizeof(FIT_SINT64),
|
45
|
+
sizeof(FIT_UINT64),
|
46
|
+
sizeof(FIT_UINT64Z),
|
45
47
|
};
|
46
48
|
|
49
|
+
|
50
|
+
typedef union
|
51
|
+
{
|
52
|
+
FIT_UINT8 uint8_value[8];
|
53
|
+
FIT_FLOAT64 float64_value;
|
54
|
+
FIT_FLOAT32 float32_value;
|
55
|
+
} FIT_INVALID_FLOAT;
|
56
|
+
|
57
|
+
static const FIT_INVALID_FLOAT invalid_float =
|
58
|
+
{
|
59
|
+
{
|
60
|
+
0xFF,
|
61
|
+
0xFF,
|
62
|
+
0xFF,
|
63
|
+
0xFF,
|
64
|
+
0xFF,
|
65
|
+
0xFF,
|
66
|
+
0xFF,
|
67
|
+
0xFF
|
68
|
+
}
|
69
|
+
};
|
70
|
+
|
47
71
|
const FIT_ENUM fit_enum_invalid = FIT_ENUM_INVALID;
|
48
72
|
const FIT_SINT8 fit_sint8_invalid = FIT_SINT8_INVALID;
|
49
73
|
const FIT_UINT8 fit_uint8_invalid = FIT_UINT8_INVALID;
|
@@ -52,12 +76,13 @@ const FIT_UINT16 fit_uint16_invalid = FIT_UINT16_INVALID;
|
|
52
76
|
const FIT_SINT32 fit_sint32_invalid = FIT_SINT32_INVALID;
|
53
77
|
const FIT_UINT32 fit_uint32_invalid = FIT_UINT32_INVALID;
|
54
78
|
const FIT_STRING fit_string_invalid = FIT_STRING_INVALID;
|
55
|
-
const FIT_FLOAT32 fit_float32_invalid = FIT_FLOAT32_INVALID;
|
56
|
-
const FIT_FLOAT64 fit_float64_invalid = FIT_FLOAT64_INVALID;
|
57
79
|
const FIT_UINT8Z fit_uint8z_invalid = FIT_UINT8Z_INVALID;
|
58
80
|
const FIT_UINT16Z fit_uint16z_invalid = FIT_UINT16Z_INVALID;
|
59
81
|
const FIT_UINT32Z fit_uint32z_invalid = FIT_UINT32Z_INVALID;
|
60
82
|
const FIT_BYTE fit_byte_invalid = FIT_BYTE_INVALID;
|
83
|
+
const FIT_SINT64 fit_sint64_invalid = FIT_SINT64_INVALID;
|
84
|
+
const FIT_UINT64 fit_uint64_invalid = FIT_UINT64_INVALID;
|
85
|
+
const FIT_UINT64Z fit_uint64z_invalid = FIT_UINT64Z_INVALID;
|
61
86
|
|
62
87
|
const FIT_CONST_UINT8_PTR fit_base_type_invalids[FIT_BASE_TYPES] =
|
63
88
|
{
|
@@ -69,12 +94,15 @@ const FIT_CONST_UINT8_PTR fit_base_type_invalids[FIT_BASE_TYPES] =
|
|
69
94
|
(FIT_CONST_UINT8_PTR)&fit_sint32_invalid,
|
70
95
|
(FIT_CONST_UINT8_PTR)&fit_uint32_invalid,
|
71
96
|
(FIT_CONST_UINT8_PTR)&fit_string_invalid,
|
72
|
-
(FIT_CONST_UINT8_PTR)&
|
73
|
-
(FIT_CONST_UINT8_PTR)&
|
97
|
+
(FIT_CONST_UINT8_PTR)&invalid_float.float32_value,
|
98
|
+
(FIT_CONST_UINT8_PTR)&invalid_float.float64_value,
|
74
99
|
(FIT_CONST_UINT8_PTR)&fit_uint8z_invalid,
|
75
100
|
(FIT_CONST_UINT8_PTR)&fit_uint16z_invalid,
|
76
101
|
(FIT_CONST_UINT8_PTR)&fit_uint32z_invalid,
|
77
102
|
(FIT_CONST_UINT8_PTR)&fit_byte_invalid,
|
103
|
+
(FIT_CONST_UINT8_PTR)&fit_sint64_invalid,
|
104
|
+
(FIT_CONST_UINT8_PTR)&fit_uint64_invalid,
|
105
|
+
(FIT_CONST_UINT8_PTR)&fit_uint64z_invalid,
|
78
106
|
};
|
79
107
|
|
80
108
|
|
@@ -101,6 +129,17 @@ const FIT_MESG_DEF *Fit_GetMesgDef(FIT_UINT16 global_mesg_num)
|
|
101
129
|
return (FIT_MESG_DEF *) FIT_NULL;
|
102
130
|
}
|
103
131
|
|
132
|
+
const FIT_MESG_DEF *Fit_GetMesgDefFromEnum(FIT_UINT32 fit_mesg_num)
|
133
|
+
{
|
134
|
+
//Verify enum in range
|
135
|
+
if (FIT_MESGS > fit_mesg_num)
|
136
|
+
{
|
137
|
+
return fit_mesg_defs[fit_mesg_num];
|
138
|
+
}
|
139
|
+
|
140
|
+
return (FIT_MESG_DEF *)FIT_NULL;
|
141
|
+
}
|
142
|
+
|
104
143
|
FIT_UINT16 Fit_GetMesgDefSize(const FIT_MESG_DEF *mesg_def)
|
105
144
|
{
|
106
145
|
if (mesg_def == FIT_NULL)
|
@@ -128,6 +167,25 @@ FIT_UINT8 Fit_GetMesgSize(FIT_UINT16 global_mesg_num)
|
|
128
167
|
return size;
|
129
168
|
}
|
130
169
|
|
170
|
+
FIT_UINT8 Fit_GetMesgSizeFromEnum(FIT_UINT32 fit_mesg_num)
|
171
|
+
{
|
172
|
+
const FIT_MESG_DEF *mesg_def;
|
173
|
+
FIT_UINT8 field;
|
174
|
+
FIT_UINT8 size = 0;
|
175
|
+
|
176
|
+
mesg_def = Fit_GetMesgDefFromEnum(fit_mesg_num);
|
177
|
+
|
178
|
+
if (mesg_def == FIT_NULL)
|
179
|
+
return 0;
|
180
|
+
|
181
|
+
for (field = 0; field < mesg_def->num_fields; field++)
|
182
|
+
{
|
183
|
+
size += mesg_def->fields[FIT_MESG_DEF_FIELD_OFFSET(size, field)];
|
184
|
+
}
|
185
|
+
|
186
|
+
return size;
|
187
|
+
}
|
188
|
+
|
131
189
|
FIT_BOOL Fit_InitMesg(const FIT_MESG_DEF *mesg_def, void *mesg)
|
132
190
|
{
|
133
191
|
FIT_UINT8 *mesg_buf = (FIT_UINT8 *) mesg;
|
@@ -183,12 +241,13 @@ FIT_FIELD_DEF Fit_GetFieldDef(const FIT_MESG_DEF *mesg_def, FIT_UINT8 field_def_
|
|
183
241
|
FIT_UINT8 field;
|
184
242
|
|
185
243
|
field_def.field_def_num = FIT_FIELD_NUM_INVALID;
|
244
|
+
field_def.size = 0;
|
245
|
+
field_def.base_type = FIT_BASE_TYPE_UINT8;
|
186
246
|
|
187
247
|
if (mesg_def != FIT_NULL)
|
188
248
|
{
|
189
249
|
for (field = 0; field < mesg_def->num_fields; field++)
|
190
250
|
{
|
191
|
-
|
192
251
|
if (mesg_def->fields[FIT_MESG_DEF_FIELD_OFFSET(field_def_num, field)] == field_def_num)
|
193
252
|
{
|
194
253
|
memcpy(&field_def, field_def_ptr, FIT_FIELD_DEF_SIZE);
|
@@ -213,24 +272,27 @@ FIT_UINT8 Fit_LookupMessage(FIT_UINT16 global_mesg_num, FIT_UINT16 message_index
|
|
213
272
|
FIT_UINT8 i;
|
214
273
|
|
215
274
|
*offset = 0;
|
216
|
-
|
275
|
+
|
217
276
|
if (read_header)
|
218
|
-
{
|
219
|
-
if(read_bytes_func(offset, FIT_STRUCT_OFFSET(header_size, FIT_FILE_HDR), sizeof(FIT_UINT8)) != sizeof(FIT_UINT8))
|
220
|
-
return FIT_UINT8_INVALID;
|
277
|
+
{
|
278
|
+
if(read_bytes_func(offset, FIT_STRUCT_OFFSET(header_size, FIT_FILE_HDR), sizeof(FIT_UINT8)) != sizeof(FIT_UINT8))
|
279
|
+
return FIT_UINT8_INVALID;
|
221
280
|
}
|
222
281
|
|
223
282
|
for (i = 0; i < FIT_MAX_LOCAL_MESGS; i++)
|
283
|
+
{
|
224
284
|
global_mesg_nums[i] = FIT_UINT16_INVALID;
|
285
|
+
sizes[i] = 0;
|
286
|
+
}
|
225
287
|
|
226
|
-
|
288
|
+
for (;;)
|
227
289
|
{
|
228
290
|
FIT_UINT8 header;
|
229
291
|
FIT_UINT8 local_mesg_num;
|
230
292
|
|
231
293
|
if (read_bytes_func(&header, *offset, sizeof(header)) != sizeof(header))
|
232
294
|
return FIT_UINT8_INVALID;
|
233
|
-
|
295
|
+
|
234
296
|
*offset += sizeof(header);
|
235
297
|
|
236
298
|
if ((header & (FIT_HDR_TIME_REC_BIT | FIT_HDR_TYPE_DEF_BIT)) == FIT_HDR_TYPE_DEF_BIT)
|
@@ -298,7 +360,7 @@ FIT_UINT8 Fit_LookupMessage(FIT_UINT16 global_mesg_num, FIT_UINT16 message_index
|
|
298
360
|
{
|
299
361
|
current_message_index++;
|
300
362
|
}
|
301
|
-
|
363
|
+
|
302
364
|
#if defined(FIT_MESSAGE_INDEX)
|
303
365
|
if ((message_index & FIT_MESSAGE_INDEX_MASK) == (current_message_index & FIT_MESSAGE_INDEX_MASK))
|
304
366
|
#else
|
@@ -320,7 +382,7 @@ FIT_UINT8 Fit_LookupMessage(FIT_UINT16 global_mesg_num, FIT_UINT16 message_index
|
|
320
382
|
|
321
383
|
FIT_UINT32 Fit_GetFileMesgOffset(const FIT_FILE_DEF *file_def, FIT_UINT16 mesg_num, FIT_UINT16 mesg_index)
|
322
384
|
{
|
323
|
-
FIT_UINT32 offset;
|
385
|
+
FIT_UINT32 offset = 0;
|
324
386
|
FIT_UINT16 i = 0;
|
325
387
|
|
326
388
|
while (i < file_def->mesg_count)
|
@@ -336,15 +398,13 @@ FIT_UINT32 Fit_GetFileMesgOffset(const FIT_FILE_DEF *file_def, FIT_UINT16 mesg_n
|
|
336
398
|
|
337
399
|
if (i >= file_def->mesg_count)
|
338
400
|
return FIT_UINT32_INVALID;
|
339
|
-
|
401
|
+
|
340
402
|
// Make sure mesg_index is valid for this mesg num and file definition
|
341
403
|
if (mesg_index >= file_def->mesgs[i].count)
|
342
404
|
return FIT_UINT32_INVALID;
|
343
|
-
|
344
|
-
i = 1 + Fit_GetMesgSize(mesg_num); // Message header byte + data.
|
345
405
|
|
346
|
-
|
347
|
-
|
406
|
+
// Compute size of each message (header byte + data)
|
407
|
+
i = FIT_HDR_SIZE + Fit_GetMesgSize(mesg_num);
|
348
408
|
|
349
409
|
offset += mesg_index * i;
|
350
410
|
|
data/ext/rubyfit/fit.h
CHANGED
@@ -7,11 +7,11 @@
|
|
7
7
|
// warranties of merchantability, non-infringement, or fitness for a particular
|
8
8
|
// purpose, are specifically disclaimed.
|
9
9
|
//
|
10
|
-
// Copyright
|
10
|
+
// Copyright 2016 Dynastream Innovations Inc.
|
11
11
|
////////////////////////////////////////////////////////////////////////////////
|
12
12
|
// ****WARNING**** This file is auto-generated! Do NOT edit this file.
|
13
|
-
// Profile Version =
|
14
|
-
// Tag =
|
13
|
+
// Profile Version = 20.16Release
|
14
|
+
// Tag = production/akw/20.16.00-0-gce20b51
|
15
15
|
// Product = EXAMPLE
|
16
16
|
// Alignment = 4 bytes, padding disabled.
|
17
17
|
////////////////////////////////////////////////////////////////////////////////
|
@@ -31,6 +31,8 @@
|
|
31
31
|
typedef signed short int16_t;
|
32
32
|
typedef unsigned long uint32_t;
|
33
33
|
typedef signed long int32_t;
|
34
|
+
typedef signed long long int64_t;
|
35
|
+
typedef unsigned long long uint64_t;
|
34
36
|
#endif
|
35
37
|
|
36
38
|
#if defined(__cplusplus)
|
@@ -42,18 +44,26 @@
|
|
42
44
|
// Version
|
43
45
|
///////////////////////////////////////////////////////////////////////
|
44
46
|
|
45
|
-
#define
|
46
|
-
#define
|
47
|
-
#define FIT_PROTOCOL_VERSION_MAJOR_SHIFT 4
|
48
|
-
#define FIT_PROTOCOL_VERSION_MAJOR_MASK ((FIT_UINT8) (0x0F << FIT_PROTOCOL_VERSION_MAJOR_SHIFT))
|
49
|
-
#define FIT_PROTOCOL_VERSION_MINOR_MASK ((FIT_UINT8) 0x0F)
|
50
|
-
#define FIT_PROTOCOL_VERSION ((FIT_UINT8) (FIT_PROTOCOL_VERSION_MAJOR << FIT_PROTOCOL_VERSION_MAJOR_SHIFT) | FIT_PROTOCOL_VERSION_MINOR)
|
47
|
+
#define FIT_PROTOCOL_VERSION_10 ( ( FIT_UINT8 )( 1 << FIT_PROTOCOL_VERSION_MAJOR_SHIFT ) | 0 )
|
48
|
+
#define FIT_PROTOCOL_VERSION_20 ( ( FIT_UINT8 )( 2 << FIT_PROTOCOL_VERSION_MAJOR_SHIFT ) | 0 )
|
51
49
|
|
52
|
-
#
|
53
|
-
#define
|
54
|
-
#define
|
55
|
-
#define
|
50
|
+
#if !defined(FIT_CPP_INCLUDE_C)
|
51
|
+
#define FIT_PROTOCOL_VERSION_MAJOR(version) ( ( FIT_UINT8 )( version >> FIT_PROTOCOL_VERSION_MAJOR_SHIFT ) )
|
52
|
+
#define FIT_PROTOCOL_VERSION_MINOR(version) ( ( FIT_UINT8 )( version & FIT_PROTOCOL_VERSION_MINOR_MASK ) )
|
53
|
+
#define FIT_PROTOCOL_VERSION_MAJOR_SHIFT 4
|
54
|
+
#define FIT_PROTOCOL_VERSION_MAJOR_MASK ((FIT_UINT8) (0x0F << FIT_PROTOCOL_VERSION_MAJOR_SHIFT))
|
55
|
+
#define FIT_PROTOCOL_VERSION_MINOR_MASK ((FIT_UINT8) 0x0F)
|
56
56
|
|
57
|
+
// Deprecated.
|
58
|
+
#define FIT_PROTOCOL_VERSION FIT_PROTOCOL_VERSION_10
|
59
|
+
|
60
|
+
#define FIT_PROTOCOL_VERSION_MAX FIT_PROTOCOL_VERSION_20
|
61
|
+
|
62
|
+
#define FIT_PROFILE_VERSION_MAJOR 20
|
63
|
+
#define FIT_PROFILE_VERSION_MINOR 16
|
64
|
+
#define FIT_PROFILE_VERSION_SCALE 100
|
65
|
+
#define FIT_PROFILE_VERSION ((FIT_UINT16) (FIT_PROFILE_VERSION_MAJOR * 100 + FIT_PROFILE_VERSION_MINOR))
|
66
|
+
#endif // !defined(FIT_CPP_INCLUDE_C)
|
57
67
|
|
58
68
|
///////////////////////////////////////////////////////////////////////
|
59
69
|
// Type Definitions
|
@@ -99,25 +109,23 @@ typedef uint32_t FIT_UINT32;
|
|
99
109
|
typedef const FIT_UINT32 * FIT_CONST_UINT32_PTR;
|
100
110
|
#define FIT_UINT32_INVALID ((FIT_UINT32)0xFFFFFFFF)
|
101
111
|
#define FIT_BASE_TYPE_UINT32 ((FIT_UINT8)0x86)
|
102
|
-
|
112
|
+
|
103
113
|
typedef char FIT_STRING; // UTF-8 null terminated string
|
104
114
|
typedef const FIT_STRING * FIT_CONST_STRING_PTR;
|
105
115
|
#define FIT_STRING_INVALID ((FIT_STRING)0x00)
|
106
116
|
#define FIT_BASE_TYPE_STRING ((FIT_UINT8)0x07)
|
107
117
|
|
108
|
-
|
109
|
-
typedef
|
110
|
-
|
111
|
-
#define
|
118
|
+
#if !defined(FIT_CPP_INCLUDE_C)
|
119
|
+
typedef float FIT_FLOAT32;
|
120
|
+
typedef const FIT_FLOAT32 * FIT_CONST_FLOAT32_PTR;
|
121
|
+
#define FIT_FLOAT32_INVALID ((FIT_FLOAT32)*((FIT_FLOAT32*)fit_base_type_invalids[FIT_BASE_TYPE_FLOAT32 & FIT_BASE_TYPE_NUM_MASK]))
|
122
|
+
#define FIT_BASE_TYPE_FLOAT32 ((FIT_UINT8)0x88)
|
112
123
|
|
113
|
-
typedef double FIT_FLOAT64;
|
114
|
-
typedef const FIT_FLOAT64 * FIT_CONST_FLOAT64_PTR;
|
115
|
-
#
|
116
|
-
|
117
|
-
#
|
118
|
-
#define FIT_FLOAT64_INVALID ((FIT_FLOAT64)0xFFFFFFFFFFFFFFFFull)
|
119
|
-
#endif
|
120
|
-
#define FIT_BASE_TYPE_FLOAT64 ((FIT_UINT8)0x89)
|
124
|
+
typedef double FIT_FLOAT64;
|
125
|
+
typedef const FIT_FLOAT64 * FIT_CONST_FLOAT64_PTR;
|
126
|
+
#define FIT_FLOAT64_INVALID ((FIT_FLOAT64)*((FIT_FLOAT64*)fit_base_type_invalids[FIT_BASE_TYPE_FLOAT64 & FIT_BASE_TYPE_NUM_MASK]))
|
127
|
+
#define FIT_BASE_TYPE_FLOAT64 ((FIT_UINT8)0x89)
|
128
|
+
#endif // !defined(FIT_CPP_INCLUDE_C)
|
121
129
|
|
122
130
|
typedef uint8_t FIT_UINT8Z;
|
123
131
|
typedef const FIT_UINT8Z * FIT_CONST_UINT8Z_PTR;
|
@@ -139,7 +147,22 @@ typedef const FIT_BYTE * FIT_CONST_BYTE_PTR;
|
|
139
147
|
#define FIT_BYTE_INVALID ((FIT_BYTE)0xFF) // Field is invalid if all bytes are invalid.
|
140
148
|
#define FIT_BASE_TYPE_BYTE ((FIT_UINT8)0x0D)
|
141
149
|
|
142
|
-
|
150
|
+
typedef int64_t FIT_SINT64;
|
151
|
+
typedef const FIT_SINT64 * FIT_CONST_SINT64_PTR;
|
152
|
+
#define FIT_SINT64_INVALID ((FIT_SINT64)0x7FFFFFFFFFFFFFFFL)
|
153
|
+
#define FIT_BASE_TYPE_SINT64 ((FIT_UINT8)0x8E)
|
154
|
+
|
155
|
+
typedef uint64_t FIT_UINT64;
|
156
|
+
typedef const FIT_UINT64 * FIT_CONST_UINT64_PTR;
|
157
|
+
#define FIT_UINT64_INVALID ((FIT_UINT64)0xFFFFFFFFFFFFFFFFL)
|
158
|
+
#define FIT_BASE_TYPE_UINT64 ((FIT_UINT8)0x8F)
|
159
|
+
|
160
|
+
typedef uint64_t FIT_UINT64Z;
|
161
|
+
typedef const FIT_UINT64Z * FIT_CONST_UINT64Z_PTR;
|
162
|
+
#define FIT_UINT64Z_INVALID ((FIT_UINT64Z)0x0000000000000000L)
|
163
|
+
#define FIT_BASE_TYPE_UINT64Z ((FIT_UINT8)0x90)
|
164
|
+
|
165
|
+
#define FIT_BASE_TYPES 17
|
143
166
|
|
144
167
|
typedef FIT_ENUM FIT_BOOL;
|
145
168
|
#define FIT_BOOL_INVALID FIT_ENUM_INVALID
|
@@ -168,6 +191,7 @@ typedef struct
|
|
168
191
|
} FIT_FILE_HDR;
|
169
192
|
|
170
193
|
#define FIT_FILE_HDR_SIZE 14
|
194
|
+
#define FIT_FILE_CRC_SIZE 2
|
171
195
|
|
172
196
|
|
173
197
|
///////////////////////////////////////////////////////////////////////
|
@@ -180,6 +204,7 @@ typedef struct
|
|
180
204
|
#define FIT_HDR_TIME_TYPE_SHIFT 5
|
181
205
|
#define FIT_HDR_TIME_OFFSET_MASK ((FIT_UINT8) 0x1F)
|
182
206
|
#define FIT_HDR_TYPE_DEF_BIT ((FIT_UINT8) 0x40)
|
207
|
+
#define FIT_HDR_DEV_DATA_BIT ((FIT_UINT8) 0x20)
|
183
208
|
#define FIT_HDR_TYPE_MASK ((FIT_UINT8) 0x0F)
|
184
209
|
#define FIT_MAX_LOCAL_MESGS (FIT_HDR_TYPE_MASK + 1)
|
185
210
|
|
@@ -187,7 +212,7 @@ typedef struct
|
|
187
212
|
// File Definitions
|
188
213
|
///////////////////////////////////////////////////////////////////////
|
189
214
|
|
190
|
-
typedef struct
|
215
|
+
typedef struct
|
191
216
|
{
|
192
217
|
FIT_UINT32 def_file_offset;
|
193
218
|
FIT_UINT32 data_file_offset;
|
@@ -196,7 +221,7 @@ typedef struct
|
|
196
221
|
FIT_UINT16 mesg;
|
197
222
|
} FIT_FILE_MESG;
|
198
223
|
|
199
|
-
typedef struct
|
224
|
+
typedef struct
|
200
225
|
{
|
201
226
|
FIT_UINT32 data_size;
|
202
227
|
const FIT_FILE_MESG *mesgs;
|
@@ -219,6 +244,15 @@ typedef struct
|
|
219
244
|
|
220
245
|
#define FIT_FIELD_DEF_SIZE 3
|
221
246
|
|
247
|
+
typedef struct
|
248
|
+
{
|
249
|
+
FIT_UINT8 def_num;
|
250
|
+
FIT_UINT8 size;
|
251
|
+
FIT_UINT8 dev_index;
|
252
|
+
} FIT_DEV_FIELD_DEF;
|
253
|
+
|
254
|
+
#define FIT_DEV_FIELD_DEF_SIZE 3
|
255
|
+
|
222
256
|
typedef struct
|
223
257
|
{
|
224
258
|
FIT_UINT8 reserved_1;
|
@@ -270,8 +304,8 @@ typedef struct
|
|
270
304
|
// Public Constants
|
271
305
|
///////////////////////////////////////////////////////////////////////
|
272
306
|
|
273
|
-
const
|
274
|
-
const
|
307
|
+
extern const FIT_UINT8 fit_base_type_sizes[FIT_BASE_TYPES];
|
308
|
+
extern const FIT_CONST_UINT8_PTR fit_base_type_invalids[FIT_BASE_TYPES];
|
275
309
|
|
276
310
|
|
277
311
|
///////////////////////////////////////////////////////////////////////
|
@@ -290,6 +324,11 @@ FIT_UINT8 Fit_GetArch(void);
|
|
290
324
|
///////////////////////////////////////////////////////////////////////
|
291
325
|
const FIT_MESG_DEF *Fit_GetMesgDef(FIT_UINT16 global_mesg_num);
|
292
326
|
|
327
|
+
///////////////////////////////////////////////////////////////////////
|
328
|
+
// Returns message definition corresponding to FIT_MESG enum.
|
329
|
+
///////////////////////////////////////////////////////////////////////
|
330
|
+
const FIT_MESG_DEF *Fit_GetMesgDefFromEnum(FIT_UINT32 fit_mesg_enum);
|
331
|
+
|
293
332
|
///////////////////////////////////////////////////////////////////////
|
294
333
|
// Returns the size of message definition.
|
295
334
|
///////////////////////////////////////////////////////////////////////
|
@@ -300,6 +339,11 @@ FIT_UINT16 Fit_GetMesgDefSize(const FIT_MESG_DEF *mesg_def);
|
|
300
339
|
///////////////////////////////////////////////////////////////////////
|
301
340
|
FIT_UINT8 Fit_GetMesgSize(FIT_UINT16 global_mesg_num);
|
302
341
|
|
342
|
+
///////////////////////////////////////////////////////////////////////
|
343
|
+
// Returns the size of message corresponding to FIT_MESG enum.
|
344
|
+
///////////////////////////////////////////////////////////////////////
|
345
|
+
FIT_UINT8 Fit_GetMesgSizeFromEnum(FIT_UINT32 fit_mesg_enum);
|
346
|
+
|
303
347
|
///////////////////////////////////////////////////////////////////////
|
304
348
|
// Initializes message with invalids.
|
305
349
|
// Returns 1 if successful, otherwise 0.
|
data/ext/rubyfit/fit_config.h
CHANGED
@@ -7,7 +7,7 @@
|
|
7
7
|
// warranties of merchantability, non-infringement, or fitness for a particular
|
8
8
|
// purpose, are specifically disclaimed.
|
9
9
|
//
|
10
|
-
// Copyright
|
10
|
+
// Copyright 2016 Dynastream Innovations Inc.
|
11
11
|
////////////////////////////////////////////////////////////////////////////////
|
12
12
|
|
13
13
|
|
@@ -19,9 +19,9 @@
|
|
19
19
|
extern "C" {
|
20
20
|
#endif
|
21
21
|
|
22
|
-
#define FIT_USE_STDINT_H // Define to use stdint.h types. By default size in bytes of integer types assumed to be char=1, short=2, long=4.
|
22
|
+
#define FIT_USE_STDINT_H // Define to use stdint.h types. By default size in bytes of integer types assumed to be char=1, short=2, long=4.
|
23
23
|
|
24
|
-
#define FIT_LOCAL_MESGS 16 // 1-16. Sets maximum number of local messages that can be decoded. Lower to minimize RAM requirements.
|
24
|
+
#define FIT_LOCAL_MESGS 16 // 1-16. Sets maximum number of local messages that can be decoded. Lower to minimize RAM requirements.
|
25
25
|
#define FIT_ARCH_ENDIAN FIT_ARCH_ENDIAN_LITTLE // Set to correct endian for build architecture.
|
26
26
|
|
27
27
|
#define FIT_CONVERT_CHECK_CRC // Define to check file crc.
|
data/ext/rubyfit/fit_convert.c
CHANGED
@@ -7,11 +7,11 @@
|
|
7
7
|
// warranties of merchantability, non-infringement, or fitness for a particular
|
8
8
|
// purpose, are specifically disclaimed.
|
9
9
|
//
|
10
|
-
// Copyright
|
10
|
+
// Copyright 2016 Dynastream Innovations Inc.
|
11
11
|
////////////////////////////////////////////////////////////////////////////////
|
12
12
|
// ****WARNING**** This file is auto-generated! Do NOT edit this file.
|
13
|
-
// Profile Version =
|
14
|
-
// Tag =
|
13
|
+
// Profile Version = 20.16Release
|
14
|
+
// Tag = production/akw/20.16.00-0-gce20b51
|
15
15
|
// Product = EXAMPLE
|
16
16
|
// Alignment = 4 bytes, padding disabled.
|
17
17
|
////////////////////////////////////////////////////////////////////////////////
|
@@ -71,6 +71,20 @@
|
|
71
71
|
#else
|
72
72
|
FIT_CONVERT_RETURN FitConvert_Read(const void *data, FIT_UINT32 size)
|
73
73
|
#endif
|
74
|
+
{
|
75
|
+
#if defined(FIT_CONVERT_MULTI_THREAD)
|
76
|
+
return FitConvert_ReadExt(state, data, size, FIT_FALSE);
|
77
|
+
#else
|
78
|
+
return FitConvert_ReadExt(data, size, FIT_FALSE);
|
79
|
+
#endif
|
80
|
+
}
|
81
|
+
|
82
|
+
///////////////////////////////////////////////////////////////////////
|
83
|
+
#if defined(FIT_CONVERT_MULTI_THREAD)
|
84
|
+
FIT_CONVERT_RETURN FitConvert_ReadExt(FIT_CONVERT_STATE *state, const void *data, FIT_UINT32 size, FIT_BOOL return_message_numbers)
|
85
|
+
#else
|
86
|
+
FIT_CONVERT_RETURN FitConvert_ReadExt(const void *data, FIT_UINT32 size, FIT_BOOL return_message_numbers)
|
87
|
+
#endif
|
74
88
|
{
|
75
89
|
while (state->data_offset < size)
|
76
90
|
{
|
@@ -129,9 +143,10 @@
|
|
129
143
|
return FIT_CONVERT_DATA_TYPE_NOT_SUPPORTED;
|
130
144
|
#endif
|
131
145
|
|
132
|
-
if ((state->u.file_hdr.protocol_version
|
146
|
+
if (FIT_PROTOCOL_VERSION_MAJOR(state->u.file_hdr.protocol_version) >
|
147
|
+
FIT_PROTOCOL_VERSION_MAJOR(FIT_PROTOCOL_VERSION_MAX))
|
133
148
|
return FIT_CONVERT_PROTOCOL_VERSION_NOT_SUPPORTED;
|
134
|
-
|
149
|
+
|
135
150
|
state->decode_state = FIT_CONVERT_DECODE_RECORD;
|
136
151
|
}
|
137
152
|
break;
|
@@ -163,8 +178,16 @@
|
|
163
178
|
}
|
164
179
|
else
|
165
180
|
{
|
181
|
+
state->has_dev_data = FIT_FALSE;
|
166
182
|
// This is a message definition record.
|
183
|
+
if ((datum & FIT_HDR_DEV_DATA_BIT) != 0)
|
184
|
+
{
|
185
|
+
// This message has Dev Data
|
186
|
+
state->has_dev_data = FIT_TRUE;
|
187
|
+
}
|
188
|
+
|
167
189
|
state->mesg_sizes[state->mesg_index] = 0;
|
190
|
+
state->dev_data_sizes[state->mesg_index] = 0;
|
168
191
|
state->decode_state = FIT_CONVERT_DECODE_RESERVED1;
|
169
192
|
}
|
170
193
|
}
|
@@ -242,12 +265,22 @@
|
|
242
265
|
|
243
266
|
if (state->num_fields == 0)
|
244
267
|
{
|
245
|
-
state->decode_state =
|
268
|
+
state->decode_state = state->has_dev_data ?
|
269
|
+
FIT_CONVERT_DECODE_NUM_DEV_FIELDS : FIT_CONVERT_DECODE_RECORD;
|
246
270
|
break;
|
247
271
|
}
|
248
272
|
|
249
273
|
state->field_index = 0;
|
250
274
|
state->decode_state = FIT_CONVERT_DECODE_FIELD_DEF;
|
275
|
+
|
276
|
+
//Return That a message number has been found (The user can then optionally over-ride the mesg_def property on the state object
|
277
|
+
//to use the alternate message definition if needed.
|
278
|
+
if ( return_message_numbers )
|
279
|
+
{
|
280
|
+
//When this event is received, the consuming application can call "FitConvert_SetMessageDefinition"
|
281
|
+
//to override the message definition to use (for alternate message definitions).
|
282
|
+
return FIT_CONVERT_MESSAGE_NUMBER_FOUND;
|
283
|
+
}
|
251
284
|
break;
|
252
285
|
|
253
286
|
case FIT_CONVERT_DECODE_FIELD_DEF:
|
@@ -292,9 +325,9 @@
|
|
292
325
|
if (datum < state->convert_table[state->mesg_index].fields[state->convert_table[state->mesg_index].num_fields].size)
|
293
326
|
state->convert_table[state->mesg_index].fields[state->convert_table[state->mesg_index].num_fields].size = datum;
|
294
327
|
}
|
295
|
-
}
|
296
328
|
|
297
|
-
|
329
|
+
state->mesg_sizes[state->mesg_index] += datum;
|
330
|
+
}
|
298
331
|
|
299
332
|
state->decode_state = FIT_CONVERT_DECODE_FIELD_BASE_TYPE;
|
300
333
|
break;
|
@@ -309,9 +342,48 @@
|
|
309
342
|
state->field_index++;
|
310
343
|
|
311
344
|
if (state->field_index >= state->num_fields)
|
312
|
-
|
345
|
+
{
|
346
|
+
state->decode_state = state->has_dev_data ?
|
347
|
+
FIT_CONVERT_DECODE_NUM_DEV_FIELDS : FIT_CONVERT_DECODE_RECORD;
|
348
|
+
}
|
313
349
|
else
|
350
|
+
{
|
314
351
|
state->decode_state = FIT_CONVERT_DECODE_FIELD_DEF;
|
352
|
+
}
|
353
|
+
break;
|
354
|
+
|
355
|
+
case FIT_CONVERT_DECODE_NUM_DEV_FIELDS:
|
356
|
+
state->num_fields = datum;
|
357
|
+
|
358
|
+
if (state->num_fields == 0)
|
359
|
+
{
|
360
|
+
state->decode_state = FIT_CONVERT_DECODE_RECORD;
|
361
|
+
break;
|
362
|
+
}
|
363
|
+
|
364
|
+
state->field_index = 0;
|
365
|
+
state->decode_state = FIT_CONVERT_DECODE_DEV_FIELD_DEF;
|
366
|
+
break;
|
367
|
+
|
368
|
+
case FIT_CONVERT_DECODE_DEV_FIELD_DEF:
|
369
|
+
// Doesn't matter yet
|
370
|
+
state->decode_state = FIT_CONVERT_DECODE_DEV_FIELD_SIZE;
|
371
|
+
break;
|
372
|
+
|
373
|
+
case FIT_CONVERT_DECODE_DEV_FIELD_SIZE:
|
374
|
+
// Just keep track of the amount of data that we need to ignore
|
375
|
+
state->dev_data_sizes[state->mesg_index] += datum;
|
376
|
+
state->decode_state = FIT_CONVERT_DECODE_DEV_FIELD_INDEX;
|
377
|
+
break;
|
378
|
+
|
379
|
+
case FIT_CONVERT_DECODE_DEV_FIELD_INDEX:
|
380
|
+
// Increment the number of fields that we have read
|
381
|
+
state->field_index++;
|
382
|
+
|
383
|
+
if (state->field_index >= state->num_fields)
|
384
|
+
state->decode_state = FIT_CONVERT_DECODE_RECORD;
|
385
|
+
else
|
386
|
+
state->decode_state = FIT_CONVERT_DECODE_DEV_FIELD_DEF;
|
315
387
|
break;
|
316
388
|
|
317
389
|
case FIT_CONVERT_DECODE_FIELD_DATA:
|
@@ -319,7 +391,15 @@
|
|
319
391
|
|
320
392
|
if (state->mesg_offset >= state->mesg_sizes[state->mesg_index])
|
321
393
|
{
|
322
|
-
state->
|
394
|
+
if (state->dev_data_sizes[state->mesg_index] > 0)
|
395
|
+
{
|
396
|
+
// There is dev data to read
|
397
|
+
state->decode_state = FIT_CONVERT_DECODE_DEV_FIELD_DATA;
|
398
|
+
}
|
399
|
+
else
|
400
|
+
{
|
401
|
+
state->decode_state = FIT_CONVERT_DECODE_RECORD;
|
402
|
+
}
|
323
403
|
}
|
324
404
|
|
325
405
|
if (state->mesg_index < FIT_LOCAL_MESGS)
|
@@ -368,13 +448,13 @@
|
|
368
448
|
if (state->convert_table[state->mesg_index].fields[state->field_index].base_type == FIT_BASE_TYPE_STRING)
|
369
449
|
{
|
370
450
|
FIT_UINT8 length = state->convert_table[state->mesg_index].fields[state->field_index].size;
|
371
|
-
FIT_UINT8 index = 0;
|
372
|
-
|
451
|
+
FIT_UINT8 index = 0;
|
452
|
+
|
373
453
|
while (index < length)
|
374
454
|
{
|
375
455
|
FIT_UINT8 char_size;
|
376
456
|
FIT_UINT8 size_mask = 0x80;
|
377
|
-
|
457
|
+
|
378
458
|
if (field[index] & size_mask)
|
379
459
|
{
|
380
460
|
char_size = 0;
|
@@ -389,7 +469,7 @@
|
|
389
469
|
{
|
390
470
|
char_size = 1;
|
391
471
|
}
|
392
|
-
|
472
|
+
|
393
473
|
if ((FIT_UINT16)(index + char_size) > length)
|
394
474
|
{
|
395
475
|
while (index < length)
|
@@ -398,11 +478,11 @@
|
|
398
478
|
}
|
399
479
|
break;
|
400
480
|
}
|
401
|
-
|
481
|
+
|
402
482
|
index += char_size;
|
403
483
|
}
|
404
484
|
}
|
405
|
-
|
485
|
+
|
406
486
|
state->field_offset = 0; // Reset the offset.
|
407
487
|
state->field_index++; // Move on to the next field.
|
408
488
|
|
@@ -423,8 +503,12 @@
|
|
423
503
|
}
|
424
504
|
#endif
|
425
505
|
|
426
|
-
|
427
|
-
|
506
|
+
state->field_index = 0;
|
507
|
+
if ( state->dev_data_sizes[state->mesg_index] == 0 )
|
508
|
+
{
|
509
|
+
// We have successfully decoded a mesg and there is no dev data to read.
|
510
|
+
return FIT_CONVERT_MESSAGE_AVAILABLE;
|
511
|
+
}
|
428
512
|
}
|
429
513
|
}
|
430
514
|
}
|
@@ -432,6 +516,18 @@
|
|
432
516
|
}
|
433
517
|
break;
|
434
518
|
|
519
|
+
case FIT_CONVERT_DECODE_DEV_FIELD_DATA:
|
520
|
+
state->field_offset++;
|
521
|
+
if (state->field_offset >= state->dev_data_sizes[state->mesg_index])
|
522
|
+
{
|
523
|
+
// Done Parsing Dev Field Data
|
524
|
+
state->decode_state = FIT_CONVERT_DECODE_RECORD;
|
525
|
+
|
526
|
+
// We have successfully decoded a mesg and there is no dev data to read.
|
527
|
+
return FIT_CONVERT_MESSAGE_AVAILABLE;
|
528
|
+
}
|
529
|
+
break;
|
530
|
+
|
435
531
|
default:
|
436
532
|
// This shouldn't happen.
|
437
533
|
return FIT_CONVERT_ERROR;
|
@@ -442,6 +538,14 @@
|
|
442
538
|
return FIT_CONVERT_CONTINUE;
|
443
539
|
}
|
444
540
|
|
541
|
+
///////////////////////////////////////////////////////////////////////
|
542
|
+
#if !defined(FIT_CONVERT_MULTI_THREAD)
|
543
|
+
void FitConvert_SetMessageDefinition(FIT_MESG_DEF *mesg_def)
|
544
|
+
{
|
545
|
+
state->mesg_def = mesg_def;
|
546
|
+
}
|
547
|
+
#endif
|
548
|
+
|
445
549
|
///////////////////////////////////////////////////////////////////////
|
446
550
|
#if defined(FIT_CONVERT_MULTI_THREAD)
|
447
551
|
FIT_UINT16 FitConvert_GetMessageNumber(FIT_CONVERT_STATE *state)
|