Acked_Transitions for Analog-Input and Analog-Value objects.

This commit is contained in:
k001a
2011-07-19 20:40:25 +00:00
parent e5496d3d11
commit acbfe10349
6 changed files with 115 additions and 42 deletions
+47 -15
View File
@@ -116,9 +116,11 @@ void Analog_Input_Init(
AI_Descr[i].Event_State = EVENT_STATE_NORMAL; AI_Descr[i].Event_State = EVENT_STATE_NORMAL;
/* notification class not connected */ /* notification class not connected */
AI_Descr[i].Notification_Class = BACNET_MAX_INSTANCE; 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++) { for (j = 0; j < MAX_BACNET_EVENT_TRANSITION; j++) {
datetime_wildcard_set(&AI_Descr[i].Event_Time_Stamps[j]); datetime_wildcard_set(&AI_Descr[i].Event_Time_Stamps[j]);
AI_Descr[i].Acked_Transitions[j].bIsAcked = true;
} }
#endif #endif
} }
@@ -346,11 +348,12 @@ int Analog_Input_Read_Property(
case PROP_ACKED_TRANSITIONS: case PROP_ACKED_TRANSITIONS:
bitstring_init(&bit_string); bitstring_init(&bit_string);
bitstring_set_bit(&bit_string, TRANSITION_TO_OFFNORMAL, true); bitstring_set_bit(&bit_string, TRANSITION_TO_OFFNORMAL,
bitstring_set_bit(&bit_string, TRANSITION_TO_FAULT, true); CurrentAI->Acked_Transitions[TRANSITION_TO_OFFNORMAL].bIsAcked);
bitstring_set_bit(&bit_string, TRANSITION_TO_NORMAL, true); bitstring_set_bit(&bit_string, TRANSITION_TO_FAULT,
CurrentAI->Acked_Transitions[TRANSITION_TO_FAULT].bIsAcked);
/* Fixme: finish it */ bitstring_set_bit(&bit_string, TRANSITION_TO_NORMAL,
CurrentAI->Acked_Transitions[TRANSITION_TO_NORMAL].bIsAcked);
apdu_len = encode_application_bitstring(&apdu[0], &bit_string); apdu_len = encode_application_bitstring(&apdu[0], &bit_string);
break; break;
@@ -838,6 +841,33 @@ void Analog_Input_Intrinsic_Reporting(uint32_t object_instance)
/* add data from notification class */ /* add data from notification class */
Notification_Class_common_reporting_function(&event_data); 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) */ #endif /* defined(INTRINSIC_REPORTING) */
} }
@@ -847,7 +877,7 @@ int Analog_Input_Event_Information(unsigned index,
BACNET_GET_EVENT_INFORMATION_DATA * getevent_data) BACNET_GET_EVENT_INFORMATION_DATA * getevent_data)
{ {
#if defined(INTRINSIC_REPORTING) #if defined(INTRINSIC_REPORTING)
bool isNotAckedTransitions; bool IsNotAckedTransitions;
bool IsActiveEvent; bool IsActiveEvent;
int i; int i;
@@ -859,25 +889,27 @@ int Analog_Input_Event_Information(unsigned index,
/* Acked_Transitions property, which has at least one of the bits /* Acked_Transitions property, which has at least one of the bits
(TO-OFFNORMAL, TO-FAULT, TONORMAL) set to FALSE. */ (TO-OFFNORMAL, TO-FAULT, TONORMAL) set to FALSE. */
IsNotAckedTransitions = (AI_Descr[index].Acked_Transitions[TRANSITION_TO_OFFNORMAL].bIsAcked == false) |
/* FIXME: finish it */ (AI_Descr[index].Acked_Transitions[TRANSITION_TO_FAULT].bIsAcked == false) |
isNotAckedTransitions = false; (AI_Descr[index].Acked_Transitions[TRANSITION_TO_NORMAL].bIsAcked == false);
} }
else else
return -1; /* end of list */ return -1; /* end of list */
if ((IsActiveEvent) || (isNotAckedTransitions)) { if ((IsActiveEvent) || (IsNotAckedTransitions)) {
/* Object Identifier */ /* Object Identifier */
getevent_data->objectIdentifier.type = OBJECT_ANALOG_INPUT; getevent_data->objectIdentifier.type = OBJECT_ANALOG_INPUT;
getevent_data->objectIdentifier.instance = Analog_Input_Index_To_Instance(index); getevent_data->objectIdentifier.instance = Analog_Input_Index_To_Instance(index);
/* Event State */ /* Event State */
getevent_data->eventState = AI_Descr[index].Event_State; getevent_data->eventState = AI_Descr[index].Event_State;
/* Acknowledged Transitions */ /* Acknowledged Transitions */
/* FIXME: finish it */
bitstring_init(&getevent_data->acknowledgedTransitions); bitstring_init(&getevent_data->acknowledgedTransitions);
bitstring_set_bit(&getevent_data->acknowledgedTransitions, TRANSITION_TO_OFFNORMAL, true); bitstring_set_bit(&getevent_data->acknowledgedTransitions, TRANSITION_TO_OFFNORMAL,
bitstring_set_bit(&getevent_data->acknowledgedTransitions, TRANSITION_TO_FAULT, true); AI_Descr[index].Acked_Transitions[TRANSITION_TO_OFFNORMAL].bIsAcked);
bitstring_set_bit(&getevent_data->acknowledgedTransitions, TRANSITION_TO_NORMAL, true); 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 */ /* Event Time Stamps */
for (i = 0; i < 3; i++) { for (i = 0; i < 3; i++) {
getevent_data->eventTimeStamps[i].tag = TIME_STAMP_DATETIME; getevent_data->eventTimeStamps[i].tag = TIME_STAMP_DATETIME;
+2 -1
View File
@@ -31,6 +31,7 @@
#include "bacdef.h" #include "bacdef.h"
#include "rp.h" #include "rp.h"
#include "wp.h" #include "wp.h"
#include "nc.h"
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
@@ -50,8 +51,8 @@ extern "C" {
float Deadband; float Deadband;
uint8_t Limit_Enable : 2; uint8_t Limit_Enable : 2;
uint8_t Event_Enable : 3; uint8_t Event_Enable : 3;
uint8_t Acked_Transitions : 3;
uint8_t Notify_Type : 1; uint8_t Notify_Type : 1;
ACKED_INFO Acked_Transitions[MAX_BACNET_EVENT_TRANSITION];
BACNET_DATE_TIME Event_Time_Stamps[MAX_BACNET_EVENT_TRANSITION]; BACNET_DATE_TIME Event_Time_Stamps[MAX_BACNET_EVENT_TRANSITION];
/* time to generate event notification */ /* time to generate event notification */
uint32_t Remaining_Time_Delay; uint32_t Remaining_Time_Delay;
+48 -17
View File
@@ -125,14 +125,14 @@ void Analog_Value_Init(
AV_Descr[i].Event_State = EVENT_STATE_NORMAL; AV_Descr[i].Event_State = EVENT_STATE_NORMAL;
/* notification class not connected */ /* notification class not connected */
AV_Descr[i].Notification_Class = BACNET_MAX_INSTANCE; 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++) { for (j = 0; j < MAX_BACNET_EVENT_TRANSITION; j++) {
datetime_wildcard_set(&AV_Descr[i].Event_Time_Stamps[j]); datetime_wildcard_set(&AV_Descr[i].Event_Time_Stamps[j]);
AV_Descr[i].Acked_Transitions[j].bIsAcked = true;
} }
#endif #endif
} }
return;
} }
/* we simply have 0-n object instances. Yours might be */ /* we simply have 0-n object instances. Yours might be */
@@ -433,11 +433,12 @@ int Analog_Value_Read_Property(
case PROP_ACKED_TRANSITIONS: case PROP_ACKED_TRANSITIONS:
bitstring_init(&bit_string); bitstring_init(&bit_string);
bitstring_set_bit(&bit_string, TRANSITION_TO_OFFNORMAL, true); bitstring_set_bit(&bit_string, TRANSITION_TO_OFFNORMAL,
bitstring_set_bit(&bit_string, TRANSITION_TO_FAULT, true); CurrentAV->Acked_Transitions[TRANSITION_TO_OFFNORMAL].bIsAcked);
bitstring_set_bit(&bit_string, TRANSITION_TO_NORMAL, true); bitstring_set_bit(&bit_string, TRANSITION_TO_FAULT,
CurrentAV->Acked_Transitions[TRANSITION_TO_FAULT].bIsAcked);
/* Fixme: finish it */ bitstring_set_bit(&bit_string, TRANSITION_TO_NORMAL,
CurrentAV->Acked_Transitions[TRANSITION_TO_NORMAL].bIsAcked);
apdu_len = encode_application_bitstring(&apdu[0], &bit_string); apdu_len = encode_application_bitstring(&apdu[0], &bit_string);
break; break;
@@ -950,15 +951,43 @@ void Analog_Value_Intrinsic_Reporting(uint32_t object_instance)
/* add data from notification class */ /* add data from notification class */
Notification_Class_common_reporting_function(&event_data); 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) */ #endif /* defined(INTRINSIC_REPORTING) */
} }
int Analog_Value_Event_Information(unsigned index, int Analog_Value_Event_Information(unsigned index,
BACNET_GET_EVENT_INFORMATION_DATA * getevent_data) BACNET_GET_EVENT_INFORMATION_DATA * getevent_data)
{ {
#if defined(INTRINSIC_REPORTING) #if defined(INTRINSIC_REPORTING)
bool isNotAckedTransitions; bool IsNotAckedTransitions;
bool IsActiveEvent; bool IsActiveEvent;
int i; int i;
@@ -970,25 +999,27 @@ int Analog_Value_Event_Information(unsigned index,
/* Acked_Transitions property, which has at least one of the bits /* Acked_Transitions property, which has at least one of the bits
(TO-OFFNORMAL, TO-FAULT, TONORMAL) set to FALSE. */ (TO-OFFNORMAL, TO-FAULT, TONORMAL) set to FALSE. */
IsNotAckedTransitions = (AV_Descr[index].Acked_Transitions[TRANSITION_TO_OFFNORMAL].bIsAcked == false) |
/* FIXME: finish it */ (AV_Descr[index].Acked_Transitions[TRANSITION_TO_FAULT].bIsAcked == false) |
isNotAckedTransitions = false; (AV_Descr[index].Acked_Transitions[TRANSITION_TO_NORMAL].bIsAcked == false);
} }
else else
return -1; /* end of list */ return -1; /* end of list */
if ((IsActiveEvent) || (isNotAckedTransitions)) { if ((IsActiveEvent) || (IsNotAckedTransitions)) {
/* Object Identifier */ /* Object Identifier */
getevent_data->objectIdentifier.type = OBJECT_ANALOG_VALUE; getevent_data->objectIdentifier.type = OBJECT_ANALOG_VALUE;
getevent_data->objectIdentifier.instance = Analog_Value_Index_To_Instance(index); getevent_data->objectIdentifier.instance = Analog_Value_Index_To_Instance(index);
/* Event State */ /* Event State */
getevent_data->eventState = AV_Descr[index].Event_State; getevent_data->eventState = AV_Descr[index].Event_State;
/* Acknowledged Transitions */ /* Acknowledged Transitions */
/* FIXME: finish it */
bitstring_init(&getevent_data->acknowledgedTransitions); bitstring_init(&getevent_data->acknowledgedTransitions);
bitstring_set_bit(&getevent_data->acknowledgedTransitions, TRANSITION_TO_OFFNORMAL, true); bitstring_set_bit(&getevent_data->acknowledgedTransitions, TRANSITION_TO_OFFNORMAL,
bitstring_set_bit(&getevent_data->acknowledgedTransitions, TRANSITION_TO_FAULT, true); AV_Descr[index].Acked_Transitions[TRANSITION_TO_OFFNORMAL].bIsAcked);
bitstring_set_bit(&getevent_data->acknowledgedTransitions, TRANSITION_TO_NORMAL, true); 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 */ /* Event Time Stamps */
for (i = 0; i < 3; i++) { for (i = 0; i < 3; i++) {
getevent_data->eventTimeStamps[i].tag = TIME_STAMP_DATETIME; getevent_data->eventTimeStamps[i].tag = TIME_STAMP_DATETIME;
+2 -1
View File
@@ -32,6 +32,7 @@
#include "bacerror.h" #include "bacerror.h"
#include "wp.h" #include "wp.h"
#include "rp.h" #include "rp.h"
#include "nc.h"
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
@@ -54,8 +55,8 @@ extern "C" {
float Deadband; float Deadband;
uint8_t Limit_Enable : 2; uint8_t Limit_Enable : 2;
uint8_t Event_Enable : 3; uint8_t Event_Enable : 3;
uint8_t Acked_Transitions : 3;
uint8_t Notify_Type : 1; uint8_t Notify_Type : 1;
ACKED_INFO Acked_Transitions[MAX_BACNET_EVENT_TRANSITION];
BACNET_DATE_TIME Event_Time_Stamps[MAX_BACNET_EVENT_TRANSITION]; BACNET_DATE_TIME Event_Time_Stamps[MAX_BACNET_EVENT_TRANSITION];
/* time to generate event notification */ /* time to generate event notification */
uint32_t Remaining_Time_Delay; uint32_t Remaining_Time_Delay;
+7 -7
View File
@@ -781,11 +781,11 @@ void Notification_Class_common_reporting_function(
event_data->initiatingObjectIdentifier.type = OBJECT_DEVICE; event_data->initiatingObjectIdentifier.type = OBJECT_DEVICE;
event_data->initiatingObjectIdentifier.instance = event_data->initiatingObjectIdentifier.instance =
Device_Object_Instance_Number(); Device_Object_Instance_Number();
/* Priority and AckRequired*/ /* Priority and AckRequired*/
switch (event_data->toState) switch (event_data->toState)
{ {
case EVENT_STATE_OFFNORMAL: case EVENT_STATE_NORMAL:
event_data->priority = event_data->priority =
CurrentNotify->Priority[EVENT_STATE_NORMAL]; CurrentNotify->Priority[EVENT_STATE_NORMAL];
event_data->ackRequired = (CurrentNotify->Ack_Required & event_data->ackRequired = (CurrentNotify->Ack_Required &
@@ -795,16 +795,16 @@ void Notification_Class_common_reporting_function(
case EVENT_STATE_FAULT: case EVENT_STATE_FAULT:
event_data->priority = event_data->priority =
CurrentNotify->Priority[EVENT_STATE_FAULT]; CurrentNotify->Priority[EVENT_STATE_FAULT];
event_data->ackRequired = (CurrentNotify->Ack_Required & event_data->ackRequired = (CurrentNotify->Ack_Required &
TRANSITION_TO_FAULT_MASKED) ? true : false; TRANSITION_TO_FAULT_MASKED) ? true : false;
break; break;
case EVENT_STATE_NORMAL: case EVENT_STATE_OFFNORMAL:
case EVENT_STATE_HIGH_LIMIT: case EVENT_STATE_HIGH_LIMIT:
case EVENT_STATE_LOW_LIMIT: case EVENT_STATE_LOW_LIMIT:
event_data->priority = event_data->priority =
CurrentNotify->Priority[EVENT_STATE_OFFNORMAL]; CurrentNotify->Priority[EVENT_STATE_OFFNORMAL];
event_data->ackRequired = (CurrentNotify->Ack_Required & event_data->ackRequired = (CurrentNotify->Ack_Required &
TRANSITION_TO_OFFNORMAL_MASKED) ? true : false; TRANSITION_TO_OFFNORMAL_MASKED) ? true : false;
break; break;
+9 -1
View File
@@ -78,7 +78,15 @@ typedef struct Notification_Class_info {
uint8_t Priority[3]; /* BACnetARRAY[3] of Unsigned */ uint8_t Priority[3]; /* BACnetARRAY[3] of Unsigned */
uint8_t Ack_Required; /* BACnetEventTransitionBits */ uint8_t Ack_Required; /* BACnetEventTransitionBits */
BACNET_DESTINATION Recipient_List[NC_MAX_RECIPIENTS]; /* List of BACnetDestination */ 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( void Notification_Class_Property_Lists(