From 0aaeecc3df4fb2a8b755f0bc851928c8222afdc0 Mon Sep 17 00:00:00 2001
From: Fredrik Bagge Carlson <cont-frb@ulund.org>
Date: Wed, 23 Aug 2017 23:10:35 +0200
Subject: [PATCH] add reference generator

---
 README.md                   |  1 +
 src/LabProcesses.jl         |  1 +
 src/reference_generators.jl | 19 +++++++++++++++++++
 test/runtests.jl            |  7 +++++--
 4 files changed, 26 insertions(+), 2 deletions(-)
 create mode 100644 src/reference_generators.jl

diff --git a/README.md b/README.md
index 583ee0f..f371596 100644
--- a/README.md
+++ b/README.md
@@ -61,6 +61,7 @@ for (i,t) = enumerate(0:h:duration)
 end
 ```
 
+
 Often one finds the need to implement a stateful controller, i.e., a function
 that has a memory or state. To this end, the function [`sysfilter`](@ref) is
 provided. This function is used to implement control loops where a signal is
diff --git a/src/LabProcesses.jl b/src/LabProcesses.jl
index 028f96e..a2277f3 100644
--- a/src/LabProcesses.jl
+++ b/src/LabProcesses.jl
@@ -9,6 +9,7 @@ include("interface_documentation.jl")
 include("interface_implementations/ballandbeam.jl")
 
 include("utilities.jl")
+include("reference_generators.jl")
 include("controllers.jl")
 
 end # module
diff --git a/src/reference_generators.jl b/src/reference_generators.jl
new file mode 100644
index 0000000..bdc22b8
--- /dev/null
+++ b/src/reference_generators.jl
@@ -0,0 +1,19 @@
+export PRBSGenerator
+
+#PRBS
+"""
+    r = PRBSGenerator(state = 1)
+Generates a pseudo-random binary sequence. Call like `random_input = r()`.
+"""
+mutable struct PRBSGenerator
+    state::Int
+end
+
+PRBSGenerator() = PRBSGenerator(Int(1))
+
+function (r::PRBSGenerator)(args...)
+    state = r.state
+    bit   = ((state >> 0) ⊻ (state >> 2) ⊻ (state >> 3) ⊻ (state >> 5) ) & 1
+    r.state = (state >> 1) | (bit << 15)
+    bit
+end
diff --git a/test/runtests.jl b/test/runtests.jl
index 84d5bde..51d3ce3 100644
--- a/test/runtests.jl
+++ b/test/runtests.jl
@@ -1,5 +1,8 @@
 using LabProcesses
 using Base.Test
 
-# write your own tests here
-@test 1 == 2
+# Reference generators
+r = PRBSGenerator(Int(1))
+seq = [r() for i = 1:10]
+@test all(seq .==  [0, 0, 1, 0, 0, 1, 1, 0, 0, 1])
+foreach(r,1:10_000)
-- 
GitLab