# qmi addon for luci-app-modeminfo
# require full version libqmi (need build in SDK)
# (c) 2020-2024 written by Konstantine Shevlakov (c) at <shevlakov@132lan.ru>

get_device_info(){
	DEVPORT=$(uci -q get modeminfo.@modeminfo[$s].device_qmi)
	DEVCTL=$(echo $DEVPORT | awk -F [\/] '{print $NF}')
	if [ -x /usr/bin/qmicli ]; then
		export QMICTL="qmicli -p -d $DEVPORT"
	else
 		logger -t "luci-app-modeminfo" "qmicli not found!"
		exit 1
        fi
	if [ $DEVPORT ]; then
		QPROXY=$(uci -q get modeminfo.@modeminfo[$s].qmi_proxy)
                if [ $QPROXY -eq 1 ]; then           
                        export QMICTL="qmicli -p -d $DEVPORT"
                else                              
                        export QMICTL="qmicli -d $DEVPORT"   
                fi
	else
	       	for qmi in $(ls /dev/cdc-wdm*); do
                	if [ $qmi ]; then
               	        	QMI_DEVICE=$qmi
	               	        if [ -n $(which qmicli) ]; then
                        	        export QMICTL="qmicli -p -d ${QMI_DEVICE}"
	               	        else
	                                logger -t "luci-app-modeminfo" "qmi-utils not found or installed!"
        	                        exit 0
	               	        fi
	                else
        	                logger -t "luci-app-modeminfo" "Device is no QMI mode or not found!"
               		        exit 0
	                fi
        	done
		if [ $qmi ]; then
			uci set modeminfo.@modeminfo[0].device_qmi="$qmi"
			uci commit modeminfo
			break
		fi
	fi	
}


get_hardware_info(){
        MANUF=$(cat $(readlink -f /sys/class/usbmisc/${DEVCTL})/../../../manufacturer)
        MODEL="$(cat $(readlink -f /sys/class/usbmisc/${DEVCTL})/../../../product)"

	if [ -n "$(echo "${MODEL}" | grep -Ei "${MANUF}")" ] || [  -n "$(echo "${MANUF}" | grep -Ei QUAL)" ]; then
		DEVICE="${MODEL}"
	else
	        DEVICE="${MANUF} ${MODEL}"
	fi

        IMEI=`$QMICTL --dms-get-ids | awk -F [:] '/IMEI:/{gsub("'\''|\*", ""); print $2}'`
	FW=$($QMICTL --dms-get-software-version | awk -F [:] '/version:/{print $2}' )
	ICCID=$($QMICTL --dms-uim-get-iccid | awk -F [:] '/ICCID/{gsub("'\''",""); print $2}' )
}

get_lte_bw(){                                                                                                                                               
        case $BWDx in                                                                                                                                       
                3) BWDL=1 ;;                                                                                                                                
                5) BWDL=2 ;;                                                                                                                                
                10) BWDL=3 ;;                                                                                                                               
                15) BWDL=4 ;;                                                                                                                               
                20) BWDL=5 ;;                                                                                                                               
        esac                                                                                                                                                
}

