embedded_bacnet/common/
spec.rs

1use super::error::Error;
2
3pub const BACNET_MAX_OBJECT: u32 = 0x3FF;
4pub const BACNET_INSTANCE_BITS: u32 = 22;
5pub const BACNET_MAX_INSTANCE: u32 = 0x3FFFFF;
6pub const MAX_BITSTRING_BYTES: u32 = 15;
7pub const BACNET_ARRAY_ALL: u32 = 0xFFFFFFFF;
8pub const BACNET_NO_PRIORITY: u32 = 0;
9pub const BACNET_MIN_PRIORITY: u32 = 1;
10pub const BACNET_MAX_PRIORITY: u32 = 16;
11
12/*
13TODO: use derive_more when it reaches 1.0 (to automatically impl TryFrom for all enums)
14#[derive(Debug, Clone, derive_more::TryFrom)]
15#[cfg_attr(feature = "defmt", derive(defmt::Format))]
16#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
17#[try_from(repr)]
18#[repr(u32)]
19pub enum Segmentation {
20    Both = 0,
21    Transmit = 1,
22    Receive = 2,
23    None = 3,
24    Max = 4,
25}
26*/
27
28#[derive(Debug, Clone)]
29#[cfg_attr(feature = "defmt", derive(defmt::Format))]
30#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
31#[repr(u32)]
32pub enum Segmentation {
33    Both = 0,
34    Transmit = 1,
35    Receive = 2,
36    None = 3,
37    Max = 4,
38}
39
40impl TryFrom<u32> for Segmentation {
41    type Error = Error;
42
43    fn try_from(value: u32) -> Result<Self, Self::Error> {
44        match value {
45            0 => Ok(Self::Both),
46            1 => Ok(Self::Transmit),
47            2 => Ok(Self::Receive),
48            3 => Ok(Self::None),
49            4 => Ok(Self::Max),
50            _ => Err(Error::InvalidValue("invalid segmentation value")),
51        }
52    }
53}
54
55#[derive(Debug, Clone)]
56#[cfg_attr(feature = "defmt", derive(defmt::Format))]
57#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
58#[repr(u32)]
59pub enum Binary {
60    Off = 0,
61    On = 1,
62}
63
64impl TryFrom<u32> for Binary {
65    type Error = u32;
66
67    fn try_from(value: u32) -> Result<Self, Self::Error> {
68        match value {
69            0 => Ok(Self::Off),
70            1 => Ok(Self::On),
71            x => Err(x),
72        }
73    }
74}
75
76#[derive(Debug, Clone)]
77#[cfg_attr(feature = "defmt", derive(defmt::Format))]
78#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
79#[repr(u16)]
80pub enum ErrorClass {
81    Device = 0,
82    Object = 1,
83    Property = 2,
84    Resources = 3,
85    Security = 4,
86    Services = 5,
87    Vt = 6,
88    Communication = 7,
89    // codes 64 and above
90    Proprietary(u16),
91}
92
93impl TryFrom<u32> for ErrorClass {
94    type Error = u32;
95
96    fn try_from(value: u32) -> Result<Self, Self::Error> {
97        match value {
98            0 => Ok(Self::Device),
99            1 => Ok(Self::Object),
100            2 => Ok(Self::Property),
101            3 => Ok(Self::Resources),
102            4 => Ok(Self::Security),
103            5 => Ok(Self::Services),
104            6 => Ok(Self::Vt),
105            7 => Ok(Self::Communication),
106            // codes 64 and above
107            x if x > 63 => Ok(Self::Proprietary(x as u16)),
108            x => Err(x),
109        }
110    }
111}
112
113#[derive(Debug, Clone)]
114#[cfg_attr(feature = "defmt", derive(defmt::Format))]
115#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
116#[repr(u16)]
117pub enum ErrorCode {
118    // valid for all classes
119    Other = 0,
120
121    // Error Class - Device
122    DeviceBusy = 3,
123    ConfigurationInProgress = 2,
124    OperationalProblem = 25,
125
126    // Error Class - Object
127    DynamicCreationNotSupported = 4,
128    NoObjectsOfSpecifiedType = 17,
129    ObjectDeletionNotPermitted = 23,
130    ObjectIdentifierAlreadyExists = 24,
131    ReadAccessDenied = 27,
132    UnknownObject = 31,
133    UnsupportedObjectType = 36,
134
135    // Error Class - Property
136    CharacterSetNotSupported = 41,
137    DatatypeNotSupported = 47,
138    InconsistentSelectionCriterion = 8,
139    InvalidArrayIndex = 42,
140    InvalidDataType = 9,
141    NotCovProperty = 44,
142    OptionalFunctionalityNotSupported = 45,
143    PropertyIsNotAnArray = 50,
144    // READ_ACCESS_DENIED = 27
145    UnknownProperty = 32,
146    ValueOutOfRange = 37,
147    WriteAccessDenied = 40,
148
149    // Error Class - Resources
150    NoSpaceForObject = 18,
151    NoSpaceToAddListElement = 19,
152    NoSpaceToWriteProperty = 20,
153
154    // Error Class - Security
155    AuthenticationFailed = 1,
156    // CHARACTER_SET_NOT_SUPPORTED = 41
157    IncompatibleSecurityLevels = 6,
158    InvalidOperatorName = 12,
159    KeyGenerationError = 15,
160    PasswordFailure = 26,
161    SecurityNotSupported = 28,
162    Timeout = 30,
163
164    // Error Class - Services
165    // CHARACTER_SET_NOT_SUPPORTED = 41
166    CovSubscriptionFailed = 43,
167    DuplicateName = 48,
168    DuplicateObjectId = 49,
169    FileAccessDenied = 5,
170    InconsistentParameters = 7,
171    InvalidConfigurationData = 46,
172    InvalidFileAccessMethod = 10,
173    InvalidFileStartPosition = 11,
174    InvalidParameterDataType = 13,
175    InvalidTimeStamp = 14,
176    MissingRequiredParameter = 16,
177    // OPTIONAL_FUNCTIONALITY_NOT_SUPPORTED = 45
178    PropertyIsNotAList = 22,
179    ServiceRequestDenied = 29,
180
181    // Error Class - VT
182    UnknownVtClass = 34,
183    UnknownVtSession = 35,
184    NoVtSessionsAvailable = 21,
185    VtSessionAlreadyClosed = 38,
186    VtSessionTerminationFailure = 39,
187
188    // unused
189    Reserved1 = 33,
190    // new error codes from new addenda
191    AbortBufferOverflow = 51,
192    AbortInvalidApduInThisState = 52,
193    AbortPreemptedByHigherPriorityTask = 53,
194    AbortSegmentationNotSupported = 54,
195    AbortProprietary = 55,
196    AbortOther = 56,
197    InvalidTag = 57,
198    NetworkDown = 58,
199    RejectBufferOverflow = 59,
200    RejectInconsistentParameters = 60,
201    RejectInvalidParameterDataType = 61,
202    RejectInvalidTag = 62,
203    RejectMissingRequiredParameter = 63,
204    RejectParameterOutOfRange = 64,
205    RejectTooManyArguments = 65,
206    RejectUndefinedEnumeration = 66,
207    RejectUnrecognizedService = 67,
208    RejectProprietary = 68,
209    RejectOther = 69,
210    UnknownDevice = 70,
211    UnknownRoute = 71,
212    ValueNotInitialized = 72,
213    InvalidEventState = 73,
214    NoAlarmConfigured = 74,
215    LogBufferFull = 75,
216    LoggedValuePurged = 76,
217    NoPropertySpecified = 77,
218    NotConfiguredForTriggeredLogging = 78,
219    UnknownSubscription = 79,
220    ParameterOutOfRange = 80,
221    ListElementNotFound = 81,
222    Busy = 82,
223    CommunicationDisabled = 83,
224    Success = 84,
225    AccessDenied = 85,
226    BadDestinationAddress = 86,
227    BadDestinationDeviceId = 87,
228    BadSignature = 88,
229    BadSourceAddress = 89,
230    BadTimestamp = 90,
231    CannotUseKey = 91,
232    CannotVerifyMessageId = 92,
233    CorrectKeyRevision = 93,
234    DestinationDeviceIdRequired = 94,
235    DuplicateMessage = 95,
236    EncryptionNotConfigured = 96,
237    EncryptionRequired = 97,
238    IncorrectKey = 98,
239    InvalidKeyData = 99,
240    KeyUpdateInProgress = 100,
241    MalformedMessage = 101,
242    NotKeyServer = 102,
243    SecurityNotConfigured = 103,
244    SourceSecurityRequired = 104,
245    TooManyKeys = 105,
246    UnknownAuthenticationType = 106,
247    UnknownKey = 107,
248    UnknownKeyRevision = 108,
249    UnknownSourceMessage = 109,
250    NotRouterToDnet = 110,
251    RouterBusy = 111,
252    UnknownNetworkMessage = 112,
253    MessageTooLong = 113,
254    SecurityError = 114,
255    AddressingError = 115,
256    WriteBdtFailed = 116,
257    ReadBdtFailed = 117,
258    RegisterForeignDeviceFailed = 118,
259    ReadFdtFailed = 119,
260    DeleteFdtEntryFailed = 120,
261    DistributeBroadcastFailed = 121,
262    UnknownFileSize = 122,
263    AbortApduTooLong = 123,
264    AbortApplicationExceededReplyTime = 124,
265    AbortOutOfResources = 125,
266    AbortTsmTimeout = 126,
267    AbortWindowSizeOutOfRange = 127,
268    FileFull = 128,
269    InconsistentConfiguration = 129,
270    InconsistentObjectType = 130,
271    InternalError = 131,
272    NotConfigured = 132,
273    OutOfMemory = 133,
274    ValueTooLong = 134,
275    AbortInsufficientSecurity = 135,
276    AbortSecurityError = 136,
277    DuplicateEntry = 137,
278    InvalidValueInThisState = 138,
279    InvalidOperationInThisState = 139,
280    ListItemNotNumbered = 140,
281    ListItemNotTimestamped = 141,
282    InvalidDataEncoding = 142,
283    BvlcFunctionUnknown = 143,
284    BvlcProprietaryFunctionUnknown = 144,
285    HeaderEncodingError = 145,
286    HeaderNotUnderstood = 146,
287    MessageIncomplete = 147,
288    NotABacnetScHub = 148,
289    PayloadExpected = 149,
290    UnexpectedData = 150,
291    NodeDuplicateVmac = 151,
292    HttpUnexpectedResponseCode = 152,
293    HttpNoUpgrade = 153,
294    HttpResourceNotLocal = 154,
295    HttpProxyAuthenticationFailed = 155,
296    HttpResponseTimeout = 156,
297    HttpResponseSyntaxError = 157,
298    HttpResponseValueError = 158,
299    HttpResponseMissingHeader = 159,
300    HttpWebsocketHeaderError = 160,
301    HttpUpgradeRequired = 161,
302    HttpUpgradeError = 162,
303    HttpTemporaryUnavailable = 163,
304    HttpNotAServer = 164,
305    HttpError = 165,
306    WebsocketSchemeNotSupported = 166,
307    WebsocketUnknownControlMessage = 167,
308    WebsocketCloseError = 168,
309    WebsocketClosedByPeer = 169,
310    WebsocketEndpointLeaves = 170,
311    WebsocketProtocolError = 171,
312    WebsocketDataNotAccepted = 172,
313    WebsocketClosedAbnormally = 173,
314    WebsocketDataInconsistent = 174,
315    WebsocketDataAgainstPolicy = 175,
316    WebsocketFrameTooLong = 176,
317    WebsocketExtensionMissing = 177,
318    WebsocketRequestUnavailable = 178,
319    WebsocketError = 179,
320    TlsClientCertificateError = 180,
321    TlsServerCertificateError = 181,
322    TlsClientAuthenticationFailed = 182,
323    TlsServerAuthenticationFailed = 183,
324    TlsClientCertificateExpired = 184,
325    TlsServerCertificateExpired = 185,
326    TlsClientCertificateRevoked = 186,
327    TlsServerCertificateRevoked = 187,
328    TlsError = 188,
329    DnsUnavailable = 189,
330    DnsNameResolutionFailed = 190,
331    DnsResolverFailure = 191,
332    DnsError = 192,
333    TcpConnectTimeout = 193,
334    TcpConnectionRefused = 194,
335    TcpClosedByLocal = 195,
336    TcpClosedOther = 196,
337    TcpError = 197,
338    IpAddressNotReachable = 198,
339    IpError = 199,
340    CertificateExpired = 200,
341    CertificateInvalid = 201,
342    CertificateMalformed = 202,
343    CertificateRevoked = 203,
344    UnknownSecurityKey = 204,
345    ReferencedPortInError = 205,
346    // error codes 256 and above
347    Proprietary(u16),
348}
349
350impl TryFrom<u32> for ErrorCode {
351    type Error = u32;
352
353    fn try_from(value: u32) -> Result<Self, Self::Error> {
354        match value {
355            0 => Ok(Self::Other),
356            3 => Ok(Self::DeviceBusy),
357            2 => Ok(Self::ConfigurationInProgress),
358            25 => Ok(Self::OperationalProblem),
359            4 => Ok(Self::DynamicCreationNotSupported),
360            17 => Ok(Self::NoObjectsOfSpecifiedType),
361            23 => Ok(Self::ObjectDeletionNotPermitted),
362            24 => Ok(Self::ObjectIdentifierAlreadyExists),
363            27 => Ok(Self::ReadAccessDenied),
364            31 => Ok(Self::UnknownObject),
365            36 => Ok(Self::UnsupportedObjectType),
366            41 => Ok(Self::CharacterSetNotSupported),
367            47 => Ok(Self::DatatypeNotSupported),
368            8 => Ok(Self::InconsistentSelectionCriterion),
369            42 => Ok(Self::InvalidArrayIndex),
370            9 => Ok(Self::InvalidDataType),
371            44 => Ok(Self::NotCovProperty),
372            45 => Ok(Self::OptionalFunctionalityNotSupported),
373            50 => Ok(Self::PropertyIsNotAnArray),
374            32 => Ok(Self::UnknownProperty),
375            37 => Ok(Self::ValueOutOfRange),
376            40 => Ok(Self::WriteAccessDenied),
377            18 => Ok(Self::NoSpaceForObject),
378            19 => Ok(Self::NoSpaceToAddListElement),
379            20 => Ok(Self::NoSpaceToWriteProperty),
380            1 => Ok(Self::AuthenticationFailed),
381            6 => Ok(Self::IncompatibleSecurityLevels),
382            12 => Ok(Self::InvalidOperatorName),
383            15 => Ok(Self::KeyGenerationError),
384            26 => Ok(Self::PasswordFailure),
385            28 => Ok(Self::SecurityNotSupported),
386            30 => Ok(Self::Timeout),
387            43 => Ok(Self::CovSubscriptionFailed),
388            48 => Ok(Self::DuplicateName),
389            49 => Ok(Self::DuplicateObjectId),
390            5 => Ok(Self::FileAccessDenied),
391            7 => Ok(Self::InconsistentParameters),
392            46 => Ok(Self::InvalidConfigurationData),
393            10 => Ok(Self::InvalidFileAccessMethod),
394            11 => Ok(Self::InvalidFileStartPosition),
395            13 => Ok(Self::InvalidParameterDataType),
396            14 => Ok(Self::InvalidTimeStamp),
397            16 => Ok(Self::MissingRequiredParameter),
398            22 => Ok(Self::PropertyIsNotAList),
399            29 => Ok(Self::ServiceRequestDenied),
400            34 => Ok(Self::UnknownVtClass),
401            35 => Ok(Self::UnknownVtSession),
402            21 => Ok(Self::NoVtSessionsAvailable),
403            38 => Ok(Self::VtSessionAlreadyClosed),
404            39 => Ok(Self::VtSessionTerminationFailure),
405            33 => Ok(Self::Reserved1),
406            51 => Ok(Self::AbortBufferOverflow),
407            52 => Ok(Self::AbortInvalidApduInThisState),
408            53 => Ok(Self::AbortPreemptedByHigherPriorityTask),
409            54 => Ok(Self::AbortSegmentationNotSupported),
410            55 => Ok(Self::AbortProprietary),
411            56 => Ok(Self::AbortOther),
412            57 => Ok(Self::InvalidTag),
413            58 => Ok(Self::NetworkDown),
414            59 => Ok(Self::RejectBufferOverflow),
415            60 => Ok(Self::RejectInconsistentParameters),
416            61 => Ok(Self::RejectInvalidParameterDataType),
417            62 => Ok(Self::RejectInvalidTag),
418            63 => Ok(Self::RejectMissingRequiredParameter),
419            64 => Ok(Self::RejectParameterOutOfRange),
420            65 => Ok(Self::RejectTooManyArguments),
421            66 => Ok(Self::RejectUndefinedEnumeration),
422            67 => Ok(Self::RejectUnrecognizedService),
423            68 => Ok(Self::RejectProprietary),
424            69 => Ok(Self::RejectOther),
425            70 => Ok(Self::UnknownDevice),
426            71 => Ok(Self::UnknownRoute),
427            72 => Ok(Self::ValueNotInitialized),
428            73 => Ok(Self::InvalidEventState),
429            74 => Ok(Self::NoAlarmConfigured),
430            75 => Ok(Self::LogBufferFull),
431            76 => Ok(Self::LoggedValuePurged),
432            77 => Ok(Self::NoPropertySpecified),
433            78 => Ok(Self::NotConfiguredForTriggeredLogging),
434            79 => Ok(Self::UnknownSubscription),
435            80 => Ok(Self::ParameterOutOfRange),
436            81 => Ok(Self::ListElementNotFound),
437            82 => Ok(Self::Busy),
438            83 => Ok(Self::CommunicationDisabled),
439            84 => Ok(Self::Success),
440            85 => Ok(Self::AccessDenied),
441            86 => Ok(Self::BadDestinationAddress),
442            87 => Ok(Self::BadDestinationDeviceId),
443            88 => Ok(Self::BadSignature),
444            89 => Ok(Self::BadSourceAddress),
445            90 => Ok(Self::BadTimestamp),
446            91 => Ok(Self::CannotUseKey),
447            92 => Ok(Self::CannotVerifyMessageId),
448            93 => Ok(Self::CorrectKeyRevision),
449            94 => Ok(Self::DestinationDeviceIdRequired),
450            95 => Ok(Self::DuplicateMessage),
451            96 => Ok(Self::EncryptionNotConfigured),
452            97 => Ok(Self::EncryptionRequired),
453            98 => Ok(Self::IncorrectKey),
454            99 => Ok(Self::InvalidKeyData),
455            100 => Ok(Self::KeyUpdateInProgress),
456            101 => Ok(Self::MalformedMessage),
457            102 => Ok(Self::NotKeyServer),
458            103 => Ok(Self::SecurityNotConfigured),
459            104 => Ok(Self::SourceSecurityRequired),
460            105 => Ok(Self::TooManyKeys),
461            106 => Ok(Self::UnknownAuthenticationType),
462            107 => Ok(Self::UnknownKey),
463            108 => Ok(Self::UnknownKeyRevision),
464            109 => Ok(Self::UnknownSourceMessage),
465            110 => Ok(Self::NotRouterToDnet),
466            111 => Ok(Self::RouterBusy),
467            112 => Ok(Self::UnknownNetworkMessage),
468            113 => Ok(Self::MessageTooLong),
469            114 => Ok(Self::SecurityError),
470            115 => Ok(Self::AddressingError),
471            116 => Ok(Self::WriteBdtFailed),
472            117 => Ok(Self::ReadBdtFailed),
473            118 => Ok(Self::RegisterForeignDeviceFailed),
474            119 => Ok(Self::ReadFdtFailed),
475            120 => Ok(Self::DeleteFdtEntryFailed),
476            121 => Ok(Self::DistributeBroadcastFailed),
477            122 => Ok(Self::UnknownFileSize),
478            123 => Ok(Self::AbortApduTooLong),
479            124 => Ok(Self::AbortApplicationExceededReplyTime),
480            125 => Ok(Self::AbortOutOfResources),
481            126 => Ok(Self::AbortTsmTimeout),
482            127 => Ok(Self::AbortWindowSizeOutOfRange),
483            128 => Ok(Self::FileFull),
484            129 => Ok(Self::InconsistentConfiguration),
485            130 => Ok(Self::InconsistentObjectType),
486            131 => Ok(Self::InternalError),
487            132 => Ok(Self::NotConfigured),
488            133 => Ok(Self::OutOfMemory),
489            134 => Ok(Self::ValueTooLong),
490            135 => Ok(Self::AbortInsufficientSecurity),
491            136 => Ok(Self::AbortSecurityError),
492            137 => Ok(Self::DuplicateEntry),
493            138 => Ok(Self::InvalidValueInThisState),
494            139 => Ok(Self::InvalidOperationInThisState),
495            140 => Ok(Self::ListItemNotNumbered),
496            141 => Ok(Self::ListItemNotTimestamped),
497            142 => Ok(Self::InvalidDataEncoding),
498            143 => Ok(Self::BvlcFunctionUnknown),
499            144 => Ok(Self::BvlcProprietaryFunctionUnknown),
500            145 => Ok(Self::HeaderEncodingError),
501            146 => Ok(Self::HeaderNotUnderstood),
502            147 => Ok(Self::MessageIncomplete),
503            148 => Ok(Self::NotABacnetScHub),
504            149 => Ok(Self::PayloadExpected),
505            150 => Ok(Self::UnexpectedData),
506            151 => Ok(Self::NodeDuplicateVmac),
507            152 => Ok(Self::HttpUnexpectedResponseCode),
508            153 => Ok(Self::HttpNoUpgrade),
509            154 => Ok(Self::HttpResourceNotLocal),
510            155 => Ok(Self::HttpProxyAuthenticationFailed),
511            156 => Ok(Self::HttpResponseTimeout),
512            157 => Ok(Self::HttpResponseSyntaxError),
513            158 => Ok(Self::HttpResponseValueError),
514            159 => Ok(Self::HttpResponseMissingHeader),
515            160 => Ok(Self::HttpWebsocketHeaderError),
516            161 => Ok(Self::HttpUpgradeRequired),
517            162 => Ok(Self::HttpUpgradeError),
518            163 => Ok(Self::HttpTemporaryUnavailable),
519            164 => Ok(Self::HttpNotAServer),
520            165 => Ok(Self::HttpError),
521            166 => Ok(Self::WebsocketSchemeNotSupported),
522            167 => Ok(Self::WebsocketUnknownControlMessage),
523            168 => Ok(Self::WebsocketCloseError),
524            169 => Ok(Self::WebsocketClosedByPeer),
525            170 => Ok(Self::WebsocketEndpointLeaves),
526            171 => Ok(Self::WebsocketProtocolError),
527            172 => Ok(Self::WebsocketDataNotAccepted),
528            173 => Ok(Self::WebsocketClosedAbnormally),
529            174 => Ok(Self::WebsocketDataInconsistent),
530            175 => Ok(Self::WebsocketDataAgainstPolicy),
531            176 => Ok(Self::WebsocketFrameTooLong),
532            177 => Ok(Self::WebsocketExtensionMissing),
533            178 => Ok(Self::WebsocketRequestUnavailable),
534            179 => Ok(Self::WebsocketError),
535            180 => Ok(Self::TlsClientCertificateError),
536            181 => Ok(Self::TlsServerCertificateError),
537            182 => Ok(Self::TlsClientAuthenticationFailed),
538            183 => Ok(Self::TlsServerAuthenticationFailed),
539            184 => Ok(Self::TlsClientCertificateExpired),
540            185 => Ok(Self::TlsServerCertificateExpired),
541            186 => Ok(Self::TlsClientCertificateRevoked),
542            187 => Ok(Self::TlsServerCertificateRevoked),
543            188 => Ok(Self::TlsError),
544            189 => Ok(Self::DnsUnavailable),
545            190 => Ok(Self::DnsNameResolutionFailed),
546            191 => Ok(Self::DnsResolverFailure),
547            192 => Ok(Self::DnsError),
548            193 => Ok(Self::TcpConnectTimeout),
549            194 => Ok(Self::TcpConnectionRefused),
550            195 => Ok(Self::TcpClosedByLocal),
551            196 => Ok(Self::TcpClosedOther),
552            197 => Ok(Self::TcpError),
553            198 => Ok(Self::IpAddressNotReachable),
554            199 => Ok(Self::IpError),
555            200 => Ok(Self::CertificateExpired),
556            201 => Ok(Self::CertificateInvalid),
557            202 => Ok(Self::CertificateMalformed),
558            203 => Ok(Self::CertificateRevoked),
559            204 => Ok(Self::UnknownSecurityKey),
560            205 => Ok(Self::ReferencedPortInError),
561            x if x > 255 => Ok(Self::Proprietary(x as u16)),
562            x => Err(x),
563        }
564    }
565}
566
567#[derive(Debug, Clone)]
568#[cfg_attr(feature = "defmt", derive(defmt::Format))]
569#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
570#[repr(u16)]
571pub enum EngineeringUnits {
572    // Enumerated values 0-255 are reserved for definition by ASHRAE.
573    // Acceleration
574    MetersPerSecondPerSecond = 166,
575    // Area
576    SquareMeters = 0,
577    SquareCentimeters = 116,
578    SquareFeet = 1,
579    SquareInches = 115,
580    // Currency
581    Currency1 = 105,
582    Currency2 = 106,
583    Currency3 = 107,
584    Currency4 = 108,
585    Currency5 = 109,
586    Currency6 = 110,
587    Currency7 = 111,
588    Currency8 = 112,
589    Currency9 = 113,
590    Currency10 = 114,
591    // Electrical
592    Milliamperes = 2,
593    Amperes = 3,
594    AmperesPerMeter = 167,
595    AmperesPerSquareMeter = 168,
596    AmpereSquareMeters = 169,
597    Decibels = 199,
598    DecibelsMillivolt = 200,
599    DecibelsVolt = 201,
600    Farads = 170,
601    Henrys = 171,
602    Ohms = 4,
603    OhmMeters = 172,
604    Milliohms = 145,
605    Kilohms = 122,
606    Megohms = 123,
607    Microsiemens = 190,
608    Millisiemens = 202,
609    Siemens = 173, // 1 mho equals 1 siemens
610    SiemensPerMeter = 174,
611    Teslas = 175,
612    Volts = 5,
613    Millivolts = 124,
614    Kilovolts = 6,
615    Megavolts = 7,
616    VoltAmperes = 8,
617    KilovoltAmperes = 9,
618    MegavoltAmperes = 10,
619    VoltAmperesReactive = 11,
620    KilovoltAmperesReactive = 12,
621    MegavoltAmperesReactive = 13,
622    VoltsPerDegreeKelvin = 176,
623    VoltsPerMeter = 177,
624    DegreesPhase = 14,
625    PowerFactor = 15,
626    Webers = 178,
627    // Energy
628    Joules = 16,
629    Kilojoules = 17,
630    KilojoulesPerKilogram = 125,
631    Megajoules = 126,
632    WattHours = 18,
633    KilowattHours = 19,
634    MegawattHours = 146,
635    WattHoursReactive = 203,
636    KilowattHoursReactive = 204,
637    MegawattHoursReactive = 205,
638    Btus = 20,
639    KiloBtus = 147,
640    MegaBtus = 148,
641    Therms = 21,
642    TonHours = 22,
643    // Enthalpy
644    JoulesPerKilogramDryAir = 23,
645    KilojoulesPerKilogramDryAir = 149,
646    MegajoulesPerKilogramDryAir = 150,
647    BtusPerPoundDryAir = 24,
648    BtusPerPound = 117,
649    // Entropy
650    JoulesPerDegreeKelvin = 127,
651    KilojoulesPerDegreeKelvin = 151,
652    MegajoulesPerDegreeKelvin = 152,
653    JoulesPerKilogramDegreeKelvin = 128,
654    // Force
655    Newton = 153,
656    // Frequency
657    CyclesPerHour = 25,
658    CyclesPerMinute = 26,
659    Hertz = 27,
660    Kilohertz = 129,
661    Megahertz = 130,
662    PerHour = 131,
663    // Humidity
664    GramsOfWaterPerKilogramDryAir = 28,
665    PercentRelativeHumidity = 29,
666    // Length
667    Micrometers = 194,
668    Millimeters = 30,
669    Centimeters = 118,
670    Kilometers = 193,
671    Meters = 31,
672    Inches = 32,
673    Feet = 33,
674    // Light
675    Candelas = 179,
676    CandelasPerSquareMeter = 180,
677    WattsPerSquareFoot = 34,
678    WattsPerSquareMeter = 35,
679    Lumens = 36,
680    Luxes = 37,
681    FootCandles = 38,
682    // Mass
683    Milligrams = 196,
684    Grams = 195,
685    Kilograms = 39,
686    PoundsMass = 40,
687    Tons = 41,
688    // Mass Flow
689    GramsPerSecond = 154,
690    GramsPerMinute = 155,
691    KilogramsPerSecond = 42,
692    KilogramsPerMinute = 43,
693    KilogramsPerHour = 44,
694    PoundsMassPerSecond = 119,
695    PoundsMassPerMinute = 45,
696    PoundsMassPerHour = 46,
697    TonsPerHour = 156,
698    // Power
699    Milliwatts = 132,
700    Watts = 47,
701    Kilowatts = 48,
702    Megawatts = 49,
703    BtusPerHour = 50,
704    KiloBtusPerHour = 157,
705    Horsepower = 51,
706    TonsRefrigeration = 52,
707    // Pressure
708    Pascals = 53,
709    Hectopascals = 133,
710    Kilopascals = 54,
711    Millibars = 134,
712    Bars = 55,
713    PoundsForcePerSquareInch = 56,
714    MillimetersOfWater = 206,
715    CentimetersOfWater = 57,
716    InchesOfWater = 58,
717    MillimetersOfMercury = 59,
718    CentimetersOfMercury = 60,
719    InchesOfMercury = 61,
720    // Temperature
721    DegreesCelsius = 62,
722    DegreesKelvin = 63,
723    DegreesKelvinPerHour = 181,
724    DegreesKelvinPerMinute = 182,
725    DegreesFahrenheit = 64,
726    DegreeDaysCelsius = 65,
727    DegreeDaysFahrenheit = 66,
728    DeltaDegreesFahrenheit = 120,
729    DeltaDegreesKelvin = 121,
730    // Time
731    Years = 67,
732    Months = 68,
733    Weeks = 69,
734    Days = 70,
735    Hours = 71,
736    Minutes = 72,
737    Seconds = 73,
738    HundredthsSeconds = 158,
739    Milliseconds = 159,
740    // Torque
741    NewtonMeters = 160,
742    // Velocity
743    MillimetersPerSecond = 161,
744    MillimetersPerMinute = 162,
745    MetersPerSecond = 74,
746    MetersPerMinute = 163,
747    MetersPerHour = 164,
748    KilometersPerHour = 75,
749    FeetPerSecond = 76,
750    FeetPerMinute = 77,
751    MilesPerHour = 78,
752    // Volume
753    CubicFeet = 79,
754    CubicMeters = 80,
755    ImperialGallons = 81,
756    Milliliters = 197,
757    Liters = 82,
758    UsGallons = 83,
759    // Volumetric Flow
760    CubicFeetPerSecond = 142,
761    CubicFeetPerMinute = 84,
762    CubicFeetPerHour = 191,
763    CubicMetersPerSecond = 85,
764    CubicMetersPerMinute = 165,
765    CubicMetersPerHour = 135,
766    ImperialGallonsPerMinute = 86,
767    MillilitersPerSecond = 198,
768    LitersPerSecond = 87,
769    LitersPerMinute = 88,
770    LitersPerHour = 136,
771    UsGallonsPerMinute = 89,
772    UsGallonsPerHour = 192,
773    // Other
774    DegreesAngular = 90,
775    DegreesCelsiusPerHour = 91,
776    DegreesCelsiusPerMinute = 92,
777    DegreesFahrenheitPerHour = 93,
778    DegreesFahrenheitPerMinute = 94,
779    JouleSeconds = 183,
780    KilogramsPerCubicMeter = 186,
781    KwHoursPerSquareMeter = 137,
782    KwHoursPerSquareFoot = 138,
783    MegajoulesPerSquareMeter = 139,
784    MegajoulesPerSquareFoot = 140,
785    NoUnits = 95,
786    NewtonSeconds = 187,
787    NewtonsPerMeter = 188,
788    PartsPerMillion = 96,
789    PartsPerBillion = 97,
790    Percent = 98,
791    PercentObscurationPerFoot = 143,
792    PercentObscurationPerMeter = 144,
793    PercentPerSecond = 99,
794    PerMinute = 100,
795    PerSecond = 101,
796    PsiPerDegreeFahrenheit = 102,
797    Radians = 103,
798    RadiansPerSecond = 184,
799    RevolutionsPerMinute = 104,
800    SquareMetersPerNewton = 185,
801    WattsPerMeterPerDegreeKelvin = 189,
802    WattsPerSquareMeterDegreeKelvin = 141,
803    PerMille = 207,
804    GramsPerGram = 208,
805    KilogramsPerKilogram = 209,
806    GramsPerKilogram = 210,
807    MilligramsPerGram = 211,
808    MilligramsPerKilogram = 212,
809    GramsPerMilliliter = 213,
810    GramsPerLiter = 214,
811    MilligramsPerLiter = 215,
812    MicrogramsPerLiter = 216,
813    GramsPerCubicMeter = 217,
814    MilligramsPerCubicMeter = 218,
815    MicrogramsPerCubicMeter = 219,
816    NanogramsPerCubicMeter = 220,
817    GramsPerCubicCentimeter = 221,
818    Becquerels = 222,
819    Kilobecquerels = 223,
820    Megabecquerels = 224,
821    Gray = 225,
822    Milligray = 226,
823    Microgray = 227,
824    Sieverts = 228,
825    Millisieverts = 229,
826    Microsieverts = 230,
827    MicrosievertsPerHour = 231,
828    DecibelsA = 232,
829    NephelometricTurbidityUnit = 233,
830    Ph = 234,
831    GramsPerSquareMeter = 235,
832    MinutesPerDegreeKelvin = 236,
833    OhmMeterSquaredPerMeter = 237,
834    AmpereSeconds = 238,
835    VoltAmpereHours = 239,
836    KilovoltAmpereHours = 240,
837    MegavoltAmpereHours = 241,
838    VoltAmpereHoursReactive = 242,
839    KilovoltAmpereHoursReactive = 243,
840    MegavoltAmpereHoursReactive = 244,
841    VoltSquareHours = 245,
842    AmpereSquareHours = 246,
843    JoulePerHours = 247,
844    CubicFeetPerDay = 248,
845    CubicMetersPerDay = 249,
846    WattHoursPerCubicMeter = 250,
847    JoulesPerCubicMeter = 251,
848    MolePercent = 252,
849    PascalSeconds = 253,
850    MillionStandardCubicFeetPerMinute = 254,
851    ReservedRangeMax = 255,
852    // Enumerated values 256-47807 may be used by others
853    // subject to the procedures and constraints described in Clause 23.
854    ProprietaryRangeMin = 256,
855    ProprietaryRangeMax = 47807,
856    // Enumerated values 47808-49999 are reserved for definition by ASHRAE.
857    StandardCubicFeetPerDay = 47808,
858    MillionStandardCubicFeetPerDay = 47809,
859    ThousandCubicFeetPerDay = 47810,
860    ThousandStandardCubicFeetPerDay = 47811,
861    PoundsMassPerDay = 47812,
862    // 47813 - NOT USED
863    Millirems = 47814,
864    MilliremsPerHour = 47815,
865    ReservedRangeMax2 = 49999,
866    ProprietaryRangeMin2 = 50000,
867    // Enumerated values 50000-65535 may be used by others
868    // subject to the procedures and constraints described in Clause 23.
869    // do the proprietary range inside of enum so that
870    // compilers will allocate adequate sized datatype for enum
871    // which is used to store decoding
872    ProprietaryRangeMax2 = 65535,
873}
874
875impl TryFrom<u32> for EngineeringUnits {
876    type Error = u32;
877
878    fn try_from(value: u32) -> Result<Self, Self::Error> {
879        match value {
880            166 => Ok(Self::MetersPerSecondPerSecond),
881            0 => Ok(Self::SquareMeters),
882            116 => Ok(Self::SquareCentimeters),
883            1 => Ok(Self::SquareFeet),
884            115 => Ok(Self::SquareInches),
885            105 => Ok(Self::Currency1),
886            106 => Ok(Self::Currency2),
887            107 => Ok(Self::Currency3),
888            108 => Ok(Self::Currency4),
889            109 => Ok(Self::Currency5),
890            110 => Ok(Self::Currency6),
891            111 => Ok(Self::Currency7),
892            112 => Ok(Self::Currency8),
893            113 => Ok(Self::Currency9),
894            114 => Ok(Self::Currency10),
895            2 => Ok(Self::Milliamperes),
896            3 => Ok(Self::Amperes),
897            167 => Ok(Self::AmperesPerMeter),
898            168 => Ok(Self::AmperesPerSquareMeter),
899            169 => Ok(Self::AmpereSquareMeters),
900            199 => Ok(Self::Decibels),
901            200 => Ok(Self::DecibelsMillivolt),
902            201 => Ok(Self::DecibelsVolt),
903            170 => Ok(Self::Farads),
904            171 => Ok(Self::Henrys),
905            4 => Ok(Self::Ohms),
906            172 => Ok(Self::OhmMeters),
907            145 => Ok(Self::Milliohms),
908            122 => Ok(Self::Kilohms),
909            123 => Ok(Self::Megohms),
910            190 => Ok(Self::Microsiemens),
911            202 => Ok(Self::Millisiemens),
912            173 => Ok(Self::Siemens),
913            174 => Ok(Self::SiemensPerMeter),
914            175 => Ok(Self::Teslas),
915            5 => Ok(Self::Volts),
916            124 => Ok(Self::Millivolts),
917            6 => Ok(Self::Kilovolts),
918            7 => Ok(Self::Megavolts),
919            8 => Ok(Self::VoltAmperes),
920            9 => Ok(Self::KilovoltAmperes),
921            10 => Ok(Self::MegavoltAmperes),
922            11 => Ok(Self::VoltAmperesReactive),
923            12 => Ok(Self::KilovoltAmperesReactive),
924            13 => Ok(Self::MegavoltAmperesReactive),
925            176 => Ok(Self::VoltsPerDegreeKelvin),
926            177 => Ok(Self::VoltsPerMeter),
927            14 => Ok(Self::DegreesPhase),
928            15 => Ok(Self::PowerFactor),
929            178 => Ok(Self::Webers),
930            16 => Ok(Self::Joules),
931            17 => Ok(Self::Kilojoules),
932            125 => Ok(Self::KilojoulesPerKilogram),
933            126 => Ok(Self::Megajoules),
934            18 => Ok(Self::WattHours),
935            19 => Ok(Self::KilowattHours),
936            146 => Ok(Self::MegawattHours),
937            203 => Ok(Self::WattHoursReactive),
938            204 => Ok(Self::KilowattHoursReactive),
939            205 => Ok(Self::MegawattHoursReactive),
940            20 => Ok(Self::Btus),
941            147 => Ok(Self::KiloBtus),
942            148 => Ok(Self::MegaBtus),
943            21 => Ok(Self::Therms),
944            22 => Ok(Self::TonHours),
945            23 => Ok(Self::JoulesPerKilogramDryAir),
946            149 => Ok(Self::KilojoulesPerKilogramDryAir),
947            150 => Ok(Self::MegajoulesPerKilogramDryAir),
948            24 => Ok(Self::BtusPerPoundDryAir),
949            117 => Ok(Self::BtusPerPound),
950            127 => Ok(Self::JoulesPerDegreeKelvin),
951            151 => Ok(Self::KilojoulesPerDegreeKelvin),
952            152 => Ok(Self::MegajoulesPerDegreeKelvin),
953            128 => Ok(Self::JoulesPerKilogramDegreeKelvin),
954            153 => Ok(Self::Newton),
955            25 => Ok(Self::CyclesPerHour),
956            26 => Ok(Self::CyclesPerMinute),
957            27 => Ok(Self::Hertz),
958            129 => Ok(Self::Kilohertz),
959            130 => Ok(Self::Megahertz),
960            131 => Ok(Self::PerHour),
961            28 => Ok(Self::GramsOfWaterPerKilogramDryAir),
962            29 => Ok(Self::PercentRelativeHumidity),
963            194 => Ok(Self::Micrometers),
964            30 => Ok(Self::Millimeters),
965            118 => Ok(Self::Centimeters),
966            193 => Ok(Self::Kilometers),
967            31 => Ok(Self::Meters),
968            32 => Ok(Self::Inches),
969            33 => Ok(Self::Feet),
970            179 => Ok(Self::Candelas),
971            180 => Ok(Self::CandelasPerSquareMeter),
972            34 => Ok(Self::WattsPerSquareFoot),
973            35 => Ok(Self::WattsPerSquareMeter),
974            36 => Ok(Self::Lumens),
975            37 => Ok(Self::Luxes),
976            38 => Ok(Self::FootCandles),
977            196 => Ok(Self::Milligrams),
978            195 => Ok(Self::Grams),
979            39 => Ok(Self::Kilograms),
980            40 => Ok(Self::PoundsMass),
981            41 => Ok(Self::Tons),
982            154 => Ok(Self::GramsPerSecond),
983            155 => Ok(Self::GramsPerMinute),
984            42 => Ok(Self::KilogramsPerSecond),
985            43 => Ok(Self::KilogramsPerMinute),
986            44 => Ok(Self::KilogramsPerHour),
987            119 => Ok(Self::PoundsMassPerSecond),
988            45 => Ok(Self::PoundsMassPerMinute),
989            46 => Ok(Self::PoundsMassPerHour),
990            156 => Ok(Self::TonsPerHour),
991            132 => Ok(Self::Milliwatts),
992            47 => Ok(Self::Watts),
993            48 => Ok(Self::Kilowatts),
994            49 => Ok(Self::Megawatts),
995            50 => Ok(Self::BtusPerHour),
996            157 => Ok(Self::KiloBtusPerHour),
997            51 => Ok(Self::Horsepower),
998            52 => Ok(Self::TonsRefrigeration),
999            53 => Ok(Self::Pascals),
1000            133 => Ok(Self::Hectopascals),
1001            54 => Ok(Self::Kilopascals),
1002            134 => Ok(Self::Millibars),
1003            55 => Ok(Self::Bars),
1004            56 => Ok(Self::PoundsForcePerSquareInch),
1005            206 => Ok(Self::MillimetersOfWater),
1006            57 => Ok(Self::CentimetersOfWater),
1007            58 => Ok(Self::InchesOfWater),
1008            59 => Ok(Self::MillimetersOfMercury),
1009            60 => Ok(Self::CentimetersOfMercury),
1010            61 => Ok(Self::InchesOfMercury),
1011            62 => Ok(Self::DegreesCelsius),
1012            63 => Ok(Self::DegreesKelvin),
1013            181 => Ok(Self::DegreesKelvinPerHour),
1014            182 => Ok(Self::DegreesKelvinPerMinute),
1015            64 => Ok(Self::DegreesFahrenheit),
1016            65 => Ok(Self::DegreeDaysCelsius),
1017            66 => Ok(Self::DegreeDaysFahrenheit),
1018            120 => Ok(Self::DeltaDegreesFahrenheit),
1019            121 => Ok(Self::DeltaDegreesKelvin),
1020            67 => Ok(Self::Years),
1021            68 => Ok(Self::Months),
1022            69 => Ok(Self::Weeks),
1023            70 => Ok(Self::Days),
1024            71 => Ok(Self::Hours),
1025            72 => Ok(Self::Minutes),
1026            73 => Ok(Self::Seconds),
1027            158 => Ok(Self::HundredthsSeconds),
1028            159 => Ok(Self::Milliseconds),
1029            160 => Ok(Self::NewtonMeters),
1030            161 => Ok(Self::MillimetersPerSecond),
1031            162 => Ok(Self::MillimetersPerMinute),
1032            74 => Ok(Self::MetersPerSecond),
1033            163 => Ok(Self::MetersPerMinute),
1034            164 => Ok(Self::MetersPerHour),
1035            75 => Ok(Self::KilometersPerHour),
1036            76 => Ok(Self::FeetPerSecond),
1037            77 => Ok(Self::FeetPerMinute),
1038            78 => Ok(Self::MilesPerHour),
1039            79 => Ok(Self::CubicFeet),
1040            80 => Ok(Self::CubicMeters),
1041            81 => Ok(Self::ImperialGallons),
1042            197 => Ok(Self::Milliliters),
1043            82 => Ok(Self::Liters),
1044            83 => Ok(Self::UsGallons),
1045            142 => Ok(Self::CubicFeetPerSecond),
1046            84 => Ok(Self::CubicFeetPerMinute),
1047            191 => Ok(Self::CubicFeetPerHour),
1048            85 => Ok(Self::CubicMetersPerSecond),
1049            165 => Ok(Self::CubicMetersPerMinute),
1050            135 => Ok(Self::CubicMetersPerHour),
1051            86 => Ok(Self::ImperialGallonsPerMinute),
1052            198 => Ok(Self::MillilitersPerSecond),
1053            87 => Ok(Self::LitersPerSecond),
1054            88 => Ok(Self::LitersPerMinute),
1055            136 => Ok(Self::LitersPerHour),
1056            89 => Ok(Self::UsGallonsPerMinute),
1057            192 => Ok(Self::UsGallonsPerHour),
1058            90 => Ok(Self::DegreesAngular),
1059            91 => Ok(Self::DegreesCelsiusPerHour),
1060            92 => Ok(Self::DegreesCelsiusPerMinute),
1061            93 => Ok(Self::DegreesFahrenheitPerHour),
1062            94 => Ok(Self::DegreesFahrenheitPerMinute),
1063            183 => Ok(Self::JouleSeconds),
1064            186 => Ok(Self::KilogramsPerCubicMeter),
1065            137 => Ok(Self::KwHoursPerSquareMeter),
1066            138 => Ok(Self::KwHoursPerSquareFoot),
1067            139 => Ok(Self::MegajoulesPerSquareMeter),
1068            140 => Ok(Self::MegajoulesPerSquareFoot),
1069            95 => Ok(Self::NoUnits),
1070            187 => Ok(Self::NewtonSeconds),
1071            188 => Ok(Self::NewtonsPerMeter),
1072            96 => Ok(Self::PartsPerMillion),
1073            97 => Ok(Self::PartsPerBillion),
1074            98 => Ok(Self::Percent),
1075            143 => Ok(Self::PercentObscurationPerFoot),
1076            144 => Ok(Self::PercentObscurationPerMeter),
1077            99 => Ok(Self::PercentPerSecond),
1078            100 => Ok(Self::PerMinute),
1079            101 => Ok(Self::PerSecond),
1080            102 => Ok(Self::PsiPerDegreeFahrenheit),
1081            103 => Ok(Self::Radians),
1082            184 => Ok(Self::RadiansPerSecond),
1083            104 => Ok(Self::RevolutionsPerMinute),
1084            185 => Ok(Self::SquareMetersPerNewton),
1085            189 => Ok(Self::WattsPerMeterPerDegreeKelvin),
1086            141 => Ok(Self::WattsPerSquareMeterDegreeKelvin),
1087            207 => Ok(Self::PerMille),
1088            208 => Ok(Self::GramsPerGram),
1089            209 => Ok(Self::KilogramsPerKilogram),
1090            210 => Ok(Self::GramsPerKilogram),
1091            211 => Ok(Self::MilligramsPerGram),
1092            212 => Ok(Self::MilligramsPerKilogram),
1093            213 => Ok(Self::GramsPerMilliliter),
1094            214 => Ok(Self::GramsPerLiter),
1095            215 => Ok(Self::MilligramsPerLiter),
1096            216 => Ok(Self::MicrogramsPerLiter),
1097            217 => Ok(Self::GramsPerCubicMeter),
1098            218 => Ok(Self::MilligramsPerCubicMeter),
1099            219 => Ok(Self::MicrogramsPerCubicMeter),
1100            220 => Ok(Self::NanogramsPerCubicMeter),
1101            221 => Ok(Self::GramsPerCubicCentimeter),
1102            222 => Ok(Self::Becquerels),
1103            223 => Ok(Self::Kilobecquerels),
1104            224 => Ok(Self::Megabecquerels),
1105            225 => Ok(Self::Gray),
1106            226 => Ok(Self::Milligray),
1107            227 => Ok(Self::Microgray),
1108            228 => Ok(Self::Sieverts),
1109            229 => Ok(Self::Millisieverts),
1110            230 => Ok(Self::Microsieverts),
1111            231 => Ok(Self::MicrosievertsPerHour),
1112            232 => Ok(Self::DecibelsA),
1113            233 => Ok(Self::NephelometricTurbidityUnit),
1114            234 => Ok(Self::Ph),
1115            235 => Ok(Self::GramsPerSquareMeter),
1116            236 => Ok(Self::MinutesPerDegreeKelvin),
1117            237 => Ok(Self::OhmMeterSquaredPerMeter),
1118            238 => Ok(Self::AmpereSeconds),
1119            239 => Ok(Self::VoltAmpereHours),
1120            240 => Ok(Self::KilovoltAmpereHours),
1121            241 => Ok(Self::MegavoltAmpereHours),
1122            242 => Ok(Self::VoltAmpereHoursReactive),
1123            243 => Ok(Self::KilovoltAmpereHoursReactive),
1124            244 => Ok(Self::MegavoltAmpereHoursReactive),
1125            245 => Ok(Self::VoltSquareHours),
1126            246 => Ok(Self::AmpereSquareHours),
1127            247 => Ok(Self::JoulePerHours),
1128            248 => Ok(Self::CubicFeetPerDay),
1129            249 => Ok(Self::CubicMetersPerDay),
1130            250 => Ok(Self::WattHoursPerCubicMeter),
1131            251 => Ok(Self::JoulesPerCubicMeter),
1132            252 => Ok(Self::MolePercent),
1133            253 => Ok(Self::PascalSeconds),
1134            254 => Ok(Self::MillionStandardCubicFeetPerMinute),
1135            255 => Ok(Self::ReservedRangeMax),
1136            256 => Ok(Self::ProprietaryRangeMin),
1137            47807 => Ok(Self::ProprietaryRangeMax),
1138            47808 => Ok(Self::StandardCubicFeetPerDay),
1139            47809 => Ok(Self::MillionStandardCubicFeetPerDay),
1140            47810 => Ok(Self::ThousandCubicFeetPerDay),
1141            47811 => Ok(Self::ThousandStandardCubicFeetPerDay),
1142            47812 => Ok(Self::PoundsMassPerDay),
1143            47814 => Ok(Self::Millirems),
1144            47815 => Ok(Self::MilliremsPerHour),
1145            49999 => Ok(Self::ReservedRangeMax2),
1146            50000 => Ok(Self::ProprietaryRangeMin2),
1147            65535 => Ok(Self::ProprietaryRangeMax2),
1148            _ => Err(value),
1149        }
1150    }
1151}
1152
1153#[repr(u8)]
1154pub enum LogBufferResultFlags {
1155    FirstItem = 0b1000_0000,
1156    LastItem = 0b0100_0000,
1157    MoreItems = 0b0010_0000,
1158}
1159
1160#[repr(u8)]
1161pub enum StatusFlags {
1162    InAlarm = 0b1000_0000,
1163    Fault = 0b0100_0000,
1164    Overridden = 0b0010_0000,
1165    OutOfService = 0b0001_0000,
1166}
1167
1168#[derive(Debug, Clone, Default)]
1169#[cfg_attr(feature = "defmt", derive(defmt::Format))]
1170#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1171pub struct Status {
1172    pub inner: u8,
1173}
1174
1175impl Status {
1176    pub fn new(inner: u8) -> Self {
1177        Self { inner }
1178    }
1179
1180    pub const fn in_alarm(&self) -> bool {
1181        self.inner & StatusFlags::InAlarm as u8 == StatusFlags::InAlarm as u8
1182    }
1183
1184    pub const fn fault(&self) -> bool {
1185        self.inner & StatusFlags::Fault as u8 == StatusFlags::Fault as u8
1186    }
1187
1188    pub const fn overridden(&self) -> bool {
1189        self.inner & StatusFlags::Overridden as u8 == StatusFlags::Overridden as u8
1190    }
1191
1192    pub const fn out_of_service(&self) -> bool {
1193        self.inner & StatusFlags::OutOfService as u8 == StatusFlags::OutOfService as u8
1194    }
1195}
1196
1197#[derive(Debug, Clone, Default)]
1198#[cfg_attr(feature = "defmt", derive(defmt::Format))]
1199#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1200pub struct LogBufferResult {
1201    pub inner: u8,
1202}
1203
1204impl LogBufferResult {
1205    pub fn new(inner: u8) -> Self {
1206        Self { inner }
1207    }
1208
1209    pub const fn first_item(&self) -> bool {
1210        self.inner & LogBufferResultFlags::FirstItem as u8 == LogBufferResultFlags::FirstItem as u8
1211    }
1212
1213    pub const fn last_item(&self) -> bool {
1214        self.inner & LogBufferResultFlags::LastItem as u8 == LogBufferResultFlags::LastItem as u8
1215    }
1216
1217    pub const fn more_items(&self) -> bool {
1218        self.inner & LogBufferResultFlags::MoreItems as u8 == LogBufferResultFlags::MoreItems as u8
1219    }
1220}
1221
1222#[derive(Debug, Clone)]
1223#[cfg_attr(feature = "defmt", derive(defmt::Format))]
1224#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1225pub enum LogStatus {
1226    LogDisabled = 0,
1227    BufferPurged = 1,
1228    LogInterrupted = 2,
1229}
1230
1231#[derive(Debug, Clone)]
1232#[cfg_attr(feature = "defmt", derive(defmt::Format))]
1233#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1234pub enum AcknowledgmentFilter {
1235    All = 0,
1236    Acked = 1,
1237    NotAcked = 2,
1238}
1239
1240#[derive(Debug, Clone)]
1241#[cfg_attr(feature = "defmt", derive(defmt::Format))]
1242#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1243#[repr(u32)]
1244pub enum EventState {
1245    Normal = 0,
1246    Fault = 1,
1247    OffNormal = 2,
1248    HighLimit = 3,
1249    LowLimit = 4,
1250}
1251
1252impl TryFrom<u32> for EventState {
1253    type Error = u32;
1254
1255    fn try_from(value: u32) -> Result<Self, Self::Error> {
1256        match value {
1257            0 => Ok(Self::Normal),
1258            1 => Ok(Self::Fault),
1259            2 => Ok(Self::OffNormal),
1260            3 => Ok(Self::HighLimit),
1261            4 => Ok(Self::LowLimit),
1262            x => Err(x),
1263        }
1264    }
1265}
1266
1267#[derive(Debug, Clone)]
1268#[cfg_attr(feature = "defmt", derive(defmt::Format))]
1269#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1270#[repr(u32)]
1271pub enum NotifyType {
1272    Alarm = 0,
1273    Event = 1,
1274    AckNotification = 2,
1275}
1276
1277impl TryFrom<u32> for NotifyType {
1278    type Error = u32;
1279
1280    fn try_from(value: u32) -> Result<Self, Self::Error> {
1281        match value {
1282            0 => Ok(Self::Alarm),
1283            1 => Ok(Self::Event),
1284            2 => Ok(Self::AckNotification),
1285            x => Err(x),
1286        }
1287    }
1288}
1289
1290#[derive(Debug, Clone)]
1291#[cfg_attr(feature = "defmt", derive(defmt::Format))]
1292#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1293#[repr(u32)]
1294pub enum LoggingType {
1295    Polled = 0,
1296    Cov = 1,
1297    Triggered = 2,
1298}
1299
1300impl TryFrom<u32> for LoggingType {
1301    type Error = u32;
1302
1303    fn try_from(value: u32) -> Result<Self, Self::Error> {
1304        match value {
1305            0 => Ok(Self::Polled),
1306            1 => Ok(Self::Cov),
1307            2 => Ok(Self::Triggered),
1308            x => Err(x),
1309        }
1310    }
1311}
1312
1313#[derive(Debug, Clone)]
1314#[cfg_attr(feature = "defmt", derive(defmt::Format))]
1315#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1316pub enum SelectionLogic {
1317    And = 0,
1318    Or = 1,
1319    All = 2,
1320}
1321
1322#[derive(Debug, Clone)]
1323#[cfg_attr(feature = "defmt", derive(defmt::Format))]
1324#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1325pub enum RelationSpecifier {
1326    Equal = 0,
1327    NotEqual = 1,
1328    LessThan = 2,
1329    GreaterThan = 3,
1330    LessThanOrEqual = 4,
1331    GreaterThanOrEqual = 5,
1332}
1333
1334#[derive(Debug, Clone)]
1335#[cfg_attr(feature = "defmt", derive(defmt::Format))]
1336#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1337pub enum CommunicationEnableDisable {
1338    Enable = 0,
1339    Disable = 1,
1340    DisableInitiation = 2,
1341}
1342
1343#[derive(Debug, Clone)]
1344#[cfg_attr(feature = "defmt", derive(defmt::Format))]
1345#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1346pub enum MessagePriority {
1347    Normal = 0,
1348    Urgent = 1,
1349    CriticalEquipment = 2,
1350    LifeSafety = 3,
1351}
1352
1353// end of bit string enumerations