public static async Task <VideoView> Create(IDataPoint datapoint, TimeSynchronizedContext context)
        {
            // TODO: Check that this datapoint has a type that can be used
            var viewer = await context.GetDataViewerFor(datapoint);

            var view = new VideoView(context, datapoint);

            view.AddViewer(viewer);

            if (!(viewer is ArchiveVideoVideoViewer videoViewer))
            {
                return(view);
            }

            var(streamFactory, mime) = videoViewer.Video.GetStreamFactory();
            view.SetStreamFactory(streamFactory, mime);

            if (viewer.DataPoint.Time is ArchiveVideoTime time)
            {
                view.StartTime              = time.Offset;
                time.OffsetChanged         += (s, offset) => view.StartTime = offset;
                view._player.OffsetChanged += (s, offset) => time.VideoPlaybackOffset = TimeFormatter.TimeFromSeconds(offset);
            }

            context.SelectedTimeRangeChanged += view.OnSelectedTimeRangeChanged;
            context.IsPlayingChanged         += view.IsPlayingChanged;
            context.PlaybackRateChanged      += view.PlaybackRateChanged;
            view.IsPlayingChanged(null, context.IsPlaying);
            view.PlaybackRateChanged(null, context.PlaybackRate);

            return(view);
        }
        public static async Task <CorrelationPlot> Create(IDataPoint datapoint, TimeSynchronizedContext context, ISyncPage pointSyncPage)
        {
            var correlationPlot = new CorrelationPlot(context, datapoint, pointSyncPage);
            var lineDrawer      = await correlationPlot.CreateLineDrawer(datapoint);

            correlationPlot.AddLine(lineDrawer);
            return(correlationPlot);
        }
        public static async Task <LinePlot> Create(IDataPoint datapoint, TimeSynchronizedContext context)
        {
            var linePlot = new LinePlot(context, datapoint);

            var lineDrawer = await linePlot.CreateLineDrawer(datapoint);

            linePlot.AddLine(lineDrawer);
            return(linePlot);
        }
예제 #4
0
        private void TestDataSet(long[] timeArray, double[] dataArray, int maxNum)
        {
            Assert.Equal(timeArray.Length, dataArray.Length);

            var time = new TableTimeIndex("time", new Task <long[]>(() => timeArray), true, "test:/time", "t");
            var data = new GenericColumn <double>("acc_x", new Task <double[]>(() => dataArray), time, "test/acc", "a");

            var tsc = new TimeSynchronizedContext();

            tsc.SetSynchronizedToWorldClock(false);
            var dataViewerTask = tsc.GetDataViewerFor(data);

            dataViewerTask.Wait();
            var viewer = dataViewerTask.Result as ITimeSeriesViewer;

            Assert.NotNull(viewer);
            viewer.PreviewPercentage = 0;

            var startTime = timeArray[0];

            Assert.Equal(0, tsc.AvailableTimeFrom);
            Assert.Equal(timeArray.Last() - startTime, tsc.AvailableTimeTo);
            tsc.SetSelectedTimeRange(tsc.AvailableTimeFrom, tsc.AvailableTimeTo);

            var dataView = viewer.GetCurrentData <double>();

            var en = dataView.GetEnumerator(maxNum);

            var count = 0;

            Assert.True(en.MoveNext());
            count++;
            Assert.Equal(timeArray.First(), en.Current.x);
            Assert.Equal(dataArray.First(), en.Current.y);
            while (en.MoveNext())
            {
                count++;
            }
            Assert.Equal(timeArray.Last(), en.Current.x);
            Assert.Equal(dataArray.Last(), en.Current.y);
            if (maxNum > 0)
            {
                Assert.InRange(count, maxNum, maxNum + 2);
            }
            else
            {
                Assert.Equal(count, timeArray.Length);
            }
        }
예제 #5
0
        public async void ChangeSingleDataArchive()
        {
            Guid sessionId = Guid.NewGuid(); // Todo fake sessionId
            var  tmpName   = CreateTestArchive(sessionId);
            var  tmpName2  = Path.GetTempFileName();

            long preFrom;
            long preTo;

            long[] preData;

            const long offset = 10L;

            using (var fr = new FileReader(tmpName))
            {
                var archive = await Archive.Open(fr);

                var readFolder = archive.Sessions.First().Children.First();

                var child = readFolder.Children.First();
                Assert.IsAssignableFrom <ArchiveTable>(child);
                var tableChild = (ArchiveTable)child;

                var dataPoint = tableChild.DataPoints.First();
                var context   = new TimeSynchronizedContext();
                context.SetSynchronizedToWorldClock(true);
                context.AvailableTimeRangeChanged +=
                    (sender, from, to) => context.SetSelectedTimeRange(from, to);
                var viewer = await context.GetDataViewerFor(dataPoint);

                var timeViewer = (ITimeSeriesViewer)viewer;

                preData = timeViewer.GetCurrentData <double>().X.ToArray();


                preFrom = context.AvailableTimeFrom;
                preTo   = context.AvailableTimeTo;

                dataPoint.Time.TransformTime(offset, 1);

                await archive.WriteFile(tmpName2);

                archive.Close();
            }

            File.Delete(tmpName);
            using (var fileReader = new FileReader(tmpName2))
            {
                var archive = await Archive.Open(fileReader);

                var readFolder = archive.Sessions.First().Children.First();

                var child = readFolder.Children.First();
                Assert.IsAssignableFrom <ArchiveTable>(child);
                var tableChild = (ArchiveTable)child;

                var dataPoint = tableChild.DataPoints.First();
                var context   = new TimeSynchronizedContext();
                context.SetSynchronizedToWorldClock(true);
                context.AvailableTimeRangeChanged +=
                    (sender, from, to) => context.SetSelectedTimeRange(from, to);
                var viewer = await context.GetDataViewerFor(dataPoint);

                var timeViewer = (ITimeSeriesViewer)viewer;
                var postData   = timeViewer.GetCurrentData <double>().X.ToArray();

                Assert.Equal(preFrom + offset, context.AvailableTimeFrom);
                Assert.Equal(preTo + offset, context.AvailableTimeTo);
                for (var i = 0; i < preData.Length; i++)
                {
                    Assert.Equal(preData[i] + offset, postData[i]);
                }
            }

            File.Delete(tmpName2);
        }
