Esempio n. 1
0
    def decode(self, input_file):
        # Encode aivdm data back into binary
        fragments = []
        payload = self._aivdm[1][0]
        data = Data(input_file)
        while data:
            try:
                calculated_crc = self._get_crc(data)
                packet = decode(self._aivdm[0], data)
                if packet.checksum != calculated_crc:
                    sys.stderr.write('Crc mismatch; expected %02X, but '
                            'calculated %02X. Skipping packet.\n' %
                            (packet.checksum, calculated_crc))
                    continue

                bits = encode(payload, list(ord(c.character) for c in packet.payload))
                bits = bits.pop(len(bits) - packet.num_fill_bits)
                if len(fragments) == packet.fragment_number - 1:
                    fragments.append(bits)
                    if len(fragments) == packet.fragment_count:
                        self._decode_ais(reduce(operator.add, fragments))
                        fragments = []
                else:
                    sys.stderr.write('Expected fragment number %i, got %i (of %i)\n' % (
                        len(fragments) + 1, packet.fragment_number, packet.fragment_count))
                    fragments = []
            except DecodeError, ex:
                filename, line_number, column_number = self._aivdm[2][ex.entry]
                sys.stderr.write('%s[%i] - %s\n' %  (filename, line_number, ex))
                fragments = []

                # Read to the next newline
                while data and data.pop(8).text('ascii') != '\n':
                    pass