#!/bin/sh
# firmware upgrade process functions

source /etc/profile

YELLOW="\033[1;33m"
RED="\033[1;31m"
NC='\033[0m' # No Color
BOLD="\033[1;1m"
GREEN='\033[1;32m'

write_firmup_state() {
	FWUP_DBG=1
	FIRMUP_STATE_FILE=/tmp/fw_upgrade_state.txt
	echo "PROGRESS=$1;" > $FIRMUP_STATE_FILE
	echo "DESCRIPTION=\"$2\";" >> $FIRMUP_STATE_FILE
	
	if [ "$FWUP_DBG" = "1" ]; then
		echo "---------------------------------------------"
		cat $FIRMUP_STATE_FILE
		echo "---------------------------------------------"
	fi
}

# make bootmode as normal boot
make_normal_bootmode() {
	echo "make_normal_bootmode..."
	PartitionName="syst"
	MtdNum=`cat /proc/mtd | grep $PartitionName | awk '{print $1}' | sed -e s/^mtd// | sed -e s/\://`
	BOOTMODE_TMP=/bootmode.bin
	echo -n -e "\\x00\\x00\\x00\\x00" > $BOOTMODE_TMP
	/usr/sbin/flash_eraseall /dev/mtd${MtdNum}
	/usr/sbin/nandwrite -p /dev/mtd${MtdNum} $BOOTMODE_TMP
	
	/usr/local/bin/upgrade_partition -q -C "console=ttyS0 ubi.mtd=lnx root=ubi0:rootfs rw rootfstype=ubifs init=/linuxrc"
}

chg_bootmode() {
	bootmode="$1"
	bootmode_hex=`printf "%02x" $bootmode`
	echo "change boot mode to 0x${bootmode_hex}"
	PartitionName="syst"
	MtdNum=`cat /proc/mtd | grep $PartitionName | awk '{print $1}' | sed -e s/^mtd// | sed -e s/\://`
	BOOTMODE_TMP=/bootmode.bin
	echo -n -e "\\x${bootmode_hex}\\x00\\x00\\x00" > $BOOTMODE_TMP
	/usr/sbin/flash_eraseall /dev/mtd${MtdNum}
	/usr/sbin/nandwrite -p /dev/mtd${MtdNum} $BOOTMODE_TMP
}

update_ramdisk_image(){

	local WorkDir=$1
	IR_FILE=`find ${WorkDir} -name "r*mdisk_*" | tail -n 1`
	source /etc/system.info
	CHGIR_SH="/usr/sbin/chgir"
	if [ -f "$IR_FILE" ]; then
		NEW_IR_VER=`echo "$IR_FILE" | awk -F "_" '{print $2}' | sed 's/.gz//g'`
		CUR_IR_VER=`echo $SYS_VER | sed 's/(RC)//g'`
		OPTARG=""
		echo "Current ramdisk Version: $CUR_IR_VER"
		echo "    New ramdisk Version: $NEW_IR_VER"
		if [ "$CUR_IR_VER" != "$NEW_IR_VER" ]; then
			OPTARG="-f"
		else
			OPTARG=""
		fi
		write_firmup_state 87 "Change ir ..."
		echo
		printf "${YELLOW}**********************************${NC}\n"
		printf "${YELLOW}* Change ir: $IR_FILE${NC}\n"
		printf "${YELLOW}**********************************${NC}\n"
		echo
		if [ -f "${WorkDir}/chgir" ]; then
			diff ${WorkDir}/chgir /usr/sbin/chgir > /dev/null
			if [ $? -ne 0 ]; then
				printf "${BOLD}chgir is differ${NC}, update ramdisk image using ${WorkDir}/chgir\n"
				OPTARG="-f"
				CHGIR_SH="${WorkDir}/chgir"
				chmod a+x $CHGIR_SH
				$CHGIR_SH $IR_FILE $OPTARG
				if [ $? -eq 0 ]; then 
					printf "[ ${GREEN} OK ${NC} ] Change ir($CHGIR_SH $IR_FILE $OPTARG)\n"
				else
					printf "[ ${RED}FAILED${NC} ] Change ir($CHGIR_SH $IR_FILE $OPTARG)\n"
				fi
			else
				$CHGIR_SH $IR_FILE $OPTARG
				if [ $? -eq 0 ]; then 
					printf "[ ${GREEN} OK ${NC} ] Change ir($CHGIR_SH $IR_FILE $OPTARG)\n"
				else
					printf "[ ${RED}FAILED${NC} ] Change ir($CHGIR_SH $IR_FILE $OPTARG)\n"
				fi
			fi
		else
			$CHGIR_SH $IR_FILE $OPTARG
			if [ $? -eq 0 ]; then 
				printf "[ ${GREEN} OK ${NC} ] Change ir($CHGIR_SH $IR_FILE $OPTARG)\n"
			else
				printf "[ ${RED}FAILED${NC} ] Change ir($CHGIR_SH $IR_FILE $OPTARG)\n"
			fi
		fi
	else
		printf "[ ${RED}FAILED${NC} ] Ramdisk image is not exist, skip update ramdisk image...\n"
		echo 
	fi
}


