# Interface implementation Ball And Beam ==================================================== export Beam, BeamSimulator, BeamType, BallAndBeam, BallAndBeamSimulator, BeamOrBallAndBeam struct Beam <: PhysicalProcess h::Float64 bias::Float64 end Beam() = Beam(0.01, 0.0) struct BeamSimulator <: SimulatedProcess h::Float64 state::Vector{Float64} # angle,ω end BeamSimulator() = BeamSimulator(0.01, zeros(2)) struct BallAndBeam <: PhysicalProcess h::Float64 bias::Float64 end BallAndBeam() = BallAndBeam(0.01, 0.0) struct BallAndBeamSimulator <: SimulatedProcess h::Float64 state::Vector{Float64} # pos,vel,angle,ω end BallAndBeamSimulator() = BallAndBeamSimulator(0.01, zeros(4)) const BeamType = Union{Beam, BeamSimulator} const BallAndBeamType = Union{BallAndBeam, BallAndBeamSimulator} const BeamOrBallAndBeam = Union{BeamType, BallAndBeamType} num_outputs(p::BeamType) = 1 num_outputs(p::BallAndBeamType) = 2 num_inputs(p::BeamOrBallAndBeam)= 1 outputrange(p::Beam) = [(-10,10)] outputrange(p::BallAndBeamType) = [(-10,10),(-1,1)] # Beam angle, Ball position inputrange(p::BeamOrBallAndBeam)= [(-10,10)] isstable(p::Beam) = true isstable(p::BallAndBeamType) = false isasstable(p::BeamOrBallAndBeam) = false sampletime(p::BeamOrBallAndBeam) = p.h bias(p::BeamOrBallAndBeam) = p.bias bias(p::BallAndBeamSimulator) = 0 control(p::BeamOrBallAndBeam, u) = ccall((:comedi_write, comedipath),Int32, (Int32,Int32,Int32,Int32),0,1,1,num2io(u[1]+p.bias)) measure(p::Beam) = io2num(ccall((:comedi_read,comedipath), Int32, (Int32,Int32,Int32), 0,0,0)) measure(p::BallAndBeam) = [io2num(ccall((:comedi_read,comedipath), Int32, (Int32,Int32,Int32), 0,0,i)) for i = 0:1] control(p::BallAndBeamSimulator, u) = error("Not yet implemented") measure(p::BallAndBeamSimulator) = [p.state[1], p.state[3]] 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*100 + 2048) # Converts from regular number to io initialize(p::BeamOrBallAndBeam) = ccall((:comedi_start, comedipath),Int32,(Int32,), 0) finalize(p::BeamOrBallAndBeam) = (control(p,0);ccall((:comedi_stop, comedipath),Int32,(Int32,), 0)) initialize(p::BallAndBeamSimulator) = nothing finalize(p::BallAndBeamSimulator) = nothing