Skip to content

Commit 78d25ff

Browse files
authored
Enable send and receive on network ID above 255 (#1627)
1 parent c5d7a7c commit 78d25ff

File tree

1 file changed

+24
-31
lines changed

1 file changed

+24
-31
lines changed

can/interfaces/ics_neovi/neovi_bus.py

Lines changed: 24 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import os
1313
import tempfile
1414
from collections import Counter, defaultdict, deque
15+
from functools import partial
1516
from itertools import cycle
1617
from threading import Event
1718
from warnings import warn
@@ -317,7 +318,8 @@ def _process_msg_queue(self, timeout=0.1):
317318
except ics.RuntimeError:
318319
return
319320
for ics_msg in messages:
320-
if ics_msg.NetworkID not in self.channels:
321+
channel = ics_msg.NetworkID | (ics_msg.NetworkID2 << 8)
322+
if channel not in self.channels:
321323
continue
322324

323325
is_tx = bool(ics_msg.StatusBitField & ics.SPY_STATUS_TX_MSG)
@@ -364,50 +366,37 @@ def _get_timestamp_for_msg(self, ics_msg):
364366
def _ics_msg_to_message(self, ics_msg):
365367
is_fd = ics_msg.Protocol == ics.SPY_PROTOCOL_CANFD
366368

369+
message_from_ics = partial(
370+
Message,
371+
timestamp=self._get_timestamp_for_msg(ics_msg),
372+
arbitration_id=ics_msg.ArbIDOrHeader,
373+
is_extended_id=bool(ics_msg.StatusBitField & ics.SPY_STATUS_XTD_FRAME),
374+
is_remote_frame=bool(ics_msg.StatusBitField & ics.SPY_STATUS_REMOTE_FRAME),
375+
is_error_frame=bool(ics_msg.StatusBitField2 & ics.SPY_STATUS2_ERROR_FRAME),
376+
channel=ics_msg.NetworkID | (ics_msg.NetworkID2 << 8),
377+
dlc=ics_msg.NumberBytesData,
378+
is_fd=is_fd,
379+
is_rx=not bool(ics_msg.StatusBitField & ics.SPY_STATUS_TX_MSG),
380+
)
381+
367382
if is_fd:
368383
if ics_msg.ExtraDataPtrEnabled:
369384
data = ics_msg.ExtraDataPtr[: ics_msg.NumberBytesData]
370385
else:
371386
data = ics_msg.Data[: ics_msg.NumberBytesData]
372387

373-
return Message(
374-
timestamp=self._get_timestamp_for_msg(ics_msg),
375-
arbitration_id=ics_msg.ArbIDOrHeader,
388+
return message_from_ics(
376389
data=data,
377-
dlc=ics_msg.NumberBytesData,
378-
is_extended_id=bool(ics_msg.StatusBitField & ics.SPY_STATUS_XTD_FRAME),
379-
is_fd=is_fd,
380-
is_rx=not bool(ics_msg.StatusBitField & ics.SPY_STATUS_TX_MSG),
381-
is_remote_frame=bool(
382-
ics_msg.StatusBitField & ics.SPY_STATUS_REMOTE_FRAME
383-
),
384-
is_error_frame=bool(
385-
ics_msg.StatusBitField2 & ics.SPY_STATUS2_ERROR_FRAME
386-
),
387390
error_state_indicator=bool(
388391
ics_msg.StatusBitField3 & ics.SPY_STATUS3_CANFD_ESI
389392
),
390393
bitrate_switch=bool(
391394
ics_msg.StatusBitField3 & ics.SPY_STATUS3_CANFD_BRS
392395
),
393-
channel=ics_msg.NetworkID,
394396
)
395397
else:
396-
return Message(
397-
timestamp=self._get_timestamp_for_msg(ics_msg),
398-
arbitration_id=ics_msg.ArbIDOrHeader,
398+
return message_from_ics(
399399
data=ics_msg.Data[: ics_msg.NumberBytesData],
400-
dlc=ics_msg.NumberBytesData,
401-
is_extended_id=bool(ics_msg.StatusBitField & ics.SPY_STATUS_XTD_FRAME),
402-
is_fd=is_fd,
403-
is_rx=not bool(ics_msg.StatusBitField & ics.SPY_STATUS_TX_MSG),
404-
is_remote_frame=bool(
405-
ics_msg.StatusBitField & ics.SPY_STATUS_REMOTE_FRAME
406-
),
407-
is_error_frame=bool(
408-
ics_msg.StatusBitField2 & ics.SPY_STATUS2_ERROR_FRAME
409-
),
410-
channel=ics_msg.NetworkID,
411400
)
412401

413402
def _recv_internal(self, timeout=0.1):
@@ -479,12 +468,16 @@ def send(self, msg, timeout=0):
479468
message.StatusBitField2 = 0
480469
message.StatusBitField3 = flag3
481470
if msg.channel is not None:
482-
message.NetworkID = msg.channel
471+
network_id = msg.channel
483472
elif len(self.channels) == 1:
484-
message.NetworkID = self.channels[0]
473+
network_id = self.channels[0]
485474
else:
486475
raise ValueError("msg.channel must be set when using multiple channels.")
487476

477+
message.NetworkID, message.NetworkID2 = int(network_id & 0xFF), int(
478+
(network_id >> 8) & 0xFF
479+
)
480+
488481
if timeout != 0:
489482
msg_desc_id = next(description_id)
490483
message.DescriptionID = msg_desc_id

0 commit comments

Comments
 (0)