#!/bin/sh

ROOTER=/usr/lib/rooter

log() {
	modlog "Band Mask $CURRMODEM" "$@"
}

CURRMODEM=$1
MODTYPE=$2
uci set modem.modem$CURRMODEM.modtype=$MODTYPE
uci commit modem

CPORT=$(uci get modem.modem$CURRMODEM.commport)

sierrabandmask() {
	enb=$(uci -q get custom.bandlock.enabled)
	ATCMDD='AT!ENTERCND="A710";!BAND?'
	OX=$($ROOTER/gcom/gcom-locked "/dev/ttyUSB$CPORT" "run-at.gcom" "$CURRMODEM" "$ATCMDD")
	if [ $enb == "1" ]; then
		log " "
		log "Sierra Response : $OX"
		log " "
	fi
	OX=$(echo $OX | tr " " '\x0a')
	echo "$OX" > /tmp/sierrabm
	idP=$(uci get modem.modem$CURRMODEM.idP)
	if [ "$idP" = "90d3" -o "$idP" = "90d2" -o "$idP" = "90e1" -o "$idP" = "90e3" ]; then
		while IFS= read -r line; do
			for i in $(seq 14); do
				read -r line
				if [ "$line" = "LTE:" ]; then
					read -r line
					break
				fi
			done
			ltel=$line
			read -r line
			lteh=$line
			a=$lteh$ltel
			L1=${a:10}
			for i in $(seq 4); do
				read -r line
			done
			ltel=$line
			read -r line
			lteh=$line
			a=$lteh$ltel
			L5=${a:10}
			for i in $(seq 4); do
				read -r line
			done
			ltel=$line
			read -r line
			lteh=$line
			a=$lteh$ltel
			L6=${a:10}
			break
		done < /tmp/sierrabm

		log " "
		log "EM9191 LTE Band Mask : $L1"
		log "EM9191 5G NSA Band Mask : $L5"
		log "EM9191 5G NA Band Mask : $L6"
		log " "

		uci set modem.modem$CURRMODEM.GW=""
		uci set modem.modem$CURRMODEM.L1="$L1"
		uci set modem.modem$CURRMODEM.L5="$L5"
		uci set modem.modem$CURRMODEM.L6="$L6"
		uci commit modem
		ATCMDD='AT!ENTERCND="AWRONG"'
		OX=$($ROOTER/gcom/gcom-locked "/dev/ttyUSB$CPORT" "run-at.gcom" "$CURRMODEM" "$ATCMDD")
		$ROOTER/luci/mask.sh
		exit 0
	fi
	line=$OX
	Unk=$(echo $line | grep "Unknown")
	if [ "$Unk" ]; then
		BND=$(echo $line | cut -d, -f6 | tr " " ",")
		if [ $enb == "1" ]; then
			log "Unknw : $BND"
		fi
		L1=$(echo $BND | cut -d, -f11)
		GW=$(echo $BND | cut -d, -f10)
		L2=$(echo $BND | cut -d, -f13)
	else
		all=$(echo $line | grep "L Band Mask 2")
		if [ "$all" ]; then
			BND=$(echo $line | cut -d, -f4 | tr " " ",")
			if [ $enb == "1" ]; then
				log "EM7511 : $BND"
			fi
			OK=8
			EOK=$(echo $BND | cut -d, -f$OK)
			while [ $EOK != "OK" ]; do
				OK=$(( OK + 1 ))
				EOK=$(echo $BND | cut -d, -f$OK)
			done
			if [ $enb == "1" ]; then
				log "$OK"
			fi
			ex1=$(( OK - 5 ))
			ex2=$(( OK - 6 ))
			ex3=$(( OK - 3 ))
			L1=$(echo $BND | cut -d, -f$ex1)
			GW=$(echo $BND | cut -d, -f$ex2)
			L2=$(echo $BND | cut -d, -f$ex3)
		else
			BND=$(echo $line | cut -d, -f5 | tr " " ",")
			if [ $enb == "1" ]; then
				log "$BND"
			fi
			L1=$(echo $BND | cut -d, -f3)
			GW=$(echo $BND | cut -d, -f2)
			L2=$(echo $BND | cut -d, -f5)
		fi
	fi
	if [ ! $L2 ]; then
		L2="0000000000000000"
	fi
	if [ $L2 = "OK" ]; then
		L2="0000000000000000"
	fi
	if [ $enb == "1" ]; then
		log " "
		log "LTE Band Mask : $L2$L1"
		log " "
	fi
	uci set modem.modem$CURRMODEM.GW="$GW"
	uci set modem.modem$CURRMODEM.L1="0x$L2$L1"
	uci set modem.modem$CURRMODEM.L1X="$L1"
	uci set modem.modem$CURRMODEM.L2="$L2"
	uci commit modem
	ATCMDD='AT!ENTERCND="AWRONG"'
	OX=$($ROOTER/gcom/gcom-locked "/dev/ttyUSB$CPORT" "run-at.gcom" "$CURRMODEM" "$ATCMDD")
}

