Indented.
This commit is contained in:
+143
-190
@@ -49,25 +49,24 @@
|
||||
#include "lsp.h"
|
||||
#include "mso.h"
|
||||
#if defined(BACFILE)
|
||||
#include "bacfile.h"
|
||||
#include "bacfile.h"
|
||||
#endif
|
||||
|
||||
static uint8_t Temp_Buf[MAX_APDU] = { 0 };
|
||||
|
||||
struct property_list_t
|
||||
{
|
||||
struct property_list_t {
|
||||
const int *pList;
|
||||
unsigned count;
|
||||
};
|
||||
|
||||
struct special_property_list_t
|
||||
{
|
||||
struct special_property_list_t {
|
||||
struct property_list_t Required;
|
||||
struct property_list_t Optional;
|
||||
struct property_list_t Proprietary;
|
||||
};
|
||||
|
||||
static unsigned property_list_count(const int *pList)
|
||||
static unsigned property_list_count(
|
||||
const int *pList)
|
||||
{
|
||||
unsigned property_count = 0;
|
||||
|
||||
@@ -90,72 +89,62 @@ static void RPM_Property_List(
|
||||
pPropertyList->Optional.pList = NULL;
|
||||
pPropertyList->Proprietary.pList = NULL;
|
||||
switch (object_type) {
|
||||
case OBJECT_ANALOG_INPUT:
|
||||
Analog_Input_Property_Lists(
|
||||
&pPropertyList->Required.pList,
|
||||
&pPropertyList->Optional.pList,
|
||||
&pPropertyList->Proprietary.pList);
|
||||
break;
|
||||
case OBJECT_ANALOG_OUTPUT:
|
||||
Analog_Output_Property_Lists(
|
||||
&pPropertyList->Required.pList,
|
||||
&pPropertyList->Optional.pList,
|
||||
&pPropertyList->Proprietary.pList);
|
||||
break;
|
||||
case OBJECT_ANALOG_VALUE:
|
||||
Analog_Value_Property_Lists(
|
||||
&pPropertyList->Required.pList,
|
||||
&pPropertyList->Optional.pList,
|
||||
&pPropertyList->Proprietary.pList);
|
||||
break;
|
||||
case OBJECT_BINARY_INPUT:
|
||||
Binary_Input_Property_Lists(
|
||||
&pPropertyList->Required.pList,
|
||||
&pPropertyList->Optional.pList,
|
||||
&pPropertyList->Proprietary.pList);
|
||||
break;
|
||||
case OBJECT_BINARY_OUTPUT:
|
||||
Binary_Output_Property_Lists(
|
||||
&pPropertyList->Required.pList,
|
||||
&pPropertyList->Optional.pList,
|
||||
&pPropertyList->Proprietary.pList);
|
||||
break;
|
||||
case OBJECT_BINARY_VALUE:
|
||||
Binary_Value_Property_Lists(
|
||||
&pPropertyList->Required.pList,
|
||||
&pPropertyList->Optional.pList,
|
||||
&pPropertyList->Proprietary.pList);
|
||||
break;
|
||||
case OBJECT_LIFE_SAFETY_POINT:
|
||||
Life_Safety_Point_Property_Lists(
|
||||
&pPropertyList->Required.pList,
|
||||
&pPropertyList->Optional.pList,
|
||||
&pPropertyList->Proprietary.pList);
|
||||
break;
|
||||
case OBJECT_LOAD_CONTROL:
|
||||
Load_Control_Property_Lists(
|
||||
&pPropertyList->Required.pList,
|
||||
&pPropertyList->Optional.pList,
|
||||
&pPropertyList->Proprietary.pList);
|
||||
break;
|
||||
case OBJECT_MULTI_STATE_OUTPUT:
|
||||
break;
|
||||
case OBJECT_ANALOG_INPUT:
|
||||
Analog_Input_Property_Lists(&pPropertyList->Required.pList,
|
||||
&pPropertyList->Optional.pList,
|
||||
&pPropertyList->Proprietary.pList);
|
||||
break;
|
||||
case OBJECT_ANALOG_OUTPUT:
|
||||
Analog_Output_Property_Lists(&pPropertyList->Required.pList,
|
||||
&pPropertyList->Optional.pList,
|
||||
&pPropertyList->Proprietary.pList);
|
||||
break;
|
||||
case OBJECT_ANALOG_VALUE:
|
||||
Analog_Value_Property_Lists(&pPropertyList->Required.pList,
|
||||
&pPropertyList->Optional.pList,
|
||||
&pPropertyList->Proprietary.pList);
|
||||
break;
|
||||
case OBJECT_BINARY_INPUT:
|
||||
Binary_Input_Property_Lists(&pPropertyList->Required.pList,
|
||||
&pPropertyList->Optional.pList,
|
||||
&pPropertyList->Proprietary.pList);
|
||||
break;
|
||||
case OBJECT_BINARY_OUTPUT:
|
||||
Binary_Output_Property_Lists(&pPropertyList->Required.pList,
|
||||
&pPropertyList->Optional.pList,
|
||||
&pPropertyList->Proprietary.pList);
|
||||
break;
|
||||
case OBJECT_BINARY_VALUE:
|
||||
Binary_Value_Property_Lists(&pPropertyList->Required.pList,
|
||||
&pPropertyList->Optional.pList,
|
||||
&pPropertyList->Proprietary.pList);
|
||||
break;
|
||||
case OBJECT_LIFE_SAFETY_POINT:
|
||||
Life_Safety_Point_Property_Lists(&pPropertyList->Required.pList,
|
||||
&pPropertyList->Optional.pList,
|
||||
&pPropertyList->Proprietary.pList);
|
||||
break;
|
||||
case OBJECT_LOAD_CONTROL:
|
||||
Load_Control_Property_Lists(&pPropertyList->Required.pList,
|
||||
&pPropertyList->Optional.pList,
|
||||
&pPropertyList->Proprietary.pList);
|
||||
break;
|
||||
case OBJECT_MULTI_STATE_OUTPUT:
|
||||
break;
|
||||
#if defined(BACFILE)
|
||||
case OBJECT_FILE:
|
||||
BACfile_Property_Lists(
|
||||
&pPropertyList->Required.pList,
|
||||
&pPropertyList->Optional.pList,
|
||||
&pPropertyList->Proprietary.pList);
|
||||
break;
|
||||
case OBJECT_FILE:
|
||||
BACfile_Property_Lists(&pPropertyList->Required.pList,
|
||||
&pPropertyList->Optional.pList,
|
||||
&pPropertyList->Proprietary.pList);
|
||||
break;
|
||||
#endif
|
||||
case OBJECT_DEVICE:
|
||||
Device_Property_Lists(
|
||||
&pPropertyList->Required.pList,
|
||||
&pPropertyList->Optional.pList,
|
||||
&pPropertyList->Proprietary.pList);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
case OBJECT_DEVICE:
|
||||
Device_Property_Lists(&pPropertyList->Required.pList,
|
||||
&pPropertyList->Optional.pList,
|
||||
&pPropertyList->Proprietary.pList);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
/* fill the count */
|
||||
pPropertyList->Required.count =
|
||||
@@ -173,7 +162,7 @@ static int RPM_Object_Property(
|
||||
BACNET_PROPERTY_ID special_property,
|
||||
unsigned index)
|
||||
{
|
||||
int property = -1; /* return value */
|
||||
int property = -1; /* return value */
|
||||
unsigned required, optional, proprietary;
|
||||
|
||||
required = pPropertyList->Required.count;
|
||||
@@ -210,8 +199,7 @@ static unsigned RPM_Object_Property_Count(
|
||||
|
||||
if (special_property == PROP_ALL) {
|
||||
count = pPropertyList->Required.count +
|
||||
pPropertyList->Optional.count +
|
||||
pPropertyList->Proprietary.count;
|
||||
pPropertyList->Optional.count + pPropertyList->Proprietary.count;
|
||||
} else if (special_property == PROP_REQUIRED) {
|
||||
count = pPropertyList->Required.count;
|
||||
} else if (special_property == PROP_OPTIONAL) {
|
||||
@@ -222,14 +210,19 @@ static unsigned RPM_Object_Property_Count(
|
||||
}
|
||||
|
||||
/* copy len bytes from src to offset of dest if there is enough space. */
|
||||
int apdu_copy(uint8_t *dest, uint8_t *src, int offset, int len, int max)
|
||||
int apdu_copy(
|
||||
uint8_t * dest,
|
||||
uint8_t * src,
|
||||
int offset,
|
||||
int len,
|
||||
int max)
|
||||
{
|
||||
int i;
|
||||
int copy_len = 0;
|
||||
|
||||
if (len <= (max-offset)) {
|
||||
if (len <= (max - offset)) {
|
||||
for (i = 0; i < len; i++) {
|
||||
dest[offset+i] = src[i];
|
||||
dest[offset + i] = src[i];
|
||||
copy_len++;
|
||||
}
|
||||
}
|
||||
@@ -239,7 +232,8 @@ int apdu_copy(uint8_t *dest, uint8_t *src, int offset, int len, int max)
|
||||
|
||||
/* Encode the RPM property returning the length of the encoding,
|
||||
or 0 if there is no room to fit the encoding. */
|
||||
int RPM_Encode_Property(uint8_t *apdu,
|
||||
int RPM_Encode_Property(
|
||||
uint8_t * apdu,
|
||||
uint16_t offset,
|
||||
uint16_t max_apdu,
|
||||
BACNET_OBJECT_TYPE object_type,
|
||||
@@ -252,35 +246,30 @@ int RPM_Encode_Property(uint8_t *apdu,
|
||||
BACNET_ERROR_CLASS error_class = ERROR_CLASS_OBJECT;
|
||||
BACNET_ERROR_CODE error_code = ERROR_CODE_UNKNOWN_OBJECT;
|
||||
|
||||
len = rpm_ack_encode_apdu_object_property(
|
||||
&Temp_Buf[0],
|
||||
object_property,
|
||||
array_index);
|
||||
len = rpm_ack_encode_apdu_object_property(&Temp_Buf[0],
|
||||
object_property, array_index);
|
||||
len = apdu_copy(&apdu[0], &Temp_Buf[0], offset, len, max_apdu);
|
||||
if (!len)
|
||||
return 0;
|
||||
apdu_len += len;
|
||||
len = Encode_Property_APDU(
|
||||
&Temp_Buf[0],
|
||||
len = Encode_Property_APDU(&Temp_Buf[0],
|
||||
object_type,
|
||||
object_instance,
|
||||
object_property,
|
||||
array_index,
|
||||
&error_class, &error_code);
|
||||
object_property, array_index, &error_class, &error_code);
|
||||
if (len < 0) {
|
||||
/* error was returned - encode that for the response */
|
||||
len = rpm_ack_encode_apdu_object_property_error(
|
||||
&Temp_Buf[0],
|
||||
len = rpm_ack_encode_apdu_object_property_error(&Temp_Buf[0],
|
||||
error_class, error_code);
|
||||
len = apdu_copy(&apdu[0], &Temp_Buf[0], offset+apdu_len, len, max_apdu);
|
||||
len =
|
||||
apdu_copy(&apdu[0], &Temp_Buf[0], offset + apdu_len, len,
|
||||
max_apdu);
|
||||
if (!len)
|
||||
return 0;
|
||||
} else if ((offset+apdu_len+1+len+1) < max_apdu) {
|
||||
} else if ((offset + apdu_len + 1 + len + 1) < max_apdu) {
|
||||
/* enough room to fit the property value and tags */
|
||||
len = rpm_ack_encode_apdu_object_property_value(
|
||||
&apdu[offset+apdu_len],
|
||||
&Temp_Buf[0],
|
||||
len);
|
||||
len =
|
||||
rpm_ack_encode_apdu_object_property_value(&apdu[offset + apdu_len],
|
||||
&Temp_Buf[0], len);
|
||||
} else {
|
||||
/* not enough room - abort! */
|
||||
return 0;
|
||||
@@ -311,16 +300,14 @@ void handler_read_property_multiple(
|
||||
int32_t array_index = 0;
|
||||
|
||||
/* jps_debug - see if we are utilizing all the buffer */
|
||||
/* memset(&Handler_Transmit_Buffer[0], 0xff, sizeof(Handler_Transmit_Buffer));*/
|
||||
/* memset(&Handler_Transmit_Buffer[0], 0xff, sizeof(Handler_Transmit_Buffer)); */
|
||||
/* encode the NPDU portion of the packet */
|
||||
datalink_get_my_address(&my_address);
|
||||
npdu_encode_npdu_data(&npdu_data, false, MESSAGE_PRIORITY_NORMAL);
|
||||
npdu_len = npdu_encode_pdu(
|
||||
&Handler_Transmit_Buffer[0],
|
||||
npdu_len = npdu_encode_pdu(&Handler_Transmit_Buffer[0],
|
||||
src, &my_address, &npdu_data);
|
||||
if (service_data->segmented_message) {
|
||||
apdu_len = abort_encode_apdu(
|
||||
&Handler_Transmit_Buffer[npdu_len],
|
||||
apdu_len = abort_encode_apdu(&Handler_Transmit_Buffer[npdu_len],
|
||||
service_data->invoke_id,
|
||||
ABORT_REASON_SEGMENTATION_NOT_SUPPORTED, true);
|
||||
#if PRINT_ENABLED
|
||||
@@ -330,102 +317,82 @@ void handler_read_property_multiple(
|
||||
}
|
||||
/* decode apdu request & encode apdu reply
|
||||
encode complex ack, invoke id, service choice */
|
||||
apdu_len = rpm_ack_encode_apdu_init(
|
||||
&Handler_Transmit_Buffer[npdu_len],
|
||||
apdu_len = rpm_ack_encode_apdu_init(&Handler_Transmit_Buffer[npdu_len],
|
||||
service_data->invoke_id);
|
||||
do
|
||||
{
|
||||
len = rpm_decode_object_id(
|
||||
&service_request[decode_len],
|
||||
service_len - decode_len,
|
||||
&object_type, &object_instance);
|
||||
do {
|
||||
len = rpm_decode_object_id(&service_request[decode_len],
|
||||
service_len - decode_len, &object_type, &object_instance);
|
||||
/* end of object? */
|
||||
if (len > 0) {
|
||||
decode_len += len;
|
||||
} else {
|
||||
len = rpm_decode_object_end(
|
||||
&service_request[decode_len],
|
||||
len = rpm_decode_object_end(&service_request[decode_len],
|
||||
service_len - decode_len);
|
||||
if (len == 1) {
|
||||
decode_len++;
|
||||
len = rpm_ack_encode_apdu_object_end(&Temp_Buf[0]);
|
||||
copy_len = apdu_copy(
|
||||
&Handler_Transmit_Buffer[npdu_len], &Temp_Buf[0],
|
||||
apdu_len, len,
|
||||
sizeof(Handler_Transmit_Buffer));
|
||||
copy_len =
|
||||
apdu_copy(&Handler_Transmit_Buffer[npdu_len], &Temp_Buf[0],
|
||||
apdu_len, len, sizeof(Handler_Transmit_Buffer));
|
||||
if (!copy_len) {
|
||||
apdu_len = abort_encode_apdu(
|
||||
&Handler_Transmit_Buffer[npdu_len],
|
||||
apdu_len =
|
||||
abort_encode_apdu(&Handler_Transmit_Buffer[npdu_len],
|
||||
service_data->invoke_id,
|
||||
ABORT_REASON_SEGMENTATION_NOT_SUPPORTED,
|
||||
true);
|
||||
ABORT_REASON_SEGMENTATION_NOT_SUPPORTED, true);
|
||||
goto RPM_ABORT;
|
||||
} else {
|
||||
apdu_len += copy_len;
|
||||
}
|
||||
} else {
|
||||
apdu_len = abort_encode_apdu(
|
||||
&Handler_Transmit_Buffer[npdu_len],
|
||||
service_data->invoke_id,
|
||||
ABORT_REASON_OTHER, true);
|
||||
apdu_len =
|
||||
abort_encode_apdu(&Handler_Transmit_Buffer[npdu_len],
|
||||
service_data->invoke_id, ABORT_REASON_OTHER, true);
|
||||
goto RPM_ABORT;
|
||||
}
|
||||
break;
|
||||
}
|
||||
len = rpm_ack_encode_apdu_object_begin(
|
||||
&Temp_Buf[0],
|
||||
len = rpm_ack_encode_apdu_object_begin(&Temp_Buf[0],
|
||||
object_type, object_instance);
|
||||
copy_len = apdu_copy(
|
||||
&Handler_Transmit_Buffer[npdu_len], &Temp_Buf[0],
|
||||
apdu_len, len,
|
||||
sizeof(Handler_Transmit_Buffer));
|
||||
copy_len = apdu_copy(&Handler_Transmit_Buffer[npdu_len], &Temp_Buf[0],
|
||||
apdu_len, len, sizeof(Handler_Transmit_Buffer));
|
||||
if (!copy_len) {
|
||||
apdu_len = abort_encode_apdu(
|
||||
&Handler_Transmit_Buffer[npdu_len],
|
||||
apdu_len = abort_encode_apdu(&Handler_Transmit_Buffer[npdu_len],
|
||||
service_data->invoke_id,
|
||||
ABORT_REASON_SEGMENTATION_NOT_SUPPORTED,
|
||||
true);
|
||||
ABORT_REASON_SEGMENTATION_NOT_SUPPORTED, true);
|
||||
goto RPM_ABORT;
|
||||
} else {
|
||||
apdu_len += copy_len;
|
||||
}
|
||||
/* do each property of this object of the RPM request */
|
||||
do
|
||||
{
|
||||
len = rpm_decode_object_property(
|
||||
&service_request[decode_len],
|
||||
service_len - decode_len,
|
||||
&object_property,
|
||||
&array_index);
|
||||
do {
|
||||
len = rpm_decode_object_property(&service_request[decode_len],
|
||||
service_len - decode_len, &object_property, &array_index);
|
||||
/* end of property list? */
|
||||
if (len > 0) {
|
||||
decode_len += len;
|
||||
} else {
|
||||
len = rpm_decode_object_end(
|
||||
&service_request[decode_len],
|
||||
len = rpm_decode_object_end(&service_request[decode_len],
|
||||
service_len - decode_len);
|
||||
if (len == 1) {
|
||||
decode_len++;
|
||||
len = rpm_ack_encode_apdu_object_end(&Temp_Buf[0]);
|
||||
copy_len = apdu_copy(
|
||||
&Handler_Transmit_Buffer[npdu_len], &Temp_Buf[0],
|
||||
apdu_len, len,
|
||||
copy_len =
|
||||
apdu_copy(&Handler_Transmit_Buffer[npdu_len],
|
||||
&Temp_Buf[0], apdu_len, len,
|
||||
sizeof(Handler_Transmit_Buffer));
|
||||
if (!copy_len) {
|
||||
apdu_len = abort_encode_apdu(
|
||||
&Handler_Transmit_Buffer[npdu_len],
|
||||
service_data->invoke_id,
|
||||
ABORT_REASON_SEGMENTATION_NOT_SUPPORTED,
|
||||
true);
|
||||
apdu_len =
|
||||
abort_encode_apdu(&Handler_Transmit_Buffer
|
||||
[npdu_len], service_data->invoke_id,
|
||||
ABORT_REASON_SEGMENTATION_NOT_SUPPORTED, true);
|
||||
goto RPM_ABORT;
|
||||
} else {
|
||||
apdu_len += copy_len;
|
||||
}
|
||||
} else {
|
||||
apdu_len = abort_encode_apdu(
|
||||
&Handler_Transmit_Buffer[npdu_len],
|
||||
service_data->invoke_id,
|
||||
ABORT_REASON_OTHER, true);
|
||||
apdu_len =
|
||||
abort_encode_apdu(&Handler_Transmit_Buffer[npdu_len],
|
||||
service_data->invoke_id, ABORT_REASON_OTHER, true);
|
||||
goto RPM_ABORT;
|
||||
}
|
||||
/* stop decoding properties */
|
||||
@@ -434,8 +401,7 @@ void handler_read_property_multiple(
|
||||
/* handle the special properties */
|
||||
if ((object_property == PROP_ALL) ||
|
||||
(object_property == PROP_REQUIRED) ||
|
||||
(object_property == PROP_OPTIONAL))
|
||||
{
|
||||
(object_property == PROP_OPTIONAL)) {
|
||||
struct special_property_list_t property_list;
|
||||
unsigned property_count = 0;
|
||||
unsigned index = 0;
|
||||
@@ -443,63 +409,50 @@ void handler_read_property_multiple(
|
||||
|
||||
special_object_property = object_property;
|
||||
RPM_Property_List(object_type, &property_list);
|
||||
property_count = RPM_Object_Property_Count(
|
||||
&property_list,
|
||||
property_count = RPM_Object_Property_Count(&property_list,
|
||||
special_object_property);
|
||||
for (index = 0; index < property_count; index++)
|
||||
{
|
||||
object_property = RPM_Object_Property(
|
||||
&property_list,
|
||||
special_object_property,
|
||||
index);
|
||||
len = RPM_Encode_Property(
|
||||
&Handler_Transmit_Buffer[0],
|
||||
for (index = 0; index < property_count; index++) {
|
||||
object_property = RPM_Object_Property(&property_list,
|
||||
special_object_property, index);
|
||||
len = RPM_Encode_Property(&Handler_Transmit_Buffer[0],
|
||||
npdu_len + apdu_len,
|
||||
sizeof(Handler_Transmit_Buffer),
|
||||
object_type,
|
||||
object_instance,
|
||||
object_property,
|
||||
array_index);
|
||||
object_instance, object_property, array_index);
|
||||
if (len > 0) {
|
||||
apdu_len += len;
|
||||
} else {
|
||||
apdu_len = abort_encode_apdu(
|
||||
&Handler_Transmit_Buffer[npdu_len],
|
||||
service_data->invoke_id,
|
||||
ABORT_REASON_SEGMENTATION_NOT_SUPPORTED, true);
|
||||
goto RPM_ABORT;
|
||||
apdu_len =
|
||||
abort_encode_apdu(&Handler_Transmit_Buffer
|
||||
[npdu_len], service_data->invoke_id,
|
||||
ABORT_REASON_SEGMENTATION_NOT_SUPPORTED, true);
|
||||
goto RPM_ABORT;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
/* handle an individual property */
|
||||
len = RPM_Encode_Property(
|
||||
&Handler_Transmit_Buffer[0],
|
||||
len = RPM_Encode_Property(&Handler_Transmit_Buffer[0],
|
||||
npdu_len + apdu_len,
|
||||
sizeof(Handler_Transmit_Buffer),
|
||||
object_type,
|
||||
object_instance,
|
||||
object_property,
|
||||
array_index);
|
||||
object_instance, object_property, array_index);
|
||||
if (len > 0) {
|
||||
apdu_len += len;
|
||||
} else {
|
||||
apdu_len = abort_encode_apdu(
|
||||
&Handler_Transmit_Buffer[npdu_len],
|
||||
service_data->invoke_id,
|
||||
ABORT_REASON_SEGMENTATION_NOT_SUPPORTED, true);
|
||||
goto RPM_ABORT;
|
||||
apdu_len =
|
||||
abort_encode_apdu(&Handler_Transmit_Buffer[npdu_len],
|
||||
service_data->invoke_id,
|
||||
ABORT_REASON_SEGMENTATION_NOT_SUPPORTED, true);
|
||||
goto RPM_ABORT;
|
||||
}
|
||||
}
|
||||
} while(1);
|
||||
} while (1);
|
||||
if (decode_len >= service_len) {
|
||||
break;
|
||||
}
|
||||
} while(1);
|
||||
RPM_ABORT:
|
||||
} while (1);
|
||||
RPM_ABORT:
|
||||
pdu_len = apdu_len + npdu_len;
|
||||
bytes_sent = datalink_send_pdu(
|
||||
src,
|
||||
&npdu_data,
|
||||
&Handler_Transmit_Buffer[0],
|
||||
pdu_len);
|
||||
bytes_sent = datalink_send_pdu(src,
|
||||
&npdu_data, &Handler_Transmit_Buffer[0], pdu_len);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user