Exemplo n.º 1
0
/***************************************************
**
** Decodes the service data part of Event Notification
**
****************************************************/
int alarm_ack_decode_service_request(
    uint8_t * apdu,
    unsigned apdu_len,
    BACNET_ALARM_ACK_DATA * data)
{
    int len = 0;
    int section_len;
    uint32_t enumValue;

    /* unused parameter */
    unused_var(apdu_len);

    if (-1 == (section_len =
                   decode_context_unsigned(&apdu[len], 0,
                                           &data->ackProcessIdentifier))) {
        return -1;
    }
    len += section_len;

    if (-1 == (section_len =
                   decode_context_object_id(&apdu[len], 1,
                                            &data->eventObjectIdentifier.type,
                                            &data->eventObjectIdentifier.instance))) {
        return -1;
    }
    len += section_len;

    if (-1 == (section_len =
                   decode_context_enumerated(&apdu[len], 2, &enumValue))) {
        return -1;
    }
    data->eventStateAcked = (BACNET_EVENT_STATE) enumValue;
    len += section_len;

    if (-1 == (section_len =
                   bacapp_decode_context_timestamp(&apdu[len], 3,
                           &data->eventTimeStamp))) {
        return -1;
    }
    len += section_len;

    if (-1 == (section_len =
                   decode_context_character_string(&apdu[len], 4,
                           &data->ackSource))) {
        return -1;
    }
    len += section_len;

    if (-1 == (section_len =
                   bacapp_decode_context_timestamp(&apdu[len], 5,
                           &data->ackTimeStamp))) {
        return -1;
    }
    len += section_len;

    return len;
}
int lso_decode_service_request(
    uint8_t * apdu,
    unsigned apdu_len,
    BACNET_LSO_DATA * data)
{
    int len = 0;        /* return value */
    int section_length = 0;     /* length returned from decoding */
    uint32_t operation = 0;     /* handles decoded value */

    /* check for value pointers */
    if (apdu_len && data) {
        /* Tag 0: Object ID          */

        if ((section_length =
                decode_context_unsigned(&apdu[len], 0,
                    &data->processId)) == -1) {
            return -1;
        }
        len += section_length;

        if ((section_length =
                decode_context_character_string(&apdu[len], 1,
                    &data->requestingSrc)) == -1) {
            return -1;
        }
        len += section_length;

        if ((section_length =
                decode_context_enumerated(&apdu[len], 2, &operation)) == -1) {
            return -1;
        }
        data->operation = (BACNET_LIFE_SAFETY_OPERATION) operation;
        len += section_length;

        /*
         ** This is an optional parameter, so dont fail if it doesnt exist
         */
        if (decode_is_context_tag(&apdu[len], 3)) {
            if ((section_length =
                    decode_context_object_id(&apdu[len], 3,
                        &data->targetObject.type,
                        &data->targetObject.instance)) == -1) {
                return -1;
            }
            len += section_length;
        } else {
            data->targetObject.type = 0;
            data->targetObject.instance = 0;
        }
        return len;

    }

    return 0;
}
Exemplo n.º 3
0
/* BACnetDeviceObjectPropertyReference ::= SEQUENCE {
    object-identifier       [0] BACnetObjectIdentifier,
    property-identifier     [1] BACnetPropertyIdentifier,
    property-array-index    [2] Unsigned OPTIONAL,
        -- used only with array datatype
        -- if omitted with an array then
        -- the entire array is referenced
    device-identifier       [3] BACnetObjectIdentifier OPTIONAL
}
*/
int bacapp_decode_device_obj_property_ref(
    uint8_t * apdu,
    BACNET_DEVICE_OBJECT_PROPERTY_REFERENCE * value)
{
    int len;
    int apdu_len = 0;
    uint32_t enumValue;

    /* object-identifier       [0] BACnetObjectIdentifier */
    if (-1 == (len =
            decode_context_object_id(&apdu[apdu_len], 0,
                &value->objectIdentifier.type,
                &value->objectIdentifier.instance))) {
        return -1;
    }
    apdu_len += len;
    /* property-identifier     [1] BACnetPropertyIdentifier */
    if (-1 == (len =
            decode_context_enumerated(&apdu[apdu_len], 1, &enumValue))) {
        return -1;
    }
    value->propertyIdentifier = (BACNET_PROPERTY_ID) enumValue;
    apdu_len += len;
    /* property-array-index    [2] Unsigned OPTIONAL */
    if (decode_is_context_tag(&apdu[apdu_len], 2) &&
        !decode_is_closing_tag(&apdu[apdu_len])) {
        if (-1 == (len =
                decode_context_unsigned(&apdu[apdu_len], 2,
                    &value->arrayIndex))) {
            return -1;
        }
        apdu_len += len;
    } else {
        value->arrayIndex = BACNET_ARRAY_ALL;
    }
    /* device-identifier       [3] BACnetObjectIdentifier OPTIONAL */
    if (decode_is_context_tag(&apdu[apdu_len], 3) &&
        !decode_is_closing_tag(&apdu[apdu_len])) {
        if (-1 == (len =
                decode_context_object_id(&apdu[apdu_len], 3,
                    &value->deviceIndentifier.type,
                    &value->deviceIndentifier.instance))) {
            return -1;
        }
        apdu_len += len;
    } else {
    	value->deviceIndentifier.type = BACNET_NO_DEV_TYPE;
    	value->deviceIndentifier.instance = BACNET_NO_DEV_ID;
    }

    return apdu_len;
}
Exemplo n.º 4
0
int bacapp_decode_device_obj_property_ref(
    uint8_t * apdu,
    BACNET_DEVICE_OBJECT_PROPERTY_REFERENCE * value)
{
    int len;
    int apdu_len = 0;
    uint32_t enumValue;
    if (-1 == (len =
            decode_context_object_id(&apdu[apdu_len], 0,
                &value->objectIdentifier.type,
                &value->objectIdentifier.instance))) {
        return -1;
    }
    apdu_len += len;

    if (-1 == (len =
            decode_context_enumerated(&apdu[apdu_len], 1, &enumValue))) {
        return -1;
    }
    value->propertyIdentifier = (BACNET_PROPERTY_ID) enumValue;
    apdu_len += len;

    if (decode_is_context_tag(&apdu[apdu_len], 2)) {
        if (-1 == (len =
                decode_context_unsigned(&apdu[apdu_len], 2,
                    &value->arrayIndex))) {
            return -1;
        }
        apdu_len += len;
    } else {
        value->arrayIndex = BACNET_ARRAY_ALL;
    }

    if (decode_is_context_tag(&apdu[apdu_len], 3)) {
        if (-1 == (len =
                decode_context_object_id(&apdu[apdu_len], 3,
                    &value->deviceIndentifier.type,
                    &value->deviceIndentifier.instance))) {
            return -1;
        }
        apdu_len += len;
    } else {
    	value->deviceIndentifier.type = BACNET_NO_DEV_TYPE;
    	value->deviceIndentifier.instance = BACNET_NO_DEV_ID;
    }

    return apdu_len;
}
Exemplo n.º 5
0
int bacapp_decode_access_rule(
    uint8_t * apdu,
    BACNET_ACCESS_RULE * rule)
{
    int len;
    int apdu_len = 0;

    if (decode_is_context_tag(&apdu[apdu_len], 0)) {
        len =
            decode_context_enumerated(&apdu[apdu_len], 0,
            &rule->time_range_specifier);
        if (len < 0)
            return -1;
        else
            apdu_len += len;
    } else
        return -1;

    if (rule->time_range_specifier == TIME_RANGE_SPECIFIER_SPECIFIED) {
        if (decode_is_context_tag(&apdu[apdu_len], 1)) {
            len =
                bacapp_decode_context_device_obj_property_ref(&apdu[apdu_len],
                1, &rule->time_range);
            if (len < 0)
                return -1;
            else
                apdu_len += len;
        } else
            return -1;
    }

    if (decode_is_context_tag(&apdu[apdu_len], 2)) {
        len =
            decode_context_enumerated(&apdu[apdu_len], 2,
            &rule->location_specifier);
        if (len < 0)
            return -1;
        else
            apdu_len += len;
    } else
        return -1;

    if (rule->location_specifier == LOCATION_SPECIFIER_SPECIFIED) {
        if (decode_is_context_tag(&apdu[apdu_len], 3)) {
            len =
                bacapp_decode_context_device_obj_property_ref(&apdu[apdu_len],
                3, &rule->location);
            if (len < 0)
                return -1;
            else
                apdu_len += len;
        } else
            return -1;
    }

    if (decode_is_context_tag(&apdu[apdu_len], 4)) {
        len = decode_context_boolean2(&apdu[apdu_len], 4, &rule->enable);
        if (len < 0)
            return -1;
        else
            apdu_len += len;
    } else
        return -1;

    return apdu_len;
}