#!/bin/sh

. "$(dirname "$0")"/prmsg.sh
get_opts "$1"

# TODO hier weitere libs eintragen, wenn welche fuer produktion_main hinzukommen...
PRODUKTION_MAIN_LIBS="CheckBuildVersion CppUtil CvLog CvLogForGtest"


sendMsg() {
    if [ -e /opt/prtsoft.elf ]
    then
	    /opt/produktion_main $(cat /scripts/produktion.d/ip.txt) $(cat /scripts/produktion.d/port.txt) "$1"
    fi
}

sendMsg 'Production installation startet. Please wait ...'
displayMsg "Installation started" "Please wait ..."
sleep 2

#####################################################################
# Boot-partition von SD mounten weil dort die zu flashenden images liegen
mkdir -p /mnt/sdboot
umount /mnt/sdboot &>/dev/null # nur fuer den fall dass zufaellig bereits gemountet, im anderen Fall Fehlermeldungen erwartet. Zur Minimierung der allgemeine Verwirrung diese nach /dev/null umgeleitet.
if ! mount /dev/mmcblk0p1 /mnt/sdboot
then
	echo 'Error: could not mount /dev/mmcblk0p1'
	displayMsg "Err:Could not mount" "dev/mmcblk0p1"
	exit 3
fi

#####################################################################
# STANDARD_rootfs.ubi auf /mtd${my_rootfs_num} flashen

displayMsg "Umount & detach" " ... "
MP=/mnt/rootfs
my_rootfs_num=$(fw_printenv -n my_rootfs_num)
my_kernel_num=$(fw_printenv -n my_kernel_num)
my_data_num=$(fw_printenv -n my_data_num)
mkdir -p $MP
umount $MP &>/dev/null # nur fuer den fall dass zufaellig bereits gemountet, im anderen Fall Fehlermeldungen erwartet. Zur Minimierung der allgemeine Verwirrung diese nach /dev/null umgeleitet.
ubidetach -m ${my_rootfs_num} &>/dev/null # nur fuer den Fall dass bereits attached, im anderen Fall Fehlermeldungen erwartet. Zur Minimierung der allgemeine Verwirrung diese nach /dev/null umgeleitet.
if ! ubiformat -y /dev/mtd${my_rootfs_num} -s 2048 -O 2048 -f /mnt/sdboot/STANDARD_rootfs.ubi
then
	echo 'ubiformat failed.'
	displayMsg "Err: ubiformat" "failed!"
	exit 1
fi
# Zur Kontrolle attachen und mounten
if ! ubiattach /dev/ubi_ctrl -m ${my_rootfs_num} -O 2048
then
	echo 'ubiattach failed.'
	displayMsg "Err: ubiattach" "failed!"
	exit 2
fi

if ! mount -t ubifs ubi0:rootfs $MP
then
	echo 'mount ubi0:rootfs failed.'
	displayMsg "Err: mount " "ubi0:rootfs failed!"
	exit 4
fi

displayMsg "produktion_main" " ... "
if ! echo '/opt/produktion_main $(cat /scripts/produktion.d/ip.txt) $(cat /scripts/produktion.d/port.txt) '\''Base firmware installed! Please make a full update afterwards!'\' >>${MP}/etc/rc5.d/S99z_cv_start.sh
then
	echo "Error: Extension of ${MP}/etc/rc5.d/S99z_cv_start.sh failed."
	displayMsg "Err: S99z_cv_start.sh" "failed!"
	exit 4
fi

if ! chmod +x ${MP}/etc/rc5.d/S99z_cv_start.sh
then
	echo "Error: Could not make ${MP}/etc/rc5.d/S99z_cv_start.sh executable."
	displayMsg "Err: S99z_cv_start.sh" "failed!"
	exit 4
fi

if [ -e /opt/prtsoft.elf ]
then

    if ! cp /opt/produktion_main ${MP}/opt/
    then
    	echo "Error: Could not copy /opt/produktion_main to ${MP}/opt"
    	displayMsg "Err: produktion_main" "failed!"
    	exit 4
    fi

    displayMsg "copy libs" " ... "
    for lib in ${PRODUKTION_MAIN_LIBS}
    do
    	echo "Copy /usr/lib/lib${lib}.so to ${MP}/usr/lib/ ..."
    	if ! cp /usr/lib/lib${lib}.so ${MP}/usr/lib/
    	then
    		echo "Could not copy /usr/lib/lib${lib}.so to ${MP}/usr/lib/"
    		displayMsg "Err: lib${lib}.so" "failed!"
    		exit 4
    	fi
    	echo "  Done."
    done

    echo "Copy prtsoft"
    displayMsg "copy prtsoft" " ... "
    echo "Start upload libs"
    cp /usr/lib/libConfigForSpeed.so /usr/lib/libEpc35HwAccess.so /usr/lib/libBurntimesToLinux_Lib.so /usr/lib/libVCDevice.so /usr/lib/libMotBurnSysAccess.so /usr/lib/libMotBurnDevCmd.so /usr/lib/libMotBurnActionExecuter.so /usr/lib/libMotBurnJobHandling.so /usr/lib/libMotBurnController.so /usr/lib/libMotBurn.so /usr/lib/libUpdateService.so  ${MP}/usr/lib/
    echo "prtsoft"
    cp /opt/prtsoft.elf ${MP}/opt/
    echo "Start upload tools"
    cp /opt/fpga_io_interactive /opt/fpga_load /opt/dump_registers ${MP}/opt/
    cp /scripts/setB4ArmDebug.sh ${MP}/scripts/
    cp /opt/fpgaLoadedAfterBoot.bit ${MP}/opt/
    cp /FPGA_IMG_ID.txt ${MP}
