Skip to main content

huawei_inverter/
queue.rs

1use std::collections::VecDeque;
2
3use itertools::Itertools;
4
5use crate::{Point, PointDefinition, Value, Word, WriteError};
6
7#[derive(Debug, Clone, Default)]
8pub struct WriteQueue(VecDeque<PendingWrite>);
9
10impl WriteQueue {
11    pub fn new() -> Self {
12        Self::default()
13    }
14
15    pub fn enqueue<V: Value>(&mut self, point: Point<V>, value: V) -> Result<(), WriteError> {
16        // TODO: Add compile time verification that point is writable
17        if !point.is_writable() {
18            return Err(WriteError::NotWritable);
19        }
20        self.0.push_back(PendingWrite {
21            point_def: point.def,
22            raw_value: value.encode(),
23        });
24        Ok(())
25    }
26
27    pub fn dequeue(&mut self) -> Option<PendingWrite> {
28        self.0.pop_front()
29    }
30
31    pub fn dequeue_all(&mut self) -> Vec<PendingWrite> {
32        self.0.drain(..).collect_vec()
33    }
34}
35
36#[derive(Debug, Clone)]
37pub struct PendingWrite {
38    point_def: PointDefinition,
39    raw_value: Box<[Word]>,
40}
41
42impl PendingWrite {
43    pub fn point_def(&self) -> PointDefinition {
44        self.point_def
45    }
46    pub fn raw_value(&self) -> &Box<[Word]> {
47        &self.raw_value
48    }
49}