private async Task <ActiveError[]> GetEvents(TimeRange range, ActiveError[] alarms) { Timestamp tStart = range.GetStart(); Timestamp tEnd = range.GetEnd(); VTTQ[] data = await Connection.HistorianReadRaw(Var, tStart, tEnd, 10000, BoundingMethod.TakeLastN); var events = data.Select(VTTQ2Event).ToList(); Func <Timestamp, bool> isInRange = t => (t >= tStart && t <= tEnd); return(events.Concat(alarms.Where(a => !isInRange(a.TimeFirst) && isInRange(a.TimeLast))) .OrderByDescending(x => x.T) .ToArray()); }
public async Task <ReqResult> UiReq_LoadData(TimeRange timeRange) { LastTimeRange = timeRange; Timestamp tStart = timeRange.GetStart(); Timestamp tEnd = timeRange.GetEnd(); int maxDataPoints = configuration.PlotConfig.MaxDataPoints; var listHistories = new List <VTTQs>(); QualityFilter filter = configuration.PlotConfig.FilterByQuality; foreach (var variable in Variables) { try { VTTQs data = await Connection.HistorianReadRaw(variable, tStart, tEnd, maxDataPoints, BoundingMethod.CompressToN, filter); listHistories.Add(data); } catch (Exception) { listHistories.Add(new VTTQs()); } } IsLoaded = true; var(windowLeft, windowRight) = GetTimeWindow(timeRange, listHistories); dataRevision += 1; var res = MemoryManager.GetMemoryStream("LoadHistory"); try { using (var writer = new StreamWriter(res, Encoding.ASCII, 8 * 1024, leaveOpen: true)) { writer.Write("{ \"WindowLeft\": " + windowLeft.JavaTicks); writer.Write(", \"WindowRight\": " + windowRight.JavaTicks); writer.Write(", \"DataRevision\": " + dataRevision); writer.Write(", \"Data\": "); WriteUnifiedData(new JsonDataRecordArrayWriter(writer), listHistories); writer.Write('}'); } res.Seek(0, SeekOrigin.Begin); } catch (Exception) { res.Dispose(); throw; } return(new ReqResult(200, res)); }
private (Timestamp left, Timestamp right) GetTimeWindow(TimeRange range, List <VTTQs> data) { switch (range.Type) { case TimeType.Last: Timestamp?latest = data.Any(x => x.Count > 0) ? data.Where(x => x.Count > 0).Max(vtqs => vtqs.Last().T) : (Timestamp?)null; var now = Timestamp.Now.TruncateMilliseconds().AddSeconds(1); var right = latest.HasValue ? Timestamp.MaxOf(now, latest.Value) : now; var left = now - TimeRange.DurationFromTimeRange(range); return(left, right); case TimeType.Range: return(range.GetStart(), range.GetEnd()); default: throw new Exception("Unknown range type: " + range.Type); } }
public async Task <ReqResult> UiReq_DownloadFile( TimeRange timeRange, VariableRef[] variables, string[] variableNames, FileType fileType) { QualityFilter filter = configuration.PlotConfig.FilterByQuality; Timestamp tStart = timeRange.GetStart(); Timestamp tEnd = timeRange.GetEnd(); var listHistories = new List <VTTQs>(); foreach (var variable in variables) { try { const int ChunckSize = 5000; VTTQs data = await Connection.HistorianReadRaw(variable, tStart, tEnd, ChunckSize, BoundingMethod.TakeFirstN, filter); if (data.Count < ChunckSize) { listHistories.Add(data); } else { var buffer = new List <VTTQ>(data); do { Timestamp t = data[data.Count - 1].T.AddMillis(1); data = await Connection.HistorianReadRaw(variable, t, tEnd, ChunckSize, BoundingMethod.TakeFirstN, filter); buffer.AddRange(data); }while (data.Count == ChunckSize); listHistories.Add(buffer); } } catch (Exception) { listHistories.Add(new VTTQs()); } } var columns = new List <string>(); columns.Add("Time"); columns.AddRange(variableNames); var res = MemoryManager.GetMemoryStream("DownloadFile"); try { string contentType; switch (fileType) { case FileType.CSV: contentType = "text/csv"; using (var writer = new StreamWriter(res, Encoding.UTF8, 8 * 1024, leaveOpen: true)) { WriteUnifiedData(new CsvDataRecordArrayWriter(writer, columns, configuration.DataExport.CSV), listHistories); } break; case FileType.Spreadsheet: contentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; using (var excel = new ExcelPackage(res)) { ExcelWorksheet sheet = excel.Workbook.Worksheets.Add("Data Export"); WriteUnifiedData(new ExcelDataRecordArrayWriter(sheet, columns, configuration.DataExport.Spreadsheet), listHistories); excel.Save(); } break; default: throw new Exception($"Unknown file type: {fileType}"); } res.Seek(0, SeekOrigin.Begin); return(new ReqResult(200, res, contentType)); } catch (Exception) { res.Dispose(); throw; } }