def __init__(self, path='/tmp', display=False, fullscreen=True):
        gr.basic_block.__init__(self,
                                name="k2sat_image_decoder",
                                in_sig=[],
                                out_sig=[])

        self.num_images = 0
        self.path = path
        self.message_port_register_in(pmt.intern('in'))
        self.set_msg_handler(pmt.intern('in'), self.handle_msg)
        self.display = display
        self.next_frame_count = None
        self.feh = FehOpener(fullscreen, interval=0.1)
    def __init__(self, path='/tmp', display=False, fullscreen=True):
        gr.basic_block.__init__(self,
                                name="by701_image_decoder",
                                in_sig=[],
                                out_sig=[])

        self.path = path
        self.message_port_register_in(pmt.intern('in'))
        self.set_msg_handler(pmt.intern('in'), self.handle_msg)
        self.files = dict()
        self.remaining = dict()
        self.display = display
        self.displaying = list()
        self.feh = FehOpener(fullscreen)
    def __init__(self, path='/tmp', display=False, fullscreen=True):
        gr.basic_block.__init__(self,
                                name="sat_1kuns_pf_image_decoder",
                                in_sig=[],
                                out_sig=[])

        self.path = path
        self.message_port_register_in(pmt.intern('in'))
        self.set_msg_handler(pmt.intern('in'), self.handle_msg)
        self.current_file = -1
        self.expected_block = 0
        self.display = display
        self.displaying = False
        self.feh = FehOpener(fullscreen)
class by701_image_decoder(gr.basic_block):
    """
    docstring for block by701_image_decoder
    """
    def __init__(self, path='/tmp', display=False, fullscreen=True):
        gr.basic_block.__init__(self,
                                name="by701_image_decoder",
                                in_sig=[],
                                out_sig=[])

        self.path = path
        self.message_port_register_in(pmt.intern('in'))
        self.set_msg_handler(pmt.intern('in'), self.handle_msg)
        self.files = dict()
        self.remaining = dict()
        self.display = display
        self.displaying = list()
        self.feh = FehOpener(fullscreen)

    def handle_msg(self, msg_pmt):
        msg = pmt.cdr(msg_pmt)
        if not pmt.is_u8vector(msg):
            print "[ERROR] Received invalid message type. Expected u8vector"
            return
        packet = bytearray(pmt.u8vector_elements(msg))

        # check packet len
        if len(packet) <= 15 + 8:
            return

        csp = CSP(packet[:4])

        # destination 6 is used for JPEG chunks
        if csp.destination != 6:
            return

        image_id = struct.unpack('<I', packet[4:8])[0]
        flag = struct.unpack('<b', packet[8:9])[0]
        length = struct.unpack('<I', packet[9:12] + bytearray([0]))[0]
        index = struct.unpack('<I', packet[12:15] + bytearray([0]))[0]
        data = packet[15:-8]

        if flag in flags:
            print 'Received flag', flags[flag]
            return

        filename = os.path.join(self.path, str(image_id) + '.jpg')
        if image_id not in self.files:
            self.files[image_id] = open(filename, 'wb', 0)
            self.remaining[image_id] = length

        # check that index and length make sense
        if index + len(data) > length:
            return

        f = self.files[image_id]
        f.seek(index)
        f.write(data)

        self.remaining[image_id] = self.remaining[image_id] - len(data)

        if self.display and image_id not in self.displaying and \
          length - self.remaining[image_id] >= 64*10:
            self.displaying.append(image_id)
            try:
                self.feh.open(filename)
            except Exception:
                pass

        if self.remaining[image_id] <= 0:
            # image finished
            print 'Finished downloading image', image_id
            f.close()
            del self.remaining[image_id]
            del self.files[image_id]
示例#5
0
class dsat_image_decoder(gr.basic_block):
    """
    docstring for block by701_image_decoder
    """
    def __init__(self, path='/tmp', display=False, fullscreen=True):
        gr.basic_block.__init__(self,
                                name="dsat_image_decoder",
                                in_sig=[],
                                out_sig=[])

        self.path = path
        self.message_port_register_in(pmt.intern('in'))
        self.set_msg_handler(pmt.intern('in'), self.handle_msg)
        self.files = dict()
        self.remaining = dict()
        self.display = display
        self.displaying = list()
        self.current_id = None
        self.feh = FehOpener(fullscreen)

    def handle_msg(self, msg_pmt):
        msg = pmt.cdr(msg_pmt)
        if not pmt.is_u8vector(msg):
            print "[ERROR] Received invalid message type. Expected u8vector"
            return
        packet = bytearray(pmt.u8vector_elements(msg))

        # check packet len
        if len(packet) <= 15 + 8:
            return

        csp = CSP(packet[:4])

        # destination port 12 is used for announcements
        if csp.dest_port == 12:
            self.current_timestamp = datetime.utcfromtimestamp(
                struct.unpack('<i', packet[4:8])[0])
            self.current_id = struct.unpack('<I', packet[8:12])[0]
            # next 12 bytes are for GPS position
            self.length = struct.unpack('<I', packet[21:25])[0]

            print 'Image {} announced. Length {}. Timestamp {}'.format(
                self.current_id, self.length, self.current_timestamp)

            self.filename = os.path.join(self.path,
                                         str(self.current_id) + '.jpg')
            if self.current_id not in self.files:
                self.files[self.current_id] = open(self.filename, 'wb', 0)
                self.remaining[self.current_id] = self.length

            self.bytes_done = 0
            self.old_index = 0

            return

        # destination port 30 is used for JPEG blocks
        if csp.dest_port != 30:
            return

        if not self.current_id:
            # we haven't heard the image announcement, we have to ignore the block
            return

        data = packet[4:-8]
        index = struct.unpack('>I', packet[-8:-4])[0]

        # handle index rollover
        if self.old_index > index:
            self.bytes_done += self.msg_datasize
        self.old_index = index

        self.msg_datasize = struct.unpack(
            '>I', packet[-4:])[0]  # not really needed to decode image

        f = self.files[self.current_id]
        f.seek(self.bytes_done + index)
        f.write(data)

        self.remaining[
            self.current_id] = self.remaining[self.current_id] - len(data)

        if self.display and self.current_id not in self.displaying and \
          self.length - self.remaining[self.current_id] >= 64*10:
            self.displaying.append(self.current_id)
            try:
                self.feh.open(self.filename)
            except Exception:
                pass

        if self.remaining[self.current_id] <= 0:
            # image finished
            print 'Finished downloading image', self.current_id
            f.close()
            del self.remaining[self.current_id]
            del self.files[self.current_id]