quebandmask() {
	enb=$(uci -q get custom.bandlock.enabled)
	idP=$(uci get modem.modem$CURRMODEM.idP)
	CPORT=$(uci get modem.modem$CURRMODEM.commport)
	ATCMDD="AT+CGMM"
	OX=$($ROOTER/gcom/gcom-locked "/dev/ttyUSB$CPORT" "run-at.gcom" "$CURRMODEM" "$ATCMDD")
	model=$(echo "$OX" | tr '\n' ' ' | cut -d' ' -f2)
	uci set modem.modem$CURRMODEM.model=$model
	ATCMDD='AT+QCFG="band"'
	EM160=0
	if [ $enb == "1" ]; then
		log " "
		log "Modem PID : $idP"
		log "Modem Model : $model"
		log " "
	fi
	if [ $idP = "0620" -o $idP = "0800" -o $idP = "030b" -o $idP = "0900" -o $idP = "0801" ]; then
		EM20=$(echo $model | grep "EM20")
		if [ -z "$EM20" ]; then
			EM160=1
			ATCMDD='AT+QNWPREFCFG="lte_band"'
		fi
	fi
	OX=$($ROOTER/gcom/gcom-locked "/dev/ttyUSB$CPORT" "run-at.gcom" "$CURRMODEM" "$ATCMDD")
	if [ $enb == "1" ]; then
		log " "
		log "Quectel Response : $OX"
		log " "
	fi
	L5=""
	L6=""
	EMT=0

	if [ $EM160 = $EMT ]; then
		qm=$(echo $OX" " | grep "+QCFG:" | tr -d '"' | tr " " ",")
		if [ $enb == "1" ]; then
			log "$qm"
			log " "
		fi
		L1=$(echo $qm | cut -d, -f5)
		GW=$(echo $qm | cut -d, -f4)
		L2="0"
	else
		qm=$(echo $OX" " | grep "+QNWPREFCFG:" | tr -d '"' | tr " " ":" | tr "," ":")
		if [ $enb == "1" ]; then
			log "$qm"
			log " "
		fi
		bd=5
		msk=""
		L1=$(echo $qm | cut -d: -f"$bd")
		while [ $L1 != "OK" ]
		do
			msk=$msk$L1" "
			bd=$((bd+1))
			L1=$(echo $qm | cut -d: -f"$bd")
		done
		L1=$(encodemask $msk)
		if [ -z "$L1" ]; then
			L1="0"
		fi
		L2="0"
		GW="0"
		EMT=0800

		if [ $idP = $EMT -o $idP = 0900 -o $idP = "0801" ]; then
			ATCMDD='AT+QNWPREFCFG="nsa_nr5g_band"'
			OX=$($ROOTER/gcom/gcom-locked "/dev/ttyUSB$CPORT" "run-at.gcom" "$CURRMODEM" "$ATCMDD")
			qm=$(echo $OX" " | grep "+QNWPREFCFG:" | tr -d '"' | tr " " ":" | tr "," ":")
			if [ $enb == "1" ]; then
				log "EM160/RM500 $qm"
			fi
			bd=5
			msk=""
			L5=$(echo $qm | cut -d: -f"$bd")

			while [ $L5 != "OK" ]
			do
				msk=$msk$L5" "
				bd=$((bd+1))
				L5=$(echo $qm | cut -d: -f"$bd")
			done
			if [ -z "$msk" -o $msk = "0" ]; then
				L5="0"
			else
				L5=$(encodemask $msk)
			fi

			ATCMDD='AT+QNWPREFCFG="nr5g_band"'
			OX=$($ROOTER/gcom/gcom-locked "/dev/ttyUSB$CPORT" "run-at.gcom" "$CURRMODEM" "$ATCMDD")
			qm=$(echo $OX" " | grep "+QNWPREFCFG:" | tr -d '"' | tr " " ":" | tr "," ":")
			if [ $enb == "1" ]; then
				log "EM160/RM500 $qm"
			fi
			bd=5
			msk=""
			L6=$(echo $qm | cut -d: -f"$bd")

			while [ $L6 != "OK" ]
			do
				msk=$msk$L6" "
				bd=$((bd+1))
				L6=$(echo $qm | cut -d: -f"$bd")
			done
			if [ -z "$msk" -o $msk = "0" ]; then
				L6="0"
			else
				L6=$(encodemask $msk)
			fi
			$ROOTER/luci/celltype.sh $CURRMODEM
			netmode=$(uci -q get modem.modem$CURRMODEM.netmode)
			NET="0"
			if [ -e /etc/qfake ]; then
				if [ $netmode = "7" ]; then
					NET=8
				fi
			else
				if [ $netmode = "8" ]; then
					NET=8
				fi
				if [ $netmode = "9" ]; then
					NET=9
				fi
			fi
			uci set modem.modem$CURRMODEM.NET="$NET"
			if [ $NET = "8" -a $L1 = "0" ]; then
				if [ $enb == "1" ]; then
					log "NSA no LTE"
				fi
			fi
		fi
	fi
	if [ $enb == "1" ]; then
		log " "
		log "LTE Band Mask : $L1"
		log "5G NSA Band Mask : $L5"
		log "5G NA Band Mask : $L6"
		log " "
	fi
	uci set modem.modem$CURRMODEM.GW="$GW"
	uci set modem.modem$CURRMODEM.L1="$L1"
	uci set modem.modem$CURRMODEM.L2="$L2"
	uci set modem.modem$CURRMODEM.L5="$L5"
	uci set modem.modem$CURRMODEM.L6="$L6"
	uci commit modem
}

