#!/bin/sh
CFG=/etc/hwinfo.json
. /usr/share/libubox/jshn.sh

simselect_for_X300() {
	#Below uci parameter is exclusively added for PH proto2 board onwards
	[ "$1" == "X300" ] && {
		uci set network.cellular.simselect='2'
	}
}

set_band_for_HL() {
	if [ "$1" == "e21x" -o "`echo $1 | grep 'G520'`" != "" ]; then
		uci set network.cellular.band1=$2
		uci set network.cellular.band2=$2

	elif [ "$1" == "e22x" -o "$1" == "X300" ]; then
		uci set network.cellular.band=$2
	fi
}

set_service_type_for_HL() {
	if [ "$1" == "e21x" -o "`echo $1 | grep 'G520'`" != "" ]; then
		uci set network.cellular.service1=$2
		uci set network.cellular.service2=$2

	elif [ "$1" == "e22x" -o "$1" == "X300" ]; then
		uci set network.cellular.service=$2
	fi
}


GPS_cmd_set()
{
	if [ "$board" == "G520" -a "$model" != "G528" -o "$board" == "X300" -a "$model" == "X304" -a "$model" == "G414" ]; then
		set_cmd=`sendat 'AT!ENTERCND="A710"' 5` 2&> /dev/null
		set_cmd=`sendat 'AT!CUSTOM="GPSENABLE",1' 2` 2&> /dev/null
		set_cmd=`sendat 'AT!GPSAUTOSTART=1,1,255,100,1' 2` 2&> /dev/null
		set_cmd=`sendat 'AT!RESET' 2` 2&> /dev/null

	elif [ "$board" == "X300" ]; then
		:
		#ToDo:- Set gps command at boot time for x300 model here.
	fi
}


factory_reset_cellular() {
	if [ "$board" == "e21x" -o "$board" == "G520" -a "$model" != "G528" ]; then
	{
		local retry_count=0
		local state=0
		local curr_carrier

		while true
		do
			sendat 'ate0' 0.2
			case "$state" in
				0)
					curr_carrier=`sendat 'AT!IMPREF?' 1 | grep -w "current carrier name" | awk -F: '{print$2}' | tr -d ' ' | tr -d '\r'`
					if [ "$?" == "0" -a -n "$curr_carrier" ];then
						retry_count=0
						state=1
						echo "current carrier configured: $curr_carrier" >> /tmp/cellular_reset.log
					else
						let retry_count++
						[ "$retry_count" -ge "5" ] && {
							echo "Enable to read current carrier configuration" >> /tmp/cellular_reset.log
							state=1
						}
					fi
				;;

				1)
					ret=`sendat 'AT!ENTERCND="A710"' 2 | grep -w OK | xargs echo -n` 2>/dev/null
					if [ "$?" == "0" -a "$ret" == "OK" ];then
						retry_count=0
						state=2
						echo "Access to password protected command enabled" >> /tmp/cellular_reset.log
					elif [ "$ret" != "OK" ]; then
						let retry_count++
						/usr/bin/logger -t gsm_generate -p info  "$ret"
						[ "$retry_count" -ge "5" ] && {
							echo "Enable access to password protected command failed" >> /tmp/cellular_reset.log
							break
						}
					fi
				;;

				2)
					ret=`sendat 'AT!RMARESET=1' 10 | grep -w OK | xargs echo -n` 2>/dev/null
					if [ "$?" == "0" -a "$ret" == "OK" ];then
						retry_count=0
						state=3     # go to carrier configuration restore state
						echo "Cellular module settings restored to OEM provisioned state" >> /tmp/cellular_reset.log
					elif [ "$ret" != "OK" ]; then
						let retry_count++
						[ "$retry_count" -ge "2" ] && {
							echo "Cellular module factory reset failed" >>/tmp/cellular_reset.log
							state=0 # skip carrier configuration restore state
							break
						}
					fi
				;;

				3)
					cmd='AT!IMPREF="'$curr_carrier'"'
					ret=`sendat $cmd 1 | grep -w OK | xargs echo -n`
					if [ "$?" == "0" -a "$ret" == "OK" ];then
						retry_count=0
						echo "Preffered carrier configuration($curr_carrier) restored successfully" >> /tmp/cellular_reset.log
						break
					else
						let retry_count++
						[ "$retry_count" -ge "5" ] && {
							echo "Unable to restore preffered carrier configuration" >> /tmp/cellular_reset.log
							state=0
							break
						}
					fi
				;;

			esac
		done
	}
	elif [ "$board" == "X300" ]; then
	{
		cmd='AT+QPRTPARA=3'
		ret=`sendat $cmd 5 | grep -w OK | xargs echo -n`
		echo "Cellular module BG95 factory reset success:$ret" >> /tmp/cellular_reset.log
	}
	else
		echo "Not firstboot, skipping cellular module factory reset" >> /tmp/cellular_reset.log
	fi

	#gps function used to set gps command at boot time.
	GPS_cmd_set

	ret=`sendat 'AT+CFUN=1,1' 0`
}


