public void SummaryWriterFlushRate1Test()
        {
            var stream        = new StringStream();
            var summaryWriter = new SummaryWriter(stream.Writer)
            {
                IdleFlushRate = 1, NonIdleFlushRate = 1
            };
            var measurement = new Measurement(new DateTime(2020, 12, 28, 0, 0, 1), 2400, 8000);
            var result      = new FlowMeter
            {
                Amplitude         = 0,
                HighPass          = 0,
                LowPassFast       = 2400,
                LowPassSlow       = 2402,
                Exclude           = false,
                ExcludeAll        = false,
                Flow              = false,
                LowPassOnHighPass = 5,
                Outlier           = false,
                Drift             = false
            };

            summaryWriter.AddMeasurement(measurement, result);
            summaryWriter.PrepareWrite();
            summaryWriter.Write();
            Assert.AreEqual("S,2400,0,0,0,2400,2402,5,0,0,0,8000,35625\r\n", stream.Content(), "single measurement written with sample value");
        }
        public void SummaryWriterFlushTest()
        {
            var stream        = new StringStream();
            var summaryWriter = new SummaryWriter(stream.Writer)
            {
                IdleFlushRate = 10, NonIdleFlushRate = 5
            };

            for (var i = 0; i < 3; i++)
            {
                var measurement = new Measurement(new DateTime(2020, 12, 28, 0, 0, i), 2400 + i, 8000 + i);
                var result      = new FlowMeter
                {
                    Amplitude         = i,
                    HighPass          = 0,
                    LowPassFast       = 2400,
                    LowPassSlow       = 2402,
                    Exclude           = false,
                    ExcludeAll        = false,
                    Flow              = false,
                    LowPassOnHighPass = 5 - i,
                    Outlier           = false,
                    Drift             = false
                };
                summaryWriter.AddMeasurement(measurement, result);
                summaryWriter.PrepareWrite();
                summaryWriter.Write();
                Assert.IsTrue(string.IsNullOrEmpty(stream.Content()), "nothing written yet");
            }
            summaryWriter.Flush();
            Assert.AreEqual("S,3,0,0,0,2400,2402,3,0,0,0,8001,50790\r\n", stream.Content(), "flush worked");
        }
Esempio n. 3
0
 private static void AssessAfterSeries(FlowMeter flowMeter, int count, Func <int, int> value, string description, IAnalysisResult expected)
 {
     for (var i = 0; i < count; i++)
     {
         flowMeter.AddMeasurement(new Measurement(DateTime.Now, value(i), 1500));
     }
     AssertResultsAreEqual(expected, flowMeter, description);
 }
Esempio n. 4
0
        public ActionResult DeleteConfirmed(int id)
        {
            FlowMeter flowMeter = db.flowMeters.Find(id);

            db.flowMeters.Remove(flowMeter);
            db.SaveChanges();
            return(RedirectToRoute(new { controller = "Site", action = "SiteDetails", id = flowMeter.SiteId }));
        }
Esempio n. 5
0
 public ActionResult Edit([Bind(Include = "ID,FlowMeterModelID,FMModel,SerialNumber,SiteId")] FlowMeter flowMeter)
 {
     if (ModelState.IsValid)
     {
         db.Entry(flowMeter).State = EntityState.Modified;
         db.SaveChanges();
         //return RedirectToAction("Index");
         return(RedirectToRoute(new { controller = "Site", action = "SiteDetails", id = flowMeter.SiteId }));
     }
     return(View(flowMeter));
 }
Esempio n. 6
0
        public ActionResult Create([Bind(Include = "FlowMeterModelID,FMModel,SerialNumber,SiteId")] FlowMeter flowMeter)
        {
            if (ModelState.IsValid)
            {
                db.flowMeters.Add(flowMeter);
                db.SaveChanges();
                return(RedirectToRoute(new { controller = "Site", action = "SiteDetails", id = flowMeter.SiteId }));
            }

            return(View(flowMeter));
        }
Esempio n. 7
0
        // GET: FlowMeter/Delete/5
        public ActionResult Delete(int?id)
        {
            if (id == null)
            {
                return(new HttpStatusCodeResult(HttpStatusCode.BadRequest));
            }
            FlowMeter flowMeter = db.flowMeters.Find(id);

            if (flowMeter == null)
            {
                return(HttpNotFound());
            }
            return(View(flowMeter));
        }
