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    /// Notes: A max of 50 (offset, value) pairs are allocated
13    pub x: u16,
14    /// Offset
15    ///
16    /// Starting offset for write operation
17    ///
18    /// Notes: 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    /// Notes: Shall be advanced for each request
195    pub seq: u16,
196    /// Role
197    ///
198    /// Signing key used 0-5
199    ///
200    /// Notes: 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    /// Notes: For future proof
207    pub alg: Alg,
208    /// N
209    ///
210    /// Number of registers comprising the digital signature.
211    ///
212    /// Notes: The value of N must be at least 4 (64 bits)
213    pub n: u16,
214}
215#[allow(missing_docs)]
216impl Model6 {
217    pub const X: crate::Point<Self, u16> = crate::Point::new(0, 1, true);
218    pub const OFF: crate::Point<Self, u16> = crate::Point::new(1, 1, true);
219    pub const VAL1: crate::Point<Self, u16> = crate::Point::new(2, 1, true);
220    pub const VAL2: crate::Point<Self, u16> = crate::Point::new(3, 1, true);
221    pub const VAL3: crate::Point<Self, u16> = crate::Point::new(4, 1, true);
222    pub const VAL4: crate::Point<Self, u16> = crate::Point::new(5, 1, true);
223    pub const VAL5: crate::Point<Self, u16> = crate::Point::new(6, 1, true);
224    pub const VAL6: crate::Point<Self, u16> = crate::Point::new(7, 1, true);
225    pub const VAL7: crate::Point<Self, u16> = crate::Point::new(8, 1, true);
226    pub const VAL8: crate::Point<Self, u16> = crate::Point::new(9, 1, true);
227    pub const VAL9: crate::Point<Self, u16> = crate::Point::new(10, 1, true);
228    pub const VAL10: crate::Point<Self, u16> = crate::Point::new(11, 1, true);
229    pub const VAL11: crate::Point<Self, u16> = crate::Point::new(12, 1, true);
230    pub const VAL12: crate::Point<Self, u16> = crate::Point::new(13, 1, true);
231    pub const VAL13: crate::Point<Self, u16> = crate::Point::new(14, 1, true);
232    pub const VAL14: crate::Point<Self, u16> = crate::Point::new(15, 1, true);
233    pub const VAL15: crate::Point<Self, u16> = crate::Point::new(16, 1, true);
234    pub const VAL16: crate::Point<Self, u16> = crate::Point::new(17, 1, true);
235    pub const VAL17: crate::Point<Self, u16> = crate::Point::new(18, 1, true);
236    pub const VAL18: crate::Point<Self, u16> = crate::Point::new(19, 1, true);
237    pub const VAL19: crate::Point<Self, u16> = crate::Point::new(20, 1, true);
238    pub const VAL20: crate::Point<Self, u16> = crate::Point::new(21, 1, true);
239    pub const VAL21: crate::Point<Self, u16> = crate::Point::new(22, 1, true);
240    pub const VAL22: crate::Point<Self, u16> = crate::Point::new(23, 1, true);
241    pub const VAL23: crate::Point<Self, u16> = crate::Point::new(24, 1, true);
242    pub const VAL24: crate::Point<Self, u16> = crate::Point::new(25, 1, true);
243    pub const VAL25: crate::Point<Self, u16> = crate::Point::new(26, 1, true);
244    pub const VAL26: crate::Point<Self, u16> = crate::Point::new(27, 1, true);
245    pub const VAL27: crate::Point<Self, u16> = crate::Point::new(28, 1, true);
246    pub const VAL28: crate::Point<Self, u16> = crate::Point::new(29, 1, true);
247    pub const VAL29: crate::Point<Self, u16> = crate::Point::new(30, 1, true);
248    pub const VAL30: crate::Point<Self, u16> = crate::Point::new(31, 1, true);
249    pub const VAL31: crate::Point<Self, u16> = crate::Point::new(32, 1, true);
250    pub const VAL32: crate::Point<Self, u16> = crate::Point::new(33, 1, true);
251    pub const VAL33: crate::Point<Self, u16> = crate::Point::new(34, 1, true);
252    pub const VAL34: crate::Point<Self, u16> = crate::Point::new(35, 1, true);
253    pub const VAL35: crate::Point<Self, u16> = crate::Point::new(36, 1, true);
254    pub const VAL36: crate::Point<Self, u16> = crate::Point::new(37, 1, true);
255    pub const VAL37: crate::Point<Self, u16> = crate::Point::new(38, 1, true);
256    pub const VAL38: crate::Point<Self, u16> = crate::Point::new(39, 1, true);
257    pub const VAL39: crate::Point<Self, u16> = crate::Point::new(40, 1, true);
258    pub const VAL40: crate::Point<Self, u16> = crate::Point::new(41, 1, true);
259    pub const VAL41: crate::Point<Self, u16> = crate::Point::new(42, 1, true);
260    pub const VAL42: crate::Point<Self, u16> = crate::Point::new(43, 1, true);
261    pub const VAL43: crate::Point<Self, u16> = crate::Point::new(44, 1, true);
262    pub const VAL44: crate::Point<Self, u16> = crate::Point::new(45, 1, true);
263    pub const VAL45: crate::Point<Self, u16> = crate::Point::new(46, 1, true);
264    pub const VAL46: crate::Point<Self, u16> = crate::Point::new(47, 1, true);
265    pub const VAL47: crate::Point<Self, u16> = crate::Point::new(48, 1, true);
266    pub const VAL48: crate::Point<Self, u16> = crate::Point::new(49, 1, true);
267    pub const VAL49: crate::Point<Self, u16> = crate::Point::new(50, 1, true);
268    pub const VAL50: crate::Point<Self, u16> = crate::Point::new(51, 1, true);
269    pub const VAL51: crate::Point<Self, u16> = crate::Point::new(52, 1, true);
270    pub const VAL52: crate::Point<Self, u16> = crate::Point::new(53, 1, true);
271    pub const VAL53: crate::Point<Self, u16> = crate::Point::new(54, 1, true);
272    pub const VAL54: crate::Point<Self, u16> = crate::Point::new(55, 1, true);
273    pub const VAL55: crate::Point<Self, u16> = crate::Point::new(56, 1, true);
274    pub const VAL56: crate::Point<Self, u16> = crate::Point::new(57, 1, true);
275    pub const VAL57: crate::Point<Self, u16> = crate::Point::new(58, 1, true);
276    pub const VAL58: crate::Point<Self, u16> = crate::Point::new(59, 1, true);
277    pub const VAL59: crate::Point<Self, u16> = crate::Point::new(60, 1, true);
278    pub const VAL60: crate::Point<Self, u16> = crate::Point::new(61, 1, true);
279    pub const VAL61: crate::Point<Self, u16> = crate::Point::new(62, 1, true);
280    pub const VAL62: crate::Point<Self, u16> = crate::Point::new(63, 1, true);
281    pub const VAL63: crate::Point<Self, u16> = crate::Point::new(64, 1, true);
282    pub const VAL64: crate::Point<Self, u16> = crate::Point::new(65, 1, true);
283    pub const VAL65: crate::Point<Self, u16> = crate::Point::new(66, 1, true);
284    pub const VAL66: crate::Point<Self, u16> = crate::Point::new(67, 1, true);
285    pub const VAL67: crate::Point<Self, u16> = crate::Point::new(68, 1, true);
286    pub const VAL68: crate::Point<Self, u16> = crate::Point::new(69, 1, true);
287    pub const VAL69: crate::Point<Self, u16> = crate::Point::new(70, 1, true);
288    pub const VAL70: crate::Point<Self, u16> = crate::Point::new(71, 1, true);
289    pub const VAL71: crate::Point<Self, u16> = crate::Point::new(72, 1, true);
290    pub const VAL72: crate::Point<Self, u16> = crate::Point::new(73, 1, true);
291    pub const VAL73: crate::Point<Self, u16> = crate::Point::new(74, 1, true);
292    pub const VAL74: crate::Point<Self, u16> = crate::Point::new(75, 1, true);
293    pub const VAL75: crate::Point<Self, u16> = crate::Point::new(76, 1, true);
294    pub const VAL76: crate::Point<Self, u16> = crate::Point::new(77, 1, true);
295    pub const VAL77: crate::Point<Self, u16> = crate::Point::new(78, 1, true);
296    pub const VAL78: crate::Point<Self, u16> = crate::Point::new(79, 1, true);
297    pub const VAL79: crate::Point<Self, u16> = crate::Point::new(80, 1, true);
298    pub const VAL80: crate::Point<Self, u16> = crate::Point::new(81, 1, true);
299    pub const TS: crate::Point<Self, u32> = crate::Point::new(82, 2, true);
300    pub const MS: crate::Point<Self, u16> = crate::Point::new(84, 1, true);
301    pub const SEQ: crate::Point<Self, u16> = crate::Point::new(85, 1, true);
302    pub const ROLE: crate::Point<Self, u16> = crate::Point::new(86, 1, true);
303    pub const ALG: crate::Point<Self, Alg> = crate::Point::new(88, 1, true);
304    pub const N: crate::Point<Self, u16> = crate::Point::new(89, 1, true);
305}
306impl crate::Model for Model6 {
307    const ID: u16 = 6;
308    fn from_data(data: &[u16]) -> Result<Self, crate::DecodeError> {
309        Ok(Self {
310            x: Self::X.from_data(data)?,
311            off: Self::OFF.from_data(data)?,
312            val1: Self::VAL1.from_data(data)?,
313            val2: Self::VAL2.from_data(data)?,
314            val3: Self::VAL3.from_data(data)?,
315            val4: Self::VAL4.from_data(data)?,
316            val5: Self::VAL5.from_data(data)?,
317            val6: Self::VAL6.from_data(data)?,
318            val7: Self::VAL7.from_data(data)?,
319            val8: Self::VAL8.from_data(data)?,
320            val9: Self::VAL9.from_data(data)?,
321            val10: Self::VAL10.from_data(data)?,
322            val11: Self::VAL11.from_data(data)?,
323            val12: Self::VAL12.from_data(data)?,
324            val13: Self::VAL13.from_data(data)?,
325            val14: Self::VAL14.from_data(data)?,
326            val15: Self::VAL15.from_data(data)?,
327            val16: Self::VAL16.from_data(data)?,
328            val17: Self::VAL17.from_data(data)?,
329            val18: Self::VAL18.from_data(data)?,
330            val19: Self::VAL19.from_data(data)?,
331            val20: Self::VAL20.from_data(data)?,
332            val21: Self::VAL21.from_data(data)?,
333            val22: Self::VAL22.from_data(data)?,
334            val23: Self::VAL23.from_data(data)?,
335            val24: Self::VAL24.from_data(data)?,
336            val25: Self::VAL25.from_data(data)?,
337            val26: Self::VAL26.from_data(data)?,
338            val27: Self::VAL27.from_data(data)?,
339            val28: Self::VAL28.from_data(data)?,
340            val29: Self::VAL29.from_data(data)?,
341            val30: Self::VAL30.from_data(data)?,
342            val31: Self::VAL31.from_data(data)?,
343            val32: Self::VAL32.from_data(data)?,
344            val33: Self::VAL33.from_data(data)?,
345            val34: Self::VAL34.from_data(data)?,
346            val35: Self::VAL35.from_data(data)?,
347            val36: Self::VAL36.from_data(data)?,
348            val37: Self::VAL37.from_data(data)?,
349            val38: Self::VAL38.from_data(data)?,
350            val39: Self::VAL39.from_data(data)?,
351            val40: Self::VAL40.from_data(data)?,
352            val41: Self::VAL41.from_data(data)?,
353            val42: Self::VAL42.from_data(data)?,
354            val43: Self::VAL43.from_data(data)?,
355            val44: Self::VAL44.from_data(data)?,
356            val45: Self::VAL45.from_data(data)?,
357            val46: Self::VAL46.from_data(data)?,
358            val47: Self::VAL47.from_data(data)?,
359            val48: Self::VAL48.from_data(data)?,
360            val49: Self::VAL49.from_data(data)?,
361            val50: Self::VAL50.from_data(data)?,
362            val51: Self::VAL51.from_data(data)?,
363            val52: Self::VAL52.from_data(data)?,
364            val53: Self::VAL53.from_data(data)?,
365            val54: Self::VAL54.from_data(data)?,
366            val55: Self::VAL55.from_data(data)?,
367            val56: Self::VAL56.from_data(data)?,
368            val57: Self::VAL57.from_data(data)?,
369            val58: Self::VAL58.from_data(data)?,
370            val59: Self::VAL59.from_data(data)?,
371            val60: Self::VAL60.from_data(data)?,
372            val61: Self::VAL61.from_data(data)?,
373            val62: Self::VAL62.from_data(data)?,
374            val63: Self::VAL63.from_data(data)?,
375            val64: Self::VAL64.from_data(data)?,
376            val65: Self::VAL65.from_data(data)?,
377            val66: Self::VAL66.from_data(data)?,
378            val67: Self::VAL67.from_data(data)?,
379            val68: Self::VAL68.from_data(data)?,
380            val69: Self::VAL69.from_data(data)?,
381            val70: Self::VAL70.from_data(data)?,
382            val71: Self::VAL71.from_data(data)?,
383            val72: Self::VAL72.from_data(data)?,
384            val73: Self::VAL73.from_data(data)?,
385            val74: Self::VAL74.from_data(data)?,
386            val75: Self::VAL75.from_data(data)?,
387            val76: Self::VAL76.from_data(data)?,
388            val77: Self::VAL77.from_data(data)?,
389            val78: Self::VAL78.from_data(data)?,
390            val79: Self::VAL79.from_data(data)?,
391            val80: Self::VAL80.from_data(data)?,
392            ts: Self::TS.from_data(data)?,
393            ms: Self::MS.from_data(data)?,
394            seq: Self::SEQ.from_data(data)?,
395            role: Self::ROLE.from_data(data)?,
396            alg: Self::ALG.from_data(data)?,
397            n: Self::N.from_data(data)?,
398        })
399    }
400    fn addr(models: &crate::Models) -> crate::ModelAddr<Self> {
401        models.m6
402    }
403}
404/// Algorithm
405///
406/// Algorithm used to compute the digital signature
407///
408/// Notes: For future proof
409#[derive(Copy, Clone, Debug, Eq, PartialEq, strum::FromRepr)]
410#[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))]
411#[repr(u16)]
412pub enum Alg {
413    /// Notes: For test purposes only
414    None = 0,
415    #[allow(missing_docs)]
416    AesGmac64 = 1,
417    #[allow(missing_docs)]
418    Ecc256 = 2,
419}
420impl crate::Value for Alg {
421    fn decode(data: &[u16]) -> Result<Self, crate::DecodeError> {
422        let value = u16::decode(data)?;
423        Self::from_repr(value).ok_or(crate::DecodeError::InvalidEnumValue)
424    }
425    fn encode(self) -> Box<[u16]> {
426        (self as u16).encode()
427    }
428}
429impl crate::Value for Option<Alg> {
430    fn decode(data: &[u16]) -> Result<Self, crate::DecodeError> {
431        let value = u16::decode(data)?;
432        if value != 65535 {
433            Ok(Some(
434                Alg::from_repr(value).ok_or(crate::DecodeError::InvalidEnumValue)?,
435            ))
436        } else {
437            Ok(None)
438        }
439    }
440    fn encode(self) -> Box<[u16]> {
441        if let Some(value) = self {
442            value.encode()
443        } else {
444            65535.encode()
445        }
446    }
447}