fi

echo "Copy /scripts/produktion.d to ${MP}/scripts/ ..."
cp -r /scripts/produktion.d ${MP}/scripts/
# if ! cp -r /scripts/produktion.d ${MP}/scripts/
# then
#	echo "  FEHLER. Breche ab ..."
#	displayMsg "Err: produktion.d" "failed!"
#	exit 4
#fi
#echo "  Done."

echo "Copy /etc/network/interfaces to ${MP}/etc/network/ ..."
if ! cp /etc/network/interfaces ${MP}/etc/network/
then
	echo "  Error: Interfaces failed"
	displayMsg "Err: interfaces" "failed!"
	exit 4
fi
echo "  Done."

sync

displayMsg "Unmount $MP" " ... "
echo "Unmount $MP ..."
if ! umount $MP
then
	echo "umount $MP failed."
	displayMsg "Err: umount $MP" "failed!"
	exit 5
fi
echo "  Done."


#####################################################################
# /mtd${passive_rootfs_num} unveraendert lassen (nicht leeren, da es bei update eh geleert wird)


#####################################################################
uboot_num=4
# STANDARD_u-boot.img auf mtd${uboot_num}4 flashen # TODO keep synchronous to the definition of the partitions in u-boot's defconfig and in device-tree's partition declarations
displayMsg "Flash u-boot.img" "mtd${uboot_num} ... "
echo "Try to flash STANDARD_u-boot.img on mtd${uboot_num} ..."
if ! flash_erase /dev/mtd${uboot_num} 0 0
then
	echo "Error: flash_erase for mtd${uboot_num} failed."
	displayMsg "Err: erase mtd${uboot_num}" "failed!"
	exit 7
fi
if ! nandwrite -p /dev/mtd${uboot_num} /mnt/sdboot/STANDARD_u-boot.img
then
	echo "Error: nandwrite for STANDARD_u-boot.img failed."
	displayMsg "Err: STANDARD_u-boot.img" "failed!"
	exit 8
fi


#####################################################################
# MLO auf mtd0-3 flashen # TODO Position und Groesse der MLO-Partition hardwarebedingt IMMER so lassen!!!

displayMsg "Flash STANDARD_MLO" "mtd0-3 ... "
echo 'Try to flash STANDARD_MLO on mtd0-3 ...'
if true # flash_erase vor nandwrite wohl im gegensatz zur u-boot console nicht notwendig unter linux?
then
	num_of_fails=0
	for i in `seq 0 3`
	do
		if ! flash_erase /dev/mtd${i} 0 0
		then
			num_of_fails=$((num_of_fails+1))
		fi
	done

	if [ $num_of_fails -gt 2 ]
	then
		echo "Error: flash_erase mtd0-3 ${num_of_fails}x failed"
		displayMsg "Err: erase /dev/mtd0-3" "failed!"
		exit $((9 + ${i}))
	else
		displayMsg "/dev/mtd0-3" "erased"
		echo "/dev/mtd0-3 erased."
    fi
fi

num_of_fails=0
for i in `seq 0 3`
do
	if ! nandwrite -p /dev/mtd${i} /mnt/sdboot/STANDARD_MLO
	then
		num_of_fails=$((num_of_fails+1))
	fi
done

if [ $num_of_fails -gt 2 ]
then
	echo "Error: nandwrite for STANDARD_MLO on /dev/mtd0-3 ${num_of_fails}x failed."
	displayMsg "Err: STANDARD_MLO" "/dev/mtd0-3 failed!"
	exit $((13 + ${i}))
else
	echo "STANDARD_MLO on /dev/mtd0-3 written."
	displayMsg "STANDARD_MLO" "/dev/mtd0-3 written"
fi

sleep 1

#####################################################################
# U-Boot-umgebungspartitionen hier NICHT leeren, da im boot-script bereits gefuellt!


#####################################################################
# STANDARD_$kernel auf mtd${my_kernel_num} flashen

