/// <summary> /// Add new capture object. /// </summary> private void ColumnAddBtn_Click(object sender, EventArgs e) { try { GXDLMSCompactData target = Target as GXDLMSCompactData; GXKeyValuePair <GXDLMSObject, GXDLMSCaptureObject> it = new GXKeyValuePair <GXDLMSObject, GXDLMSCaptureObject>(); GXDLMSProfileGenericColumnDlg dlg = new GXDLMSProfileGenericColumnDlg(it, target.Parent as GXDLMSObjectCollection, "Compact data capture object"); if (dlg.ShowDialog(this) == DialogResult.OK) { it = dlg.GetTarget(); ListViewItem li = CaptureObjectsLv.Items.Add(it.Key.ObjectType.ToString()); li.SubItems.Add(it.Key.LogicalName); li.SubItems.Add(it.Value.AttributeIndex.ToString()); li.Tag = it; target.CaptureObjects.Add(it); errorProvider1.SetError(CaptureObjectsLv, Properties.Resources.ValueChangedTxt); Target.UpdateDirty(3, target.CaptureObjects); } } catch (Exception ex) { DialogResult = DialogResult.None; MessageBox.Show(this, ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } }
void OnUpdateTarget(GXDLMSObject value) { target = (GXDLMSCompactData)value; if (target != null) { UpdateCaptureObjects(); } else { ProfileGenericView.DataSource = null; } }
private void BufferTb_Leave(object sender, EventArgs e) { try { GXDLMSCompactData target = Target as GXDLMSCompactData; byte[] tmp = GXDLMSTranslator.HexToBytes(BufferTb.Text); if (GXDLMSTranslator.ToHex(tmp) != GXDLMSTranslator.ToHex(target.Buffer)) { target.Buffer = tmp; Target.UpdateDirty(2, target.Buffer); errorProvider1.SetError(BufferTb, Properties.Resources.ValueChangedTxt); } } catch (Exception ex) { MessageBox.Show(this, ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } }
public void OnValueChanged(int index, object value, bool user, bool connected) { GXDLMSCompactData target = Target as GXDLMSCompactData; if (index == 2) { if (!user) { UpdateCaptureObjects(); } BufferTb.Text = GXDLMSTranslator.ToHex(target.Buffer); DataTable dt = ProfileGenericView.DataSource as DataTable; if (dt != null) { dt.Rows.Clear(); UpdateData(dt); } ProfileGenericView.Refresh(); } else if (index == 3) { CaptureObjectsLv.Items.Clear(); foreach (var it in target.CaptureObjects) { ListViewItem li = CaptureObjectsLv.Items.Add(it.Key.ObjectType.ToString()); li.SubItems.Add(it.Key.LogicalName); li.SubItems.Add(it.Value.AttributeIndex.ToString()); li.Tag = it; } } else if (index == 5) { List <object> types = GXDLMSCompactData.GetDataTypes(target.TemplateDescription); StringBuilder sb = new StringBuilder(); AppendDataType(sb, types); TemplateDescriptionTb.Text = sb.ToString(); } else { throw new IndexOutOfRangeException("index"); } }
/// <summary> /// Remove capture object. /// </summary> private void ColumnRemoveBtn_Click(object sender, EventArgs e) { try { GXKeyValuePair <GXDLMSObject, GXDLMSCaptureObject> item; GXDLMSCompactData target = Target as GXDLMSCompactData; while (CaptureObjectsLv.SelectedItems.Count != 0) { ListViewItem li = CaptureObjectsLv.SelectedItems[0]; item = (GXKeyValuePair <GXDLMSObject, GXDLMSCaptureObject>)li.Tag; CaptureObjectsLv.Items.Remove(CaptureObjectsLv.SelectedItems[0]); errorProvider1.SetError(CaptureObjectsLv, Properties.Resources.ValueChangedTxt); Target.UpdateDirty(3, target.CaptureObjects); target.CaptureObjects.Remove(item); } } catch (Exception ex) { MessageBox.Show(this, ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } }
private void TemplateDescriptionTb_Leave(object sender, EventArgs e) { try { DataType v; GXByteBuffer bb = new GXByteBuffer(); GXDLMSCompactData target = Target as GXDLMSCompactData; bb.SetUInt8(2); bb.SetUInt8(0); foreach (string it in TemplateDescriptionTb.Text.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries)) { if (!Enum.TryParse <DataType>(it, out v)) { bb.Clear(); break; } bb.SetUInt8((byte)v); } byte[] tmp; if (bb.Size != 0) { bb.SetUInt8(1, (byte)(bb.Size - 2)); tmp = bb.Array(); } else { tmp = GXDLMSTranslator.HexToBytes(TemplateDescriptionTb.Text); } if (GXDLMSTranslator.ToHex(tmp) != GXDLMSTranslator.ToHex(target.TemplateDescription)) { target.TemplateDescription = tmp; Target.UpdateDirty(5, target.TemplateDescription); errorProvider1.SetError(TemplateDescriptionTb, Properties.Resources.ValueChangedTxt); } } catch (Exception ex) { MessageBox.Show(this, ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } }
/// <summary> /// Edit capture object. /// </summary> private void ColumnEditBtn_Click(object sender, EventArgs e) { try { if (CaptureObjectsLv.SelectedItems.Count == 1) { GXDLMSCompactData target = Target as GXDLMSCompactData; ListViewItem li = CaptureObjectsLv.SelectedItems[0]; GXKeyValuePair <GXDLMSObject, GXDLMSCaptureObject> it = (GXKeyValuePair <GXDLMSObject, GXDLMSCaptureObject>)li.Tag; GXDLMSProfileGenericColumnDlg dlg = new GXDLMSProfileGenericColumnDlg(it, target.Parent as GXDLMSObjectCollection, "Compact data capture object"); if (dlg.ShowDialog(this) == DialogResult.OK) { //If user has change target object. if (it.Key != dlg.GetTarget().Key) { target.CaptureObjects.Remove(it); it = dlg.GetTarget(); target.CaptureObjects.Add(it); } else { it = dlg.GetTarget(); } li.SubItems[0].Text = it.Key.ObjectType.ToString(); li.SubItems[1].Text = it.Key.LogicalName; li.SubItems[2].Text = it.Value.AttributeIndex.ToString(); errorProvider1.SetError(CaptureObjectsLv, Properties.Resources.ValueChangedTxt); li.Tag = it; Target.UpdateDirty(3, target.CaptureObjects); } } } catch (Exception ex) { MessageBox.Show(this, ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } }
private void UpdateCaptureObjects() { List <object> types = GXDLMSCompactData.GetDataTypes(target.TemplateDescription); int pos, index = 0; DataTable table = ProfileGenericView.DataSource as DataTable; ProfileGenericView.DataSource = null; ProfileGenericView.Columns.Clear(); DataTable dt = new DataTable(); DataColumn dc; foreach (var it in target.CaptureObjects) { string[] columns = ((IGXDLMSBase)it.Key).GetNames(); if (it.Value.AttributeIndex == 0) { structures = true; for (int a = 0; a != ((IGXDLMSBase)it.Key).GetAttributeCount(); ++a) { dc = dt.Columns.Add(index.ToString()); dc.Caption = it.Key.LogicalName + Environment.NewLine + columns[a]; pos = ProfileGenericView.Columns.Add(index.ToString(), dc.Caption); ProfileGenericView.Columns[pos].DataPropertyName = index.ToString(); ++index; } } else { if (it.Value.DataIndex == 0 && types != null && index < types.Count) { dc = dt.Columns.Add(index.ToString()); dc.Caption = it.Key.LogicalName + Environment.NewLine + columns[it.Value.AttributeIndex - 1]; pos = ProfileGenericView.Columns.Add(index.ToString(), dc.Caption); ProfileGenericView.Columns[pos].DataPropertyName = index.ToString(); } else { dc = dt.Columns.Add(index.ToString()); string str = it.Key.LogicalName; if (it.Value.AttributeIndex < columns.Length) { str += Environment.NewLine + columns[it.Value.AttributeIndex - 1]; } if (!string.IsNullOrEmpty(it.Key.Description)) { str += Environment.NewLine + it.Key.Description; } //In Indian standard register scalers are saved to table. if (it.Key is GXDLMSRegister && it.Value.AttributeIndex == 3) { structures = true; } dc.Caption = str; pos = ProfileGenericView.Columns.Add(index.ToString(), dc.Caption); ProfileGenericView.Columns[pos].DataPropertyName = index.ToString(); } ++index; } } UpdateData(dt); ProfileGenericView.DataSource = dt; }
void UpdateData(DataTable dt) { Standard standard = Standard.DLMS; if (target.Parent != null && target.Parent.Parent is GXDLMSClient) { standard = ((GXDLMSClient)target.Parent.Parent).Standard; } List <object> rows = GXDLMSCompactData.GetData(target.TemplateDescription, target.Buffer, standard == Standard.Italy); if (structures) { List <object[]> data = new List <object[]>(); foreach (List <object> r in rows) { List <object> row = new List <object>(); int index = 0; foreach (var it in target.CaptureObjects) { //If COSEM object is selected. //Only few meters are supporting this. if (it.Value.AttributeIndex == 0 && r[index] is List <object> ) { //Values must be update to the list because there might be Register Scaler //and it expects that scaler is read before value is updated. GXDLMSObject obj = GXDLMSClient.CreateObject(it.Key.ObjectType); byte i2 = 1; Dictionary <byte, object> list = new Dictionary <byte, object>(); foreach (object v in (r[index] as object[])) { list.Add(i2, v); ++i2; } //Update values first. for (byte i = 0; i != (obj as IGXDLMSBase).GetAttributeCount(); ++i) { ValueEventArgs ve = new ValueEventArgs(obj, i, 0, null); ve.Value = list[i]; (obj as IGXDLMSBase).SetValue(null, ve); } //Show values. for (byte i = 0; i != (obj as IGXDLMSBase).GetAttributeCount(); ++i) { row.Add(GetValue(obj.GetValues()[i])); } } else { row.Add(GetValue(r[index])); } ++index; } data.Add(row.ToArray()); } for (int pos = dt.Rows.Count; pos < data.Count; ++pos) { object[] row = data[pos]; dt.LoadDataRow(row, true); } } else { for (int pos = dt.Rows.Count; pos < rows.Count; ++pos) { List <object> row = (List <object>)rows[pos]; if (row != null) { for (int col = 0; col != row.Count; ++col) { if (row[col] is byte[]) { if (pos < target.CaptureObjects.Count && target.CaptureObjects[col].Key.GetUIDataType(target.CaptureObjects[col].Value.AttributeIndex) == DataType.DateTime) { row[col] = GXDLMSClient.ChangeType(row[col] as byte[], DataType.DateTime); } else { row[col] = GXDLMSTranslator.ToHex((byte[])row[col], true); } } else if (row[col] is Object[]) { row[col] = GXDLMSTranslator.ValueToXml(row[col]); } else if (row[col] is List <Object> ) { row[col] = GXDLMSTranslator.ValueToXml(row[col]); } else if (col < target.CaptureObjects.Count) { GXDLMSAttributeSettings att = target.CaptureObjects[col].Key.Attributes.Find(target.CaptureObjects[col].Value.AttributeIndex); if (att != null && att.Values != null) { if (att.Type == DataType.BitString && row[col] is string) { string str = (string)row[col]; if (str.Length != 0 && (str[0] == '0' || str[0] == '1')) { StringBuilder sb = new StringBuilder(); int pos2 = 0; foreach (char it in str) { if (it == '1') { if (sb.Length != 0) { sb.Append(','); } sb.Append(att.Values[pos2].UIValue); } ++pos2; if (pos2 == att.Values.Count) { break; } } row[col] = sb.ToString(); } } else { foreach (GXObisValueItem it in att.Values) { if (IsNumber(row[col]) && it.Value == Convert.ToInt32(row[col])) { row[col] = it.UIValue; break; } } } } } } if (dt.Columns.Count != 0) { try { dt.LoadDataRow(row.ToArray(), true); } catch (Exception) { //It's OK if this fails. } } } } } }