Finished coding the read/write property handling for load control object - untested.
This commit is contained in:
@@ -447,6 +447,8 @@ bool Load_Control_Write_Property(BACNET_WRITE_PROPERTY_DATA * wp_data,
|
|||||||
unsigned int object_index = 0;
|
unsigned int object_index = 0;
|
||||||
unsigned int priority = 0;
|
unsigned int priority = 0;
|
||||||
uint8_t level = ANALOG_LEVEL_NULL;
|
uint8_t level = ANALOG_LEVEL_NULL;
|
||||||
|
int len = 0;
|
||||||
|
BACNET_APPLICATION_DATA_VALUE value;
|
||||||
|
|
||||||
Load_Control_Init();
|
Load_Control_Init();
|
||||||
if (!Load_Control_Valid_Instance(wp_data->object_instance)) {
|
if (!Load_Control_Valid_Instance(wp_data->object_instance)) {
|
||||||
@@ -455,18 +457,68 @@ bool Load_Control_Write_Property(BACNET_WRITE_PROPERTY_DATA * wp_data,
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
/* decode the some of the request */
|
/* decode the some of the request */
|
||||||
|
len = bacapp_decode_application_data(
|
||||||
|
wp_data->application_data,
|
||||||
|
wp_data->application_data_len,
|
||||||
|
&value);
|
||||||
|
/* FIXME: len < application_data_len: more data? */
|
||||||
|
/* FIXME: len == 0: unable to decode? */
|
||||||
object_index = Load_Control_Instance_To_Index(wp_data->object_instance);
|
object_index = Load_Control_Instance_To_Index(wp_data->object_instance);
|
||||||
switch (wp_data->object_property) {
|
switch (wp_data->object_property) {
|
||||||
case PROP_REQUESTED_SHED_LEVEL:
|
case PROP_REQUESTED_SHED_LEVEL:
|
||||||
/* FIXME: add decoding and validation */
|
len = bacapp_decode_context_data(
|
||||||
|
wp_data->application_data,
|
||||||
|
wp_data->application_data_len,
|
||||||
|
&value, PROP_REQUESTED_SHED_LEVEL);
|
||||||
|
if (value.tag == 0) {
|
||||||
|
/* percent - Unsigned */
|
||||||
|
Requested_Shed_Level[object_index].value.percent =
|
||||||
|
value.type.Unsigned;
|
||||||
|
status = true;
|
||||||
|
} else if (value.tag == 1) {
|
||||||
|
/* level - Unsigned */
|
||||||
|
Requested_Shed_Level[object_index].value.level =
|
||||||
|
value.type.Unsigned;
|
||||||
|
status = true;
|
||||||
|
} else if (value.tag == 2) {
|
||||||
|
/* amount - REAL */
|
||||||
|
Requested_Shed_Level[object_index].value.amount =
|
||||||
|
value.type.Real;
|
||||||
|
status = true;
|
||||||
|
} else {
|
||||||
|
/* error! */
|
||||||
|
*error_class = ERROR_CLASS_PROPERTY;
|
||||||
|
*error_code = ERROR_CODE_INVALID_DATA_TYPE;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case PROP_START_TIME:
|
case PROP_START_TIME:
|
||||||
/* FIXME: add decoding and validation */
|
if (value.tag == BACNET_APPLICATION_TAG_DATE) {
|
||||||
|
memcpy(&Load_Control_Start_Time[object_index].date,
|
||||||
|
&value.type.Date,sizeof(value.type.Date));
|
||||||
|
status = true;
|
||||||
|
} else {
|
||||||
|
*error_class = ERROR_CLASS_PROPERTY;
|
||||||
|
*error_code = ERROR_CODE_INVALID_DATA_TYPE;
|
||||||
|
}
|
||||||
|
if (!status)
|
||||||
|
break;
|
||||||
|
len = bacapp_decode_application_data(
|
||||||
|
wp_data->application_data + len,
|
||||||
|
wp_data->application_data_len - len,
|
||||||
|
&value);
|
||||||
|
if (len && value.tag == BACNET_APPLICATION_TAG_TIME) {
|
||||||
|
memcpy(&Load_Control_Start_Time[object_index].time,
|
||||||
|
&value.type.Time,sizeof(value.type.time));
|
||||||
|
status = true;
|
||||||
|
} else {
|
||||||
|
*error_class = ERROR_CLASS_PROPERTY;
|
||||||
|
*error_code = ERROR_CODE_INVALID_DATA_TYPE;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case PROP_SHED_DURATION:
|
case PROP_SHED_DURATION:
|
||||||
if (wp_data->value.tag == BACNET_APPLICATION_TAG_UNSIGNED_INT) {
|
if (value.tag == BACNET_APPLICATION_TAG_UNSIGNED_INT) {
|
||||||
Load_Control_Shed_Duration[object_index] =
|
Load_Control_Shed_Duration[object_index] =
|
||||||
wp_data->value.type.Unsigned;
|
value.type.Unsigned;
|
||||||
status = true;
|
status = true;
|
||||||
} else {
|
} else {
|
||||||
*error_class = ERROR_CLASS_PROPERTY;
|
*error_class = ERROR_CLASS_PROPERTY;
|
||||||
@@ -474,9 +526,9 @@ bool Load_Control_Write_Property(BACNET_WRITE_PROPERTY_DATA * wp_data,
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case PROP_DUTY_WINDOW:
|
case PROP_DUTY_WINDOW:
|
||||||
if (wp_data->value.tag == BACNET_APPLICATION_TAG_UNSIGNED_INT) {
|
if (value.tag == BACNET_APPLICATION_TAG_UNSIGNED_INT) {
|
||||||
Load_Control_Duty_Window[object_index] =
|
Load_Control_Duty_Window[object_index] =
|
||||||
wp_data->value.type.Unsigned;
|
value.type.Unsigned;
|
||||||
status = true;
|
status = true;
|
||||||
} else {
|
} else {
|
||||||
*error_class = ERROR_CLASS_PROPERTY;
|
*error_class = ERROR_CLASS_PROPERTY;
|
||||||
@@ -484,7 +536,7 @@ bool Load_Control_Write_Property(BACNET_WRITE_PROPERTY_DATA * wp_data,
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case PROP_SHED_LEVELS:
|
case PROP_SHED_LEVELS:
|
||||||
if (wp_data->value.tag == BACNET_APPLICATION_TAG_UNSIGNED_INT) {
|
if (value.tag == BACNET_APPLICATION_TAG_UNSIGNED_INT) {
|
||||||
/* re-write the size of the array? */
|
/* re-write the size of the array? */
|
||||||
if (wp_data->array_index == 0) {
|
if (wp_data->array_index == 0) {
|
||||||
*error_class = ERROR_CLASS_PROPERTY;
|
*error_class = ERROR_CLASS_PROPERTY;
|
||||||
@@ -495,7 +547,7 @@ bool Load_Control_Write_Property(BACNET_WRITE_PROPERTY_DATA * wp_data,
|
|||||||
status = true;
|
status = true;
|
||||||
}
|
}
|
||||||
else if (wp_data->array_index <= MAX_SHED_LEVELS) {
|
else if (wp_data->array_index <= MAX_SHED_LEVELS) {
|
||||||
Shed_Levels[object_index][wp_data->array_index-1] = wp_data->value.type.Unsigned;
|
Shed_Levels[object_index][wp_data->array_index-1] = value.type.Unsigned;
|
||||||
status = true;
|
status = true;
|
||||||
} else {
|
} else {
|
||||||
}
|
}
|
||||||
@@ -505,9 +557,9 @@ bool Load_Control_Write_Property(BACNET_WRITE_PROPERTY_DATA * wp_data,
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case PROP_ENABLE:
|
case PROP_ENABLE:
|
||||||
if (wp_data->value.tag == BACNET_APPLICATION_TAG_BOOLEAN) {
|
if (value.tag == BACNET_APPLICATION_TAG_BOOLEAN) {
|
||||||
Load_Control_Enable[object_index] =
|
Load_Control_Enable[object_index] =
|
||||||
wp_data->value.type.Boolean;
|
value.type.Boolean;
|
||||||
status = true;
|
status = true;
|
||||||
} else {
|
} else {
|
||||||
*error_class = ERROR_CLASS_PROPERTY;
|
*error_class = ERROR_CLASS_PROPERTY;
|
||||||
@@ -557,7 +609,7 @@ void testLoadControl(Test * pTest)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef TEST_ANALOG_VALUE
|
#ifdef TEST_LOAD_CONTROL
|
||||||
int main(void)
|
int main(void)
|
||||||
{
|
{
|
||||||
Test *pTest;
|
Test *pTest;
|
||||||
|
|||||||
@@ -0,0 +1,35 @@
|
|||||||
|
#Makefile to build test case
|
||||||
|
CC = gcc
|
||||||
|
BASEDIR = .
|
||||||
|
#CFLAGS = -Wall -I.
|
||||||
|
# -g for debugging with gdb
|
||||||
|
#CFLAGS = -Wall -I. -g
|
||||||
|
CFLAGS = -Wall -I. -Itest -DTEST -DTEST_LOAD_CONTROL -g
|
||||||
|
|
||||||
|
# NOTE: this file is normally called by the unittest.sh from up directory
|
||||||
|
SRCS = bacdcode.c \
|
||||||
|
bacstr.c \
|
||||||
|
bigend.c \
|
||||||
|
demo/object/lc.c \
|
||||||
|
test/ctest.c
|
||||||
|
|
||||||
|
OBJS = ${SRCS:.c=.o}
|
||||||
|
|
||||||
|
TARGET = loadcontrol
|
||||||
|
|
||||||
|
all: ${TARGET}
|
||||||
|
|
||||||
|
${TARGET}: ${OBJS}
|
||||||
|
${CC} -o $@ ${OBJS}
|
||||||
|
|
||||||
|
.c.o:
|
||||||
|
${CC} -c ${CFLAGS} $*.c -o $@
|
||||||
|
|
||||||
|
depend:
|
||||||
|
rm -f .depend
|
||||||
|
${CC} -MM ${CFLAGS} *.c >> .depend
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -rf core ${TARGET} $(OBJS) *.bak *.1 *.ini
|
||||||
|
|
||||||
|
include: .depend
|
||||||
Reference in New Issue
Block a user