예제 #1
0
    def on_message_received(self, msg):
        channel = channel2int(msg.channel)
        if channel is None:
            channel = self.channel
        else:
            # Many interfaces start channel numbering at 0 which is invalid
            channel += 1

        arb_id = msg.arbitration_id
        if msg.is_extended_id:
            arb_id |= CAN_MSG_EXT
        flags = REMOTE_FLAG if msg.is_remote_frame else 0
        if not msg.is_rx:
            flags |= DIR
        can_data = bytes(msg.data)

        if msg.is_error_frame:
            data = CAN_ERROR_EXT_STRUCT.pack(
                channel,
                0,  # length
                0,  # flags
                0,  # ecc
                0,  # position
                len2dlc(msg.dlc),
                0,  # frame length
                arb_id,
                0,  # ext flags
                can_data,
            )
            self._add_object(CAN_ERROR_EXT, data, msg.timestamp)
        elif msg.is_fd:
            fd_flags = EDL
            if msg.bitrate_switch:
                fd_flags |= BRS
            if msg.error_state_indicator:
                fd_flags |= ESI
            data = CAN_FD_MSG_STRUCT.pack(
                channel,
                flags,
                len2dlc(msg.dlc),
                arb_id,
                0,
                0,
                fd_flags,
                len(can_data),
                can_data,
            )
            self._add_object(CAN_FD_MESSAGE, data, msg.timestamp)
        else:
            data = CAN_MSG_STRUCT.pack(channel, flags, msg.dlc, arb_id,
                                       can_data)
            self._add_object(CAN_MESSAGE, data, msg.timestamp)
예제 #2
0
    def send(self, msg, timeout=None):
        msgType = PCAN_MESSAGE_EXTENDED.value if msg.is_extended_id else PCAN_MESSAGE_STANDARD.value
        if msg.is_remote_frame:
            msgType |= PCAN_MESSAGE_RTR.value
        if msg.is_error_frame:
            msgType |= PCAN_MESSAGE_ERRFRAME.value
        if msg.is_fd:
            msgType |= PCAN_MESSAGE_FD.value
        if msg.bitrate_switch:
            msgType |= PCAN_MESSAGE_BRS.value
        if msg.error_state_indicator:
            msgType |= PCAN_MESSAGE_ESI.value

        if self.fd:
            # create a TPCANMsg message structure
            if platform.system() == 'Darwin':
                CANMsg = TPCANMsgFDMac()
            else:
                CANMsg = TPCANMsgFD()

            # configure the message. ID, Length of data, message type and data
            CANMsg.ID = msg.arbitration_id
            CANMsg.DLC = len2dlc(msg.dlc)
            CANMsg.MSGTYPE = msgType

            # copy data
            for i in range(msg.dlc):
                CANMsg.DATA[i] = msg.data[i]

            log.debug("Data: %s", msg.data)
            log.debug("Type: %s", type(msg.data))

            result = self.m_objPCANBasic.WriteFD(self.m_PcanHandle, CANMsg)

        else:
            # create a TPCANMsg message structure
            if platform.system() == 'Darwin':
                CANMsg = TPCANMsgMac()
            else:
                CANMsg = TPCANMsg()

            # configure the message. ID, Length of data, message type and data
            CANMsg.ID = msg.arbitration_id
            CANMsg.LEN = msg.dlc
            CANMsg.MSGTYPE = msgType

            # if a remote frame will be sent, data bytes are not important.
            if not msg.is_remote_frame:
                # copy data
                for i in range(CANMsg.LEN):
                    CANMsg.DATA[i] = msg.data[i]

            log.debug("Data: %s", msg.data)
            log.debug("Type: %s", type(msg.data))

            result = self.m_objPCANBasic.Write(self.m_PcanHandle, CANMsg)

        if result != PCAN_ERROR_OK:
            raise PcanError("Failed to send: " +
                            self._get_formatted_error(result))
