# Fibocom modems NL668/NL678/NL952/FM150/FM190

function modem_data(){
	generic_data
	OIFS="$IFS"; IFS="|" # Get hw and sim info
	# FIX regstate
	REGST=$(echo "$O" | awk -F',' '/(\+CREG|\+CGREG|\+CEREG)/ {if (NF >= 5 && $NF ~ /^[0-9]$|^1[0-3]$/) {print $2; exit}}')
	set -- $(echo "$O" | awk -F'[:,]' '
		/\+CGMI/ {gsub("\"",""); manuf=$2}
		/\+CGMM/ {gsub("\"",""); model=$2}
		/\+CGMR/ {gsub("\"",""); fw=$2}
		/\+CIMI/ {gsub("\"",""); imsi=$2}
		/\+CGSN/ {gsub("\"",""); imei=$2}
		/ICCID:/ {gsub("\r",""); iccid=$2}
		/\+MTSM/ {temp = sprintf("%0.f\n", $2)}
		END { print manuf "|" model "|" fw "|" imsi "|" imei "|" iccid "|" temp }')
	DEVICE="${1} ${2}"; MANUF="${1}"; MODEL="${2}"; FW="${3}"; IMSI="${4}"; IMEI="${5}"; ICCID="${6}" CHIPTEMP=${7}
	IFS="$OIFS"; unset OIFS
	OIFS="$IFS"; IFS="|" # Get Signal info
	set -- $(echo "$O" | awk -v model=$MODEL -v mode=$MODE '
		BEGIN { map[15]=1; map[25]=2; map[50]=3; map[75]=4; map[100]=5 }
		mode ~ /LTE/ { # LTE mode
			if (/^\PCC:/ && model~/952|FM/) {split($0, ca, ","); pch = ca[3]; pcica = ca[2] }
                        if (/^\SCC\d/ && model~/952|FM/) {lte_ca++}
			if (/^\+GTCAINFO: 1/) { lte_ca++; split($0, ca, ","); pch = ca[5]; pcica = ca[4] }
			if (/\+GTCCINFO:/) { getline; getline; split($0, f, ",")
				lac = (model~/952|FM/) ? sprintf("%d","0x"f[5]) : f[5]
				cid = (model~/952|FM/) ? sprintf("%d","0x"f[6]) : f[6]
				earfcn = (model~/952|FM/) ? sprintf("%d","0x"f[7]) : f[7]
				pci = (model~/952|FM/) ? sprintf("%d","0x"f[8]) : f[8]
				rsrq = sprintf("%.0f", -20 + (f[14]/2)); rsrp = sprintf("%.0f", f[13] - 140)
				sinr = sprintf("%.0f", f[11]/4 + 5); bwc = f[10]; bw=map[bwc]}
		}
		mode !~ /LTE/ { # 3G mode
			if (/CNTI/) { split($0, f, ",")
				tech = f[2] }
			if (/\+GTCCINFO:/) { getline; getline; split($0, f, ",")
				lac = (model~/952|FM/) ? sprintf("%d","0x"f[5]) : f[5]
				cid = (model~/952|FM/) ? sprintf("%d","0x"f[6]) : f[6]
				earfcn = (model~/952|FM/) ? sprintf("%d","0x"f[7]) : f[7]
				sinr = (model~/952|FM/) ? sprintf("%.0f", -24+(f[12]*24/255)) : sprintf("%.0f", -24+(f[14]*24/255))}
		}

		END { print  earfcn "|" lac "|" cid "|" tech "|" rsrq "|" rsrp "|" sinr "|" pci "|" bwc "|" bw "|" lte_ca "|" pcica "|" pch }
		
	')
	# Define variables
	EARFCN=${1}; LAC=${2}; CID=${3}; SINR=${7}
	IFS="$OIFS"; unset OIFS

	if [ "$MODE" = "LTE" ]; then
		RSRQ=${5}; RSRP=${6}; PCI=${8}; BWDx=${9}; BWDL=${10}; PCICA=${12}; PCH=${13}; LTE_CA=${11}
		ENBx=$(echo $CID | sed -e 's/..$//')
		CELL=$(printf %d 0x${CID: -2})
		ENBID=$(printf %d 0x$ENBx)

		if [ "$EARFCN" = "$PCH" ] && [ "$PCI" = "$PCICA" ]; then
			OIFS="$IFS"; IFS="|" # Get LTE-A bandwith and CA bands
			set -- $(echo "$O" | awk -F'[,]' -v model="$MODEL" -v mode="$MODE" -v bwp="${BWDx:-0}" '
				BEGIN { scc = ""; sum = 0; bwp_num = (bwp == 15 ? 1.3 : bwp/5) }
				function earfcn_to_band(channel) {
					if (channel <= 1) return ""
						cmd = "/usr/share/modeminfo/scripts/ch_to_band " mode " " channel
						cmd | getline band
						close(cmd)
						return band
					}
				{
				if (model ~ /FM|952/ && /^SCC[0-9]+:/) {
					chan_field = 5; bw_field = 6
				} else if (/\+GTCAINFO: 2/) {
					chan_field = 4; bw_field = NF
				} else {
					next
				}
			        if ($chan_field > 1) {
					band = earfcn_to_band($chan_field)
					if (band != "") scc = scc "+" band
					sum += $bw_field/5; bwca = sum + bwp_num
				}
				} END { print scc "|" bwca }
			')
			SCC=${1}; BWCA=${2}
			IFS="$OIFS"; unset OIFS
		fi
	else
		TECH=${4}
		[ "x$TECH" != "x" ] && MODE="$TECH"
	fi
	if [ $(uci -q get modeminfo.@general[0].decimail) = "1" ]; then
		LAC=$(printf %d 0x$LAC); CID=$(printf %d 0x$CID)
	fi
}
