14
14
15
15
from fitparse .utils import FitParseError
16
16
17
-
18
17
DEV_TYPES = {}
19
18
20
19
21
- class RecordBase (object ):
22
- # namedtuple-like base class. Subclasses should must __slots__
23
- __slots__ = ()
24
-
25
- # TODO: switch back to namedtuple, and don't use default arguments as None
26
- # and see if that gives us any performance improvements
27
-
28
- def __init__ (self , * args , ** kwargs ):
29
- for slot_name , value in zip_longest (self .__slots__ , args , fillvalue = None ):
30
- setattr (self , slot_name , value )
31
- for slot_name , value in kwargs .items ():
32
- setattr (self , slot_name , value )
33
-
34
-
35
- class MessageHeader (RecordBase ):
20
+ class MessageHeader (object ):
36
21
__slots__ = ('is_definition' , 'is_developer_data' , 'local_mesg_num' , 'time_offset' )
37
22
23
+ def __init__ (self , is_definition , is_developer_data , local_mesg_num , time_offset ):
24
+ self .is_definition = is_definition
25
+ self .is_developer_data = is_developer_data
26
+ self .local_mesg_num = local_mesg_num
27
+ self .time_offset = time_offset
28
+
38
29
def __repr__ (self ):
39
30
return '<MessageHeader: %s%s -- local mesg: #%d%s>' % (
40
31
'definition' if self .is_definition else 'data' ,
@@ -44,10 +35,18 @@ def __repr__(self):
44
35
)
45
36
46
37
47
- class DefinitionMessage (RecordBase ):
38
+ class DefinitionMessage (object ):
48
39
__slots__ = ('header' , 'endian' , 'mesg_type' , 'mesg_num' , 'field_defs' , 'dev_field_defs' )
49
40
type = 'definition'
50
41
42
+ def __init__ (self , header , endian , mesg_type , mesg_num , field_defs , dev_field_defs ):
43
+ self .header = header
44
+ self .endian = endian
45
+ self .mesg_type = mesg_type
46
+ self .mesg_num = mesg_num
47
+ self .field_defs = field_defs
48
+ self .dev_field_defs = dev_field_defs
49
+
51
50
@property
52
51
def name (self ):
53
52
return self .mesg_type .name if self .mesg_type else 'unknown_%d' % self .mesg_num
@@ -62,9 +61,15 @@ def __repr__(self):
62
61
)
63
62
64
63
65
- class FieldDefinition (RecordBase ):
64
+ class FieldDefinition (object ):
66
65
__slots__ = ('field' , 'def_num' , 'base_type' , 'size' )
67
66
67
+ def __init__ (self , field , def_num , base_type , size ):
68
+ self .field = field
69
+ self .def_num = def_num
70
+ self .base_type = base_type
71
+ self .size = size
72
+
68
73
@property
69
74
def name (self ):
70
75
return self .field .name if self .field else 'unknown_%d' % self .def_num
@@ -82,11 +87,14 @@ def __repr__(self):
82
87
)
83
88
84
89
85
- class DevFieldDefinition (RecordBase ):
90
+ class DevFieldDefinition (object ):
86
91
__slots__ = ('field' , 'dev_data_index' , 'base_type' , 'def_num' , 'size' )
87
92
88
- def __init__ (self , ** kwargs ):
89
- super (DevFieldDefinition , self ).__init__ (** kwargs )
93
+ def __init__ (self , field , dev_data_index , def_num , size ):
94
+ self .field = field
95
+ self .def_num = def_num
96
+ self .dev_data_index = dev_data_index
97
+ self .size = size
90
98
# For dev fields, the base_type and type are always the same.
91
99
self .base_type = self .type
92
100
@@ -108,10 +116,15 @@ def __repr__(self):
108
116
)
109
117
110
118
111
- class DataMessage (RecordBase ):
119
+ class DataMessage (object ):
112
120
__slots__ = ('header' , 'def_mesg' , 'fields' )
113
121
type = 'data'
114
122
123
+ def __init__ (self , header , def_mesg , fields ):
124
+ self .header = header
125
+ self .def_mesg = def_mesg
126
+ self .fields = fields
127
+
115
128
def get (self , field_name , as_dict = False ):
116
129
# SIMPLIFY: get rid of as_dict
117
130
for field_data in self .fields :
@@ -164,11 +177,16 @@ def __str__(self):
164
177
return '%s (#%d)' % (self .name , self .mesg_num )
165
178
166
179
167
- class FieldData (RecordBase ):
180
+ class FieldData (object ):
168
181
__slots__ = ('field_def' , 'field' , 'parent_field' , 'value' , 'raw_value' , 'units' )
169
182
170
- def __init__ (self , * args , ** kwargs ):
171
- super (FieldData , self ).__init__ (self , * args , ** kwargs )
183
+ def __init__ (self , field_def , field , parent_field , value , raw_value , units = None ):
184
+ self .field_def = field_def
185
+ self .field = field
186
+ self .parent_field = parent_field
187
+ self .value = value
188
+ self .raw_value = raw_value
189
+ self .units = units
172
190
if not self .units and self .field :
173
191
# Default to units on field, otherwise None.
174
192
# NOTE:Not a property since you may want to override this in a data processor
@@ -235,10 +253,16 @@ def __str__(self):
235
253
)
236
254
237
255
238
- class BaseType (RecordBase ):
256
+ class BaseType (object ):
239
257
__slots__ = ('name' , 'identifier' , 'fmt' , 'parse' )
240
258
values = None # In case we're treated as a FieldType
241
259
260
+ def __init__ (self , name , identifier , fmt , parse ):
261
+ self .name = name
262
+ self .identifier = identifier
263
+ self .fmt = fmt
264
+ self .parse = parse
265
+
242
266
@property
243
267
def size (self ):
244
268
return struct .calcsize (self .fmt )
@@ -253,21 +277,31 @@ def __repr__(self):
253
277
)
254
278
255
279
256
- class FieldType (RecordBase ):
280
+ class FieldType (object ):
257
281
__slots__ = ('name' , 'base_type' , 'values' )
258
282
283
+ def __init__ (self , name , base_type , values = None ):
284
+ self .name = name
285
+ self .base_type = base_type
286
+ self .values = values
287
+
259
288
def __repr__ (self ):
260
289
return '<FieldType: %s (%s)>' % (self .name , self .base_type )
261
290
262
291
263
- class MessageType (RecordBase ):
292
+ class MessageType ():
264
293
__slots__ = ('name' , 'mesg_num' , 'fields' )
265
294
295
+ def __init__ (self , name , mesg_num , fields ):
296
+ self .name = name
297
+ self .mesg_num = mesg_num
298
+ self .fields = fields
299
+
266
300
def __repr__ (self ):
267
301
return '<MessageType: %s (#%d)>' % (self .name , self .mesg_num )
268
302
269
303
270
- class FieldAndSubFieldBase (RecordBase ):
304
+ class FieldAndSubFieldBase (object ):
271
305
__slots__ = ()
272
306
273
307
@property
@@ -288,27 +322,78 @@ class Field(FieldAndSubFieldBase):
288
322
__slots__ = ('name' , 'type' , 'def_num' , 'scale' , 'offset' , 'units' , 'components' , 'subfields' )
289
323
field_type = 'field'
290
324
325
+ def __init__ (self , name , type , def_num , scale = None , offset = None , units = None , components = None , subfields = None ):
326
+ super (Field , self ).__init__ ()
327
+ self .name = name
328
+ self .type = type
329
+ self .def_num = def_num
330
+ self .scale = scale
331
+ self .offset = offset
332
+ self .units = units
333
+ self .components = components
334
+ self .subfields = subfields
335
+
291
336
292
337
class SubField (FieldAndSubFieldBase ):
293
338
__slots__ = ('name' , 'def_num' , 'type' , 'scale' , 'offset' , 'units' , 'components' , 'ref_fields' )
294
339
field_type = 'subfield'
295
340
341
+ def __init__ (self , name , def_num , type , scale = None , offset = None , units = None , components = None , ref_fields = None ):
342
+ super (SubField , self ).__init__ ()
343
+ self .name = name
344
+ self .def_num = def_num
345
+ self .type = type
346
+ self .scale = scale
347
+ self .offset = offset
348
+ self .units = units
349
+ self .components = components
350
+ self .ref_fields = ref_fields
351
+
296
352
297
353
class DevField (FieldAndSubFieldBase ):
298
- __slots__ = ('dev_data_index' , 'def_num ' , 'type ' , 'name ' , 'units' , 'native_field_num' ,
354
+ __slots__ = ('dev_data_index' , 'name ' , 'def_num ' , 'type ' , 'units' , 'native_field_num' ,
299
355
# The rest of these are just to be compatible with Field objects. They're always None
300
- 'scale' , 'offset' , 'components' , 'subfields' )
356
+ 'scale' , 'offset' , 'components' , 'subfields' )
301
357
field_type = 'devfield'
302
358
303
-
304
- class ReferenceField (RecordBase ):
359
+ def __init__ (self , dev_data_index , name , def_num , type , units , native_field_num ):
360
+ super (DevField , self ).__init__ ()
361
+ self .dev_data_index = dev_data_index
362
+ self .name = name
363
+ self .def_num = def_num
364
+ self .type = type
365
+ self .units = units
366
+ self .native_field_num = native_field_num
367
+ self .scale = None
368
+ self .offset = None
369
+ self .components = None
370
+ self .subfields = None
371
+
372
+
373
+ class ReferenceField (object ):
305
374
__slots__ = ('name' , 'def_num' , 'value' , 'raw_value' )
306
375
376
+ def __init__ (self , name , def_num , value , raw_value ):
377
+ self .name = name
378
+ self .def_num = def_num
379
+ self .value = value
380
+ self .raw_value = raw_value
381
+
307
382
308
- class ComponentField (RecordBase ):
383
+ class ComponentField (object ):
309
384
__slots__ = ('name' , 'def_num' , 'scale' , 'offset' , 'units' , 'accumulate' , 'bits' , 'bit_offset' )
310
385
field_type = 'component'
311
386
387
+ def __init__ (self , name , def_num , offset = None , scale = None , units = None , accumulate = None , bits = None , bit_offset = None ):
388
+ self .name = name
389
+ self .def_num = def_num
390
+ self .scale = scale
391
+ self .units = units
392
+ self .accumulate = accumulate
393
+ self .bits = bits
394
+ self .bit_offset = bit_offset
395
+ self .offset = offset
396
+
312
397
def render (self , raw_value ):
313
398
if raw_value is None :
314
399
return None
@@ -391,9 +476,9 @@ def add_dev_field_description(message):
391
476
392
477
# Note that nothing in the spec says overwriting an existing field is invalid
393
478
fields [field_def_num ] = DevField (dev_data_index = dev_data_index ,
479
+ name = field_name ,
394
480
def_num = field_def_num ,
395
481
type = BASE_TYPES [base_type_id ],
396
- name = field_name ,
397
482
units = units ,
398
483
native_field_num = native_field_num )
399
484
0 commit comments