use super::{AccessDoorObject, AccessPointObject, AccessZoneObject};
use std::borrow::Cow;
use bacnet_types::enums::PropertyIdentifier as P;
use crate::event::options::REPORTING_OPTION_METADATA;
use crate::property_metadata::{
PropertyConformance::{Optional, RequiredRead, RequiredWrite},
PropertyMetadata,
PropertyPresenceCondition::{IntrinsicReportingOptional, IntrinsicReportingRequired},
PropertyWriteCapability::{Always, ReadOnly, WhenOutOfService},
};
const ACCESS_DOOR_BASE: &[PropertyMetadata] = &[
PropertyMetadata::new(P::OBJECT_IDENTIFIER, RequiredRead, None, ReadOnly),
PropertyMetadata::new(P::OBJECT_NAME, RequiredRead, None, ReadOnly),
PropertyMetadata::new(P::DESCRIPTION, Optional, None, Always),
PropertyMetadata::new(P::OBJECT_TYPE, RequiredRead, None, ReadOnly),
PropertyMetadata::new(P::PRESENT_VALUE, RequiredWrite, None, Always),
PropertyMetadata::new(P::DOOR_STATUS, Optional, None, WhenOutOfService),
PropertyMetadata::new(P::LOCK_STATUS, Optional, None, WhenOutOfService),
PropertyMetadata::new(P::SECURED_STATUS, Optional, None, ReadOnly),
PropertyMetadata::new(
P::DOOR_ALARM_STATE,
Optional,
Some(IntrinsicReportingRequired),
WhenOutOfService,
),
PropertyMetadata::new(P::DOOR_MEMBERS, Optional, None, ReadOnly),
PropertyMetadata::new(P::STATUS_FLAGS, RequiredRead, None, ReadOnly),
PropertyMetadata::new(P::OUT_OF_SERVICE, RequiredRead, None, Always),
PropertyMetadata::new(P::RELIABILITY, RequiredRead, None, WhenOutOfService),
PropertyMetadata::new(P::EVENT_STATE, RequiredRead, None, ReadOnly),
PropertyMetadata::new(P::PRIORITY_ARRAY, RequiredRead, None, ReadOnly),
PropertyMetadata::new(P::RELINQUISH_DEFAULT, RequiredRead, None, Always),
PropertyMetadata::new(P::DOOR_PULSE_TIME, RequiredRead, None, Always),
PropertyMetadata::new(P::DOOR_EXTENDED_PULSE_TIME, RequiredRead, None, Always),
PropertyMetadata::new(P::DOOR_OPEN_TOO_LONG_TIME, RequiredRead, None, Always),
PropertyMetadata::new(P::CURRENT_COMMAND_PRIORITY, RequiredRead, None, ReadOnly),
PropertyMetadata::new(P::MASKED_ALARM_VALUES, Optional, None, Always),
PropertyMetadata::new(
P::TIME_DELAY,
Optional,
Some(IntrinsicReportingRequired),
Always,
),
PropertyMetadata::new(
P::NOTIFICATION_CLASS,
Optional,
Some(IntrinsicReportingRequired),
Always,
),
PropertyMetadata::new(
P::ALARM_VALUES,
Optional,
Some(IntrinsicReportingRequired),
Always,
),
PropertyMetadata::new(P::FAULT_VALUES, Optional, None, Always),
PropertyMetadata::new(
P::EVENT_ENABLE,
Optional,
Some(IntrinsicReportingRequired),
Always,
),
PropertyMetadata::new(
P::ACKED_TRANSITIONS,
Optional,
Some(IntrinsicReportingRequired),
ReadOnly,
),
PropertyMetadata::new(
P::NOTIFY_TYPE,
Optional,
Some(IntrinsicReportingRequired),
Always,
),
PropertyMetadata::new(
P::EVENT_TIME_STAMPS,
Optional,
Some(IntrinsicReportingRequired),
ReadOnly,
),
PropertyMetadata::new(
P::EVENT_MESSAGE_TEXTS,
Optional,
Some(IntrinsicReportingOptional),
ReadOnly,
),
REPORTING_OPTION_METADATA[0],
REPORTING_OPTION_METADATA[1],
REPORTING_OPTION_METADATA[2],
PropertyMetadata::new(
P::EVENT_DETECTION_ENABLE,
Optional,
Some(IntrinsicReportingRequired),
Always,
),
PropertyMetadata::new(
P::TIME_DELAY_NORMAL,
Optional,
Some(IntrinsicReportingOptional),
Always,
),
PropertyMetadata::new(P::PROPERTY_LIST, RequiredRead, None, ReadOnly),
];
const ACCESS_POINT_BASE: &[PropertyMetadata] = &[
PropertyMetadata::new(P::OBJECT_IDENTIFIER, RequiredRead, None, ReadOnly),
PropertyMetadata::new(P::OBJECT_NAME, RequiredRead, None, ReadOnly),
PropertyMetadata::new(P::DESCRIPTION, Optional, None, Always),
PropertyMetadata::new(P::OBJECT_TYPE, RequiredRead, None, ReadOnly),
PropertyMetadata::new(P::ACCESS_EVENT, RequiredRead, None, ReadOnly),
PropertyMetadata::new(P::ACCESS_EVENT_TAG, RequiredRead, None, ReadOnly),
PropertyMetadata::new(P::ACCESS_EVENT_TIME, RequiredRead, None, ReadOnly),
PropertyMetadata::new(P::ACCESS_DOORS, RequiredRead, None, ReadOnly),
PropertyMetadata::new(P::EVENT_STATE, RequiredRead, None, ReadOnly),
PropertyMetadata::new(P::STATUS_FLAGS, RequiredRead, None, ReadOnly),
PropertyMetadata::new(P::OUT_OF_SERVICE, RequiredRead, None, Always),
PropertyMetadata::new(P::RELIABILITY, RequiredRead, None, WhenOutOfService),
PropertyMetadata::new(P::AUTHENTICATION_STATUS, RequiredRead, None, ReadOnly),
PropertyMetadata::new(P::ACCESS_EVENT_CREDENTIAL, RequiredRead, None, ReadOnly),
PropertyMetadata::new(P::ACTIVE_AUTHENTICATION_POLICY, RequiredRead, None, Always),
PropertyMetadata::new(
P::NUMBER_OF_AUTHENTICATION_POLICIES,
RequiredRead,
None,
ReadOnly,
),
PropertyMetadata::new(P::AUTHORIZATION_MODE, RequiredRead, None, Always),
PropertyMetadata::new(P::PRIORITY_FOR_WRITING, RequiredRead, None, ReadOnly),
PropertyMetadata::new(
P::ACCESS_EVENT_AUTHENTICATION_FACTOR,
Optional,
None,
ReadOnly,
),
PropertyMetadata::new(P::PROPERTY_LIST, RequiredRead, None, ReadOnly),
];
const ACCESS_ZONE_BASE: &[PropertyMetadata] = &[
PropertyMetadata::new(P::OBJECT_IDENTIFIER, RequiredRead, None, ReadOnly),
PropertyMetadata::new(P::OBJECT_NAME, RequiredRead, None, ReadOnly),
PropertyMetadata::new(P::DESCRIPTION, Optional, None, Always),
PropertyMetadata::new(P::OBJECT_TYPE, RequiredRead, None, ReadOnly),
PropertyMetadata::new(P::GLOBAL_IDENTIFIER, RequiredWrite, None, Always),
PropertyMetadata::new(
P::OCCUPANCY_COUNT,
Optional,
Some(IntrinsicReportingRequired),
WhenOutOfService,
),
PropertyMetadata::new(P::ENTRY_POINTS, RequiredRead, None, ReadOnly),
PropertyMetadata::new(P::EXIT_POINTS, RequiredRead, None, ReadOnly),
PropertyMetadata::new(P::STATUS_FLAGS, RequiredRead, None, ReadOnly),
PropertyMetadata::new(P::OUT_OF_SERVICE, RequiredRead, None, Always),
PropertyMetadata::new(P::RELIABILITY, RequiredRead, None, WhenOutOfService),
PropertyMetadata::new(P::OCCUPANCY_STATE, RequiredRead, None, ReadOnly),
PropertyMetadata::new(P::EVENT_STATE, RequiredRead, None, ReadOnly),
PropertyMetadata::new(
P::OCCUPANCY_COUNT_ENABLE,
Optional,
Some(IntrinsicReportingRequired),
ReadOnly,
),
PropertyMetadata::new(
P::ADJUST_VALUE,
Optional,
Some(IntrinsicReportingRequired),
Always,
),
PropertyMetadata::new(P::OCCUPANCY_UPPER_LIMIT, Optional, None, ReadOnly),
PropertyMetadata::new(P::OCCUPANCY_LOWER_LIMIT, Optional, None, ReadOnly),
PropertyMetadata::new(
P::TIME_DELAY,
Optional,
Some(IntrinsicReportingRequired),
Always,
),
PropertyMetadata::new(
P::NOTIFICATION_CLASS,
Optional,
Some(IntrinsicReportingRequired),
Always,
),
PropertyMetadata::new(
P::ALARM_VALUES,
Optional,
Some(IntrinsicReportingRequired),
Always,
),
PropertyMetadata::new(
P::EVENT_ENABLE,
Optional,
Some(IntrinsicReportingRequired),
Always,
),
PropertyMetadata::new(
P::ACKED_TRANSITIONS,
Optional,
Some(IntrinsicReportingRequired),
ReadOnly,
),
PropertyMetadata::new(
P::NOTIFY_TYPE,
Optional,
Some(IntrinsicReportingRequired),
Always,
),
PropertyMetadata::new(
P::EVENT_TIME_STAMPS,
Optional,
Some(IntrinsicReportingRequired),
ReadOnly,
),
PropertyMetadata::new(
P::EVENT_MESSAGE_TEXTS,
Optional,
Some(IntrinsicReportingOptional),
ReadOnly,
),
REPORTING_OPTION_METADATA[0],
REPORTING_OPTION_METADATA[1],
REPORTING_OPTION_METADATA[2],
PropertyMetadata::new(
P::EVENT_DETECTION_ENABLE,
Optional,
Some(IntrinsicReportingRequired),
Always,
),
PropertyMetadata::new(
P::TIME_DELAY_NORMAL,
Optional,
Some(IntrinsicReportingOptional),
Always,
),
PropertyMetadata::new(P::PROPERTY_LIST, RequiredRead, None, ReadOnly),
];
pub(super) fn for_access_door_object(_object: &AccessDoorObject) -> Cow<'_, [PropertyMetadata]> {
Cow::Borrowed(ACCESS_DOOR_BASE)
}
pub(super) fn for_access_point_object(object: &AccessPointObject) -> Cow<'_, [PropertyMetadata]> {
if !object.serves_policy_list() {
return Cow::Borrowed(ACCESS_POINT_BASE);
}
let mut rows = ACCESS_POINT_BASE.to_vec();
let before_property_list = rows
.iter()
.position(|row| row.property_identifier == P::PROPERTY_LIST)
.expect("Property_List row");
rows.splice(
before_property_list..before_property_list,
[
PropertyMetadata::new(P::AUTHENTICATION_POLICY_LIST, Optional, None, ReadOnly),
PropertyMetadata::new(P::AUTHENTICATION_POLICY_NAMES, Optional, None, ReadOnly),
],
);
Cow::Owned(rows)
}
pub(super) fn for_access_zone_object(_object: &AccessZoneObject) -> Cow<'_, [PropertyMetadata]> {
Cow::Borrowed(ACCESS_ZONE_BASE)
}
#[cfg(test)]
#[path = "metadata_topology_tests.rs"]
mod tests;