echo "Try to flash Kernel on mtd${my_kernel_num} ..."
displayMsg "Flash MKernel" "mtd${my_kernel_num} ... "
if ! flash_erase /dev/mtd${my_kernel_num} 0 0
then
	echo "Error: flash_erase /dev/mtd${my_kernel_num} failed"
	displayMsg "Err: erase dev/mtd${my_kernel_num}" "failed!"
	exit 14
fi

cv_board=$(fw_printenv -n CV_BOARD)
echo "cv_board=${cv_board}"
if [ "$cv_board" = "CV_34_39_500" ]
then
	kernel=uImage.CV_34_39_500
elif [ "$cv_board" = "CV_34_39_500A" ]
then
	kernel=uImage.CV_34_39_500A
else
	kernel=uImage.CV_34_39_500B
fi

if ! nandwrite -p /dev/mtd${my_kernel_num} /mnt/sdboot/STANDARD_$kernel
then
	echo "Error: nandwrite for STANDARD_$kernel failed."
	displayMsg "Err: STANDARD_$kernel" "failed!"
	exit 15
else
	echo "STANDARD_$kernel on /dev/mtd${my_kernel_num} written."
	displayMsg "STANDARD_$kernel" "/dev/mtd${my_kernel_num} written"
fi

sleep 1

img=/mnt/sdboot/STANDARD_$kernel
size=$(printf '%x' $(stat -L -c "%s" $img))
echo "size is $size"
printf "my_kernel0_size $size\nmy_kernel_size $size\n" >/tmp/_fw_script.txt &&
fw_setenv -s /tmp/_fw_script.txt

#####################################################################
# mtd${my_kparams_num} von u-boot durch spl export & co erzeugt, also hier nichts

#####################################################################
# mtd${my_data_num} Freien Speicherplatz formatieren und Datenpartition anlegen

displayMsg "ubidetach & format" " ... "
ubidetach -m ${my_data_num} &>/dev/null # nur fuer den Fall dass bereits attached, im anderen Fall Fehlermeldungen erwartet. Zur Minimierung der allgemeine Verwirrung diese nach /dev/null umgeleitet.
if ! ubiformat -y /dev/mtd${my_data_num} -s 2048 -O 2048
then
	echo 'Error: ubiformat (data) failed.'
	displayMsg "Err: ubiformat(data)" "failed!"
	exit 1
fi
# Zur Kontrolle attachen und mounten
if ! ubiattach /dev/ubi_ctrl -m ${my_data_num} -O 2048
then
	echo 'Error: ubiattach (data) failed.'
	displayMsg "Err: ubiattach(data)" "failed!"
	exit 2
fi
# Option -m sorgt dafuer, dass der ges. verfuegbare Speicher benutzt wird
if ! ubimkvol /dev/ubi1 -N data -m
then
	echo 'Error: ubi datavolume failed'
	displayMsg "Err: ubi datavolume" "failed!"
	exit 4
fi

ubidetach -m ${my_data_num} &>/dev/null

#####################################################################
# Anmerkung zur Umgebung: cur_root wurde ersetzt durch my_boot_switch, my_rootfs_num, my_rootfs_name, ..., my_kernel_num, ..., my_kparams_num, ...
# Nach Produktion ist my_boot_switch 0, d.h. my_rootfs_num enthaelt denselben wert wie my_rootfs0_num usw. analog
# Die Werte werden bei Ausfuehrung von produktion.cmd bzw. dessen kompilat boot.scr gesetzt.
# Bei einem Update wird in Linux mit fw_setenv nur my_boot_switch von 0 auf 1 bzw. umgekehrt geaendert und ausserdem das bootcmd so gesetzt, dass
# beim naechsten hochfahren im bootloader durch die anweisung run my_follow_boot_switch die werte von my_rootfs_num, ... an den neuen wert von my_boot_switch angepasst werden
# Also hier nichts mehr noetig

#####################################################################
# sync ausfuehren
displayMsg "sync" " ... "
sync

# Wird jetzt in S99z_cv_start gemacht, da alle Ausgaben dieses Scripts protokolliert
# und dann nach sdboot kopiert werden. Falls etwas schief geht, kann man die Karte
# in Windows mounten und die Log-Datei zum Entwickler schicken.
# umount /mnt/sdboot


#####################################################################
# Hinweis fuer benutzer

displayMsg "Finished in 5s" "Please wait"
sendMsg 'Please turn of this device in 5s, wait 3s, remove SD-Card and turn on again.'

printf "\n\n*** Please turn off, remove SD-Card and turn on again.\n\n"

sleep 5
displayMsg "Finished!" "Remove Card & Reboot"
displayMsg "Finished!" "Remove Card & Reboot"

if false
then
	/scripts/halt.sh
fi
