public static bool SameArtifactExists(this List <DetectionArtifact> data, DetectionArtifact newData) { foreach (var item in data) { if (item.StartTime.Equals(newData.StartTime) && item.EndTime.Equals(newData.EndTime) && item.Category == newData.Category) { return(true); } } return(false); }
internal void ProcessPatterns(byte[] UPByte, byte[] FHRByte, bool bLive = false) { lock (s_mainLockObject) { int startIndex = 0; int length = UPByte.Length; String logHeader = "Patterns Add On Manager, Patterns Session Data, Process Patterns"; System.Diagnostics.Trace.WriteLine("ProcessPatterns reached"); try { //int time_frame = 86400; //int position = 0; //int end = UPByte.Length; ////ProcessAccumulator++; //// In case of live calculation we send to Engine chunks of 60 seconds of tracings each iteration. //int time_increment = bLive ? 60 : time_frame; //// Process the data AS IS //int buffer_size = 0; //while (position < end) //{ // int block_size = Math.Min(time_increment, end - position); // if (bLive && UPByte.Length - position < 60) // break; // DateTime startCalc = DateTime.Now; // buffer_size = NativeMethods.EngineProcessUP(EngineWorkerHandle, UPByte, position, block_size); // buffer_size = NativeMethods.EngineProcessHR(EngineWorkerHandle, FHRByte, 4 * position, 4 * block_size); // position += time_increment; // if (bLive) // { // m_upToProcess.RemoveRange(0, time_increment); // m_fhrToProcess.RemoveRange(0, (time_increment * 4)); // } // else // { // m_upToProcess.Clear(); // m_fhrToProcess.Clear(); // } // // Read the results // if (buffer_size > 0) // { // var data = new StringBuilder(buffer_size); // bool moreData = NativeMethods.EngineReadResults(EngineWorkerHandle, data, buffer_size); // //if ((DateTime.Now - LastMeasure).TotalSeconds > 30) // //{ // // var nTime = (((DateTime.Now - startCalc).TotalMilliseconds) / (block_size * ProcessAccumulator)) * 1800f; // // Logger.WriteLogEntry(TraceEventType.Verbose, logHeader, "Required time for 30 minutes calculation is: " + nTime.ToString()); // // CalcTime30Sec = nTime; // //} // //ProcessAccumulator = 0; // string[] lines = data.ToString().Split("\r\n".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); // foreach (string line in lines) // { // Logger.WriteLogEntry(TraceEventType.Verbose, logHeader, "Unformatted Artifact: " + line); // var artifact = line.ToDetectionArtifact(StartTime); // if (artifact != null) // { // Results.Add(artifact); // //Logger.WriteLogEntry(TraceEventType.Verbose, logHeader, "Artifact: " + artifact.ToString() + "Absolute StartTime: " + StartTime.ToString()); // //if (artifact is PeriGen.Patterns.Engine.Data.Baseline) // //{ // // var bl = artifact as PeriGen.Patterns.Engine.Data.Baseline; // // Logger.WriteLogEntry(TraceEventType.Verbose, logHeader, "Baseline: Y1: " + bl.Y1.ToString() + "Baseline Y2: " + bl.Y2.ToString()); // //} // } // } // Logger.WriteLogEntry(TraceEventType.Verbose, logHeader, "StartTime: " + StartTime.ToString()); // } bool engineInitialized = PatternsProcessorManager.Instance.InitializeVisit(GUID); if (!engineInitialized) { throw new InvalidOperationException("Unable to initialize the calculation engine"); } StringBuilder data1 = new StringBuilder(); bool moreData1 = PatternsProcessorManager.Instance.ProcessVisit(GUID, UPByte, FHRByte, startIndex, length, ref data1); if (data1.Length > 0) { Debug.Assert(!moreData1); string[] lines = data1.ToString().Split("\r\n".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); foreach (string line in lines) { var artifact = line.ToDetectionArtifact(this.StartTime); if (artifact != null) { Results.Add(artifact); } } } TracingData td; Logger.WriteLogEntry(TraceEventType.Verbose, logHeader, "Before dequeue GUIDQueue size: " + m_GUIDQueue.Count); bool bSucc = m_GUIDQueue.TryDequeue(out td); Logger.WriteLogEntry(TraceEventType.Verbose, logHeader, "After dequeue GUIDQueue size: " + m_GUIDQueue.Count); if (!bSucc || td == null) { Logger.WriteLogEntry(TraceEventType.Verbose, logHeader, "Couldn't retrieve TracingData, probably broken GUID, try reinitializing."); } DetectionArtifact first = Results.FirstOrDefault(c => c.StartTime.Equals(Results.Min(d => d.StartTime))); DetectionArtifact last = Results.FirstOrDefault(c => c.StartTime.Equals(Results.Max(d => d.StartTime))); if (first != null && last != null) { Logger.WriteLogEntry(TraceEventType.Verbose, logHeader, "ProcessPatterns: Results size = " + Results.Count); Logger.WriteLogEntry(TraceEventType.Verbose, logHeader, "First Element: Category: " + first.Category.ToString() + ", Start Time: " + first.StartTime.ToString() + ", End Time: " + first.EndTime.ToString()); Logger.WriteLogEntry(TraceEventType.Verbose, logHeader, "Last Element: Category: " + last.Category.ToString() + ", Start Time: " + last.StartTime.ToString() + ", End Time: " + last.EndTime.ToString()); Logger.WriteLogEntry(TraceEventType.Verbose, logHeader, "ProcessPatterns: call PrepareProcessPatterns"); System.Diagnostics.Trace.WriteLine("ProcessPatterns: Results size = " + Results.Count); System.Diagnostics.Trace.WriteLine("============================================\nFirst Element: Category: " + first.Category.ToString() + ", Start Time: " + first.StartTime.ToString() + ", End Time: " + first.EndTime.ToString()); System.Diagnostics.Trace.WriteLine("Last Element: Category: " + last.Category.ToString() + ", Start Time: " + last.StartTime.ToString() + ", End Time: " + last.EndTime.ToString() + "\n============================================"); System.Diagnostics.Trace.WriteLine("ProcessPatterns: call PrepareProcessPatterns"); } PrepareProcessPatterns(); } catch (Exception ex) { Logger.WriteLogEntry(TraceEventType.Critical, logHeader, ex.Message); } } }