1use bincode::de::Decoder;
2use bincode::enc::Encoder;
3use bincode::error::{DecodeError, EncodeError};
4use bincode::{Decode, Encode};
5use cu29::prelude::*;
6use serde::Serializer;
7use std::sync::Arc;
8
9pub struct DoraSource<const S: usize> {
10 pub pool: Arc<CuHostMemoryPool<Vec<u8>>>,
11}
12
13impl<const S: usize> Freezable for DoraSource<S> {}
14
15impl<const S: usize> CuSrcTask for DoraSource<S> {
16 type Output<'m> = output_msg!(DoraPayload);
17
18 fn new(_config: Option<&ComponentConfig>) -> CuResult<Self>
19 where
20 Self: Sized,
21 {
22 let pool = CuHostMemoryPool::new("dummybuffers", 3, || vec![0u8; S])?;
23 Ok(Self { pool })
24 }
25
26 fn process(&mut self, clock: &RobotClock, new_msg: &mut Self::Output<'_>) -> CuResult<()> {
27 new_msg.tov = Tov::Time(clock.now());
28 let buffer = self.pool.acquire().unwrap();
29 buffer.lock().unwrap()[42] = 42;
30 new_msg.set_payload(DoraPayload(buffer));
31 Ok(())
32 }
33}
34
35pub struct DoraSink<const S: usize> {}
36
37impl<const S: usize> Freezable for DoraSink<S> {}
38
39impl<const S: usize> CuSinkTask for DoraSink<S> {
40 type Input<'m> = input_msg!(DoraPayload);
41
42 fn new(_config: Option<&ComponentConfig>) -> CuResult<Self>
43 where
44 Self: Sized,
45 {
46 Ok(Self {})
47 }
48
49 fn process(&mut self, _clock: &RobotClock, input: &Self::Input<'_>) -> CuResult<()> {
50 let incoming = input.payload().unwrap();
51 assert_eq!(incoming.0.lock().unwrap()[42], 42);
52 Ok(())
53 }
54}
55
56const FORTY_MEG: usize = 40 * 1024 * 1024;
58
59#[allow(dead_code)]
60pub type FortyMegSrc = DoraSource<FORTY_MEG>;
61
62#[allow(dead_code)]
63pub type FortyMegSink = DoraSink<FORTY_MEG>;
64
65#[derive(Default, Debug, Clone)]
66pub struct DoraPayload(CuHandle<Vec<u8>>);
67
68impl Decode<()> for DoraPayload {
69 fn decode<D: Decoder<Context = ()>>(decoder: &mut D) -> Result<Self, DecodeError> {
70 let handle = CuHandle::<Vec<u8>>::decode(decoder)?;
71 Ok(DoraPayload(handle))
72 }
73}
74
75impl Encode for DoraPayload {
76 fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), EncodeError> {
77 self.0.encode(encoder)
78 }
79}
80
81impl Serialize for DoraPayload {
82 fn serialize<S>(&self, _serializer: S) -> Result<S::Ok, S::Error>
83 where
84 S: Serializer,
85 {
86 todo!()
88 }
89}