fibomask() {
	idV=$(uci get modem.modem$CURRMODEM.idV)
	idP=$(uci get modem.modem$CURRMODEM.idP)
	enb=$(uci -q get custom.bandlock.enabled)
	CPORT=$(uci get modem.modem$CURRMODEM.commport)
	msk=""
	NRsupport=false
	ATCMDD='AT+GTACT=?'
	OX=$($ROOTER/gcom/gcom-locked "/dev/ttyUSB$CPORT" "run-at.gcom" "$CURRMODEM" "$ATCMDD")
	OX=$(echo $OX | grep -o "+GTACT:[^)]\+")
	if [ -n "$OX" ]; then
		RATlist=$(echo $OX | grep -o "[0-9]\{2\}")
		for RATval in $(echo "$RATlist"); do
			if [ $RATval == "14" -o $RATval == "16" -o $RATval == "17" -o $RATval == "20" ]; then
				NRsupport=true
			fi
		done
		ATCMDD='AT+GTACT?'
		OX=$($ROOTER/gcom/gcom-locked "/dev/ttyUSB$CPORT" "run-at.gcom" "$CURRMODEM" "$ATCMDD")
		OX=$(echo $OX" " | grep "+GTACT:" | tr -d '"' | tr " " ",")
	elif [ "$idV" == "2cb7" -a "$idP" == "0104" ]; then
# Fibocom FM190W has a bug, failing test syntax AT+GTACT=?
		NRsupport=true
		ATCMDD='AT+GTACT?'
		OX=$($ROOTER/gcom/gcom-locked "/dev/ttyUSB$CPORT" "run-at.gcom" "$CURRMODEM" "$ATCMDD")
		OX=$(echo $OX" " | grep "+GTACT:" | tr -d '"' | tr " " ",")
	else
		ATCMDD='AT+XACT?'
		OX=$($ROOTER/gcom/gcom-locked "/dev/ttyUSB$CPORT" "run-at.gcom" "$CURRMODEM" "$ATCMDD")
		OX=$(echo $OX" " | grep "+XACT:" | tr -d '"' | tr " " ",")
		if [ -z "$OX" ]; then
			ATCMDD=""
			OX="No AT command found to read bands"
		fi
	fi
	LTEbands=$(echo "$OX" | grep -o "1[0-9]\{2\}")
	NRbands=$(echo "$OX" | grep -o "50[0-9]\{1,3\}")
	for bandval in $(echo "$LTEbands"); do
		msk=$msk$((bandval-100))" "
	done
	if [ -n "$msk" ]; then
		L1=$(encodemask $msk)
	else
		L1="0"
	fi
	msk=""
	for bandval in $(echo "$NRbands"); do
		msk=$msk${bandval:2}" "
	done
	if [ $enb == "1" ]; then
		log " "
		log "Get Current Bands : $ATCMDD"
		log "Current Bands : $OX"
		log " "
	fi
	if [ -z "$msk" ]; then
		if $NRsupport; then
			L5="0x0"
		else
			L5=""
		fi
	else
		L5="0x"$(encodemask $msk)
	fi
	if [ -n "$L1$L5" ]; then
		if [ $enb == "1" ]; then
			log " "
			log "LTE Band Mask : $L1"
			log "5G Band Mask : $L5"
			log " "
		fi
		uci set modem.modem$CURRMODEM.L1="0x$L1"
		uci set modem.modem$CURRMODEM.L5="$L5"
		uci commit modem
	fi
}

