From 9afdc3fffa4cec2179ee072a143ab25100e6f602 Mon Sep 17 00:00:00 2001 From: skarg Date: Mon, 26 Feb 2007 22:02:19 +0000 Subject: [PATCH] Adding unit tests to Load Control object to verify state machine. --- bacnet-stack/datetime.c | 30 ++++++++---- bacnet-stack/datetime.h | 4 +- bacnet-stack/demo/handler/s_wp.c | 6 +++ bacnet-stack/demo/object/lc.c | 79 +++++++++++++++++++++++++++---- bacnet-stack/demo/object/lc.ide | Bin 35568 -> 35986 bytes 5 files changed, 102 insertions(+), 17 deletions(-) diff --git a/bacnet-stack/datetime.c b/bacnet-stack/datetime.c index 50812b50..14226fa6 100644 --- a/bacnet-stack/datetime.c +++ b/bacnet-stack/datetime.c @@ -354,18 +354,32 @@ bool datetime_wildcard(BACNET_DATE_TIME * bdatetime) return wildcard_present; } + +void datetime_date_wildcard_set(BACNET_DATE * bdate) +{ + if (bdate) { + bdate->year = 1900 + 0xFF; + bdate->month = 0xFF; + bdate->day = 0xFF; + bdate->wday = 0xFF; + } +} + +void datetime_time_wildcard_set(BACNET_TIME * btime) +{ + if (btime) { + btime->hour = 0xFF; + btime->min = 0xFF; + btime->sec = 0xFF; + btime->hundredths = 0xFF; + } +} void datetime_wildcard_set(BACNET_DATE_TIME * bdatetime) { if (bdatetime) { - bdatetime->date.year = 1900 + 0xFF; - bdatetime->date.month = 0xFF; - bdatetime->date.day = 0xFF; - bdatetime->date.wday = 0xFF; - bdatetime->time.hour = 0xFF; - bdatetime->time.min = 0xFF; - bdatetime->time.sec = 0xFF; - bdatetime->time.hundredths = 0xFF; + datetime_date_wildcard_set(&bdatetime->date); + datetime_time_wildcard_set(&bdatetime->time); } } diff --git a/bacnet-stack/datetime.h b/bacnet-stack/datetime.h index c2145b6c..dc3f7fcf 100644 --- a/bacnet-stack/datetime.h +++ b/bacnet-stack/datetime.h @@ -104,7 +104,9 @@ extern "C" { /* date and time wildcards */ bool datetime_wildcard(BACNET_DATE_TIME * bdatetime); - void datetime_wildcard_set(BACNET_DATE_TIME * bdatetime); + void datetime_wildcard_set(BACNET_DATE_TIME * bdatetime); + void datetime_date_wildcard_set(BACNET_DATE * bdate); + void datetime_time_wildcard_set(BACNET_TIME * btime); #ifdef __cplusplus } diff --git a/bacnet-stack/demo/handler/s_wp.c b/bacnet-stack/demo/handler/s_wp.c index 7643289a..9d7e7ec8 100644 --- a/bacnet-stack/demo/handler/s_wp.c +++ b/bacnet-stack/demo/handler/s_wp.c @@ -130,6 +130,12 @@ uint8_t Send_Write_Property_Request(uint32_t device_id, int apdu_len = 0, len = 0; while (object_value) { +#if PRINT_ENABLED_DEBUG + fprintf(stderr, "WriteProperty service: " + "%s tag=%d\n", + (object_value->context_specific?"context":"application"), + (int)(object_value->context_specific?object_value->context_tag:object_value->tag) ); +#endif len = bacapp_encode_data(&application_data[apdu_len], object_value); if ((len + apdu_len) < MAX_APDU) { diff --git a/bacnet-stack/demo/object/lc.c b/bacnet-stack/demo/object/lc.c index 5defd857..7521d276 100644 --- a/bacnet-stack/demo/object/lc.c +++ b/bacnet-stack/demo/object/lc.c @@ -390,9 +390,15 @@ void Load_Control_State_Machine(int object_index) { unsigned i = 0; /* loop counter */ int diff = 0; /* used for datetime comparison */ - + + /* is the state machine enabled? */ + if (!Load_Control_Enable[object_index]) { + Load_Control_State[object_index] = SHED_INACTIVE; + return; + } + switch (Load_Control_State[object_index]) { - case SHED_REQUEST_PENDING: + case SHED_REQUEST_PENDING: if (Load_Control_Request_Written[object_index]) { Load_Control_Request_Written[object_index] = false; } @@ -432,7 +438,6 @@ void Load_Control_State_Machine(int object_index) break; } /* cancel because current time is after start time + duration? */ - 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]); @@ -479,7 +484,6 @@ 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]); @@ -516,7 +520,6 @@ void Load_Control_State_Machine(int object_index) } break; 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]); @@ -582,6 +585,7 @@ void Load_Control_State_Machine_Handler(void) Load_Control_State_Previously[i] = SHED_INACTIVE; } } + Update_Current_Time(&Current_Time); for (i = 0; i < MAX_LOAD_CONTROLS; i++) { Load_Control_State_Machine(i); if (Load_Control_State[i] != Load_Control_State_Previously[i]) { @@ -956,16 +960,75 @@ bool Load_Control_Write_Property(BACNET_WRITE_PROPERTY_DATA * wp_data, void testLoadControlStateMachine(Test * pTest) { - unsigned i = 0, j = 0; + unsigned i = 0, j = 0; + bool status = false; + BACNET_APPLICATION_DATA_VALUE value; + BACNET_WRITE_PROPERTY_DATA wp_data; + BACNET_ERROR_CLASS error_class; + BACNET_ERROR_CODE error_code; + int len = 0; Load_Control_Init(); /* validate the triggers for each state change */ for (j = 0; j < 20; j++) { - Load_Control_State_Machine_Handler(); + Load_Control_State_Machine(0); for (i = 0; i < MAX_LOAD_CONTROLS; i++) { ct_test(pTest, Load_Control_State[i] == SHED_INACTIVE); } - } + } + /* SHED_REQUEST_PENDING */ + wp_data.object_type = OBJECT_LOAD_CONTROL; + wp_data.object_instance = 0; + wp_data.array_index = BACNET_ARRAY_ALL; + wp_data.priority = BACNET_NO_PRIORITY; + /* Set Enable=TRUE */ + wp_data.object_property = PROP_ENABLE; + value.context_specific = false; + value.context_tag = 0; + value.tag = BACNET_APPLICATION_TAG_BOOLEAN; + value.type.Boolean = true; + wp_data.application_data_len = + bacapp_encode_data(&wp_data.application_data[0], &value); + ct_test(pTest, wp_data.application_data_len > 0); + status = Load_Control_Write_Property(&wp_data, + &error_class, &error_code); + ct_test(pTest, status == true); + /* Set Shed_Duration=60 */ + wp_data.object_property = PROP_SHED_DURATION; + value.context_specific = false; + value.context_tag = 0; + value.tag = BACNET_APPLICATION_TAG_UNSIGNED_INT; + value.type.Unsigned_Int = 60; + wp_data.application_data_len = + bacapp_encode_data(&wp_data.application_data[0], &value); + ct_test(pTest, wp_data.application_data_len > 0); + status = Load_Control_Write_Property(&wp_data, + &error_class, &error_code); + ct_test(pTest, status == true); + /* Set Start_Time=wildcards */ + wp_data.object_property = PROP_START_TIME; + value.context_specific = false; + value.context_tag = 0; + value.tag = BACNET_APPLICATION_TAG_DATE; + datetime_date_wildcard_set(&value.type.Date); + wp_data.application_data_len = + bacapp_encode_data(&wp_data.application_data[0], &value); + ct_test(pTest, wp_data.application_data_len > 0); + len = wp_data.application_data_len; + value.tag = BACNET_APPLICATION_TAG_TIME; + datetime_time_wildcard_set(&value.type.Time); + wp_data.application_data_len = + bacapp_encode_data(&wp_data.application_data[len], &value); + ct_test(pTest, wp_data.application_data_len > 0); + wp_data.application_data_len += len; + status = Load_Control_Write_Property(&wp_data, + &error_class, &error_code); + ct_test(pTest, status == true); + /* run the state machine */ + Load_Control_State_Machine(0); + ct_test(pTest, Load_Control_State[i] == SHED_REQUEST_PENDING); + Load_Control_State_Machine(0); + ct_test(pTest, Load_Control_State[i] == SHED_INACTIVE); } void testLoadControl(Test * pTest) diff --git a/bacnet-stack/demo/object/lc.ide b/bacnet-stack/demo/object/lc.ide index 682eafcb4bf32957444cbba34e713c2dfa6acbb5..2992dfd6c44f67d1044e845212aa3d2391a70e62 100644 GIT binary patch delta 5211 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 Xg`=Ph_yyaxP0F6b?3ASNt-b#Nu`s`E delta 4869 zcma)79IIi*b6#_pNEfs$ua|7N3(hjT<0`< zJi+->&I6u*_2li)={JTu;8nlzc>i-dp1g9CW09K6oZZj&e86wdSH;UXTNp#E+CWi}T@T;&^@vf|5F8 z4&w^iBN*Fm!W%?EvWgA^i(rpp0X7`P7{|*&IGI$S7c;~5DN*1~iBHkirofTF;9`gp))L_Ov@?`8Rc4)V(sr*+p z<-xv`aQ&Rt`C3g$3T_hw*m8Y)FhL#;&c@O&L6yxM6(48gRkFK>n2`3e0Q}3ts`iK! z)Lj#}Z9c!L!`gBJrq)4RsypOqPtIcTi-j!=DhxcR-FPrLEk_qO>|CGr30I6dmot5a zS*J^K!qS;%6(7X~F|+JSHu7a;4>Dx7UGdSoU>h6u|yI*<(4N zX5MXmPT@lC4|@x}2{KaHFu?TpDWQ%kTzJjChCO#}9cW$j0*_VRV4AZFv#r zCiwdCb>^fH8(%B~@53Mu{GSNW~;Qz<)b&o?}>6rIss3#EXB%ei$Ae_AyN7 z;i!o??Q_FytM2gga4FVo^|r10^Zy?&SUNEBLy^ zqRO$Zeh6CWRQ;c>Oi^hl%~DxVnn*j_-w#igrc+F5u4=2?cMT%TmZ`RuvP6|fCBH4B zJY&nr{;1^d%gKJaoN{?pkUzbG^i37y|3KPrN_}!A)p5JK7s@Ir=H*JN@p|P7b?)3% zxgKJ@hrfWms~%QO->)iAO=(|1_Ub~_^!jR=>H2EwL_4l5rYb{S(UB+4L0uJPf3qr8 zjlV7#Q%!nVb*dVB;bafIUY)9@Z^(jc)k{>-lnry&WU3K2!Y;y&HMG9dlE18>btHvf zgp{?kC#%+ytrcyrNSkXdjT==%mFc4g;E@`Nf1-ve$U|GVwEee+;uC6VZ+4+?OD)B} zTT3f-qwV`z+Vg{J2Vr6z%^N*o09H!*V9g-x)8yJgIA2G-omx-%Yb0Nlyj)MYt1*Xp z9p(P1ZV(FAQI~hDqdAVD|5NEdS3d~6f$VqCo+{-)kAARA*~fYr-f75E`^m)jYay&lMI@_uKsNt{RgLaEr@3Al#YNw&?efVYHL?LMy zvV0Sz*^Bl)QZDisfZk1s;o?yu4t@)C-1s!h)J3ys?cfJvHb<)G)b!0`9bWQD{~#V) zW=1uQ)AZlnqg(FLwZj?y0#HAA2360tMyYFuIS;98hd3=>9`eRn=}FI+b~x4w&<@82 z;9JHNY1V1?l#wcRJS3@~G^uN4Oh;Xup|$bi7%M(>Wh`Cl(7q*Nf;iV|iDsiioKCgC z3{8iVTgEuFsJUnrUDNa|)PF3wFIgLvjk-8bYPxoW)w(bb{Ugf}r|OZqc9_)09VO1Tg1|B&*bzyX-hNq5Z<+LuZBT=)R&kg^ZHL{E3p zz1kDDvy1MxK)=h7(lv4HuV2XSqnDU(x1I$vZhRISiLY(on*t{6x#z|0^LFpuxIJpz zXrm{b?21%hOjo-mI!uv_6-~qS1|bU=o8-;dQ;#uLj;0~xGsw23jHTgCbi9aRezYUS zkV(a)7a@me<%fnMk2GOZ^CP2I}7-MParID&U0*2UT