def _process_tm(self, data): ts = datetime.datetime.now( datetime.timezone.utc).strftime("%y-%m-%d %H:%M:%S") # Fix data ending with commands (Issue #4) # This fix was added for compatibily with versions < 0.4.6 and can # be removed in the future if data[-1] == "," or data[-1] == "\n": data = data[:-1] # Split comma separated values data = data.split(',') # 1. Parse frames # Header in all frames t_frame = data[0] # type of frame n_frame = data[1] # number of frame # Header in all frames of type 0x1000 (Start) or 0x4000 (Simple) t_data = data[2] # Type of payload # Header in payloads frames (not tm_estado) of type 0x1000 (Start) l_data = data[3] # length of data p_status = data[4] # payload status # 2. Parse data _data_start = data[ 5:] # data in frames 0x1000 (Start) and 0x4000 (Simple) _data_conti = data[ 2:] # data in frames 0x3000 (Conti) and 0x2000 (End) # 3. Build telemetry if t_frame == "0x0100" or t_frame == "0x0400": # it is a new frame o 0x4000 # First check if the last telemetry is alright if len(self.telemetries) != 0: # check if the last telemetry is finished key, last_tel = self.telemetries.popitem() if last_tel.get_state() != 2: last_tel.set_state(3) # broken self.telemetries[key] = last_tel # Append a new telemetry tel = Telemetry(date=ts) tel.set_payload(t_data) # Fix tm_estado simple vs tm_estado payload # HACK: in tm_estado simple l_data=data[3] is the first data in the # frame and can be only 0 or 1, but in tm_estado payload l_data is a # big number > 1 is_simple_estado = tel.get_payload() == 0 and int(l_data, 16) <= 1 # Case simple tm_estado frame if is_simple_estado: tel.set_l_data("0x0001") tel.set_p_status("0x0004") # Fix tm_estado simple header to match payload format # Add dummy [Time1,Time2] tel.set_data(["0x0000", "0x0000"] + data[3:], n_frame) # Case normal payload frame else: tel.set_l_data(l_data) tel.set_p_status(p_status) tel.set_data(_data_start, n_frame) # Change status to received more frames if t_frame == "0x0400": tel.set_state(2) # Finished status else: tel.set_state(1) # Ongoing status # Save current telemetry to DB tel.save(self.mongo_client) self.telemetries[tel.get_obj_id()] = tel elif t_frame == "0x0200": # it is an ending frame if len(self.telemetries ) != 0: # if this is not true something is wrong key, tel = self.telemetries.popitem() tel_state = tel.get_state() # if the last frame was in progress (1) mark as finished, # add new data and return element to list if tel_state == 1: tel.set_state(2) # mark finished tel.set_data(_data_conti, n_frame) tel.save(self.mongo_client) self.telemetries[key] = tel # if the last frame was finished, create a new one marked as # broken and store in the list elif tel_state == 2: tel = Telemetry(date=ts) tel.set_data(_data_conti, n_frame) tel.set_state(3) # Mark broken tel.save(self.mongo_client) self.telemetries[tel.get_obj_id()] = tel # other cases (borken, empty, etc), mark as broken, add new data # and restore element to list else: tel.set_state(3) # mark broken tel.set_data(_data_conti, n_frame) tel.save(self.mongo_client) self.telemetries[key] = tel elif t_frame == "0x0300": # it is an ongoing frame if len(self.telemetries ) != 0: # if this is not true something is wrong key, tel = self.telemetries.popitem() if tel.get_state() in (1, 3): # In progress or broken tel.set_data(_data_conti, n_frame) # Update tel.save(self.mongo_client) # Save self.telemetries[key] = tel # Return to list else: # tel.get_state() == 2: # last frame has finished tel = Telemetry(date=ts) # New tel.set_data(_data_conti, n_frame) # Update tel.set_state(3) # Mark as broken tel.save(self.mongo_client) # Save self.telemetries[tel.get_obj_id()] = tel # Add to list self.update_telemetry_table()
lines = lines.replace("\n", ",") samples = re_sample.findall(lines) # Let filter some incomplete samples from broken frames samples = list( filter(lambda l: not ("0x0043,0x0043,0x0043,0x0005" in l and len(l) < 98), samples)) #print(samples) # Now add the samples to the telemetry parses to create de DataFrame for i, line in enumerate(samples): if line[-1] == ",": line = line[:-1] data = line.split(",") tm.set_data(data, hex(i)) # Finally save the file df = tm.to_dataframe() if args.time: t = pd.to_datetime(df["time"], errors='coerce') dt = datetime.timedelta(hours=float(args.time)) df["time"] = t + dt df.to_csv(fname + ".csv") ## TAIL EXAMPLE """ 0x53B5,0x4A74,0x0043,0x0043,0x0043,0x0001,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0043,0x0043,0x0043,0x0002,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0043,0x0043,0x0043,0x0003,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000, 0x0000,0x0000,0x0043,0x0043,0x0043,0x0004,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xFFFE,