From acbfe10349197542f58b42c0cf2990fb2056fb98 Mon Sep 17 00:00:00 2001 From: k001a Date: Tue, 19 Jul 2011 20:40:25 +0000 Subject: [PATCH] Acked_Transitions for Analog-Input and Analog-Value objects. --- bacnet-stack/demo/object/ai.c | 62 +++++++++++++++++++++++++-------- bacnet-stack/demo/object/ai.h | 3 +- bacnet-stack/demo/object/av.c | 65 ++++++++++++++++++++++++++--------- bacnet-stack/demo/object/av.h | 3 +- bacnet-stack/demo/object/nc.c | 14 ++++---- bacnet-stack/demo/object/nc.h | 10 +++++- 6 files changed, 115 insertions(+), 42 deletions(-) diff --git a/bacnet-stack/demo/object/ai.c b/bacnet-stack/demo/object/ai.c index d9089150..c4dc5e92 100644 --- a/bacnet-stack/demo/object/ai.c +++ b/bacnet-stack/demo/object/ai.c @@ -116,9 +116,11 @@ void Analog_Input_Init( AI_Descr[i].Event_State = EVENT_STATE_NORMAL; /* notification class not connected */ AI_Descr[i].Notification_Class = BACNET_MAX_INSTANCE; - /* initialize Event time stamps using wildcards */ + /* initialize Event time stamps using wildcards + and set Acked_transitions */ for (j = 0; j < MAX_BACNET_EVENT_TRANSITION; j++) { datetime_wildcard_set(&AI_Descr[i].Event_Time_Stamps[j]); + AI_Descr[i].Acked_Transitions[j].bIsAcked = true; } #endif } @@ -346,11 +348,12 @@ int Analog_Input_Read_Property( case PROP_ACKED_TRANSITIONS: bitstring_init(&bit_string); - bitstring_set_bit(&bit_string, TRANSITION_TO_OFFNORMAL, true); - bitstring_set_bit(&bit_string, TRANSITION_TO_FAULT, true); - bitstring_set_bit(&bit_string, TRANSITION_TO_NORMAL, true); - - /* Fixme: finish it */ + bitstring_set_bit(&bit_string, TRANSITION_TO_OFFNORMAL, + CurrentAI->Acked_Transitions[TRANSITION_TO_OFFNORMAL].bIsAcked); + bitstring_set_bit(&bit_string, TRANSITION_TO_FAULT, + CurrentAI->Acked_Transitions[TRANSITION_TO_FAULT].bIsAcked); + bitstring_set_bit(&bit_string, TRANSITION_TO_NORMAL, + CurrentAI->Acked_Transitions[TRANSITION_TO_NORMAL].bIsAcked); apdu_len = encode_application_bitstring(&apdu[0], &bit_string); break; @@ -838,6 +841,33 @@ void Analog_Input_Intrinsic_Reporting(uint32_t object_instance) /* add data from notification class */ Notification_Class_common_reporting_function(&event_data); + + /* Ack required */ + if (event_data.ackRequired == true) + { + switch (event_data.toState) + { + case EVENT_STATE_OFFNORMAL: + case EVENT_STATE_HIGH_LIMIT: + case EVENT_STATE_LOW_LIMIT: + CurrentAI->Acked_Transitions[TRANSITION_TO_OFFNORMAL].bIsAcked = false; + CurrentAI->Acked_Transitions[TRANSITION_TO_OFFNORMAL].Time_Stamp = + event_data.timeStamp.value.dateTime; + break; + + case EVENT_STATE_FAULT: + CurrentAI->Acked_Transitions[TRANSITION_TO_FAULT].bIsAcked = false; + CurrentAI->Acked_Transitions[TRANSITION_TO_FAULT].Time_Stamp = + event_data.timeStamp.value.dateTime; + break; + + case EVENT_STATE_NORMAL: + CurrentAI->Acked_Transitions[TRANSITION_TO_NORMAL].bIsAcked = false; + CurrentAI->Acked_Transitions[TRANSITION_TO_NORMAL].Time_Stamp = + event_data.timeStamp.value.dateTime; + break; + } + } } #endif /* defined(INTRINSIC_REPORTING) */ } @@ -847,7 +877,7 @@ int Analog_Input_Event_Information(unsigned index, BACNET_GET_EVENT_INFORMATION_DATA * getevent_data) { #if defined(INTRINSIC_REPORTING) - bool isNotAckedTransitions; + bool IsNotAckedTransitions; bool IsActiveEvent; int i; @@ -859,25 +889,27 @@ int Analog_Input_Event_Information(unsigned index, /* Acked_Transitions property, which has at least one of the bits (TO-OFFNORMAL, TO-FAULT, TONORMAL) set to FALSE. */ - - /* FIXME: finish it */ - isNotAckedTransitions = false; + IsNotAckedTransitions = (AI_Descr[index].Acked_Transitions[TRANSITION_TO_OFFNORMAL].bIsAcked == false) | + (AI_Descr[index].Acked_Transitions[TRANSITION_TO_FAULT].bIsAcked == false) | + (AI_Descr[index].Acked_Transitions[TRANSITION_TO_NORMAL].bIsAcked == false); } else return -1; /* end of list */ - if ((IsActiveEvent) || (isNotAckedTransitions)) { + 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); + bitstring_set_bit(&getevent_data->acknowledgedTransitions, TRANSITION_TO_OFFNORMAL, + AI_Descr[index].Acked_Transitions[TRANSITION_TO_OFFNORMAL].bIsAcked); + bitstring_set_bit(&getevent_data->acknowledgedTransitions, TRANSITION_TO_FAULT, + AI_Descr[index].Acked_Transitions[TRANSITION_TO_FAULT].bIsAcked); + bitstring_set_bit(&getevent_data->acknowledgedTransitions, TRANSITION_TO_NORMAL, + AI_Descr[index].Acked_Transitions[TRANSITION_TO_NORMAL].bIsAcked); /* Event Time Stamps */ for (i = 0; i < 3; i++) { getevent_data->eventTimeStamps[i].tag = TIME_STAMP_DATETIME; diff --git a/bacnet-stack/demo/object/ai.h b/bacnet-stack/demo/object/ai.h index 3701609e..fa7b7dab 100644 --- a/bacnet-stack/demo/object/ai.h +++ b/bacnet-stack/demo/object/ai.h @@ -31,6 +31,7 @@ #include "bacdef.h" #include "rp.h" #include "wp.h" +#include "nc.h" #ifdef __cplusplus extern "C" { @@ -50,8 +51,8 @@ extern "C" { float Deadband; uint8_t Limit_Enable : 2; uint8_t Event_Enable : 3; - uint8_t Acked_Transitions : 3; uint8_t Notify_Type : 1; + ACKED_INFO Acked_Transitions[MAX_BACNET_EVENT_TRANSITION]; BACNET_DATE_TIME Event_Time_Stamps[MAX_BACNET_EVENT_TRANSITION]; /* time to generate event notification */ uint32_t Remaining_Time_Delay; diff --git a/bacnet-stack/demo/object/av.c b/bacnet-stack/demo/object/av.c index ba353904..dd80c445 100644 --- a/bacnet-stack/demo/object/av.c +++ b/bacnet-stack/demo/object/av.c @@ -125,14 +125,14 @@ void Analog_Value_Init( AV_Descr[i].Event_State = EVENT_STATE_NORMAL; /* notification class not connected */ AV_Descr[i].Notification_Class = BACNET_MAX_INSTANCE; - /* initialize Event time stamps using wildcards */ + /* initialize Event time stamps using wildcards + and set Acked_transitions */ for (j = 0; j < MAX_BACNET_EVENT_TRANSITION; j++) { datetime_wildcard_set(&AV_Descr[i].Event_Time_Stamps[j]); + AV_Descr[i].Acked_Transitions[j].bIsAcked = true; } #endif } - - return; } /* we simply have 0-n object instances. Yours might be */ @@ -433,11 +433,12 @@ int Analog_Value_Read_Property( case PROP_ACKED_TRANSITIONS: bitstring_init(&bit_string); - bitstring_set_bit(&bit_string, TRANSITION_TO_OFFNORMAL, true); - bitstring_set_bit(&bit_string, TRANSITION_TO_FAULT, true); - bitstring_set_bit(&bit_string, TRANSITION_TO_NORMAL, true); - - /* Fixme: finish it */ + bitstring_set_bit(&bit_string, TRANSITION_TO_OFFNORMAL, + CurrentAV->Acked_Transitions[TRANSITION_TO_OFFNORMAL].bIsAcked); + bitstring_set_bit(&bit_string, TRANSITION_TO_FAULT, + CurrentAV->Acked_Transitions[TRANSITION_TO_FAULT].bIsAcked); + bitstring_set_bit(&bit_string, TRANSITION_TO_NORMAL, + CurrentAV->Acked_Transitions[TRANSITION_TO_NORMAL].bIsAcked); apdu_len = encode_application_bitstring(&apdu[0], &bit_string); break; @@ -950,15 +951,43 @@ void Analog_Value_Intrinsic_Reporting(uint32_t object_instance) /* add data from notification class */ Notification_Class_common_reporting_function(&event_data); + + /* Ack required */ + if (event_data.ackRequired == true) + { + switch (event_data.toState) + { + case EVENT_STATE_OFFNORMAL: + case EVENT_STATE_HIGH_LIMIT: + case EVENT_STATE_LOW_LIMIT: + CurrentAV->Acked_Transitions[TRANSITION_TO_OFFNORMAL].bIsAcked = false; + CurrentAV->Acked_Transitions[TRANSITION_TO_OFFNORMAL].Time_Stamp = + event_data.timeStamp.value.dateTime; + break; + + case EVENT_STATE_FAULT: + CurrentAV->Acked_Transitions[TRANSITION_TO_FAULT].bIsAcked = false; + CurrentAV->Acked_Transitions[TRANSITION_TO_FAULT].Time_Stamp = + event_data.timeStamp.value.dateTime; + break; + + case EVENT_STATE_NORMAL: + CurrentAV->Acked_Transitions[TRANSITION_TO_NORMAL].bIsAcked = false; + CurrentAV->Acked_Transitions[TRANSITION_TO_NORMAL].Time_Stamp = + event_data.timeStamp.value.dateTime; + break; + } + } } #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 IsNotAckedTransitions; bool IsActiveEvent; int i; @@ -970,25 +999,27 @@ int Analog_Value_Event_Information(unsigned index, /* Acked_Transitions property, which has at least one of the bits (TO-OFFNORMAL, TO-FAULT, TONORMAL) set to FALSE. */ - - /* FIXME: finish it */ - isNotAckedTransitions = false; + IsNotAckedTransitions = (AV_Descr[index].Acked_Transitions[TRANSITION_TO_OFFNORMAL].bIsAcked == false) | + (AV_Descr[index].Acked_Transitions[TRANSITION_TO_FAULT].bIsAcked == false) | + (AV_Descr[index].Acked_Transitions[TRANSITION_TO_NORMAL].bIsAcked == false); } else return -1; /* end of list */ - if ((IsActiveEvent) || (isNotAckedTransitions)) { + 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); + bitstring_set_bit(&getevent_data->acknowledgedTransitions, TRANSITION_TO_OFFNORMAL, + AV_Descr[index].Acked_Transitions[TRANSITION_TO_OFFNORMAL].bIsAcked); + bitstring_set_bit(&getevent_data->acknowledgedTransitions, TRANSITION_TO_FAULT, + AV_Descr[index].Acked_Transitions[TRANSITION_TO_FAULT].bIsAcked); + bitstring_set_bit(&getevent_data->acknowledgedTransitions, TRANSITION_TO_NORMAL, + AV_Descr[index].Acked_Transitions[TRANSITION_TO_NORMAL].bIsAcked); /* Event Time Stamps */ for (i = 0; i < 3; i++) { getevent_data->eventTimeStamps[i].tag = TIME_STAMP_DATETIME; diff --git a/bacnet-stack/demo/object/av.h b/bacnet-stack/demo/object/av.h index b3068bee..0a467ef6 100644 --- a/bacnet-stack/demo/object/av.h +++ b/bacnet-stack/demo/object/av.h @@ -32,6 +32,7 @@ #include "bacerror.h" #include "wp.h" #include "rp.h" +#include "nc.h" #ifdef __cplusplus extern "C" { @@ -54,8 +55,8 @@ extern "C" { float Deadband; uint8_t Limit_Enable : 2; uint8_t Event_Enable : 3; - uint8_t Acked_Transitions : 3; uint8_t Notify_Type : 1; + ACKED_INFO Acked_Transitions[MAX_BACNET_EVENT_TRANSITION]; BACNET_DATE_TIME Event_Time_Stamps[MAX_BACNET_EVENT_TRANSITION]; /* time to generate event notification */ uint32_t Remaining_Time_Delay; diff --git a/bacnet-stack/demo/object/nc.c b/bacnet-stack/demo/object/nc.c index ab474349..7a18c68d 100644 --- a/bacnet-stack/demo/object/nc.c +++ b/bacnet-stack/demo/object/nc.c @@ -781,11 +781,11 @@ void Notification_Class_common_reporting_function( /* Priority and AckRequired*/ switch (event_data->toState) { - case EVENT_STATE_OFFNORMAL: + case EVENT_STATE_NORMAL: event_data->priority = - CurrentNotify->Priority[EVENT_STATE_OFFNORMAL]; + CurrentNotify->Priority[EVENT_STATE_NORMAL]; event_data->ackRequired = (CurrentNotify->Ack_Required & - TRANSITION_TO_OFFNORMAL_MASKED) ? true : false; + TRANSITION_TO_NORMAL_MASKED) ? true : false; break; case EVENT_STATE_FAULT: @@ -795,16 +795,16 @@ void Notification_Class_common_reporting_function( TRANSITION_TO_FAULT_MASKED) ? true : false; break; - case EVENT_STATE_NORMAL: + case EVENT_STATE_OFFNORMAL: case EVENT_STATE_HIGH_LIMIT: case EVENT_STATE_LOW_LIMIT: event_data->priority = - CurrentNotify->Priority[EVENT_STATE_NORMAL]; + CurrentNotify->Priority[EVENT_STATE_OFFNORMAL]; event_data->ackRequired = (CurrentNotify->Ack_Required & - TRANSITION_TO_NORMAL) ? true : false; + TRANSITION_TO_OFFNORMAL_MASKED) ? true : false; break; - default: /* shouldn't happen */ + default: /* shouldn't happen */ break; } diff --git a/bacnet-stack/demo/object/nc.h b/bacnet-stack/demo/object/nc.h index b7c09746..324d5c58 100644 --- a/bacnet-stack/demo/object/nc.h +++ b/bacnet-stack/demo/object/nc.h @@ -78,7 +78,15 @@ typedef struct Notification_Class_info { uint8_t Priority[3]; /* BACnetARRAY[3] of Unsigned */ uint8_t Ack_Required; /* BACnetEventTransitionBits */ BACNET_DESTINATION Recipient_List[NC_MAX_RECIPIENTS]; /* List of BACnetDestination */ -} NOTIFICATION_CLASS_INFO; +} NOTIFICATION_CLASS_INFO; + + +/* Indicates whether the transaction has been confirmed */ +typedef struct Acked_info { + bool bIsAcked; /* true when transitions is acked */ + BACNET_DATE_TIME Time_Stamp;/* time stamp of when a alarm was generated */ +} ACKED_INFO; + void Notification_Class_Property_Lists(