def request(self, cmd, *data): self.logger.debug(cmd.name) self.parent._setService(cmd) cmdlen = cmd.bit_length() // 8 # calculate bytes needed for cmd header = self.HEADER.pack(cmdlen + len(data), self.counterSend) self.counterSend = (self.counterSend + 1) & 0xffff frame = header + bytes(flatten(cmd.to_bytes(cmdlen, 'big'), data)) self.logger.debug("-> {}".format(hexDump(frame))) self.timing.start() self.send(frame) try: xcpPDU = self.resQueue.get(timeout=2.0) except queue.Empty: if PYTHON_VERSION >= (3, 3): raise types.XcpTimeoutError("Response timed out.") from None else: raise types.XcpTimeoutError("Response timed out.") self.resQueue.task_done() # TODO: move up!? self.timing.stop() pid = types.Response.parse(xcpPDU).type if pid == 'ERR' and cmd.name != 'SYNCH': err = types.XcpError.parse(xcpPDU[1:]) raise types.XcpResponseError(err) else: pass # Und nu?? return xcpPDU[1:]
def _request_internal(self, cmd, ignore_timeout=False, *data): frame = self._prepare_request(cmd, *data) self.timing.start() self.send(frame) try: xcpPDU = get( self.resQueue, timeout=self.timeout, restart_event=self.timer_restart_event, ) except Empty: if not ignore_timeout: raise types.XcpTimeoutError( "Response timed out (timeout={}s)".format( self.timeout)) from None else: self.timing.stop() return self.timing.stop() pid = types.Response.parse(xcpPDU).type if pid == "ERR" and cmd.name != "SYNCH": err = types.XcpError.parse(xcpPDU[1:]) raise types.XcpResponseError(err) else: pass # Und nu?? return xcpPDU[1:]
def request(self, cmd, *data): self.logger.debug(cmd.name) header = struct.pack("<HH", len(data) + 1, self.counterSend) self.counterSend += 1 self.counterSend &= 0xffff frame = header + bytearray([cmd, *data]) self.logger.debug("-> {}".format(hexDump(frame))) self.timing.start() self.send(frame) try: xcpPDU = self.resQueue.get(timeout=2.0) except queue.Empty: if PYTHON_VERSION >= (3, 3): raise types.XcpTimeoutError("Response timed out.") from None else: raise types.XcpTimeoutError("Response timed out.") self.resQueue.task_done() # TODO: move up!? self.timing.stop() pid = types.Response.parse(xcpPDU).type if pid == 'ERR' and cmd.name != 'SYNCH': err = types.XcpError.parse(xcpPDU[1:]) raise types.XcpResponseError(err) else: pass # Und nu?? return xcpPDU[1:]
def block_request(self, cmd, *data): """ Implements packet transmission for block communication model (e.g. DOWNLOAD block mode) All parameters are the same as in request(), but it does not receive response. """ # check response queue before each block request, so that if the slave device # has responded with a negative response (e.g. ACCESS_DENIED or SEQUENCE_ERROR), we can # process it. if self.resQueue: xcpPDU = self.resQueue.popleft() pid = types.Response.parse(xcpPDU).type if pid == 'ERR' and cmd.name != 'SYNCH': err = types.XcpError.parse(xcpPDU[1:]) raise types.XcpResponseError(err) frame = self._prepare_request(cmd, *data) self.send(frame)
def request(self, cmd, *data): frame = self._prepare_request(cmd, *data) self.timing.start() self.send(frame) try: xcpPDU = get(self.resQueue, timeout=2.0) except Empty: raise types.XcpTimeoutError("Response timed out.") from None self.timing.stop() pid = types.Response.parse(xcpPDU).type if pid == 'ERR' and cmd.name != 'SYNCH': err = types.XcpError.parse(xcpPDU[1:]) raise types.XcpResponseError(err) else: pass # Und nu?? return xcpPDU[1:]