Esempio n. 8
0
        public void FlowMeterStartFlowTest()
        {
            // a flow of three vibrations, then back to flat. It takes a while to switch off the flow, but in practice 10 points is about 0.1s

            var flowMeter = new FlowMeter();

            var expected = new FlowMeter
            {
                Amplitude           = 0,
                Outlier             = false,
                FirstOutlier        = false,
                HighPass            = 0,
                LowPassOnHighPass   = 0,
                CalculatedFlow      = false,
                LowPassSlow         = 2500,
                LowPassFast         = 2500,
                LowPassDifference   = 0.0,
                LowPassOnDifference = 0.0,
                Drift   = false,
                Exclude = false,
                Flow    = false
            };

            AssessAfterSeries(flowMeter, 2, i => 2500, "baseline", expected);

            expected.Amplitude           = 102.8305594;
            expected.HighPass            = -67.1875;
            expected.LowPassOnHighPass   = 48.5583;
            expected.CalculatedFlow      = true;
            expected.LowPassSlow         = 2499.745643;
            expected.LowPassFast         = 2497.5339;
            expected.LowPassDifference   = 2.211742647;
            expected.LowPassOnDifference = 1.776377025;
            expected.Flow = true;
            AssessAfterSeries(flowMeter, 6, i => 2600 - i % 2 * 200, "flow", expected);

            expected.Amplitude           = 0.187569249;
            expected.HighPass            = 0.016021729;
            expected.LowPassOnHighPass   = 5.105309729;
            expected.CalculatedFlow      = false;
            expected.LowPassSlow         = 2499.818058;
            expected.LowPassFast         = 2499.226112;
            expected.LowPassDifference   = 0.59194614;
            expected.LowPassOnDifference = 1.267210968;
            expected.Flow = false;
            AssessAfterSeries(flowMeter, 11, i => 2500, "idle", expected);
        }
