From 7d4d890106ac75b513d84a8eff5733cc46c0fa0d Mon Sep 17 00:00:00 2001
From: Fredrik Bagge Carlson <cont-frb@ulund.org>
Date: Wed, 23 Aug 2017 09:52:12 +0200
Subject: [PATCH] No sleep in control loop for simulated process

---
 src/controllers.jl                           |  3 ++-
 src/interface_implementations/ballandbeam.jl |  2 +-
 src/utilities.jl                             | 14 ++++++++++++++
 3 files changed, 17 insertions(+), 2 deletions(-)

diff --git a/src/controllers.jl b/src/controllers.jl
index 0d404d7..93a2102 100644
--- a/src/controllers.jl
+++ b/src/controllers.jl
@@ -30,9 +30,10 @@ function run_control_2DOF(P::AbstractProcess,sysFB, sysFF=nothing; duration = 10
 		ui + bias(P)
 	end
 
+	simulation = isa(P, SimulatedProcess)
 	initialize(P)
 	for (i,t) = enumerate(0:h:duration)
-		@periodically h begin
+		@periodically h simulation begin
 			y[:,i]     = measure(P)
 			r[:,i]     = reference(t)
 			u[:,i]     = calc_control(i) # y,r must be updated before u
diff --git a/src/interface_implementations/ballandbeam.jl b/src/interface_implementations/ballandbeam.jl
index 05543f5..8cee43f 100644
--- a/src/interface_implementations/ballandbeam.jl
+++ b/src/interface_implementations/ballandbeam.jl
@@ -87,5 +87,5 @@ initialize(p::AbstractBeamOrBallAndBeam) = ccall((:comedi_start, comedipath),Int
 finalize(p::AbstractBeamOrBallAndBeam)   = (control(p,0);ccall((:comedi_stop, comedipath),Int32,(Int32,), 0))
 initialize(p::BallAndBeamSimulator)      = nothing
 finalize(p::BallAndBeamSimulator)        = nothing
-initialize(p::BeamSimulator)             = nothing
+initialize(p::BeamSimulator)             = p.state .*= 0
 finalize(p::BeamSimulator)               = nothing
diff --git a/src/utilities.jl b/src/utilities.jl
index 7cff5ca..3dc6230 100644
--- a/src/utilities.jl
+++ b/src/utilities.jl
@@ -13,6 +13,20 @@ macro periodically(h, body)
 	end
 end
 
+"""
+	@periodically(h, simulation::Bool, body)
+Ensures that the body is run with an interval of `h >= 0.001` seconds.
+If `simulation == false`, no sleep is done
+"""
+macro periodically(h, simulation, body)
+	quote
+		local start_time = time()
+		$(esc(body))
+		local execution_time = time()-start_time
+		$(esc(simulation)) || sleep(max(0,$(esc(h))-execution_time))
+	end
+end
+
 """
 	state = init_sysfilter(sys::StateSpace)
 Use together with [`sysfilter!`](@ref)
-- 
GitLab