generate_gsm_cellular(){
	local ifname vid pid name protocol device
	#local board=`cat /tmp/sysinfo/board_name`
	
	json_select module
		json_select $1
			json_get_vars ifname modulename protocol device ipaccess
			json_select usedatport
				json_get_var usedatport 1
			json_select ..	
		json_select ..
	json_select ..
	
	echo "ifname:$ifname, modulename:$modulename, protocol:$protocol device:$device ipaccess:$ipaccess usedatport:$usedatport"
	[ "`uci -q get network.cellular`" == "interface" ] || {
		if [ "`echo $protocol | grep 'qmi'`" != "" ]; then
			if [ "$board" == "e21x" -o "`echo $board | grep 'G520'`" != "" ]; then
				uci -q batch <<-EOF
					set network.cellular='interface'
					set network.cellular.proto='$protocol'
					set network.cellular.device='$device'
					set network.cellular.module='$modulename'
					set network.cellular.ifname='$ifname'
					set network.cellular.autosimswitchoff=0
					set network.cellular.simpriority=1
					set network.cellular.apn1=''
					set network.cellular.apn2=''
					set network.cellular.auth1='none'
					set network.cellular.auth2='none'
					set network.cellular.username1=''
					set network.cellular.username2=''
					set network.cellular.password1=''
					set network.cellular.password2=''
					set network.cellular.pincode1=''
					set network.cellular.pincode2=''
					set network.cellular.ccid1=''
					set network.cellular.ccid2=''
					set network.cellular.roam1=1
					set network.cellular.roam2=1
					set network.cellular.band1=0
					set network.cellular.band2=0
					set network.cellular.metric=7
					set network.cellular.atport='$usedatport'
					set network.cellular.board='$board'
					set network.cellular.service1='auto'
					set network.cellular.service2='auto'
					set network.cellular.retries='5'
					set network.cellular.toswitch='60'
					set network.cellular.forceswitch='0'
					set network.cellular.cid1=''
					set network.cellular.cid2=''
					set network.cellular.pdptype1='IPV4V6'
					set network.cellular.pdptype2='IPV4V6'
					set network.cellular.passthrough='0'
				EOF
			elif [ "`echo $board | grep 'X300'`" != "" ]; then
				case $modulename in
					"RC7630"* | "RC7620"* | "RC7611"* | "WP7608"* | "WP7603"*)
						uci -q batch <<-EOF
						set network.cellular='interface'
						set network.cellular.proto='$protocol'
						set network.cellular.device='$device'
						set network.cellular.module='$modulename'
						set network.cellular.ifname='$ifname'
						set network.cellular.autosimswitchoff=0

						set network.cellular.service1='auto'
						set network.cellular.apn1='data641003'
						set network.cellular.use_custom_config1=1
						set network.cellular.pincode1=''
						set network.cellular.puk1=''
						set network.cellular.auth1='none'
						set network.cellular.username1=''
						set network.cellular.password1=''
						set network.cellular.ccid1=''
						set network.cellular.roam1=1
						set network.cellular.cid1=''
						set network.cellular.pdptype1='IPV4V6'
						set network.cellular.band1=0

						set network.cellular.service2='auto'
						set network.cellular.apn2=''
						set network.cellular.pincode2=''
						set network.cellular.puk2=''
						set network.cellular.auth2='none'
						set network.cellular.username2=''
						set network.cellular.password2=''
						set network.cellular.ccid2=''
						set network.cellular.roam2=1
						set network.cellular.cid2=''
						set network.cellular.pdptype2='IPV4V6'
						set network.cellular.band2=0

						set network.cellular.retries='5'
						set network.cellular.toswitch='60'
						set network.cellular.forceswitch='0'

						set network.cellular.metric=7
						set network.cellular.atport='$usedatport'
						set network.cellular.board='$board'
						set network.cellular.passthrough='0'
					EOF
					;;
					*)
					uci -q batch <<-EOF
						set network.cellular='interface'
						set network.cellular.proto='$protocol'
						set network.cellular.device='$device'
						set network.cellular.module='$modulename'
						set network.cellular.pdptype='IP'
						set network.cellular.auth='none'
						set network.cellular.ifname='$ifname'
						set network.cellular.autosimswitchoff=0

						set network.cellular.apn=''
						set network.cellular.password=''
						set network.cellular.pincode=''
						set network.cellular.ccid=''
						set network.cellular.roam=0
						set network.cellular.band=0
						set network.cellular.metric=7
						set network.cellular.atport='$usedatport'
						set network.cellular.board='$board'
						set network.cellular.service='auto'
						set network.cellular.cid=''
						set network.cellular.passthrough='0'
					EOF
					;;
				esac
				simselect_for_X300 $board
			fi

			case $modulename in
				MV31-W )
					sendat $usedatport 'AT^SETCONFIG=1' 1
				;;
			esac
		elif [ "$protocol" == "3g" ]; then
			if [ "$board" == "e21x" -o "`echo $board | grep 'G520'`" != "" ]; then
				uci -q batch <<-EOF
					set network.cellular='interface'
					set network.cellular.proto='$protocol'
					set network.cellular.device='$device'
					set network.cellular.module='$modulename'
					set network.cellular.pdptype='IPV4V6'
					set network.cellular.ifname='$ifname'
					set network.cellular.autosimswitchoff=0
					set network.cellular.simpriority=1
					set network.cellular.apn1=''
					set network.cellular.apn2=''
					set network.cellular.auth1='none'
					set network.cellular.auth2='none'
					set network.cellular.username1=''
					set network.cellular.username2=''
					set network.cellular.password1=''
					set network.cellular.password2=''
					set network.cellular.pincode1=''
					set network.cellular.pincode2=''
					set network.cellular.ccid1=''
					set network.cellular.ccid2=''
					set network.cellular.roam1=0
					set network.cellular.roam2=0
					set network.cellular.band1=0
					set network.cellular.band2=0
					set network.cellular.metric=7
					set network.cellular.atport='$usedatport'
					set network.cellular.board='$board'
					set network.cellular.service1='auto'
					set network.cellular.service2='auto'
					set network.cellular.retries='5'
					set network.cellular.toswitch='60'
					set network.cellular.forceswitch='0'
				EOF
			elif [ "$board" == "e22x" -o "$board" == "X300" ]; then
				uci -q batch <<-EOF
					set network.cellular='interface'
					set network.cellular.proto='$protocol'
					set network.cellular.device='$device'
					set network.cellular.module='$modulename'
					set network.cellular.ifname='$ifname'
					set network.cellular.autosimswitchoff=0

					set network.cellular.service1='auto'
					set network.cellular.pdptype1='IPV4V6'
					set network.cellular.apn1='data641003'
					set network.cellular.use_custom_config1=1
					set network.cellular.pincode1=''
					set network.cellular.puk1=''
					set network.cellular.auth1='none'
					set network.cellular.username1=''
					set network.cellular.password1=''
					set network.cellular.ccid1=''
					set network.cellular.roam1=1
					set network.cellular.cid1=''

					set network.cellular.service2='auto'
					set network.cellular.pdptype2='IPV4V6'
					set network.cellular.apn2=''
					set network.cellular.pincode2=''
					set network.cellular.puk2=''
					set network.cellular.auth2='none'
					set network.cellular.username2=''
					set network.cellular.password2=''
					set network.cellular.ccid2=''
					set network.cellular.roam2=1
					set network.cellular.cid2=''

					set network.cellular.retries='5'
					set network.cellular.toswitch='60'
					set network.cellular.forceswitch='0'

					set network.cellular.band=0
					set network.cellular.metric=7
					set network.cellular.atport='$usedatport'
					set network.cellular.board='$board'
					set network.cellular.persist='1'
					set network.cellular.ipv6='auto'
				EOF
				simselect_for_X300 $board
			fi
		elif [ "$protocol" == "cellular" ];then
			if [ "$board" == "e21x" -o "`echo $board | grep 'G520'`" != "" ]; then
				uci -q batch <<-EOF
					delete network.cellular
					set network.cellular=interface
					set network.cellular.proto='$protocol'
					set network.cellular.ifname='$ifname'
					set network.cellular.device='$device'
					set network.cellular.module='$modulename'
					set network.cellular.ipaccess='$ipaccess'
					set network.cellular.pdptype='ipv4v6'
					set network.cellular.autosimswitchoff=0
					set network.cellular.simpriority=1
					set network.cellular.apn1=''
					set network.cellular.apn2=''
					set network.cellular.auth1='none'
					set network.cellular.auth2='none'
					set network.cellular.username1=''
					set network.cellular.username2=''
					set network.cellular.password1=''
					set network.cellular.password2=''
					set network.cellular.pincode1=''
					set network.cellular.pincode2=''
					set network.cellular.ccid1=''
					set network.cellular.ccid2=''
					set network.cellular.roam1=0
					set network.cellular.roam2=0
					set network.cellular.cid1=1
					set network.cellular.cid2=1
					set network.cellular.metric=7
					set network.cellular.force_link=1
					set network.cellular.mode=0
					set network.cellular.mtu=1420
					set network.cellular.roam=0
					set network.cellular.board='$board'
					set network.cellular.retries='5'
					set network.cellular.toswitch='60'
					set network.cellular.forceswitch='0'
				EOF
			elif [ "$board" == "e22x" -o "$board" == "X300" ];then
				uci -q batch <<-EOF
					delete network.cellular
					set network.cellular=interface
					set network.cellular.proto='$protocol'
					set network.cellular.ifname='$ifname'
					set network.cellular.device='$device'
					set network.cellular.module='$modulename'
					set network.cellular.ipaccess='$ipaccess'
					set network.cellular.autosimswitchoff=0
					set network.cellular.pdptype='ipv4v6'
					set network.cellular.apn=''
					set network.cellular.auth='none'
					set network.cellular.username=''
					set network.cellular.metric=7
					set network.cellular.force_link=1
					set network.cellular.mode=0
					set network.cellular.mtu=1420
					set network.cellular.toswitch=60
					set network.cellular.roam=0
					set network.cellular.cid=1
					set network.cellular.board='$board'
				EOF
				simselect_for_X300 $board
			fi
			case $modulename in
				HL7518 | \
				HL7548 )
					sendat $device at+kusbcomp=1 1
					sendat $device at+cfun=1,1 0

					uci set network.cellular.maxports=3
					
					set_service_type_for_HL $board 5
					# uci set network.cellular.service=5
				;;

				HL8528 | \
				HL8518 | \
				HL8548)
					sendat $device at+kusbcomp=2 1
					sendat $device at+cfun=1,1 0

					uci set network.cellular.maxports=5
					set_service_type_for_HL $board 4
				;;

				HL7588)
					sendat $device at+kusbcomp=0 1
					sendat $device at+cfun=1,1 0

					uci set network.cellular.maxports=3
					set_service_type_for_HL $board 7
				;;

				HL7538)
					uci set network.cellular.maxports=3
					set_service_type_for_HL $board 5
				;;

				HL7539)
					uci set network.cellular.maxports=3
					set_service_type_for_HL $board 5
				;;

				HL7528)
					sendat $device at+kusbcomp=0 1
					sendat $device 'at*psrdbs=1,108544' 1
					sendat $device "AT+CARRIER=0,SWK" 1
					sendat $device at+cfun=1,1 0

					uci set network.cellular.maxports=3
					set_service_type_for_HL $board 5
					set_band_for_HL $board 0
				;;

				HL7690 )
					sendat $device at+kusbcomp=0 1
					sendat $device at+cfun=1,1 0
					
					uci set network.cellular.maxports=3
					set_service_type_for_HL $board 5
				;;

				HL7692 )
					sendat $device at+kusbcomp=0 1
					sendat $device at+cfun=1,1 0

					uci set network.cellular.maxports=3
					set_service_type_for_HL $board 9
				;;

				HL7618)	
					sendat $device at+kusbcomp=0 1
					sendat $device at+cfun=1,1 0

					uci set network.cellular.maxports=3
					set_service_type_for_HL $board 5
				;;

				HL7549 )
					sendat $device at+kusbcomp=0 1
					sendat $device at+cfun=1,1 0

					uci set network.cellular.maxports=3
					set_service_type_for_HL $board 5
				;;

				HL7648 | \
				HL7650)
					sendat $device at+kusbcomp=0 1
					sendat $device at+cfun=1,1 0
					
					uci set network.cellular.maxports=3
					set_service_type_for_HL $board 7
				;;
			esac
		fi
	}
}

board=`cat /tmp/sysinfo/board_name`
model=`cat /tmp/sysinfo/model`
echo "board:$board, model:$model" >/tmp/cellular_reset.log
# factory_reset_cellular &
# GPS_cmd_set was called from inside factory reset, now since factory reset is disabled, calling it here

GPS_cmd_set &

if [ -n "$1" -a "$1" == "1" ];then
	count=120
	while [ $count -gt 0 ]; do
		mount_root=`ps | grep mount_root | grep -v grep`
		if [ ! -z "$mount_root" ]; then
			break
		fi
		sleep 5
		count=`expr $count - 5`
	done

	while [ 1 ]; do
		mount_root=`ps | grep mount_root | grep -v grep`
		if [ -z "$mount_root" ]; then
			break
		fi
		sleep 5
	done
fi

json_init
#board_name=`cat /tmp/sysinfo/board_name`
#echo " board name $board_name"
json_load "$(cat ${CFG})"
json_select gsm
json_get_keys keys module
for key in $keys; do generate_gsm_cellular $key;done
uci commit
cp /tmp/cellular_reset.log /etc/cellular_reset.log
/etc/init.d/network restart
