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"); }
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); }
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 })); }
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)); }
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)); }
// 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)); }
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); }
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"); } } }
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."); } } }
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); }