@@ -58,21 +58,21 @@ def __init__(
58
58
"nof_samples" : nof_samples ,
59
59
}
60
60
61
- if not ( 5_000 <= bitrate <= 2_000_000 ) :
61
+ if not 5_000 <= bitrate <= 2_000_000 :
62
62
raise ValueError (f"bitrate (={ bitrate } ) must be in [5,000...2,000,000]." )
63
63
64
- if not ( 1 <= tseg1 <= 16 ) :
64
+ if not 1 <= tseg1 <= 16 :
65
65
raise ValueError (f"tseg1 (={ tseg1 } ) must be in [1...16]." )
66
66
67
- if not ( 1 <= tseg2 <= 8 ) :
67
+ if not 1 <= tseg2 <= 8 :
68
68
raise ValueError (f"tseg2 (={ tseg2 } ) must be in [1...8]." )
69
69
70
70
nbt = self .nbt
71
- if not ( 8 <= nbt <= 25 ) :
71
+ if not 8 <= nbt <= 25 :
72
72
raise ValueError (f"nominal bit time (={ nbt } ) must be in [8...25]." )
73
73
74
74
brp = self .brp
75
- if not ( 1 <= brp <= 64 ) :
75
+ if not 1 <= brp <= 64 :
76
76
raise ValueError (f"bitrate prescaler (={ brp } ) must be in [1...64]." )
77
77
78
78
actual_bitrate = f_clock / (nbt * brp )
@@ -82,7 +82,7 @@ def __init__(
82
82
f"from the requested bitrate (={ bitrate } )"
83
83
)
84
84
85
- if not ( 1 <= sjw <= 4 ) :
85
+ if not 1 <= sjw <= 4 :
86
86
raise ValueError (f"sjw (={ sjw } ) must be in [1...4]." )
87
87
88
88
if sjw > tseg2 :
@@ -165,7 +165,7 @@ def from_sample_point(
165
165
continue
166
166
167
167
if not possible_solutions :
168
- raise ValueError (f "No suitable bit timings found." )
168
+ raise ValueError ("No suitable bit timings found." )
169
169
170
170
return sorted (
171
171
possible_solutions , key = lambda x : x .oscillator_tolerance , reverse = True
@@ -324,31 +324,32 @@ def __init__(
324
324
"data_sjw" : data_sjw ,
325
325
}
326
326
327
- if not ( 5_000 <= nom_bitrate <= 2_000_000 ) :
327
+ if not 5_000 <= nom_bitrate <= 2_000_000 :
328
328
raise ValueError (
329
329
f"nom_bitrate (={ nom_bitrate } ) must be in [5,000...2,000,000]."
330
330
)
331
331
332
- if not ( 25_000 <= data_bitrate <= 8_000_000 ) :
332
+ if not 25_000 <= data_bitrate <= 8_000_000 :
333
333
raise ValueError (
334
334
f"data_bitrate (={ data_bitrate } ) must be in [25,000...8,000,000]."
335
335
)
336
336
337
337
if data_bitrate < nom_bitrate :
338
338
raise ValueError (
339
- f"data_bitrate (={ data_bitrate } ) must be greater than or equal to nom_bitrate (={ nom_bitrate } )"
339
+ f"data_bitrate (={ data_bitrate } ) must be greater than or "
340
+ f"equal to nom_bitrate (={ nom_bitrate } )"
340
341
)
341
342
342
- if not ( 2 <= nom_tseg1 <= 256 ) :
343
+ if not 2 <= nom_tseg1 <= 256 :
343
344
raise ValueError (f"nom_tseg1 (={ nom_tseg1 } ) must be in [2...256]." )
344
345
345
- if not ( 1 <= nom_tseg2 <= 128 ) :
346
+ if not 1 <= nom_tseg2 <= 128 :
346
347
raise ValueError (f"nom_tseg2 (={ nom_tseg2 } ) must be in [1...128]." )
347
348
348
- if not ( 1 <= data_tseg1 <= 32 ) :
349
+ if not 1 <= data_tseg1 <= 32 :
349
350
raise ValueError (f"data_tseg1 (={ data_tseg1 } ) must be in [1...32]." )
350
351
351
- if not ( 1 <= data_tseg2 <= 16 ) :
352
+ if not 1 <= data_tseg2 <= 16 :
352
353
raise ValueError (f"data_tseg2 (={ data_tseg2 } ) must be in [1...16]." )
353
354
354
355
nbt = self .nbt
@@ -360,13 +361,13 @@ def __init__(
360
361
raise ValueError (f"data bit time (={ dbt } ) must be at least 8." )
361
362
362
363
nom_brp = self .nom_brp
363
- if not ( 1 <= nom_brp <= 256 ) :
364
+ if not 1 <= nom_brp <= 256 :
364
365
raise ValueError (
365
366
f"nominal bitrate prescaler (={ nom_brp } ) must be in [1...256]."
366
367
)
367
368
368
369
data_brp = self .data_brp
369
- if not ( 1 <= data_brp <= 256 ) :
370
+ if not 1 <= data_brp <= 256 :
370
371
raise ValueError (
371
372
f"data bitrate prescaler (={ data_brp } ) must be in [1...256]."
372
373
)
@@ -385,15 +386,15 @@ def __init__(
385
386
f"from the requested bitrate (={ data_bitrate } )"
386
387
)
387
388
388
- if not ( 1 <= nom_sjw <= 128 ) :
389
+ if not 1 <= nom_sjw <= 128 :
389
390
raise ValueError (f"nom_sjw (={ nom_sjw } ) must be in [1...128]." )
390
391
391
392
if nom_sjw > nom_tseg2 :
392
393
raise ValueError (
393
394
f"nom_sjw (={ nom_sjw } ) must not be greater than nom_tseg2 (={ nom_tseg2 } )."
394
395
)
395
396
396
- if not ( 1 <= data_sjw <= 16 ) :
397
+ if not 1 <= data_sjw <= 16 :
397
398
raise ValueError (f"data_sjw (={ data_sjw } ) must be in [1...128]." )
398
399
399
400
if data_sjw > data_tseg2 :
@@ -421,46 +422,51 @@ def from_sample_point(
421
422
)
422
423
423
424
possible_solutions : List [BitTimingFd ] = []
424
- for nom_brp in range (1 , 257 ):
425
- nbt = round (int (f_clock / (nom_bitrate * nom_brp )))
426
- if nbt < 8 :
427
- continue
428
425
429
- nom_tseg1 = int (round (nom_sample_point / 100 * nbt )) - 1
430
- nom_tseg2 = nbt - nom_tseg1 - 1
431
-
432
- for nom_sjw in range (1 , 129 ):
433
- for data_brp in range (1 , 257 ):
434
- dbt = round (int (f_clock / (data_bitrate * data_brp )))
435
- if dbt < 8 :
436
- continue
437
-
438
- data_tseg1 = int (round (data_sample_point / 100 * dbt )) - 1
439
- data_tseg2 = dbt - data_tseg1 - 1
440
-
441
- for data_sjw in range (1 , 17 ):
442
- try :
443
- bt = BitTimingFd (
444
- f_clock = f_clock ,
445
- nom_bitrate = nom_bitrate ,
446
- nom_tseg1 = nom_tseg1 ,
447
- nom_tseg2 = nom_tseg2 ,
448
- nom_sjw = nom_sjw ,
449
- data_bitrate = data_bitrate ,
450
- data_tseg1 = data_tseg1 ,
451
- data_tseg2 = data_tseg2 ,
452
- data_sjw = data_sjw ,
453
- )
454
- if (
455
- abs (bt .nom_sample_point - nom_sample_point ) < 1
456
- and abs (bt .data_sample_point - bt .data_sample_point ) < 1
457
- ):
458
- possible_solutions .append (bt )
459
- except ValueError :
426
+ def _generate_bit_timings () -> Iterator [BitTimingFdDict ]:
427
+ for nom_brp in range (1 , 257 ):
428
+ nbt = round (int (f_clock / (nom_bitrate * nom_brp )))
429
+ if nbt < 8 :
430
+ continue
431
+
432
+ nom_tseg1 = int (round (nom_sample_point / 100 * nbt )) - 1
433
+ nom_tseg2 = nbt - nom_tseg1 - 1
434
+
435
+ for nom_sjw in range (1 , 129 ):
436
+ for data_brp in range (1 , 257 ):
437
+ dbt = round (int (f_clock / (data_bitrate * data_brp )))
438
+ if dbt < 8 :
460
439
continue
461
440
441
+ data_tseg1 = int (round (data_sample_point / 100 * dbt )) - 1
442
+ data_tseg2 = dbt - data_tseg1 - 1
443
+
444
+ for data_sjw in range (1 , 17 ):
445
+ yield {
446
+ "f_clock" : f_clock ,
447
+ "nom_bitrate" : nom_bitrate ,
448
+ "nom_tseg1" : nom_tseg1 ,
449
+ "nom_tseg2" : nom_tseg2 ,
450
+ "nom_sjw" : nom_sjw ,
451
+ "data_bitrate" : data_bitrate ,
452
+ "data_tseg1" : data_tseg1 ,
453
+ "data_tseg2" : data_tseg2 ,
454
+ "data_sjw" : data_sjw ,
455
+ }
456
+
457
+ for bit_timings in _generate_bit_timings ():
458
+ try :
459
+ bt = BitTimingFd (** bit_timings )
460
+ if (
461
+ abs (bt .nom_sample_point - nom_sample_point ) < 1
462
+ and abs (bt .data_sample_point - bt .data_sample_point ) < 1
463
+ ):
464
+ possible_solutions .append (bt )
465
+ except ValueError :
466
+ continue
467
+
462
468
if not possible_solutions :
463
- raise ValueError (f "No suitable bit timings found." )
469
+ raise ValueError ("No suitable bit timings found." )
464
470
465
471
# prefer using the same prescaler for arbitration and data phase
466
472
same_prescaler = list (
0 commit comments