/// <summary> /// Recursively scans tree for CanvasData at the specified render depth which intersects with the specified time period. /// Canvas Data is not pruned. All canvas data will be returned for a particular element, even if some of that data falls outside the time window. /// </summary> /// <param name="start">the start of the time period to scan</param> /// <param name="end">the end time of the periodd to scan</param> /// <param name="renderUnit">the unit size at which to render elements</param> /// <returns></returns> public CanvasData GetCanvasData(DateTime start, DateTime end, FrameNodeLevel renderUnit, FrameNodeLevel displayUnit) { Debug.Assert(renderUnit != FrameNodeLevel.Root); //ensure in range if (start < StartTime) { start = StartTime; } if (end > EndTime) { end = EndTime; } FileManager.CountCache.RequestCounts(start, end, renderUnit); List <FrameElement> elements = GenerateCanvasElements(start, end, renderUnit); //fill canvas with relevant elements FileManager.CountCache.CollectCounts(elements); var data = new CanvasData(start, end, renderUnit, displayUnit); //create a new, empty canvas foreach (var element in elements) { data.AddFrameElement(element); } return(data); }
/// <summary> /// Creates a new CanvasData object, based on user specifications /// </summary> /// <param name="startTime">The time at wwhich the canvas view should start</param> /// <param name="endTime">The time at wwhich the canvas view should end</param> /// <param name="renderUnit">The basic rendering unit to use</param> /// <param name="displayUnit">The display unit to use</param> /// <param name="filterCount"></param> public CanvasData(DateTime startTime, DateTime endTime, FrameNodeLevel renderUnit, FrameNodeLevel displayUnit) { DisplayUnit = displayUnit; StartTime = startTime; EndTime = endTime; RenderUnit = renderUnit; DataVolume = new GraphData(); PacketCount = new GraphData(); MatchingCount = new List <GraphData>(); for (int k = 0; k < CanvasManager.FileManager.TotalFilters; k++) { MatchingCount.Add(new GraphData()); } ScaleData = new GraphScaleData(displayUnit, startTime, endTime, CanvasManager.FileManager.TotalFilters); switch (displayUnit) { case FrameNodeLevel.Root: Description = "Global View: " + startTime.ToString(CultureInfo.InvariantCulture) + " - " + endTime.ToString(CultureInfo.InvariantCulture); break; case FrameNodeLevel.Year: Description = "Year View: " + startTime.Year; break; case FrameNodeLevel.Month: Description = "Month View: " + MonthString(startTime.Month) + " " + startTime.Year; break; case FrameNodeLevel.Day: Description = "Day View: " + DayString(startTime.Day) + " " + MonthString(startTime.Month) + " " + startTime.Year; break; case FrameNodeLevel.Hour: Description = "Hour View: " + TimeString(startTime.Hour) + " - " + TimeString(endTime.Hour) + " " + DayString(startTime.Day) + " " + MonthString(startTime.Month) + " " + startTime.Year; break; case FrameNodeLevel.PartHour: Description = "Part Hour View: " + TimeString(startTime.Hour, startTime.Minute) + " - " + TimeString(endTime.Hour, endTime.Minute) + " " + DayString(startTime.Day) + " " + MonthString(startTime.Month) + " " + startTime.Year; break; case FrameNodeLevel.Minute: Description = "Minute View: " + TimeString(startTime.Hour, startTime.Minute) + " - " + TimeString(endTime.Hour, endTime.Minute) + " " + DayString(startTime.Day) + " " + MonthString(startTime.Month) + " " + startTime.Year; break; default: throw new ArgumentOutOfRangeException("displayUnit"); } }
public void RequestCounts(DateTime start, DateTime end, FrameNodeLevel renderUnit) { if (FilterFiles.Count == 0) { return; } if (thread != null) { MessageBox.Show("Error: Count Request already in progress"); return; } current = new CountProcessOptions(start, end, renderUnit); thread = new Thread(ProcessFilterFiles); thread.Start(current); }
private DateTime Increment(DateTime time, FrameNodeLevel renderUnit) { DateTime tmp; switch (renderUnit) { case FrameNodeLevel.Year: tmp = new DateTime(time.Year + 1, 1, 1); break; case FrameNodeLevel.Month: tmp = new DateTime(time.Year, time.Month, 1).AddMonths(1); break; case FrameNodeLevel.Day: tmp = new DateTime(time.Year, time.Month, time.Day).AddDays(1); break; case FrameNodeLevel.Hour: tmp = new DateTime(time.Year, time.Month, time.Day, time.Hour, 0, 0).AddHours(1); break; case FrameNodeLevel.PartHour: tmp = new DateTime(time.Year, time.Month, time.Day, time.Hour, time.Minute - (time.Minute % 5), 0).AddMinutes(5); break; case FrameNodeLevel.Minute: tmp = new DateTime(time.Year, time.Month, time.Day, time.Hour, time.Minute, 0).AddMinutes(1); break; case FrameNodeLevel.Second: tmp = new DateTime(time.Year, time.Month, time.Day, time.Hour, time.Minute, time.Second).AddSeconds(1); break; default: throw new ArgumentOutOfRangeException("renderUnit invalid: Root cannot be rendered."); } return(tmp); }
private bool SafeEquals(DateTime one, DateTime two, FrameNodeLevel unitDifference) { long errorTolerance; switch (unitDifference) { case FrameNodeLevel.Year: case FrameNodeLevel.Month: errorTolerance = new TimeSpan(1, 0, 0, 0).Ticks; break; case FrameNodeLevel.Day: errorTolerance = new TimeSpan(0, 1, 0, 0).Ticks; break; case FrameNodeLevel.Hour: errorTolerance = new TimeSpan(0, 0, 1, 0).Ticks; break; case FrameNodeLevel.PartHour: errorTolerance = new TimeSpan(0, 0, 0, 10).Ticks; break; case FrameNodeLevel.Minute: errorTolerance = new TimeSpan(0, 0, 0, 1).Ticks; break; case FrameNodeLevel.Second: errorTolerance = new TimeSpan(0, 0, 0, 0, 100).Ticks; break; default: throw new ArgumentOutOfRangeException("unitDifference"); } return(Math.Abs(one.Ticks - two.Ticks) < errorTolerance); }
public static FrameElement FindFrameElement(DateTime start, FrameNodeLevel level) { return(TimeTree.GetFrameElement(start, level)); }
public static FrameElement FindFrameElement(float startOffset, DateTime zeroTime, FrameNodeLevel level) { return(TimeTree.GetFrameElement(zeroTime.AddSeconds(startOffset), level)); }
public static FrameElement FindFrameElement(float startOffset, FrameNodeLevel level) { return(FindFrameElement(startOffset, FileManager.StartTime, level)); }
/// <summary> /// Generates and stores the default scaling information for the current canvas /// </summary> /// <param name="displayUnit">the unit of time covered by the viewport at one time</param> /// <param name="startTime">the time at which the canvas starts</param> /// <param name="endTime">the time at which the canvas ends</param> public GraphScaleData(FrameNodeLevel displayUnit, DateTime startTime, DateTime endTime, int totalFilters = 0) { DisplayUnit = displayUnit; Debug.Assert(displayUnit != FrameNodeLevel.Second); DateTime spanStart; _empty = true; //graph is initially empty TimeSpan span; switch (displayUnit) { case FrameNodeLevel.Root: span = endTime.Subtract(startTime); spanStart = CanvasManager.FileManager.StartTime; break; case FrameNodeLevel.Year: spanStart = new DateTime(startTime.Year, 1, 1); span = new DateTime(startTime.Year + 1, 1, 1).Subtract(spanStart); break; case FrameNodeLevel.Month: spanStart = new DateTime(startTime.Year, startTime.Month, 1); span = spanStart.AddMonths(1).Subtract(spanStart); break; case FrameNodeLevel.Day: spanStart = new DateTime(startTime.Year, startTime.Month, startTime.Day); span = spanStart.AddDays(1).Subtract(spanStart); break; case FrameNodeLevel.Hour: spanStart = new DateTime(startTime.Year, startTime.Month, startTime.Day, startTime.Hour, 0, 0); span = spanStart.AddHours(1).Subtract(spanStart); break; case FrameNodeLevel.PartHour: spanStart = new DateTime(startTime.Year, startTime.Month, startTime.Day, startTime.Hour, startTime.Minute - (startTime.Minute % 5), 0); span = spanStart.AddMinutes(5).Subtract(spanStart); break; case FrameNodeLevel.Minute: spanStart = new DateTime(startTime.Year, startTime.Month, startTime.Day, startTime.Hour, startTime.Minute, 0); span = spanStart.AddMinutes(1).Subtract(spanStart); break; default: throw new ArgumentOutOfRangeException("displayUnit", displayUnit, "GraphScaleData Constructor: RenderUnit out of range. Seconds cannot be subdivided, and are not valid."); } XShift = (float)startTime.Subtract(spanStart).TotalSeconds; XShift -= CanvasManager.TimeToOffset(spanStart); BaseScale = (float)(span.TotalSeconds); TotalPackets = 0; TotalData = 0; VertexCount = 0; TotalMatchingPackets = new List <long>(totalFilters); MinMatchingCount = new List <long>(totalFilters); MaxMatchingCount = new List <long>(totalFilters); for (int k = 0; k < totalFilters; k++) { TotalMatchingPackets.Add(0); MinMatchingCount.Add(0); MaxMatchingCount.Add(0); } }
public CountProcessOptions(DateTime start, DateTime end, FrameNodeLevel renderUnit) : this() { this.Start = start; this.End = end; this.RenderUnit = renderUnit; }
public void Generate(CanvasData data) { Debug.Assert(data.RenderUnit != FrameNodeLevel.Root); //cannot render at the root level var start = data.StartTime; var end = data.EndTime; MajorOffsets.Clear(); MinorOffsets.Clear(); DateTime currMajor, currMinor, tmp; switch (data.RenderUnit) { case FrameNodeLevel.Year: case FrameNodeLevel.Month: currMinor = new DateTime(start.Year, 1, 1); tmp = new DateTime(end.Year, 1, 1); if (end != tmp) { end = tmp.AddYears(1); } while (currMinor <= end) { MinorOffsets.Add(CanvasManager.TimeToOffset(currMinor)); currMinor = currMinor.AddYears(1); } MinorTickLevel = FrameNodeLevel.Year; break; case FrameNodeLevel.Day: currMajor = new DateTime(start.Year, 1, 1); currMinor = currMajor; // end of first month tmp = new DateTime(end.Year, 1, 1); if (end != tmp) { end = tmp.AddYears(1); } while (currMajor <= end) { MajorOffsets.Add(CanvasManager.TimeToOffset(currMajor)); currMajor = currMajor.AddYears(1); while (currMinor < currMajor) { MinorOffsets.Add(CanvasManager.TimeToOffset(currMinor)); currMinor = currMinor.AddMonths(1); } } MinorTickLevel = FrameNodeLevel.Month; break; case FrameNodeLevel.Hour: currMajor = new DateTime(start.Year, start.Month, 1); currMinor = currMajor; // 2nd day tmp = new DateTime(end.Year, end.Month, 1); if (end != tmp) { end = tmp.AddMonths(1); } while (currMajor <= end) { MajorOffsets.Add(CanvasManager.TimeToOffset(currMajor)); currMajor = currMajor.AddMonths(1); while (currMinor < currMajor) { MinorOffsets.Add(CanvasManager.TimeToOffset(currMinor)); currMinor = currMinor.AddDays(1); } } MinorTickLevel = FrameNodeLevel.Day; break; case FrameNodeLevel.PartHour: currMajor = new DateTime(start.Year, start.Month, start.Day); currMinor = currMajor; // 2nd day tmp = new DateTime(end.Year, end.Month, end.Day); if (end != tmp) { end = tmp.AddDays(1); } while (currMajor <= end) { MajorOffsets.Add(CanvasManager.TimeToOffset(currMajor)); currMajor = currMajor.AddDays(1); while (currMinor < currMajor) { MinorOffsets.Add(CanvasManager.TimeToOffset(currMinor)); currMinor = currMinor.AddHours(1); } } MinorTickLevel = FrameNodeLevel.Hour; break; case FrameNodeLevel.Minute: currMajor = new DateTime(start.Year, start.Month, start.Day, start.Hour, 0, 0); currMinor = currMajor; // 2nd day tmp = new DateTime(end.Year, end.Month, end.Day, start.Hour, 0, 0); if (end != tmp) { end = tmp.AddHours(1); } while (currMajor <= end) { MajorOffsets.Add(CanvasManager.TimeToOffset(currMajor)); currMajor = currMajor.AddHours(1); while (currMinor < currMajor) { MinorOffsets.Add(CanvasManager.TimeToOffset(currMinor)); currMinor = currMinor.AddMinutes(10); } } MinorTickLevel = FrameNodeLevel.PartHour; break; case FrameNodeLevel.Second: currMajor = new DateTime(start.Year, start.Month, start.Day, start.Hour, start.Minute - (start.Minute % 5), 0); currMinor = currMajor; // 2nd day tmp = new DateTime(end.Year, end.Month, end.Day, end.Hour, end.Minute - (start.Minute % 5), 0); if (end != tmp) { end = tmp.AddMinutes(5); } while (currMajor <= end) { MajorOffsets.Add(CanvasManager.TimeToOffset(currMajor)); currMajor = data.DisplayUnit == FrameNodeLevel.Minute ? currMajor.AddMinutes(1) : currMajor.AddMinutes(5); while (currMinor < currMajor) { MinorOffsets.Add(CanvasManager.TimeToOffset(currMinor)); currMinor = data.DisplayUnit == FrameNodeLevel.Minute ? currMinor.AddSeconds(1) : currMinor.AddMinutes(1); } } MinorTickLevel = FrameNodeLevel.Minute; break; default: throw new ArgumentOutOfRangeException("axisMajorLevel"); } //generate major axis if (MajorOffsets.Count > 0) { _majorTick = new Vector2[MajorOffsets.Count * 2]; _majorGrid = new Vector2[MajorOffsets.Count * 2]; for (int k = 0; k < MajorOffsets.Count; k++) { _majorTick[k * 2] = new Vector2(MajorOffsets[k], 0); _majorGrid[k * 2] = new Vector2(MajorOffsets[k], 0); _majorTick[k * 2 + 1] = new Vector2(MajorOffsets[k], -CanvasManager.TickSize * 2 * CanvasManager.PixelSize.X); _majorGrid[k * 2 + 1] = new Vector2(MajorOffsets[k], 2); } _tickMajorBuffer.BindData(_majorTick); _gridMajorBuffer.BindData(_majorGrid); } else { _majorTick = null; } //generate minor axis if possible if (MinorOffsets.Count > 0) { _minorTick = new Vector2[MinorOffsets.Count * 2]; _minorGrid = new Vector2[MinorOffsets.Count * 2]; for (int k = 0; k < MinorOffsets.Count; k++) { _minorTick[k * 2] = new Vector2(MinorOffsets[k], 0); _minorGrid[k * 2] = new Vector2(MinorOffsets[k], 0); _minorTick[k * 2 + 1] = new Vector2(MinorOffsets[k], -(CanvasManager.TickSize * 2) * MinorTickScale * CanvasManager.PixelSize.X); _minorGrid[k * 2 + 1] = new Vector2(MinorOffsets[k], 2); } _tickMinorBuffer.BindData(_minorTick); _gridMinorBuffer.BindData(_minorGrid); } else { _minorTick = null; } }
public FrameElement GetFrameElement(DateTime start, FrameNodeLevel level) { FrameElement element; DateTime end; switch (level) { case FrameNodeLevel.Year: if (SafeEquals(start, new DateTime(start.Year, 1, 1), level)) { start = new DateTime(start.Year, 1, 1); } else { start = new DateTime(start.Year + 1, 1, 1); //if error caused year value to decrease } end = start.AddYears(1); break; case FrameNodeLevel.Month: if (SafeEquals(start, new DateTime(start.Year, start.Month, 1), level)) { start = new DateTime(start.Year, start.Month, 1); } else { start = new DateTime(start.Year, start.Month, 1).AddMonths(1); //if error caused year value to decrease } end = start.AddMonths(1); break; case FrameNodeLevel.Day: if (SafeEquals(start, new DateTime(start.Year, start.Month, start.Day), level)) { start = new DateTime(start.Year, start.Month, start.Day); } else { start = new DateTime(start.Year, start.Month, start.Day).AddMonths(1); //if error caused year value to decrease } end = start.AddDays(1); break; case FrameNodeLevel.Hour: if (SafeEquals(start, new DateTime(start.Year, start.Month, start.Day, start.Hour, 0, 0), level)) { start = new DateTime(start.Year, start.Month, start.Day, start.Hour, 0, 0); } else { start = new DateTime(start.Year, start.Month, start.Day, start.Hour, 0, 0).AddHours(1); //if error caused year value to decrease } end = start.AddHours(1); break; case FrameNodeLevel.PartHour: if (SafeEquals(start, new DateTime(start.Year, start.Month, start.Day, start.Hour, start.Minute - (start.Minute % 5), 0), level)) { start = new DateTime(start.Year, start.Month, start.Day, start.Hour, start.Minute - (start.Minute % 5), 0); } else { start = new DateTime(start.Year, start.Month, start.Day, start.Hour, start.Minute - (start.Minute % 5), 0).AddMinutes(5); //if error caused year value to decrease } end = start.AddMinutes(10); break; case FrameNodeLevel.Minute: if (SafeEquals(start, new DateTime(start.Year, start.Month, start.Day, start.Hour, start.Minute, 0), level)) { start = new DateTime(start.Year, start.Month, start.Day, start.Hour, start.Minute, 0); } else { start = new DateTime(start.Year, start.Month, start.Day, start.Hour, start.Minute, 0).AddMinutes(1); //if error caused year value to decrease } end = start.AddMinutes(1); break; case FrameNodeLevel.Second: if (SafeEquals(start, new DateTime(start.Year, start.Month, start.Day, start.Hour, start.Minute, start.Second), level)) { start = new DateTime(start.Year, start.Month, start.Day, start.Hour, start.Minute, start.Second); } else { start = new DateTime(start.Year, start.Month, start.Day, start.Hour, start.Minute, start.Second).AddSeconds(1); //if error caused year value to decrease } end = start.AddSeconds(1); break; default: throw new ArgumentOutOfRangeException(); } return(FindFrameElement(start, end, level, out element) ? element : null); }
protected internal bool FindFrameElement(DateTime start, DateTime end, FrameNodeLevel level, out FrameElement element) { element = null; if (start >= EndTime || end <= StartTime) { return(false); } if (level == Level) { bool test; switch (level) { case FrameNodeLevel.Year: test = start.Year == StartTime.Year; break; case FrameNodeLevel.Month: test = start.Year == StartTime.Year && start.Month == StartTime.Month; break; case FrameNodeLevel.Day: test = start.Date == StartTime.Date; break; case FrameNodeLevel.Hour: test = start.Date == StartTime.Date && start.Hour == StartTime.Hour; break; case FrameNodeLevel.PartHour: test = start.Date == StartTime.Date && start.Hour == StartTime.Hour && start.Minute - (start.Minute % 5) == StartTime.Minute - (StartTime.Minute % 5); break; case FrameNodeLevel.Minute: test = start.Date == StartTime.Date && start.Hour == StartTime.Hour && start.Minute == StartTime.Minute; break; case FrameNodeLevel.Second: test = start == StartTime; break; default: throw new ArgumentOutOfRangeException("level"); } if (test) { element = this; return(true); } return(false); } if ((int)level > (int)Level && start <= EndTime && end >= StartTime) //check children { foreach (FrameElement child in Children) { if (child.FindFrameElement(start, end, level, out element)) { return(true); } } } return(false); }
/// <summary> /// Internal recursive method to build a graph canvas over a specified period at the the specified depth /// </summary> /// <param name="start">the start of the period to draw</param> /// <param name="end">the end of the period to draw</param> /// <param name="renderUnit">the depth at which to render</param> /// <param name="data">the canvas to fill</param> protected internal List <FrameElement> GenerateCanvasElements(DateTime start, DateTime end, FrameNodeLevel renderUnit) { Debug.Assert(Level != FrameNodeLevel.Second); //if definitely overlaps to some degree if (end <= StartTime || start >= EndTime) { return(new List <FrameElement>()); } if (Children.Count == 0) { FileManager.FillFrameElement(this); } var valid = Children.Where(c => end > c.StartTime && start < c.EndTime).ToList(); return(Children[0].Level == renderUnit ? valid : valid.SelectMany(v => v.GenerateCanvasElements(start, end, renderUnit)).ToList()); }