rubyfit 0.0.2 → 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 64141f50e66fea97d5e3c78fbb7389f88b1276ef
4
+ data.tar.gz: 5b5fe0f8426a89efb7c386eb1a4a357f152108ac
5
+ SHA512:
6
+ metadata.gz: 8f519440065cf79423762fa2779b01e5a09b477370a8810e453461e5b4799a2e75a1ffbe295ec5e637bd2e3c7332d4b2c32f31be40a8ca3e8d9a29a2eb3e1750
7
+ data.tar.gz: 62f07c53fd8a423e316d2e23f3a26577e085fee98921bf421327d400abe2518ef1b318446742e093219490896b940ce514488ae361f5ee2f329488ae04075084
data/ext/rubyfit/fit.c CHANGED
@@ -1,19 +1,25 @@
1
1
  ////////////////////////////////////////////////////////////////////////////////
2
- // The following .FIT software provided may be used with .FIT devices only and
3
- // remains the copyrighted property of Dynastream Innovations Inc.
2
+ // The following FIT Protocol software provided may be used with FIT protocol
3
+ // devices only and remains the copyrighted property of Dynastream Innovations Inc.
4
4
  // The software is being provided on an "as-is" basis and as an accommodation,
5
5
  // and therefore all warranties, representations, or guarantees of any kind
6
6
  // (whether express, implied or statutory) including, without limitation,
7
7
  // warranties of merchantability, non-infringement, or fitness for a particular
8
8
  // purpose, are specifically disclaimed.
9
9
  //
10
- // Copyright 2008 Dynastream Innovations Inc.
11
- // All rights reserved. This software may not be reproduced by any means
12
- // without express written approval of Dynastream Innovations Inc.
10
+ // Copyright 2013 Dynastream Innovations Inc.
13
11
  ////////////////////////////////////////////////////////////////////////////////
12
+ // ****WARNING**** This file is auto-generated! Do NOT edit this file.
13
+ // Profile Version = 8.10Release
14
+ // Tag = $Name: AKW8_100 $
15
+ // Product = EXAMPLE
16
+ // Alignment = 4 bytes, padding disabled.
17
+ ////////////////////////////////////////////////////////////////////////////////
18
+
14
19
 
15
20
  #include "string.h"
16
- #include "fit_product.h"
21
+ #include "fit.h"
22
+ #include "fit_example.h"
17
23
 
18
24
 
19
25
  ///////////////////////////////////////////////////////////////////////
@@ -53,22 +59,22 @@ const FIT_UINT16Z fit_uint16z_invalid = FIT_UINT16Z_INVALID;
53
59
  const FIT_UINT32Z fit_uint32z_invalid = FIT_UINT32Z_INVALID;
54
60
  const FIT_BYTE fit_byte_invalid = FIT_BYTE_INVALID;
55
61
 
56
- const FIT_UINT8 *fit_base_type_invalids[FIT_BASE_TYPES] =
62
+ const FIT_CONST_UINT8_PTR fit_base_type_invalids[FIT_BASE_TYPES] =
57
63
  {
58
- (FIT_UINT8 *)&fit_enum_invalid,
59
- (FIT_UINT8 *)&fit_sint8_invalid,
60
- (FIT_UINT8 *)&fit_uint8_invalid,
61
- (FIT_UINT8 *)&fit_sint16_invalid,
62
- (FIT_UINT8 *)&fit_uint16_invalid,
63
- (FIT_UINT8 *)&fit_sint32_invalid,
64
- (FIT_UINT8 *)&fit_uint32_invalid,
65
- (FIT_UINT8 *)&fit_string_invalid,
66
- (FIT_UINT8 *)&fit_float32_invalid,
67
- (FIT_UINT8 *)&fit_float64_invalid,
68
- (FIT_UINT8 *)&fit_uint8z_invalid,
69
- (FIT_UINT8 *)&fit_uint16z_invalid,
70
- (FIT_UINT8 *)&fit_uint32z_invalid,
71
- (FIT_UINT8 *)&fit_byte_invalid,
64
+ (FIT_CONST_UINT8_PTR)&fit_enum_invalid,
65
+ (FIT_CONST_UINT8_PTR)&fit_sint8_invalid,
66
+ (FIT_CONST_UINT8_PTR)&fit_uint8_invalid,
67
+ (FIT_CONST_UINT8_PTR)&fit_sint16_invalid,
68
+ (FIT_CONST_UINT8_PTR)&fit_uint16_invalid,
69
+ (FIT_CONST_UINT8_PTR)&fit_sint32_invalid,
70
+ (FIT_CONST_UINT8_PTR)&fit_uint32_invalid,
71
+ (FIT_CONST_UINT8_PTR)&fit_string_invalid,
72
+ (FIT_CONST_UINT8_PTR)&fit_float32_invalid,
73
+ (FIT_CONST_UINT8_PTR)&fit_float64_invalid,
74
+ (FIT_CONST_UINT8_PTR)&fit_uint8z_invalid,
75
+ (FIT_CONST_UINT8_PTR)&fit_uint16z_invalid,
76
+ (FIT_CONST_UINT8_PTR)&fit_uint32z_invalid,
77
+ (FIT_CONST_UINT8_PTR)&fit_byte_invalid,
72
78
  };
