| #!/bin/bash |
| # Copyright 2019 The Chromium OS Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| VERSION="0.01" |
| |
| #Flags & Parameters |
| SHOW_USAGE="" # Show the usage for the tool |
| VERBOSE="" # Show verbose output |
| |
| # Servo USB Device ID values |
| GOOGLE_VENDOR_ID="18d1" |
| SERVO_V2_DEVICE_ID="5002" |
| SERVO_V4_DEVICE_ID="501b" |
| SERVO_MICRO_DEVICE_ID="501a" |
| SUZY_Q_CABLE_DEVICE_ID="501f" |
| SUZY_Q_DEVICE_ID="5014" # Actually CR50, but report as Suzy Q-connected to CR50 |
| |
| # Text STYLE variables |
| RED='\033[38;5;9m' |
| GREEN='\033[38;5;2m' |
| ORANGE_RED="\033[38;5;202m" |
| C_DODGERBLUE2="\033[38;5;27m" |
| NC='\033[0m' # No Color |
| |
| _printf_color() { |
| printf "${1}%s" "$2" |
| } |
| |
| _echo_color() { |
| printf "${1}%s${NC}\n" "$2" |
| } |
| |
| _echo_error() { |
| (_echo_color >&2 "${RED}" "$*") |
| } |
| |
| _echo_debug() { |
| if [ -n "${VERBOSE}" ]; then |
| (_echo_color >&2 "${ORANGE_RED}" "$*") |
| fi |
| } |
| |
| # Checks that a program is installed. Prints an optional message on failure. |
| _checkutil() { |
| local util="$1" |
| local printstring="$2" |
| |
| if ! command -v "${util}" >/dev/null 2>&1; then |
| _echo_error "Error: ${util} not found in path." |
| if [ -n "$printstring" ]; then |
| _echo_error "$printstring" |
| fi |
| exit 1 |
| fi |
| } |
| |
| _show_dev() { |
| local servo_type="$1" |
| local portnum="$2" |
| local serialnum="$3" |
| local fw_version="$4" |
| |
| if [ -n "${portnum}" ]; then |
| _printf_color "${GREEN}" " ${servo_type} running servod." |
| else |
| _printf_color "${C_DODGERBLUE2}" " ${servo_type} -" |
| fi |
| |
| if [ -n "${fw_version}" ]; then |
| _printf_color "" " Firmware Version: ${fw_version}" |
| fi |
| |
| if [ -n "${portnum}" ]; then |
| _printf_color "" " --port ${portnum}" |
| fi |
| |
| if [ -n "${serialnum}" ]; then |
| _printf_color "" " --serialname ${serialnum}" |
| fi |
| |
| _echo_color "${NC}" "" |
| } |
| |
| get_servo_info() { |
| local lsusb_output |
| local servod_running |
| |
| # Verify that lsusb is installed |
| _checkutil lsusb "Please install with your package manager before continuing." || exit 127 |
| |
| # Get USB attached devices |
| lsusb_output="$(lsusb | grep "ID ${GOOGLE_VENDOR_ID}:")" |
| servod_running="$(pgrep -a servod)" |
| _echo_debug "Debug Output:" |
| _echo_debug "${lsusb_output}" |
| _echo_debug "${servod_running}" |
| |
| servo_v2_attached="$(echo -n "${lsusb_output}" | grep ":${SERVO_V2_DEVICE_ID}" | grep -c "^")" |
| servo_micro_attached="$(echo -n "${lsusb_output}" | grep ":${SERVO_MICRO_DEVICE_ID}" | grep -c "^")" |
| servo_v4_attached="$(echo -n "${lsusb_output}" | grep ":${SERVO_V4_DEVICE_ID}" | grep -c "^")" |
| suzy_q_attached="$(echo -n "${lsusb_output}" | grep ":${SUZY_Q_DEVICE_ID}" | grep -c "^")" |
| suzy_q_cables="$(echo -n "${lsusb_output}" | grep ":${SUZY_Q_CABLE_DEVICE_ID}" | grep -c "^")" |
| suzy_q_detached=$((suzy_q_cables - suzy_q_attached)) |
| SERVOS_ATTACHED=$((servo_v2_attached + servo_micro_attached + servo_v4_attached + suzy_q_attached)) |
| |
| if [ "${suzy_q_detached}" -ne 0 ]; then |
| _echo_error "Detected ${suzy_q_detached} SuzyQables not attached to a device." |
| fi |
| if [ "${SERVOS_ATTACHED}" -eq 0 ]; then |
| _echo_error "No servos detected" |
| exit 0 |
| else |
| echo "Found ${SERVOS_ATTACHED} servo devices." |
| fi |
| echo |
| |
| # Loop through all the servo types and see if any are detected. |
| # If any are, see if they match the current port or serialnumber (serialname?) |
| for servo_vals in "servo_v2:${SERVO_V2_DEVICE_ID}" "servo_micro:${SERVO_MICRO_DEVICE_ID}" \ |
| "suzy-q:${SUZY_Q_DEVICE_ID}" "servo_v4:${SERVO_V4_DEVICE_ID}"; do |
| local servo_device_id=${servo_vals#*:} |
| local servo_type=${servo_vals%:*} |
| |
| # Move on to next servo type if none of this type are detected. |
| if [ "$(echo -n "${lsusb_output}" | grep ":${servo_device_id}" | grep -c "^")" -eq 0 ]; then |
| continue |
| fi |
| |
| echo "Detected ${servo_type}. (Vendor/Device = ${GOOGLE_VENDOR_ID}:${servo_device_id})" |
| # Loop through all detected devices of this type |
| for dev in $(echo "${lsusb_output}" | grep ":${servo_device_id}" | sed 's/://' | awk '{ print $2 ":" $4 }'); do |
| local portnum |
| local serialnum |
| local firmware_version |
| local devinfo |
| |
| devinfo="$(lsusb -v -s "${dev}")" |
| serialnum="$(echo "${devinfo}" | grep iSerial | awk '{ print $3 }')" |
| portnum="$(echo -n "${servod_running}" | grep "${serialnum}" | head -n 1 | sed 's/.*--port.//' | cut -f1 -d ' ')" |
| firmware_version="$(echo "${devinfo}" | grep iConfiguration | awk '{ print $3 }')" |
| _show_dev "${servo_type}" "${portnum}" "${serialnum}" "${firmware_version}" |
| _echo_debug "${devinfo}" |
| done |
| echo |
| done |
| |
| if [ "$(printf "%s" "${servod_running}" | wc -l)" -ne 0 ]; then |
| echo |
| echo "Running servod instances" |
| echo "${servod_running}" |
| fi |
| echo |
| } |
| |
| myversion() { |
| echo "servoinfo version ${VERSION}" |
| } |
| |
| usage() { |
| echo "${0} [options]" |
| echo |
| echo "Options:" |
| echo " V | version - Print version and exit" |
| echo " h | help - Print help and exit" |
| echo " d | debug - Set verbose output" |
| echo |
| } |
| |
| ################################################################################ |
| # Get arguments |
| args=$(getopt -l version,help,debug -o Vhd -- "$@") |
| getopt_ret=$? |
| eval set -- "${args}" |
| |
| if [ ${getopt_ret} != 0 ]; then |
| SHOW_USAGE=1 |
| fi |
| |
| while true; do |
| case "$1" in |
| -V | --version) |
| shift |
| myversion |
| exit 0 |
| ;; |
| -h | --help) |
| shift |
| SHOW_USAGE=1 |
| ;; |
| |
| -d | --debug) |
| shift |
| VERBOSE=1 |
| ;; |
| --) |
| shift |
| break |
| ;; |
| *) break ;; |
| esac |
| done |
| |
| if [ "${SHOW_USAGE}" ]; then |
| usage |
| exit 0 |
| fi |
| |
| get_servo_info |