Updated device.c files of ports stm32f10x and at91sam7s to fix some problems and make them more similar.
This commit is contained in:
@@ -93,8 +93,8 @@ static struct my_object_functions {
|
|||||||
The properties that are constant can be hard coded
|
The properties that are constant can be hard coded
|
||||||
into the read-property encoding. */
|
into the read-property encoding. */
|
||||||
static uint32_t Object_Instance_Number;
|
static uint32_t Object_Instance_Number;
|
||||||
static BACNET_CHARACTER_STRING My_Object_Name;
|
|
||||||
static BACNET_DEVICE_STATUS System_Status = STATUS_OPERATIONAL;
|
static BACNET_DEVICE_STATUS System_Status = STATUS_OPERATIONAL;
|
||||||
|
static BACNET_CHARACTER_STRING My_Object_Name;
|
||||||
static uint32_t Database_Revision;
|
static uint32_t Database_Revision;
|
||||||
static BACNET_REINITIALIZED_STATE Reinitialize_State = BACNET_REINIT_IDLE;
|
static BACNET_REINITIALIZED_STATE Reinitialize_State = BACNET_REINIT_IDLE;
|
||||||
|
|
||||||
@@ -127,6 +127,7 @@ static const int Device_Properties_Required[] = {
|
|||||||
|
|
||||||
static const int Device_Properties_Optional[] = {
|
static const int Device_Properties_Optional[] = {
|
||||||
PROP_DESCRIPTION,
|
PROP_DESCRIPTION,
|
||||||
|
PROP_LOCATION,
|
||||||
-1
|
-1
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -168,28 +169,50 @@ static int Read_Property_Common(
|
|||||||
apdu = rpdata->application_data;
|
apdu = rpdata->application_data;
|
||||||
switch (rpdata->object_property) {
|
switch (rpdata->object_property) {
|
||||||
case PROP_OBJECT_IDENTIFIER:
|
case PROP_OBJECT_IDENTIFIER:
|
||||||
/* Device Object exception: requested instance
|
/* only array properties can have array options */
|
||||||
may not match our instance if a wildcard */
|
if (rpdata->array_index != BACNET_ARRAY_ALL) {
|
||||||
if (rpdata->object_type == OBJECT_DEVICE) {
|
rpdata->error_class = ERROR_CLASS_PROPERTY;
|
||||||
rpdata->object_instance = Object_Instance_Number;
|
rpdata->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY;
|
||||||
|
apdu_len = BACNET_STATUS_ERROR;
|
||||||
|
} else {
|
||||||
|
/* Device Object exception: requested instance
|
||||||
|
may not match our instance if a wildcard */
|
||||||
|
if (rpdata->object_type == OBJECT_DEVICE) {
|
||||||
|
rpdata->object_instance = Object_Instance_Number;
|
||||||
|
}
|
||||||
|
apdu_len =
|
||||||
|
encode_application_object_id(&apdu[0], rpdata->object_type,
|
||||||
|
rpdata->object_instance);
|
||||||
}
|
}
|
||||||
apdu_len =
|
|
||||||
encode_application_object_id(&apdu[0], rpdata->object_type,
|
|
||||||
rpdata->object_instance);
|
|
||||||
break;
|
break;
|
||||||
case PROP_OBJECT_NAME:
|
case PROP_OBJECT_NAME:
|
||||||
|
/* only array properties can have array options */
|
||||||
|
if (rpdata->array_index != BACNET_ARRAY_ALL) {
|
||||||
|
rpdata->error_class = ERROR_CLASS_PROPERTY;
|
||||||
|
rpdata->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY;
|
||||||
|
apdu_len = BACNET_STATUS_ERROR;
|
||||||
|
} else {
|
||||||
|
characterstring_init_ansi(&char_string, "");
|
||||||
if (pObject->Object_Name) {
|
if (pObject->Object_Name) {
|
||||||
(void) pObject->Object_Name(rpdata->object_instance,
|
(void) pObject->Object_Name(rpdata->object_instance,
|
||||||
&char_string);
|
&char_string);
|
||||||
} else {
|
|
||||||
characterstring_init_ansi(&char_string, "");
|
|
||||||
}
|
}
|
||||||
apdu_len =
|
apdu_len =
|
||||||
encode_application_character_string(&apdu[0], &char_string);
|
encode_application_character_string(&apdu[0],
|
||||||
|
&char_string);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case PROP_OBJECT_TYPE:
|
case PROP_OBJECT_TYPE:
|
||||||
apdu_len =
|
/* only array properties can have array options */
|
||||||
encode_application_enumerated(&apdu[0], rpdata->object_type);
|
if (rpdata->array_index != BACNET_ARRAY_ALL) {
|
||||||
|
rpdata->error_class = ERROR_CLASS_PROPERTY;
|
||||||
|
rpdata->error_code = ERROR_CODE_PROPERTY_IS_NOT_AN_ARRAY;
|
||||||
|
apdu_len = BACNET_STATUS_ERROR;
|
||||||
|
} else {
|
||||||
|
apdu_len =
|
||||||
|
encode_application_enumerated(&apdu[0],
|
||||||
|
rpdata->object_type);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
if (pObject->Object_Read_Property) {
|
if (pObject->Object_Read_Property) {
|
||||||
@@ -557,7 +580,7 @@ bool Device_Valid_Object_Name(
|
|||||||
for (i = 0; i < max_objects; i++) {
|
for (i = 0; i < max_objects; i++) {
|
||||||
check_id = Device_Object_List_Identifier(i, &type, &instance);
|
check_id = Device_Object_List_Identifier(i, &type, &instance);
|
||||||
if (check_id) {
|
if (check_id) {
|
||||||
pObject = Device_Objects_Find_Functions(type);
|
pObject = Device_Objects_Find_Functions((BACNET_OBJECT_TYPE) type);
|
||||||
if ((pObject != NULL) && (pObject->Object_Name != NULL) &&
|
if ((pObject != NULL) && (pObject->Object_Name != NULL) &&
|
||||||
(pObject->Object_Name(instance, &object_name2) &&
|
(pObject->Object_Name(instance, &object_name2) &&
|
||||||
characterstring_same(object_name1, &object_name2))) {
|
characterstring_same(object_name1, &object_name2))) {
|
||||||
@@ -583,7 +606,7 @@ bool Device_Valid_Object_Id(
|
|||||||
bool status = false; /* return value */
|
bool status = false; /* return value */
|
||||||
struct my_object_functions *pObject = NULL;
|
struct my_object_functions *pObject = NULL;
|
||||||
|
|
||||||
pObject = Device_Objects_Find_Functions(object_type);
|
pObject = Device_Objects_Find_Functions((BACNET_OBJECT_TYPE) object_type);
|
||||||
if ((pObject != NULL) && (pObject->Object_Valid_Instance != NULL)) {
|
if ((pObject != NULL) && (pObject->Object_Valid_Instance != NULL)) {
|
||||||
status = pObject->Object_Valid_Instance(object_instance);
|
status = pObject->Object_Valid_Instance(object_instance);
|
||||||
}
|
}
|
||||||
@@ -628,18 +651,6 @@ int Device_Read_Property_Local(
|
|||||||
}
|
}
|
||||||
apdu = rpdata->application_data;
|
apdu = rpdata->application_data;
|
||||||
switch (rpdata->object_property) {
|
switch (rpdata->object_property) {
|
||||||
case PROP_OBJECT_IDENTIFIER:
|
|
||||||
apdu_len =
|
|
||||||
encode_application_object_id(&apdu[0], OBJECT_DEVICE,
|
|
||||||
rpdata->object_instance);
|
|
||||||
break;
|
|
||||||
case PROP_OBJECT_TYPE:
|
|
||||||
apdu_len = encode_application_enumerated(&apdu[0], OBJECT_DEVICE);
|
|
||||||
break;
|
|
||||||
case PROP_OBJECT_NAME:
|
|
||||||
apdu_len =
|
|
||||||
encode_application_character_string(&apdu[0], &My_Object_Name);
|
|
||||||
break;
|
|
||||||
case PROP_DESCRIPTION:
|
case PROP_DESCRIPTION:
|
||||||
characterstring_init_ansi(&char_string, "BACnet Demo");
|
characterstring_init_ansi(&char_string, "BACnet Demo");
|
||||||
apdu_len =
|
apdu_len =
|
||||||
@@ -884,19 +895,22 @@ bool Device_Write_Property_Local(
|
|||||||
case PROP_OBJECT_NAME:
|
case PROP_OBJECT_NAME:
|
||||||
if (value.tag == BACNET_APPLICATION_TAG_CHARACTER_STRING) {
|
if (value.tag == BACNET_APPLICATION_TAG_CHARACTER_STRING) {
|
||||||
length = characterstring_length(&value.type.Character_String);
|
length = characterstring_length(&value.type.Character_String);
|
||||||
if (length < characterstring_capacity(&My_Object_Name)) {
|
if (length < 1) {
|
||||||
|
wp_data->error_class = ERROR_CLASS_PROPERTY;
|
||||||
|
wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE;
|
||||||
|
} else if (length < characterstring_capacity(&My_Object_Name)) {
|
||||||
encoding =
|
encoding =
|
||||||
characterstring_encoding(&value.type.Character_String);
|
characterstring_encoding(&value.type.Character_String);
|
||||||
if (encoding < MAX_CHARACTER_STRING_ENCODING) {
|
if (encoding < MAX_CHARACTER_STRING_ENCODING) {
|
||||||
/* All the object names in a device must be unique. */
|
/* All the object names in a device must be unique. */
|
||||||
if (Device_Valid_Object_Name(&value.type.
|
if (Device_Valid_Object_Name(&value.type.
|
||||||
Character_String, NULL, NULL)) {
|
Character_String, NULL, NULL)) {
|
||||||
status = false;
|
|
||||||
wp_data->error_class = ERROR_CLASS_PROPERTY;
|
wp_data->error_class = ERROR_CLASS_PROPERTY;
|
||||||
wp_data->error_code = ERROR_CODE_DUPLICATE_NAME;
|
wp_data->error_code = ERROR_CODE_DUPLICATE_NAME;
|
||||||
} else {
|
} else {
|
||||||
Device_Set_Object_Name(&value.type.
|
Device_Set_Object_Name(&value.type.
|
||||||
Character_String);
|
Character_String);
|
||||||
|
status = true;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
wp_data->error_class = ERROR_CLASS_PROPERTY;
|
wp_data->error_class = ERROR_CLASS_PROPERTY;
|
||||||
@@ -915,7 +929,7 @@ bool Device_Write_Property_Local(
|
|||||||
break;
|
break;
|
||||||
case 9600:
|
case 9600:
|
||||||
if (value.tag == BACNET_APPLICATION_TAG_UNSIGNED_INT) {
|
if (value.tag == BACNET_APPLICATION_TAG_UNSIGNED_INT) {
|
||||||
if (value.type.Unsigned_Int > 115200) {
|
if (value.type.Unsigned_Int <= 115200) {
|
||||||
RS485_Set_Baud_Rate(value.type.Unsigned_Int);
|
RS485_Set_Baud_Rate(value.type.Unsigned_Int);
|
||||||
status = true;
|
status = true;
|
||||||
} else {
|
} else {
|
||||||
@@ -932,6 +946,8 @@ bool Device_Write_Property_Local(
|
|||||||
wp_data->error_code = ERROR_CODE_WRITE_ACCESS_DENIED;
|
wp_data->error_code = ERROR_CODE_WRITE_ACCESS_DENIED;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
/* not using len at this time */
|
||||||
|
len = len;
|
||||||
|
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -110,6 +110,7 @@ static const int Device_Properties_Required[] = {
|
|||||||
|
|
||||||
static const int Device_Properties_Optional[] = {
|
static const int Device_Properties_Optional[] = {
|
||||||
PROP_DESCRIPTION,
|
PROP_DESCRIPTION,
|
||||||
|
PROP_LOCATION,
|
||||||
-1
|
-1
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -355,6 +356,20 @@ bool Device_Object_Name(
|
|||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Device_Set_Object_Name(
|
||||||
|
BACNET_CHARACTER_STRING * object_name)
|
||||||
|
{
|
||||||
|
bool status = false; /*return value */
|
||||||
|
|
||||||
|
if (!characterstring_same(&My_Object_Name, object_name)) {
|
||||||
|
/* Make the change and update the database revision */
|
||||||
|
status = characterstring_copy(&My_Object_Name, object_name);
|
||||||
|
Device_Inc_Database_Revision();
|
||||||
|
}
|
||||||
|
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
bool Device_Reinitialize(
|
bool Device_Reinitialize(
|
||||||
BACNET_REINITIALIZE_DEVICE_DATA * rd_data)
|
BACNET_REINITIALIZE_DEVICE_DATA * rd_data)
|
||||||
{
|
{
|
||||||
@@ -592,6 +607,7 @@ bool Device_Object_Name_Copy(
|
|||||||
{
|
{
|
||||||
struct my_object_functions *pObject = NULL;
|
struct my_object_functions *pObject = NULL;
|
||||||
bool found = false;
|
bool found = false;
|
||||||
|
|
||||||
pObject = Device_Objects_Find_Functions(object_type);
|
pObject = Device_Objects_Find_Functions(object_type);
|
||||||
if ((pObject != NULL) && (pObject->Object_Name != NULL)) {
|
if ((pObject != NULL) && (pObject->Object_Name != NULL)) {
|
||||||
found = pObject->Object_Name(object_instance, object_name);
|
found = pObject->Object_Name(object_instance, object_name);
|
||||||
@@ -626,6 +642,11 @@ int Device_Read_Property_Local(
|
|||||||
apdu_len =
|
apdu_len =
|
||||||
encode_application_character_string(&apdu[0], &char_string);
|
encode_application_character_string(&apdu[0], &char_string);
|
||||||
break;
|
break;
|
||||||
|
case PROP_LOCATION:
|
||||||
|
characterstring_init_ansi(&char_string, "USA");
|
||||||
|
apdu_len =
|
||||||
|
encode_application_character_string(&apdu[0], &char_string);
|
||||||
|
break;
|
||||||
case PROP_SYSTEM_STATUS:
|
case PROP_SYSTEM_STATUS:
|
||||||
apdu_len =
|
apdu_len =
|
||||||
encode_application_enumerated(&apdu[0],
|
encode_application_enumerated(&apdu[0],
|
||||||
@@ -796,6 +817,8 @@ bool Device_Write_Property_Local(
|
|||||||
{
|
{
|
||||||
bool status = false; /* return value - false=error */
|
bool status = false; /* return value - false=error */
|
||||||
int len = 0;
|
int len = 0;
|
||||||
|
uint8_t encoding = 0;
|
||||||
|
size_t length = 0;
|
||||||
BACNET_APPLICATION_DATA_VALUE value;
|
BACNET_APPLICATION_DATA_VALUE value;
|
||||||
|
|
||||||
/* decode the some of the request */
|
/* decode the some of the request */
|
||||||
@@ -857,18 +880,24 @@ bool Device_Write_Property_Local(
|
|||||||
break;
|
break;
|
||||||
case PROP_OBJECT_NAME:
|
case PROP_OBJECT_NAME:
|
||||||
if (value.tag == BACNET_APPLICATION_TAG_CHARACTER_STRING) {
|
if (value.tag == BACNET_APPLICATION_TAG_CHARACTER_STRING) {
|
||||||
size_t length =
|
length = characterstring_length(&value.type.Character_String);
|
||||||
characterstring_length(&value.type.Character_String);
|
|
||||||
if (length < 1) {
|
if (length < 1) {
|
||||||
wp_data->error_class = ERROR_CLASS_PROPERTY;
|
wp_data->error_class = ERROR_CLASS_PROPERTY;
|
||||||
wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE;
|
wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE;
|
||||||
} else if (length < MAX_CHARACTER_STRING_BYTES) {
|
} else if (length < characterstring_capacity(&My_Object_Name)) {
|
||||||
uint8_t encoding =
|
encoding =
|
||||||
characterstring_encoding(&value.type.Character_String);
|
characterstring_encoding(&value.type.Character_String);
|
||||||
if (encoding < MAX_CHARACTER_STRING_ENCODING) {
|
if (encoding < MAX_CHARACTER_STRING_ENCODING) {
|
||||||
characterstring_copy(&My_Object_Name,
|
/* All the object names in a device must be unique. */
|
||||||
&value.type.Character_String);
|
if (Device_Valid_Object_Name(&value.type.
|
||||||
status = true;
|
Character_String, NULL, NULL)) {
|
||||||
|
wp_data->error_class = ERROR_CLASS_PROPERTY;
|
||||||
|
wp_data->error_code = ERROR_CODE_DUPLICATE_NAME;
|
||||||
|
} else {
|
||||||
|
Device_Set_Object_Name(&value.type.
|
||||||
|
Character_String);
|
||||||
|
status = true;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
wp_data->error_class = ERROR_CLASS_PROPERTY;
|
wp_data->error_class = ERROR_CLASS_PROPERTY;
|
||||||
wp_data->error_code =
|
wp_data->error_code =
|
||||||
|
|||||||
Reference in New Issue
Block a user