@@ -421,6 +421,19 @@ async def read_tp_frame(self) -> FlexRayTPFrame:
421
421
logger .trace ("read FlexRayTPFrame %s" , repr (frame ))
422
422
return frame
423
423
424
+ def _require_fc_frame (self , block_size : int , read_bytes : int ) -> bool :
425
+ # 6 bytes already read in first frame.
426
+ return ((read_bytes - 6 ) & block_size ) == 0
427
+
428
+ async def _send_flow_control_frame (self ) -> None :
429
+ block_size = self .config .fc_block_size
430
+ fc_frame = FlexRayTPFlowControlFrame (
431
+ flag = FlexRayTPFlowControlFlag .CONTINUE_TO_SEND ,
432
+ separation_time = self .config .fc_separation_time ,
433
+ block_size = block_size ,
434
+ )
435
+ await self .write_tp_frame (fc_frame )
436
+
424
437
async def _handle_fragmented (self , expected_len : int ) -> bytes :
425
438
# 6 bytes already read in first frame.
426
439
# Headersize is 2 byte.
@@ -431,6 +444,10 @@ async def _handle_fragmented(self, expected_len: int) -> bytes:
431
444
while read_bytes < expected_len :
432
445
# Reordering is not implemented.
433
446
logger .debug (f"expected_len: { expected_len } ; read_bytes: { read_bytes } " )
447
+
448
+ if self ._require_fc_frame (self .config .fc_block_size , read_bytes ):
449
+ await self ._send_flow_control_frame ()
450
+
434
451
frame = await self .read_tp_frame ()
435
452
if not isinstance (frame , FlexRayTPConsecutiveFrame ):
436
453
raise RuntimeError (f"expected consecutive frame, got: { frame } " )
@@ -455,15 +472,6 @@ async def read_unsafe(
455
472
case FlexRayTPSingleFrame ():
456
473
return frame .data
457
474
case FlexRayTPFirstFrame ():
458
- fc_frame = FlexRayTPFlowControlFrame (
459
- flag = FlexRayTPFlowControlFlag .CONTINUE_TO_SEND ,
460
- separation_time = self .config .fc_separation_time ,
461
- # TODO: send again after block_size number of frames is read.
462
- # Maybe move sending the flow control frame into the
463
- # _handle_fragmented() function and create a loop.
464
- block_size = self .config .fc_block_size ,
465
- )
466
- await self .write_tp_frame (fc_frame )
467
475
data = frame .data + await self ._handle_fragmented (frame .size )
468
476
data = data [: frame .size ]
469
477
logger .debug ("read data: %s" , data .hex ())
0 commit comments