Bugfix/using-uint16-for-units-property-storage (#1107)
* Fixed units property declaration in basic Analog Input header file to be uint16_t instead of uint8_t. * Added range checking of units property in example objects WriteProperty handler.
This commit is contained in:
@@ -559,8 +559,14 @@ bool Analog_Value_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
break;
|
break;
|
||||||
case PROP_UNITS:
|
case PROP_UNITS:
|
||||||
if (value.tag == BACNET_APPLICATION_TAG_ENUMERATED) {
|
if (value.tag == BACNET_APPLICATION_TAG_ENUMERATED) {
|
||||||
status = Analog_Value_Units_Set(
|
if (value.type.Enumerated <= UINT16_MAX) {
|
||||||
|
Analog_Value_Units_Set(
|
||||||
wp_data->object_instance, value.type.Enumerated);
|
wp_data->object_instance, value.type.Enumerated);
|
||||||
|
} else {
|
||||||
|
status = false;
|
||||||
|
wp_data->error_class = ERROR_CLASS_PROPERTY;
|
||||||
|
wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
wp_data->error_class = ERROR_CLASS_PROPERTY;
|
wp_data->error_class = ERROR_CLASS_PROPERTY;
|
||||||
wp_data->error_code = ERROR_CODE_INVALID_DATA_TYPE;
|
wp_data->error_code = ERROR_CODE_INVALID_DATA_TYPE;
|
||||||
|
|||||||
+7
-1
@@ -279,8 +279,14 @@ bool Analog_Input_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
status = write_property_type_valid(wp_data, &value,
|
status = write_property_type_valid(wp_data, &value,
|
||||||
BACNET_APPLICATION_TAG_ENUMERATED);
|
BACNET_APPLICATION_TAG_ENUMERATED);
|
||||||
if (status) {
|
if (status) {
|
||||||
Analog_Input_Out_Of_Service_Set(
|
if (value.type.Enumerated <= UINT16_MAX) {
|
||||||
|
Analog_Input_Units_Set(
|
||||||
wp_data->object_instance, value.type.Enumerated);
|
wp_data->object_instance, value.type.Enumerated);
|
||||||
|
} else {
|
||||||
|
status = false;
|
||||||
|
wp_data->error_class = ERROR_CLASS_PROPERTY;
|
||||||
|
wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case PROP_OBJECT_IDENTIFIER:
|
case PROP_OBJECT_IDENTIFIER:
|
||||||
|
|||||||
@@ -958,7 +958,13 @@ bool Analog_Input_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
status = write_property_type_valid(
|
status = write_property_type_valid(
|
||||||
wp_data, &value, BACNET_APPLICATION_TAG_ENUMERATED);
|
wp_data, &value, BACNET_APPLICATION_TAG_ENUMERATED);
|
||||||
if (status) {
|
if (status) {
|
||||||
|
if (value.type.Enumerated <= UINT16_MAX) {
|
||||||
pObject->Units = value.type.Enumerated;
|
pObject->Units = value.type.Enumerated;
|
||||||
|
} else {
|
||||||
|
status = false;
|
||||||
|
wp_data->error_class = ERROR_CLASS_PROPERTY;
|
||||||
|
wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case PROP_COV_INCREMENT:
|
case PROP_COV_INCREMENT:
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ typedef struct analog_input_descr {
|
|||||||
float Present_Value;
|
float Present_Value;
|
||||||
BACNET_RELIABILITY Reliability;
|
BACNET_RELIABILITY Reliability;
|
||||||
bool Out_Of_Service;
|
bool Out_Of_Service;
|
||||||
uint8_t Units;
|
uint16_t Units;
|
||||||
float Prior_Value;
|
float Prior_Value;
|
||||||
float COV_Increment;
|
float COV_Increment;
|
||||||
bool Changed;
|
bool Changed;
|
||||||
|
|||||||
@@ -1191,9 +1191,11 @@ bool Analog_Output_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
status = write_property_type_valid(
|
status = write_property_type_valid(
|
||||||
wp_data, &value, BACNET_APPLICATION_TAG_ENUMERATED);
|
wp_data, &value, BACNET_APPLICATION_TAG_ENUMERATED);
|
||||||
if (status) {
|
if (status) {
|
||||||
status = Analog_Output_Units_Set(
|
if (value.type.Enumerated <= UINT16_MAX) {
|
||||||
|
Analog_Output_Units_Set(
|
||||||
wp_data->object_instance, value.type.Enumerated);
|
wp_data->object_instance, value.type.Enumerated);
|
||||||
if (!status) {
|
} else {
|
||||||
|
status = false;
|
||||||
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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -997,7 +997,13 @@ bool Analog_Value_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
status = write_property_type_valid(
|
status = write_property_type_valid(
|
||||||
wp_data, &value, BACNET_APPLICATION_TAG_ENUMERATED);
|
wp_data, &value, BACNET_APPLICATION_TAG_ENUMERATED);
|
||||||
if (status) {
|
if (status) {
|
||||||
|
if (value.type.Enumerated <= UINT16_MAX) {
|
||||||
CurrentAV->Units = value.type.Enumerated;
|
CurrentAV->Units = value.type.Enumerated;
|
||||||
|
} else {
|
||||||
|
status = false;
|
||||||
|
wp_data->error_class = ERROR_CLASS_PROPERTY;
|
||||||
|
wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case PROP_COV_INCREMENT:
|
case PROP_COV_INCREMENT:
|
||||||
|
|||||||
@@ -586,6 +586,20 @@ bool Integer_Value_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
wp_data->object_instance, value.type.Boolean);
|
wp_data->object_instance, value.type.Boolean);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case PROP_UNITS:
|
||||||
|
status = write_property_type_valid(
|
||||||
|
wp_data, &value, BACNET_APPLICATION_TAG_ENUMERATED);
|
||||||
|
if (status) {
|
||||||
|
if (value.type.Enumerated <= UINT16_MAX) {
|
||||||
|
Integer_Value_Units_Set(
|
||||||
|
wp_data->object_instance, value.type.Enumerated);
|
||||||
|
} else {
|
||||||
|
status = false;
|
||||||
|
wp_data->error_class = ERROR_CLASS_PROPERTY;
|
||||||
|
wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
if (property_lists_member(
|
if (property_lists_member(
|
||||||
Integer_Value_Properties_Required,
|
Integer_Value_Properties_Required,
|
||||||
|
|||||||
@@ -164,7 +164,16 @@ bool PositiveInteger_Value_Object_Name(
|
|||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* return apdu len, or BACNET_STATUS_ERROR on error */
|
/**
|
||||||
|
* ReadProperty handler for this object. For the given ReadProperty
|
||||||
|
* data, the application_data is loaded or the error flags are set.
|
||||||
|
*
|
||||||
|
* @param rpdata - BACNET_READ_PROPERTY_DATA data, including
|
||||||
|
* requested data and space for the reply, or error response.
|
||||||
|
*
|
||||||
|
* @return number of APDU bytes in the response, or
|
||||||
|
* BACNET_STATUS_ERROR on error.
|
||||||
|
*/
|
||||||
int PositiveInteger_Value_Read_Property(BACNET_READ_PROPERTY_DATA *rpdata)
|
int PositiveInteger_Value_Read_Property(BACNET_READ_PROPERTY_DATA *rpdata)
|
||||||
{
|
{
|
||||||
int apdu_len = 0; /* return value */
|
int apdu_len = 0; /* return value */
|
||||||
@@ -254,7 +263,15 @@ int PositiveInteger_Value_Read_Property(BACNET_READ_PROPERTY_DATA *rpdata)
|
|||||||
return apdu_len;
|
return apdu_len;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* returns true if successful */
|
/**
|
||||||
|
* WriteProperty handler for this object. For the given WriteProperty
|
||||||
|
* data, the application_data is loaded or the error flags are set.
|
||||||
|
*
|
||||||
|
* @param wp_data - BACNET_WRITE_PROPERTY_DATA data, including
|
||||||
|
* requested data and space for the reply, or error response.
|
||||||
|
*
|
||||||
|
* @return false if an error is loaded, true if no errors
|
||||||
|
*/
|
||||||
bool PositiveInteger_Value_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
bool PositiveInteger_Value_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
||||||
{
|
{
|
||||||
bool status = false; /* return value */
|
bool status = false; /* return value */
|
||||||
@@ -280,7 +297,6 @@ bool PositiveInteger_Value_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
} else {
|
} else {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (wp_data->object_property) {
|
switch (wp_data->object_property) {
|
||||||
case PROP_PRESENT_VALUE:
|
case PROP_PRESENT_VALUE:
|
||||||
status = write_property_type_valid(
|
status = write_property_type_valid(
|
||||||
@@ -305,7 +321,6 @@ bool PositiveInteger_Value_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PROP_OUT_OF_SERVICE:
|
case PROP_OUT_OF_SERVICE:
|
||||||
status = write_property_type_valid(
|
status = write_property_type_valid(
|
||||||
wp_data, &value, BACNET_APPLICATION_TAG_BOOLEAN);
|
wp_data, &value, BACNET_APPLICATION_TAG_BOOLEAN);
|
||||||
@@ -313,18 +328,31 @@ bool PositiveInteger_Value_Write_Property(BACNET_WRITE_PROPERTY_DATA *wp_data)
|
|||||||
CurrentAV->Out_Of_Service = value.type.Boolean;
|
CurrentAV->Out_Of_Service = value.type.Boolean;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PROP_OBJECT_IDENTIFIER:
|
|
||||||
case PROP_OBJECT_NAME:
|
|
||||||
case PROP_OBJECT_TYPE:
|
|
||||||
case PROP_STATUS_FLAGS:
|
|
||||||
case PROP_UNITS:
|
case PROP_UNITS:
|
||||||
|
status = write_property_type_valid(
|
||||||
|
wp_data, &value, BACNET_APPLICATION_TAG_ENUMERATED);
|
||||||
|
if (status) {
|
||||||
|
if (value.type.Enumerated <= UINT16_MAX) {
|
||||||
|
CurrentAV->Units = (uint16_t)value.type.Enumerated;
|
||||||
|
} else {
|
||||||
|
status = false;
|
||||||
wp_data->error_class = ERROR_CLASS_PROPERTY;
|
wp_data->error_class = ERROR_CLASS_PROPERTY;
|
||||||
wp_data->error_code = ERROR_CODE_WRITE_ACCESS_DENIED;
|
wp_data->error_code = ERROR_CODE_VALUE_OUT_OF_RANGE;
|
||||||
|
}
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
if (property_lists_member(
|
||||||
|
PositiveInteger_Value_Properties_Required,
|
||||||
|
PositiveInteger_Value_Properties_Optional,
|
||||||
|
PositiveInteger_Value_Properties_Proprietary,
|
||||||
|
wp_data->object_property)) {
|
||||||
|
wp_data->error_class = ERROR_CLASS_PROPERTY;
|
||||||
|
wp_data->error_code = ERROR_CODE_WRITE_ACCESS_DENIED;
|
||||||
|
} else {
|
||||||
wp_data->error_class = ERROR_CLASS_PROPERTY;
|
wp_data->error_class = ERROR_CLASS_PROPERTY;
|
||||||
wp_data->error_code = ERROR_CODE_UNKNOWN_PROPERTY;
|
wp_data->error_code = ERROR_CODE_UNKNOWN_PROPERTY;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user