Esempio n. 9
0
        public void FlowMeterEarlyOutlierTest()
        {
            var flowMeter = new FlowMeter();

            flowMeter.AddMeasurement(new Measurement(DateTime.Now, 5000, 0));
            flowMeter.AddMeasurement(new Measurement(DateTime.Now, 2500, 0));
            var expected = new FlowMeter
            {
                Amplitude           = 2500,
                Outlier             = true,
                FirstOutlier        = true,
                HighPass            = 0,
                LowPassOnHighPass   = 0,
                CalculatedFlow      = false,
                LowPassSlow         = 2500,
                LowPassFast         = 2500,
                LowPassDifference   = 0,
                LowPassOnDifference = 0,
                Drift      = false,
                Exclude    = true,
                Flow       = false,
                ExcludeAll = true
            };

            AssertResultsAreEqual(expected, flowMeter, "Early outlier reset");

            flowMeter.AddMeasurement(new Measurement(DateTime.Now, 2510, 0));
            expected.Amplitude    = 0;
            expected.Outlier      = false;
            expected.FirstOutlier = false;
            expected.LowPassSlow  = 2510;
            expected.LowPassFast  = 2510;
            expected.Exclude      = false;
            expected.ExcludeAll   = false;
            AssertResultsAreEqual(expected, flowMeter, "First after outlier reset");

            flowMeter.AddMeasurement(new Measurement(DateTime.Now, 2490, 0));
            expected.Amplitude           = 20;
            expected.HighPass            = -10;
            expected.LowPassOnHighPass   = 2;
            expected.LowPassSlow         = 2509.4;
            expected.LowPassFast         = 2508;
            expected.LowPassDifference   = 1.4;
            expected.LowPassOnDifference = 0.14;

            AssertResultsAreEqual(expected, flowMeter, "Second after outlier reset");
        }
        public void SummaryWriterIdleOutlierTest()
        {
            // we insert outliers after 8 and 9. It should finish the idle round and then start a non-idle one.
            var stream        = new StringStream();
            var summaryWriter = new SummaryWriter(stream.Writer)
            {
                IdleFlushRate = 10, NonIdleFlushRate = 5
            };

            for (var i = 0; i < 15; i++)
            {
                var measurement = new Measurement(new DateTime(2020, 12, 28, 0, 0, i), 2400 + (i > 7 ? 200 : 0), i == 0 ? 2500 : 7993 + i);
                var result      = new FlowMeter
                {
                    Amplitude         = 5 + (i > 7 ? 200 : 0), HighPass = 0, LowPassFast = 2400 - i, LowPassSlow = 2385 + i,
                    Exclude           = i > 7, ExcludeAll = false, Flow = false,
                    LowPassOnHighPass = i, Outlier = i > 7, Drift = i > 9
                };
                summaryWriter.AddMeasurement(measurement, result);
                summaryWriter.PrepareWrite();
                Assert.AreEqual(i < 8 ? 10u : 5u, summaryWriter.FlushRate,
                                " The first 8 data points FlushRate is 10, then it becomes 5 because of outliers (round {0})", i);
                if (i != 9)
                {
                    // force skipping the write at the time it was supposed to, so it gets done next time.
                    summaryWriter.Write();
                }

                if (i <= 9)
                {
                    Assert.IsTrue(string.IsNullOrEmpty(stream.Content()), "Nothing written the first 9 points");
                }
                else if (i < 14)
                {
                    //"S,Measure,Flows,SumAmplitude,SumLPonHP,LowPassFast,LPonHP,Outliers,Waits,Excludes,AvgDelay,CRC"
                    Assert.AreEqual("S,10,0,0,0,2391,2394,9,2,0,2,7448,49755\r\n", stream.Content(),
                                    "At 10 we get a summary with 2 outliers and 2 excludes");
                }
                else
                {
                    Assert.AreEqual("S,10,0,0,0,2391,2394,9,2,0,2,7448,49755\r\nS,5,0,0,0,2386,2399,14,5,5,5,8005,17350\r\n", stream.Content(),
                                    "At 15 we get the next batch with 5 outliers and excludes");
                }
            }
        }
        public void SummaryWriterExcludeAllTest()
        {
            // ExcludeAll becomes true in the third sample. That should put excluded on 3. It should finish the idle round and then start a non-idle one.
            // Then we put WaitSamples on 1 to get WaitCount filled.
            // We do this all before sample 5 so the non idle rate kicks in early.
            var stream        = new StringStream();
            var summaryWriter = new SummaryWriter(stream.Writer)
            {
                IdleFlushRate = 10, NonIdleFlushRate = 5
            };

            for (var i = 0; i < 15; i++)
            {
                var measurement = new Measurement(new DateTime(2020, 12, 28, 0, 0, i), 2400 + (i > 7 ? 200 : 0), i == 0 ? 2500 : 7500 + i * 5);

                var result = new FlowMeter
                {
                    Amplitude  = i == 0 ? 10000 : 2000, HighPass = 0, LowPassFast = 2400 - i, LowPassSlow = 2385 + i, Exclude = i == 2 || i == 3,
                    ExcludeAll = i == 2, Flow = false, LowPassOnHighPass = 10 + i, Outlier = i == 2, Drift = false
                };
                summaryWriter.AddMeasurement(measurement, result);
                summaryWriter.PrepareWrite();
                Assert.AreEqual(i < 2 || i > 4 ? 10u : 5u, summaryWriter.FlushRate,
                                "Flush rate is 10 the first two data points, and after the 5th. In between it is 5");
                summaryWriter.Write();
                if (i < 4)
                {
                    Assert.IsTrue(string.IsNullOrEmpty(stream.Content()), "Nothing written before the 5th data point");
                }
                else if (i < 14)
                {
                    //"S,Measure,Flows,SumAmplitude,SumLPonHP,LowPassFast,LPonHP,Outliers,Waits,Drifts,AvgDelay,CRC"
                    Assert.AreEqual("S,5,0,0,0,2396,2389,14,1,0,4,6510,17220\r\n", stream.Content(), "The right data written after 5 points");
                }
                else
                {
                    Assert.AreEqual("S,5,0,0,0,2396,2389,14,1,0,4,6510,17220\r\nS,10,0,0,0,2386,2399,24,0,0,0,7548,8484\r\n", stream.Content(),
                                    "Without special events, the next flush is after 10 data points");
                }
            }
        }
