# removeshort.hal
# (for use following core_sim.hal and simulated_home.hal)
# (this halfile should follow core_sim.hal)

# Demonstrate that hookup_moveoff.tcl works with
# non-shortcircuit hal configurations (like a servo)

# Also: use sample-hold (mux2) to simulate a system
# with encoder measuring output when power off too

# remove usual sim signals
delsig Xpos
delsig Ypos
delsig Zpos

# add pid components, and addf in right sequence
loadrt pid names=xpid,ypid,zpid
addf xpid.do-pid-calcs servo-thread 3
addf ypid.do-pid-calcs servo-thread 3
addf zpid.do-pid-calcs servo-thread 3

# add mux2 for sample-hold on output, and addf in right sequence
# to simulate system with encoder measuring output
loadrt mux2 names=xmux,ymux,zmux
addf xmux servo-thread 6
addf ymux servo-thread 6
addf zmux servo-thread 6

# note: pid has default PGain=1, Dgain=Igain=FF0=FF1=FF2=0
setp xpid.Pgain 0
setp ypid.Pgain 0
setp zpid.Pgain 0

# pass thru input to output by using FF0=1
setp xpid.FF0 1
setp ypid.FF0 1
setp zpid.FF0 1

# enable pid in usual manner
net xenable joint.0.amp-enable-out => xpid.enable
net yenable joint.1.amp-enable-out => ypid.enable
net zenable joint.2.amp-enable-out => zpid.enable

# connect without a shortcircuit using pass-thru pid
net Xpos-cmd <= joint.0.motor-pos-cmd
net Xpos-cmd => xpid.command

# sample-hold
net sample <= motion.motion-enabled
net sample => xmux.sel
net sample => ymux.sel
net sample => zmux.sel
#---------------------------------------
net Xonposition <= xpid.output
net Xonposition => xmux.in1

# hold position when power off (in0):
net Xpos-fb  => xmux.in0

net Xpos-fb  <= xmux.out
net Xpos-fb  => joint.0.motor-pos-fb
net Xpos-fb  => comp_x.in1
net Xpos-fb  => ddt_x.in
#---------------------------------------
net Yonposition <= ypid.output
net Yonposition => ymux.in1

# hold position when power off (in0):
net Ypos-fb  => ymux.in0

net Ypos-fb  <= ymux.out
net Ypos-cmd <= joint.1.motor-pos-cmd
net Ypos-cmd => ypid.command
net Ypos-fb  => joint.1.motor-pos-fb
net Ypos-fb  => comp_y.in1
net Ypos-fb  => ddt_y.in
#---------------------------------------
net Zonposition <= zpid.output
net Zonposition => zmux.in1

# hold position when power off (in0):
net Zpos-fb  => zmux.in0

net Zpos-fb  <= zmux.out
net Zpos-cmd <= joint.2.motor-pos-cmd
net Zpos-cmd => zpid.command
net Zpos-fb  => joint.2.motor-pos-fb
net Zpos-fb  => comp_z.in1
net Zpos-fb  => ddt_z.in
