Skip to content

Commit e3d912b

Browse files
authored
Send HighPriority Message to flush VectorBus Tx buffer (#1636)
* Refactor flush_tx_queue for VectorBus * Remove test_flush_tx_buffer_mocked Implementation cannot be tested due to Vector TX queue being not accessible * Update formatting in flush_tx_queue * Add tests for VectorBus flush_tx_queue * Refactor docstring for VectorBus flush_tx_queue
1 parent 237f2be commit e3d912b

File tree

2 files changed

+66
-2
lines changed

2 files changed

+66
-2
lines changed

can/interfaces/vector/canlib.py

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -876,7 +876,40 @@ def _build_xl_can_tx_event(msg: Message) -> xlclass.XLcanTxEvent:
876876
return xl_can_tx_event
877877

878878
def flush_tx_buffer(self) -> None:
879-
self.xldriver.xlCanFlushTransmitQueue(self.port_handle, self.mask)
879+
"""
880+
Flush the TX buffer of the bus.
881+
882+
Implementation does not use function ``xlCanFlushTransmitQueue`` of the XL driver, as it works only
883+
for XL family devices.
884+
885+
.. warning::
886+
Using this function will flush the queue and send a high voltage message (ID = 0, DLC = 0, no data).
887+
"""
888+
if self._can_protocol is CanProtocol.CAN_FD:
889+
xl_can_tx_event = xlclass.XLcanTxEvent()
890+
xl_can_tx_event.tag = xldefine.XL_CANFD_TX_EventTags.XL_CAN_EV_TAG_TX_MSG
891+
xl_can_tx_event.tagData.canMsg.msgFlags |= (
892+
xldefine.XL_CANFD_TX_MessageFlags.XL_CAN_TXMSG_FLAG_HIGHPRIO
893+
)
894+
895+
self.xldriver.xlCanTransmitEx(
896+
self.port_handle,
897+
self.mask,
898+
ctypes.c_uint(1),
899+
ctypes.c_uint(0),
900+
xl_can_tx_event,
901+
)
902+
else:
903+
xl_event = xlclass.XLevent()
904+
xl_event.tag = xldefine.XL_EventTags.XL_TRANSMIT_MSG
905+
xl_event.tagData.msg.flags |= (
906+
xldefine.XL_MessageFlags.XL_CAN_MSG_FLAG_OVERRUN
907+
| xldefine.XL_MessageFlags.XL_CAN_MSG_FLAG_WAKEUP
908+
)
909+
910+
self.xldriver.xlCanTransmit(
911+
self.port_handle, self.mask, ctypes.c_uint(1), xl_event
912+
)
880913

881914
def shutdown(self) -> None:
882915
super().shutdown()

test/test_vector.py

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -613,7 +613,38 @@ def test_receive_fd_non_msg_event() -> None:
613613
def test_flush_tx_buffer_mocked(mock_xldriver) -> None:
614614
bus = can.Bus(channel=0, interface="vector", _testing=True)
615615
bus.flush_tx_buffer()
616-
can.interfaces.vector.canlib.xldriver.xlCanFlushTransmitQueue.assert_called()
616+
transmit_args = can.interfaces.vector.canlib.xldriver.xlCanTransmit.call_args[0]
617+
618+
num_msg = transmit_args[2]
619+
assert num_msg.value == ctypes.c_uint(1).value
620+
621+
event = transmit_args[3]
622+
assert isinstance(event, xlclass.XLevent)
623+
assert event.tag & xldefine.XL_EventTags.XL_TRANSMIT_MSG
624+
assert event.tagData.msg.flags & (
625+
xldefine.XL_MessageFlags.XL_CAN_MSG_FLAG_OVERRUN
626+
| xldefine.XL_MessageFlags.XL_CAN_MSG_FLAG_WAKEUP
627+
)
628+
629+
630+
def test_flush_tx_buffer_fd_mocked(mock_xldriver) -> None:
631+
bus = can.Bus(channel=0, interface="vector", fd=True, _testing=True)
632+
bus.flush_tx_buffer()
633+
transmit_args = can.interfaces.vector.canlib.xldriver.xlCanTransmitEx.call_args[0]
634+
635+
num_msg = transmit_args[2]
636+
assert num_msg.value == ctypes.c_uint(1).value
637+
638+
num_msg_sent = transmit_args[3]
639+
assert num_msg_sent.value == ctypes.c_uint(0).value
640+
641+
event = transmit_args[4]
642+
assert isinstance(event, xlclass.XLcanTxEvent)
643+
assert event.tag & xldefine.XL_CANFD_TX_EventTags.XL_CAN_EV_TAG_TX_MSG
644+
assert (
645+
event.tagData.canMsg.msgFlags
646+
& xldefine.XL_CANFD_TX_MessageFlags.XL_CAN_TXMSG_FLAG_HIGHPRIO
647+
)
617648

618649

619650
@pytest.mark.skipif(not XLDRIVER_FOUND, reason="Vector XL API is unavailable")

0 commit comments

Comments
 (0)