int bacapp_encode_access_rule( uint8_t * apdu, BACNET_ACCESS_RULE * rule) { int len; int apdu_len = 0; len = encode_context_enumerated(&apdu[0], 0, rule->time_range_specifier); apdu_len += len; if (rule->time_range_specifier == TIME_RANGE_SPECIFIER_SPECIFIED) { len = bacapp_encode_context_device_obj_property_ref(&apdu[apdu_len], 1, &rule->time_range); if (len > 0) apdu_len += len; else return -1; } len = encode_context_enumerated(&apdu[apdu_len], 2, rule->location_specifier); apdu_len += len; if (rule->location_specifier == LOCATION_SPECIFIER_SPECIFIED) { len = bacapp_encode_context_device_obj_property_ref(&apdu[apdu_len], 3, &rule->location); if (len > 0) apdu_len += len; else return -1; } len = encode_context_boolean(&apdu[apdu_len], 4, rule->enable); apdu_len += len; return apdu_len; }
int bacapp_encode_assigned_access_rights( uint8_t * apdu, BACNET_ASSIGNED_ACCESS_RIGHTS * aar) { int len; int apdu_len = 0; len = bacapp_encode_context_device_obj_ref(&apdu[apdu_len], 0, &aar->assigned_access_rights); if (len < 0) return -1; else apdu_len += len; len = encode_context_boolean(&apdu[apdu_len], 1, aar->enable); if (len < 0) return -1; else apdu_len += len; return apdu_len; }
int bacapp_encode_property_state( uint8_t * apdu, BACNET_PROPERTY_STATE * value) { int len = 0; /* length of each encoding */ if (value && apdu) { switch (value->tag) { case BOOLEAN_VALUE: len = encode_context_boolean(&apdu[0], 0, value->state.booleanValue); break; case BINARY_VALUE: len = encode_context_enumerated(&apdu[0], 1, value->state.binaryValue); break; case EVENT_TYPE: len = encode_context_enumerated(&apdu[0], 2, value->state.eventType); break; case POLARITY: len = encode_context_enumerated(&apdu[0], 3, value->state.polarity); break; case PROGRAM_CHANGE: len = encode_context_enumerated(&apdu[0], 4, value->state.programChange); break; case PROGRAM_STATE: len = encode_context_enumerated(&apdu[0], 5, value->state.programState); break; case REASON_FOR_HALT: len = encode_context_enumerated(&apdu[0], 6, value->state.programError); break; case RELIABILITY: len = encode_context_enumerated(&apdu[0], 7, value->state.reliability); break; case STATE: len = encode_context_enumerated(&apdu[0], 8, value->state.state); break; case SYSTEM_STATUS: len = encode_context_enumerated(&apdu[0], 9, value->state.systemStatus); break; case UNITS: len = encode_context_enumerated(&apdu[0], 10, value->state.units); break; case UNSIGNED_VALUE: len = encode_context_unsigned(&apdu[0], 11, value->state.unsignedValue); break; case LIFE_SAFETY_MODE: len = encode_context_enumerated(&apdu[0], 12, value->state.lifeSafetyMode); break; case LIFE_SAFETY_STATE: len = encode_context_enumerated(&apdu[0], 13, value->state.lifeSafetyState); break; default: assert(0); break; } } return len; }
static int cov_encode_subscription( uint8_t * apdu, int max_apdu, BACNET_COV_SUBSCRIPTION * cov_subscription) { int len = 0; int apdu_len = 0; BACNET_OCTET_STRING octet_string; /* FIXME: unused parameter */ max_apdu = max_apdu; /* Recipient [0] BACnetRecipientProcess - opening */ len = encode_opening_tag(&apdu[apdu_len], 0); apdu_len += len; /* recipient [0] BACnetRecipient - opening */ len = encode_opening_tag(&apdu[apdu_len], 0); apdu_len += len; /* CHOICE - address [1] BACnetAddress - opening */ len = encode_opening_tag(&apdu[apdu_len], 1); apdu_len += len; /* network-number Unsigned16, */ /* -- A value of 0 indicates the local network */ len = encode_application_unsigned(&apdu[apdu_len], cov_subscription->dest.net); apdu_len += len; /* mac-address OCTET STRING */ /* -- A string of length 0 indicates a broadcast */ if (cov_subscription->dest.net) { octetstring_init(&octet_string, &cov_subscription->dest.adr[0], cov_subscription->dest.len); } else { octetstring_init(&octet_string, &cov_subscription->dest.mac[0], cov_subscription->dest.mac_len); } len = encode_application_octet_string(&apdu[apdu_len], &octet_string); apdu_len += len; /* CHOICE - address [1] BACnetAddress - closing */ len = encode_closing_tag(&apdu[apdu_len], 1); apdu_len += len; /* recipient [0] BACnetRecipient - closing */ len = encode_closing_tag(&apdu[apdu_len], 0); apdu_len += len; /* processIdentifier [1] Unsigned32 */ len = encode_context_unsigned(&apdu[apdu_len], 1, cov_subscription->subscriberProcessIdentifier); apdu_len += len; /* Recipient [0] BACnetRecipientProcess - closing */ len = encode_closing_tag(&apdu[apdu_len], 0); apdu_len += len; /* MonitoredPropertyReference [1] BACnetObjectPropertyReference, */ len = encode_opening_tag(&apdu[apdu_len], 1); apdu_len += len; /* objectIdentifier [0] */ len = encode_context_object_id(&apdu[apdu_len], 0, cov_subscription->monitoredObjectIdentifier.type, cov_subscription->monitoredObjectIdentifier.instance); apdu_len += len; /* propertyIdentifier [1] */ /* FIXME: we are monitoring 2 properties! How to encode? */ len = encode_context_enumerated(&apdu[apdu_len], 1, PROP_PRESENT_VALUE); apdu_len += len; /* MonitoredPropertyReference [1] - closing */ len = encode_closing_tag(&apdu[apdu_len], 1); apdu_len += len; /* IssueConfirmedNotifications [2] BOOLEAN, */ len = encode_context_boolean(&apdu[apdu_len], 2, cov_subscription->flag.issueConfirmedNotifications); apdu_len += len; /* TimeRemaining [3] Unsigned, */ len = encode_context_unsigned(&apdu[apdu_len], 3, cov_subscription->lifetime); apdu_len += len; return apdu_len; }