public My_Variable(string Name, string FullName, Signal signal) { this.name = Name; this.fullname = FullName; this.signal = signal; if (signal.Range[0].Length != 1) { DataRepresentation = new VectorDataRepresentation(); } else { DataRepresentation = new DataRepresentation(); } showTypeName = Visibility.Collapsed; showSize = Visibility.Collapsed; height = 20; CreateChildrens(); }
public override void RenderAnalog(Canvas canvas, IValueIterator iter) { VectorDataRepresentation datapres = iter.DataRepresentation as VectorDataRepresentation; RenderAnalogBus(canvas, iter, datapres, GetValueFromTime, GetValueFromItarotor); }
/// <summary> /// Отображение шины в аналоговом виде /// </summary> /// <param name="canvas"></param> /// <param name="iter"></param> /// <param name="DataPres"></param> /// <param name="GetValue"></param> protected void RenderAnalogBus <T>(Canvas canvas, IValueIterator iter, VectorDataRepresentation DataPres, GetValueDelegateFromTime <T> GetValueFromTime, GetValueDelegateFromIterator <T> GetValueFromIterator) where T : IConvertible { canvas.Children.Clear(); Polyline polyLine = new Polyline(); polyLine.Stroke = Brushes.Black; polyLine.StrokeThickness = 1; if (scaleManager.VisibleTimeDiapasone < (scaleManager.Width * 5.0)) { iter.SetCurrentIndexByKey(scaleManager.VisibleStartTime); double min = GetValueFromTime(ScaleManager.VisibleStartTime, DataPres).ToDouble(CultureInfo.InvariantCulture); double max = min; double value = 0; double height = canvas.ActualHeight; iter.SetCurrentIndexByKey(scaleManager.VisibleStartTime); value = GetValueFromTime(ScaleManager.VisibleStartTime, DataPres).ToDouble(CultureInfo.InvariantCulture); polyLine.Points.Add(new Point(0, Convert.ToDouble(value))); //Рисование начала диаграммы UInt64 x1 = 0, x2 = 0; x1 = scaleManager.VisibleStartTime; UInt64 MinimumVisibleChange = scaleManager.MinimumVisibleChange * 2; iter.SetCurrentIndexByKey(scaleManager.VisibleStartTime); x2 = iter.LastEvent; if (x2 > scaleManager.VisibleEndTime) { x2 = scaleManager.VisibleEndTime; } if (x2 < scaleManager.VisibleStartTime) { x2 = scaleManager.VisibleStartTime; } while (true) { value = GetValueFromIterator(iter, DataPres).ToDouble(CultureInfo.InvariantCulture); if (min > value) { min = value; } if (max < value) { max = value; } polyLine.Points.Add(new Point(scaleManager.GetOffset(x1), Convert.ToDouble(value))); polyLine.Points.Add(new Point(scaleManager.GetOffset(x2), Convert.ToDouble(value))); iter.MoveNext(); x1 = x2; x2 = iter.LastEvent; if ((iter.LastEvent >= scaleManager.VisibleEndTime) || (iter.IsEndOfIteration == true)) { value = GetValueFromTime(ScaleManager.VisibleEndTime, DataPres).ToDouble(CultureInfo.InvariantCulture); if (min > value) { min = value; } if (max < value) { max = value; } polyLine.Points.Add(new Point(scaleManager.GetOffset(x1), Convert.ToDouble(value))); polyLine.Points.Add(new Point(scaleManager.GetOffset(x2), Convert.ToDouble(value))); break; } if (x2 > scaleManager.VisibleEndTime) { x2 = scaleManager.VisibleEndTime; } if (x2 < scaleManager.VisibleStartTime) { x2 = scaleManager.VisibleStartTime; } } double DeltaY = (max != min) ? (height / Convert.ToDouble(max - min)) : 1; for (int i = 0; i < polyLine.Points.Count; i++) { Point point = polyLine.Points[i]; point.Y = (Convert.ToDouble(max) - point.Y) * DeltaY; polyLine.Points[i] = point; } } else { iter.SetCurrentIndexByKey(scaleManager.VisibleStartTime); double min = GetValueFromTime(ScaleManager.VisibleStartTime, DataPres).ToDouble(CultureInfo.InvariantCulture); double max = min; double value = 0; double height = canvas.ActualHeight; for (double x = 0; x < scaleManager.Width; x++) { UInt64 time = scaleManager.GetTime(x); iter.SetCurrentIndexByKey(time); value = GetValueFromIterator(iter, DataPres).ToDouble(CultureInfo.InvariantCulture); if (min > value) { min = value; } if (max < value) { max = value; } polyLine.Points.Add(new Point(x, Convert.ToDouble(value))); } double DeltaY = (max != min) ? (height / Convert.ToDouble(max - min)) : 1; for (int i = 0; i < polyLine.Points.Count; i++) { Point point = polyLine.Points[i]; point.Y = (Convert.ToDouble(max) - point.Y) * DeltaY; polyLine.Points[i] = point; } } canvas.Children.Add(polyLine); }
/// <summary> /// Преобразование в Nullable<BigInteger> с учетом формата представления данных /// </summary> /// <param name="value"></param> /// <returns></returns> public static Nullable <BigInteger> ToBigInteger(bool?[] value, VectorDataRepresentation dataRepresentation) { BigInteger res = 0; BigInteger pow = 1; //if(dataRepresentation.IsInverted) switch (dataRepresentation.DecimalDataPresentation) { case DecimalDataPresentation.Unsigned: { for (int i = value.Length - 1; i >= 0; i--, pow *= 2) { if (value[i] == true) { res += pow; } if (value[i] == null) { return(null); } } } break; case DecimalDataPresentation.Complement: { if (value[0] == null) { return(null); } if (value[0] == false) { for (int i = value.Length - 1; i >= 1; i--, pow *= 2) { if (value[i] == true) { res += pow; } if (value[i] == null) { return(null); } } } else { for (int i = value.Length - 1; i >= 1; i--, pow *= 2) { if (value[i] != true) { res += pow; } if (value[i] == null) { return(null); } } res = -res; } } break; case DecimalDataPresentation.Twos_Сomplement: { if (value[0] == null) { return(null); } if (value[0] == false) { for (int i = value.Length - 1; i >= 1; i--, pow *= 2) { if (value[i] == true) { res += pow; } if (value[i] == null) { return(null); } } } else { pow = -1; bool isFlag = false; for (int i = value.Length - 1; i >= 1; i--, pow *= 2) { if (value[i] == null) { return(null); } if (value[i].Value ^ isFlag) { res += pow; } isFlag |= value[i].Value; } if (!isFlag) { res = pow; // for values like 1000000000 .. 00 } } } break; } return(res); }
/// <summary> /// Преобразование в строку данных Nullable<bool>[] /// </summary> /// <param name="data"></param> /// <param name="dataRepresentation"></param> /// <returns></returns> public static string ToString(Nullable <bool>[] data, VectorDataRepresentation dataRepresentation) { if (dataRepresentation.IsInverted) { data = Invert(data); } StringBuilder res = new StringBuilder(); switch (dataRepresentation.EnumerationSystem) { case EnumerationSystem.Bin: { foreach (Nullable <bool> b in data) { if (b == null) { res.Append('X'); } else { if (b == true) { res.Append('1'); } else { res.Append('0'); } } } } break; case EnumerationSystem.Oct: { int index = 0; int count = data.Length % 3; Nullable <bool>[] buf = new bool?[count]; Array.Copy(data, index, buf, 0, count); int num = ToInt(buf); if (num == -1) { res.Append('X'); } else { res.Append(num); } index += count; while (index < data.Length) { int nextindex = index + 3; if (nextindex >= data.Length) { nextindex = data.Length; } count = nextindex - index; buf = new bool?[count]; Array.Copy(data, index, buf, 0, count); num = ToInt(buf); if (num == -1) { res.Append('X'); } else { res.Append(num); } index += 3; } } break; case EnumerationSystem.Hex: { int index = 0; int count = data.Length % 4; Nullable <bool>[] buf = new bool?[count]; Array.Copy(data, index, buf, 0, count); int num = ToInt(buf); switch (num) { case -1: res.Append('X'); break; case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8: case 9: res.Append(num); break; case 10: res.Append('A'); break; case 11: res.Append('B'); break; case 12: res.Append('C'); break; case 13: res.Append('D'); break; case 14: res.Append('E'); break; case 15: res.Append('F'); break; } index += count; while (index < data.Length) { int nextindex = index + 4; if (nextindex >= data.Length) { nextindex = data.Length; } count = nextindex - index; buf = new Nullable <bool> [count]; Array.Copy(data, index, buf, 0, count); num = ToInt(buf); switch (num) { case -1: res.Append('X'); break; case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8: case 9: res.Append(num); break; case 10: res.Append('A'); break; case 11: res.Append('B'); break; case 12: res.Append('C'); break; case 13: res.Append('D'); break; case 14: res.Append('E'); break; case 15: res.Append('F'); break; } index += 4; } } break; case EnumerationSystem.Dec: { int num = ToInt(data); if (num == -1) { res.Append('X'); } else { res.Append(num); } } break; } return(res.ToString()); }
public static string BinaryToDec(bool?[] value, VectorDataRepresentation dataRepresentation) { BigInteger?res = ToBigInteger(value, dataRepresentation); return((res == null) ? "X" : res.Value.ToString("n0")); }