sim_pipe/
frame_gen.rs

1// Copyright (c) 2025 Graphcore Ltd. All rights reserved.
2
3use std::rc::Rc;
4
5use gwr_models::data_frame::DataFrame;
6use gwr_track::entity::Entity;
7
8/// A frame Generator that can be used by the `Source` to produce frames on
9/// the fly.
10pub struct FrameGen {
11    pub entity: Rc<Entity>,
12    payload_bytes: usize,
13    overhead_bytes: usize,
14    num_send_frames: usize,
15    num_sent_frames: usize,
16}
17
18impl FrameGen {
19    #[must_use]
20    pub fn new(
21        parent: &Rc<Entity>,
22        overhead_bytes: usize,
23        payload_bytes: usize,
24        num_send_frames: usize,
25    ) -> Self {
26        Self {
27            entity: Rc::new(Entity::new(parent, "frame_gen")),
28            overhead_bytes,
29            payload_bytes,
30            num_send_frames,
31            num_sent_frames: 0,
32        }
33    }
34}
35
36impl Iterator for FrameGen {
37    type Item = DataFrame;
38    fn next(&mut self) -> Option<Self::Item> {
39        if self.num_sent_frames < self.num_send_frames {
40            self.num_sent_frames += 1;
41
42            // Set `src` to a unique value to aid debug (frame count).
43            Some(DataFrame::new(
44                &self.entity,
45                self.overhead_bytes,
46                self.payload_bytes,
47            ))
48        } else {
49            None
50        }
51    }
52}