bacnet_types/constructed/access.rs
1//! Constructed values served by the Access Rights object (Clause 12.34), the
2//! Access Credential object (Clause 12.35) and the Credential Data Input
3//! object (Clause 12.36).
4
5#[cfg(not(feature = "std"))]
6use alloc::vec::Vec;
7
8use super::{BACnetDeviceObjectPropertyReference, BACnetDeviceObjectReference};
9use crate::enums::{
10 AccessAuthenticationFactorDisable, AccessRuleLocationSpecifier, AccessRuleTimeRangeSpecifier,
11 AuthenticationFactorType,
12};
13
14/// One element of an Access Rights object's Positive_Access_Rules or
15/// Negative_Access_Rules array (`BACnetAccessRule`, Clause 21; Clause
16/// 12.34.9.1).
17///
18/// The fields mirror the five wire members in order: the time-range
19/// specifier as a context `[0]` ENUMERATED, the time-range reference framed
20/// in context tag `[1]`, the location specifier as a context `[2]`
21/// ENUMERATED, the location reference framed in context tag `[3]` and the
22/// enable flag as a context `[4]` BOOLEAN. Both references are optional on
23/// the wire. The codec is `bacnet_encoding::constructed::{encode_access_rule,
24/// decode_access_rule}`; it keeps whatever specifier values it reads, and the
25/// Access Rights setters refuse the combinations Clause 12.34.9.1 rules out.
26#[derive(Debug, Clone, PartialEq, Eq)]
27pub struct BACnetAccessRule {
28 /// SPECIFIED when `time_range` decides when the rule applies, ALWAYS
29 /// when it applies at any time.
30 pub time_range_specifier: AccessRuleTimeRangeSpecifier,
31 /// The property, typically a Schedule's Present_Value, whose value says
32 /// whether the rule applies now. Needed with SPECIFIED; with ALWAYS it is
33 /// left out or unspecified (instance 4194303).
34 pub time_range: Option<BACnetDeviceObjectPropertyReference>,
35 /// SPECIFIED when `location` names the place the rule covers, ALL when
36 /// it covers every access point.
37 pub location_specifier: AccessRuleLocationSpecifier,
38 /// Where the rule holds: an Access Point or an Access Zone. Needed with
39 /// SPECIFIED; with ALL it is left out or unspecified.
40 pub location: Option<BACnetDeviceObjectReference>,
41 /// Whether the rule is in force.
42 pub enable: bool,
43}
44
45impl BACnetAccessRule {
46 /// A rule whose specifiers follow the references: SPECIFIED for each
47 /// one given, ALWAYS for a missing time range and ALL for a missing
48 /// location.
49 pub fn new(
50 time_range: Option<BACnetDeviceObjectPropertyReference>,
51 location: Option<BACnetDeviceObjectReference>,
52 enable: bool,
53 ) -> Self {
54 Self {
55 time_range_specifier: if time_range.is_some() {
56 AccessRuleTimeRangeSpecifier::SPECIFIED
57 } else {
58 AccessRuleTimeRangeSpecifier::ALWAYS
59 },
60 time_range,
61 location_specifier: if location.is_some() {
62 AccessRuleLocationSpecifier::SPECIFIED
63 } else {
64 AccessRuleLocationSpecifier::ALL
65 },
66 location,
67 enable,
68 }
69 }
70}
71
72/// One element of an Access Credential's Assigned_Access_Rights array
73/// (`BACnetAssignedAccessRights`, Clause 21).
74///
75/// On the wire the reference is framed in context tag `[0]` and the enable
76/// flag follows as a context `[1]` BOOLEAN; the codec is
77/// `bacnet_encoding::constructed::{encode_assigned_access_rights,
78/// decode_assigned_access_rights}`.
79#[derive(Debug, Clone, PartialEq, Eq)]
80pub struct BACnetAssignedAccessRights {
81 /// The Access Rights object granting these rights. Clause 12.35.18 marks
82 /// an unused element with instance 4194303.
83 pub assigned_access_rights: BACnetDeviceObjectReference,
84 /// Whether the credential currently holds these rights.
85 pub enable: bool,
86}
87
88/// An authentication factor value and its format (`BACnetAuthenticationFactor`,
89/// Clause 21).
90///
91/// The three members go out as context tags `[0]` (the format type, an
92/// ENUMERATED), `[1]` (the format class, an Unsigned) and `[2]` (the value
93/// bytes, laid out as Annex P describes for the format).
94#[derive(Debug, Clone, PartialEq, Eq)]
95pub struct BACnetAuthenticationFactor {
96 /// The format of `value`.
97 pub format_type: AuthenticationFactorType,
98 /// The format class (Annex P).
99 pub format_class: u32,
100 /// The encoded factor, such as a card number.
101 pub value: Vec<u8>,
102}
103
104/// One element of a Credential Data Input's Supported_Formats array
105/// (`BACnetAuthenticationFactorFormat`, Clause 21; Clause 12.36.9).
106///
107/// The format type goes out as a context `[0]` ENUMERATED, and the two
108/// vendor members, when present, as context `[1]` and `[2]` Unsigned16
109/// values. A CUSTOM format names its vendor and that vendor's format number
110/// in them; any other format leaves them out or sets them to zero.
111#[derive(Debug, Clone, Copy, PartialEq, Eq)]
112pub struct BACnetAuthenticationFactorFormat {
113 /// The format read.
114 pub format_type: AuthenticationFactorType,
115 /// For a CUSTOM format, the Vendor_Identifier of the company whose
116 /// format it is.
117 pub vendor_id: Option<u16>,
118 /// That vendor's number for the CUSTOM format.
119 pub vendor_format: Option<u16>,
120}
121
122impl BACnetAuthenticationFactorFormat {
123 /// A standard format, with neither vendor member.
124 pub const fn standard(format_type: AuthenticationFactorType) -> Self {
125 Self {
126 format_type,
127 vendor_id: None,
128 vendor_format: None,
129 }
130 }
131
132 /// A CUSTOM format defined by vendor `vendor_id` as its format
133 /// `vendor_format`.
134 pub const fn custom(vendor_id: u16, vendor_format: u16) -> Self {
135 Self {
136 format_type: AuthenticationFactorType::CUSTOM,
137 vendor_id: Some(vendor_id),
138 vendor_format: Some(vendor_format),
139 }
140 }
141}
142
143/// One element of an Access Credential's Authentication_Factors array
144/// (`BACnetCredentialAuthenticationFactor`, Clause 21).
145///
146/// The disable value goes out as a context `[0]` ENUMERATED; the factor
147/// follows framed in context tag `[1]`.
148#[derive(Debug, Clone, PartialEq, Eq)]
149pub struct BACnetCredentialAuthenticationFactor {
150 /// `NONE` when the factor may be used; any other value says why it
151 /// can't (Clause 12.35.10).
152 pub disable: AccessAuthenticationFactorDisable,
153 /// The factor itself.
154 pub authentication_factor: BACnetAuthenticationFactor,
155}