sunspec/models/
model135.rs

1//! LFRT
2/// LFRT
3///
4/// Low Frequency Ride-through
5///
6/// Notes: Ref 4: 11
7#[derive(Debug)]
8#[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))]
9pub struct Model135 {
10    /// ActCrv
11    ///
12    /// Index of active curve. 0=no active curve.
13    pub act_crv: u16,
14    /// ModEna
15    ///
16    /// LHzRT control mode. Enable active curve.  Bitfield value.
17    pub mod_ena: ModEna,
18    /// WinTms
19    ///
20    /// Time window for LFRT change.
21    ///
22    /// Notes: Setting is ignored for LFRT controls.
23    pub win_tms: Option<u16>,
24    /// RvrtTms
25    ///
26    /// Timeout period for LFRT curve selection.
27    ///
28    /// Notes: Setting is ignored for LFRT controls.
29    pub rvrt_tms: Option<u16>,
30    /// RmpTms
31    ///
32    /// Ramp time for moving from current mode to new mode.
33    ///
34    /// Notes: Setting is ignored for LFRT controls.
35    pub rmp_tms: Option<u16>,
36    /// NCrv
37    ///
38    /// Number of curves supported (recommend 4).
39    pub n_crv: u16,
40    /// NPt
41    ///
42    /// Number of curve points supported (maximum of 20).
43    pub n_pt: u16,
44    /// Tms_SF
45    ///
46    /// Scale factor for duration.
47    pub tms_sf: i16,
48    /// Hz_SF
49    ///
50    /// Scale factor for frequency.
51    pub hz_sf: i16,
52}
53#[allow(missing_docs)]
54impl Model135 {
55    pub const ACT_CRV: crate::Point<Self, u16> = crate::Point::new(0, 1, true);
56    pub const MOD_ENA: crate::Point<Self, ModEna> = crate::Point::new(1, 1, true);
57    pub const WIN_TMS: crate::Point<Self, Option<u16>> = crate::Point::new(2, 1, true);
58    pub const RVRT_TMS: crate::Point<Self, Option<u16>> = crate::Point::new(3, 1, true);
59    pub const RMP_TMS: crate::Point<Self, Option<u16>> = crate::Point::new(4, 1, true);
60    pub const N_CRV: crate::Point<Self, u16> = crate::Point::new(5, 1, false);
61    pub const N_PT: crate::Point<Self, u16> = crate::Point::new(6, 1, false);
62    pub const TMS_SF: crate::Point<Self, i16> = crate::Point::new(7, 1, false);
63    pub const HZ_SF: crate::Point<Self, i16> = crate::Point::new(8, 1, false);
64}
65impl crate::Model for Model135 {
66    const ID: u16 = 135;
67    fn from_data(data: &[u16]) -> Result<Self, crate::DecodeError> {
68        Ok(Self {
69            act_crv: Self::ACT_CRV.from_data(data)?,
70            mod_ena: Self::MOD_ENA.from_data(data)?,
71            win_tms: Self::WIN_TMS.from_data(data)?,
72            rvrt_tms: Self::RVRT_TMS.from_data(data)?,
73            rmp_tms: Self::RMP_TMS.from_data(data)?,
74            n_crv: Self::N_CRV.from_data(data)?,
75            n_pt: Self::N_PT.from_data(data)?,
76            tms_sf: Self::TMS_SF.from_data(data)?,
77            hz_sf: Self::HZ_SF.from_data(data)?,
78        })
79    }
80    fn addr(models: &crate::Models) -> crate::ModelAddr<Self> {
81        models.m135
82    }
83}
84bitflags::bitflags! {
85    #[doc = " ModEna"] #[doc = " "] #[doc =
86    " LHzRT control mode. Enable active curve.  Bitfield value."] #[derive(Copy, Clone,
87    Debug, Eq, PartialEq)] #[cfg_attr(feature = "serde", derive(::serde::Serialize,
88    ::serde::Deserialize))] pub struct ModEna : u16 { #[allow(missing_docs)] const
89    Enabled = 1; }
90}
91impl crate::Value for ModEna {
92    fn decode(data: &[u16]) -> Result<Self, crate::DecodeError> {
93        let value = u16::decode(data)?;
94        Ok(Self::from_bits_retain(value))
95    }
96    fn encode(self) -> Box<[u16]> {
97        self.bits().encode()
98    }
99}
100impl crate::Value for Option<ModEna> {
101    fn decode(data: &[u16]) -> Result<Self, crate::DecodeError> {
102        let value = u16::decode(data)?;
103        if value != 65535u16 {
104            Ok(Some(ModEna::from_bits_retain(value)))
105        } else {
106            Ok(None)
107        }
108    }
109    fn encode(self) -> Box<[u16]> {
110        if let Some(value) = self {
111            value.encode()
112        } else {
113            65535u16.encode()
114        }
115    }
116}