def send(self, name, packet, *args): if self._symmetrical: namedArgs = dict() names = list(packet['args']) for i in range(len(args)): namedArgs[names[i]] = args[i] symmetrical(self._proto_name, name, namedArgs) args = list(map(lambda x: namedArgs[x], namedArgs)) formats = list(map(lambda x: packet['args'][x], list(packet['args']))) encode(self._stream, packet['id'], list(zip(args, formats)))
def recv(id, args): if id == -1: callback(None, args) return if self._proto == None: if id == 255: if len(args) != 1: self._logger.warning("invalid arguments count for id %d" %id) return board = args[0] for proto_name in self._protos: proto = self._protos[proto_name] if proto["id"] == board: self._proto = proto self._proto_name = proto_name.lower() self.logger.info("Loading proto '%s'" %proto_name) recv(id, args) if self._proto == None: self._logger.warning("unknow board %d" %board) else: self._logger.info("no protocol loaded, can't decode id %d" %id) else: know_packet = False for packet_name in self._proto['packets']: packet = self._proto['packets'][packet_name] if packet['id'] == id: know_packet = True break if not know_packet: self._logger.warning("unknow packet id %d" %id) return if packet['transmitter'] == transmitter and packet['transmitter'] != 'both' and transmitter != 'both': self._logger.info("ignoring %s message" %packet['transmitter']) return if len(packet['args']) != len(args) \ and len(packet['args']) + 2 != len(args): self._logger.warning("packet with id %d expected " \ "%d arguments, %d was given" %(id, len(packet['args']), len(args))) return arguments = dict(zip(packet['args'], args)) if len(args) == len(packet['args']) + 2: arguments['timestamp'] = args[-2] arguments['microseconds'] = args[-1] if self._symmetrical: symmetrical(self._proto_name, packet_name, arguments) callback(packet_name, arguments)