示例#1
0
 def document_to_telemetry(self, doc):
     tel = Telemetry()
     tel.set_state(doc['state'])
     tel.set_doc_payload(doc["payload"])
     tel.set_doc_data(doc["data"])
     tel.set_n_data(doc["n_data"])
     tel.set_lost_p(doc["lost_p"])
     tel.set_l_data(doc["l_data"])
     tel.set_p_status(doc["p_status"])
     tel.set_obj_id(doc['_id'])
     id_timestamp = doc["_id"].generation_time.strftime("%y-%m-%d %H:%M:%S")
     tel.set_date(doc.get("date", id_timestamp))  # Compatible with < 0.4.6
     return tel
示例#2
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()