Finished the Load Control object integration with the Analog Output object. Added a timer hook for the Load Control object into the server demo application.

This commit is contained in:
skarg
2007-02-13 19:37:57 +00:00
parent de4067e195
commit dd5d19eb9f
3 changed files with 76 additions and 6 deletions
+70 -5
View File
@@ -94,7 +94,7 @@ static bool Load_Control_Enable[MAX_LOAD_CONTROLS];
/* indicates when the object receives a write to any of the properties
Requested_Shed_Level, Shed_Duration, Duty_Window */
static bool Load_Control_Property_Written[MAX_LOAD_CONTROLS];
static bool Load_Control_Request_Written[MAX_LOAD_CONTROLS];
/* indicates when the object receives a write to Start_Time */
static bool Start_Time_Property_Written[MAX_LOAD_CONTROLS];
@@ -153,6 +153,8 @@ void Load_Control_Init(void)
Expected_Shed_Level[i].value.level = 0;
Actual_Shed_Level[i].type = BACNET_SHED_TYPE_LEVEL;
Actual_Shed_Level[i].value.level = 0;
Load_Control_Request_Written[i] = false;
Start_Time_Property_Written[i] = false;
}
}
@@ -258,7 +260,7 @@ struct tm {
tblock->tm_hour, tblock->tm_min, tblock->tm_sec, 0);
}
/* convert the shed level request into a Analog Output Present_Value */
/* convert the shed level request into an Analog Output Present_Value */
static float Requested_Shed_Level_Value(int object_index)
{
unsigned shed_level_index = 0;
@@ -397,7 +399,7 @@ void Load_Control_State_Machine(int object_index)
if (state[object_index] == SHED_INACTIVE)
break;
/* request to cancel using wildcards in start time? */
if (datetime_wildcard(&Start_Time)) {
if (datetime_wildcard(&Start_Time[object_index])) {
state[object_index] = SHED_INACTIVE;
break;
}
@@ -449,9 +451,67 @@ void Load_Control_State_Machine(int object_index)
}
break;
case SHED_NON_COMPLIANT:
Update_Current_Time(&Current_Time);
datetime_copy(&End_Time[object_index], &Start_Time[object_index]);
datetime_add_minutes(&End_Time[object_index],
Shed_Duration[object_index]);
diff = datetime_compare(&End_Time[object_index], &Current_Time);
if (diff < 0) {
/* FinishedUnsuccessfulShed */
state[object_index] = SHED_INACTIVE;
break;
}
if (Load_Control_Request_Written[object_index] ||
Start_Time_Property_Written[object_index]) {
/* UnsuccessfulShedReconfigured */
Load_Control_Request_Written[object_index] = false;
Start_Time_Property_Written[object_index] = false;
state[object_index] = SHED_REQUEST_PENDING;
break;
}
if (Able_To_Meet_Shed_Request(object_index)) {
/* CanNowComplyWithShed */
Shed_Level_Copy(
&Expected_Shed_Level[object_index],
&Requested_Shed_Level[object_index]);
Analog_Output_Present_Value_Set(object_index,
Requested_Shed_Level_Value(object_index), 4);
Shed_Level_Copy(
&Actual_Shed_Level[object_index],
&Requested_Shed_Level[object_index]);
state[object_index] = SHED_COMPLIANT;
}
break;
case SHED_COMPLIANT:
case SHED_COMPLIANT:
Update_Current_Time(&Current_Time);
datetime_copy(&End_Time[object_index], &Start_Time[object_index]);
datetime_add_minutes(&End_Time[object_index],
Shed_Duration[object_index]);
diff = datetime_compare(&End_Time[object_index], &Current_Time);
if (diff < 0) {
/* FinishedSuccessfulShed */
datetime_wildcard_set(&Start_Time[i]);
state[object_index] = SHED_INACTIVE;
break;
}
if (Load_Control_Request_Written[object_index] ||
Start_Time_Property_Written[object_index]) {
/* UnsuccessfulShedReconfigured */
Load_Control_Request_Written[object_index] = false;
Start_Time_Property_Written[object_index] = false;
state[object_index] = SHED_REQUEST_PENDING;
break;
}
if (!Able_To_Meet_Shed_Request(object_index)) {
/* CanNoLongerComplyWithShed */
Shed_Level_Default_Set(
&Expected_Shed_Level[object_index],
Requested_Shed_Level[object_index].type);
Shed_Level_Default_Set(
&Actual_Shed_Level[object_index],
Requested_Shed_Level[object_index].type);
state[object_index] = SHED_NON_COMPLIANT;
}
break;
case SHED_INACTIVE:
default:
@@ -746,6 +806,9 @@ bool Load_Control_Write_Property(BACNET_WRITE_PROPERTY_DATA * wp_data,
/* error! */
*error_class = ERROR_CLASS_PROPERTY;
*error_code = ERROR_CODE_INVALID_DATA_TYPE;
}
if (status) {
Load_Control_Request_Written[object_index] = true;
}
break;
case PROP_START_TIME:
@@ -776,6 +839,7 @@ bool Load_Control_Write_Property(BACNET_WRITE_PROPERTY_DATA * wp_data,
case PROP_SHED_DURATION:
if (value.tag == BACNET_APPLICATION_TAG_UNSIGNED_INT) {
Shed_Duration[object_index] = value.type.Unsigned_Int;
Load_Control_Request_Written[object_index] = true;
status = true;
} else {
*error_class = ERROR_CLASS_PROPERTY;
@@ -785,6 +849,7 @@ bool Load_Control_Write_Property(BACNET_WRITE_PROPERTY_DATA * wp_data,
case PROP_DUTY_WINDOW:
if (value.tag == BACNET_APPLICATION_TAG_UNSIGNED_INT) {
Duty_Window[object_index] = value.type.Unsigned_Int;
Load_Control_Request_Written[object_index] = true;
status = true;
} else {
*error_class = ERROR_CLASS_PROPERTY;
+2
View File
@@ -34,6 +34,8 @@
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
void Load_Control_State_Machine_Handler(void);
bool Load_Control_Valid_Instance(uint32_t object_instance);
unsigned Load_Control_Count(void);
+4 -1
View File
@@ -44,6 +44,7 @@
#include "dcc.h"
#include "net.h"
#include "txbuf.h"
#include "lc.h"
/* This is an example server application using the BACnet Stack */
@@ -156,8 +157,10 @@ int main(int argc, char *argv[])
npdu_handler(&src, &Rx_Buf[0], pdu_len);
}
/* at least one second has passed */
if (current_seconds != last_seconds)
if (current_seconds != last_seconds) {
dcc_timer_seconds(current_seconds - last_seconds);
Load_Control_State_Machine_Handler();
}
/* output */
/* blink LEDs, Turn on or off outputs, etc */