4
4
5
5
import time
6
6
import logging
7
+ from typing import Optional , Union , Any
7
8
from unittest .mock import Mock
8
9
9
- from can import BusABC , Message
10
+ from can import BusABC , Message , BitTiming , BitTimingFd
10
11
from ..exceptions import (
11
12
CanInitializationError ,
12
13
CanInterfaceNotImplementedError ,
13
14
error_check ,
14
15
)
16
+ from ..util import deprecated_args_alias
15
17
16
18
logger = logging .getLogger (__name__ )
17
19
@@ -42,28 +44,32 @@ def _detect_available_configs():
42
44
channels .append ({"interface" : "cantact" , "channel" : f"ch:{ i } " })
43
45
return channels
44
46
47
+ @deprecated_args_alias (bit_timing = "timing" )
45
48
def __init__ (
46
49
self ,
47
- channel ,
48
- bitrate = 500000 ,
49
- poll_interval = 0.01 ,
50
- monitor = False ,
51
- bit_timing = None ,
52
- _testing = False ,
53
- ** kwargs ,
54
- ):
50
+ channel : int ,
51
+ bitrate : int = 500000 ,
52
+ poll_interval : float = 0.01 ,
53
+ monitor : bool = False ,
54
+ timing : Optional [Union [BitTiming , BitTimingFd ]] = None ,
55
+ ** kwargs : Any ,
56
+ ) -> None :
55
57
"""
56
58
:param int channel:
57
59
Channel number (zero indexed, labeled on multi-channel devices)
58
60
:param int bitrate:
59
61
Bitrate in bits/s
60
62
:param bool monitor:
61
63
If true, operate in listen-only monitoring mode
62
- :param BitTiming bit_timing:
63
- Optional BitTiming to use for custom bit timing setting. Overrides bitrate if not None.
64
+ :param timing:
65
+ Optional :class:`~can.BitTiming` instance to use for custom bit timing setting.
66
+ If this argument is set then it overrides the bitrate argument. The
67
+ `f_clock` value of the timing instance must be set to 24_000_000 (24MHz)
68
+ for standard CAN.
69
+ CAN FD and the :class:`~can.BitTimingFd` class are not supported.
64
70
"""
65
71
66
- if _testing :
72
+ if kwargs . get ( " _testing" , False ) :
67
73
self .interface = MockInterface ()
68
74
else :
69
75
if cantact is None :
@@ -80,18 +86,28 @@ def __init__(
80
86
81
87
# Configure the interface
82
88
with error_check ("Cannot setup the cantact.Interface" , CanInitializationError ):
83
- if bit_timing is None :
84
- # use bitrate
85
- self .interface .set_bitrate (int (channel ), int (bitrate ))
86
- else :
89
+ if isinstance (timing , BitTiming ):
90
+ if timing .f_clock != 24_000_000 :
91
+ raise CanInitializationError (
92
+ f"timing.f_clock value { timing .f_clock } "
93
+ "doesn't match expected device f_clock 24MHz."
94
+ )
87
95
# use custom bit timing
88
96
self .interface .set_bit_timing (
89
97
int (channel ),
90
- int (bit_timing .brp ),
91
- int (bit_timing .tseg1 ),
92
- int (bit_timing .tseg2 ),
93
- int (bit_timing .sjw ),
98
+ int (timing .brp ),
99
+ int (timing .tseg1 ),
100
+ int (timing .tseg2 ),
101
+ int (timing .sjw ),
102
+ )
103
+ elif isinstance (timing , BitTimingFd ):
104
+ raise NotImplementedError (
105
+ f"CAN FD is not supported by { self .__class__ .__name__ } ."
94
106
)
107
+ else :
108
+ # use bitrate
109
+ self .interface .set_bitrate (int (channel ), int (bitrate ))
110
+
95
111
self .interface .set_enabled (int (channel ), True )
96
112
self .interface .set_monitor (int (channel ), monitor )
97
113
self .interface .start ()
0 commit comments