Got rid of the handler-set functions for RP,RPM,WP,RD. Just referencing the device object functions directly.

This commit is contained in:
skarg
2010-02-18 03:06:03 +00:00
parent 2b2077a329
commit 1f9c13d37b
10 changed files with 196 additions and 237 deletions
+4 -10
View File
@@ -37,16 +37,11 @@
#include "abort.h" #include "abort.h"
#include "reject.h" #include "reject.h"
#include "rd.h" #include "rd.h"
/* custom handling in device object */
#include "device.h"
/** @file h_rd.c Handles Reinitialize Device requests. */ /** @file h_rd.c Handles Reinitialize Device requests. */
static reinitialize_device_function Reinitialize_Device_Function;
void handler_reinitialize_device_function_set(
reinitialize_device_function pFunction)
{
Reinitialize_Device_Function = pFunction;
}
void handler_reinitialize_device( void handler_reinitialize_device(
uint8_t * service_request, uint8_t * service_request,
uint16_t service_len, uint16_t service_len,
@@ -114,8 +109,7 @@ void handler_reinitialize_device(
"ReinitializeDevice: Sending Reject - undefined enumeration\n"); "ReinitializeDevice: Sending Reject - undefined enumeration\n");
#endif #endif
} else { } else {
if (Reinitialize_Device_Function && if (Device_Reinitialize(&rd_data)) {
Reinitialize_Device_Function(&rd_data)) {
len = len =
encode_simple_ack(&Handler_Transmit_Buffer[pdu_len], encode_simple_ack(&Handler_Transmit_Buffer[pdu_len],
service_data->invoke_id, service_data->invoke_id,
@@ -130,7 +124,7 @@ void handler_reinitialize_device(
rd_data.error_class, rd_data.error_code); rd_data.error_class, rd_data.error_code);
#if PRINT_ENABLED #if PRINT_ENABLED
fprintf(stderr, fprintf(stderr,
"ReinitializeDevice: Sending Error - password failure.\n"); "ReinitializeDevice: Sending Error.\n");
#endif #endif
} }
} }
+27 -36
View File
@@ -37,18 +37,11 @@
#include "npdu.h" #include "npdu.h"
#include "abort.h" #include "abort.h"
#include "rp.h" #include "rp.h"
/* device object has custom handler for all objects */
#include "device.h"
/** @file h_rp.c Handles Read Property requests. */ /** @file h_rp.c Handles Read Property requests. */
/* function that handles the reading of properties from objects */
static read_property_function Read_Property_Function;
void handler_read_property_function_set(
read_property_function pFunction)
{
Read_Property_Function = pFunction;
}
void handler_read_property( void handler_read_property(
uint8_t * service_request, uint8_t * service_request,
uint16_t service_len, uint16_t service_len,
@@ -100,37 +93,35 @@ void handler_read_property(
} }
/* assume that there is an error */ /* assume that there is an error */
error = true; error = true;
if (Read_Property_Function) { apdu_len = rp_ack_encode_apdu_init(
apdu_len = rp_ack_encode_apdu_init( &Handler_Transmit_Buffer[npdu_len],
&Handler_Transmit_Buffer[npdu_len], service_data->invoke_id,
service_data->invoke_id, &rpdata);
&rpdata); /* configure our storage */
/* configure our storage */ rpdata.application_data = &Handler_Transmit_Buffer[npdu_len+apdu_len];
rpdata.application_data = &Handler_Transmit_Buffer[npdu_len+apdu_len]; rpdata.application_data_len =
rpdata.application_data_len = sizeof(Handler_Transmit_Buffer) - (npdu_len + apdu_len);
sizeof(Handler_Transmit_Buffer) - (npdu_len + apdu_len); len = Device_Read_Property(&rpdata);
len = Read_Property_Function(&rpdata); if (len >= 0) {
if (len >= 0) { apdu_len += len;
apdu_len += len; len = rp_ack_encode_apdu_object_property_end(
len = rp_ack_encode_apdu_object_property_end( &Handler_Transmit_Buffer[npdu_len+apdu_len]);
&Handler_Transmit_Buffer[npdu_len+apdu_len]); apdu_len += len;
apdu_len += len; if (apdu_len > service_data->max_resp) {
if (apdu_len > service_data->max_resp) { /* too big for the sender - send an abort */
/* too big for the sender - send an abort */ apdu_len =
apdu_len = abort_encode_apdu(&Handler_Transmit_Buffer[npdu_len],
abort_encode_apdu(&Handler_Transmit_Buffer[npdu_len], service_data->invoke_id, ABORT_REASON_SEGMENTATION_NOT_SUPPORTED,
service_data->invoke_id, ABORT_REASON_SEGMENTATION_NOT_SUPPORTED, true);
true);
#if PRINT_ENABLED #if PRINT_ENABLED
fprintf(stderr, "RP: Message too large. Sending Abort!\n"); fprintf(stderr, "RP: Message too large. Sending Abort!\n");
#endif #endif
goto RP_ABORT; goto RP_ABORT;
} else { } else {
#if PRINT_ENABLED #if PRINT_ENABLED
fprintf(stderr, "RP: Sending Ack!\n"); fprintf(stderr, "RP: Sending Ack!\n");
#endif #endif
error = false; error = false;
}
} }
} }
if (error) { if (error) {
+12 -28
View File
@@ -38,25 +38,11 @@
#include "abort.h" #include "abort.h"
#include "rpm.h" #include "rpm.h"
#include "handlers.h" #include "handlers.h"
/* device object has custom handler for all objects */
#include "device.h"
/** @file h_rpm.c Handles Read Property Multiple requests. */ /** @file h_rpm.c Handles Read Property Multiple requests. */
/* function that handles the reading of properties from objects */
static read_property_function Read_Property_Function;
static rpm_object_property_lists_function RPM_Property_List;
void handler_rpm_function_set(
read_property_function pFunction)
{
Read_Property_Function = pFunction;
}
void handler_rpm_list_set(
rpm_object_property_lists_function pFunction)
{
RPM_Property_List = pFunction;
}
static uint8_t Temp_Buf[MAX_APDU] = { 0 }; static uint8_t Temp_Buf[MAX_APDU] = { 0 };
static BACNET_PROPERTY_ID RPM_Object_Property( static BACNET_PROPERTY_ID RPM_Object_Property(
@@ -137,17 +123,15 @@ static int RPM_Encode_Property(
} }
apdu_len += len; apdu_len += len;
len = 0; len = 0;
if (Read_Property_Function) { rpdata.error_class = ERROR_CLASS_OBJECT;
rpdata.error_class = ERROR_CLASS_OBJECT; rpdata.error_code = ERROR_CODE_UNKNOWN_OBJECT;
rpdata.error_code = ERROR_CODE_UNKNOWN_OBJECT; rpdata.object_type = object_type;
rpdata.object_type = object_type; rpdata.object_instance = object_instance;
rpdata.object_instance = object_instance; rpdata.object_property = object_property;
rpdata.object_property = object_property; rpdata.array_index = array_index;
rpdata.array_index = array_index; rpdata.application_data = &Temp_Buf[0];
rpdata.application_data = &Temp_Buf[0]; rpdata.application_data_len = sizeof(Temp_Buf);
rpdata.application_data_len = sizeof(Temp_Buf); len = Device_Read_Property(&rpdata);
len = Read_Property_Function(&rpdata);
}
if (len < 0) { if (len < 0) {
/* error was returned - encode that for the response */ /* error was returned - encode that for the response */
len = len =
@@ -311,7 +295,7 @@ void handler_read_property_multiple(
BACNET_PROPERTY_ID special_object_property; BACNET_PROPERTY_ID special_object_property;
special_object_property = object_property; special_object_property = object_property;
RPM_Property_List(object_type, &property_list); Device_Objects_Property_List(object_type, &property_list);
property_count = property_count =
RPM_Object_Property_Count(&property_list, RPM_Object_Property_Count(&property_list,
special_object_property); special_object_property);
+73 -71
View File
@@ -65,6 +65,13 @@
long int timezone; long int timezone;
#endif #endif
/* forward prototypes */
static int Device_Read_Property_Local(
BACNET_READ_PROPERTY_DATA *rpdata);
static bool Device_Write_Property_Local(
BACNET_WRITE_PROPERTY_DATA * wp_data);
/* all object helper functions */
static struct object_functions { static struct object_functions {
BACNET_OBJECT_TYPE Object_Type; BACNET_OBJECT_TYPE Object_Type;
object_init_function Object_Init; object_init_function Object_Init;
@@ -84,8 +91,8 @@ static struct object_functions {
Device_Index_To_Instance, Device_Index_To_Instance,
Device_Valid_Object_Instance_Number, Device_Valid_Object_Instance_Number,
Device_Name, Device_Name,
Device_Read_Property, Device_Read_Property_Local,
Device_Write_Property, Device_Write_Property_Local,
Device_Property_Lists, Device_Property_Lists,
DeviceGetRRInfo}, DeviceGetRRInfo},
{OBJECT_ANALOG_INPUT, {OBJECT_ANALOG_INPUT,
@@ -243,67 +250,6 @@ rr_info_function Device_Objects_RR_Info(
return(pObject != NULL ? pObject->Object_RR_Info : NULL); return(pObject != NULL ? pObject->Object_RR_Info : NULL);
} }
/* Encodes the property APDU and returns the length,
or sets the error, and returns -1 */
int Device_Objects_Read_Property(
BACNET_READ_PROPERTY_DATA *rpdata)
{
int apdu_len = -1;
struct object_functions *pObject = NULL;
/* 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);
if (pObject != NULL) {
if (pObject->Object_Valid_Instance &&
pObject->Object_Valid_Instance(rpdata->object_instance)) {
if (pObject->Object_Read_Property) {
apdu_len = pObject->Object_Read_Property(rpdata);
}
} else {
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_UNSUPPORTED_OBJECT_TYPE;
}
return apdu_len;
}
bool Device_Objects_Write_Property(
BACNET_WRITE_PROPERTY_DATA * wp_data)
{
int apdu_len = -1;
struct object_functions *pObject = NULL;
/* initialize the default return values */
wp_data->error_class = ERROR_CLASS_OBJECT;
wp_data->error_code = ERROR_CODE_UNKNOWN_OBJECT;
pObject = Device_Objects_Find_Functions(wp_data->object_type);
if (pObject != NULL) {
if (pObject->Object_Valid_Instance &&
pObject->Object_Valid_Instance(wp_data->object_instance)) {
if (pObject->Object_Write_Property) {
apdu_len = pObject->Object_Write_Property(wp_data);
} else {
wp_data->error_class = ERROR_CLASS_PROPERTY;
wp_data->error_code = ERROR_CODE_WRITE_ACCESS_DENIED;
}
} else {
wp_data->error_class = ERROR_CLASS_OBJECT;
wp_data->error_code = ERROR_CODE_UNKNOWN_OBJECT;
}
} else {
wp_data->error_class = ERROR_CLASS_OBJECT;
wp_data->error_code = ERROR_CODE_UNSUPPORTED_OBJECT_TYPE;
}
return apdu_len;
}
static unsigned property_list_count( static unsigned property_list_count(
const int *pList) const int *pList)
{ {
@@ -320,7 +266,7 @@ static unsigned property_list_count(
} }
/* for a given object type, returns the special property list */ /* for a given object type, returns the special property list */
static void Device_Objects_Property_List( void Device_Objects_Property_List(
BACNET_OBJECT_TYPE object_type, BACNET_OBJECT_TYPE object_type,
struct special_property_list_t *pPropertyList) struct special_property_list_t *pPropertyList)
{ {
@@ -977,7 +923,7 @@ int tm_isdst Daylight Savings flag.
/* return the length of the apdu encoded or -1 for error or /* return the length of the apdu encoded or -1 for error or
-2 for abort message */ -2 for abort message */
int Device_Read_Property( static int Device_Read_Property_Local(
BACNET_READ_PROPERTY_DATA *rpdata) BACNET_READ_PROPERTY_DATA *rpdata)
{ {
int apdu_len = 0; /* return value */ int apdu_len = 0; /* return value */
@@ -1217,8 +1163,38 @@ int Device_Read_Property(
return apdu_len; return apdu_len;
} }
/* Encodes the property APDU and returns the length,
or sets the error, and returns -1 */
int Device_Read_Property(
BACNET_READ_PROPERTY_DATA *rpdata)
{
int apdu_len = -1;
struct object_functions *pObject = NULL;
/* 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);
if (pObject != NULL) {
if (pObject->Object_Valid_Instance &&
pObject->Object_Valid_Instance(rpdata->object_instance)) {
if (pObject->Object_Read_Property) {
apdu_len = pObject->Object_Read_Property(rpdata);
}
} else {
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_UNSUPPORTED_OBJECT_TYPE;
}
return apdu_len;
}
/* returns true if successful */ /* returns true if successful */
bool Device_Write_Property( static bool Device_Write_Property_Local(
BACNET_WRITE_PROPERTY_DATA * wp_data) BACNET_WRITE_PROPERTY_DATA * wp_data)
{ {
bool status = false; /* return value */ bool status = false; /* return value */
@@ -1383,17 +1359,43 @@ bool Device_Write_Property(
return status; return status;
} }
bool Device_Write_Property(
BACNET_WRITE_PROPERTY_DATA * wp_data)
{
int apdu_len = -1;
struct object_functions *pObject = NULL;
/* initialize the default return values */
wp_data->error_class = ERROR_CLASS_OBJECT;
wp_data->error_code = ERROR_CODE_UNKNOWN_OBJECT;
pObject = Device_Objects_Find_Functions(wp_data->object_type);
if (pObject != NULL) {
if (pObject->Object_Valid_Instance &&
pObject->Object_Valid_Instance(wp_data->object_instance)) {
if (pObject->Object_Write_Property) {
apdu_len = pObject->Object_Write_Property(wp_data);
} else {
wp_data->error_class = ERROR_CLASS_PROPERTY;
wp_data->error_code = ERROR_CODE_WRITE_ACCESS_DENIED;
}
} else {
wp_data->error_class = ERROR_CLASS_OBJECT;
wp_data->error_code = ERROR_CODE_UNKNOWN_OBJECT;
}
} else {
wp_data->error_class = ERROR_CLASS_OBJECT;
wp_data->error_code = ERROR_CODE_UNSUPPORTED_OBJECT_TYPE;
}
return apdu_len;
}
void Device_Init( void Device_Init(
void) void)
{ {
struct object_functions *pObject = NULL; struct object_functions *pObject = NULL;
handler_read_property_function_set(Device_Objects_Read_Property);
handler_rpm_function_set(Device_Objects_Read_Property);
handler_rpm_list_set(Device_Objects_Property_List);
handler_write_property_function_set(Device_Objects_Write_Property);
handler_rr_object_set(Device_Objects_RR_Info); handler_rr_object_set(Device_Objects_RR_Info);
handler_reinitialize_device_function_set(Device_Reinitialize);
pObject = &Object_Table[0]; pObject = &Object_Table[0];
while (pObject->Object_Type < MAX_BACNET_OBJECT_TYPE) { while (pObject->Object_Type < MAX_BACNET_OBJECT_TYPE) {
+2 -2
View File
@@ -1595,7 +1595,7 @@ static int local_read_property(
rpdata.object_property = Source->propertyIdentifier; rpdata.object_property = Source->propertyIdentifier;
rpdata.array_index = Source->arrayIndex; rpdata.array_index = Source->arrayIndex;
/* Try to fetch the required property */ /* Try to fetch the required property */
len = Device_Objects_Read_Property(&rpdata); len = Device_Read_Property(&rpdata);
if (len < 0) { if (len < 0) {
*error_class = rpdata.error_class; *error_class = rpdata.error_class;
*error_code = rpdata.error_code; *error_code = rpdata.error_code;
@@ -1607,7 +1607,7 @@ static int local_read_property(
rpdata.application_data_len = MAX_APDU; rpdata.application_data_len = MAX_APDU;
rpdata.object_property = PROP_STATUS_FLAGS; rpdata.object_property = PROP_STATUS_FLAGS;
rpdata.array_index = BACNET_ARRAY_ALL; rpdata.array_index = BACNET_ARRAY_ALL;
len = Device_Objects_Read_Property(&rpdata); len = Device_Read_Property(&rpdata);
if (len < 0) { if (len < 0) {
*error_class = rpdata.error_class; *error_class = rpdata.error_class;
*error_code = rpdata.error_code; *error_code = rpdata.error_code;
+8 -3
View File
@@ -39,7 +39,9 @@
#include "bacdef.h" #include "bacdef.h"
#include "bacenum.h" #include "bacenum.h"
#include "wp.h" #include "wp.h"
#include "rd.h"
#include "rp.h" #include "rp.h"
#include "rpm.h"
#include "readrange.h" #include "readrange.h"
typedef void ( typedef void (
@@ -68,10 +70,16 @@ extern "C" {
void Device_Init( void Device_Init(
void); void);
bool Device_Reinitialize(
BACNET_REINITIALIZE_DEVICE_DATA *rd_data);
void Device_Property_Lists( void Device_Property_Lists(
const int **pRequired, const int **pRequired,
const int **pOptional, const int **pOptional,
const int **pProprietary); const int **pProprietary);
void Device_Objects_Property_List(
BACNET_OBJECT_TYPE object_type,
struct special_property_list_t *pPropertyList);
uint32_t Device_Object_Instance_Number( uint32_t Device_Object_Instance_Number(
void); void);
@@ -160,9 +168,6 @@ extern "C" {
int object_type, int object_type,
uint32_t object_instance); uint32_t object_instance);
int Device_Objects_Read_Property(
BACNET_READ_PROPERTY_DATA *rpdata);
int Device_Read_Property( int Device_Read_Property(
BACNET_READ_PROPERTY_DATA *rpdata); BACNET_READ_PROPERTY_DATA *rpdata);
bool Device_Write_Property( bool Device_Write_Property(
-12
View File
@@ -79,8 +79,6 @@ extern "C" {
uint16_t service_len, uint16_t service_len,
BACNET_ADDRESS * src, BACNET_ADDRESS * src,
BACNET_CONFIRMED_SERVICE_DATA * service_data); BACNET_CONFIRMED_SERVICE_DATA * service_data);
void handler_read_property_function_set(
read_property_function pFunction);
void handler_rr_object_set( void handler_rr_object_set(
get_rr_info_fn pFunction1); get_rr_info_fn pFunction1);
@@ -96,8 +94,6 @@ extern "C" {
uint16_t service_len, uint16_t service_len,
BACNET_ADDRESS * src, BACNET_ADDRESS * src,
BACNET_CONFIRMED_SERVICE_DATA * service_data); BACNET_CONFIRMED_SERVICE_DATA * service_data);
void handler_write_property_function_set(
write_property_function pFunction);
bool WPValidateString( bool WPValidateString(
BACNET_APPLICATION_DATA_VALUE *pValue, BACNET_APPLICATION_DATA_VALUE *pValue,
@@ -135,16 +131,12 @@ extern "C" {
uint16_t service_len, uint16_t service_len,
BACNET_ADDRESS * src, BACNET_ADDRESS * src,
BACNET_CONFIRMED_SERVICE_DATA * service_data); BACNET_CONFIRMED_SERVICE_DATA * service_data);
void handler_reinitialize_device_function_set(
reinitialize_device_function pFunction);
void handler_device_communication_control( void handler_device_communication_control(
uint8_t * service_request, uint8_t * service_request,
uint16_t service_len, uint16_t service_len,
BACNET_ADDRESS * src, BACNET_ADDRESS * src,
BACNET_CONFIRMED_SERVICE_DATA * service_data); BACNET_CONFIRMED_SERVICE_DATA * service_data);
void handler_dcc_password_set(
char *new_password);
void handler_i_have( void handler_i_have(
uint8_t * service_request, uint8_t * service_request,
@@ -166,10 +158,6 @@ extern "C" {
uint16_t service_len, uint16_t service_len,
BACNET_ADDRESS * src, BACNET_ADDRESS * src,
BACNET_CONFIRMED_SERVICE_DATA * service_data); BACNET_CONFIRMED_SERVICE_DATA * service_data);
void handler_rpm_function_set(
read_property_function pFunction);
void handler_rpm_list_set(
rpm_object_property_lists_function pFunction);
void handler_read_property_multiple_ack( void handler_read_property_multiple_ack(
uint8_t * service_request, uint8_t * service_request,
+35 -52
View File
@@ -54,6 +54,12 @@ static BACNET_DEVICE_STATUS System_Status = STATUS_OPERATIONAL;
static BACNET_REINITIALIZED_STATE_OF_DEVICE Reinitialize_State = static BACNET_REINITIALIZED_STATE_OF_DEVICE Reinitialize_State =
REINITIALIZED_STATE_IDLE; REINITIALIZED_STATE_IDLE;
/* forward prototypes */
int Device_Read_Property_Local(
BACNET_READ_PROPERTY_DATA *rpdata);
bool Device_Write_Property_Local(
BACNET_WRITE_PROPERTY_DATA * wp_data);
static struct object_functions { static struct object_functions {
BACNET_OBJECT_TYPE Object_Type; BACNET_OBJECT_TYPE Object_Type;
object_init_function Object_Init; object_init_function Object_Init;
@@ -72,8 +78,8 @@ static struct object_functions {
Device_Index_To_Instance, Device_Index_To_Instance,
Device_Valid_Object_Instance_Number, Device_Valid_Object_Instance_Number,
Device_Name, Device_Name,
Device_Read_Property, Device_Read_Property_Local,
Device_Write_Property, Device_Write_Property_Local,
Device_Property_Lists}, Device_Property_Lists},
{OBJECT_ANALOG_INPUT, {OBJECT_ANALOG_INPUT,
Analog_Input_Init, Analog_Input_Init,
@@ -169,7 +175,7 @@ void Device_Property_Lists(
/* Encodes the property APDU and returns the length, /* Encodes the property APDU and returns the length,
or sets the error, and returns -1 */ or sets the error, and returns -1 */
int Device_Objects_Read_Property( int Device_Read_Property(
BACNET_READ_PROPERTY_DATA *rpdata) BACNET_READ_PROPERTY_DATA *rpdata)
{ {
int apdu_len = -1; int apdu_len = -1;
@@ -207,7 +213,7 @@ int Device_Objects_Read_Property(
return apdu_len; return apdu_len;
} }
bool Device_Objects_Write_Property( bool Device_Write_Property(
BACNET_WRITE_PROPERTY_DATA * wp_data) BACNET_WRITE_PROPERTY_DATA * wp_data)
{ {
int apdu_len = -1; int apdu_len = -1;
@@ -264,7 +270,7 @@ static unsigned property_list_count(
} }
/* for a given object type, returns the special property list */ /* for a given object type, returns the special property list */
static void Device_Objects_Property_List( void Device_Objects_Property_List(
BACNET_OBJECT_TYPE object_type, BACNET_OBJECT_TYPE object_type,
struct special_property_list_t *pPropertyList) struct special_property_list_t *pPropertyList)
{ {
@@ -431,46 +437,6 @@ char *Device_Valid_Object_Id(
return name; return name;
} }
bool Device_Reinitialize(
BACNET_REINITIALIZE_DEVICE_DATA *rd_data)
{
bool status = false;
if (characterstring_ansi_same(&rd_data->password, "Jesus")) {
switch (rd_data->state) {
case REINITIALIZED_STATE_COLD_START:
break;
case REINITIALIZED_STATE_WARM_START:
break;
case REINITIALIZED_STATE_START_BACKUP:
break;
case REINITIALIZED_STATE_END_BACKUP:
break;
case REINITIALIZED_STATE_START_RESTORE:
break;
case REINITIALIZED_STATE_END_RESTORE:
break;
case REINITIALIZED_STATE_ABORT_RESTORE:
break;
default:
break;
}
Reinitialize_State = rd_data->state;
/* Note: you could use a mix of state
and password to multiple things */
/* note: you probably want to restart *after* the
simple ack has been sent from the return handler
so just set a flag from here */
dcc_set_status_duration(COMMUNICATION_ENABLE, 0);
status = true;
} else {
rd_data->error_class = ERROR_CLASS_SECURITY;
rd_data->error_code = ERROR_CODE_PASSWORD_FAILURE;
}
return status;
}
unsigned Device_Count(void) unsigned Device_Count(void)
{ {
return 1; return 1;
@@ -492,6 +458,28 @@ char *Device_Name(
return NULL; return NULL;
} }
bool Device_Reinitialize(
BACNET_REINITIALIZE_DEVICE_DATA *rd_data)
{
bool status = false;
if (characterstring_ansi_same(&rd_data->password, "filister")) {
Reinitialize_State = rd_data->state;
dcc_set_status_duration(COMMUNICATION_ENABLE, 0);
/* Note: you could use a mix of state
and password to multiple things */
/* note: you probably want to restart *after* the
simple ack has been sent from the return handler
so just set a flag from here */
status = true;
} else {
rd_data->error_class = ERROR_CLASS_SECURITY;
rd_data->error_code = ERROR_CODE_PASSWORD_FAILURE;
}
return status;
}
void Device_Init( void Device_Init(
void) void)
{ {
@@ -505,11 +493,6 @@ void Device_Init(
(char *)&Object_Instance_Number, (char *)&Object_Instance_Number,
sizeof(Object_Instance_Number), sizeof(Object_Instance_Number),
EEPROM_BACNET_ID_ADDR); */ EEPROM_BACNET_ID_ADDR); */
handler_read_property_function_set(Device_Objects_Read_Property);
handler_rpm_function_set(Device_Objects_Read_Property);
handler_rpm_list_set(Device_Objects_Property_List);
handler_write_property_function_set(Device_Objects_Write_Property);
handler_reinitialize_device_function_set(Device_Reinitialize);
pObject = &Object_Table[0]; pObject = &Object_Table[0];
while (pObject->Object_Type < MAX_BACNET_OBJECT_TYPE) { while (pObject->Object_Type < MAX_BACNET_OBJECT_TYPE) {
if (pObject->Object_Init) { if (pObject->Object_Init) {
@@ -604,7 +587,7 @@ uint32_t Device_Database_Revision(
} }
/* return the length of the apdu encoded or -1 for error */ /* return the length of the apdu encoded or -1 for error */
int Device_Read_Property( int Device_Read_Property_Local(
BACNET_READ_PROPERTY_DATA *rpdata) BACNET_READ_PROPERTY_DATA *rpdata)
{ {
int apdu_len = 0; /* return value */ int apdu_len = 0; /* return value */
@@ -853,7 +836,7 @@ int Device_Read_Property(
return apdu_len; return apdu_len;
} }
bool Device_Write_Property( bool Device_Write_Property_Local(
BACNET_WRITE_PROPERTY_DATA * wp_data) BACNET_WRITE_PROPERTY_DATA * wp_data)
{ {
bool status = false; /* return value */ bool status = false; /* return value */
+4 -4
View File
@@ -59,7 +59,6 @@ CSRC = main.c \
eeprom.c \ eeprom.c \
seeprom.c \ seeprom.c \
dlmstp.c \ dlmstp.c \
h_rd.c \
device.c \ device.c \
ai.c \ ai.c \
av.c \ av.c \
@@ -68,13 +67,14 @@ CSRC = main.c \
# common demo files needed # common demo files needed
DEMOSRC = $(BACNET_DEMO)/handler/txbuf.c \ DEMOSRC = $(BACNET_DEMO)/handler/txbuf.c \
$(BACNET_DEMO)/handler/h_npdu.c \
$(BACNET_DEMO)/handler/h_whois.c \
$(BACNET_DEMO)/handler/h_dcc.c \ $(BACNET_DEMO)/handler/h_dcc.c \
$(BACNET_DEMO)/handler/h_wp.c \ $(BACNET_DEMO)/handler/h_npdu.c \
$(BACNET_DEMO)/handler/h_rd.c \
$(BACNET_DEMO)/handler/h_rp.c \ $(BACNET_DEMO)/handler/h_rp.c \
$(BACNET_DEMO)/handler/h_rpm.c \ $(BACNET_DEMO)/handler/h_rpm.c \
$(BACNET_DEMO)/handler/h_whohas.c \ $(BACNET_DEMO)/handler/h_whohas.c \
$(BACNET_DEMO)/handler/h_whois.c \
$(BACNET_DEMO)/handler/h_wp.c \
$(BACNET_DEMO)/handler/s_iam.c \ $(BACNET_DEMO)/handler/s_iam.c \
$(BACNET_DEMO)/handler/s_ihave.c \ $(BACNET_DEMO)/handler/s_ihave.c \
$(BACNET_DEMO)/handler/noserv.c $(BACNET_DEMO)/handler/noserv.c
+31 -19
View File
@@ -46,6 +46,11 @@
#include "bi.h" #include "bi.h"
#include "bo.h" #include "bo.h"
/* forward prototype */
int Device_Read_Property_Local(
BACNET_READ_PROPERTY_DATA *rpdata);
bool Device_Write_Property_Local(
BACNET_WRITE_PROPERTY_DATA * wp_data);
static struct object_functions { static struct object_functions {
BACNET_OBJECT_TYPE Object_Type; BACNET_OBJECT_TYPE Object_Type;
@@ -65,8 +70,8 @@ static struct object_functions {
Device_Index_To_Instance, Device_Index_To_Instance,
Device_Valid_Object_Instance_Number, Device_Valid_Object_Instance_Number,
Device_Name, Device_Name,
Device_Read_Property, Device_Read_Property_Local,
Device_Write_Property, Device_Write_Property_Local,
Device_Property_Lists}, Device_Property_Lists},
{OBJECT_ANALOG_INPUT, {OBJECT_ANALOG_INPUT,
Analog_Input_Init, Analog_Input_Init,
@@ -225,7 +230,7 @@ static int Read_Property_Common(
/* Encodes the property APDU and returns the length, /* Encodes the property APDU and returns the length,
or sets the error, and returns -1 */ or sets the error, and returns -1 */
int Device_Objects_Read_Property( int Device_Read_Property(
BACNET_READ_PROPERTY_DATA *rpdata) BACNET_READ_PROPERTY_DATA *rpdata)
{ {
int apdu_len = -1; int apdu_len = -1;
@@ -249,7 +254,7 @@ int Device_Objects_Read_Property(
return apdu_len; return apdu_len;
} }
bool Device_Objects_Write_Property( bool Device_Write_Property(
BACNET_WRITE_PROPERTY_DATA * wp_data) BACNET_WRITE_PROPERTY_DATA * wp_data)
{ {
int apdu_len = -1; int apdu_len = -1;
@@ -294,7 +299,7 @@ static unsigned property_list_count(
} }
/* for a given object type, returns the special property list */ /* for a given object type, returns the special property list */
static void Device_Objects_Property_List( void Device_Objects_Property_List(
BACNET_OBJECT_TYPE object_type, BACNET_OBJECT_TYPE object_type,
struct special_property_list_t *pPropertyList) struct special_property_list_t *pPropertyList)
{ {
@@ -366,11 +371,26 @@ char *Device_Name(
return NULL; return NULL;
} }
void Device_Reinit( bool Device_Reinitialize(
void) BACNET_REINITIALIZE_DEVICE_DATA *rd_data)
{ {
dcc_set_status_duration(COMMUNICATION_ENABLE, 0); bool status = false;
Device_Set_Object_Instance_Number(BACNET_MAX_INSTANCE);
if (characterstring_ansi_same(&rd_data->password, "rehmite")) {
Reinitialize_State = rd_data->state;
dcc_set_status_duration(COMMUNICATION_ENABLE, 0);
/* Note: you could use a mix of state
and password to multiple things */
/* note: you probably want to restart *after* the
simple ack has been sent from the return handler
so just set a flag from here */
status = true;
} else {
rd_data->error_class = ERROR_CLASS_SECURITY;
rd_data->error_code = ERROR_CODE_PASSWORD_FAILURE;
}
return status;
} }
void Device_Init( void Device_Init(
@@ -378,11 +398,6 @@ void Device_Init(
{ {
struct object_functions *pObject = NULL; struct object_functions *pObject = NULL;
handler_read_property_function_set(Device_Objects_Read_Property);
handler_rpm_function_set(Device_Objects_Read_Property);
handler_rpm_list_set(Device_Objects_Property_List);
handler_write_property_function_set(Device_Objects_Write_Property);
pObject = &Object_Table[0]; pObject = &Object_Table[0];
while (pObject->Object_Type < MAX_BACNET_OBJECT_TYPE) { while (pObject->Object_Type < MAX_BACNET_OBJECT_TYPE) {
if (pObject->Object_Init) { if (pObject->Object_Init) {
@@ -390,9 +405,6 @@ void Device_Init(
} }
pObject++; pObject++;
} }
Reinitialize_State = REINITIALIZED_STATE_IDLE;
dcc_set_status_duration(COMMUNICATION_ENABLE, 0); dcc_set_status_duration(COMMUNICATION_ENABLE, 0);
/* Get the data from the eeprom */ /* Get the data from the eeprom */
eeprom_bytes_read(NV_EEPROM_DEVICE_0, (uint8_t *) & Object_Instance_Number, eeprom_bytes_read(NV_EEPROM_DEVICE_0, (uint8_t *) & Object_Instance_Number,
@@ -598,7 +610,7 @@ char *Device_Valid_Object_Id(
} }
/* return the length of the apdu encoded or -1 for error */ /* return the length of the apdu encoded or -1 for error */
int Device_Read_Property( int Device_Read_Property_Local(
BACNET_READ_PROPERTY_DATA *rpdata) BACNET_READ_PROPERTY_DATA *rpdata)
{ {
int apdu_len = 0; /* return value */ int apdu_len = 0; /* return value */
@@ -796,7 +808,7 @@ int Device_Read_Property(
return apdu_len; return apdu_len;
} }
bool Device_Write_Property( bool Device_Write_Property_Local(
BACNET_WRITE_PROPERTY_DATA * wp_data) BACNET_WRITE_PROPERTY_DATA * wp_data)
{ {
bool status = false; /* return value */ bool status = false; /* return value */