Skip to main content

sunspec/models/
model6.rs

1//! Secure Write Sequential Request
2/// Secure Write Sequential Request
3///
4/// Include a digital signature along with the control data
5#[derive(Debug)]
6#[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))]
7pub struct Model6 {
8    /// X
9    ///
10    /// Number of (offset, value) pairs being written
11    ///
12    /// Detail: A max of 50 (offset, value) pairs are allocated
13    pub x: u16,
14    /// Offset
15    ///
16    /// Starting offset for write operation
17    ///
18    /// Detail: X values to follow
19    pub off: u16,
20    /// Value1
21    ///
22    /// Value to write to control register at offset
23    pub val1: u16,
24    #[allow(missing_docs)]
25    pub val2: u16,
26    #[allow(missing_docs)]
27    pub val3: u16,
28    #[allow(missing_docs)]
29    pub val4: u16,
30    #[allow(missing_docs)]
31    pub val5: u16,
32    #[allow(missing_docs)]
33    pub val6: u16,
34    #[allow(missing_docs)]
35    pub val7: u16,
36    #[allow(missing_docs)]
37    pub val8: u16,
38    #[allow(missing_docs)]
39    pub val9: u16,
40    #[allow(missing_docs)]
41    pub val10: u16,
42    #[allow(missing_docs)]
43    pub val11: u16,
44    #[allow(missing_docs)]
45    pub val12: u16,
46    #[allow(missing_docs)]
47    pub val13: u16,
48    #[allow(missing_docs)]
49    pub val14: u16,
50    #[allow(missing_docs)]
51    pub val15: u16,
52    #[allow(missing_docs)]
53    pub val16: u16,
54    #[allow(missing_docs)]
55    pub val17: u16,
56    #[allow(missing_docs)]
57    pub val18: u16,
58    #[allow(missing_docs)]
59    pub val19: u16,
60    #[allow(missing_docs)]
61    pub val20: u16,
62    #[allow(missing_docs)]
63    pub val21: u16,
64    #[allow(missing_docs)]
65    pub val22: u16,
66    #[allow(missing_docs)]
67    pub val23: u16,
68    #[allow(missing_docs)]
69    pub val24: u16,
70    #[allow(missing_docs)]
71    pub val25: u16,
72    #[allow(missing_docs)]
73    pub val26: u16,
74    #[allow(missing_docs)]
75    pub val27: u16,
76    #[allow(missing_docs)]
77    pub val28: u16,
78    #[allow(missing_docs)]
79    pub val29: u16,
80    #[allow(missing_docs)]
81    pub val30: u16,
82    #[allow(missing_docs)]
83    pub val31: u16,
84    #[allow(missing_docs)]
85    pub val32: u16,
86    #[allow(missing_docs)]
87    pub val33: u16,
88    #[allow(missing_docs)]
89    pub val34: u16,
90    #[allow(missing_docs)]
91    pub val35: u16,
92    #[allow(missing_docs)]
93    pub val36: u16,
94    #[allow(missing_docs)]
95    pub val37: u16,
96    #[allow(missing_docs)]
97    pub val38: u16,
98    #[allow(missing_docs)]
99    pub val39: u16,
100    #[allow(missing_docs)]
101    pub val40: u16,
102    #[allow(missing_docs)]
103    pub val41: u16,
104    #[allow(missing_docs)]
105    pub val42: u16,
106    #[allow(missing_docs)]
107    pub val43: u16,
108    #[allow(missing_docs)]
109    pub val44: u16,
110    #[allow(missing_docs)]
111    pub val45: u16,
112    #[allow(missing_docs)]
113    pub val46: u16,
114    #[allow(missing_docs)]
115    pub val47: u16,
116    #[allow(missing_docs)]
117    pub val48: u16,
118    #[allow(missing_docs)]
119    pub val49: u16,
120    #[allow(missing_docs)]
121    pub val50: u16,
122    #[allow(missing_docs)]
123    pub val51: u16,
124    #[allow(missing_docs)]
125    pub val52: u16,
126    #[allow(missing_docs)]
127    pub val53: u16,
128    #[allow(missing_docs)]
129    pub val54: u16,
130    #[allow(missing_docs)]
131    pub val55: u16,
132    #[allow(missing_docs)]
133    pub val56: u16,
134    #[allow(missing_docs)]
135    pub val57: u16,
136    #[allow(missing_docs)]
137    pub val58: u16,
138    #[allow(missing_docs)]
139    pub val59: u16,
140    #[allow(missing_docs)]
141    pub val60: u16,
142    #[allow(missing_docs)]
143    pub val61: u16,
144    #[allow(missing_docs)]
145    pub val62: u16,
146    #[allow(missing_docs)]
147    pub val63: u16,
148    #[allow(missing_docs)]
149    pub val64: u16,
150    #[allow(missing_docs)]
151    pub val65: u16,
152    #[allow(missing_docs)]
153    pub val66: u16,
154    #[allow(missing_docs)]
155    pub val67: u16,
156    #[allow(missing_docs)]
157    pub val68: u16,
158    #[allow(missing_docs)]
159    pub val69: u16,
160    #[allow(missing_docs)]
161    pub val70: u16,
162    #[allow(missing_docs)]
163    pub val71: u16,
164    #[allow(missing_docs)]
165    pub val72: u16,
166    #[allow(missing_docs)]
167    pub val73: u16,
168    #[allow(missing_docs)]
169    pub val74: u16,
170    #[allow(missing_docs)]
171    pub val75: u16,
172    #[allow(missing_docs)]
173    pub val76: u16,
174    #[allow(missing_docs)]
175    pub val77: u16,
176    #[allow(missing_docs)]
177    pub val78: u16,
178    #[allow(missing_docs)]
179    pub val79: u16,
180    #[allow(missing_docs)]
181    pub val80: u16,
182    /// Timestamp
183    ///
184    /// Timestamp value is the number of seconds since January 1, 2000
185    pub ts: u32,
186    /// Milliseconds
187    ///
188    /// Millisecond counter 0-999
189    pub ms: u16,
190    /// Sequence
191    ///
192    /// Sequence number of request
193    ///
194    /// Detail: Shall be advanced for each request
195    pub seq: u16,
196    /// Role
197    ///
198    /// Signing key used 0-5
199    ///
200    /// Detail: Each controller is assigned a key index that maps to their access control role
201    pub role: u16,
202    /// Algorithm
203    ///
204    /// Algorithm used to compute the digital signature
205    ///
206    /// Detail: For future proof
207    pub alg: Alg,
208    /// N
209    ///
210    /// Number of registers comprising the digital signature.
211    ///
212    /// Detail: The value of N must be at least 4 (64 bits)
213    pub n: u16,
214    #[allow(missing_docs)]
215    pub repeating: Vec<Repeating>,
216}
217#[allow(missing_docs)]
218impl Model6 {
219    pub const X: crate::Point<Self, u16> = crate::Point::new(0, 1, true);
220    pub const OFF: crate::Point<Self, u16> = crate::Point::new(1, 1, true);
221    pub const VAL1: crate::Point<Self, u16> = crate::Point::new(2, 1, true);
222    pub const VAL2: crate::Point<Self, u16> = crate::Point::new(3, 1, true);
223    pub const VAL3: crate::Point<Self, u16> = crate::Point::new(4, 1, true);
224    pub const VAL4: crate::Point<Self, u16> = crate::Point::new(5, 1, true);
225    pub const VAL5: crate::Point<Self, u16> = crate::Point::new(6, 1, true);
226    pub const VAL6: crate::Point<Self, u16> = crate::Point::new(7, 1, true);
227    pub const VAL7: crate::Point<Self, u16> = crate::Point::new(8, 1, true);
228    pub const VAL8: crate::Point<Self, u16> = crate::Point::new(9, 1, true);
229    pub const VAL9: crate::Point<Self, u16> = crate::Point::new(10, 1, true);
230    pub const VAL10: crate::Point<Self, u16> = crate::Point::new(11, 1, true);
231    pub const VAL11: crate::Point<Self, u16> = crate::Point::new(12, 1, true);
232    pub const VAL12: crate::Point<Self, u16> = crate::Point::new(13, 1, true);
233    pub const VAL13: crate::Point<Self, u16> = crate::Point::new(14, 1, true);
234    pub const VAL14: crate::Point<Self, u16> = crate::Point::new(15, 1, true);
235    pub const VAL15: crate::Point<Self, u16> = crate::Point::new(16, 1, true);
236    pub const VAL16: crate::Point<Self, u16> = crate::Point::new(17, 1, true);
237    pub const VAL17: crate::Point<Self, u16> = crate::Point::new(18, 1, true);
238    pub const VAL18: crate::Point<Self, u16> = crate::Point::new(19, 1, true);
239    pub const VAL19: crate::Point<Self, u16> = crate::Point::new(20, 1, true);
240    pub const VAL20: crate::Point<Self, u16> = crate::Point::new(21, 1, true);
241    pub const VAL21: crate::Point<Self, u16> = crate::Point::new(22, 1, true);
242    pub const VAL22: crate::Point<Self, u16> = crate::Point::new(23, 1, true);
243    pub const VAL23: crate::Point<Self, u16> = crate::Point::new(24, 1, true);
244    pub const VAL24: crate::Point<Self, u16> = crate::Point::new(25, 1, true);
245    pub const VAL25: crate::Point<Self, u16> = crate::Point::new(26, 1, true);
246    pub const VAL26: crate::Point<Self, u16> = crate::Point::new(27, 1, true);
247    pub const VAL27: crate::Point<Self, u16> = crate::Point::new(28, 1, true);
248    pub const VAL28: crate::Point<Self, u16> = crate::Point::new(29, 1, true);
249    pub const VAL29: crate::Point<Self, u16> = crate::Point::new(30, 1, true);
250    pub const VAL30: crate::Point<Self, u16> = crate::Point::new(31, 1, true);
251    pub const VAL31: crate::Point<Self, u16> = crate::Point::new(32, 1, true);
252    pub const VAL32: crate::Point<Self, u16> = crate::Point::new(33, 1, true);
253    pub const VAL33: crate::Point<Self, u16> = crate::Point::new(34, 1, true);
254    pub const VAL34: crate::Point<Self, u16> = crate::Point::new(35, 1, true);
255    pub const VAL35: crate::Point<Self, u16> = crate::Point::new(36, 1, true);
256    pub const VAL36: crate::Point<Self, u16> = crate::Point::new(37, 1, true);
257    pub const VAL37: crate::Point<Self, u16> = crate::Point::new(38, 1, true);
258    pub const VAL38: crate::Point<Self, u16> = crate::Point::new(39, 1, true);
259    pub const VAL39: crate::Point<Self, u16> = crate::Point::new(40, 1, true);
260    pub const VAL40: crate::Point<Self, u16> = crate::Point::new(41, 1, true);
261    pub const VAL41: crate::Point<Self, u16> = crate::Point::new(42, 1, true);
262    pub const VAL42: crate::Point<Self, u16> = crate::Point::new(43, 1, true);
263    pub const VAL43: crate::Point<Self, u16> = crate::Point::new(44, 1, true);
264    pub const VAL44: crate::Point<Self, u16> = crate::Point::new(45, 1, true);
265    pub const VAL45: crate::Point<Self, u16> = crate::Point::new(46, 1, true);
266    pub const VAL46: crate::Point<Self, u16> = crate::Point::new(47, 1, true);
267    pub const VAL47: crate::Point<Self, u16> = crate::Point::new(48, 1, true);
268    pub const VAL48: crate::Point<Self, u16> = crate::Point::new(49, 1, true);
269    pub const VAL49: crate::Point<Self, u16> = crate::Point::new(50, 1, true);
270    pub const VAL50: crate::Point<Self, u16> = crate::Point::new(51, 1, true);
271    pub const VAL51: crate::Point<Self, u16> = crate::Point::new(52, 1, true);
272    pub const VAL52: crate::Point<Self, u16> = crate::Point::new(53, 1, true);
273    pub const VAL53: crate::Point<Self, u16> = crate::Point::new(54, 1, true);
274    pub const VAL54: crate::Point<Self, u16> = crate::Point::new(55, 1, true);
275    pub const VAL55: crate::Point<Self, u16> = crate::Point::new(56, 1, true);
276    pub const VAL56: crate::Point<Self, u16> = crate::Point::new(57, 1, true);
277    pub const VAL57: crate::Point<Self, u16> = crate::Point::new(58, 1, true);
278    pub const VAL58: crate::Point<Self, u16> = crate::Point::new(59, 1, true);
279    pub const VAL59: crate::Point<Self, u16> = crate::Point::new(60, 1, true);
280    pub const VAL60: crate::Point<Self, u16> = crate::Point::new(61, 1, true);
281    pub const VAL61: crate::Point<Self, u16> = crate::Point::new(62, 1, true);
282    pub const VAL62: crate::Point<Self, u16> = crate::Point::new(63, 1, true);
283    pub const VAL63: crate::Point<Self, u16> = crate::Point::new(64, 1, true);
284    pub const VAL64: crate::Point<Self, u16> = crate::Point::new(65, 1, true);
285    pub const VAL65: crate::Point<Self, u16> = crate::Point::new(66, 1, true);
286    pub const VAL66: crate::Point<Self, u16> = crate::Point::new(67, 1, true);
287    pub const VAL67: crate::Point<Self, u16> = crate::Point::new(68, 1, true);
288    pub const VAL68: crate::Point<Self, u16> = crate::Point::new(69, 1, true);
289    pub const VAL69: crate::Point<Self, u16> = crate::Point::new(70, 1, true);
290    pub const VAL70: crate::Point<Self, u16> = crate::Point::new(71, 1, true);
291    pub const VAL71: crate::Point<Self, u16> = crate::Point::new(72, 1, true);
292    pub const VAL72: crate::Point<Self, u16> = crate::Point::new(73, 1, true);
293    pub const VAL73: crate::Point<Self, u16> = crate::Point::new(74, 1, true);
294    pub const VAL74: crate::Point<Self, u16> = crate::Point::new(75, 1, true);
295    pub const VAL75: crate::Point<Self, u16> = crate::Point::new(76, 1, true);
296    pub const VAL76: crate::Point<Self, u16> = crate::Point::new(77, 1, true);
297    pub const VAL77: crate::Point<Self, u16> = crate::Point::new(78, 1, true);
298    pub const VAL78: crate::Point<Self, u16> = crate::Point::new(79, 1, true);
299    pub const VAL79: crate::Point<Self, u16> = crate::Point::new(80, 1, true);
300    pub const VAL80: crate::Point<Self, u16> = crate::Point::new(81, 1, true);
301    pub const TS: crate::Point<Self, u32> = crate::Point::new(82, 2, true);
302    pub const MS: crate::Point<Self, u16> = crate::Point::new(84, 1, true);
303    pub const SEQ: crate::Point<Self, u16> = crate::Point::new(85, 1, true);
304    pub const ROLE: crate::Point<Self, u16> = crate::Point::new(86, 1, true);
305    pub const ALG: crate::Point<Self, Alg> = crate::Point::new(88, 1, true);
306    pub const N: crate::Point<Self, u16> = crate::Point::new(89, 1, true);
307}
308impl crate::Group for Model6 {
309    const LEN: u16 = 90;
310}
311impl Model6 {
312    fn parse_group(data: &[u16]) -> Result<(&[u16], Self), crate::DecodeError> {
313        let nested_data = data
314            .get(usize::from(<Self as crate::Group>::LEN)..)
315            .unwrap_or(&[]);
316        let (nested_data, repeating) = Repeating::parse_multiple(nested_data)?;
317        Ok((
318            nested_data,
319            Self {
320                x: Self::X.from_data(data)?,
321                off: Self::OFF.from_data(data)?,
322                val1: Self::VAL1.from_data(data)?,
323                val2: Self::VAL2.from_data(data)?,
324                val3: Self::VAL3.from_data(data)?,
325                val4: Self::VAL4.from_data(data)?,
326                val5: Self::VAL5.from_data(data)?,
327                val6: Self::VAL6.from_data(data)?,
328                val7: Self::VAL7.from_data(data)?,
329                val8: Self::VAL8.from_data(data)?,
330                val9: Self::VAL9.from_data(data)?,
331                val10: Self::VAL10.from_data(data)?,
332                val11: Self::VAL11.from_data(data)?,
333                val12: Self::VAL12.from_data(data)?,
334                val13: Self::VAL13.from_data(data)?,
335                val14: Self::VAL14.from_data(data)?,
336                val15: Self::VAL15.from_data(data)?,
337                val16: Self::VAL16.from_data(data)?,
338                val17: Self::VAL17.from_data(data)?,
339                val18: Self::VAL18.from_data(data)?,
340                val19: Self::VAL19.from_data(data)?,
341                val20: Self::VAL20.from_data(data)?,
342                val21: Self::VAL21.from_data(data)?,
343                val22: Self::VAL22.from_data(data)?,
344                val23: Self::VAL23.from_data(data)?,
345                val24: Self::VAL24.from_data(data)?,
346                val25: Self::VAL25.from_data(data)?,
347                val26: Self::VAL26.from_data(data)?,
348                val27: Self::VAL27.from_data(data)?,
349                val28: Self::VAL28.from_data(data)?,
350                val29: Self::VAL29.from_data(data)?,
351                val30: Self::VAL30.from_data(data)?,
352                val31: Self::VAL31.from_data(data)?,
353                val32: Self::VAL32.from_data(data)?,
354                val33: Self::VAL33.from_data(data)?,
355                val34: Self::VAL34.from_data(data)?,
356                val35: Self::VAL35.from_data(data)?,
357                val36: Self::VAL36.from_data(data)?,
358                val37: Self::VAL37.from_data(data)?,
359                val38: Self::VAL38.from_data(data)?,
360                val39: Self::VAL39.from_data(data)?,
361                val40: Self::VAL40.from_data(data)?,
362                val41: Self::VAL41.from_data(data)?,
363                val42: Self::VAL42.from_data(data)?,
364                val43: Self::VAL43.from_data(data)?,
365                val44: Self::VAL44.from_data(data)?,
366                val45: Self::VAL45.from_data(data)?,
367                val46: Self::VAL46.from_data(data)?,
368                val47: Self::VAL47.from_data(data)?,
369                val48: Self::VAL48.from_data(data)?,
370                val49: Self::VAL49.from_data(data)?,
371                val50: Self::VAL50.from_data(data)?,
372                val51: Self::VAL51.from_data(data)?,
373                val52: Self::VAL52.from_data(data)?,
374                val53: Self::VAL53.from_data(data)?,
375                val54: Self::VAL54.from_data(data)?,
376                val55: Self::VAL55.from_data(data)?,
377                val56: Self::VAL56.from_data(data)?,
378                val57: Self::VAL57.from_data(data)?,
379                val58: Self::VAL58.from_data(data)?,
380                val59: Self::VAL59.from_data(data)?,
381                val60: Self::VAL60.from_data(data)?,
382                val61: Self::VAL61.from_data(data)?,
383                val62: Self::VAL62.from_data(data)?,
384                val63: Self::VAL63.from_data(data)?,
385                val64: Self::VAL64.from_data(data)?,
386                val65: Self::VAL65.from_data(data)?,
387                val66: Self::VAL66.from_data(data)?,
388                val67: Self::VAL67.from_data(data)?,
389                val68: Self::VAL68.from_data(data)?,
390                val69: Self::VAL69.from_data(data)?,
391                val70: Self::VAL70.from_data(data)?,
392                val71: Self::VAL71.from_data(data)?,
393                val72: Self::VAL72.from_data(data)?,
394                val73: Self::VAL73.from_data(data)?,
395                val74: Self::VAL74.from_data(data)?,
396                val75: Self::VAL75.from_data(data)?,
397                val76: Self::VAL76.from_data(data)?,
398                val77: Self::VAL77.from_data(data)?,
399                val78: Self::VAL78.from_data(data)?,
400                val79: Self::VAL79.from_data(data)?,
401                val80: Self::VAL80.from_data(data)?,
402                ts: Self::TS.from_data(data)?,
403                ms: Self::MS.from_data(data)?,
404                seq: Self::SEQ.from_data(data)?,
405                role: Self::ROLE.from_data(data)?,
406                alg: Self::ALG.from_data(data)?,
407                n: Self::N.from_data(data)?,
408                repeating,
409            },
410        ))
411    }
412}
413/// Algorithm
414///
415/// Algorithm used to compute the digital signature
416///
417/// Detail: For future proof
418#[derive(Copy, Clone, Debug, Eq, PartialEq)]
419#[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))]
420pub enum Alg {
421    /// Detail: For test purposes only
422    None,
423    #[allow(missing_docs)]
424    AesGmac64,
425    #[allow(missing_docs)]
426    Ecc256,
427    /// Raw enum value not defined by the SunSpec model.
428    Invalid(u16),
429}
430impl crate::EnumValue for Alg {
431    type Repr = u16;
432    const INVALID: Self::Repr = 65535;
433    fn from_repr(value: Self::Repr) -> Self {
434        match value {
435            0 => Self::None,
436            1 => Self::AesGmac64,
437            2 => Self::Ecc256,
438            value => Self::Invalid(value),
439        }
440    }
441    fn to_repr(self) -> Self::Repr {
442        match self {
443            Self::None => 0,
444            Self::AesGmac64 => 1,
445            Self::Ecc256 => 2,
446            Self::Invalid(value) => value,
447        }
448    }
449}
450impl crate::FixedSize for Alg {
451    const SIZE: u16 = 1u16;
452    const INVALID: Self = Self::Invalid(65535);
453    fn is_invalid(&self) -> bool {
454        matches!(self, Self::Invalid(_))
455    }
456}
457#[allow(missing_docs)]
458#[derive(Debug)]
459#[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))]
460pub struct Repeating {
461    /// DS
462    ///
463    /// Digital Signature
464    pub ds: u16,
465}
466#[allow(missing_docs)]
467impl Repeating {
468    pub const DS: crate::Point<Self, u16> = crate::Point::new(0, 1, true);
469}
470impl crate::Group for Repeating {
471    const LEN: u16 = 1;
472}
473impl Repeating {
474    fn parse_group(data: &[u16]) -> Result<(&[u16], Self), crate::DecodeError> {
475        let nested_data = data
476            .get(usize::from(<Self as crate::Group>::LEN)..)
477            .unwrap_or(&[]);
478        Ok((
479            nested_data,
480            Self {
481                ds: Self::DS.from_data(data)?,
482            },
483        ))
484    }
485    fn parse_multiple(data: &[u16]) -> Result<(&[u16], Vec<Self>), crate::DecodeError> {
486        let group_len = usize::from(<Repeating as crate::Group>::LEN);
487        if group_len == 0 {
488            return Ok((data, Vec::new()));
489        }
490        if data.len() % group_len != 0 {
491            return Err(crate::DecodeError::OutOfBounds);
492        }
493        let group_count = data.len() / group_len;
494        let (data, groups) =
495            (0..group_count).try_fold((data, Vec::new()), |(data, mut groups), _| {
496                let (data, group) = Repeating::parse_group(data)?;
497                groups.push(group);
498                Ok::<_, crate::DecodeError>((data, groups))
499            })?;
500        Ok((data, groups))
501    }
502}
503impl crate::Model for Model6 {
504    const ID: u16 = 6;
505    fn addr(models: &crate::Models) -> crate::ModelAddr<Self> {
506        models.m6
507    }
508    fn parse(data: &[u16]) -> Result<Self, crate::ParseError<Self>> {
509        let (_, model) = Self::parse_group(data)?;
510        Ok(model)
511    }
512}