bacnet_emb/common/
spec.rs

1use crate::common::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 EngineeringUnits {
876    /// returns a string representation of the most common engineering units
877    /// NOTE: Make sure the font can render the following unicode characters: ²³⁻¹Ω°Δ
878    pub fn as_str(&self) -> &'static str {
879        match self {
880            Self::MetersPerSecondPerSecond => "m/s²",
881            Self::SquareMeters => "m²",
882            Self::SquareCentimeters => "cm²",
883            Self::SquareFeet => "ft²",
884            Self::SquareInches => "in²",
885            Self::Currency1 => "$",
886            Self::Milliamperes => "mA",
887            Self::Amperes => "A",
888            Self::AmperesPerMeter => "A/m",
889            Self::AmperesPerSquareMeter => "A/m²",
890            Self::AmpereSquareMeters => "Am²",
891            Self::Farads => "F",
892            Self::Henrys => "H",
893            Self::Ohms => "Ω",
894            Self::OhmMeters => "Ωm",
895            Self::Milliohms => "mΩ",
896            Self::Kilohms => "kΩ",
897            Self::Megohms => "MΩ",
898            Self::Siemens => "S",
899            Self::SiemensPerMeter => "S/m",
900            Self::Teslas => "T",
901            Self::Volts => "V",
902            Self::Millivolts => "mV",
903            Self::Kilovolts => "kV",
904            Self::Megavolts => "MV",
905            Self::VoltAmperes => "VA",
906            Self::KilovoltAmperes => "kVA",
907            Self::MegavoltAmperes => "MVA",
908            Self::VoltAmperesReactive => "var",
909            Self::KilovoltAmperesReactive => "kvar",
910            Self::MegavoltAmperesReactive => "Mvar",
911            Self::DegreesPhase => "°P",
912            Self::PowerFactor => "pf",
913            Self::Webers => "Wb",
914            Self::Joules => "J",
915            Self::Kilojoules => "kJ",
916            Self::KilojoulesPerKilogram => "kJ/kg",
917            Self::Megajoules => "MJ",
918            Self::WattHours => "Wh",
919            Self::KilowattHours => "kWh",
920            Self::MegawattHours => "MWh",
921            Self::Btus => "btu",
922            Self::KiloBtus => "kbtu",
923            Self::MegaBtus => "Mbtu",
924            Self::Therms => "thrm",
925            Self::TonHours => "th",
926            Self::JoulesPerKilogramDryAir => "J/kg",
927            Self::KilojoulesPerKilogramDryAir => "kJ/kg",
928            Self::MegajoulesPerKilogramDryAir => "MJ/kg",
929            Self::BtusPerPoundDryAir => "b/lb",
930            Self::BtusPerPound => "b/lb",
931            Self::JoulesPerDegreeKelvin => "J/K",
932            Self::KilojoulesPerDegreeKelvin => "kJ/K",
933            Self::MegajoulesPerDegreeKelvin => "MJ/K",
934            Self::Newton => "N",
935            Self::CyclesPerHour => "c/h",
936            Self::CyclesPerMinute => "c/m",
937            Self::Hertz => "Hz",
938            Self::Kilohertz => "kHz",
939            Self::Megahertz => "MHz",
940            Self::PerHour => "h⁻¹",
941            Self::GramsOfWaterPerKilogramDryAir => "g/kg",
942            Self::PercentRelativeHumidity => "%rh",
943            Self::Milliliters => "mm",
944            Self::Centimeters => "cm",
945            Self::Meters => "m",
946            Self::Inches => "inch",
947            Self::Feet => "feet",
948            Self::Candelas => "cd",
949            Self::CandelasPerSquareMeter => "cd/m²",
950            Self::WattsPerSquareFoot => "W/f²",
951            Self::WattsPerSquareMeter => "W/m²",
952            Self::Lumens => "lum",
953            Self::Luxes => "lux",
954            Self::FootCandles => "ftcd",
955            Self::Kilograms => "kg",
956            Self::PoundsMass => "lb",
957            Self::Tons => "t",
958            Self::GramsPerSecond => "g/s",
959            Self::GramsPerMinute => "g/m",
960            Self::KilogramsPerSecond => "kg/s",
961            Self::KilogramsPerMinute => "kg/m",
962            Self::KilogramsPerHour => "kg/h",
963            Self::PoundsMassPerSecond => "lb/s",
964            Self::PoundsMassPerMinute => "lb/m",
965            Self::PoundsMassPerHour => "lb/h",
966            Self::TonsPerHour => "t/h",
967            Self::Milliwatts => "mW",
968            Self::Watts => "W",
969            Self::Kilowatts => "kW",
970            Self::Megawatts => "MW",
971            Self::BtusPerHour => "bt/h",
972            Self::Horsepower => "hp",
973            Self::TonsRefrigeration => "tr",
974            Self::Pascals => "Pa",
975            Self::Hectopascals => "hPa",
976            Self::Kilopascals => "kPa",
977            Self::Millibars => "mBar",
978            Self::Bars => "Bar",
979            Self::PoundsForcePerSquareInch => "psi",
980            Self::CentimetersOfWater => "cmw",
981            Self::InchesOfWater => "inwc",
982            Self::MillimetersOfMercury => "mmHg",
983            Self::CentimetersOfMercury => "cmHg",
984            Self::InchesOfMercury => "inHg",
985            Self::DegreesCelsius => "°C",
986            Self::DegreesKelvin => "K",
987            Self::DegreesKelvinPerHour => "K/h",
988            Self::DegreesKelvinPerMinute => "K/m",
989            Self::DegreesFahrenheit => "°F",
990            Self::DegreeDaysCelsius => "°dyC",
991            Self::DegreeDaysFahrenheit => "°dyF",
992            Self::DeltaDegreesFahrenheit => "Δ°F",
993            Self::Years => "year",
994            Self::Months => "mnth",
995            Self::Weeks => "week",
996            Self::Days => "day",
997            Self::Hours => "hour",
998            Self::Minutes => "min",
999            Self::Seconds => "sec",
1000            Self::HundredthsSeconds => "s⁻²",
1001            Self::Milliseconds => "ms",
1002            Self::NewtonMeters => "Nm",
1003            Self::MillimetersPerSecond => "mm/s",
1004            Self::MillimetersPerMinute => "mm/m",
1005            Self::MetersPerSecond => "m/s",
1006            Self::MetersPerMinute => "m/m",
1007            Self::MetersPerHour => "m/h",
1008            Self::KilometersPerHour => "km/h",
1009            Self::FeetPerSecond => "ft/s",
1010            Self::FeetPerMinute => "fpm",
1011            Self::MilesPerHour => "mph",
1012            Self::CubicFeet => "ft³",
1013            Self::CubicMeters => "m³",
1014            Self::ImperialGallons => "gall",
1015            Self::Liters => "l",
1016            Self::UsGallons => "USg",
1017            Self::CubicFeetPerSecond => "cfs",
1018            Self::CubicFeetPerMinute => "cfm",
1019            Self::CubicFeetPerHour => "cfh",
1020            Self::CubicMetersPerSecond => "m³/s",
1021            Self::CubicMetersPerMinute => "m³/m",
1022            Self::CubicMetersPerHour => "m³/h",
1023            Self::ImperialGallonsPerMinute => "igpm",
1024            Self::LitersPerSecond => "l/s",
1025            Self::LitersPerMinute => "l/m",
1026            Self::LitersPerHour => "l/h",
1027            Self::UsGallonsPerMinute => "gpm",
1028            Self::DegreesAngular => "deg",
1029            Self::DegreesCelsiusPerHour => "°C/h",
1030            Self::DegreesCelsiusPerMinute => "°C/m",
1031            Self::DegreesFahrenheitPerHour => "°F/h",
1032            Self::DegreesFahrenheitPerMinute => "°F/m",
1033            Self::JouleSeconds => "Js",
1034            Self::KilogramsPerCubicMeter => "kg/m³",
1035            Self::KwHoursPerSquareMeter => "kWhm",
1036            Self::KwHoursPerSquareFoot => "kWhf",
1037            Self::NoUnits => "",
1038            Self::NewtonSeconds => "Ns",
1039            Self::NewtonsPerMeter => "N/m",
1040            Self::PartsPerMillion => "ppm",
1041            Self::PartsPerBillion => "ppb",
1042            Self::Percent => "%",
1043            Self::PercentObscurationPerFoot => "%/ft",
1044            Self::PercentObscurationPerMeter => "%/m",
1045            Self::PercentPerSecond => "%/s",
1046            Self::PerMinute => "pm",
1047            Self::PerSecond => "ps",
1048            Self::PsiPerDegreeFahrenheit => "psiF",
1049            Self::Radians => "rad",
1050            Self::RadiansPerSecond => "rd/s",
1051            Self::RevolutionsPerMinute => "rpm",
1052            Self::SquareMetersPerNewton => "m²/N",
1053            Self::WattsPerMeterPerDegreeKelvin => "WmK",
1054            Self::WattsPerSquareMeterDegreeKelvin => "Wm²K",
1055            _x => {
1056                // unhandled units
1057                ""
1058            }
1059        }
1060    }
1061}
1062
1063impl TryFrom<u32> for EngineeringUnits {
1064    type Error = u32;
1065
1066    fn try_from(value: u32) -> Result<Self, Self::Error> {
1067        match value {
1068            166 => Ok(Self::MetersPerSecondPerSecond),
1069            0 => Ok(Self::SquareMeters),
1070            116 => Ok(Self::SquareCentimeters),
1071            1 => Ok(Self::SquareFeet),
1072            115 => Ok(Self::SquareInches),
1073            105 => Ok(Self::Currency1),
1074            106 => Ok(Self::Currency2),
1075            107 => Ok(Self::Currency3),
1076            108 => Ok(Self::Currency4),
1077            109 => Ok(Self::Currency5),
1078            110 => Ok(Self::Currency6),
1079            111 => Ok(Self::Currency7),
1080            112 => Ok(Self::Currency8),
1081            113 => Ok(Self::Currency9),
1082            114 => Ok(Self::Currency10),
1083            2 => Ok(Self::Milliamperes),
1084            3 => Ok(Self::Amperes),
1085            167 => Ok(Self::AmperesPerMeter),
1086            168 => Ok(Self::AmperesPerSquareMeter),
1087            169 => Ok(Self::AmpereSquareMeters),
1088            199 => Ok(Self::Decibels),
1089            200 => Ok(Self::DecibelsMillivolt),
1090            201 => Ok(Self::DecibelsVolt),
1091            170 => Ok(Self::Farads),
1092            171 => Ok(Self::Henrys),
1093            4 => Ok(Self::Ohms),
1094            172 => Ok(Self::OhmMeters),
1095            145 => Ok(Self::Milliohms),
1096            122 => Ok(Self::Kilohms),
1097            123 => Ok(Self::Megohms),
1098            190 => Ok(Self::Microsiemens),
1099            202 => Ok(Self::Millisiemens),
1100            173 => Ok(Self::Siemens),
1101            174 => Ok(Self::SiemensPerMeter),
1102            175 => Ok(Self::Teslas),
1103            5 => Ok(Self::Volts),
1104            124 => Ok(Self::Millivolts),
1105            6 => Ok(Self::Kilovolts),
1106            7 => Ok(Self::Megavolts),
1107            8 => Ok(Self::VoltAmperes),
1108            9 => Ok(Self::KilovoltAmperes),
1109            10 => Ok(Self::MegavoltAmperes),
1110            11 => Ok(Self::VoltAmperesReactive),
1111            12 => Ok(Self::KilovoltAmperesReactive),
1112            13 => Ok(Self::MegavoltAmperesReactive),
1113            176 => Ok(Self::VoltsPerDegreeKelvin),
1114            177 => Ok(Self::VoltsPerMeter),
1115            14 => Ok(Self::DegreesPhase),
1116            15 => Ok(Self::PowerFactor),
1117            178 => Ok(Self::Webers),
1118            16 => Ok(Self::Joules),
1119            17 => Ok(Self::Kilojoules),
1120            125 => Ok(Self::KilojoulesPerKilogram),
1121            126 => Ok(Self::Megajoules),
1122            18 => Ok(Self::WattHours),
1123            19 => Ok(Self::KilowattHours),
1124            146 => Ok(Self::MegawattHours),
1125            203 => Ok(Self::WattHoursReactive),
1126            204 => Ok(Self::KilowattHoursReactive),
1127            205 => Ok(Self::MegawattHoursReactive),
1128            20 => Ok(Self::Btus),
1129            147 => Ok(Self::KiloBtus),
1130            148 => Ok(Self::MegaBtus),
1131            21 => Ok(Self::Therms),
1132            22 => Ok(Self::TonHours),
1133            23 => Ok(Self::JoulesPerKilogramDryAir),
1134            149 => Ok(Self::KilojoulesPerKilogramDryAir),
1135            150 => Ok(Self::MegajoulesPerKilogramDryAir),
1136            24 => Ok(Self::BtusPerPoundDryAir),
1137            117 => Ok(Self::BtusPerPound),
1138            127 => Ok(Self::JoulesPerDegreeKelvin),
1139            151 => Ok(Self::KilojoulesPerDegreeKelvin),
1140            152 => Ok(Self::MegajoulesPerDegreeKelvin),
1141            128 => Ok(Self::JoulesPerKilogramDegreeKelvin),
1142            153 => Ok(Self::Newton),
1143            25 => Ok(Self::CyclesPerHour),
1144            26 => Ok(Self::CyclesPerMinute),
1145            27 => Ok(Self::Hertz),
1146            129 => Ok(Self::Kilohertz),
1147            130 => Ok(Self::Megahertz),
1148            131 => Ok(Self::PerHour),
1149            28 => Ok(Self::GramsOfWaterPerKilogramDryAir),
1150            29 => Ok(Self::PercentRelativeHumidity),
1151            194 => Ok(Self::Micrometers),
1152            30 => Ok(Self::Millimeters),
1153            118 => Ok(Self::Centimeters),
1154            193 => Ok(Self::Kilometers),
1155            31 => Ok(Self::Meters),
1156            32 => Ok(Self::Inches),
1157            33 => Ok(Self::Feet),
1158            179 => Ok(Self::Candelas),
1159            180 => Ok(Self::CandelasPerSquareMeter),
1160            34 => Ok(Self::WattsPerSquareFoot),
1161            35 => Ok(Self::WattsPerSquareMeter),
1162            36 => Ok(Self::Lumens),
1163            37 => Ok(Self::Luxes),
1164            38 => Ok(Self::FootCandles),
1165            196 => Ok(Self::Milligrams),
1166            195 => Ok(Self::Grams),
1167            39 => Ok(Self::Kilograms),
1168            40 => Ok(Self::PoundsMass),
1169            41 => Ok(Self::Tons),
1170            154 => Ok(Self::GramsPerSecond),
1171            155 => Ok(Self::GramsPerMinute),
1172            42 => Ok(Self::KilogramsPerSecond),
1173            43 => Ok(Self::KilogramsPerMinute),
1174            44 => Ok(Self::KilogramsPerHour),
1175            119 => Ok(Self::PoundsMassPerSecond),
1176            45 => Ok(Self::PoundsMassPerMinute),
1177            46 => Ok(Self::PoundsMassPerHour),
1178            156 => Ok(Self::TonsPerHour),
1179            132 => Ok(Self::Milliwatts),
1180            47 => Ok(Self::Watts),
1181            48 => Ok(Self::Kilowatts),
1182            49 => Ok(Self::Megawatts),
1183            50 => Ok(Self::BtusPerHour),
1184            157 => Ok(Self::KiloBtusPerHour),
1185            51 => Ok(Self::Horsepower),
1186            52 => Ok(Self::TonsRefrigeration),
1187            53 => Ok(Self::Pascals),
1188            133 => Ok(Self::Hectopascals),
1189            54 => Ok(Self::Kilopascals),
1190            134 => Ok(Self::Millibars),
1191            55 => Ok(Self::Bars),
1192            56 => Ok(Self::PoundsForcePerSquareInch),
1193            206 => Ok(Self::MillimetersOfWater),
1194            57 => Ok(Self::CentimetersOfWater),
1195            58 => Ok(Self::InchesOfWater),
1196            59 => Ok(Self::MillimetersOfMercury),
1197            60 => Ok(Self::CentimetersOfMercury),
1198            61 => Ok(Self::InchesOfMercury),
1199            62 => Ok(Self::DegreesCelsius),
1200            63 => Ok(Self::DegreesKelvin),
1201            181 => Ok(Self::DegreesKelvinPerHour),
1202            182 => Ok(Self::DegreesKelvinPerMinute),
1203            64 => Ok(Self::DegreesFahrenheit),
1204            65 => Ok(Self::DegreeDaysCelsius),
1205            66 => Ok(Self::DegreeDaysFahrenheit),
1206            120 => Ok(Self::DeltaDegreesFahrenheit),
1207            121 => Ok(Self::DeltaDegreesKelvin),
1208            67 => Ok(Self::Years),
1209            68 => Ok(Self::Months),
1210            69 => Ok(Self::Weeks),
1211            70 => Ok(Self::Days),
1212            71 => Ok(Self::Hours),
1213            72 => Ok(Self::Minutes),
1214            73 => Ok(Self::Seconds),
1215            158 => Ok(Self::HundredthsSeconds),
1216            159 => Ok(Self::Milliseconds),
1217            160 => Ok(Self::NewtonMeters),
1218            161 => Ok(Self::MillimetersPerSecond),
1219            162 => Ok(Self::MillimetersPerMinute),
1220            74 => Ok(Self::MetersPerSecond),
1221            163 => Ok(Self::MetersPerMinute),
1222            164 => Ok(Self::MetersPerHour),
1223            75 => Ok(Self::KilometersPerHour),
1224            76 => Ok(Self::FeetPerSecond),
1225            77 => Ok(Self::FeetPerMinute),
1226            78 => Ok(Self::MilesPerHour),
1227            79 => Ok(Self::CubicFeet),
1228            80 => Ok(Self::CubicMeters),
1229            81 => Ok(Self::ImperialGallons),
1230            197 => Ok(Self::Milliliters),
1231            82 => Ok(Self::Liters),
1232            83 => Ok(Self::UsGallons),
1233            142 => Ok(Self::CubicFeetPerSecond),
1234            84 => Ok(Self::CubicFeetPerMinute),
1235            191 => Ok(Self::CubicFeetPerHour),
1236            85 => Ok(Self::CubicMetersPerSecond),
1237            165 => Ok(Self::CubicMetersPerMinute),
1238            135 => Ok(Self::CubicMetersPerHour),
1239            86 => Ok(Self::ImperialGallonsPerMinute),
1240            198 => Ok(Self::MillilitersPerSecond),
1241            87 => Ok(Self::LitersPerSecond),
1242            88 => Ok(Self::LitersPerMinute),
1243            136 => Ok(Self::LitersPerHour),
1244            89 => Ok(Self::UsGallonsPerMinute),
1245            192 => Ok(Self::UsGallonsPerHour),
1246            90 => Ok(Self::DegreesAngular),
1247            91 => Ok(Self::DegreesCelsiusPerHour),
1248            92 => Ok(Self::DegreesCelsiusPerMinute),
1249            93 => Ok(Self::DegreesFahrenheitPerHour),
1250            94 => Ok(Self::DegreesFahrenheitPerMinute),
1251            183 => Ok(Self::JouleSeconds),
1252            186 => Ok(Self::KilogramsPerCubicMeter),
1253            137 => Ok(Self::KwHoursPerSquareMeter),
1254            138 => Ok(Self::KwHoursPerSquareFoot),
1255            139 => Ok(Self::MegajoulesPerSquareMeter),
1256            140 => Ok(Self::MegajoulesPerSquareFoot),
1257            95 => Ok(Self::NoUnits),
1258            187 => Ok(Self::NewtonSeconds),
1259            188 => Ok(Self::NewtonsPerMeter),
1260            96 => Ok(Self::PartsPerMillion),
1261            97 => Ok(Self::PartsPerBillion),
1262            98 => Ok(Self::Percent),
1263            143 => Ok(Self::PercentObscurationPerFoot),
1264            144 => Ok(Self::PercentObscurationPerMeter),
1265            99 => Ok(Self::PercentPerSecond),
1266            100 => Ok(Self::PerMinute),
1267            101 => Ok(Self::PerSecond),
1268            102 => Ok(Self::PsiPerDegreeFahrenheit),
1269            103 => Ok(Self::Radians),
1270            184 => Ok(Self::RadiansPerSecond),
1271            104 => Ok(Self::RevolutionsPerMinute),
1272            185 => Ok(Self::SquareMetersPerNewton),
1273            189 => Ok(Self::WattsPerMeterPerDegreeKelvin),
1274            141 => Ok(Self::WattsPerSquareMeterDegreeKelvin),
1275            207 => Ok(Self::PerMille),
1276            208 => Ok(Self::GramsPerGram),
1277            209 => Ok(Self::KilogramsPerKilogram),
1278            210 => Ok(Self::GramsPerKilogram),
1279            211 => Ok(Self::MilligramsPerGram),
1280            212 => Ok(Self::MilligramsPerKilogram),
1281            213 => Ok(Self::GramsPerMilliliter),
1282            214 => Ok(Self::GramsPerLiter),
1283            215 => Ok(Self::MilligramsPerLiter),
1284            216 => Ok(Self::MicrogramsPerLiter),
1285            217 => Ok(Self::GramsPerCubicMeter),
1286            218 => Ok(Self::MilligramsPerCubicMeter),
1287            219 => Ok(Self::MicrogramsPerCubicMeter),
1288            220 => Ok(Self::NanogramsPerCubicMeter),
1289            221 => Ok(Self::GramsPerCubicCentimeter),
1290            222 => Ok(Self::Becquerels),
1291            223 => Ok(Self::Kilobecquerels),
1292            224 => Ok(Self::Megabecquerels),
1293            225 => Ok(Self::Gray),
1294            226 => Ok(Self::Milligray),
1295            227 => Ok(Self::Microgray),
1296            228 => Ok(Self::Sieverts),
1297            229 => Ok(Self::Millisieverts),
1298            230 => Ok(Self::Microsieverts),
1299            231 => Ok(Self::MicrosievertsPerHour),
1300            232 => Ok(Self::DecibelsA),
1301            233 => Ok(Self::NephelometricTurbidityUnit),
1302            234 => Ok(Self::Ph),
1303            235 => Ok(Self::GramsPerSquareMeter),
1304            236 => Ok(Self::MinutesPerDegreeKelvin),
1305            237 => Ok(Self::OhmMeterSquaredPerMeter),
1306            238 => Ok(Self::AmpereSeconds),
1307            239 => Ok(Self::VoltAmpereHours),
1308            240 => Ok(Self::KilovoltAmpereHours),
1309            241 => Ok(Self::MegavoltAmpereHours),
1310            242 => Ok(Self::VoltAmpereHoursReactive),
1311            243 => Ok(Self::KilovoltAmpereHoursReactive),
1312            244 => Ok(Self::MegavoltAmpereHoursReactive),
1313            245 => Ok(Self::VoltSquareHours),
1314            246 => Ok(Self::AmpereSquareHours),
1315            247 => Ok(Self::JoulePerHours),
1316            248 => Ok(Self::CubicFeetPerDay),
1317            249 => Ok(Self::CubicMetersPerDay),
1318            250 => Ok(Self::WattHoursPerCubicMeter),
1319            251 => Ok(Self::JoulesPerCubicMeter),
1320            252 => Ok(Self::MolePercent),
1321            253 => Ok(Self::PascalSeconds),
1322            254 => Ok(Self::MillionStandardCubicFeetPerMinute),
1323            255 => Ok(Self::ReservedRangeMax),
1324            256 => Ok(Self::ProprietaryRangeMin),
1325            47807 => Ok(Self::ProprietaryRangeMax),
1326            47808 => Ok(Self::StandardCubicFeetPerDay),
1327            47809 => Ok(Self::MillionStandardCubicFeetPerDay),
1328            47810 => Ok(Self::ThousandCubicFeetPerDay),
1329            47811 => Ok(Self::ThousandStandardCubicFeetPerDay),
1330            47812 => Ok(Self::PoundsMassPerDay),
1331            47814 => Ok(Self::Millirems),
1332            47815 => Ok(Self::MilliremsPerHour),
1333            49999 => Ok(Self::ReservedRangeMax2),
1334            50000 => Ok(Self::ProprietaryRangeMin2),
1335            65535 => Ok(Self::ProprietaryRangeMax2),
1336            _ => Err(value),
1337        }
1338    }
1339}
1340
1341#[repr(u8)]
1342pub enum LogBufferResultFlags {
1343    FirstItem = 0b1000_0000,
1344    LastItem = 0b0100_0000,
1345    MoreItems = 0b0010_0000,
1346}
1347
1348#[repr(u8)]
1349pub enum StatusFlags {
1350    InAlarm = 0b1000_0000,
1351    Fault = 0b0100_0000,
1352    Overridden = 0b0010_0000,
1353    OutOfService = 0b0001_0000,
1354}
1355
1356#[derive(Debug, Clone, Default)]
1357#[cfg_attr(feature = "defmt", derive(defmt::Format))]
1358#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1359pub struct Status {
1360    pub inner: u8,
1361}
1362
1363impl Status {
1364    pub fn new(inner: u8) -> Self {
1365        Self { inner }
1366    }
1367
1368    pub const fn in_alarm(&self) -> bool {
1369        self.inner & StatusFlags::InAlarm as u8 == StatusFlags::InAlarm as u8
1370    }
1371
1372    pub const fn fault(&self) -> bool {
1373        self.inner & StatusFlags::Fault as u8 == StatusFlags::Fault as u8
1374    }
1375
1376    pub const fn overridden(&self) -> bool {
1377        self.inner & StatusFlags::Overridden as u8 == StatusFlags::Overridden as u8
1378    }
1379
1380    pub const fn out_of_service(&self) -> bool {
1381        self.inner & StatusFlags::OutOfService as u8 == StatusFlags::OutOfService as u8
1382    }
1383}
1384
1385#[derive(Debug, Clone, Default)]
1386#[cfg_attr(feature = "defmt", derive(defmt::Format))]
1387#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1388pub struct LogBufferResult {
1389    pub inner: u8,
1390}
1391
1392impl LogBufferResult {
1393    pub fn new(inner: u8) -> Self {
1394        Self { inner }
1395    }
1396
1397    pub const fn first_item(&self) -> bool {
1398        self.inner & LogBufferResultFlags::FirstItem as u8 == LogBufferResultFlags::FirstItem as u8
1399    }
1400
1401    pub const fn last_item(&self) -> bool {
1402        self.inner & LogBufferResultFlags::LastItem as u8 == LogBufferResultFlags::LastItem as u8
1403    }
1404
1405    pub const fn more_items(&self) -> bool {
1406        self.inner & LogBufferResultFlags::MoreItems as u8 == LogBufferResultFlags::MoreItems as u8
1407    }
1408}
1409
1410#[derive(Debug, Clone)]
1411#[cfg_attr(feature = "defmt", derive(defmt::Format))]
1412#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1413pub enum LogStatus {
1414    LogDisabled = 0,
1415    BufferPurged = 1,
1416    LogInterrupted = 2,
1417}
1418
1419#[derive(Debug, Clone)]
1420#[cfg_attr(feature = "defmt", derive(defmt::Format))]
1421#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1422pub enum AcknowledgmentFilter {
1423    All = 0,
1424    Acked = 1,
1425    NotAcked = 2,
1426}
1427
1428#[derive(Debug, Clone)]
1429#[cfg_attr(feature = "defmt", derive(defmt::Format))]
1430#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1431#[repr(u32)]
1432pub enum EventState {
1433    Normal = 0,
1434    Fault = 1,
1435    OffNormal = 2,
1436    HighLimit = 3,
1437    LowLimit = 4,
1438}
1439
1440impl TryFrom<u32> for EventState {
1441    type Error = u32;
1442
1443    fn try_from(value: u32) -> Result<Self, Self::Error> {
1444        match value {
1445            0 => Ok(Self::Normal),
1446            1 => Ok(Self::Fault),
1447            2 => Ok(Self::OffNormal),
1448            3 => Ok(Self::HighLimit),
1449            4 => Ok(Self::LowLimit),
1450            x => Err(x),
1451        }
1452    }
1453}
1454
1455#[derive(Debug, Clone)]
1456#[cfg_attr(feature = "defmt", derive(defmt::Format))]
1457#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1458#[repr(u32)]
1459pub enum NotifyType {
1460    Alarm = 0,
1461    Event = 1,
1462    AckNotification = 2,
1463}
1464
1465impl TryFrom<u32> for NotifyType {
1466    type Error = u32;
1467
1468    fn try_from(value: u32) -> Result<Self, Self::Error> {
1469        match value {
1470            0 => Ok(Self::Alarm),
1471            1 => Ok(Self::Event),
1472            2 => Ok(Self::AckNotification),
1473            x => Err(x),
1474        }
1475    }
1476}
1477
1478#[derive(Debug, Clone)]
1479#[cfg_attr(feature = "defmt", derive(defmt::Format))]
1480#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1481#[repr(u32)]
1482pub enum LoggingType {
1483    Polled = 0,
1484    Cov = 1,
1485    Triggered = 2,
1486}
1487
1488impl TryFrom<u32> for LoggingType {
1489    type Error = u32;
1490
1491    fn try_from(value: u32) -> Result<Self, Self::Error> {
1492        match value {
1493            0 => Ok(Self::Polled),
1494            1 => Ok(Self::Cov),
1495            2 => Ok(Self::Triggered),
1496            x => Err(x),
1497        }
1498    }
1499}
1500
1501#[derive(Debug, Clone)]
1502#[cfg_attr(feature = "defmt", derive(defmt::Format))]
1503#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1504pub enum SelectionLogic {
1505    And = 0,
1506    Or = 1,
1507    All = 2,
1508}
1509
1510#[derive(Debug, Clone)]
1511#[cfg_attr(feature = "defmt", derive(defmt::Format))]
1512#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1513pub enum RelationSpecifier {
1514    Equal = 0,
1515    NotEqual = 1,
1516    LessThan = 2,
1517    GreaterThan = 3,
1518    LessThanOrEqual = 4,
1519    GreaterThanOrEqual = 5,
1520}
1521
1522#[derive(Debug, Clone)]
1523#[cfg_attr(feature = "defmt", derive(defmt::Format))]
1524#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1525pub enum CommunicationEnableDisable {
1526    Enable = 0,
1527    Disable = 1,
1528    DisableInitiation = 2,
1529}
1530
1531#[derive(Debug, Clone)]
1532#[cfg_attr(feature = "defmt", derive(defmt::Format))]
1533#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
1534pub enum MessagePriority {
1535    Normal = 0,
1536    Urgent = 1,
1537    CriticalEquipment = 2,
1538    LifeSafety = 3,
1539}
1540
1541// end of bit string enumerations