Exemplo n.º 1
0
        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);
                }
            }
        }