modem_data(){
        # hwinfo
	OIFS="$IFS"; IFS="|"
	set -- $(echo "$O" | awk '
		BEGIN{IGNORECASE=1} $0 ~ /DELL|Telit/ {manufacturer=$1; getline model; getline fw}
		/^ICCID:/{iccid=$2; getline imei; getline imsi}
		/^PA:|^xo_therm_buf:/ {sub(/C/, "", $2); split($0,arr,":"); if (arr[2] !="") temp = arr[2]; else temp=$2 }
		END {print manufacturer "|" model "|" fw "|" iccid "|" imei "|" imsi "|" temp }')
	DEVICE="${1} ${2}"; MANUF=${1}; MODEL=${2}; FW=${3}; ICCID=${4}; IMEI=${5}; IMSI=${6}; CHIPTEMP=${7}
	IFS="$OIFS"; unset OIFS
	generic_data
	# get signal info
	OIFS="$IFS"; IFS="|"
	set -- $(echo "$O" | awk -v mode="$MODE" '
		BEGIN {
			lac=""; cid=""; earfcn=""; pci=""; bw=""; bwc=""; rsrp=""; rssi=""; rsrq=""; sinr=""; rscp=""; csq=""; lte_ca=0
			map[3]=1; map[5]=2; map[10]=3; map[15]=4; map[20]=5
		}
		# LTE Carrier Aggregation
		/SCC[0-9]+ info:/ {lte_ca++}
    		# LTE 
		mode == "LTE" {
			if (/\+CEREG/) { gsub(/"/, ""); split($0, arr, ","); lac = arr[3]; cid = arr[5]}
			if (/EARFCN\(DL\/UL\):/ && earfcn == "") {split($0, arr, /[ \/]/); earfcn = arr[3]}
			if (/PCI\)/ && pci == "") {gsub("\)","",$0); gsub("\("," ",$0); pci=$NF}
			if (/^RSRP:/ && rsrp == "") {sub(/dBm/, "", $2); rsrp = sprintf("%.0f", $2)}
			if (/^RSSI:/ && rssi == "") {sub(/dBm/, "", $2); rssi = sprintf("%.0f", $2)}
			if (/^RSRQ:/ && rsrq == "") {sub(/dB/, "", $2); rsrq = sprintf("%.0f", $2)}
			if (/^RS-SINR:/ && sinr == "") {sub(/dB/, "", $2); sinr = sprintf("%.0f", $2)}
			if (/^RS-SNR:/ && sinr == "") {sub(/dB/, "", $2);sinr = sprintf("%.0f", $2)}
			if (/PCC info/ && bwc == "") { bwc = sprintf("%.0f", $8); bw=map[bwc] }
			cell = sprintf("%d", "0x" substr(cid, length(cid) - 1, 2)) 
			enbid = sprintf("%d", "0x" substr(cid, 1, length(cid) - 2))
		}
    
		# Other mode (3G)
		mode != "LTE" {
			if (/\+CREG/) {gsub(/"/, "");split($0, arr, ",");lac = arr[3]; cid = arr[4]}
			if (/Active channel/ && earfcn == "") {split($0, arr, /:/); gsub(/ /, "", arr[2]); earfcn = arr[2]}
			if (/QCSQ/ && csq == "") { split($0, arr, /[:,]/); rscp = arr[2]; sinr = arr[3]; rssi = arr[6] }
		
		}
    
		END {print lac "|" cid "|" earfcn "|" rssi "|" sinr "|" pci "|" bw "|" bwc "|" rsrp "|" rsrq "|" rscp "|" csq "|" lte_ca "|" cell "|" enbid}')
	LAC=${1}; CID=${2}; EARFCN=${3}; CSQ_RSSI=${4}; SINR=${5}; PCI=${6}; BWDL=${7}; BWDx=${8}; RSRP=${9}; RSRQ=${10}; LTE_CA=${13}
	CELL=${14}; ENBID=${15}
	IFS="$OIFS"; unset OIFS
	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 }')
		IFS="$OIFS"; unset BWDx OIFS
		SCC=${1}; BWCA=${2}
	fi

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