#!/bin/sh

WIFI_FW_PATH="/hardware/arduino/avr/firmwares/wifishield/binary"
AVR_TOOLS_PATH="/hardware/tools/avr/bin"

progname=$0

usage () {
cat <<EOF
Usage: $progname [-a Arduino_path] [-f which_firmware] [-h] 
       -a set the path where the Arduino IDE is installed
       -f the firmware you want to upload, valid parameters are:
	  shield  - to upgrade the WiFi shield firmware
	  all     - to upgrade both firmwares
       -h help
EOF
  exit 0
}

upgradeHDmodule () {
  sleep 1 # Give time to the shield to end the boot
  echo "****Upgrade HD WiFi module firmware****\n"
  dfu-programmer at32uc3a1256 erase
  dfu-programmer at32uc3a1256 flash --suppress-bootloader-mem $WIFI_FW_PATH/wifi_dnld.hex
  dfu-programmer at32uc3a1256 start
  echo -n "\nRemove the J3 jumper then press the RESET button on the shield then type [ENTER] to upgrade the firmware of the shield..\n"
  read readEnter
}

upgradeShield () {
  sleep 1 # Give time to the shield to end the boot
  echo "****Upgrade WiFi Shield firmware****\n"
  dfu-programmer at32uc3a1256 erase
  dfu-programmer at32uc3a1256 flash --suppress-bootloader-mem $WIFI_FW_PATH/wifiHD.hex
  dfu-programmer at32uc3a1256 start 
  echo "\nDone. Remove the J3 jumper and press the RESET button on the shield."
  echo "Thank you!\n"
}

cat <<EOF

       Arduino WiFi Shield upgrade
=========================================
Disclaimer: to access to the USB devices correctly, the dfu-programmer needs to be used as root. Run this script as root.

EOF

if [ $USER = 'root' ] ; then  #check if the current user is root
  while getopts ":a:f:h" opt; do
    case $opt in
	a)
	  ARDUINO_PATH=$OPTARG 
	  WIFI_FW_PATH=$ARDUINO_PATH$WIFI_FW_PATH
	  AVR_TOOLS_PATH=$ARDUINO_PATH$AVR_TOOLS_PATH
	  cd $AVR_TOOLS_PATH
	  ./avr-objcopy --output-target=ihex $WIFI_FW_PATH/wifi_dnld.elf  $WIFI_FW_PATH/wifi_dnld.hex	
	  ./avr-objcopy --output-target=ihex $WIFI_FW_PATH/wifiHD.elf  $WIFI_FW_PATH/wifiHD.hex
	  ;;
	f)
	  if [ "$ARDUINO_PATH" != "" ] ; then
	    if [ "$OPTARG" = "all" ] ; then
	      upgradeHDmodule
	      upgradeShield
	      exit 0
	    else
	      if [ "$OPTARG" = "shield" ] ; then
		upgradeShield
		exit 0
	      else
		echo "invalid parameter for the -f [firmware] option, please retry."
		echo "Type -h for help\n"
		exit 1
	      fi
	     fi
	  else
	    echo "Arduino Path not setted. Retry...\n"
	  fi
	  ;;
	h)
	  usage ;; 
	\?)
	  echo "Invalid option: $OPTARG" >&2
	  usage
	  exit 1
	  ;;
	:)
	  echo "Option -$OPTARG requires an argument." >&2
	  exit 1
	  ;;
	esac
  done
else
  echo "You are not root!\n"
fi

shift $(($OPTIND - 1))