class k2sat_image_decoder(gr.basic_block):
    """
    docstring for block k2sat_image_decoder
    """
    def __init__(self, path='/tmp', display=False, fullscreen=True):
        gr.basic_block.__init__(self,
                                name="k2sat_image_decoder",
                                in_sig=[],
                                out_sig=[])

        self.num_images = 0
        self.path = path
        self.message_port_register_in(pmt.intern('in'))
        self.set_msg_handler(pmt.intern('in'), self.handle_msg)
        self.display = display
        self.next_frame_count = None
        self.feh = FehOpener(fullscreen, interval=0.1)

    def handle_msg(self, msg_pmt):
        msg = pmt.cdr(msg_pmt)
        if not pmt.is_u8vector(msg):
            print "[ERROR] Received invalid message type. Expected u8vector"
            return
        packet = bytearray(pmt.u8vector_elements(msg))

        # check packet len
        if len(packet) <= 16 + 4 + 1:
            return

        virtual_channel_frame_count = packet[16 + 2]
        first_header_pointer = packet[16 + 3]

        if first_header_pointer == 0x00:
            # first packet in image
            filename = os.path.join(self.path,
                                    'image_{}.jpg'.format(self.num_images))
            self.f = open(filename, 'wb')
            print 'Started image', self.num_images
            self.num_images += 1
            self.next_frame_count = virtual_channel_frame_count

        if self.next_frame_count == None:
            # current image has failed
            return

        if virtual_channel_frame_count != self.next_frame_count:
            print 'Lost image packet. Image decoding failed.'
            self.next_frame_count = None
            self.f.close()
            return

        self.f.write(packet[20:-1])
        self.f.flush()
        self.next_frame_count = (self.next_frame_count + 1) % 256

        if self.display and first_header_pointer == 0x00:
            try:
                self.feh.open(filename)
            except Exception:
                pass

        if first_header_pointer == 0xff:
            # last packet in image
            self.f.close()
            self.next_frame_count = None
            print 'Finished downloading image'
class sat_1kuns_pf_image_decoder(gr.basic_block):
    """
    docstring for block sat_1kuns_pf_image_decoder
    """
    def __init__(self, path='/tmp', display=False, fullscreen=True):
        gr.basic_block.__init__(self,
                                name="sat_1kuns_pf_image_decoder",
                                in_sig=[],
                                out_sig=[])

        self.path = path
        self.message_port_register_in(pmt.intern('in'))
        self.set_msg_handler(pmt.intern('in'), self.handle_msg)
        self.current_file = -1
        self.expected_block = 0
        self.display = display
        self.displaying = False
        self.feh = FehOpener(fullscreen)

    def handle_msg(self, msg_pmt):
        msg = pmt.cdr(msg_pmt)
        if not pmt.is_u8vector(msg):
            print "[ERROR] Received invalid message type. Expected u8vector"
            return
        packet = bytearray(pmt.u8vector_elements(msg))

        # check packet len
        if len(packet) != 138:
            return

        block = struct.unpack('>H', packet[4:6])[0]
        data = packet[6:-4]

        if self.current_file == -1:
            if block == 0:
                # first file received
                print "Starting image 0"
                self.current_file = 0
                self.filename = os.path.join(
                    self.path, 'img{}.jpg'.format(self.current_file))
                self.f = open(self.filename, 'wb', 0)
            else:
                return
        elif block == 0:
            # new file
            print "Image {} finished. Starting image {}".format(
                self.current_file, self.current_file + 1)
            self.f.close()
            self.current_file += 1
            self.expected_block = 0
            self.filename = os.path.join(self.path,
                                         'img{}.jpg'.format(self.current_file))
            self.f = open(self.filename, 'wb', 0)
            self.displaying = False
        elif block != self.expected_block:
            # lost block
            print "Lost image block {}".format(self.expected_block)

        print "Received image block {}".format(block)
        self.f.write(data)
        self.expected_block = block + 1

        if self.display and not self.displaying and block >= 5:
            self.displaying = True
            try:
                self.feh.open(self.filename)
            except Exception:
                pass