예제 #3
0
    def send(self, msg, timeout=None):
        msg_id = msg.arbitration_id

        if msg.is_extended_id:
            msg_id |= xldefine.XL_MessageFlagsExtended.XL_CAN_EXT_MSG_ID.value

        flags = 0

        # If channel has been specified, try to send only to that one.
        # Otherwise send to all channels
        mask = self.channel_masks.get(msg.channel, self.mask)

        if self.fd:
            if msg.is_fd:
                flags |= xldefine.XL_CANFD_TX_MessageFlags.XL_CAN_TXMSG_FLAG_EDL.value
            if msg.bitrate_switch:
                flags |= xldefine.XL_CANFD_TX_MessageFlags.XL_CAN_TXMSG_FLAG_BRS.value
            if msg.is_remote_frame:
                flags |= xldefine.XL_CANFD_TX_MessageFlags.XL_CAN_TXMSG_FLAG_RTR.value

            message_count = 1
            MsgCntSent = ctypes.c_uint(1)

            XLcanTxEvent = xlclass.XLcanTxEvent()
            XLcanTxEvent.tag = xldefine.XL_CANFD_TX_EventTags.XL_CAN_EV_TAG_TX_MSG.value
            XLcanTxEvent.transId = 0xFFFF

            XLcanTxEvent.tagData.canMsg.canId = msg_id
            XLcanTxEvent.tagData.canMsg.msgFlags = flags
            XLcanTxEvent.tagData.canMsg.dlc = len2dlc(msg.dlc)
            for idx, value in enumerate(msg.data):
                XLcanTxEvent.tagData.canMsg.data[idx] = value
            xldriver.xlCanTransmitEx(self.port_handle, mask, message_count,
                                     MsgCntSent, XLcanTxEvent)

        else:
            if msg.is_remote_frame:
                flags |= xldefine.XL_MessageFlags.XL_CAN_MSG_FLAG_REMOTE_FRAME.value

            message_count = ctypes.c_uint(1)

            xl_event = xlclass.XLevent()
            xl_event.tag = xldefine.XL_EventTags.XL_TRANSMIT_MSG.value

            xl_event.tagData.msg.id = msg_id
            xl_event.tagData.msg.dlc = msg.dlc
            xl_event.tagData.msg.flags = flags
            for idx, value in enumerate(msg.data):
                xl_event.tagData.msg.data[idx] = value
            xldriver.xlCanTransmit(self.port_handle, mask, message_count,
                                   xl_event)
예제 #4
0
    def send(self, msg, timeout=None):
        msg_id = msg.arbitration_id

        if msg.id_type:
            msg_id |= vxlapi.XL_CAN_EXT_MSG_ID

        flags = 0

        # If channel has been specified, try to send only to that one.
        # Otherwise send to all channels
        mask = self.channel_masks.get(msg.channel, self.mask)

        if self.fd:
            if msg.is_fd:
                flags |= vxlapi.XL_CAN_TXMSG_FLAG_EDL
            if msg.bitrate_switch:
                flags |= vxlapi.XL_CAN_TXMSG_FLAG_BRS
            if msg.is_remote_frame:
                flags |= vxlapi.XL_CAN_TXMSG_FLAG_RTR

            message_count = 1
            MsgCntSent = ctypes.c_uint(1)

            XLcanTxEvent = vxlapi.XLcanTxEvent()
            XLcanTxEvent.tag = vxlapi.XL_CAN_EV_TAG_TX_MSG
            XLcanTxEvent.transId = 0xffff

            XLcanTxEvent.tagData.canMsg.canId = msg_id
            XLcanTxEvent.tagData.canMsg.msgFlags = flags
            XLcanTxEvent.tagData.canMsg.dlc = len2dlc(msg.dlc)
            for idx, value in enumerate(msg.data):
                XLcanTxEvent.tagData.canMsg.data[idx] = value
            vxlapi.xlCanTransmitEx(self.port_handle, mask, message_count,
                                   MsgCntSent, XLcanTxEvent)

        else:
            if msg.is_remote_frame:
                flags |= vxlapi.XL_CAN_MSG_FLAG_REMOTE_FRAME

            message_count = ctypes.c_uint(1)

            xl_event = vxlapi.XLevent()
            xl_event.tag = vxlapi.XL_TRANSMIT_MSG

            xl_event.tagData.msg.id = msg_id
            xl_event.tagData.msg.dlc = msg.dlc
            xl_event.tagData.msg.flags = flags
            for idx, value in enumerate(msg.data):
                xl_event.tagData.msg.data[idx] = value
            vxlapi.xlCanTransmit(self.port_handle, mask, message_count,
                                 xl_event)
