Example #1
0
  def dataReceived(self, recd):
    self.recvd = self.recvd + recd
    while len(self.recvd) >= 10:

      # hack for DeLorme EarthMate
      if self.recvd[:8] == 'EARTHA\r\n':
        if self.allow_earthmate_hack:
          self.allow_earthmate_hack = 0
          self.transport.write('EARTHA\r\n')
        self.recvd = self.recvd[8:]
        continue
      
      if self.recvd[0:2] != '\xFF\x81':
        if DEBUG:
          raise ZodiacParseError('Invalid Sync %r' % self.recvd)
        else:
          raise ZodiacParseError
      sync, msg_id, length, acknak, checksum = struct.unpack('<HHHHh', self.recvd[:10])
      
      # verify checksum
      cksum = -(reduce(operator.add, (sync, msg_id, length, acknak)) & 0xFFFF)
      cksum, = struct.unpack('<h', struct.pack('<h', cksum))
      if cksum != checksum:
        if DEBUG:
          raise ZodiacParseError('Invalid Header Checksum %r != %r %r' % (checksum, cksum, self.recvd[:8]))
        else:
          raise ZodiacParseError
      
      # length was in words, now it's bytes
      length = length * 2

      # do we need more data ?
      neededBytes = 10
      if length:
        neededBytes += length + 2
      if len(self.recvd) < neededBytes:
        break
      
      if neededBytes > self.MAX_LENGTH:
        raise ZodiacParseError("Invalid Header??")

      # empty messages pass empty strings
      message = ''

      # does this message have data ?
      if length:
        message, checksum = self.recvd[10:10+length], struct.unpack('<h', self.recvd[10+length:neededBytes])[0]
        cksum = 0x10000 - (reduce(operator.add, struct.unpack('<%dH' % (length/2), message)) & 0xFFFF)
        cksum, = struct.unpack('<h', struct.pack('<h', cksum))
        if cksum != checksum:
          if DEBUG:
            log.dmsg('msg_id = %r length = %r' % (msg_id, length), debug=True)
            raise ZodiacParseError('Invalid Data Checksum %r != %r %r' % (checksum, cksum, message))
          else:
            raise ZodiacParseError
      
      # discard used buffer, dispatch message
      self.recvd = self.recvd[neededBytes:]
      self.receivedMessage(msg_id, message, acknak)
Example #2
0
 def dataReceived(self, recd):
   self.recvd = self.recvd + recd
   while len(self.recvd) >= 10:
     if self.recvd[:8] == 'EARTHA\r\n':
       if self.allow_earthmate_hack:
         self.allow_earthmate_hack = 0
         self.transport.write('EARTHA\r\n')
       self.recvd = self.recvd[8:]
       continue
     if self.recvd[0:2] != '\xFF\x81':
       if DEBUG:
         raise ZodiacParseError('Invalid Sync %r' % self.recvd)
       else:
         raise ZodiacParseError
     sync, msg_id, length, acknak, checksum = struct.unpack('<HHHHh', self.recvd[:10])
     cksum = -(reduce(operator.add, (sync, msg_id, length, acknak)) & 0xFFFF)
     cksum, = struct.unpack('<h', struct.pack('<h', cksum))
     if cksum != checksum:
       if DEBUG:
         raise ZodiacParseError('Invalid Header Checksum %r != %r %r' % (checksum, cksum, self.recvd[:8]))
       else:
         raise ZodiacParseError
     length = length * 2
     neededBytes = 10
     if length:
       neededBytes += length + 2
     if len(self.recvd) < neededBytes:
       break
     if neededBytes > self.MAX_LENGTH:
       raise ZodiacParseError("Invalid Header??")
     message = ''
     if length:
       message, checksum = self.recvd[10:10+length], struct.unpack('<h', self.recvd[10+length:neededBytes])[0]
       cksum = 0x10000 - (reduce(operator.add, struct.unpack('<%dH' % (length/2), message)) & 0xFFFF)
       cksum, = struct.unpack('<h', struct.pack('<h', cksum))
       if cksum != checksum:
         if DEBUG:
           log.dmsg('msg_id = %r length = %r' % (msg_id, length), debug=True)
           raise ZodiacParseError('Invalid Data Checksum %r != %r %r' % (checksum, cksum, message))
         else:
           raise ZodiacParseError
     self.recvd = self.recvd[neededBytes:]
     self.receivedMessage(msg_id, message, acknak)
Example #3
0
    def dataReceived(self, recd):
        self.recvd = self.recvd + recd
        while len(self.recvd) >= 10:

            # hack for DeLorme EarthMate
            if self.recvd[:8] == 'EARTHA\r\n':
                if self.allow_earthmate_hack:
                    self.allow_earthmate_hack = 0
                    self.transport.write('EARTHA\r\n')
                self.recvd = self.recvd[8:]
                continue

            if self.recvd[0:2] != '\xFF\x81':
                if DEBUG:
                    raise ZodiacParseError('Invalid Sync %r' % self.recvd)
                else:
                    raise ZodiacParseError
            sync, msg_id, length, acknak, checksum = struct.unpack(
                '<HHHHh', self.recvd[:10])

            # verify checksum
            cksum = -(reduce(operator.add,
                             (sync, msg_id, length, acknak)) & 0xFFFF)
            cksum, = struct.unpack('<h', struct.pack('<h', cksum))
            if cksum != checksum:
                if DEBUG:
                    raise ZodiacParseError(
                        'Invalid Header Checksum %r != %r %r' %
                        (checksum, cksum, self.recvd[:8]))
                else:
                    raise ZodiacParseError

            # length was in words, now it's bytes
            length = length * 2

            # do we need more data ?
            neededBytes = 10
            if length:
                neededBytes += length + 2
            if len(self.recvd) < neededBytes:
                break

            if neededBytes > self.MAX_LENGTH:
                raise ZodiacParseError("Invalid Header??")

            # empty messages pass empty strings
            message = ''

            # does this message have data ?
            if length:
                message, checksum = self.recvd[10:10 + length], struct.unpack(
                    '<h', self.recvd[10 + length:neededBytes])[0]
                cksum = 0x10000 - (reduce(
                    operator.add, struct.unpack('<%dH' %
                                                (length / 2), message))
                                   & 0xFFFF)
                cksum, = struct.unpack('<h', struct.pack('<h', cksum))
                if cksum != checksum:
                    if DEBUG:
                        log.dmsg('msg_id = %r length = %r' % (msg_id, length),
                                 debug=True)
                        raise ZodiacParseError(
                            'Invalid Data Checksum %r != %r %r' %
                            (checksum, cksum, message))
                    else:
                        raise ZodiacParseError

            # discard used buffer, dispatch message
            self.recvd = self.recvd[neededBytes:]
            self.receivedMessage(msg_id, message, acknak)