2121
2222
2323class DeveloperDataMixin (object ):
24- def __init__ (self , * args , ** kwargs ):
24+ def __init__ (self , * args , check_developer_data = True , ** kwargs ):
25+ self .check_developer_data = check_developer_data
2526 self .dev_types = {}
2627
2728 super (DeveloperDataMixin , self ).__init__ (* args , ** kwargs )
2829
29- def add_dev_data_id (self , message ):
30- dev_data_index = message . get_raw_value ( 'developer_data_index' )
31- application_id = message . get_raw_value ( 'application_id' )
30+ def _append_dev_data_id (self , dev_data_index , application_id = None , fields = None ):
31+ if fields is None :
32+ fields = {}
3233
3334 # Note that nothing in the spec says overwriting an existing type is invalid
3435 self .dev_types [dev_data_index ] = {
3536 'dev_data_index' : dev_data_index ,
3637 'application_id' : application_id ,
37- 'fields' : {}
38+ 'fields' : fields
3839 }
3940
41+ def add_dev_data_id (self , message ):
42+ dev_data_index = message .get_raw_value ('developer_data_index' )
43+ application_id = message .get_raw_value ('application_id' )
44+
45+ self ._append_dev_data_id (dev_data_index , application_id )
46+
47+ def _append_dev_field_description (self , dev_data_index , field_def_num , type = BASE_TYPE_BYTE , name = None ,
48+ units = None , native_field_num = None ):
49+ if dev_data_index not in self .dev_types :
50+ if self .check_developer_data :
51+ raise FitParseError ("No such dev_data_index=%s found" % (dev_data_index ))
52+
53+ warnings .warn (
54+ "Dev type for dev_data_index=%s missing. Adding dummy dev type." % (dev_data_index )
55+ )
56+ self ._append_dev_data_id (dev_data_index )
57+
58+ self .dev_types [dev_data_index ]["fields" ][field_def_num ] = DevField (
59+ dev_data_index = dev_data_index ,
60+ def_num = field_def_num ,
61+ type = type ,
62+ name = name ,
63+ units = units ,
64+ native_field_num = native_field_num
65+ )
66+
4067 def add_dev_field_description (self , message ):
4168 dev_data_index = message .get_raw_value ('developer_data_index' )
4269 field_def_num = message .get_raw_value ('field_definition_number' )
@@ -46,26 +73,55 @@ def add_dev_field_description(self, message):
4673 native_field_num = message .get_raw_value ('native_field_num' )
4774
4875 if dev_data_index not in self .dev_types :
49- raise FitParseError ("No such dev_data_index=%s found" % (dev_data_index ))
76+ if self .check_developer_data :
77+ raise FitParseError ("No such dev_data_index=%s found" % (dev_data_index ))
78+
79+ warnings .warn (
80+ "Dev type for dev_data_index=%s missing. Adding dummy dev type." % (dev_data_index )
81+ )
82+ self ._append_dev_data_id (dev_data_index )
83+
5084 fields = self .dev_types [int (dev_data_index )]['fields' ]
5185
5286 # Note that nothing in the spec says overwriting an existing field is invalid
53- fields [field_def_num ] = DevField (dev_data_index = dev_data_index ,
54- def_num = field_def_num ,
55- type = BASE_TYPES [base_type_id ],
56- name = field_name ,
57- units = units ,
58- native_field_num = native_field_num )
59-
87+ fields [field_def_num ] = DevField (
88+ dev_data_index = dev_data_index ,
89+ def_num = field_def_num ,
90+ type = BASE_TYPES [base_type_id ],
91+ name = field_name ,
92+ units = units ,
93+ native_field_num = native_field_num
94+ )
6095
6196 def get_dev_type (self , dev_data_index , field_def_num ):
6297 if dev_data_index not in self .dev_types :
63- raise FitParseError ("No such dev_data_index=%s found when looking up field %s" % (dev_data_index , field_def_num ))
98+ if self .check_developer_data :
99+ raise FitParseError (
100+ "No such dev_data_index=%s found when looking up field %s" % (dev_data_index , field_def_num )
101+ )
102+
103+ warnings .warn (
104+ "Dev type for dev_data_index=%s missing. Adding dummy dev type." % (dev_data_index )
105+ )
106+ self ._append_dev_data_id (dev_data_index )
64107
65- if field_def_num not in self .dev_types [dev_data_index ]['fields' ]:
66- raise FitParseError ("No such field %s for dev_data_index %s" % (field_def_num , dev_data_index ))
108+ dev_type = self .dev_types [dev_data_index ]
67109
68- return self .dev_types [dev_data_index ]['fields' ][field_def_num ]
110+ if field_def_num not in dev_type ['fields' ]:
111+ if self .check_developer_data :
112+ raise FitParseError (
113+ "No such field %s for dev_data_index %s" % (field_def_num , dev_data_index )
114+ )
115+
116+ warnings .warn (
117+ "Field %s for dev_data_index %s missing. Adding dummy field." % (field_def_num , dev_data_index )
118+ )
119+ self ._append_dev_field_description (
120+ dev_data_index = dev_data_index ,
121+ field_def_num = field_def_num
122+ )
123+
124+ return dev_type ['fields' ][field_def_num ]
69125
70126
71127class FitFileDecoder (DeveloperDataMixin ):
@@ -554,12 +610,14 @@ def _parse_data_message(self, header):
554610class UncachedFitFile (DataProcessorMixin , FitFileDecoder ):
555611 """FitFileDecoder with data processing"""
556612
557- def __init__ (self , fileish , check_crc = True , data_processor = None ):
613+ def __init__ (self , fileish , * args , check_crc = True , data_processor = None , ** kwargs ):
558614 # Ensure all optional params are passed as kwargs
559615 super (UncachedFitFile , self ).__init__ (
560616 fileish ,
617+ * args ,
561618 check_crc = check_crc ,
562- data_processor = data_processor
619+ data_processor = data_processor ,
620+ ** kwargs
563621 )
564622
565623
0 commit comments