Esempio n. 1
0
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;
}
Esempio n. 2
0
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;
}
Esempio n. 3
0
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;
}
Esempio n. 4
0
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;
}