예제 #5
0
    def on_message_received(self, msg):
        channel = channel2int(msg.channel)
        if channel is None:
            channel = self.channel
        else:
            # Many interfaces start channel numbering at 0 which is invalid
            channel += 1

        arb_id = msg.arbitration_id
        if msg.is_extended_id:
            arb_id |= CAN_MSG_EXT
        flags = REMOTE_FLAG if msg.is_remote_frame else 0
        data = bytes(msg.data)

        if msg.is_error_frame:
            data = CAN_ERROR_EXT_STRUCT.pack(channel,
                                             0,     # length
                                             0,     # flags
                                             0,     # ecc
                                             0,     # position
                                             len2dlc(msg.dlc),
                                             0,     # frame length
                                             arb_id,
                                             0,     # ext flags
                                             data)
            self._add_object(CAN_ERROR_EXT, data, msg.timestamp)
        elif msg.is_fd:
            fd_flags = EDL
            if msg.bitrate_switch:
                fd_flags |= BRS
            if msg.error_state_indicator:
                fd_flags |= ESI
            data = CAN_FD_MSG_STRUCT.pack(channel, flags, len2dlc(msg.dlc),
                                          arb_id, 0, 0, fd_flags, msg.dlc, data)
            self._add_object(CAN_FD_MESSAGE, data, msg.timestamp)
        else:
            data = CAN_MSG_STRUCT.pack(channel, flags, msg.dlc, arb_id, data)
            self._add_object(CAN_MESSAGE, data, msg.timestamp)
예제 #6
0
    def send(self, msg, timeout=None):
        msg_id = msg.arbitration_id

        if msg.is_extended_id:
            msg_id |= vxlapi.XL_CAN_EXT_MSG_ID

        flags = 0

        # If channel has been specified, try to send only to that one.
        # Otherwise send to all channels
        mask = self.channel_masks.get(msg.channel, self.mask)

        if self.fd:
            if msg.is_fd:
                flags |= vxlapi.XL_CAN_TXMSG_FLAG_EDL
            if msg.bitrate_switch:
                flags |= vxlapi.XL_CAN_TXMSG_FLAG_BRS
            if msg.is_remote_frame:
                flags |= vxlapi.XL_CAN_TXMSG_FLAG_RTR
                        
            message_count = 1
            MsgCntSent = ctypes.c_uint(1)
            
            XLcanTxEvent = vxlapi.XLcanTxEvent()
            XLcanTxEvent.tag = vxlapi.XL_CAN_EV_TAG_TX_MSG
            XLcanTxEvent.transId = 0xffff
            
            XLcanTxEvent.tagData.canMsg.canId = msg_id
            XLcanTxEvent.tagData.canMsg.msgFlags = flags
            XLcanTxEvent.tagData.canMsg.dlc = len2dlc(msg.dlc)
            for idx, value in enumerate(msg.data):
                XLcanTxEvent.tagData.canMsg.data[idx] = value
            vxlapi.xlCanTransmitEx(self.port_handle, mask, message_count, MsgCntSent, XLcanTxEvent)

        else:
            if msg.is_remote_frame:
                flags |= vxlapi.XL_CAN_MSG_FLAG_REMOTE_FRAME

            message_count = ctypes.c_uint(1)
            
            xl_event = vxlapi.XLevent()
            xl_event.tag = vxlapi.XL_TRANSMIT_MSG
            
            xl_event.tagData.msg.id = msg_id
            xl_event.tagData.msg.dlc = msg.dlc
            xl_event.tagData.msg.flags = flags
            for idx, value in enumerate(msg.data):
                xl_event.tagData.msg.data[idx] = value
            vxlapi.xlCanTransmit(self.port_handle, mask, message_count, xl_event)
예제 #7
0
    def _build_xl_can_tx_event(msg: Message) -> xlclass.XLcanTxEvent:
        msg_id = msg.arbitration_id
        if msg.is_extended_id:
            msg_id |= xldefine.XL_MessageFlagsExtended.XL_CAN_EXT_MSG_ID

        flags = 0
        if msg.is_fd:
            flags |= xldefine.XL_CANFD_TX_MessageFlags.XL_CAN_TXMSG_FLAG_EDL
        if msg.bitrate_switch:
            flags |= xldefine.XL_CANFD_TX_MessageFlags.XL_CAN_TXMSG_FLAG_BRS
        if msg.is_remote_frame:
            flags |= xldefine.XL_CANFD_TX_MessageFlags.XL_CAN_TXMSG_FLAG_RTR

        xl_can_tx_event = xlclass.XLcanTxEvent()
        xl_can_tx_event.tag = xldefine.XL_CANFD_TX_EventTags.XL_CAN_EV_TAG_TX_MSG
        xl_can_tx_event.transId = 0xFFFF

        xl_can_tx_event.tagData.canMsg.canId = msg_id
        xl_can_tx_event.tagData.canMsg.msgFlags = flags
        xl_can_tx_event.tagData.canMsg.dlc = len2dlc(msg.dlc)
        xl_can_tx_event.tagData.canMsg.data = tuple(msg.data)

        return xl_can_tx_event