#!/bin/bash -e

# Initialize for step motor of sled:
#   Enable pwm and setup pwm duty
#   Setup gpio pins for step motor control
#   Moving step motor back to initial position

export PATH=$PATH:/usr/libexec

PWM_CLASS_PATH="/sys/class/pwm/pwmchip0"
#Sleld 0~5 using bmc pwm8~13 as motor driver stick
PWM_NUM_OFFSET=8
PWM_PERIOD=2500000 #400HZ
PWM_DUTY=250000    #PWM_PERIOD X 10%
CALIBRATE_TIMEOUT=120

#Enable pwm for sledN
function open_pwm() {
    local SLED_NUM="$1"
    echo "Open pwm of sled$SLED_NUM"
    PWM_NUM=$(( SLED_NUM + PWM_NUM_OFFSET ))
    PWM_PATH="${PWM_CLASS_PATH}/pwm${PWM_NUM}"
    if [ ! -d "$PWM_PATH" ];then
        echo "$PWM_NUM" > "${PWM_CLASS_PATH}/export"
    fi
    if [ -d "$PWM_PATH" ];then
        echo "set pwm period to $PWM_PERIOD ns"
        if ! echo "$PWM_PERIOD" > "${PWM_PATH}/period"; then
            echo "Error: set pwm period fail"
            return 1
        fi

        if ! echo 1 > "${PWM_PATH}/enable"; then
            echo "Error: set pwm enable fail"
            return 1
        fi

        if ! echo "$PWM_DUTY" > "${PWM_PATH}/duty_cycle"; then
            echo "Error: set pwm duty_cycle fail"
            return 1
        fi
    else
        echo "Error: ${PWM_PATH} not exist, export pwm${PWM_NUM} fail"
        return 1
    fi
}

function set_gpio()
{
    NET_NAME=$1
    OUT_VAL=$2
    mapfile -t -d " " GPIO_INFO < <(gpiofind "$NET_NAME")
    if [ "${#GPIO_INFO[@]}" -ne 2 ]; then
        echo "set_gpio: can not find gpio, $NET_NAME"
        return 1
    fi
    echo -n "set_gpio: set $NET_NAME = $OUT_VAL"
    if ! gpioset "${GPIO_INFO[0]}" "${GPIO_INFO[1]%$'\n'}"="$OUT_VAL"; then
        echo " failed"
        return 1
    fi
    echo " success"
    return 0
}

function get_gpio()
{
    NET_NAME=$1
    RET_VAL=2

    mapfile -t -d " " GPIO_INFO < <(gpiofind "$NET_NAME")
    if [ "${#GPIO_INFO[@]}" -ne 2 ]; then
        echo "get_gpio: can not find gpio, $NET_NAME" >&2
        return 1
    fi
    if ! RET_VAL=$(gpioget "${GPIO_INFO[0]}" "${GPIO_INFO[1]%$'\n'}") ; then
        echo "get_gpio: get ${NET_NAME} failed" >&2
        return 1
    fi
    echo "${RET_VAL}"
    return 0
}

#Init gpio pins for step motor control
function init_gpios() {
    echo "Init GPIOs:"
    motor_ctrl_gpio_pins_names=(    "SLED${1}_MD_STBY_RESET"
                                    "SLED${1}_MD_IOEXP_EN_FAULT"
                                    "SLED${1}_MD_DIR"
                                    "SLED${1}_MD_DECAY"
                                    "SLED${1}_MD_MODE1"
                                    "SLED${1}_MD_MODE2"
                                    "SLED${1}_MD_MODE3" )

    for  gpio_name in "${motor_ctrl_gpio_pins_names[@]}"; do
        set_gpio "$gpio_name"   0
    done
}

if [[ "$1" =~ ^(slot[0-5]{1})$ ]] || [[ "$1" =~ ^(sled[0-5]{1})$ ]]; then
  SLED=$1
  SLED_NUM=${SLED:4}
else
  #show_usage
  echo "invalid sled name: ${1}"
  exit 1;
fi

#Check if sled is present
SLED_PRESENT=$(get_gpio "presence-sled${SLED_NUM}")
if [ "$SLED_PRESENT" != 0 ];then
    echo "${SLED} is not present, skip motor initialize"
    exit 1
fi

#Init gpios
init_gpios "$SLED_NUM"

#enable pwm
open_pwm "$SLED_NUM"

#SLED{N}_MS_DETECT1  (initial position)
DETECT_PIN1="SLED${SLED_NUM}_MS_DETECT1"
INIT_POS=$(get_gpio "$DETECT_PIN1")

if [ "$INIT_POS" -eq 1 ];then
    time_count=0
    echo "Making motor back to initial position..."
    motor-ctrl "$SLED" r >/dev/null
    while  [ "$INIT_POS" -eq 1 ]  ;do
        INIT_POS=$(get_gpio "$DETECT_PIN1")
        sleep 0.1
        time_count=$(( time_count + 1 ))
        if [  $time_count -gt $CALIBRATE_TIMEOUT ];then
            echo "Error: Step motor run over 1 cycle but switch never triggered"
            break
        fi
    done
    motor-ctrl "$SLED" s >/dev/null
fi

if [ "$INIT_POS" -eq 0 ];then
    echo "Motor calibrated to initial position."
    exit 0
else
    echo "Find motor initial position failed"
    exit 1
fi
