def from_payload(cls, payload): """ Creates a ``Request`` object from a payload coming from the underlying protocols. This method is meant to be used by a UDS server :param payload: The payload of data to parse :type payload: bytes :return: A :ref:`Request<Request>` object with populated fields :rtype: :ref:`Request<Request>` """ req = cls() if len(payload) >= 1: req.service = services.cls_from_request_id(payload[0]) if req.service is not None: # Invalid service ID will make service None offset = 0 if req.service.use_subfunction(): offset += 1 if len(payload) >= offset+1: req.subfunction = int(payload[1]) & 0x7F req.suppress_positive_response = True if payload[1] & 0x80 > 0 else False if len(payload) > offset+1: req.data = payload[offset+1:] return req
def from_payload(cls, payload): from udsoncan import services response = cls() response.original_payload = payload # may be useful for debugging if len(payload) < 1: response.valid = False response.invalid_reason = "Payload is empty" return response if payload[0] != 0x7F: # Positive response.service = services.cls_from_response_id(payload[0]) if response.service is None: response.valid = False response.invalid_reason = "Payload first byte is not a know service response ID." return response data_start = 1 response.positive = True if len(payload) < 2 and response.service.has_response_data(): response.valid = False response.positive = False response.invalid_reason = "Payload must be at least 2 bytes long (service and response)" return response response.code = Response.Code.PositiveResponse response.code_name = Response.Code.get_name( Response.Code.PositiveResponse) else: # Negative response response.positive = False data_start = 3 if len(payload) < 2: response.valid = False response.invalid_reason = "Incomplete invalid response service (7Fxx)" return response response.service = services.cls_from_request_id( payload[1]) #Request id, not response id if response.service is None: response.valid = False response.invalid_reason = "Payload second byte is not a known service request ID." return response if len(payload) < 3: response.valid = False response.invalid_reason = "Response code missing" return response response.code = int(payload[2]) response.code_name = Response.Code.get_name(response.code) response.valid = True if len(payload) > data_start: response.data = payload[data_start:] return response
def from_payload(cls, payload): req = cls() if len(payload) >= 1: req.service = services.cls_from_request_id(payload[0]) if req.service is not None: # Invalid service ID will make service None offset = 0 if req.service.use_subfunction(): offset += 1 if len(payload) >= offset+1: req.subfunction = int(payload[1]) & 0x7F req.suppress_positive_response = True if payload[1] & 0x80 > 0 else False if len(payload) > offset+1: req.data = payload[offset+1:] return req
def from_payload(cls, payload): u""" Creates a ``Response`` object from a payload coming from the underlying protocol. This method is meant to be used by a UDS client :param payload: The payload of data to parse :type payload: bytes :return: A :ref:`Response<Response>` object with populated fields :rtype: :ref:`Response<Response>` """ from udsoncan import services response = cls() response.original_payload = payload # may be useful for debugging if len(payload) < 1: response.valid = False response.invalid_reason = u"Payload is empty" return response if ord(payload[0]) != 0x7F: # Positive response.service = services.cls_from_response_id(ord(payload[0])) if response.service is None: response.valid = False response.invalid_reason = u"Payload first byte is not a know service response ID." return response data_start = 1 response.positive = True if len(payload) < 2 and response.service.has_response_data(): response.valid = False response.positive = False response.invalid_reason = u"Payload must be at least 2 bytes long (service and response)" return response response.code = Response.Code.PositiveResponse response.code_name = Response.Code.get_name( Response.Code.PositiveResponse) else: # Negative response response.positive = False data_start = 3 if len(payload) < 2: response.valid = False response.invalid_reason = u"Incomplete invalid response service (7Fxx)" return response response.service = services.cls_from_request_id(ord( payload[1])) #Request id, not response id if response.service is None: response.valid = False response.invalid_reason = u"Payload second byte is not a known service request ID." return response if len(payload) < 3: response.valid = False response.invalid_reason = u"Response code missing" return response response.code = ord(payload[2]) response.code_name = Response.Code.get_name(response.code) response.valid = True response.invalid_reason = u"" if len(payload) > data_start: response.data = payload[data_start:] return response