Tools: completion: get vehicule type from sim_vehicle help

This commit is contained in:
Pierre Kancir 2019-11-14 17:21:44 +01:00 committed by Peter Barker
parent 989653bf69
commit 1affdbf275
2 changed files with 66 additions and 141 deletions

View File

@ -60,77 +60,35 @@ _sim_vehicle() {
fi fi
done done
# TODO: generate for waf help
case $prev in case $prev in
-v | --vehicle) -v | --vehicle)
opts="ArduCopter AntennaTracker APMrover2 ArduSub ArduPlane" # get the calling program, remove anything after the space == all commands arguments
local caller; caller=$(echo $@ | sed 's/ .*//g');
# get options between "vehicle type " and closing ")", remove line return, remove spaces, anything before the opening (, remove the "|" and closing ")"
opts=$($caller --help | sed -n '/vehicle type (/,/)/p' | tr '\n' ' ' | sed -e 's/ //g' -e 's/.*(//g' -e 's/[|)]/ /g')
COMPREPLY=($(compgen -W "${opts}" -- ${cur})) COMPREPLY=($(compgen -W "${opts}" -- ${cur}))
return 0 return 0
;; ;;
-f | --frame) -f | --frame)
opts="" # get the calling program, remove anything after the space == all commands arguments
if [[ ${COMP_WORDS[@]} == *"ArduCopter"* ]]; then local caller; caller=$(echo $@ | sed 's/ .*//g');
opts+=" +" # Get everything between "frame type" and "-C", remove first and last line, get line starting with caracters and ": " sequence, remove spaces and :
opts+=" X" local supported_vehicle_list=$($caller --help | sed -n '/frame type/,/-C/p' | sed -e '1d' -e '$d' | sed -n 's/\(.*: \).*/\1/p' | sed -e 's/ //g' -e 's/://g')
opts+=" airsim-copter" local frames;
opts+=" coaxcopter" local count=1;
opts+=" djix" for v in $supported_vehicle_list
opts+=" dodeca-hexa" do
opts+=" gazebo-iris" if [[ ${COMP_WORDS[@]} == *"$v"* ]]
opts+=" heli" then
opts+=" heli-compound" # Get everything between "frame type" and "-C", remove first and last line and change starting space by " :", change newlines to space, remove spaces then change vehicle type enclose by ":" by newline and change "|" by space, remove first line, get line "count" that match supported_vehicle_list[count]
opts+=" heli-dual" frames=$($caller --help | sed -n '/frame type/,/-C/p' | sed -e '1d' -e '$d' -e 's/^\s*A/ :A/g' | tr '\n' ' ' | sed -e 's/ //g' -e 's/:\w*:/\n/g' -e 's/[|]/ /g' | sed '1d' | sed "${count}q;d")
opts+=" hexa" break
opts+=" octa" fi
opts+=" octa-quad" count=$(( $count + 1 ))
opts+=" quad" done
opts+=" scrimmage-copter" COMPREPLY=($(compgen -W "${frames}" -- ${cur}))
opts+=" singlecopter" return 0
opts+=" tri"
opts+=" y6"
COMPREPLY=($(compgen -W "${opts}" -- ${cur}))
return 0
fi
if [[ ${COMP_WORDS[@]} == *"AntennaTracker"* ]]; then
opts+=" tracker"
COMPREPLY=($(compgen -W "${opts}" -- ${cur}))
return 0
fi
if [[ ${COMP_WORDS[@]} == *"APMrover2"* ]]; then
opts+=" balancebot"
opts+=" gazebo-rover"
opts+=" rover"
opts+=" rover-skid"
opts+=" sailboat"
opts+=" sailboat-motor"
opts+=" balancebot"
COMPREPLY=($(compgen -W "${opts}" -- ${cur}))
return 0
fi
if [[ ${COMP_WORDS[@]} == *"ArduSub"* ]]; then
opts+=" gazebo-bluerov2"
opts+=" vectored"
COMPREPLY=($(compgen -W "${opts}" -- ${cur}))
return 0
fi
if [[ ${COMP_WORDS[@]} == *"ArduPlane"* ]]; then
opts+=" CRRCSim"
opts+=" gazebo-zephyr"
opts+=" jsbsim"
opts+=" plane"
opts+=" plane-dspoilers"
opts+=" plane-elevon"
opts+=" plane-jet"
opts+=" plane-tailsitter"
opts+=" plane-vtailjet"
opts+=" quadplane"
opts+=" quadplane-cl84"
opts+=" quadplane-tilttrivec"
opts+=" quadplane-tri"
opts+=" scrimmage-plane"
COMPREPLY=($(compgen -W "${opts}" -- ${cur}))
return 0
fi
;; ;;
esac esac

View File