t77mask() {
	let NMEA=$CPORT+2
	uci set modem.modem$CURRMODEM.nmeaport=$NMEA
	uci commit modem
	enb=$(uci -q get custom.bandlock.enabled)
	ATCMDD='AT^SLBAND?'
	OX=$($ROOTER/gcom/gcom-locked "/dev/ttyUSB$CPORT" "run-at.gcom" "$CURRMODEM" "$ATCMDD")
	#ebs=$(echo "$OX" | grep "LTE,Enable Bands")
	#if ! -z "$ebs" ]; then
	#	OXE=${OX//WCDMA,Enable Bands :/"^SLBAND: WCDMA,Enabled,"}
	#	OXE=${OXE//,LTE,Enable Bands :/" ^SLBAND: LTE,Enabled,"}
	#	OX=${OXE//, LTE,Enable Bands :/" ^SLBAND: LTE,Enabled,"}
	#	OX=${OX//,OK/" OK"}
	#	OX=${OX//, OK/" OK"}
	#fi
	if [ $enb == "1" ]; then
		log " "
		log "T77 Response : $OX"
		log " "
	fi
	mw=$(echo "$OX" | grep "257")
	if [ -z "$mw" ]; then
		uci set modem.modem$CURRMODEM.mw="0"
	else
		uci set modem.modem$CURRMODEM.mw="1"
	fi
	lte=$(echo $OX" " | tr "," ":" | tr " " ",")
	if [ $enb == "1" ]; then
		log " "
		log "T77 Response : $lte"
		log " "
	fi
	idP=$(uci get modem.modem$CURRMODEM.idP)
	if [ "$idP" = 81df -o "$idP" = 00b7 -o "$idP" = 00b3 ]; then
		L1="0"
		L5="0"
		cntr=7
		qm=$(echo $lte | cut -d, -f4)
		if [ "$qm" = "WCDMA:Disable" ]; then
			let cntr=$cntr-1
		fi
		qm=$(echo $lte | cut -d, -f$cntr)
		if [ "$qm" = "LTE:Enable" ]; then
			let cntr=$cntr+2
		else
			let cntr=$cntr+3
		fi
		qm=$(echo $lte | cut -d, -f$cntr)
		if [ "$qm" = "LTE:Disable" ]; then
			let cntr=$cntr+2
		else
		# process LTE bands
			echo "$qm"
			bd=2
			msk=""
			qm=$qm","
			L1=$(echo "$qm" | cut -d: -f"$bd")
			while [ "$L1" != "," ]
			do
				msk=$msk$L1" "
				bd=$((bd+1))
				L1=$(echo "$qm" | cut -d: -f"$bd")
			done
			L1=$(encodemask $msk)
			let cntr=$cntr+3
		fi
		qm=$(echo $lte | cut -d, -f$cntr)
		if [ "$qm" = "NR5G:Enable" ]; then
			let cntr=$cntr+2
		else
			let cntr=$cntr+3
		fi
		qm=$(echo $lte | cut -d, -f$cntr)
		if [ "$qm" != "NR5G:Disable" ]; then
		# process NR5G bands
			echo "$qm"
			bd=2
			msk=""
			qm=$qm","
			L5=$(echo "$qm" | cut -d: -f"$bd")
			while [ "$L5" != "," ]
			do
				msk=$msk$L5" "
				bd=$((bd+1))
				L5=$(echo "$qm" | cut -d: -f"$bd")
			done
			L5=$(encodemask $msk)
		fi
		if [ $enb == "1" ]; then
			log " "
			log "LTE Band Mask : $L1"
			log "5G Band Mask : $L5"
			log " "
		fi
		uci set modem.modem$CURRMODEM.L1="0x$L1"
		uci set modem.modem$CURRMODEM.L5="$L5"
	else
		bds=$(echo "$lte" | grep "Bands")
		if [ -z "$bds" ]; then
			qm=$(echo $lte | cut -d, -f5)
		else
			qm=$(echo $lte | cut -d, -f7)
		fi
		log "$qm"
		if [ -z "$bds" ]; then
			bd=3
		else
			qm="0"$qm
			bd=2
		fi
		msk=""
		L1=$(echo $qm | cut -d: -f"$bd")
		while [ $L1 != "OK" ]
		do
			msk=$msk$L1" "
			bd=$((bd+1))
			L1=$(echo $qm | cut -d: -f"$bd")
		done
		L1=$(encodemask $msk)
		if [ -z "$L1" ]; then
			L1="0"
		fi
		if [ $enb == "1" ]; then
			log " "
			log "LTE Band Mask : $L1"
			log " "
		fi
		uci set modem.modem$CURRMODEM.L1="0x$L1"
	fi
	uci commit modem
}

