# HAL config file for vismach simulation of vertical milling machine
# This file deomstrates closed-loop spindle control in both position and 
# Velocity modes. 

# see http://wiki.linuxcnc.org/cgi-bin/wiki.pl?SpindleOrient for a diagram

# Note that the connections of the signals to "hardware" are all in the 
# sim_vmc.hal file rather than here

# First load 2x pid components. These would normally have to be loaded at
# the same time as the Axis PID components

loadrt pid num_chan=2 
addf pid.0.do-pid-calcs servo-thread # Velocity
addf pid.1.do-pid-calcs servo-thread # Position

loadrt orient
addf orient.0 servo-thread

#loadrt mux2 -- This has already been loaded in the sim_vmc.hal
addf mux2.0 servo-thread # chooses which pid output goes to the spindle speed control

net spindle-pos pid.1.feedback orient.0.position

net spindle-vel 	pid.0.feedback # & encoder.3.velocity for a real machine
net spindle-vel-cmd 	spindle.0.speed-out pid.0.command
net spindle-vel-pid 	pid.0.output mux2.0.in0

net spindle-pos 	pid.1.feedback orient.0.position near.0.in1 # & encoder.3.position for a real machine
net spindle-pos-cmd 	orient.0.command pid.1.command near.0.in2
net spindle-angle 	spindle.0.orient-angle orient.0.angle
net spindle-pos-pid 	pid.1.output mux2.0.in1
net spindle-in-pos 	orient.0.is-oriented  spindle.0.is-oriented

# this switches modes
net orient-mode 	spindle.0.orient orient.0.enable pid.1.enable mux2.0.sel
net velocity-mode	spindle.0.on pid.0.enable #pwmgen.0.enable 
net orient-dir		spindle.0.orient-mode orient.0.mode

# this is simple for the simulated spindle.
net spindle-cmd 	mux2.0.out

#for a real spindle run by a VFD
# loadrt abs
# addf abs.0.servo-thread
# net spindle-cmd 	mux2.0.out abs.0.in
# net spindle-cmd-abs 	abs.0.out pwmgen.0.value
# net spindle-pwm 	pwmgen.0.pwm parport.0.pin-NN-out
# net spindle-fwd 	abs.0.is-positive parport.0.pin-NN-out
# net spindle-rev 	abs.0.is-negative parport.0.pin-NN-out

# Tune the PID from the INI values
setp pid.0.Pgain [SPINDLE]PGAIN_V
setp pid.0.Igain [SPINDLE]IGAIN_V
setp pid.0.Dgain [SPINDLE]DGAIN_V
setp pid.0.FF0	 [SPINDLE]FF0_V
setp pid.0.FF1   [SPINDLE]FF1_V
setp pid.1.Pgain [SPINDLE]PGAIN_P
setp pid.1.Igain [SPINDLE]IGAIN_P
setp pid.1.Dgain [SPINDLE]DGAIN_P
setp pid.1.FF0	 [SPINDLE]FF0_P
setp pid.1.FF1   [SPINDLE]FF1_P
