1use std::rc::Rc;
4
5use gwr_engine::types::AccessType;
6use gwr_model_builder::EntityGet;
7use gwr_models::memory::memory_access::MemoryAccess;
8use gwr_models::memory::memory_map::DeviceId;
9use gwr_track::entity::Entity;
10
11#[derive(EntityGet)]
14pub struct FrameGen {
15 entity: Rc<Entity>,
16 payload_bytes: usize,
17 overhead_bytes: usize,
18 num_send_frames: usize,
19 num_sent_frames: usize,
20}
21
22impl FrameGen {
23 #[must_use]
24 pub fn new(
25 parent: &Rc<Entity>,
26 overhead_bytes: usize,
27 payload_bytes: usize,
28 num_send_frames: usize,
29 ) -> Self {
30 Self {
31 entity: Rc::new(Entity::new(parent, "frame_gen")),
32 overhead_bytes,
33 payload_bytes,
34 num_send_frames,
35 num_sent_frames: 0,
36 }
37 }
38}
39
40impl Iterator for FrameGen {
41 type Item = MemoryAccess;
42 fn next(&mut self) -> Option<Self::Item> {
43 if self.num_sent_frames < self.num_send_frames {
44 self.num_sent_frames += 1;
45
46 Some(MemoryAccess::new(
47 &self.entity,
48 AccessType::WriteRequest,
49 self.payload_bytes,
50 self.num_sent_frames as u64,
51 0,
52 DeviceId(0),
53 DeviceId(0),
54 self.overhead_bytes,
55 ))
56 } else {
57 None
58 }
59 }
60}