Exemplo n.º 1
0
    def listen(self):
        high_resolution_time = self.perf_counter_origin < 0
        timestamp_origin = self.timestamp_origin
        perf_counter_origin = self.perf_counter_origin

        while True:
            if self.closeEvent.isSet():
                return
            if not self.commPort.inWaiting():
                continue
            if high_resolution_time:
                recv_timestamp = time()
            else:
                recv_timestamp = timestamp_origin + perf_counter(
                ) - perf_counter_origin
            length, counter = self.HEADER.unpack(
                self.commPort.read(self.HEADER_SIZE))

            response = self.commPort.read(length)
            self.timing.stop()

            if len(response) != length:
                raise types.FrameSizeError("Size mismatch.")

            self.processResponse(response, length, counter, recv_timestamp)
Exemplo n.º 2
0
 def processResponse(self, response, length, counter):
     self.counterReceived = counter
     if hasattr(self, 'use_tcp'):
         use_tcp = self.use_tcp
     else:
         use_tcp = False
     if not use_tcp:
         # for TCP this error cannot occur, instead a timeout
         # will be reaised while waiting for the correct number
         # of bytes to be received to complete the message
         if len(response) != length:
             raise types.FrameSizeError("Size mismatch.")
     pid = response[0]
     if pid >= 0xFC:
         self.logger.debug("<- L{} C{} {}".format(
             length,
             counter,
             hexDump(response),
         ))
         if pid >= 0xfe:
             self.resQueue.put(response)
         elif pid == 0xfd:
             self.evQueue.put(response)
         elif pid == 0xfc:
             self.servQueue.put(response)
     else:
         if self.first_daq_timestamp is None:
             self.first_daq_timestamp = datetime.now()
         self.daqQueue.put((response, counter, length))
Exemplo n.º 3
0
 def processResponse(self, response):
     if len(response) < self.HEADER_SIZE:
         raise types.FrameSizeError("Frame too short.")
     self.logger.debug("<- {}\n".format(hexDump(response)))
     packetLen, self.counterReceived = struct.unpack(
         self.HEADER, response[:4])
     xcpPDU = response[4:]
     if len(xcpPDU) != packetLen:
         raise types.FrameSizeError("Size mismatch.")
     pid = xcpPDU[0]
     if pid == 0xff or xcpPDU[0] == 0xfe:
         self.resQueue.put(xcpPDU)
     elif pid == 0xfd:
         self.evQueue.put(xcpPDU)
     elif pid == 0xfc:
         self.servQueue.put(xcpPDU)
     else:
         self.daqQueue.put(xcpPDU)
Exemplo n.º 4
0
    def listen(self):
        while True:
            if self.closeEvent.isSet():
                return
            if not self.commPort.inWaiting():
                continue
            length, counter = self.HEADER.unpack(
                self.commPort.read(self.HEADER_SIZE))

            response = self.commPort.read(length)
            self.timing.stop()

            if len(response) != length:
                raise types.FrameSizeError("Size mismatch.")

            self.processResponse(response, length, counter)
Exemplo n.º 5
0
 def processResponse(self, response, length, counter):
     self.counterReceived = counter
     response = response
     if len(response) != length:
         raise types.FrameSizeError("Size mismatch.")
     pid = response[0]
     if pid >= 0xFC:
         self.logger.debug("<- L{} C{} {}\n".format(
             length,
             counter,
             hexDump(response),
         ))
         if pid >= 0xfe:
             self.resQueue.put(response)
         elif pid == 0xfd:
             self.evQueue.put(response)
         elif pid == 0xfc:
             self.servQueue.put(response)
     else:
         if self.first_daq_timestamp is None:
             self.first_daq_timestamp = datetime.now()
         self.daqQueue.put((response, counter, length))
Exemplo n.º 6
0
    def listen(self):
        HEADER_UNPACK = self.HEADER.unpack
        HEADER_SIZE = self.HEADER_SIZE
        use_tcp = self.use_tcp
        processResponse = self.processResponse
        EVENT_READ = selectors.EVENT_READ

        close_event_set = self.closeEvent.isSet
        socket_fileno = self.sock.fileno
        select = self.selector.select

        high_resolution_time = self.perf_counter_origin > 0
        timestamp_origin = self.timestamp_origin
        perf_counter_origin = self.perf_counter_origin

        if use_tcp:
            sock_recv = self.sock.recv
        else:
            sock_recv = self.sock.recvfrom

        while True:
            try:
                if close_event_set() or socket_fileno() == -1:
                    return
                sel = select(0.1)
                for _, events in sel:
                    if events & EVENT_READ:
                        if high_resolution_time:
                            recv_timestamp = time()
                        else:
                            recv_timestamp = timestamp_origin + perf_counter() - perf_counter_origin
                        if use_tcp:

                            # first try to get the header in one go
                            # if we are lucky this will avoid creating a
                            # bytearray and extending it
                            header = sock_recv(HEADER_SIZE)
                            size = len(header)
                            if size != HEADER_SIZE:

                                start = perf_counter()

                                header = bytearray(header)

                                while len(header) != HEADER_SIZE:
                                    header.extend(
                                        sock_recv(HEADER_SIZE - len(header))
                                    )
                                    if perf_counter() - start > 2:
                                        raise types.XcpTimeoutError("Eth frame header read timed out.") from None

                            length, counter = HEADER_UNPACK(header)

                            try:
                                # first try to get the response in one go
                                # similar to the header
                                response = sock_recv(length)
                                size = len(response)

                                if size != length:

                                    start = perf_counter()

                                    response = bytearray(response)
                                    while len(response) != length:
                                        response.extend(
                                            sock_recv(length - len(response))
                                        )

                                        if perf_counter() - start > 2:
                                            raise types.XcpTimeoutError("Eth frame payload read timed out.") from None

                            except Exception as e:
                                self.logger.error(str(e))
                                continue
                        else:
                            try:
                                response, _ = sock_recv(
                                    Eth.MAX_DATAGRAM_SIZE
                                )
                                length, counter = HEADER_UNPACK(
                                    response[:HEADER_SIZE]
                                )
                                response = response[HEADER_SIZE:]

                                if len(response) != length:
                                    raise types.FrameSizeError("Size mismatch.")

                            except Exception as e:
                                self.logger.error(str(e))
                                continue

                        processResponse(response, length, counter, recv_timestamp)
            except Exception:
                self.status = 0  # disconnected
                break