Esempio n. 12
0
        public void FlowMeterManyOutliersAfterStartupTest()
        {
            var flowMeter = new FlowMeter();

            var expected = new FlowMeter
            {
                Amplitude           = 1.787036608,
                Outlier             = false,
                FirstOutlier        = false,
                HighPass            = 0.66796875,
                LowPassOnHighPass   = 0.584171302,
                CalculatedFlow      = false,
                LowPassSlow         = 999.2665745,
                LowPassFast         = 999.6856016,
                LowPassDifference   = 0.419027152,
                LowPassOnDifference = 0.181146106,
                Drift   = false,
                Exclude = false,
                Flow    = false
            };

            AssessAfterSeries(flowMeter, 10, i => 999 + i % 2 * 2, "10 good samples to skip Startup", expected);

            expected.Amplitude    = 1000.7334255095383;
            expected.Exclude      = true;
            expected.Outlier      = true;
            expected.FirstOutlier = true;

            AssessAfterSeries(flowMeter, 1, i => 2000, "First outlier raises FirstOutlier, Outlier and Exclude", expected);

            expected.Amplitude           = 784.3181768;
            expected.FirstOutlier        = false;
            expected.LowPassSlow         = 1239.211368;
            expected.LowPassFast         = 1612.457707;
            expected.LowPassDifference   = 373.2463381;
            expected.LowPassOnDifference = 168.2699421;
            expected.Drift = true;

            AssessAfterSeries(flowMeter, 9, i => 2000, "9 more outliers, high pass filter inactive, low pass work", expected);
        }
        public void SummaryWriterFlowTest()
        {
            var stream        = new StringStream();
            var summaryWriter = new SummaryWriter(stream.Writer)
            {
                IdleFlushRate = 10, NonIdleFlushRate = 5
            };

            for (var i = 0; i < 10; i++)
            {
                var measurement = new Measurement(new DateTime(2020, 12, 28, 0, 0, i), 2400 + i, 8000 + i);
                var result      = new FlowMeter
                {
                    Amplitude         = 5 + (i > 7 ? 10 : 0), HighPass = 0, LowPassFast = 2400, LowPassSlow = 2398, Exclude = false, ExcludeAll = false,
                    Flow              = i > 7,
                    LowPassOnHighPass = i, Outlier = false, Drift = false
                };
                summaryWriter.AddMeasurement(measurement, result);
                summaryWriter.PrepareWrite();
                summaryWriter.Write();
                if (i < 9)
                {
                    Assert.IsTrue(string.IsNullOrEmpty(stream.Content()), "Nothing written the first 9 data points");
                }
                else
                {
                    //"S,Measure,Flows,SumAmplitude,SumLPonHP,LowPassFast,LowPassSlow,LPonHP,Outliers,Waits,Excludes,AvgDelay,CRC"
                    Assert.AreEqual("S,10,2,30,17,2400,2398,9,0,0,0,8005,56358\r\n", stream.Content(),
                                    "After 10 points, we get a summary with 2 flows, and SumAmplitude and SumLPonP are populated");
                }
            }
            // Flush should not change anything as we have no more data.
            summaryWriter.Flush();
            Assert.AreEqual("S,10,2,30,17,2400,2398,9,0,0,0,8005,56358\r\n", stream.Content(),
                            "After 10 points, we get a summary with 2 flows, and SumAmplitude and SumLPonP are populated");
        }
        public void SummaryWriterIdleTest()
        {
            var stream        = new StringStream();
            var summaryWriter = new SummaryWriter(stream.Writer)
            {
                IdleFlushRate = 10, NonIdleFlushRate = 5
            };

            for (var i = 0; i < 10; i++)
            {
                var measurement = new Measurement(new DateTime(2020, 12, 28, 0, 0, i), 2400 + i, 8000 + i);
                var result      = new FlowMeter
                {
                    Amplitude         = i, HighPass = 0, LowPassFast = 2400, LowPassSlow = 2402, Exclude = false, ExcludeAll = false, Flow = false,
                    LowPassOnHighPass = 5 - i,
                    Outlier           = false, Drift = false
                };
                summaryWriter.AddMeasurement(measurement, result);
                if (i == 0)
                {
                    Assert.AreEqual(10u, summaryWriter.FlushRate, "Flush rate stays 10 (idle flush rate) when there is nothing special.");
                }
                summaryWriter.PrepareWrite();
                summaryWriter.Write();
                if (i < 9)
                {
                    Assert.IsTrue(string.IsNullOrEmpty(stream.Content()), "nothing written the fist 9 data points");
                }
                else
                {
                    //"S,Measure,Flows,SumAmplitude,SumLPonHP,LowPassFast,LowPassSlow,LPonHP,Outliers,Waits,Excludes,AvgDelay,CRC"
                    Assert.AreEqual("S,10,0,0,0,2400,2402,-4,0,0,0,8005,1750\r\n", stream.Content(),
                                    "10 idle points written after #10. LowPassFast and LPonHP get reported too.");
                }
            }
        }