@ -3,6 +3,8 @@
local temp_word local temp_word
local cur cword prev local cur cword prev
local -a vehicles
_sim_vehicle() { _sim_vehicle() {
typeset -A opt_args typeset -A opt_args
local context state state_descr line curcontext="$curcontext" local context state state_descr line curcontext="$curcontext"
@ -58,96 +60,61 @@ _sim_vehicle() {
} }
# TODO : generate with regex from sim_vehicle help _get_vehicle_type() {
# get the calling program, remove anything after the space == all commands arguments
local caller; caller=$(echo ${words[@]} | sed 's/ .*//g');
# get options between "vehicle type " and closing ")", remove line return, remove spaces, anything before the opening (, remove the "|" and closing ")"
vehicles=( $($caller --help | sed -n '/vehicle type (/,/)/p' | tr '\n' ' ' | sed -e 's/ //g' -e 's/.*(//g' -e 's/[|)]/ /g') )
}
(( $+functions[_sim_vehicle_vehicles] )) || (( $+functions[_sim_vehicle_vehicles] )) ||
_sim_vehicle_vehicles() { _sim_vehicle_vehicles() {
local vehicles; vehicles=( _get_vehicle_type
'ArduCopter:Copter type' \
'AntennaTracker:Tracker type' \
'APMrover2:Rover type' \
'ArduSub:Sub type' \
'ArduPlane:Plane type'
)
_describe -t vehicles 'vehicle' vehicles "$@" && ret=0 _describe -t vehicles 'vehicle' vehicles "$@" && ret=0
} }
# TODO : generate with regex from sim_vehicle help
(( $+functions[_copter_frames] )) || (( $+functions[_copter_frames] )) ||
_copter_frames() { _copter_frames() {
search_vehicle=true search_vehicle=true
local_current=$CURRENT local_current=$CURRENT
vehicle='' vehicle=''
_get_vehicle_type
# search the vehicle type used with -v on previous arguements
# Todo: handle failure
while ( $search_vehicle || $local_current -eq 0 ) while ( $search_vehicle || $local_current -eq 0 )
do do
case $words[$local_current] in for w in $vehicles
("ArduCopter" | "AntennaTracker" | "APMrover2" | "ArduSub" | "ArduPlane") do
search_vehicle=false if [ "$w" = "$words[$local_current]" ]
vehicle=$words[$local_current] then
;; vehicle=$words[$local_current]
esac search_vehicle=false
break
fi
done;
local_current=$(( $local_current - 1 )) local_current=$(( $local_current - 1 ))
done done
local frames;
case $vehicle in # get the calling program, remove anything after the space == all commands arguments
("ArduCopter") local caller; caller=$(echo ${words[@]} | sed 's/ .*//g');
frames=(
'+:Copter type +' \ # to get the vehicle list :
'X:Copter type X' \ # Get everything between "frame type" and "-C", remove first and last line, get line starting with caracters and ": " sequence, remove spaces and :
'airsim-copter:Copter for AirSim' \ local supported_vehicle_list=($($caller --help | sed -n '/frame type/,/-C/p' | sed -e '1d' -e '$d' | sed -n 's/\(.*: \).*/\1/p' | sed -e 's/ //g' -e 's/://g'))
'coaxcopter:Copter type Coaxial' \
'djix:Copter type DJI X' \ local frames;
'dodeca-hexa:Copter type Dodeca-hexa' \ local count=1;
'gazebo-iris:Copter type iris for Gazebo' \ for v in $supported_vehicle_list
'heli:Heli' \ do
'heli-compound:Heli with compound' \ if [ "$v" = "$vehicle" ]
'heli-dual:Dual Heli' \ then
'hexa:Copter type hexa' \ # Get everything between "frame type" and "-C", remove first and last line and change starting space by " :", change newlines to space, remove spaces then change vehicle type enclose by ":" by newline and change "|" by space, remove first line, get line "count" that match supported_vehicle_list[count]
'octa:Copter type octa' \ frames=($($caller --help | sed -n '/frame type/,/-C/p' | sed -e '1d' -e '$d' -e 's/^\s*A/ :A/g' | tr '\n' ' ' | sed -e 's/ //g' -e 's/:\w*:/\n/g' -e 's/[|]/ /g' | sed '1d' | sed "${count}q;d"))
'octa-quad:Copter type octa-quad' \ break
'quad:Copter type quad' \ fi
'scrimmage-copter:Copter for scrimmage' \ count=$(( $count + 1 ))
'singlecopter:Copter type singlecopter' \ done
'tri:Copter type tri' \
'y6:Copter type y6' \
);;
("APMrover2")
frames=(
'balancebot:Balance Bot' \
'gazebo-rover:Rover for Gazebo' \
'rover:Rover type ackerman' \
'rover-skid:Rover type skidsteering' \
'sailboat:Boat type sailboat' \
'sailboat-motor:Boat type sailboat with motor' \
'balancebot:Balance Bot' \
);;
("ArduSub")
frames=(
'gazebo-bluerov2:Sub for Gazebo' \
'vectored:Sub vectored' \
);;
("AntennaTracker")
frames=(
'tracker:Antenna Tracker' \
);;
("ArduPlane")
frames=(
'CRRCSim:Plane for CRRCSim' \
'gazebo-zephyr:Plane for Gazebo' \
'jsbsim:Plane for jsbsim' \
'plane:Plane type plane' \
'plane-dspoilers:Plane with dspoilers' \
'plane-elevon:Plane with elevon' \
'plane-jet:Plane type jet' \
'plane-tailsitter:Plane type tailsitter' \
'plane-vtailjet:Plane type vtail' \
'quadplane:Plane type quadplane' \
'quadplane-cl84:Plane type quadplane-cl84' \
'quadplane-tilttrivec:Plane type quadplane-tilttrivec' \
'quadplane-tri:Plane type quadplane-tri' \
'scrimmage-plane:Plane for scrimmage' \
);;
esac
_describe -t frames 'frame' frames "$@" && ret=0 _describe -t frames 'frame' frames "$@" && ret=0
} }