get_signal_info(){
        NETWORK=`$QMICTL --nas-get-home-network | awk -F [:] '/MCC|MNC|Description/{gsub("'\''|^ ", "");print $2}'`
        COPS_MCC=$(echo ${NETWORK} |awk '{print $1}')
        COPS_MNC_RAW=$(echo ${NETWORK} |awk '{print $2}')
        if [ $COPS_MNC_RAW -lt 10 ]; then
                COPS_MNC=0${COPS_MNC_RAW}
        else
		COPS_MNC=$COPS_MNC_RAW
	fi
        COPS="$(echo "${NETWORK}" |tail -1)"
	SIGNAL=$($QMICTL --nas-get-signal-info)
        MODE=$(echo "$SIGNAL" | awk 'NR ==2{gsub("\:", ""); print $1}')
        STRENGTH=$(echo "$SIGNAL" | awk '/RSSI|RSRQ|RSRP|SNR|ECIO/{gsub("'\''",""); print $2}')
	SERVING=$($QMICTL --nas-get-serving-system)
	RFBAND=$($QMICTL --nas-get-rf-band-info)
        if  [ $MODE == "LTE" ]; then
		MIMO=$($QMICTL --nas-get-tx-rx-info=lte | grep 'RX Chain' | wc -l)
		LACTAC=$(echo "$SERVING" | awk -F [:] '/tracking area code:|3GPP cell ID:/{gsub("'\''",""); print $2}')
		LAC_NUM=$(echo $LACTAC | awk '{print $2}')
		CID_NUM=$(echo $LACTAC | awk '{print $1}')
		CID=$(echo $CID_NUM | awk '{printf "%x\n", $1}' |awk '{print toupper($1)}')
		LAC=$(echo $LAC_NUM | awk '{printf "%x\n", $1}' |awk '{print toupper($1)}')
                CSQ_RSSI=$(echo ${STRENGTH} | awk '{print $1}')
                RSRQ=$(echo ${STRENGTH} | awk '{print $2}')
                RSRP=$(echo ${STRENGTH} | awk '{print $3}')
                SINR=$(echo ${STRENGTH} | awk '{printf "%.0f\n", $4}')
		ENBx=$(echo $CID | sed -e 's/..$//')
		ENBID=$(printf %d 0x$ENBx)
		CELL=$(printf %d 0x${CID: -2})
		PCI=$($QMICTL --nas-get-cell-location-info | awk -F [:] '/Serving Cell ID:/{gsub("'\''",""); print $2}')
		LTE_O=$($QMICTL --nas-get-lte-cphy-ca-info)
	        LTE_CA=$(echo "$LTE_O" |grep -i '^secondary cell' | wc -l)
		BWDx=$(echo "$LTE_O" | grep -A4 'Primary Cell Info' | awk -F [:] '/DL Bandwidth:/{gsub("'\''| ", ""); print $2}')
		get_lte_bw
		if [ $LTE_CA -ge 1 ]; then
			BWC=$(echo "$LTE_O" | grep -A4 '^Secondary Cell' | awk -F [:] '/DL Bandwidth:/{gsub("'\''| ", ""); printf "+"$2}')
                        BWCA=$(($BWDx$BWC))
			BANDCH=$(echo "$LTE_O" | grep -A4 '^Primary Cell' | awk -F [:] '/RX Channel:/{gsub("'\''| ", ""); print $2}')
			# Fix qmicli band T77W968 modem
			case $DEVICE in
				*Dell*|*LN960*) CA=$(echo "$LTE_O" | grep -A4 '^Secondary Cell' | awk -F [:-]  '/LTE Band:/{gsub("'\''| ", ""); printf " "$NF-1}') ;;
				*) CA=$(echo "$LTE_O" | grep -A4 '^Secondary Cell' | awk -F [:-]  '/LTE Band:/{gsub("'\''| ", ""); print $NF}') ;;
			esac
			for cc in $CA; do
				SCC=$SCC+$cc
			done
		else
			BANDCH=$(echo "$RFBAND" |  awk -F [:] '/Active Channel:/{gsub("'\''",""); print $2}' | head -1)
			if [ "x" == "x$BWDx" ]; then                                                                                                        
                                BWDx=$(echo "$RFBAND" | awk -F [:] '/Bandwidth:/{gsub("'\''| ",""); print $2}' | tail -1)                                   
                                get_lte_bw                                                                                                                  
                        fi
		fi	
		EARFCN=$BANDCH
        else
		MIMO=$($QMICTL --nas-get-tx-rx-info=umts | grep 'RX Chain' | wc -l)
		case $MIMO in
			0) MIMO=$($QMICTL --nas-get-tx-rx-info=gsm | grep 'RX Chain' | wc -l) ;;
		esac
		LACTAC=$(echo "$SERVING" | awk -F [:] '/3GPP location area code:|3GPP cell ID:/{gsub("'\''",""); print $2}')
		LAC_NUM=$(echo $LACTAC | awk '{print $1}')
                CID_NUM=$(echo $LACTAC | awk '{print $2}')
		LAC=$(echo $LAC_NUM | awk '{printf "%x\n", $1}' |awk '{print toupper($1)}')
		CID=$(echo $CID_NUM | awk '{printf "%x\n", $1}' |awk '{print toupper($1)}')
                CSQ_RSSI=$(echo ${STRENGTH} | awk '{print $1}')
		if [ $(echo  ${STRENGTH} | awk '{print$2}') ]; then
	                SINR=$(echo ${STRENGTH} | awk '{printf "%.0f\n", $2}')
		fi
		BANDCH=$(echo "$RFBAND" |  awk -F [:] '/Active Channel:/{gsub("'\''| ",""); print $2}')
		EARFCN=$(echo $BANDCH | awk '{print $2}')
		
        fi
        CSQ_PER=$(echo $CSQ_RSSI |awk '{printf "%d\n", (100*(1-(-50 - $1)/(-50 - -120)))}')
        [ $CSQ_RSSI -ge -110 ] && CSQ_COL="black"
        [ $CSQ_RSSI -ge -105 ] && CSQ_COL="red"
        [ $CSQ_RSSI -ge -95 ] && CSQ_COL="orange"
        [ $CSQ_RSSI -ge -75 ] && CSQ_COL="green"
        if [ $CSQ_PER -gt 100 ]; then
                CSQ_PER=100
        elif [ $CSQ_PER -lt 0 ]; then
                CSQ_PER=0
        fi
        EARFCN=$BANDCH
	DISTANCE=$($QMICTL --nas-get-cell-location-info | awk '/LTE Timing Advance:/{gsub("\047",""); printf "%.2f\n", (299792458*($4*10^-6)/1000)/2}')
        REG=$(echo "$SERVING" | awk -F [:] '/Registration state:/{print $2}' | sed "s/'//g" | awk '{print $1}')
        case $REG in
                registered)
                        REGST=1
                ;;
		registration-denied)
			REGST=3
		;;
        esac
	DECIMAL=$(uci -q get modeminfo.@general[0].decimail)
	if [ "x${DECIMAL}" != "x" ]; then
                LAC=$(printf %d 0x$LAC_NUM)
                CID=$(printf %d 0x$CID_NUM)
        fi
}


#get_device
function get_data_in(){
        get_hardware_info >/dev/null 2>&1
        get_signal_info >/dev/null 2>&1
}

get_hwinfo(){
	continue
}

