From 790905d9590b706a3a197c18cf1222bad74205a8 Mon Sep 17 00:00:00 2001
From: Fredrik Bagge Carlson <cont-frb@ulund.org>
Date: Mon, 21 Aug 2017 20:25:14 +0200
Subject: [PATCH] Clarify README

---
 README.md          |  16 +++++++++++++---
 docs/feedback4.png | Bin 0 -> 3914 bytes
 src/controllers.jl |   1 +
 3 files changed, 14 insertions(+), 3 deletions(-)
 create mode 100644 docs/feedback4.png

diff --git a/README.md b/README.md
index 6aeeee0..035f5fe 100644
--- a/README.md
+++ b/README.md
@@ -11,8 +11,10 @@ implementing the same interface (or a simulated version) by changeing a single
 line of code :)
 
 ## Installation
-1. Start julia
-2. Install LabProcesses.jl using command `Pkg.clone("https://gitlab.control.lth.se/processes/LabProcesses.jl.git")` Lots of packages will now be installed, this will take some time.
+1. Start julia by typing `julia` in a terminal, make sure the printed info says it's
+`v0.6+` running. If not, visit [julialang.org](https://julialang.org/downloads/)
+to get the latest release.
+2. Install LabProcesses.jl using command `Pkg.clone("https://gitlab.control.lth.se/processes/LabProcesses.jl.git")` Lots of packages will now be installed, this will take some time. If this is your first time using Julia, you might have to run `julia> Pkg.init()` before you install any packages.
 
 ## How to implement a new process
 1. Locate the file [interface.jl](https://gitlab.control.lth.se/processes/LabProcesses.jl/blob/master/src/interface.jl). (Alternatively, you can copy all definitions from [/interface_implementations/ballandbeam.jl](https://gitlab.control.lth.se/processes/LabProcesses.jl/blob/master/src/interface_implementations/ballandbeam.jl) instead. Maybe it's easier to work from an existing implementaiton.)
@@ -23,10 +25,17 @@ copied definitions and implement them. See [/interface_implementations/ballandbe
     ```julia
     struct BallAndBeam <: PhysicalProcess
         h::Float64
+        bias::Float64
     end
-    BallAndBeam() = BallAndBeam(0.01) # Constructor with default value of sample time
+    BallAndBeam() = BallAndBeam(0.01, 0.0) # Constructor with default value of sample time
     ```
 Make sure you inherit from `PhysicalProcess` or `SimulatedProcess` as appropriate.
+This type must contains fields that hold information about everything that is
+relevant to a particular instance of the process. Different ballandbeam-process
+have different biases, hence this must be stored. A simulated process would have
+to keep track of its state etc. in order to implement the measure and control
+methods. See [Types in julia documentation](https://docs.julialang.org/en/stable/manual/types/#Composite-Types-1)
+for additional info regarding user defined types and (constructors)[https://docs.julialang.org/en/stable/manual/constructors/].
 5. Documentation of all interface functions is available in the file [interface_documentation.jl](https://gitlab.control.lth.se/processes/LabProcesses.jl/blob/master/src/interface_documentation.jl)
 
 ## Control a process
@@ -34,6 +43,7 @@ The interface `AbstractProcess` defines the functions `control(P, u)` and `measu
 These functions can be used to implement your own control loops. A common loop
 with a feedback controller and a feedforward filter on the reference is implemented
 in the function [`run_control_2DOF`](@ref).
+![block diagram](docs/feedback4.png)
 
 The macro `@periodically` might come in handy if you want to implement your own loop.
 Consider the following example, in which the loop body will be run periodically
diff --git a/docs/feedback4.png b/docs/feedback4.png
new file mode 100644
index 0000000000000000000000000000000000000000..696bf353a387ba1ef2f86ba0b3dbb0c62cdb7252
GIT binary patch
literal 3914
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

literal 0
HcmV?d00001

diff --git a/src/controllers.jl b/src/controllers.jl
index 8b91d74..74a2153 100644
--- a/src/controllers.jl
+++ b/src/controllers.jl
@@ -8,6 +8,7 @@ Perform control experiemnt where the feedback and feedforward controllers are gi
 `reference` is a reference generating function that accepts a scalar `t` (time in seconds) and outputs a scalar `r`, default is `reference(t) = sign(sin(2π*t))`.
 
 The outputs `y,u,r` are the beam angle, control signal and reference respectively.
+![block diagram](docs/feedback4.png)
 """
 function run_control_2DOF(P::AbstractProcess,sysFB, sysFF=nothing; duration = 10, reference = t->sign(sin(2π*t)))
 	h 		= sampletime(P)
-- 
GitLab