private void WriteEffectivePeriod()
        {
            // Manual ASN.1/BER encoding
            EncodeBuffer b = comm.GetEncodeBuffer(0);

            ASN1.encode_opening_tag(b, 3);

            DateTime dt;

            if (TxtStartDate.Text != "Always")
            {
                dt = Convert.ToDateTime(TxtStartDate.Text);
            }
            else
            {
                dt = new DateTime(0);
            }
            ASN1.encode_application_date(b, dt);

            if (TxtEndDate.Text != "Always")
            {
                dt = Convert.ToDateTime(TxtEndDate.Text);
            }
            else
            {
                dt = new DateTime(0);
            }
            ASN1.encode_application_date(b, dt);

            ASN1.encode_closing_tag(b, 3);

            Array.Resize <byte>(ref b.buffer, b.offset);
            byte[] InOutBuffer = b.buffer;
            comm.RawEncodedDecodedPropertyConfirmedRequest(adr, schedule_id, BacnetPropertyIds.PROP_EFFECTIVE_PERIOD, BacnetConfirmedServices.SERVICE_CONFIRMED_WRITE_PROPERTY, ref InOutBuffer);
        }
Example #2
0
        private void ReadExceptionSchedule()
        {
            byte[] InOutBuffer = null;
            try
            {
                if (comm.RawEncodedDecodedPropertyConfirmedRequest(adr, schedule_id,
                                                                   BacnetPropertyIds.PROP_EXCEPTION_SCHEDULE, BacnetConfirmedServices.SERVICE_CONFIRMED_READ_PROPERTY,
                                                                   ref InOutBuffer))
                {
                    int  offset = 0;
                    byte tag_number;

                    // Tag 3
                    offset += ASN1.decode_tag_number(InOutBuffer, offset, out tag_number);
                    if (tag_number != 3)
                    {
                        return;
                    }

                    int i = 1;
                    while (!ASN1.IS_CLOSING_TAG(InOutBuffer[offset]))
                    {
                        TreeNode tday = null;
                        var      bse  = new BACnetSpecialEvent();
                        offset += bse.ASN1decode(InOutBuffer, offset);
                        tday    = new TreeNode(string.Format("[{0}] {1}", i++, bse.period.ToString()));
                        tday.Nodes.Add(new TreeNode(String.Format("priority: {0}", bse.eventPriority), 1, 1));

                        exceptionSchedules.Nodes.Add(tday);
                        foreach (var tv in bse.Values)
                        {
                            var    value = tv.value;
                            var    dt    = tv.dt;
                            string s;
                            if (value.Tag != BacnetApplicationTags.BACNET_APPLICATION_TAG_NULL)
                            {
                                s = dt.ToString("T") + " = " +
                                    Property.SerializeValue(value,
                                                            value.Tag); // Second value is the ... value (Bool, Int, Uint, Float, double or null)
                                ScheduleType =
                                    value.Tag;                          // all type must be the same for a valid schedule (maybe, not sure !), so remember it
                            }
                            else
                            {
                                s = dt.ToString("T") + " = null";
                            }

                            tday.Nodes.Add(new TreeNode(s, 1, 1));
                        }
                    }
                    offset += ASN1.decode_tag_number(InOutBuffer, offset, out tag_number);
                    if (tag_number != 3)
                    {
                        exceptionSchedules.Nodes.Clear();
                    }
                    exceptionSchedules.ExpandAll();
                }
            }
            catch
            {
            }
            finally
            {
                exceptionSchedules.EndUpdate();

                exceptionSchedules.Sort(); // Time entries are not necesserary sorted, so do it (that's also why days are assign to [0], .. [6])
                exceptionSchedules.ExpandAll();
                exceptionSchedules.LabelEdit = true;
            }
        }