#!/bin/bash

function alim() {
  echo -n $1 > $ALIM
  sleep .1
}

function convertAmperes () {
  echo -n $1  | sed 's/^\([0-9]\)\([0-9]\)\([0-9]\)\([0-9]\)/\1.\2\3\4/'
}

function convertCentiVolts () {
  if (( $1 < 1000 ))
  then
    if (( $1 < 100 ))
    then
      if (( $1 < 10 ))
      then
        echo -n "0"
      fi
      echo -n "0"
    fi
    echo -n "0"
  fi
  echo $1
}

function convertVolts () {
  echo -n $1  | sed 's/^\([0-9]\)\([0-9]\)\([0-9]\)\([0-9]\)/\1\2.\3\4/'
}

function sound() {
  play -q /data/effects/$1 &
}


function UpDown() {
 # $1 : step (mV)
 # $2 : Von  (mV) (si $1 < 100)
 # $3 : Voff (mV) (si $1 < 100)

  if (( $1 < 100 ))
  then
    U=$V
    # approximativement 20 pas
    W=$(( $2 - (20 * $1) ))
    # évite de redescendre en-dessous de la tension actuelle
    if (( $W > $V ))
    then
      V=$W
    fi
    #réduit le slew-rate (10V/s) et évite overshoot
    while (( ( $U + 300 ) < $V ))
    do
      # pas de test, yolo, on a déjà testé
      U=$((U+100))
      Von=$(convertCentiVolts $U)
      Von=$(convertVolts $Von)
      alim "VSET1:${Von}"
    done
    while (( ( $U + 50 ) < $V ))
    do
      U=$((U+30))
      Von=$(convertCentiVolts $U)
      Von=$(convertVolts $Von)
      alim "VSET1:${Von}"
    done
  else
    V=0
  fi

  while [[ "$(<button_left)" == "0" ]]
  do
    if (( V > 2700 ))
    then
      echo "Relais absent ?"
      alim "OUT0"
      sound WrongBuzz.mp3
      break 2
    fi
    V=$((V+$1))
    Von=$(convertCentiVolts $V)
    Von=$(convertVolts $Von)
    alim "VSET1:${Von}"
  done

  echo -n "Von="$Von"V   "
  Von=$V
  sound Correct.mp3

  if (( $1 < 100 ))
  then
    W=$(( $3 + (20 * $1) ))
    # évite de remonter au-dessus de la tension actuelle
    if (( $W < $V ))
    then
      V=$W
    fi
  fi

  while [[ "$(<button_left)" == "1" ]]
  do
    if (( V < $1 ))
    then
      echo "Relais absent ?"
      alim "OUT0"
      sound WrongBuzz.mp3
      break 2
    fi
    V=$((V-$1))
    Voff=$(convertCentiVolts $V)
    Voff=$(convertVolts $Voff)
    alim "VSET1:${Voff}"
  done

  echo "Voff="$Voff"V"
  Voff=$V
  sound CorrectLow.mp3
}


#test si le programme de lecture des boutons est bien lancé
if [[ "$(<button_left)$(<button_middle)$(<button_right)" != "000" ]]
then
  echo "Problème de lecture de souris ?"
  sound WrongBuzz.mp3
else

  # détecte l'alimentation :
  # passe par dmesg, trouve le n° de série et récupère le nom du device
  ALIM=/dev/$(dmesg |grep -A1 "NT2009101400"|grep "ttyACM"|tail -n 1|sed 's/.* ttyACM/ttyACM/'|sed 's/: .*//')
  if [[ -c "$ALIM" && -w "$ALIM" ]]
  then
    echo "Alimentation trouvée à $ALIM"

    alim "*IDN?"

    if [[ -z "$1" ]]
    then
      compteur=1
    else
      compteur="$1"
    fi

    while [[ -e button_middle ]]
    do

      # reset alim
      alim "VSET1:00.00"
      alim "ISET1:0.020"
      alim "OUT0"
      alim "OCP0"
      alim "OVP0"

      echo "##### Pièce n° $compteur ######"

      #annonce
      sound Tadah.mp3

      #attente du bouton droit
      echo "Lancer le test en appuyant sur le bouton de droite"
      while [[ "$(<button_right)" == "0" ]] ; do sleep .1; done
#      while [[ "$(<button_right)" == "1" ]] ; do sleep .1; done
      echo "C'est parti \o/"
      sound CorrectChoice.mp3
      alim "OUT1"

      UpDown 100
      UpDown 20  $Von $Voff
      UpDown 5   $Von $Voff
      UpDown 1   $Von $Voff
      UpDown 1   $Von $Voff

      echo $compteur $Von $Voff >> RES64.log

      echo "et voilà !"
      let $((compteur++))

    done
  else
    echo "Alimentation non trouvée à $ALIM"
    sound WrongBuzz.mp3
  fi
fi
