Unfactored the device object read-property common since it made error handling more difficult, and also required an additional characterstring when optional characterstrings were needed in the objects.

This commit is contained in:
skarg
2012-08-16 18:53:52 +00:00
parent 288a47edea
commit 4612e503d1
6 changed files with 213 additions and 149 deletions
+18 -2
View File
@@ -151,7 +151,8 @@ int Analog_Input_Read_Property(
BACNET_READ_PROPERTY_DATA * rpdata) BACNET_READ_PROPERTY_DATA * rpdata)
{ {
int apdu_len = 0; /* return value */ int apdu_len = 0; /* return value */
BACNET_BIT_STRING bit_string; BACNET_CHARACTER_STRING char_string = { 0 };
BACNET_BIT_STRING bit_string = { 0 };
uint8_t *apdu = NULL; uint8_t *apdu = NULL;
if ((rpdata == NULL) || (rpdata->application_data == NULL) || if ((rpdata == NULL) || (rpdata->application_data == NULL) ||
@@ -160,7 +161,22 @@ int Analog_Input_Read_Property(
} }
apdu = rpdata->application_data; apdu = rpdata->application_data;
switch (rpdata->object_property) { switch (rpdata->object_property) {
/* object id, object name, object type are handled in Device object */ case PROP_OBJECT_IDENTIFIER:
apdu_len =
encode_application_object_id(&apdu[0], rpdata->object_type,
rpdata->object_instance);
break;
case PROP_OBJECT_NAME:
Analog_Input_Object_Name(rpdata->object_instance, &char_string);
apdu_len =
encode_application_character_string(&apdu[0],
&char_string);
break;
case PROP_OBJECT_TYPE:
apdu_len =
encode_application_enumerated(&apdu[0],
rpdata->object_type);
break;
case PROP_PRESENT_VALUE: case PROP_PRESENT_VALUE:
apdu_len = apdu_len =
encode_application_real(&apdu[0], encode_application_real(&apdu[0],
+17 -1
View File
@@ -199,6 +199,7 @@ int Analog_Value_Read_Property(
int apdu_len = 0; /* return value */ int apdu_len = 0; /* return value */
BACNET_BIT_STRING bit_string; BACNET_BIT_STRING bit_string;
float real_value = 1.414F; float real_value = 1.414F;
BACNET_CHARACTER_STRING char_string = { 0 };
#if 0 #if 0
unsigned object_index = 0; unsigned object_index = 0;
unsigned i = 0; unsigned i = 0;
@@ -212,7 +213,22 @@ int Analog_Value_Read_Property(
} }
apdu = rpdata->application_data; apdu = rpdata->application_data;
switch (rpdata->object_property) { switch (rpdata->object_property) {
/* object id, object name, object type are handled in Device object */ case PROP_OBJECT_IDENTIFIER:
apdu_len =
encode_application_object_id(&apdu[0], rpdata->object_type,
rpdata->object_instance);
break;
case PROP_OBJECT_NAME:
Analog_Value_Object_Name(rpdata->object_instance, &char_string);
apdu_len =
encode_application_character_string(&apdu[0],
&char_string);
break;
case PROP_OBJECT_TYPE:
apdu_len =
encode_application_enumerated(&apdu[0],
rpdata->object_type);
break;
case PROP_PRESENT_VALUE: case PROP_PRESENT_VALUE:
real_value = Analog_Value_Present_Value(rpdata->object_instance); real_value = Analog_Value_Present_Value(rpdata->object_instance);
apdu_len = encode_application_real(&apdu[0], real_value); apdu_len = encode_application_real(&apdu[0], real_value);
+118 -84
View File
@@ -10,9 +10,9 @@
<debug>1</debug> <debug>1</debug>
<settings> <settings>
<name>General</name> <name>General</name>
<archiveVersion>10</archiveVersion> <archiveVersion>11</archiveVersion>
<data> <data>
<version>8</version> <version>9</version>
<wantNonLocal>1</wantNonLocal> <wantNonLocal>1</wantNonLocal>
<debug>1</debug> <debug>1</debug>
<option> <option>
@@ -125,11 +125,6 @@
<name>GGEepromUtilSize</name> <name>GGEepromUtilSize</name>
<state>2048</state> <state>2048</state>
</option> </option>
<option>
<name>New Variant Processor</name>
<version>33</version>
<state>115</state>
</option>
<option> <option>
<name>GRuntimeLibSelect</name> <name>GRuntimeLibSelect</name>
<version>0</version> <version>0</version>
@@ -153,8 +148,8 @@
</option> </option>
<option> <option>
<name>Input variant</name> <name>Input variant</name>
<version>0</version> <version>36</version>
<state>3</state> <state>6</state>
</option> </option>
<option> <option>
<name>Input description</name> <name>Input description</name>
@@ -162,8 +157,8 @@
</option> </option>
<option> <option>
<name>Output variant</name> <name>Output variant</name>
<version>0</version> <version>36</version>
<state>3</state> <state>6</state>
</option> </option>
<option> <option>
<name>Output description</name> <name>Output description</name>
@@ -220,13 +215,17 @@
<version>0</version> <version>0</version>
<state>1000111110110101101110011100111111101110011011000101110111101101100111111111111100110011111001110111001111111111111111111111111</state> <state>1000111110110101101110011100111111101110011011000101110111101101100111111111111100110011111001110111001111111111111111111111111</state>
</option> </option>
<option>
<name>GenDeviceSelectMenu</name>
<state>m644p ATmega644P</state>
</option>
</data> </data>
</settings> </settings>
<settings> <settings>
<name>ICCAVR</name> <name>ICCAVR</name>
<archiveVersion>5</archiveVersion> <archiveVersion>6</archiveVersion>
<data> <data>
<version>14</version> <version>17</version>
<wantNonLocal>1</wantNonLocal> <wantNonLocal>1</wantNonLocal>
<debug>1</debug> <debug>1</debug>
<option> <option>
@@ -340,15 +339,6 @@
<version>0</version> <version>0</version>
<state>0</state> <state>0</state>
</option> </option>
<option>
<name>CCOptSizeSpeed</name>
<state>0</state>
</option>
<option>
<name>CCOptimization</name>
<version>1</version>
<state>1</state>
</option>
<option> <option>
<name>CCAllowList</name> <name>CCAllowList</name>
<version>3</version> <version>3</version>
@@ -433,11 +423,6 @@
<name>CCStdIncCheck</name> <name>CCStdIncCheck</name>
<state>0</state> <state>0</state>
</option> </option>
<option>
<name>CCStdIncludePaths</name>
<state>$TOOLKIT_DIR$\INC\</state>
<state>$TOOLKIT_DIR$\INC\DLIB\</state>
</option>
<option> <option>
<name>CCEepromSize</name> <name>CCEepromSize</name>
<state>0</state> <state>0</state>
@@ -446,23 +431,10 @@
<name>CCLockRegsSlave</name> <name>CCLockRegsSlave</name>
<state>1</state> <state>1</state>
</option> </option>
<option>
<name>CCOptSizeSpeedSlave</name>
<state>0</state>
</option>
<option>
<name>CCOptimizationSlave</name>
<version>1</version>
<state>1</state>
</option>
<option> <option>
<name>CCOutputFile</name> <name>CCOutputFile</name>
<state>$FILE_BNAME$.r90</state> <state>$FILE_BNAME$.r90</state>
</option> </option>
<option>
<name>CCLangSelect</name>
<state>0</state>
</option>
<option> <option>
<name>CompilerMisraOverride</name> <name>CompilerMisraOverride</name>
<state>0</state> <state>0</state>
@@ -501,13 +473,54 @@
<version>0</version> <version>0</version>
<state>1000111110110101101110011100111111101110011011000101110111101101100111111111111100110011111001110111001111111111111111111111111</state> <state>1000111110110101101110011100111111101110011011000101110111101101100111111111111100110011111001110111001111111111111111111111111</state>
</option> </option>
<option>
<name>IccLang</name>
<state>0</state>
</option>
<option>
<name>IccCDialect</name>
<state>1</state>
</option>
<option>
<name>IccCppDialect</name>
<state>1</state>
</option>
<option>
<name>IccAllowVLA</name>
<state>0</state>
</option>
<option>
<name>IccCppInlineSemantics</name>
<state>0</state>
</option>
<option>
<name>IccStaticDestr</name>
<state>1</state>
</option>
<option>
<name>IccFloatSemantics</name>
<state>0</state>
</option>
<option>
<name>CCOptStrategy</name>
<version>0</version>
<state>1</state>
</option>
<option>
<name>CCOptLevel</name>
<state>3</state>
</option>
<option>
<name>CCOptLevelSlave</name>
<state>3</state>
</option>
</data> </data>
</settings> </settings>
<settings> <settings>
<name>AAVR</name> <name>AAVR</name>
<archiveVersion>4</archiveVersion> <archiveVersion>5</archiveVersion>
<data> <data>
<version>10</version> <version>11</version>
<wantNonLocal>1</wantNonLocal> <wantNonLocal>1</wantNonLocal>
<debug>1</debug> <debug>1</debug>
<option> <option>
@@ -683,6 +696,10 @@
<name>AsmOutputFile</name> <name>AsmOutputFile</name>
<state>$FILE_BNAME$.r90</state> <state>$FILE_BNAME$.r90</state>
</option> </option>
<option>
<name>AStdIncCheck</name>
<state>0</state>
</option>
</data> </data>
</settings> </settings>
<settings> <settings>
@@ -1006,9 +1023,9 @@
<debug>0</debug> <debug>0</debug>
<settings> <settings>
<name>General</name> <name>General</name>
<archiveVersion>10</archiveVersion> <archiveVersion>11</archiveVersion>
<data> <data>
<version>8</version> <version>9</version>
<wantNonLocal>1</wantNonLocal> <wantNonLocal>1</wantNonLocal>
<debug>0</debug> <debug>0</debug>
<option> <option>
@@ -1121,11 +1138,6 @@
<name>GGEepromUtilSize</name> <name>GGEepromUtilSize</name>
<state>2048</state> <state>2048</state>
</option> </option>
<option>
<name>New Variant Processor</name>
<version>33</version>
<state>115</state>
</option>
<option> <option>
<name>GRuntimeLibSelect</name> <name>GRuntimeLibSelect</name>
<version>0</version> <version>0</version>
@@ -1149,8 +1161,8 @@
</option> </option>
<option> <option>
<name>Input variant</name> <name>Input variant</name>
<version>0</version> <version>36</version>
<state>0</state> <state>1</state>
</option> </option>
<option> <option>
<name>Input description</name> <name>Input description</name>
@@ -1158,8 +1170,8 @@
</option> </option>
<option> <option>
<name>Output variant</name> <name>Output variant</name>
<version>0</version> <version>36</version>
<state>3</state> <state>6</state>
</option> </option>
<option> <option>
<name>Output description</name> <name>Output description</name>
@@ -1216,13 +1228,17 @@
<version>0</version> <version>0</version>
<state>1000111110110101101110011100111111101110011011000101110111101101100111111111111100110011111001110111001111111111111111111111111</state> <state>1000111110110101101110011100111111101110011011000101110111101101100111111111111100110011111001110111001111111111111111111111111</state>
</option> </option>
<option>
<name>GenDeviceSelectMenu</name>
<state>m644p ATmega644P</state>
</option>
</data> </data>
</settings> </settings>
<settings> <settings>
<name>ICCAVR</name> <name>ICCAVR</name>
<archiveVersion>5</archiveVersion> <archiveVersion>6</archiveVersion>
<data> <data>
<version>14</version> <version>17</version>
<wantNonLocal>1</wantNonLocal> <wantNonLocal>1</wantNonLocal>
<debug>0</debug> <debug>0</debug>
<option> <option>
@@ -1336,15 +1352,6 @@
<version>0</version> <version>0</version>
<state>0</state> <state>0</state>
</option> </option>
<option>
<name>CCOptSizeSpeed</name>
<state>0</state>
</option>
<option>
<name>CCOptimization</name>
<version>1</version>
<state>4</state>
</option>
<option> <option>
<name>CCAllowList</name> <name>CCAllowList</name>
<version>3</version> <version>3</version>
@@ -1429,11 +1436,6 @@
<name>CCStdIncCheck</name> <name>CCStdIncCheck</name>
<state>0</state> <state>0</state>
</option> </option>
<option>
<name>CCStdIncludePaths</name>
<state>$TOOLKIT_DIR$\INC\</state>
<state>$TOOLKIT_DIR$\INC\DLIB\</state>
</option>
<option> <option>
<name>CCEepromSize</name> <name>CCEepromSize</name>
<state>0</state> <state>0</state>
@@ -1442,23 +1444,10 @@
<name>CCLockRegsSlave</name> <name>CCLockRegsSlave</name>
<state>1</state> <state>1</state>
</option> </option>
<option>
<name>CCOptSizeSpeedSlave</name>
<state>0</state>
</option>
<option>
<name>CCOptimizationSlave</name>
<version>1</version>
<state>4</state>
</option>
<option> <option>
<name>CCOutputFile</name> <name>CCOutputFile</name>
<state>$FILE_BNAME$.r90</state> <state>$FILE_BNAME$.r90</state>
</option> </option>
<option>
<name>CCLangSelect</name>
<state>0</state>
</option>
<option> <option>
<name>CompilerMisraOverride</name> <name>CompilerMisraOverride</name>
<state>0</state> <state>0</state>
@@ -1497,13 +1486,54 @@
<version>0</version> <version>0</version>
<state>1000111110110101101110011100111111101110011011000101110111101101100111111111111100110011111001110111001111111111111111111111111</state> <state>1000111110110101101110011100111111101110011011000101110111101101100111111111111100110011111001110111001111111111111111111111111</state>
</option> </option>
<option>
<name>IccLang</name>
<state>0</state>
</option>
<option>
<name>IccCDialect</name>
<state>1</state>
</option>
<option>
<name>IccCppDialect</name>
<state>1</state>
</option>
<option>
<name>IccAllowVLA</name>
<state>0</state>
</option>
<option>
<name>IccCppInlineSemantics</name>
<state>0</state>
</option>
<option>
<name>IccStaticDestr</name>
<state>1</state>
</option>
<option>
<name>IccFloatSemantics</name>
<state>0</state>
</option>
<option>
<name>CCOptStrategy</name>
<version>0</version>
<state>1</state>
</option>
<option>
<name>CCOptLevel</name>
<state>3</state>
</option>
<option>
<name>CCOptLevelSlave</name>
<state>3</state>
</option>
</data> </data>
</settings> </settings>
<settings> <settings>
<name>AAVR</name> <name>AAVR</name>
<archiveVersion>4</archiveVersion> <archiveVersion>5</archiveVersion>
<data> <data>
<version>10</version> <version>11</version>
<wantNonLocal>1</wantNonLocal> <wantNonLocal>1</wantNonLocal>
<debug>0</debug> <debug>0</debug>
<option> <option>
@@ -1679,6 +1709,10 @@
<name>AsmOutputFile</name> <name>AsmOutputFile</name>
<state></state> <state></state>
</option> </option>
<option>
<name>AStdIncCheck</name>
<state>0</state>
</option>
</data> </data>
</settings> </settings>
<settings> <settings>
+18 -2
View File
@@ -178,9 +178,10 @@ int Binary_Input_Read_Property(
BACNET_READ_PROPERTY_DATA * rpdata) BACNET_READ_PROPERTY_DATA * rpdata)
{ {
int apdu_len = 0; /* return value */ int apdu_len = 0; /* return value */
BACNET_BIT_STRING bit_string; BACNET_BIT_STRING bit_string = {0};
BACNET_POLARITY polarity = POLARITY_NORMAL; BACNET_POLARITY polarity = POLARITY_NORMAL;
BACNET_BINARY_PV value = BINARY_INACTIVE; BACNET_BINARY_PV value = BINARY_INACTIVE;
BACNET_CHARACTER_STRING char_string = {0};
uint8_t *apdu = NULL; uint8_t *apdu = NULL;
if ((rpdata->application_data == NULL) || if ((rpdata->application_data == NULL) ||
@@ -189,7 +190,22 @@ int Binary_Input_Read_Property(
} }
apdu = rpdata->application_data; apdu = rpdata->application_data;
switch (rpdata->object_property) { switch (rpdata->object_property) {
/* object id, object name, object type are handled in Device object */ case PROP_OBJECT_IDENTIFIER:
apdu_len =
encode_application_object_id(&apdu[0], rpdata->object_type,
rpdata->object_instance);
break;
case PROP_OBJECT_NAME:
Binary_Input_Object_Name(rpdata->object_instance, &char_string);
apdu_len =
encode_application_character_string(&apdu[0],
&char_string);
break;
case PROP_OBJECT_TYPE:
apdu_len =
encode_application_enumerated(&apdu[0],
rpdata->object_type);
break;
case PROP_PRESENT_VALUE: case PROP_PRESENT_VALUE:
value = Binary_Input_Present_Value(rpdata->object_instance); value = Binary_Input_Present_Value(rpdata->object_instance);
apdu_len = encode_application_enumerated(&apdu[0], value); apdu_len = encode_application_enumerated(&apdu[0], value);
+18 -3
View File
@@ -250,8 +250,8 @@ int Binary_Output_Read_Property(
{ {
int len = 0; int len = 0;
int apdu_len = 0; /* return value */ int apdu_len = 0; /* return value */
BACNET_BIT_STRING bit_string; BACNET_BIT_STRING bit_string = {0};
BACNET_CHARACTER_STRING char_string; BACNET_CHARACTER_STRING char_string = {0};
BACNET_BINARY_PV present_value = BINARY_INACTIVE; BACNET_BINARY_PV present_value = BINARY_INACTIVE;
unsigned object_index = 0; unsigned object_index = 0;
unsigned i = 0; unsigned i = 0;
@@ -264,7 +264,22 @@ int Binary_Output_Read_Property(
} }
apdu = rpdata->application_data; apdu = rpdata->application_data;
switch (rpdata->object_property) { switch (rpdata->object_property) {
/* object id, object name, object type are handled in Device object */ case PROP_OBJECT_IDENTIFIER:
apdu_len =
encode_application_object_id(&apdu[0], rpdata->object_type,
rpdata->object_instance);
break;
case PROP_OBJECT_NAME:
Binary_Output_Object_Name(rpdata->object_instance, &char_string);
apdu_len =
encode_application_character_string(&apdu[0],
&char_string);
break;
case PROP_OBJECT_TYPE:
apdu_len =
encode_application_enumerated(&apdu[0],
rpdata->object_type);
break;
case PROP_PRESENT_VALUE: case PROP_PRESENT_VALUE:
present_value = present_value =
Binary_Output_Present_Value(rpdata->object_instance); Binary_Output_Present_Value(rpdata->object_instance);
+24 -57
View File
@@ -169,52 +169,6 @@ 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:
/* 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 {
/* 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);
}
break;
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) {
(void) pObject->Object_Name(rpdata->object_instance,
&char_string);
}
apdu_len =
encode_application_character_string(&apdu[0],
&char_string);
}
break;
case PROP_OBJECT_TYPE:
/* 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 {
apdu_len =
encode_application_enumerated(&apdu[0],
rpdata->object_type);
}
break;
default: default:
if (pObject->Object_Read_Property) { if (pObject->Object_Read_Property) {
apdu_len = pObject->Object_Read_Property(rpdata); apdu_len = pObject->Object_Read_Property(rpdata);
@@ -234,18 +188,16 @@ int Device_Read_Property(
struct my_object_functions *pObject = NULL; struct my_object_functions *pObject = NULL;
/* initialize the default return values */ /* initialize the default return values */
rpdata->error_class = ERROR_CLASS_OBJECT;
rpdata->error_code = ERROR_CODE_UNKNOWN_OBJECT;
pObject = Device_Objects_Find_Functions(rpdata->object_type); pObject = Device_Objects_Find_Functions(rpdata->object_type);
if (pObject) { if (pObject != NULL) {
if (pObject->Object_Valid_Instance && if (pObject->Object_Valid_Instance &&
pObject->Object_Valid_Instance(rpdata->object_instance)) { pObject->Object_Valid_Instance(rpdata->object_instance)) {
apdu_len = Read_Property_Common(pObject, rpdata); if (pObject->Object_Read_Property) {
} else { apdu_len = pObject->Object_Read_Property(rpdata);
rpdata->error_class = ERROR_CLASS_OBJECT; }
rpdata->error_code = ERROR_CODE_UNKNOWN_OBJECT;
} }
} else {
rpdata->error_class = ERROR_CLASS_OBJECT;
rpdata->error_code = ERROR_CODE_UNKNOWN_OBJECT;
} }
return apdu_len; return apdu_len;
@@ -633,8 +585,8 @@ int Device_Read_Property_Local(
{ {
int apdu_len = 0; /* return value */ int apdu_len = 0; /* return value */
int len = 0; /* apdu len intermediate value */ int len = 0; /* apdu len intermediate value */
BACNET_BIT_STRING bit_string; BACNET_BIT_STRING bit_string = {0};
BACNET_CHARACTER_STRING char_string; BACNET_CHARACTER_STRING char_string = {0};
unsigned i = 0; unsigned i = 0;
int object_type = 0; int object_type = 0;
uint32_t instance = 0; uint32_t instance = 0;
@@ -648,7 +600,22 @@ int Device_Read_Property_Local(
} }
apdu = rpdata->application_data; apdu = rpdata->application_data;
switch (rpdata->object_property) { switch (rpdata->object_property) {
/* object name, object id, object type are handled in Device object */ case PROP_OBJECT_IDENTIFIER:
apdu_len =
encode_application_object_id(&apdu[0], rpdata->object_type,
rpdata->object_instance);
break;
case PROP_OBJECT_NAME:
Device_Object_Name(rpdata->object_instance, &char_string);
apdu_len =
encode_application_character_string(&apdu[0],
&char_string);
break;
case PROP_OBJECT_TYPE:
apdu_len =
encode_application_enumerated(&apdu[0],
rpdata->object_type);
break;
case PROP_DESCRIPTION: case PROP_DESCRIPTION:
bacnet_name(NV_EEPROM_DEVICE_DESCRIPTION, &char_string, bacnet_name(NV_EEPROM_DEVICE_DESCRIPTION, &char_string,
"BACnet Development Kit"); "BACnet Development Kit");