Re: [Bacnet-developers] calendar object
Brought to you by:
skarg
From: PercyRao <pr...@ip...> - 2006-08-25 15:49:30
|
Steve, Awesome!!! Let me test this on myside!! Thanks Percy -----Original Message----- From: bac...@li... [mailto:bac...@li...] On Behalf Of Steve Karg Sent: Friday, August 25, 2006 11:43 AM To: Discussion for developers of the BACnet stack Subject: Re: [Bacnet-developers] calendar object Hi Percy, > Thank you for your email on calendar and schedule objects. You're welcome! > Can you > elaborate a bit more on How can I define a bacnet array and use that to > write to a schedule object ?can you give me some examples where I can > execute them using the bacnet stack? I can try, but you will probably have to do the needed changes to the BACnet stack yourself. I am in the middle of getting the MS/TP working in this open source BACnet stack. I have refactored the MS/TP master node state machine a couple of times, added all the fixes from the various addendum and erratta, and corrected the code where it was broken. I will keep putting it into subversion as I go, but it is not right - yet. Back to the schedule and calendar: 1. Change the structure in wp.h to only hold generic value data: typedef struct BACnet_Write_Property_Data { BACNET_OBJECT_TYPE object_type; uint32_t object_instance; BACNET_PROPERTY_ID object_property; int32_t array_index; uint8_t value[MAX_APDU]; uint16_t value_len; uint8_t priority; } BACNET_WRITE_PROPERTY_DATA; 2. Change the encode in wp.c to use the value data: /* propertyValue */ apdu_len += encode_opening_tag(&apdu[apdu_len], 3); memmove(&apdu[apdu_len], &data->value[0], value_len); apdu_len += value_len; apdu_len += encode_closing_tag(&apdu[apdu_len], 3); 3. The decode of WriteProperty is now more tedious. There almost needs to be a recursive decoding mechanism that figures out the length of the value data chunk so that you can get to the optional priority at the end. The value data chunk may contain contructed data or a list of values or simply a single piece of primitive data. You probably don't need to worry about this right now since you seem only interested in writing (encoding). 4. Add another encode function for WriteProperty in wp.c to handle the primitive data: int wp_encode_application_apdu(uint8_t * apdu, uint8_t invoke_id, BACNET_WRITE_PROPERTY_DATA * data, BACNET_APPLICATION_DATA_VALUE * value) { data->value_len = bacapp_encode_application_data( &data->value[0], value); return wp_encode_apdu(apdu, invoke_id, data); } 5. For me: fix all the BACnet stack unit tests and demos to use the new WriteProperty API and struct. 6. From your earlier e-mail: "able to write to a calendar object using the date_list property to write." I will see what I can put in this email - it is untested and uncompiled. :-) From my previous e-mail: The date_list property is a List of BACnetCalendarEntry. It is defined as: BACnetCalendarEntry ::= CHOICE { date [0] Date, dateRange [1] BACnetDateRange, weekNDay [2] BACnetWeekNDay } The brackets [] in the choice indicate that it is CONTEXT TAG instead of an APPLICATION TAG. tag 0 date is a primitive datatype. tag 1 dateRange and tag 2 weekNDay are complex datatypes that will need to be encoded between an opening and closing tag using their tag number. The data inside the opening/closing tag will be: BACnetDateRange ::= SEQUENCE { StartDate Date, endDate Date } StartDate and endDate will be encoded using APPLICATION TAG. BACnetWeekNDay ::= OCTET STRING (SIZE (3)) -- first octet month (1..14) 1 =January -- 13 = odd months -- 14 = even months -- X'FF' = any month -- second octet weekOfMonth where: 1 = days numbered 1-7 -- 2 = days numbered 8-14 -- 3 = days numbered 15-21 -- 4 = days numbered 22-28 -- 5 = days numbered 29-31 -- 6 = last 7 days of this month -- X'FF' = any week of this month -- third octet dayOfWeek (1..7) where 1 = Monday -- 7 = Sunday -- X'FF' = any day of week The octets will be encoded as specified. We can create a linked list structure that holds the date_list: /* in bacdef.h or demo/object/calendar.h */ struct BACnetDateRange { BACNET_DATE startDate; BACNET_DATE endDate; }; /* in bacdef.h or demo/object/calendar.h */ union BACnetCalendarEntry { BACNET_DATE bdate; /* 0 */ struct BACnetDateRange dateRange; /* 1 */ BACNET_OCTET_STRING weekNDay; /* 2 */ }; /* in bacdef.h or demo/object/calendar.h */ struct BACnetCalendarListEntry; struct BACnetCalendarListEntry { uint8_t tag; /* 0, 1, or 2 */ union BACnetCalendarEntry calendar; /* simple linked list */ struct BACnetCalendarListEntry *next; }; /* in demo/object/calendar.c */ int calendar_encode_date_list(uint8_t *apdu, struct BACnetCalendarListEntry *date_list) { union BACnetCalendarListEntry *entry; int apdu_len = 0; /* return value */ int len = 0; if (apdu && date_list) { entry = data_list; while (entry != NULL) { switch (entry->tag) { /* date */ case 0: len = encode_context_date(&apdu[apdu_len], 0, &entry->calendar.bdate); apdu_len += len; break; /* dateRange */ case 1: /* abstract syntax gets enclosed in a context tag */ len = encode_opening_tag(&apdu[apdu_len], 1); apdu_len += len; len = encode_bacnet_date(&apdu[apdu_len], &entry->calendar.dateRange.startDate); apdu_len += len; len = encode_bacnet_date(&apdu[apdu_len], &entry->calendar.dateRange.endDate); apdu_len += len; len = encode_closing_tag(&apdu[apdu_len], 1); apdu_len += len; break; case 2: len = encode_context_octet_string(&apdu[apdu_len], 2, &entry->calendar.weekNDay); apdu_len += len; break; default: break; } entry = entry->next; } } return apdu_len; } /* in demo/handler/s_cal.c */ uint8_t send_calendar_date_list( uint32_t device_id, uint32_t calendar_id, struct BACnetCalendarListEntry *date_list) { BACNET_WRITE_PROPERTY_DATA data; unsigned max_apdu = 0; uint8_t invoke_id = 0; bool status = false; int pdu_len = 0; int bytes_sent = 0; if (!dcc_communication_enabled()) return 0; /* is the device bound? */ status = address_get_by_device(device_id, &max_apdu, &dest); /* is there a tsm available? */ if (status) invoke_id = tsm_next_free_invokeID(); if (invoke_id) { data.object_type = OBJECT_CALENDAR; data.object_instance = calendar_id; data.object_property = PROP_DATE_LIST; data.array_index = BACNET_ARRAY_ALL; data.value_len = calendar_encode_date_list( &data.value[0], date_list); data.priority = BACNET_NO_PRIORITY; pdu_len = wp_encode_apdu( &Handler_Transmit_Buffer[0], invoke_id, &data); if ((unsigned) pdu_len < max_apdu) { npdu_encode_confirmed_apdu(&npdu_data, MESSAGE_PRIORITY_NORMAL); tsm_set_confirmed_unsegmented_transaction(invoke_id, &dest, &npdu_data, &Handler_Transmit_Buffer[0], pdu_len); bytes_sent = datalink_send_pdu(&dest, &npdu_data, &Handler_Transmit_Buffer[0], pdu_len); } else { tsm_free_invoke_id(invoke_id); invoke_id = 0; } return invoke_id; } /* in your application somewhere */ void send_my_calendar(void) { struct BACnetCalendarListEntry date_list[3]; uint8_t invoke_id = 0; date_list[0].tag = 0; date_list[0].calendar.bdate.year = 2006; date_list[0].calendar.bdate.month = 8; date_list[0].calendar.bdate.day = 25; date_list[0].calendar.bdate.wday = 5; date_list[0].next = &date_list[1]; date_list[1].tag = 1; date_list[1].calendar.dateRange.startDate.year = 2006; date_list[1].calendar.dateRange.startDate.month = 8; date_list[1].calendar.dateRange.startDate.day = 28; date_list[1].calendar.dateRange.startDate.wday = 1; date_list[1].calendar.dateRange.endDate.year = 2006; date_list[1].calendar.dateRange.endDate.month = 9; date_list[1].calendar.dateRange.endDate.day = 1; date_list[1].calendar.dateRange.endDate.wday = 5; date_list[1].next = &date_list[2]; date_list[2].tag = 2; date_list[2].calendar.weekNDay.value[0] = 13; date_list[2].calendar.weekNDay.value[1]= 0xFF; date_list[2].calendar.weekNDay.value[2]= 0xFF; date_list[2].calendar.weekNDay.length = 3; date_list[2].next = NULL; invoke_id = send_calendar_date_list(123, 1, &date_list[0]); } I will work on the schedule example when I get some more free time. Best Regards, Steve -- http://www.kargs.net/ ------------------------------------------------------------------------- Using Tomcat but need to do more? Need to support web services, security? Get stuff done quickly with pre-integrated technology to make your job easier Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642 _______________________________________________ BACnet-developers mailing list BAC...@li... https://lists.sourceforge.net/lists/listinfo/bacnet-developers |