Example #1
0
        public void RunBatterySimulation()
        {
            // arrange
            var batterySim = new BatteryPackSimulator();

            batterySim.With((args) =>
            {
                var batteryArgs = args as BatteryArgs;
                _battery        = batteryArgs.AddBattery(_battery);
                batteryArgs.UpdateDischargeCurrent(_battery.Uid, 150);
            });

            var i     = 0;
            var limit = 10000;
            var watch = new Stopwatch();

            // act
            watch.Start();
            while (!_battery.State.IsDepleted && watch.ElapsedMilliseconds < limit)
            {
                batterySim.Run();
                i++;
            }
            watch.Stop();
            _log.Trace($"Battery simulation ends after {i} iterations and {watch.ElapsedMilliseconds}ms with depleted battery: {_battery.State.IsDepleted}.");

            // assert
            var s = _battery.State;

            Assert.AreNotEqual(s.Initial.ElapsedTime, s.Now.ElapsedTime, "ElapsedTime should not be equal");
            Assert.AreNotEqual(s.Initial.Charge, s.Now.Charge, "Charge should not be equal");
            Assert.AreNotEqual(s.Initial.SoD, s.Now.SoD, "SoD should not be equal");
            Assert.AreNotEqual(s.Initial.Voltage, s.Now.Voltage, "Voltage should not be equal");
            Assert.IsTrue(s.IsDepleted, "battery should be empty");
        }
Example #2
0
        private static Runner InitializeRuntime()
        {
            var runner = new Runner();

            runner.Started += (o, e) =>
            {
                _log.Trace($"Runner started.");
            };
            runner.IterationPassed += (o, e) =>
            {
                _log.Trace($"Runner passed iteration");
            };
            runner.Stopped += (o, e) =>
            {
                _log.Trace($"Runner stopped.");
            };

            // radio channel
            var radioSim = new AdaptedFriisSimulator();

            radioSim.With((args) =>
            {
                var radioArgs = args as AdaptedFriisArgs;
                radioArgs.RadioBox.Resolution = 0.2F;
            });

            // energy
            var batterySim = new BatteryPackSimulator();

            batterySim.With((args) =>
            {
                var batteryArgs = args as BatteryArgs;
                var battery     = batteryArgs.AddBattery();
                batteryArgs.UpdateDischargeCurrent(battery.Uid, 100);
            });

            // network
            var networkSim = new MeshNetworkSimulator();

            BuildMeshNetwork(networkSim.Arguments as MeshNetworkArgs);

            // pack all simulators in a reop
            var simRepo = new SimulatorRepository();

            simRepo.AddRange(new ISimulatable[] {
                radioSim,
                networkSim,
                batterySim
            });

            runner.BindSimulators(simRepo);

            return(runner);
        }
Example #3
0
        public async Task RunBatterySimulation()
        {
            // arrange
            var runtime = new RuntimeController(new EnergyValidator());

            // TODO: seem to have a bug when setting up a higher cutoff voltage --> test and fix it
            _battery.CutoffVoltage = 1.2F;
            var s           = _battery.State;
            var batteryArgs = new BatteryArgs();

            batteryArgs.Batteries.Add(_battery);

            var netArgs = new NetworkArgs();
            var device  = new SimpleDevice();

            device.Parts.Add(_battery);
            netArgs.Network.Add(device);

            var batterySim = new BatteryPackSimulator();

            batterySim
            .With(batteryArgs)
            .With(netArgs)
            .With(runtime.Arguments);

            var repo = new SimulatorRepository();

            repo.Add(batterySim);
            if (!runtime.BindSimulators(repo).Validate())
            {
                Assert.Fail("error on validating the simulation");
            }

            // act
            await runtime.RunAsync((rt) =>
            {
                // assert
                return(!_battery.State.IsDepleted);
            });

            Assert.AreNotEqual(s.Initial.ElapsedTime, s.Now.ElapsedTime, "ElapsedTime should not be equal");
            Assert.AreNotEqual(s.Initial.Charge, s.Now.Charge, "Charge should not be equal");
            Assert.AreNotEqual(s.Initial.SoD, s.Now.SoD, "SoD should not be equal");
            Assert.AreNotEqual(s.Initial.Voltage, s.Now.Voltage, "Voltage should not be equal");
            Assert.IsTrue(_battery.State.IsDepleted, "battery should be empty");
        }
Example #4
0
        public async Task SimulateRuntimeAsync()
        {
            // -- arrange

            // radio channel
            var radioSim = new AdaptedFriisSimulator();

            radioSim.With((args) =>
            {
                var radioArgs = args as AdaptedFriisArgs;
                radioArgs.RadioBox.Resolution = 0.2F;
            });

            // energy
            var batterySim = new BatteryPackSimulator();

            batterySim.With((args) =>
            {
                var batteryArgs = args as BatteryArgs;
                var battery     = batteryArgs.AddBattery();
                batteryArgs.UpdateDischargeCurrent(battery.Uid, 100);
            });

            // network
            var networkSim = new MeshNetworkSimulator();

            BuildMeshNetwork(networkSim.Arguments as MeshNetworkArgs);

            // pack all simulators in a reop
            var simRepo = new SimulatorRepository();

            simRepo.AddRange(new ISimulatable[] {
                radioSim,
                networkSim,
                batterySim
            });

            // runtime
            var runner = new Runner();

            runner.BindSimulators(simRepo);
            runner.Started += (o, e) =>
            {
                _log.Trace($"Runner started.");
            };
            runner.IterationPassed += (o, e) =>
            {
                _log.Trace($"Runner passed iteration");
            };
            runner.Stopped += (o, e) =>
            {
                _log.Trace($"Runner stopped.");
            };

            // -- act
            int iterations = 5;

            if (!runner.Validate())
            {
                Assert.Fail("Error on validating the simulation runtime.");
            }

            _log.Trace($"RunAsync for {iterations} times");
            await runner.RunAsync(iterations);

            // -- assert
            var runArgs = runner.Arguments as RuntimeArgs;

            Assert.IsTrue(runArgs.Iterations == 5, $"simulation should have passed {iterations} iterations");
        }