# Qualcomm Modems (FoxConn T77W678, Telit LN940, HP LT4220)
function modem_data(){
        generic_data
	# hwinfo and siminfo
	FAMILY_EX="Telit"
	OIFS="$IFS"; IFS="|"
	set -- $(echo "$O" | awk -v fam="$FAMILY_EX" '
		($0 ~ fam){manuf =$0; getline model; getline fw}
		/ICCID:/{split($0,i,":");gsub("\r",""); iccid=i[2]; getline imsi; getline imei}
		/TSENS2/{split($0,i,",");temp=i[2]}	
		END{print manuf "|" model "|" fw "|" iccid "|" imsi "|" imei "|" temp}
	')
	MANUF=${1}; MODEL=${2}; FW=${3}; ICCID=${4}; IMSI=${5} IMEI=${6}; CHIPTEMP=${7}
	IFS="$OIFS"; unset OIFS
        DEVICE="$MANUF $MODEL"
	OIFS="$IFS"; IFS="|"
	# signal
	set -- $(echo "$O" | awk -v mode="$MODE" '
		BEGIN { map[1]=3; map[2]=5; map[3]=10; map[4]=15; map[5]=20 }
		mode ~ /LTE/ { # LTE mode
			if (/\+CEREG/){gsub("\"",""); split($0,i,","); reg=i[2]; lac=i[3]; cid=i[4]}
			if (/CAINFO:/){ split($0,i,","); earfcn=i[2]; rssi=sprintf("%.0f",i[6]); rsrp=sprintf("%.0f",i[5]);
				sinr=sprintf("%.0f",i[8]/5-20); rsrq=sprintf("%.0f",i[7]); pci=i[4]; bw=sprintf("%.0f",i[3]);
				lte_ca=i[15]; bwc=map[bw]
			}
			if (/PCC info/){bwc=sprintf("%.0f",$(NF-1)); bw=map[bwc]}
			cell = sprintf("%d", "0x" substr(cid, length(cid) - 1, 2))
			enbid = sprintf("%d", "0x" substr(cid, 1, length(cid) - 2))
		}
		mode !~ /LTE/ { # 3G mode
			if (/\+CREG/){gsub("\"",""); split($0,i,","); reg=i[2]; lac=i[3]; cid=i[4]}
			if (/RFSTS:/){ split($0,i,","); earfcn=i[2]; rssi=sprintf("%.0f",i[6]); sinr=sprintf("%.0f",i[4])}
		}
		END { print reg "|" earfcn "|" lac "|" cid "|" rssi "|" sinr "|" rsrp "|" rsrq "|" pci "|" bw "|" bwc "|" lte_ca "|" enbid "|" cell}
	')
	EARFCN=${2}; LAC=${3}; CID=${4}; CSQ_RSSI=${5}; SINR=${6}; RSRP=${7}; RSRQ=${8}; PCI=${9}; BWDL=${10}; BWDx=${11}; LTE_CA=${12}; ENBID=${13}; CELL=${14}
	IFS="$OIFS"; unset OIFS
	# LTE CA calc
	if [ $LTE_CA -ne 0 ]; then
		OIFS="$IFS"; IFS="|"
		set -- $(echo "$O" | awk -F"," -v bwc=${BWDx:=0}  -v mode=$MODE '
			BEGIN { map[1]=3; map[2]=5; map[3]=10; map[4]=15; map[5]=20 }
				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
				}
			/CAINFO:/{
				ch[1]=14; ch[2]=25; ch[3]=36; ch[4]=47
				bw[1]=15; bw[2]=26; bw[3]=37; bw[4]=48
				scc = ""; bwcx = 0
					for(i=1;i<=4;i++) {
						if($ch[i]!=0) {
						scc=scc"+"earfcn_to_band($ch[i])
						bwcx=map[$bw[i]]
						bwca+=bwcx
					}
				}
				bwca=bwca+bwc
				print scc"|"bwca
			}
		')
		SCC=${1}; BWCA=${2}
		IFS="$OIFS"; unset OIFS BWDx
        fi

	if [ $(uci -q get modeminfo.@general[0].decimail) = "1" ]; then
		LAC=$(printf %d 0x$LAC)
		CID=$(printf %d 0x$CID)
	fi
}
