bacnet_objects/trend/
multiple_durable.rs1use crate::prelude::*;
5use alloc::sync::Arc;
6
7use bacnet_types::constructed::BACnetLogMultipleRecord;
8use bacnet_types::error::Error;
9use bacnet_types::primitives::{Date, Time};
10
11use super::TrendLogMultipleObject;
12use crate::log_buffer::LogRecordBuffer;
13use crate::log_persistence::store::{
14 DurableLog, LogState, LogStore, fit_to_buffer_size, impl_durable_log,
15};
16use crate::log_persistence::{LogCommitCadence, LogPersistence};
17
18impl TrendLogMultipleObject {
19 pub fn with_persistence(
26 instance: u32,
27 name: impl Into<String>,
28 buffer_size: u32,
29 persistence: Arc<dyn LogPersistence<BACnetLogMultipleRecord>>,
30 ) -> Result<Self, Error> {
31 let mut log = Self::new(instance, name, buffer_size)?;
32 let (mut store, loaded) = LogStore::open(log.oid, buffer_size, persistence)?;
33 if let Some(mut snapshot) = loaded {
34 let resized = fit_to_buffer_size(&mut snapshot, buffer_size);
35 log.lifecycle().reopen(&mut snapshot)?;
36 if let Some(acquisition) = snapshot.acquisition {
37 log.acquisition.restore(acquisition);
38 }
39 log.log_device_object_property = snapshot.log_device_object_property;
40 store.reopened(log.log_state(), resized);
41 }
42 log.store = Some(store);
43 Ok(log)
44 }
45
46 pub fn reopened(&self) -> bool {
49 self.store.as_ref().is_some_and(LogStore::is_reopened)
50 }
51
52 pub fn commit_cadence(&self) -> Option<LogCommitCadence> {
54 self.store.as_ref().map(LogStore::cadence)
55 }
56
57 pub fn set_commit_cadence(&mut self, cadence: LogCommitCadence) {
60 if let Some(store) = &mut self.store {
61 store.set_cadence(cadence);
62 }
63 }
64
65 pub fn storage_generation(&self) -> Option<u64> {
69 self.store.as_ref().map(LogStore::generation)
70 }
71}
72
73impl DurableLog for TrendLogMultipleObject {
74 type Record = BACnetLogMultipleRecord;
75
76 fn log_state(&self) -> LogState {
77 LogState::of(
78 &self.log_buffer,
79 self.log_enable,
80 self.stop_when_full,
81 &self.window,
82 &self.reporting,
83 )
84 .trend(
85 self.acquisition.settings(),
86 self.log_device_object_property.clone(),
87 )
88 }
89
90 fn durable_parts(
91 &mut self,
92 ) -> (
93 Option<&mut LogStore<BACnetLogMultipleRecord>>,
94 &LogRecordBuffer<BACnetLogMultipleRecord>,
95 ) {
96 (self.store.as_mut(), &self.log_buffer)
97 }
98
99 fn record_owed_interruption(&mut self, fallback: Option<(Date, Time)>) -> bool {
100 self.lifecycle().record_interruption_now(fallback)
101 }
102}
103
104impl_durable_log!(TrendLogMultipleObject);