/// <summary> /// Получить данный, которые содержаться в пакете /// </summary> /// <param name="parames">Параметры пакета</param> /// <param name="result">Данные конвертера</param> /// <returns>Массив данных пакета или null если данные не удалось извлечь</returns> private byte[] GetData(Parameter[] parames, Float[] result) { int offset = 0; byte[] data = new byte[256]; try { foreach (var parameter in parames) { byte[] tmp = null; float current = GetValue(parameter.Position, result); if (!float.IsNaN(current)) { tmp = BitConverter.GetBytes((int)Math.Round(current)); } else tmp = new byte[4]; Array.Resize(ref tmp, parameter.Size); if (parameter.IsLittleEndian) Array.Reverse(tmp); Array.Copy(tmp, 0, data, offset, parameter.Size); offset = offset + parameter.Size; } Array.Resize(ref data, offset); return data; } catch { return null; } }
/// <summary> /// Получить блоки для записи в файл /// </summary> /// <param name="parameters">Сохраняемые параметры</param> /// <param name="result">Параметры конвертера</param> /// <param name="time">Время вставляемое в блок данных</param> /// <returns>Список блоков для записи в файл, или null если не удалось выделить ни один блок</returns> private List<byte[]> GetBlocks(Parameter[] parameters, Float[] result, double time) { List<byte[]> blocks = new List<byte[]>(); int block_count = (int)(parameters.Length / 126); int ostatok = (int)(parameters.Length % 126); if (block_count == 0 && ostatok == 0) return null; byte[] b_time = BitConverter.GetBytes(time); int position = 0; for (int i = 0; i < block_count; i++) { byte[] block = new byte[512]; Array.Copy(b_time, block, b_time.Length); // сохранили время for (int j = 0; j < 126; j++) { if (position < parameters.Length) { if (parameters[position].IsActual) { float current = result[parameters[position++].Position].GetCurrentValue(); byte[] val = BitConverter.GetBytes(current); Array.Copy(val, 0, block, (j * 4 + 8), 4); } } else return null; } blocks.Add(block); } if (ostatok > 0) { byte[] block_ost = new byte[512]; for (int i = 0; i < ostatok; i++) { Array.Copy(b_time, block_ost, b_time.Length); // сохранили время if (position < result.Length) { float current = result[parameters[position++].Position].GetCurrentValue(); byte[] val = BitConverter.GetBytes(current); Array.Copy(val, 0, block_ost, (i * 4 + 8), 4); } else return null; } blocks.Add(block_ost); } return blocks; }
/// <summary> /// Добавить параметр /// </summary> /// <param name="parameter">Добавляемый параметр</param> public void Insert(Parameter parameter) { bool blocked = false; try { if (p_mutex.WaitOne(100, false)) { blocked = true; parameters.Add(parameter); } } finally { if (blocked) p_mutex.ReleaseMutex(); } }
/// <summary> /// Добавить параметр в список /// </summary> /// <param name="parameter">Добавляемый параметр</param> private void InsertCondition(Parameter condition) { ListViewItem item = new ListViewItem(condition.Position.ToString()); ListViewItem.ListViewSubItem device = new ListViewItem.ListViewSubItem(item, condition.Device.ToString()); ListViewItem.ListViewSubItem offset = new ListViewItem.ListViewSubItem(item, condition.Offset.ToString()); ListViewItem.ListViewSubItem desc = new ListViewItem.ListViewSubItem(item, condition.Description); ListViewItem.ListViewSubItem size = new ListViewItem.ListViewSubItem(item, condition.Size.ToString()); item.SubItems.Add(device); item.SubItems.Add(offset); item.SubItems.Add(size); item.SubItems.Add(desc); item.Tag = condition; listViewChannels.Items.Add(item); }
/// <summary> /// Добавить параметр /// </summary> /// <param name="node">Узел в котором сохранены параметры пакета</param> protected void InsertPacket(XmlNode node) { try { if (node.HasChildNodes) { DisplayPacket packet = new DisplayPacket(); foreach (XmlNode child in node.ChildNodes) { switch (child.Name) { case parameterName: try { Parameter parameter = new Parameter(); parameter.InstanceFromXml(child); packet.Insert(parameter); } catch { } break; case commentName: try { packet.Description = child.InnerText; } catch { } break; case deviceName: try { packet.Device = int.Parse(child.InnerText); } catch { } break; case activedName: try { packet.IsActived = bool.Parse(child.InnerText); } catch { } break; case toPortName: try { packet.ToPort = bool.Parse(child.InnerText); } catch { } break; case "port_type": try { packet.TypePort = (TypePort)Enum.Parse(typeof(TypePort), child.InnerText); } catch { } break; case "period": try { packet.Period = TimeSpan.Parse(child.InnerText); } catch { } break; default: break; } } Insert(packet); } } catch { } }
/// <summary> /// Загрузить настройки /// </summary> /// <param name="root">Узел в котором находятся настройки</param> public void Load(XmlNode root) { try { string uri = string.Empty; XmlNode node = FindNode(root); if (node != null) { if (node.HasChildNodes) { foreach (XmlNode child in node.ChildNodes) { switch (child.Name) { case uriName: try { uri = child.InnerText; } catch { } break; case timeoutName: try { timeout = TimeSpan.Parse(child.InnerText); } catch { } break; case parameterName: try { Parameter parameter = new Parameter(); parameter.InstanceFromXml(child); Insert(parameter); } catch { } break; } } if (uri != string.Empty) { file.Load(uri); } } } } catch { } }
/// <summary> /// Определяет параметры /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void selectParameters_Click(object sender, EventArgs e) { SelectParametersBOForm frm = new SelectParametersBOForm(app); if (frm.ShowDialog(this) == DialogResult.OK) { foreach (Formula formula in frm.Formuls) { Parameter parameter = new Parameter(); parameter.Size = frm.DefaultParameterSize; parameter.Position = formula.Position; InsertParameter(parameter); } } }
/// <summary> /// Добавить формулу /// </summary> /// <param name="formula"></param> private void InsertParameter(Parameter formula) { ListViewItem item = new ListViewItem(formula.Size.ToString()); ListViewItem.ListViewSubItem desc = new ListViewItem.ListViewSubItem(item, GetDescription(formula)); item.SubItems.Add(desc); item.Tag = formula; listView1.Items.Add(item); }
string GetDescription(Parameter formula) { foreach (var f in app.Converter.Formuls) { if (f.Position == formula.Position) { return f.Macros.Description; } } return string.Empty; }
/// <summary> /// Добавить параметр из XML узла /// </summary> /// <param name="channel">Узем из которого извлечь данные для добавлениея параметра</param> protected void InsertChannel(XmlNode channel) { if (channel != null) { XmlNodeList childs = channel.ChildNodes; if (childs != null) { Parameter parameter = new Parameter(); foreach (XmlNode node in childs) { switch (node.Name) { case deviceName: try { parameter.Device = int.Parse(node.InnerText); } catch { continue; } break; case offsetName: try { parameter.Offset = int.Parse(node.InnerText); } catch { continue; } break; case lenghtName: try { parameter.Size = int.Parse(node.InnerText); } catch { continue; } break; case descriptionName: parameter.Description = node.InnerText; break; case positionName: try { parameter.Position = int.Parse(node.InnerText); } catch { continue; } break; default: break; } } InsertCondition(parameter); } } }
/// <summary> /// Добавляем канал /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void insert_channel_Click(object sender, EventArgs e) { InsertChannelForm ins = new InsertChannelForm(); ins.Text = "Добавление канала"; ins.Device = lastDevice; ins.Offset = lastOffset + lastSize; ins.DataSize = lastSize; if (ins.ShowDialog(this) == DialogResult.OK) { Parameter p = new Parameter(); p.Device = ins.Device; p.Offset = ins.Offset; p.Size = ins.DataSize; p.Position = app.Stock.GetFreeChannel(); p.Description = ins.Comment; lastDevice = p.Device; lastOffset = p.Offset; lastSize = p.Size; app.Stock.InsertCondition(p); InsertCondition(p); } }
/// <summary> /// Добавить параметр в список /// </summary> /// <param name="parameter">Добавляемый параметр</param> private void InsertParameter(Parameter parameter) { ListViewItem item = new ListViewItem(listViewParameters.Items.Count.ToString()); ListViewItem.ListViewSubItem desc = new ListViewItem.ListViewSubItem(item, parameter.Description); item.SubItems.Add(desc); item.Tag = parameter; if (!parameter.IsActual) { item.BackColor = Color.Salmon; } listViewParameters.Items.Add(item); }
/// <summary> /// определить аргумент /// </summary> private void InsertChannel(int index) { if (radioButton1.Checked) { SignalsForm signs = new SignalsForm(app); if (signs.ShowDialog(this) == DialogResult.OK) { Parameter par = signs.SelectedParameter; if (par != null) { if (index == 0) { first = new Argument(); first.Index = par.Position; first.Source = DataSource.Signals; } else { second = new Argument(); second.Index = par.Position; second.Source = DataSource.Signals; } listView1.Items[index].SubItems[0].Text = par.Position.ToString(); listView1.Items[index].SubItems[1].Text = "Канал устройства"; listView1.Items[index].SubItems[2].Text = par.Description; } } } else if (radioButton2.Checked) { ResultsForm res = new ResultsForm(app); if (res.ShowDialog(this) == DialogResult.OK) { Formula form = res.SelectedParameter; if (form != null) { if (index == 0) { first = new Argument(); first.Index = form.Position; first.Source = DataSource.Results; listView1.Items[index].SubItems[0].Text = first.Index.ToString(); } else { second = new Argument(); second.Index = form.Position; second.Source = DataSource.Results; listView1.Items[index].SubItems[0].Text = second.Index.ToString(); } listView1.Items[index].SubItems[1].Text = "Значение конвертера"; listView1.Items[index].SubItems[2].Text = form.Macros.Description; } } } }
/// <summary> /// Удалить параметр в список /// </summary> /// <param name="parameter">Удаляемый параметр</param> public void Remove(Parameter parameter) { if (p_locker.TryEnterWriteLock(300)) { try { parameters.Remove(parameter); } finally { p_locker.ExitWriteLock(); } } }
/// <summary> /// Добавить параметр в список /// </summary> /// <param name="parameter">Добавляемый параметр</param> public void Insert(Parameter parameter) { if (p_locker.TryEnterWriteLock(300)) { try { parameters.Add(parameter); } finally { p_locker.ExitWriteLock(); } } }