예제 #6
0
        public void SaveSingleDataArchive()
        {
            Guid sessionId = Guid.NewGuid(); // Todo fake sessionId

            var tmpName = Path.GetTempFileName();

            var timeData   = new[] { 1L, 2L, 3L };
            var timeColumn = new DataColumn(
                new DataField <long>("time"),
                timeData);

            var numbersData   = new[] { 42d, 1337d, 6.022e23 };
            var numbersColumn = new DataColumn(
                new DataField <double>("cool_numbers"),
                numbersData);

            var schema = new Schema(timeColumn.Field, numbersColumn.Field);

            var json = new JObject {
                ["meta"] = new JObject(), ["user"] = new JObject()
            };


            using (var ms = new MemoryStream())
            {
                using (var parquetWriter = new ParquetWriter(schema, ms))
                    using (var groupWriter = parquetWriter.CreateRowGroup())
                    {
                        groupWriter.WriteColumn(timeColumn);
                        groupWriter.WriteColumn(numbersColumn);
                    }
                ms.Position = 0;

                using (var parquetReader = new ParquetReader(ms)) {
                    var tableInformation = new ArchiveTableInformation()
                    {
                        Columns = new List <DataField>(parquetReader.Schema.GetDataFields()),
                        Time    = timeColumn.Field
                    };
                    var table = new ArchiveTable(json, parquetReader, tableInformation, "testData");

                    var archive = Archive.Create(tmpName);

                    var session = ArchiveSession.Create(archive, "testName");
                    var folder  = ArchiveFolder.Create(archive, sessionId, "testFolder");

                    folder.AddChild(table);
                    session.AddChild(folder);
                    archive.AddSession(session);

                    try
                    {
                        archive.WriteFile().Wait();
                    }
                    catch (Exception)
                    {
                        Assert.True(false);
                    }

                    archive.Close();

                    using (var fr = new FileReader(tmpName))
                    {
                        var openTask = Archive.Open(fr);
                        openTask.Wait();
                        var newArchive = openTask.Result;
                        AssertArchivesEqual(archive, newArchive);

                        Assert.Equal("testName", session.Name);
                        Assert.Single(newArchive.Sessions.First().Children);
                        var readFolder = newArchive.Sessions.First().Children.First();
                        Assert.Equal("testFolder", readFolder.Name);
                        Assert.Single(readFolder.Children);

                        var child = readFolder.Children.First();
                        Assert.Single(child.DataPoints);

                        Assert.IsAssignableFrom <ArchiveTable>(child);
                        var tableChild = (ArchiveTable)child;

                        var dataPoint = tableChild.DataPoints.First();
                        var context   = new TimeSynchronizedContext();
                        context.AvailableTimeRangeChanged +=
                            (sender, from, to) => context.SetSelectedTimeRange(from, to);

                        var viewer = context.GetDataViewerFor(dataPoint);
                        viewer.Wait();
                        var dataViewer = viewer.Result;

                        Assert.IsAssignableFrom <ITimeSeriesViewer>(dataViewer);
                        var timeViewer = (ITimeSeriesViewer)dataViewer;

                        var data = timeViewer.GetCurrentData <double>();
                        Assert.Equal("cool_numbers", dataViewer.DataPoint.Name);

                        Assert.Equal(timeData, data.X.ToArray());
                        Assert.Equal(numbersData, data.Y.ToArray());

                        newArchive.Close();
                    }
                }
            }

            File.Delete(tmpName);
        }
 protected VideoView(TimeSynchronizedContext context, IDataPoint dataPoint) : base(context, dataPoint)
 {
 }
 protected LinePlot(TimeSynchronizedContext context, IDataPoint dataPoint) : base(context, dataPoint)
 {
 }
 private CorrelationPlot(TimeSynchronizedContext context, IDataPoint dataPoint, ISyncPage pointSyncPage) : base(context, dataPoint)
 {
     this.Canvas.EnableTouchEvents = true;
     this.Canvas.Touch            += OnTouch;
     this._pointSyncPage           = pointSyncPage;
 }
 public DrawPlot(TimeSynchronizedContext context, IDataPoint dataPoint) : base(context, dataPoint)
 {
     _context = context;
     PlotType = PlotTypes.Line;
 }