Esempio n. 15
0
        public void FlowMeterDriftTest()
        {
            var flowMeter = new FlowMeter();

            var expectedIdle = new FlowMeter
            {
                Amplitude           = 0,
                Outlier             = false,
                FirstOutlier        = false,
                HighPass            = 0,
                LowPassOnHighPass   = 0,
                CalculatedFlow      = false,
                LowPassSlow         = 1000,
                LowPassFast         = 1000,
                LowPassDifference   = 0.0,
                LowPassOnDifference = 0.0,
                Drift   = false,
                Exclude = false,
                Flow    = false
            };

            AssessAfterSeries(flowMeter, 10, i => 1000, "OK after 10 good samples to skip Startup, filters active", expectedIdle);

            var expectedHighOutlier = new FlowMeter
            {
                Amplitude           = 970,
                Outlier             = true,
                FirstOutlier        = false,
                HighPass            = 0,
                LowPassOnHighPass   = 0,
                CalculatedFlow      = false,
                LowPassSlow         = 1059.1,
                LowPassFast         = 1190,
                LowPassDifference   = 130.9,
                LowPassOnDifference = 19.39,
                Drift   = true,
                Exclude = true,
                Flow    = false
            };

            AssessAfterSeries(flowMeter, 3, i => 2000, "3 high outliers trigger Drift and Outlier", expectedHighOutlier);

            var expectedLowOutlier = new FlowMeter
            {
                Amplitude           = 1027.327,
                Outlier             = true,
                HighPass            = 0,
                LowPassOnHighPass   = 0,
                CalculatedFlow      = false,
                LowPassSlow         = 996.50719,
                LowPassFast         = 963.9,
                LowPassDifference   = 32.60719,
                LowPassOnDifference = 22.897189,
                Drift   = true,
                Exclude = true,
                Flow    = false
            };

            AssessAfterSeries(flowMeter, 2, i => 0, "2 low outliers bring low pass results close", expectedLowOutlier);

            var expectedLagPeriod = new FlowMeter
            {
                Amplitude           = 1.842389209,
                Outlier             = false,
                FirstOutlier        = false,
                HighPass            = 0,
                LowPassOnHighPass   = 0,
                CalculatedFlow      = false,
                LowPassSlow         = 998.2128825,
                LowPassFast         = 996.444977,
                LowPassDifference   = 1.767905424,
                LowPassOnDifference = 8.076097488,
                Drift   = true,
                Exclude = true,
                Flow    = false
            };

            AssessAfterSeries(flowMeter, 22, i => 1000, "Waiting until last drift point...", expectedLagPeriod);


            var expectedFirstNormal = new FlowMeter
            {
                Amplitude           = 1.787117533,
                Outlier             = false,
                FirstOutlier        = false,
                HighPass            = 0,
                LowPassOnHighPass   = 0,
                CalculatedFlow      = false,
                LowPassSlow         = 998.266496,
                LowPassFast         = 996.8004793,
                LowPassDifference   = 1.466016654,
                LowPassOnDifference = 7.415089405,
                Drift   = false,
                Exclude = false,
                Flow    = false
            };

            AssessAfterSeries(flowMeter, 1, i => 1000, "No more drifting", expectedFirstNormal);
        }