update_kernel_image(){
	local WorkDir=$1
	KER_FILE=`find ${WorkDir} -name "KImage_*" | tail -n 1`
	source /etc/system.info
	NEW_CHGKI_SH="${WorkDir}/chgki"
	CHGKI_SH="/usr/sbin/chgki"
	if [ -f "$KER_FILE" ]; then
		write_firmup_state 83 "Change Kernel Image ..."
		echo
		printf "${YELLOW}**********************************${NC}\n"
		printf "${YELLOW}* Change Kernel Image: ${KER_FILE}${NC}\n"
		printf "${YELLOW}**********************************${NC}\n"
		echo
		if [ -f $NEW_CHGKI_SH ]; then
			diff $NEW_CHGKI_SH $CHGKI_SH > /dev/null
			if [ $? -ne 0 ]; then
				echo "chgki is differ, update ramdisk image using $NEW_CHGKI_SH"
				CHGKI_SH=$NEW_CHGKI_SH
				chmod a+x $CHGKI_SH
				$CHGKI_SH $KER_FILE
				if [ $? -eq 0 ]; then 
					printf "[ ${GREEN} OK ${NC} ] Change Kernel Image($CHGKI_SH $KER_FILE)\n"
				else
					printf "[ ${RED}FAILED${NC} ] Change Kernel Image($CHGKI_SH $KER_FILE)\n"
					return 1
				fi
			else
				$CHGKI_SH $KER_FILE
				if [ $? -eq 0 ]; then 
					printf "[ ${GREEN} OK ${NC} ] Change Kernel Image($CHGKI_SH $KER_FILE)\n"
				else
					printf "[ ${RED}FAILED${NC} ] Change Kernel Image($CHGKI_SH $KER_FILE)\n"
					return 1
				fi
			fi
		else
			$CHGKI_SH $KER_FILE
			if [ $? -eq 0 ]; then 
				printf "[ ${GREEN} OK ${NC} ] Change Kernel Image($CHGKI_SH $KER_FILE)\n"
			else
				printf "[ ${RED}FAILED${NC} ] Change Kernel Image($CHGKI_SH $KER_FILE)\n"
				return 1
			fi
		fi
	else
		echo "Kernel image is not exist, skip update ..."
		echo 
	fi
}

# Returns 0 if a list includes an item, or 1
# Params
# - $1 : list where items are seperated space. ex. "3Q 3W 3X 3Y"
# - $2 : item
# Notice: When calling this function, list and item must be quoted
# Example:
#   SUPPORTED_CARMERA_CODES="3Q 3W 3X 3Y"
#   CURRENT_CARMERA_CODE=`/usr/sbin/spcp 19 2`
#   list_include "$SUPPORTED_CARMERA_CODES" "$CURRENT_CARMERA_CODE"
function list_include_item {
	local list="$1"
	local item="$2"
	if [[ $list =~ (^|[[:space:]])"$item"($|[[:space:]]) ]] ; then
		# yes, list include item
		return 0
	else
		return 1
	fi
}
