예제 #1
0
        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();
 }
예제 #3
0
        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;
                }
            }
        }