diff --git a/bacnet-stack/demo/object/ai.c b/bacnet-stack/demo/object/ai.c index 3ce52a84..135da111 100644 --- a/bacnet-stack/demo/object/ai.c +++ b/bacnet-stack/demo/object/ai.c @@ -843,6 +843,72 @@ void Analog_Input_Intrinsic_Reporting(uint32_t object_instance) } +int Analog_Input_Event_Information(unsigned index, + BACNET_GET_EVENT_INFORMATION_DATA * getevent_data) +{ +#if defined(INTRINSIC_REPORTING) + bool isNotAckedTransitions; + bool IsActiveEvent; + int i; + + + /* check index */ + if (index < MAX_ANALOG_INPUTS) { + /* Event_State not equal to NORMAL */ + IsActiveEvent = (AI_Descr[index].Event_State != EVENT_STATE_NORMAL); + + /* Acked_Transitions property, which has at least one of the bits + (TO-OFFNORMAL, TO-FAULT, TONORMAL) set to FALSE. */ + + /* FIXME: finish it */ + isNotAckedTransitions = false; + } + else + return -1; /* end of list */ + + if ((IsActiveEvent) || (isNotAckedTransitions)) { + /* Object Identifier */ + getevent_data->objectIdentifier.type = OBJECT_ANALOG_INPUT; + getevent_data->objectIdentifier.instance = Analog_Input_Index_To_Instance(index); + /* Event State */ + getevent_data->eventState = AI_Descr[index].Event_State; + /* Acknowledged Transitions */ + /* FIXME: finish it */ + bitstring_init(&getevent_data->acknowledgedTransitions); + bitstring_set_bit(&getevent_data->acknowledgedTransitions, TRANSITION_TO_OFFNORMAL, true); + bitstring_set_bit(&getevent_data->acknowledgedTransitions, TRANSITION_TO_FAULT, true); + bitstring_set_bit(&getevent_data->acknowledgedTransitions, TRANSITION_TO_NORMAL, true); + /* Event Time Stamps */ + for (i = 0; i < 3; i++) { + getevent_data->eventTimeStamps[i].tag = TIME_STAMP_DATETIME; + getevent_data->eventTimeStamps[i].value.dateTime = + AI_Descr[index].Event_Time_Stamps[i]; + } + /* Notify Type */ + getevent_data->notifyType = AI_Descr[index].Notify_Type; + /* Event Enable */ + bitstring_init(&getevent_data->eventEnable); + bitstring_set_bit(&getevent_data->eventEnable, TRANSITION_TO_OFFNORMAL, + (AI_Descr[index].Event_Enable & EVENT_ENABLE_TO_OFFNORMAL) ? true : false ); + bitstring_set_bit(&getevent_data->eventEnable, TRANSITION_TO_FAULT, + (AI_Descr[index].Event_Enable & EVENT_ENABLE_TO_FAULT ) ? true : false ); + bitstring_set_bit(&getevent_data->eventEnable, TRANSITION_TO_NORMAL, + (AI_Descr[index].Event_Enable & EVENT_ENABLE_TO_NORMAL ) ? true : false ); + /* Event Priorities */ + /* FIXME: finish it */ + getevent_data->eventPriorities[0] = 255; + getevent_data->eventPriorities[1] = 255; + getevent_data->eventPriorities[2] = 255; + + return 1; /* active event */ + } + else + return 0; /* no active event at this index */ +#endif /* defined(INTRINSIC_REPORTING) */ +} + + + #ifdef TEST #include #include diff --git a/bacnet-stack/demo/object/ai.h b/bacnet-stack/demo/object/ai.h index b240b376..3701609e 100644 --- a/bacnet-stack/demo/object/ai.h +++ b/bacnet-stack/demo/object/ai.h @@ -109,6 +109,9 @@ extern "C" { void Analog_Input_Intrinsic_Reporting(uint32_t object_instance); + int Analog_Input_Event_Information(unsigned index, + BACNET_GET_EVENT_INFORMATION_DATA * getevent_data); + void Analog_Input_Init( void); diff --git a/bacnet-stack/demo/object/av.c b/bacnet-stack/demo/object/av.c index cea9e1bf..71a7fe46 100644 --- a/bacnet-stack/demo/object/av.c +++ b/bacnet-stack/demo/object/av.c @@ -37,6 +37,7 @@ #include "bacapp.h" #include "bactext.h" #include "config.h" /* the custom stuff */ +#include "getevent.h" #include "wp.h" #include "rp.h" #include "nc.h" @@ -495,7 +496,7 @@ int Analog_Value_Read_Property( default: rpdata->error_class = ERROR_CLASS_PROPERTY; - rpdata->error_code = ERROR_CODE_UNKNOWN_PROPERTY; + rpdata->error_code = ERROR_CODE_UNKNOWN_PROPERTY; apdu_len = BACNET_STATUS_ERROR; break; } @@ -953,6 +954,70 @@ void Analog_Value_Intrinsic_Reporting(uint32_t object_instance) #endif /* defined(INTRINSIC_REPORTING) */ } +int Analog_Value_Event_Information(unsigned index, + BACNET_GET_EVENT_INFORMATION_DATA * getevent_data) +{ +#if defined(INTRINSIC_REPORTING) + bool isNotAckedTransitions; + bool IsActiveEvent; + int i; + + + /* check index */ + if (index < MAX_ANALOG_VALUES) { + /* Event_State not equal to NORMAL */ + IsActiveEvent = (AV_Descr[index].Event_State != EVENT_STATE_NORMAL); + + /* Acked_Transitions property, which has at least one of the bits + (TO-OFFNORMAL, TO-FAULT, TONORMAL) set to FALSE. */ + + /* FIXME: finish it */ + isNotAckedTransitions = false; + } + else + return -1; /* end of list */ + + if ((IsActiveEvent) || (isNotAckedTransitions)) { + /* Object Identifier */ + getevent_data->objectIdentifier.type = OBJECT_ANALOG_VALUE; + getevent_data->objectIdentifier.instance = Analog_Value_Index_To_Instance(index); + /* Event State */ + getevent_data->eventState = AV_Descr[index].Event_State; + /* Acknowledged Transitions */ + /* FIXME: finish it */ + bitstring_init(&getevent_data->acknowledgedTransitions); + bitstring_set_bit(&getevent_data->acknowledgedTransitions, TRANSITION_TO_OFFNORMAL, true); + bitstring_set_bit(&getevent_data->acknowledgedTransitions, TRANSITION_TO_FAULT, true); + bitstring_set_bit(&getevent_data->acknowledgedTransitions, TRANSITION_TO_NORMAL, true); + /* Event Time Stamps */ + for (i = 0; i < 3; i++) { + getevent_data->eventTimeStamps[i].tag = TIME_STAMP_DATETIME; + getevent_data->eventTimeStamps[i].value.dateTime = + AV_Descr[index].Event_Time_Stamps[i]; + } + /* Notify Type */ + getevent_data->notifyType = AV_Descr[index].Notify_Type; + /* Event Enable */ + bitstring_init(&getevent_data->eventEnable); + bitstring_set_bit(&getevent_data->eventEnable, TRANSITION_TO_OFFNORMAL, + (AV_Descr[index].Event_Enable & EVENT_ENABLE_TO_OFFNORMAL) ? true : false ); + bitstring_set_bit(&getevent_data->eventEnable, TRANSITION_TO_FAULT, + (AV_Descr[index].Event_Enable & EVENT_ENABLE_TO_FAULT ) ? true : false ); + bitstring_set_bit(&getevent_data->eventEnable, TRANSITION_TO_NORMAL, + (AV_Descr[index].Event_Enable & EVENT_ENABLE_TO_NORMAL ) ? true : false ); + /* Event Priorities */ + /* FIXME: finish it */ + getevent_data->eventPriorities[0] = 255; + getevent_data->eventPriorities[1] = 255; + getevent_data->eventPriorities[2] = 255; + + return 1; /* active event */ + } + else + return 0; /* no active event at this index */ +#endif /* defined(INTRINSIC_REPORTING) */ +} + #ifdef TEST diff --git a/bacnet-stack/demo/object/av.h b/bacnet-stack/demo/object/av.h index c7cb4c55..b3068bee 100644 --- a/bacnet-stack/demo/object/av.h +++ b/bacnet-stack/demo/object/av.h @@ -96,6 +96,9 @@ extern "C" { void Analog_Value_Intrinsic_Reporting( uint32_t object_instance); + int Analog_Value_Event_Information(unsigned index, + BACNET_GET_EVENT_INFORMATION_DATA * getevent_data); + void Analog_Value_Init( void); diff --git a/bacnet-stack/demo/server/main.c b/bacnet-stack/demo/server/main.c index 355d04ab..acab1127 100644 --- a/bacnet-stack/demo/server/main.c +++ b/bacnet-stack/demo/server/main.c @@ -28,6 +28,7 @@ #include #include #include + #include "config.h" #include "server.h" #include "address.h" @@ -44,6 +45,7 @@ #include "bacfile.h" #include "datalink.h" #include "dcc.h" +#include "getevent.h" #include "net.h" #include "txbuf.h" #include "lc.h" @@ -124,6 +126,17 @@ static void Init_Service_Handlers( /* handle communication so we can shutup when asked */ apdu_set_confirmed_handler(SERVICE_CONFIRMED_DEVICE_COMMUNICATION_CONTROL, handler_device_communication_control); +#if defined(INTRINSIC_REPORTING) + apdu_set_confirmed_handler(SERVICE_CONFIRMED_GET_EVENT_INFORMATION, + handler_get_event_information); + /* Set handlers for GetEventInformation + for all objects that support intrinsic reporting. */ + handler_get_event_information_set(OBJECT_ANALOG_INPUT, + Analog_Input_Event_Information); + handler_get_event_information_set(OBJECT_ANALOG_VALUE, + Analog_Value_Event_Information); + +#endif /* defined(INTRINSIC_REPORTING) */ } /** Handler registered with atexit() inside main function to, well, cleanup. diff --git a/bacnet-stack/lib/Makefile b/bacnet-stack/lib/Makefile index 3c2f3a13..3c2747c5 100644 --- a/bacnet-stack/lib/Makefile +++ b/bacnet-stack/lib/Makefile @@ -85,6 +85,7 @@ HANDLER_SRC = \ $(BACNET_HANDLER)/h_ihave.c \ $(BACNET_HANDLER)/h_cov.c \ $(BACNET_HANDLER)/h_ucov.c \ + $(BACNET_HANDLER)/h_getevent.c \ $(BACNET_HANDLER)/h_pt.c \ $(BACNET_HANDLER)/h_pt_a.c \ $(BACNET_HANDLER)/h_upt.c \