def test_fitfile_parses_with_correct_number_of_recs_defs_and_file_size_and_CRC(self): fit = FitFile(testfile('sample-activity.fit')) fit.parse() self.assertEquals(len(fit.records), 3228) self.assertEquals(len(fit.definitions), 9) self.assertEquals(fit._file_size, 104761) self.assertEquals(fit._crc, 0x75C5)
def importfitfile(f, user=None): if user is None: user = get_user_model().objects.all()[0] logger.info(u"Processing '%s'..." % f) fitfile = FitFile(f, data_processor=FullDatetimeProcessor(), check_crc=False) workout = Workout() logger.info(u"Processing session") for msg in fitfile.get_messages(name='session', as_dict=True): logger.debug(u"Session fields: %s" % str(msg['fields'])) for f in msg['fields']: #if f['name'] == 'timestamp': #workout.title = f['value'].astimezone(get_default_timezone()).isoformat() if f['name'] == 'start_time': workout.publish_date = f['value'] workout.title = f['value'].astimezone( get_default_timezone()).isoformat() if hasattr(workout, f['name']): setattr(workout, f['name'], f['value']) workout.user = user workout.save() logger.info(u"Processing laps") for msg in fitfile.get_messages(name='lap', as_dict=True): logger.info(" Lap: '%s'" % msg['name']) lap = Lap(workout=workout) for f in msg['fields']: if hasattr(lap, f['name']): setattr(lap, f['name'], f['value']) lap.save() logger.info(u"Processing data points") for msg in fitfile.get_messages(name='record', as_dict=True): record = Record(workout=workout) for f in msg['fields']: if hasattr(record, f['name']): setattr(record, f['name'], f['value']) record.save() logger.info("Finished.") return workout
def FitToDataTable(MyFile, Fields): File = FitFile(MyFile) File.parse() ##obtention des enregistrements Values = File.get_messages() ##iteration sur les header inutiles jusqu'a l'annonce du fichier cycling Records = ExtractRecords(Values) # Continue = True # while Continue : # Record = Values.next() # try : # if Record["sport"] == "cycling" : # Continue = False # except KeyError : # pass Datas = [] i = 0 #iteration sur les enregistrements Prec = None for Record in Records: # #print(Record) # if Record.has_key("product")==True : # #rendu ici il n'y a plus d'enregistrements # try : # Record = Values.next() # if Record.has_key("event_type") == False : # print("Hey, we have to continue !") # else : # break # except : # break # if Record.has_key("event_type") == False : # #sauter les evenements indiquant le 5km # #transformer le timestamp moche en un beau chiffre TIME = time.mktime(Record["timestamp"].timetuple()) + ( Config["FitFile"]["Decalage"] * 60) #TIME = Record["timestamp"] + (Config["FitFile"]["Decalage"]*60*60) Record["timestamp"] = int(TIME) #print(Fields) #try : Row = [] NoMissing = True for Field in Fields: if Field.RealName not in Record: Row.append(Field.Default) #print(" Missing this Field : "+Field.RealName) NoMissing = False else: try: Row.append(Record[Field.RealName]) except KeyError as e: print("This Key is missing : " + Field.RealName) print(Record) raise e #Row = list((Record[Field.RealName] for Field in Fields)) # except : # print("Error : ") # print(Record) # print(Row) # raise KeyError Row.insert(0, i) Datas.append(tuple(Row)) i += 1 if NoMissing: Prec = Record if Prec is None: raise ValueError( "Prec is none, so we have a problem with this file : " + MyFile) #obtention des types des enregistrements Types = [VL.GessNumpyType(str(Prec[Field.RealName])) for Field in Fields] FieldNames = [Field.Name for Field in Fields] FieldNames.insert(0, "OID") Types.insert(0, "int32") #print(Types) BD = VL.JDataTable(FieldNames, Types, "OID", Datas) return BD