private void FireEvents(SeanseState prevState, SeanseState state) { // Eсли перешел в активный if (isActiveEnded && prevState != SeanseState.Active && state == SeanseState.Active) { isActiveEnded = false; ActiveStart.Invoke(this, new EventArgs()); } // Если Вышел из активного IEnumerable <SignalEntry> activeEntries = signalEntries.Where(x => x.Type != EntryType.Error && x.Size - x.Errors > (int)Mode); if (!isActiveEnded && activeEntries.Any() && !(activeEntries.Last().Time > (DateTime.Now - delay).AddMinutes(-config.MinutesToAwaitAfterEnd) && activeEntries.Last().Time <= (DateTime.Now - delay))) { isActiveEnded = true; ActiveEnd.Invoke(this, new EventArgs()); } // Если начал работу if (isEnded && state != SeanseState.WorkingLevel0) { isEnded = false; WorkingStart.Invoke(this, new EventArgs()); } // Если окончил работу if (!isEnded && signalEntries.Where(x => x.Time > (DateTime.Now - delay).AddMinutes(-config.MinutesToAwaitAfterEnd) && x.Time <= DateTime.Now - delay).Count() == 0) { isEnded = true; WorkingEnd.Invoke(this, new EventArgs()); } }
public Seanse(string directory, Configuration config, IParser parser, ILogger logger) { this.Directory = new DirectoryInfo(directory); this.DirectoryExists = Directory.Exists; if (!DirectoryExists) { throw new LogFileNotFoundException(); } this.TuningChartUnits = new List <TuningChartUnit>(); this.WorkingChartUnits = new List <WorkingChartUnit>(); this.activeEntries = new List <ActiveEntry>(); this.remark = ""; this.logger = logger; this.signalEntries = new List <SignalEntry>(); this.parser = parser; this.config = config; this.mode = Mode.Unknown; this.prevState = SeanseState.WorkingLevel0; this.state = SeanseState.WorkingLevel0; this.isEnded = true; this.isActiveEnded = true; this.lastUpdateLogFileLength = 0; this.abonents = new List <AbonentInfo>(); this.ChannelInfo = new Channel { Server = "не известен" }; Update(); }
private SeanseState GetState() { SeanseState result = SeanseState.WorkingLevel0; if (signalEntries.Any()) { List <SignalEntry> lastEntries = signalEntries.Where(x => (DateTime.Now - delay - new TimeSpan(0, 3, 0)) < x.Time && x.Time <= (DateTime.Now - delay)).ToList(); if (lastEntries.Where(x => x.Type != EntryType.Error && ((x.Size - x.Errors) > (int)Mode)).Any()) { result = SeanseState.Active; } else if (lastEntries.Count >= countForWorkingLevel5) { result = SeanseState.WorkingLevel5; } else if (lastEntries.Count >= countForWorkingLevel4) { result = SeanseState.WorkingLevel4; } else if (lastEntries.Count >= countForWorkingLevel3) { result = SeanseState.WorkingLevel3; } else if (lastEntries.Count >= countForWorkingLevel2) { result = SeanseState.WorkingLevel2; } else if (lastEntries.Count >= 1 && signalEntries.Where(x => x.Type != EntryType.Error).Count() > config.Trashold) { result = SeanseState.WorkingLevel1; } } return(result); }
public void Update() { // Если директория существует if (!System.IO.Directory.Exists(Directory.FullName)) { DirectoryExists = false; return; } DirectoryExists = true; // Размер лог файла long logFileLength = new FileInfo(Directory + "\\log.txt").Length; if (logFileLength != lastUpdateLogFileLength) { // Загрузить log.txt LoadAllLog(); // Загрузить allLog.txt LoadLog(); // Получить данные для графика расстройки TuningChartUnits = GetTuningChartUnits(config.SmoothValue); // Получить данные для графика объема SizeChartUnits = GetSizeChartUnits(); // Получить данные для графика работы WorkingChartUnits = GetWorkingChartUnits(new TimeSpan(0, 1, 0)); // Получить вхождения с объемом, превышающим норму List <ActiveEntry> newActiveEntries = signalEntries .Where(x => x.Type != EntryType.Error && ((x.Size - x.Errors) > (int)Mode)) .Select(x => new ActiveEntry { Time = x.Time, Size = x.Size - x.Errors }) .ToList(); ActiveEntries = newActiveEntries; // Получить абонентов Abonents = GetAbonents(signalEntries.First().Time, signalEntries.Last().Time, config.AbonentsK); // Установить время начала StartWorkingTime = signalEntries.First().Time; // Обновить конечное время for (int index = signalEntries.Count - 1; index >= 0; index--) { if (signalEntries[index].Type != EntryType.Error) { lastWorkingTime = signalEntries[index].Time; break; } } // Обновить сторку с интервалами string calculatedIntervals = ""; var intervalEntries = GetIntervals().OrderByDescending(interval => interval.Value).Take(3); foreach (var interval in intervalEntries) { calculatedIntervals += interval.Key + "(" + interval.Value + ") "; } this.Intervals = calculatedIntervals; // Обновить процент приема int notErrorsCount = signalEntries.Where(x => x.Type != EntryType.Error).Count(); if (notErrorsCount > 0) { PercentReceiving = (int)Math.Round(100f / signalEntries.Count() * notErrorsCount); } else { PercentReceiving = 0; } // Обновить задержку DateTime lastEntryTime = signalEntries.Last().Time; // В ОТДЕЛЬНЫХ СЛУЧАЯХ НЕ ВЕРНО ВРЕМЯ ПОСЛЕДНЕЙ ЗАПИСИ В ФАЙЛ var lastWriteTime = File.GetLastWriteTime(Path.Combine(Directory.FullName, "log.txt")); delay = lastWriteTime - lastEntryTime; // Обновить переменные объема MaxSize = GetMaxInFrames(); MaxSizeInBytes = (float)Math.Round(MaxSize * 3.75f, 2); AverageSize = (float)Math.Round(GetAverageSizeInFrames()); AverageSizeInBytes = (float)Math.Round(AverageSize * 3.75f, 2); // Обновить время последнего обновления LastUpdate = DateTime.Now; // Обновить размер лога при последнем обновлении lastUpdateLogFileLength = logFileLength; } // Обновить видимость if (config.HideEmptySeanses && !(signalEntries.Where(e => e.Type != EntryType.Error).Count() > config.Trashold)) { Visible = false; } else { Visible = true; } // Узнать состояние сеанса State = GetState(); // Запустить уведомления FireEvents(prevState, state); prevState = state; }