# Qualcomm Modems (FoxConn T77W678, Telit LN940, HP LT4220)
function modem_data(){
        generic_data
	# hwinfo and siminfo
	OIFS="$IFS"; IFS="|"
	set -- $(echo "$O" | awk -v fam="$FAMILY" '
		($0 ~ fam){manuf =$0; getline model; getline fw}
		/ICCID:/{split($0,i,":");gsub("\r",""); iccid=i[2]; getline imsi; getline imei}
		/tsens_tz_sensor0:/{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[3]=1; map[5]=2; map[10]=3; map[15]=4; map[20]=5 }
		mode ~ /LTE/ { # LTE mode
			if (/\+CEREG/){gsub("\"",""); split($0,i,","); reg=i[2]; lac=i[3]; cid=i[5]}
			if (/RFSTS:/){ getline; split($0,i,","); earfcn=i[2]; rssi=sprintf("%.0f",i[4]); rsrp=sprintf("%.0f",i[3])
				sinr=sprintf("%.0f",i[16]/4+5); rsrq=sprintf("%.0f",i[5]); pci=i[11]
			}
			if (/SCC/){lte_ca++}
			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:/){ getline; 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 -ge 1 ]; then
		OIFS="$IFS"; IFS="|"
		set -- $(echo "$O" | awk -v bwc=${BWDx:-0} '
			/^SCC\d info:/ {for(i=1; i<=NF; i++) { if($i ~ /LTE_B/) { gsub(/[^0-9]/, "", $i); scc = scc "+" $i}}
				bwca_raw += sprintf("%.0f", $8); bwca=bwca_raw+bwc }
			END { 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
}
