From d5e320c65442e091cd6fd9dfdc423aafc94eb4e7 Mon Sep 17 00:00:00 2001 From: Martin Karlsson <cont-mkr@ulund.org> Date: Mon, 21 Aug 2017 17:29:10 +0200 Subject: [PATCH] Implement ethheli --- .../eth_helicopter.jl | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 src/interface_implementations/eth_helicopter.jl diff --git a/src/interface_implementations/eth_helicopter.jl b/src/interface_implementations/eth_helicopter.jl new file mode 100644 index 0000000..1011c99 --- /dev/null +++ b/src/interface_implementations/eth_helicopter.jl @@ -0,0 +1,44 @@ +# Interface implementation Ball And Beam ==================================================== + +export ETHHelicopter, ETHHelicopterSimulator, ETHHelicopterType + +struct ETHHelicopter <: PhysicalProcess + h::Float64 +end +ETHHelicopter() = ETHHelicopter(0.050) + +struct ETHHelicopterSimulator <: SimulatedProcess + h::Float64 + state::Vector{Float64} +end +ETHHelicopterSimulator() = ETHHelicopterSimulator(0.01, zeros(4)) + +const ETHHelicopterType = Union{ETHHelicopter, ETHHelicopterSimulator} +num_outputs(p::ETHHelicopterType) = 2 +num_inputs(p::ETHHelicopterType) = 2 +outputrange(p::ETHHelicopterType) = [(-10,10),(-10,10)] # Beam angle, Ball position +inputrange(p::ETHHelicopterType) = [(-10,10)] +isstable(p::ETHHelicopterType) = false +isasstable(p::ETHHelicopterType) = false +sampletime(p::ETHHelicopterType) = p.h + +function control(p::ETHHelicopter, u) + ccall((:comedi_write, comedipath),Int32,(Int32,Int32,Int32,Int32), 0,1,0,num2io(u[1])) + ccall((:comedi_write, comedipath),Int32,(Int32,Int32,Int32,Int32), 0,1,1,num2io(u[2])) +end + +measure(p::ETHHelicopter) = [io2num(ccall((:comedi_read, comedipath),Int32,(Int32,Int32,Int32), 0,0,i)) for i = 0:1] #i=0 for pitch, i=1 for yaw + + +control(p::ETHHelicopterSimulator, u) = error("Not yet implemented") +measure(p::ETHHelicopterSimulator) = error("Not yet implemented") + +const comedipath = Pkg.dir("LabProcesses","c","comedi_bridge.so") +const conversion = 65535/20 +io2num(x) = x/conversion -10 # Converts from io to float +num2io(x) = round(Int32,(x + 10)*conversion) # Converts from regular number to io + +initialize(p::ETHHelicopter) = ccall((:comedi_start, comedipath),Int32,(Int32,), 0) +finalize(p::ETHHelicopter) = (control(p,0);ccall((:comedi_stop, comedipath),Int32,(Int32,), 0)) +initialize(p::ETHHelicopterSimulator) = nothing +finalize(p::ETHHelicopterSimulator) = nothing -- GitLab