/// <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.
                            }
                        }
                    }
                }
            }
        }