reversebit() {
	LX=$1
	length=${#LX}
	jx="${LX:2:length-2}"
	length=${#jx}
	str=""
	i=$((length-1))
	while [ $i -ge 0 ]
	do
		dgt="0x"${jx:$i:1}
		DecNum=`printf "%d" $dgt`
		Binary=
		Number=$DecNum
		while [ $DecNum -ne 0 ]
		do
			Bit=$(expr $DecNum % 2)
			Binary=$Bit$Binary
			DecNum=$(expr $DecNum / 2)
		done
		if [ -z $Binary ]; then
			Binary="0000"
		fi
		len=${#Binary}
		while [ $len -lt 4 ]
		do
			Binary="0"$Binary
			len=${#Binary}
		done
		revstr=""
		length=${#Binary}
		ii=$((length-1))
		while [ $ii -ge 0 ]
		do
			revstr=$revstr${Binary:$ii:1}
			ii=$((ii-1))
		done
		str=$str$revstr
		i=$((i-1))
	done
	revstr=$str"0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
}

reverse() {
	REV=""
	BNDD=$1
	strlen=${#BNDD}
	i=$((strlen-1))
	while [ $i -ge 0 ]
	do
		REV=$REV${BNDD:$i:1}
		i=$((i-1))
	done
}

telitbandmask() {
	enb=$(uci -q get custom.bandlock.enabled)
	ATCMDD='AT#BND?'
	OX=$($ROOTER/gcom/gcom-locked "/dev/ttyUSB$CPORT" "run-at.gcom" "$CURRMODEM" "$ATCMDD")
	if [ $enb == "1" ]; then
		log " "
		log "Telit Response : $OX"
		log " "
	fi
	OX=$(echo $OX | tr " " '\x0a')
	line=$OX
	bnd=$(echo $line | grep "BND: ")
	if [ ! -z "$bnd" ]; then
		line=$(echo $bnd | tr " " ',')
		if [ $enb == "1" ]; then
			log "$line"
		fi
		BND=$(echo $line | cut -d, -f5)
		ext=$(echo $line | cut -d, -f6)
		reverse $BND
		revs=$REV"0000000000000000"
		revs=${revs:0:16}
		reverse $revs
		EXT=""
		if [ "$ext" != "OK" -a "$ext" != "0" ]; then
			EXT=$ext
		fi
		revs=$EXT$REV
		if [ $enb == "1" ]; then
			log " "
			log "LTE Band Mask : $revs"
			log " "
		fi
		ATCMDD='AT#BND=?'
		OX=$($ROOTER/gcom/gcom-locked "/dev/ttyUSB$CPORT" "run-at.gcom" "$CURRMODEM" "$ATCMDD")
		OX=$(echo $OX | tr " " '\x0a')
		OX=$(echo ${OX//),(/!})
		BND=$(echo $OX"!!" | cut -d! -f3)
		extt=$(echo $OX"!!" | cut -d! -f4)
		if [ ! -z "$extt" ]; then
			extt=$(echo $extt | tr "(" ',')
			extt=$(echo $extt | tr ")" ',')
			extt=$(echo $extt",," | cut -d, -f1)
		fi
		BND=$(echo $BND | tr "(" ',')
		BND=$(echo $BND | tr ")" ',')
		BND=$(echo $BND",," | cut -d, -f1)
		reverse $BND
		revx=$REV"0000000000000000"
		revx=${revx:0:16}
		reverse $revx
		revx=$extt$REV
		revx=${revx:0:18}
		reversebit "0x"$revx
		revstr=${revstr:0:72}
		if [ $enb == "1" ]; then
			log " "
			log "LTE Bit Mask : $revstr"
			log " "
		fi

		uci set modem.modem$CURRMODEM.GW="0"
		uci set modem.modem$CURRMODEM.L1="0x$revs"
		uci set modem.modem$CURRMODEM.L1X="$revstr"
		uci set modem.modem$CURRMODEM.LEXT="$extt"
		uci set modem.modem$CURRMODEM.L2="0"
		uci commit modem
	fi
}

case $MODTYPE in
	"0" )
		sierrabandmask
	;;
	"1" )
		quebandmask
	;;
	"2" )
		fibomask
	;;
	"3" )
		t77mask
	;;
	"4" )
		telitbandmask
	;;
esac

$ROOTER/luci/mask.sh
