public override async Task Start(Models.Simulation model, CancellationToken token, int interval = 5000) { var generator = new Log141Generator(); var index = 0d; var logList = new Log() { UidWell = model.WellUid, NameWell = model.WellName, UidWellbore = model.WellboreUid, NameWellbore = model.WellboreName, Uid = model.LogUid, Name = model.LogName, IndexType = model.LogIndexType } .AsList(); while (true) { if (token.IsCancellationRequested) { break; } var result = Connection.Read(new LogList() { Log = logList }, OptionsIn.ReturnElements.HeaderOnly); if (!result.Log.Any()) { Runtime.Invoke(() => Runtime.ShowError("Log not found.")); break; } var log = result.Log[0]; if (log.IndexType != LogIndexType.datetime && log.EndIndex != null) { index = log.EndIndex.Value; } log.Direction = LogIndexDirection.increasing; log.IndexCurve = model.Channels.Select(x => x.ChannelName).FirstOrDefault(); log.LogCurveInfo = model.Channels.Select(ToLogCurveInfo).ToList(); index = generator.GenerateLogData(log, startIndex: index, interval: 0.1); result.Log[0].LogData[0].MnemonicList = ToList(result.Log[0], x => x.Mnemonic.Value); result.Log[0].LogData[0].UnitList = ToList(result.Log[0], x => x.Unit); Connection.Update(result); await Task.Delay(interval); } }
public Log141ProxyViewModel(IRuntimeService runtime, Connections.Connection connection) : base(connection, WMLSVersion.WITSML141) { Runtime = runtime; Generator = new Log141Generator(); }
public override async Task Start(Models.Simulation model, CancellationToken token, TextEditorViewModel messages, int interval = 5000, double?increment = null) { _messages = messages; _counter = 0; Model = model; var generator = new Log141Generator(); var index = 0d; var log = GetLogToUpdate(); if (log == null) { Runtime.Invoke(() => Runtime.ShowError("Log not found.")); return; } if (log.IndexType != LogIndexType.datetime && log.EndIndex != null) { index = log.EndIndex.Value; } var depthIncrement = increment ?? 0.1; if (log.Direction.HasValue && log.Direction == LogIndexDirection.decreasing) { depthIncrement *= -1; } var logCurveInfo = model.Channels.Select(ToLogCurveInfo).ToList(); var previousTimestamp = (DateTimeOffset.UtcNow - TimeSpan.FromMinutes(model.DateTimeIndexOffsetInMinutes) - TimeSpan.FromMilliseconds(interval)).TruncateToSeconds(); var timeIncrement = TimeSpan.FromMilliseconds(increment ?? 1000); while (true) { var swOuter = new Stopwatch(); swOuter.Start(); if (token.IsCancellationRequested) { break; } _counter++; var currentTimestamp = (DateTimeOffset.UtcNow - TimeSpan.FromMinutes(model.DateTimeIndexOffsetInMinutes)).TruncateToSeconds(); var rows = (int)(currentTimestamp - previousTimestamp).TotalSeconds; // Clear any previously existing log data. List <string> indexes; if (log.IndexType == LogIndexType.datetime) { indexes = generator.GenerateDateTimeIndexes(rows, previousTimestamp, timeIncrement); } else { indexes = generator.GenerateNumericIndexes(rows, index, depthIncrement); index += depthIncrement * rows; } var logData = generator.GenerateLogData(logCurveInfo, indexes, Model.GenerateNulls); // Create minimal log object var update = new LogList { Log = new List <Log> { new Log { Uid = Model.LogUid, UidWell = Model.WellUid, UidWellbore = Model.WellboreUid, IndexType = log.IndexType, LogData = new List <LogData>() { logData } } } }; var swInner = new Stopwatch(); try { swInner.Start(); Connection.Update(update); swInner.Stop(); swOuter.Stop(); Log($"Update #{_counter} was successful. Added {rows} rows. Time taken : {swOuter.ElapsedMilliseconds} ms. UpdateInStore time : {swInner.ElapsedMilliseconds} ms."); } catch (Exception ex) { swInner.Stop(); swOuter.Stop(); Log($"Update #{_counter} was unsuccessful. Time taken : {swOuter.ElapsedMilliseconds} ms. UpdateInStore time : {swInner.ElapsedMilliseconds} ms.\n{ex.Message}"); } previousTimestamp = currentTimestamp; // Compensate for the time it took to send the update in store var delayInterval = swOuter.ElapsedMilliseconds > interval ? 0 : interval - swOuter.ElapsedMilliseconds; try { await Task.Delay((int)delayInterval, token); } catch (TaskCanceledException) { break; } } }