#!/bin/sh
# fwupdate version 1.02

# Geprueft wird die SCHNITTSTELLE, nicht mehr ein Dienst: can0.service ist
# abgeschafft, CAN kommt jetzt ueber systemd-networkd aus
# /etc/systemd/network/can0.network. Die alte Wache
# "systemctl is-active --quiet can0.service" war damit immer unwahr (am Geraet
# gemessen: inactive, Exitcode 3), das Skript stieg in seiner ersten Zeile aus
# und CANbbbFlashFirmware wurde NIE aufgerufen -- obwohl can0 lief.
#
# "ip link show up dev can0" liefert nur dann Zeilen, wenn die Schnittstelle
# existiert UND oben ist; fehlt sie oder ist sie unten, bleibt die Ausgabe leer.
# Das ist unabhaengig davon, wer can0 hochzieht.
#
# exit 0 wie vorher: kein CAN ist kein Fehler, der Dienst soll deswegen nicht
# als fehlgeschlagen gelten.
if [ -z "$(ip link show up dev can0 2>/dev/null)" ]; then
        echo can0 is not up!
        exit 0
fi
FORCE=""
ORG=ChannelCtrl.firmware
F303=ChannelF303.firmware
G491=ChannelG491.firmware
INPUTFILE=""

for i in "$@"
do
  case $i in
    force|--force|-f)
    FORCE="--force"
    echo force enabled
    shift # past argument=value
    ;;
    *.firmware)
    INPUTFILE="${i}"
    echo using firmware ${INPUTFILE}
    shift # past argument=value
    ;;
    --maxhw*|--minhw*|--min-hardware-version*|--max-hardware-version*|--fidz|--force-device-projectid-zero*|--ignore-file-projectid-zero*|--ignore-file-hardware-version*)
    # options for CANbbbFlashFirmware
    echo CANbbbFlashFirmware option ${i}
        ;;
	*)
    # unknown option
    echo invalid option ${i}!!
        ;;
  esac
done

hwReset()
{
	echo Reset channels
	echo 1 > /dev/intronik-io/OutResetChannels/value
	sleep 0.1s
	echo 0 > /dev/intronik-io/OutResetChannels/value
}

resetAndUpdate()
{
	FW=$1
	shift
	echo "\n\n\n"
	echo ++++++++++++++++++++++++++++++++++++++++++
	echo Calling update ${FW} with options ${FORCE} $* in ${PWD}
	echo ++++++++++++++++++++++++++++++++++++++++++
	if [ -f "$FW" ]; then
		hwReset
		/home/intronik/CANbbbFlashFirmware ${FW} ${FORCE} $*
		sleep 0.5s
	else
		echo File not found, update skipped
	fi
}

if [ "$INPUTFILE" = "" ]
then
	cd /home/intronik/
	# if there is an old firmware file we use this, since it might be a downgrade
	# an update to the new style firmware deletes the $ORG file
	if [ -f "$ORG" ]; then
		echo found $ORG => old style update
		resetAndUpdate $ORG --force-device-projectid-zero
	else
		echo new style update
		resetAndUpdate $F303 --force-device-projectid-zero
	fi
else
	echo custom update
	resetAndUpdate ${INPUTFILE} $*
fi

echo done
