예제 #1
0
    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()
예제 #2
0
                    '--time',
                    type=float,
                    help="Hours to adjunt time zone, ex: -3, +4, etc.")
args = parser.parse_args()

re_sample = re.compile(
    r"((?:0x....,){2}(?:0x0043,){3}0x000.,(?:0x....,){6,8})(?=(?:0x....,){2}(?:0x0043,){3}0x000.)"
)

# The file name is the first and only parameter
fname = args.file[0]
#fname = "../data/20180614-DIA/SUCHAI_20180614_130248.txt"

# The Object that parses the telemetry
tm = Telemetry(date=time.asctime())
tm.set_payload(str(3))

# Read the file and
lines = []
with open(fname) as datafile:
    for line in datafile:
        # Delete the debug information, type and number like: "[2018-09-10 13:55:08.296842][tm] 0x0300,0xFFA0,"
        lines.append(line[47:])

# Apply the regexp to find samples like
# "0x24E3,0x4A54,0x0043,0x0043,0x0043,0x0005,0x0003,0x0036,0x0002,0x0047,0x0002,0x004F,0x0000,0x000A,"
# The regexp is evaluated over plain string, replacing \n by ","
# The regexp itself filter incomplete frames ;)
lines = "".join(lines)
lines = lines.replace("\n", ",")
samples = re_sample.findall(lines)