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); }
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; } }