Added code to parse BACnetAccessRule from ASCII command line. (#827)
This commit is contained in:
@@ -7,6 +7,8 @@
|
|||||||
*/
|
*/
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdio.h>
|
||||||
#include "bacnet/access_rule.h"
|
#include "bacnet/access_rule.h"
|
||||||
#include "bacnet/bacdcode.h"
|
#include "bacnet/bacdcode.h"
|
||||||
|
|
||||||
@@ -185,12 +187,66 @@ int bacapp_decode_access_rule(const uint8_t *apdu, BACNET_ACCESS_RULE *data)
|
|||||||
*/
|
*/
|
||||||
bool bacnet_access_rule_from_ascii(BACNET_ACCESS_RULE *value, const char *argv)
|
bool bacnet_access_rule_from_ascii(BACNET_ACCESS_RULE *value, const char *argv)
|
||||||
{
|
{
|
||||||
bool status = false;
|
int count = 0;
|
||||||
|
unsigned long device_instance1 = 0, instance1 = 0, property1 = 0;
|
||||||
|
unsigned long device_instance2 = 0, instance2 = 0;
|
||||||
|
unsigned int object_type1 = 0, object_type2 = 0;
|
||||||
|
|
||||||
(void)value;
|
if (!value || !argv) {
|
||||||
(void)argv;
|
return false;
|
||||||
|
}
|
||||||
|
/* BACnetDeviceObjectPropertyReference or OPTIONAL=ALWAYS */
|
||||||
|
/* BACnetDeviceObjectReference or OPTIONAL=ALL */
|
||||||
|
if (strcmp(argv, "always,all") == 0) {
|
||||||
|
value->time_range_specifier = TIME_RANGE_SPECIFIER_ALWAYS;
|
||||||
|
value->location_specifier = LOCATION_SPECIFIER_ALL;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
count = sscanf(
|
||||||
|
argv, "%7lu:%4u:%7lu:%7lu,%7lu:%4u:%7lu", &device_instance1,
|
||||||
|
&object_type1, &instance1, &property1, &device_instance2, &object_type2,
|
||||||
|
&instance2);
|
||||||
|
if (count == 7) {
|
||||||
|
value->time_range_specifier = TIME_RANGE_SPECIFIER_SPECIFIED;
|
||||||
|
value->time_range.deviceIdentifier.type = OBJECT_DEVICE;
|
||||||
|
value->time_range.deviceIdentifier.instance = device_instance1;
|
||||||
|
value->time_range.objectIdentifier.type = object_type1;
|
||||||
|
value->time_range.objectIdentifier.instance = instance1;
|
||||||
|
value->time_range.propertyIdentifier = property1;
|
||||||
|
value->location_specifier = LOCATION_SPECIFIER_SPECIFIED;
|
||||||
|
value->location.deviceIdentifier.type = OBJECT_DEVICE;
|
||||||
|
value->location.deviceIdentifier.instance = instance1;
|
||||||
|
value->location.objectIdentifier.type = object_type2;
|
||||||
|
value->location.objectIdentifier.instance = instance2;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
count = sscanf(
|
||||||
|
argv, "%7lu:%4u:%7lu:%7lu,all", &device_instance1, &object_type1,
|
||||||
|
&instance1, &property1);
|
||||||
|
if (count == 5) {
|
||||||
|
value->time_range_specifier = TIME_RANGE_SPECIFIER_SPECIFIED;
|
||||||
|
value->time_range.deviceIdentifier.type = OBJECT_DEVICE;
|
||||||
|
value->time_range.deviceIdentifier.instance = device_instance1;
|
||||||
|
value->time_range.objectIdentifier.type = object_type1;
|
||||||
|
value->time_range.objectIdentifier.instance = instance1;
|
||||||
|
value->time_range.propertyIdentifier = property1;
|
||||||
|
value->location_specifier = LOCATION_SPECIFIER_ALL;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
count = sscanf(
|
||||||
|
argv, "always,%7lu:%4u:%7lu", &device_instance2, &object_type2,
|
||||||
|
&instance2);
|
||||||
|
if (count == 3) {
|
||||||
|
value->time_range_specifier = TIME_RANGE_SPECIFIER_ALWAYS;
|
||||||
|
value->location_specifier = LOCATION_SPECIFIER_SPECIFIED;
|
||||||
|
value->location.deviceIdentifier.type = OBJECT_DEVICE;
|
||||||
|
value->location.deviceIdentifier.instance = device_instance2;
|
||||||
|
value->location.objectIdentifier.type = object_type2;
|
||||||
|
value->location.objectIdentifier.instance = instance2;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
return status;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
Reference in New Issue
Block a user