73
79
 
74
80
 
@@ -82,7 +88,7 @@ FIT_UINT8 Fit_GetArch(void)
82
88
  return (*(FIT_UINT8 *)&arch);
83
89
  }
84
90
 
85
- const FIT_MESG_DEF *Fit_GetMesgDef(FIT_MESG_NUM global_mesg_num)
91
+ const FIT_MESG_DEF *Fit_GetMesgDef(FIT_UINT16 global_mesg_num)
86
92
  {
87
93
  FIT_UINT8 index;
88
94
 
@@ -103,7 +109,7 @@ FIT_UINT16 Fit_GetMesgDefSize(const FIT_MESG_DEF *mesg_def)
103
109
  return FIT_STRUCT_OFFSET(fields, FIT_MESG_DEF) + (FIT_UINT16)mesg_def->num_fields * FIT_FIELD_DEF_SIZE;
104
110
  }
105
111
 
106
- FIT_UINT8 Fit_GetMesgSize(FIT_MESG_NUM global_mesg_num)
112
+ FIT_UINT8 Fit_GetMesgSize(FIT_UINT16 global_mesg_num)
107
113
  {
108
114
  const FIT_MESG_DEF *mesg_def;
109
115
  FIT_UINT8 field;
@@ -170,7 +176,33 @@ FIT_UINT8 Fit_GetFieldOffset(const FIT_MESG_DEF *mesg_def, FIT_UINT8 field_def_n
170
176
  return FIT_UINT8_INVALID;
171
177
  }
172
178
 
173
- FIT_UINT8 Fit_LookupMessage(FIT_UINT16 global_mesg_num, FIT_UINT16 message_index, FIT_UINT32 *offset, FIT_READ_BYTES_FUNC read_bytes_func)
179
+ FIT_FIELD_DEF Fit_GetFieldDef(const FIT_MESG_DEF *mesg_def, FIT_UINT8 field_def_num)
180
+ {
181
+ FIT_FIELD_DEF field_def;
182
+ const FIT_UINT8 *field_def_ptr = mesg_def->fields;
183
+ FIT_UINT8 field;
184
+
185
+ field_def.field_def_num = FIT_FIELD_NUM_INVALID;
186
+
187
+ if (mesg_def != FIT_NULL)
188
+ {
189
+ for (field = 0; field < mesg_def->num_fields; field++)
190
+ {
191
+
192
+ if (mesg_def->fields[FIT_MESG_DEF_FIELD_OFFSET(field_def_num, field)] == field_def_num)
193
+ {
194
+ memcpy(&field_def, field_def_ptr, FIT_FIELD_DEF_SIZE);
195
+ break;
196
+ }
197
+
198
+ field_def_ptr += FIT_FIELD_DEF_SIZE;
199
+ }
200
+ }
201
+
202
+ return field_def;
203
+ }
204
+
205
+ FIT_UINT8 Fit_LookupMessage(FIT_UINT16 global_mesg_num, FIT_UINT16 message_index, FIT_UINT32 *offset, FIT_READ_BYTES_FUNC read_bytes_func, FIT_BOOL read_header)
174
206
  {
175
207
  FIT_UINT16 global_mesg_nums[FIT_MAX_LOCAL_MESGS];
176
208
  FIT_UINT8 sizes[FIT_MAX_LOCAL_MESGS];
@@ -181,6 +213,12 @@ FIT_UINT8 Fit_LookupMessage(FIT_UINT16 global_mesg_num, FIT_UINT16 message_index
181
213
  FIT_UINT8 i;
182
214
 
183
215
  *offset = 0;
216
+
217
+ 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;
221
+ }
184
222
 
185
223
  for (i = 0; i < FIT_MAX_LOCAL_MESGS; i++)
186
224
  global_mesg_nums[i] = FIT_UINT16_INVALID;
@@ -220,7 +258,7 @@ FIT_UINT8 Fit_LookupMessage(FIT_UINT16 global_mesg_num, FIT_UINT16 message_index
220
258
  return FIT_UINT8_INVALID;
221
259
 
222
260
  #if defined(FIT_MESSAGE_INDEX)
223
- if (field_def.field_def_num == FIT_MESSAGE_INDEX_FIELD_NUM)
261
+ if (field_def.field_def_num == FIT_FIELD_NUM_MESSAGE_INDEX)
224
262
  current_message_index_offset = current_size;
225
263
  #endif
226
264
 
@@ -279,3 +317,36 @@ FIT_UINT8 Fit_LookupMessage(FIT_UINT16 global_mesg_num, FIT_UINT16 message_index
279
317
  }
280
318
  }
281
319
  }
320
+
321
+ FIT_UINT32 Fit_GetFileMesgOffset(const FIT_FILE_DEF *file_def, FIT_UINT16 mesg_num, FIT_UINT16 mesg_index)
322
+ {
323
+ FIT_UINT32 offset;
324
+ FIT_UINT16 i = 0;
325
+
326
+ while (i < file_def->mesg_count)
327
+ {
328
+ if (mesg_num == file_def->mesgs[i].num)
329
+ {
330
+ offset = file_def->mesgs[i].data_file_offset;
331
+ break;
332
+ }
333
+
334
+ i++;
335
+ }
336
+
337
+ if (i >= file_def->mesg_count)
338
+ return FIT_UINT32_INVALID;
339
+
340
+ // Make sure mesg_index is valid for this mesg num and file definition
341
+ if (mesg_index >= file_def->mesgs[i].count)
342
+ return FIT_UINT32_INVALID;
343
+
344
+ i = 1 + Fit_GetMesgSize(mesg_num); // Message header byte + data.
345
+
346
+ if (FIT_ALIGNMENT > FIT_HDR_SIZE)
347
+ i += FIT_ALIGNMENT - FIT_HDR_SIZE;
348
+
349
+ offset += mesg_index * i;
350
+
351
+ return offset;
352
+ }
data/ext/rubyfit/fit.h CHANGED
@@ -1,15 +1,19 @@
1
1
  ////////////////////////////////////////////////////////////////////////////////
2
- // The following .FIT software provided may be used with .FIT devices only and
3
- // remains the copyrighted property of Dynastream Innovations Inc.
2
+ // The following FIT Protocol software provided may be used with FIT protocol
3
+ // devices only and remains the copyrighted property of Dynastream Innovations Inc.
4
4
  // The software is being provided on an "as-is" basis and as an accommodation,
5
5
  // and therefore all warranties, representations, or guarantees of any kind
6
6
  // (whether express, implied or statutory) including, without limitation,
7
7
  // warranties of merchantability, non-infringement, or fitness for a particular
8
8
  // purpose, are specifically disclaimed.
9
9
  //
10
- // Copyright 2008 Dynastream Innovations Inc.
11
- // All rights reserved. This software may not be reproduced by any means
12
- // without express written approval of Dynastream Innovations Inc.
10
+ // Copyright 2013 Dynastream Innovations Inc.
11
+ ////////////////////////////////////////////////////////////////////////////////
12
+ // ****WARNING**** This file is auto-generated! Do NOT edit this file.
13
+ // Profile Version = 8.10Release
14
+ // Tag = $Name: AKW8_100 $
15
+ // Product = EXAMPLE
16
+ // Alignment = 4 bytes, padding disabled.
13
17
  ////////////////////////////////////////////////////////////////////////////////
14
18
 
15
19
 
@@ -18,6 +22,17 @@
18
22
 
19
23
  #include "fit_config.h"
20
24
 
25
+ #if defined(FIT_USE_STDINT_H)
26
+ #include <stdint.h>
27
+ #else
28
+ typedef unsigned char uint8_t;
29
+ typedef signed char int8_t;
30
+ typedef unsigned short uint16_t;
31
+ typedef signed short int16_t;
32
+ typedef unsigned long uint32_t;
33
+ typedef signed long int32_t;
34
+ #endif
35
+
21
36
  #if defined(__cplusplus)
22
37
  extern "C" {
23
38
  #endif
@@ -34,6 +49,11 @@
34
49
  #define FIT_PROTOCOL_VERSION_MINOR_MASK ((FIT_UINT8) 0x0F)
35
50
  #define FIT_PROTOCOL_VERSION ((FIT_UINT8) (FIT_PROTOCOL_VERSION_MAJOR << FIT_PROTOCOL_VERSION_MAJOR_SHIFT) | FIT_PROTOCOL_VERSION_MINOR)
36
51
 
52
+ #define FIT_PROFILE_VERSION_MAJOR 8
53
+ #define FIT_PROFILE_VERSION_MINOR 10
54
+ #define FIT_PROFILE_VERSION_SCALE 100
55
+ #define FIT_PROFILE_VERSION ((FIT_UINT16) (FIT_PROFILE_VERSION_MAJOR * 100 + FIT_PROFILE_VERSION_MINOR))
56
+
37
57
 
38
58
  ///////////////////////////////////////////////////////////////////////
39
59
  // Type Definitions
@@ -45,60 +65,78 @@
45
65
  #define FIT_BASE_TYPE_RESERVED ((FIT_UINT8)0x60)
46
66
  #define FIT_BASE_TYPE_NUM_MASK ((FIT_UINT8)0x1F)
47
67
 
48
- typedef unsigned char FIT_ENUM;
68
+ typedef uint8_t FIT_ENUM;
69
+ typedef const FIT_ENUM * FIT_CONST_ENUM_PTR;
49
70
  #define FIT_ENUM_INVALID ((FIT_ENUM)0xFF)
50
71
  #define FIT_BASE_TYPE_ENUM ((FIT_UINT8)0x00)
51
72
 
52
- typedef signed char FIT_SINT8;
73
+ typedef int8_t FIT_SINT8;
74
+ typedef const FIT_SINT8 * FIT_CONST_SINT8_PTR;
53
75
  #define FIT_SINT8_INVALID ((FIT_SINT8)0x7F)
54
76
  #define FIT_BASE_TYPE_SINT8 ((FIT_UINT8)0x01)
55
77
 
56
- typedef unsigned char FIT_UINT8;
78
+ typedef uint8_t FIT_UINT8;
79
+ typedef const FIT_UINT8 * FIT_CONST_UINT8_PTR;
57
80
  #define FIT_UINT8_INVALID ((FIT_UINT8)0xFF)
58
81
  #define FIT_BASE_TYPE_UINT8 ((FIT_UINT8)0x02)
59
82
 
60
- typedef signed short FIT_SINT16;
83
+ typedef int16_t FIT_SINT16;
84
+ typedef const FIT_SINT16 * FIT_CONST_SINT16_PTR;
61
85
  #define FIT_SINT16_INVALID ((FIT_SINT16)0x7FFF)
62
86
  #define FIT_BASE_TYPE_SINT16 ((FIT_UINT8)0x83)
63
87
 
64
- typedef unsigned short FIT_UINT16;
88
+ typedef uint16_t FIT_UINT16;
89
+ typedef const FIT_UINT16 * FIT_CONST_UINT16_PTR;
65
90
  #define FIT_UINT16_INVALID ((FIT_UINT16)0xFFFF)
66
91
  #define FIT_BASE_TYPE_UINT16 ((FIT_UINT8)0x84)
67
92
 
68
- typedef signed long FIT_SINT32;
93
+ typedef int32_t FIT_SINT32;
94
+ typedef const FIT_SINT32 * FIT_CONST_SINT32_PTR;
69
95
  #define FIT_SINT32_INVALID ((FIT_SINT32)0x7FFFFFFF)
70
96
  #define FIT_BASE_TYPE_SINT32 ((FIT_UINT8)0x85)
71
97
 
72
- typedef unsigned long FIT_UINT32;
98
+ typedef uint32_t FIT_UINT32;
99
+ typedef const FIT_UINT32 * FIT_CONST_UINT32_PTR;
73
100
  #define FIT_UINT32_INVALID ((FIT_UINT32)0xFFFFFFFF)
74
101
  #define FIT_BASE_TYPE_UINT32 ((FIT_UINT8)0x86)
75
102
 
76
- typedef char FIT_STRING;
103
+ typedef char FIT_STRING; // UTF-8 null terminated string
104
+ typedef const FIT_STRING * FIT_CONST_STRING_PTR;
77
105
  #define FIT_STRING_INVALID ((FIT_STRING)0x00)
78
106
  #define FIT_BASE_TYPE_STRING ((FIT_UINT8)0x07)
79
107
 
80
108
  typedef float FIT_FLOAT32;
109
+ typedef const FIT_FLOAT32 * FIT_CONST_FLOAT32_PTR;
81
110
  #define FIT_FLOAT32_INVALID ((FIT_FLOAT32)0xFFFFFFFF)
82
111
  #define FIT_BASE_TYPE_FLOAT32 ((FIT_UINT8)0x88)
83
112
 
84
113
  typedef double FIT_FLOAT64;
85
- #define FIT_FLOAT64_INVALID ((FIT_FLOAT64)0xFFFFFFFFFFFFFFFFull)
114
+ typedef const FIT_FLOAT64 * FIT_CONST_FLOAT64_PTR;
115
+ #if defined (_BORLANDC_)
116
+ #define FIT_FLOAT64_INVALID ((FIT_FLOAT64)0xFFFFFFFFFFFFFFFFui64)
117
+ #else
118
+ #define FIT_FLOAT64_INVALID ((FIT_FLOAT64)0xFFFFFFFFFFFFFFFFull)
119
+ #endif
86
120
  #define FIT_BASE_TYPE_FLOAT64 ((FIT_UINT8)0x89)
87
121
 
88
- typedef unsigned char FIT_UINT8Z;
122
+ typedef uint8_t FIT_UINT8Z;
123
+ typedef const FIT_UINT8Z * FIT_CONST_UINT8Z_PTR;
89
124
  #define FIT_UINT8Z_INVALID ((FIT_UINT8Z)0x00)
90
125
  #define FIT_BASE_TYPE_UINT8Z ((FIT_UINT8)0x0A)
91
126
 
92
- typedef unsigned short FIT_UINT16Z;
127
+ typedef uint16_t FIT_UINT16Z;
128
+ typedef const FIT_UINT16Z * FIT_CONST_UINT16Z_PTR;
93
129
  #define FIT_UINT16Z_INVALID ((FIT_UINT16Z)0x0000)
94
130
  #define FIT_BASE_TYPE_UINT16Z ((FIT_UINT8)0x8B)
95
131
 
96
- typedef unsigned long FIT_UINT32Z;
132
+ typedef uint32_t FIT_UINT32Z;
133
+ typedef const FIT_UINT32Z * FIT_CONST_UINT32Z_PTR;
97
134
  #define FIT_UINT32Z_INVALID ((FIT_UINT32Z)0x00000000)
98
135
  #define FIT_BASE_TYPE_UINT32Z ((FIT_UINT8)0x8C)
99
136
 
100
- typedef unsigned char FIT_BYTE;
101
- #define FIT_BYTE_INVALID ((FIT_BYTE)0xFF)
137
+ typedef uint8_t FIT_BYTE;
138
+ typedef const FIT_BYTE * FIT_CONST_BYTE_PTR;
139
+ #define FIT_BYTE_INVALID ((FIT_BYTE)0xFF) // Field is invalid if all bytes are invalid.
102
140
  #define FIT_BASE_TYPE_BYTE ((FIT_UINT8)0x0D)
103
141
 
104
142
  #define FIT_BASE_TYPES 14
@@ -109,7 +147,7 @@ typedef FIT_ENUM FIT_BOOL;
109
147
  #define FIT_BOOL_TRUE ((FIT_BOOL)1)
110
148
  #define FIT_FALSE FIT_BOOL_FALSE
111
149
  #define FIT_TRUE FIT_BOOL_TRUE
112
- #define FIT_NULL ((void *) 0)
150
+ #define FIT_NULL 0
113
151
 
114
152
  typedef FIT_UINT32 (*FIT_READ_BYTES_FUNC)(void *, FIT_UINT32, FIT_UINT32);
115
153
  #define FIT_MESG_DEF_HEADER_SIZE FIT_STRUCT_OFFSET(fields, FIT_MESG_DEF)
@@ -123,19 +161,20 @@ typedef struct
123
161
  {
124
162
  FIT_UINT8 header_size; // FIT_FILE_HDR_SIZE (size of this structure)
125
163
  FIT_UINT8 protocol_version; // FIT_PROTOCOL_VERSION
126
- FIT_UINT8 profile_version_minor; // FIT_PROFILE_VERSION_MINOR
127
- FIT_UINT8 profile_version_major; // FIT_PROFILE_VERSION_MAJOR
164
+ FIT_UINT16 profile_version; // FIT_PROFILE_VERSION
128
165
  FIT_UINT32 data_size; // Does not include file header or crc. Little endian format.
129
166
  FIT_UINT8 data_type[4]; // ".FIT"
167
+ FIT_UINT16 crc; // CRC of this file header in little endian format.
130
168
  } FIT_FILE_HDR;
131
169
 
132
- #define FIT_FILE_HDR_SIZE 12
170
+ #define FIT_FILE_HDR_SIZE 14
171
+
133
172
 
134
173
  ///////////////////////////////////////////////////////////////////////
135
174
  // Record Definitions
136
175
  ///////////////////////////////////////////////////////////////////////
137
176
 
138
- #define FIT_HDR_SIZE 1
177
+ #define FIT_HDR_SIZE 1
139
178
  #define FIT_HDR_TIME_REC_BIT ((FIT_UINT8) 0x80)
140
179
  #define FIT_HDR_TIME_TYPE_MASK ((FIT_UINT8) 0x60)
141
180
  #define FIT_HDR_TIME_TYPE_SHIFT 5
@@ -144,6 +183,28 @@ typedef struct
144
183
  #define FIT_HDR_TYPE_MASK ((FIT_UINT8) 0x0F)
145
184
  #define FIT_MAX_LOCAL_MESGS (FIT_HDR_TYPE_MASK + 1)
146
185
 
186
+ ///////////////////////////////////////////////////////////////////////
187
+ // File Definitions
188
+ ///////////////////////////////////////////////////////////////////////
189
+
190
+ typedef struct
191
+ {
192
+ FIT_UINT32 def_file_offset;
193
+ FIT_UINT32 data_file_offset;
194
+ FIT_UINT16 num;
195
+ FIT_UINT16 count;
196
+ FIT_UINT16 mesg;
197
+ } FIT_FILE_MESG;
198
+
199
+ typedef struct
200
+ {
201
+ FIT_UINT32 data_size;
202
+ const FIT_FILE_MESG *mesgs;
203
+ FIT_UINT16 mesg_count;
204
+ FIT_UINT8 type;
205
+ FIT_UINT8 count;
206
+ } FIT_FILE_DEF;
207
+
147
208
 
148
209
  ///////////////////////////////////////////////////////////////////////
149
210
  // Message Definitions
@@ -156,7 +217,7 @@ typedef struct
156
217
  FIT_UINT8 base_type;
157
218
  } FIT_FIELD_DEF;
158
219
 
159
- #define FIT_FIELD_DEF_SIZE 3
220
+ #define FIT_FIELD_DEF_SIZE 3
160
221
 
161
222
  typedef struct
162
223
  {
@@ -170,8 +231,8 @@ typedef struct
170
231
  #define FIT_MAX_MESG_SIZE ((FIT_UINT8)255)
171
232
 
172
233
  #define FIT_ARCH_ENDIAN_MASK ((FIT_UINT8)0x01)
173
- #define FIT_ARCH_ENDIAN_LITTLE ((FIT_UINT8)0)
174
- #define FIT_ARCH_ENDIAN_BIG ((FIT_UINT8)1)
234
+ #define FIT_ARCH_ENDIAN_LITTLE 0
235
+ #define FIT_ARCH_ENDIAN_BIG 1
175
236
 
176
237
 
177
238
  ///////////////////////////////////////////////////////////////////////
@@ -180,18 +241,29 @@ typedef struct
180
241
 
181
242
  #define FIT_MAX_FIELD_SIZE ((FIT_UINT8)255)
182
243
  #define FIT_FIELD_NUM_INVALID ((FIT_UINT8)0xFF)
183
- #define FIT_MESSAGE_INDEX_FIELD_NUM ((FIT_UINT8)254)
184
- #define FIT_TIMESTAMP_FIELD_NUM ((FIT_UINT8)253)
244
+ #define FIT_FIELD_NUM_MESSAGE_INDEX ((FIT_UINT8)254)
245
+ #define FIT_FIELD_NUM_TIMESTAMP ((FIT_UINT8)253)
246
+
247
+ #define FIT_MESSAGE_INDEX_FIELD_NUM FIT_FIELD_NUM_MESSAGE_INDEX // For reverse compatibility only. Use FIT_FIELD_NUM_MESSAGE_INDEX instead.
248
+ #define FIT_TIMESTAMP_FIELD_NUM FIT_FIELD_NUM_TIMESTAMP // For reverse compatibility only. Use FIT_FIELD_NUM_TIMESTAMP instead.
185
249
 
186
250
 
187
251
  ///////////////////////////////////////////////////////////////////////
188
252
  // Macros
189
253
  ///////////////////////////////////////////////////////////////////////
190
254
 
191
- #define FIT_STRUCT_OFFSET(MEMBER, STRUCT_TYPE) ( ((FIT_UINT8 *) &(((STRUCT_TYPE *) FIT_NULL)->MEMBER)) - ((FIT_UINT8 *) (FIT_NULL)) ) // Computes the byte offset of a member in a file. Compiles to a constant.
192
- #define FIT_MESG_OFFSET(MESG_MEMBER, MESG_TYPE, MESG_INDEX, MESG_SIZE, FILE) (FIT_STRUCT_OFFSET(MESG_MEMBER, FILE) + MESG_INDEX * (FIT_HDR_SIZE + MESG_SIZE) + FIT_HDR_SIZE) // Computes the byte offset of a message in a file structure. Compiles to a constant.
193
- #define FIT_MESG_DEF_OFFSET(MESG_DEF_MEMBER, FILE) (FIT_STRUCT_OFFSET(MESG_DEF_MEMBER, FILE) + FIT_HDR_SIZE) // Computes the byte offset of a message definition in a file structure. Compiles to a constant.
194
- #define FIT_MESG_DEF_FIELD_OFFSET(FIELD_MEMBER, FIELD_INDEX) (FIT_STRUCT_OFFSET(FIELD_MEMBER, FIT_FIELD_DEF) + FIT_FIELD_DEF_SIZE * FIELD_INDEX) // Computes the byte offset of a field definition member. Compiles to a constant.
255
+ #define FIT_STRUCT_OFFSET(MEMBER, STRUCT_TYPE) ( ((FIT_UINT8 *) &(((STRUCT_TYPE *) FIT_NULL)->MEMBER)) - ((FIT_UINT8 *) (FIT_NULL)) ) // Computes the byte offset of a member in a file. Compiles to a constant.
256
+
257
+ #define FIT_MESG_DEF_FIELD_OFFSET(FIELD_MEMBER, FIELD_INDEX) (FIT_STRUCT_OFFSET(FIELD_MEMBER, FIT_FIELD_DEF) + FIT_FIELD_DEF_SIZE * FIELD_INDEX) // Computes the byte offset of a field definition member. Compiles to a constant.
258
+
259
+ // Offset of message in file including file header.
260
+ #define FIT_MESG_OFFSET(MESG_MEMBER, MESG_INDEX, MESG_SIZE, FILE) (FIT_STRUCT_OFFSET(MESG_MEMBER, FILE) + MESG_INDEX * (FIT_HDR_SIZE + MESG_SIZE) + FIT_HDR_SIZE) // Computes the byte offset of a message in a file structure. Compiles to a constant.
261
+ #define FIT_MESG_DEF_OFFSET(MESG_DEF_MEMBER, FILE) (FIT_STRUCT_OFFSET(MESG_DEF_MEMBER, FILE) + FIT_HDR_SIZE) // Computes the byte offset of a message definition in a file structure. Compiles to a constant.
262
+
263
+ // Below macros are obsolete because C file structures now include file header. For reverse compatibility only.
264
+ #define FIT_FILE_MESG_OFFSET(MESG_MEMBER, MESG_INDEX, MESG_SIZE, FILE) FIT_MESG_OFFSET(MESG_MEMBER, MESG_INDEX, MESG_SIZE, FILE)
265
+ #define FIT_FILE_MESG_DEF_OFFSET(MESG_DEF_MEMBER, FILE) FIT_MESG_DEF_OFFSET(MESG_DEF_MEMBER, FILE)
266
+ #define FIT_FILE_MESG_DEF_FIELD_OFFSET(FIELD_MEMBER, FIELD_INDEX) FIT_MESG_DEF_FIELD_OFFSET(FIELD_MEMBER, FIELD_INDEX)
195
267
 
196
268
 
197
269
  ///////////////////////////////////////////////////////////////////////
@@ -199,52 +271,63 @@ typedef struct
199
271
  ///////////////////////////////////////////////////////////////////////
200
272
 
201
273
  const extern FIT_UINT8 fit_base_type_sizes[FIT_BASE_TYPES];
202
- const extern FIT_UINT8 *fit_base_type_invalids[FIT_BASE_TYPES];
274
+ const extern FIT_CONST_UINT8_PTR fit_base_type_invalids[FIT_BASE_TYPES];
203
275
 
204
276
 
205
277
  ///////////////////////////////////////////////////////////////////////
206
278
  // Public Functions
207
279
  ///////////////////////////////////////////////////////////////////////
208
280
 
209
- FIT_UINT8 Fit_GetArch(void);
210
281
  ///////////////////////////////////////////////////////////////////////
211
282
  // Returns architecture type.
212
283
  // Includes runtime check for little or big endian.
213
284
  // See FIT_MESG_DEF->arch and FIT_ARCH_*.
214
285
  ///////////////////////////////////////////////////////////////////////
286
+ FIT_UINT8 Fit_GetArch(void);
215
287
 
216
- const FIT_MESG_DEF *Fit_GetMesgDef(FIT_UINT16 global_mesg_num);
217
288
  ///////////////////////////////////////////////////////////////////////
218
289
  // Returns message definition corresponding to global message number.
219
290
  ///////////////////////////////////////////////////////////////////////
291
+ const FIT_MESG_DEF *Fit_GetMesgDef(FIT_UINT16 global_mesg_num);
220
292
 
221
- FIT_UINT16 Fit_GetMesgDefSize(const FIT_MESG_DEF *mesg_def);
222
293
  ///////////////////////////////////////////////////////////////////////
223
294
  // Returns the size of message definition.
224
295
  ///////////////////////////////////////////////////////////////////////
296
+ FIT_UINT16 Fit_GetMesgDefSize(const FIT_MESG_DEF *mesg_def);
225
297
 
226
- FIT_UINT8 Fit_GetMesgSize(FIT_UINT16 global_mesg_num);
227
298
  ///////////////////////////////////////////////////////////////////////
228
299
  // Returns the size of message corresponding to global message number.
229
300
  ///////////////////////////////////////////////////////////////////////
301
+ FIT_UINT8 Fit_GetMesgSize(FIT_UINT16 global_mesg_num);
230
302
 
231
- FIT_BOOL Fit_InitMesg(const FIT_MESG_DEF *mesg_def, void *mesg);
232
303
  ///////////////////////////////////////////////////////////////////////
233
304
  // Initializes message with invalids.
234
305
  // Returns 1 if successful, otherwise 0.
235
306
  ///////////////////////////////////////////////////////////////////////
307
+ FIT_BOOL Fit_InitMesg(const FIT_MESG_DEF *mesg_def, void *mesg);
236
308
 
237
- FIT_UINT8 Fit_GetFieldOffset(const FIT_MESG_DEF *mesg_def, FIT_UINT8 field_def_num);
238
309
  ///////////////////////////////////////////////////////////////////////
239
310
  // Returns the byte offset of a field in a message.
240
311
  ///////////////////////////////////////////////////////////////////////
312
+ FIT_UINT8 Fit_GetFieldOffset(const FIT_MESG_DEF *mesg_def, FIT_UINT8 field_def_num);
313
+
314
+ ///////////////////////////////////////////////////////////////////////
315
+ // Returns the definition for a field in a message.
316
+ // field_def_num is set to FIT_FIELD_NUM_INVALID if field is not found in message.
317
+ ///////////////////////////////////////////////////////////////////////
318
+ FIT_FIELD_DEF Fit_GetFieldDef(const FIT_MESG_DEF *mesg_def, FIT_UINT8 field_def_num);
319
+
320
+ ///////////////////////////////////////////////////////////////////////
321
+ // Finds the byte offset of a message with the given message index in a FIT file
322
+ // Requires a pointer to a function which can read a given number of bytes from a provided offset in a FIT file.
323
+ // Returns the local message number if successful, or FIT_UINT8_INVALID if unsuccessful.
324
+ ///////////////////////////////////////////////////////////////////////
325
+ FIT_UINT8 Fit_LookupMessage(FIT_UINT16 global_mesg_num, FIT_UINT16 message_index, FIT_UINT32 *offset, FIT_READ_BYTES_FUNC read_bytes_func, FIT_BOOL read_header);
241
326
 
242
- FIT_UINT8 Fit_LookupMessage(FIT_UINT16 global_mesg_num, FIT_UINT16 message_index, FIT_UINT32 *offset, FIT_READ_BYTES_FUNC read_bytes_func);
243
327
  ///////////////////////////////////////////////////////////////////////
244
- // Finds the byte offset of a message with the given message index in a .FIT file
245
- // Requires a pointer to a function which can read a given number of bytes from a provided offset in a .FIT file.
246
- // Returns the local message number if successful, or FIT_UINT8 if unsuccessful.
328
+ // Returns the byte offset of a message within a file.
247
329
  ///////////////////////////////////////////////////////////////////////
330
+ FIT_UINT32 Fit_GetFileMesgOffset(const FIT_FILE_DEF *file_def, FIT_UINT16 mesg_num, FIT_UINT16 mesg_index);
248
331
 
249
332
  #if defined(__cplusplus)
250
333
  }