function modem_data(){
	generic_data
	. /usr/share/modeminfo/scripts/ch_to_band
	FW=$(echo "$O" | awk '/\+GTPKGVER/{gsub("\"",""); print $2}' | head -n1)
	ICCID=$(echo "$O" | awk '/CCID:/{print $2}' | head -n1)
	IMSI=$(echo "$O" | awk -F [:,] '/\+CIMI:/{gsub("\"","");print $2}' | grep -Eo '[0-9]{14,16}')
	IMEI=$(echo "$O" | awk -F [:,] '/\+CGSN:/{gsub("\"","");print $2}' | grep -Eo '[0-9]{14,16}')
	MANUF=$(echo "$O" | awk '/\+GMM:/{print prev} {prev=$0}' | awk '{$1=$1;print}')
	if echo "$MANUF" | grep -q "+"; then
		MANUF=$(echo "$O" | awk -F [:,] '/CGMI:/{gsub("\"",""); print substr($2,2)}')
	fi
	MODEL=$(echo "$O" | awk -F'GMM: ' '/\+GMM:/{print $2}' | awk -F, '{gsub(/"/,""); print $1}')
	if [ -n "$MANUF" ] && [ "$MANUF" != "ERROR" ] && [ "$MANUF" != "OK" ]; then
		DEVICE="$MANUF $MODEL"
	else
		DEVICE="$MODEL"
	fi
	PLMN_RAW=$(echo "$O" | awk -F'"' '/^\+COPS:/{print $2}' | grep -E '^[0-9]+$' | tail -1)
	MCC=${PLMN_RAW:0:3}
	MNC=${PLMN_RAW:3}
	PLMN=$(printf "%s%03d" "$MCC" "$MNC")
	if [ $MODE = LTE ]; then
		EARFCN=$(echo "$O" | awk -F [:,] '/\+RSRP:/{print $3}')
		TA=$(echo "$O" | awk -F [:,] '/\+XMCI: 4/{gsub(/"/,""); printf "%.0f\n", $14}' | head -n1)
		DISTANCE=$(echo "$O" | awk -F [:,] '/\+XMCI: 4/{gsub(/"/,""); printf "%.2f\n", ($14*78)/1000}' | head -n1)
		PCI=$(echo "$O" | awk -F [:,] '/\+XMCI: 4/{gsub(/"/,""); printf "%d\n", $7}' | head -n1)
		RSRP=$(echo "$O" | awk -F [:,] '/\+RSRP:/{printf "%.0f\n", $4}')
		RSRQ=$(echo "$O" | awk -F [:,] '/\+RSRQ:/{printf "%.0f\n", $4}')
		REGST=$(echo "$O" | awk -F[,] '/\+CEREG/ {print $2}' | head -n1)
		LAC=$(echo "$O" | awk -F [,] '/\+CEREG/{gsub("\"","");print $3}')
		CID=$(echo "$O" | awk -F [,] '/\+CEREG/{gsub("\"","");print $4}')
		# ! SINR formula needs to be checked !
		SINR=$(echo "$O" | awk -F [:,] '/\+XMCI: 4/{gsub(/"/,""); printf "%.0f\n", $13/4+5}')
		LTE_Cx=$(echo "$O" | awk -F [:,] '/\+XLEC:/{print $3}')
		LTE_CA=$(($LTE_Cx -1))
		BWDL=$(echo "$O" | awk -F [:,] '/\+XLEC:/{gsub("\r","",$4); print $4}')
		ENBx=$(echo $CID | sed -e 's/..$//')
		CELL=$(printf %d 0x${CID: -2})
		ENBID=$(printf %d 0x$ENBx)
		case $BWDL in
			1) NP=15 ;;
			2) NP=25 ;;
			3) NP=50 ;;
			4) NP=75 ;;
			5) NP=100 ;;
			*) NP=0 ;;
		esac

		CSQ=$(echo $RSRP $NP | awk '{printf "%.0f\n", (($1+10*log(12*$2)/log(10))+113)/2}')
		[ "x$CSQ" = "x" ] && CSQ=-1
		if [ $CSQ -ge 0 -a $CSQ -le 31 ]; then
			CSQ_PER=$(($CSQ * 100/31))
			CSQ_COL="red"
			[ $CSQ -ge 10 ] && CSQ_COL="red"
			[ $CSQ -ge 15 ] && CSQ_COL="orange"
			[ $CSQ -ge 20 ] && CSQ_COL="green"
			CSQ_RSSI=$((2 * CSQ - 113))
		# Fibocom RSSI up -51dBm
		elif [ $CSQ -ge 32 -a $CSQ -le 50 ]; then
			CSQ_PER="100"
			CSQ_COL="green"
			CSQ_RSSI=$((2 * CSQ - 113))
		else
			CSQ_PER="0"
			CSQ_COL="black"
		fi        
		case $LTE_CA in
			1) 
				SCx=$(echo "$O" | awk -F [:,] '/\+RSRP:/{print $6}')
				BWCx=$(echo "$O" | awk -F [:,] '/\+XLEC/{gsub("\r",""); print $4" "$5}')
				;;
			2)
				SCx=$(echo "$O" | awk -F [:,] '/\+RSRP:/{print $6" "$9}')
				BWCx=$(echo "$O" | awk -F [:,] '/\+XLEC/{gsub("\r",""); print $4" "$5" "$6}')
				;;
			3)
				SCx=$(echo "$O" | awk -F [:,] '/\+RSRP:/{print $6" "$9" "$12}')
				BWCx=$(echo "$O" | awk -F [:,] '/\+XLEC/{gsub("\r",""); print $4" "$5" "$6" "$7}')
				;;
			4)
				SCx=$(echo "$O" | awk -F [:,] '/\+RSRP:/{print $6" "$9" "$12" "$15}')
				BWCx=$(echo "$O" | awk -F [:,] '/\+XLEC/{gsub("\r",""); print $4" "$5" "$6" "$7" "$8}')
				;;
		esac

		for ca in $BWCx; do
			case $ca in
					1) N=3 ;;
					2) N=5 ;;
					3) N=10 ;;
					4) N=15 ;;
					5) N=20 ;;
					*) N=0 ;;
			esac
			BWCA=$(($BWCA+$N))
		done

		for sca in $SCx; do
			ch_to_band $sca
			SCC=$SCC+$SC
		done

		# Fix 7+7+7 wrong CA
		if [ "$(ch_to_band $EARCFCN)" = "7" -a "$SCC" = "+7+7" ]; then
			SCC="+7"
		fi

		# Generate PCC_STR and SCC_STR
		ch_to_band $EARFCN
		local pcc_b=$SC
		local pcc_mhz=$(get_band_mhz $pcc_b)
		local pcc_bw=$(($NP / 5))
		[ "$pcc_bw" = "3" ] && pcc_bw="3" # 15/5 is 3
		[ "$pcc_bw" = "5" ] && pcc_bw="5" # 25/5 is 5
		local bw_str=""
		[ "$pcc_bw" != "0" ] && bw_str=" @${pcc_bw} MHz"
		PCC_STR="PCC B${pcc_b} (${pcc_mhz} MHz)${bw_str} | ${PCI:-?} ${EARFCN:-?}"

		if [ $LTE_CA -ge 1 ]; then
			local sc_idx=1
			local scc_str=""
			local sc_count=0
			for sca in $SCx; do
				sc_count=$((sc_count + 1))
				ch_to_band $sca
				local sc_b=$SC
				local sc_mhz=$(get_band_mhz $sc_b)
				local bw_code=$(echo "$BWCx" | awk -v idx=$((sc_count + 1)) '{print $idx}')
				local sc_bw=0
				case "$bw_code" in
					1) sc_bw=3 ;;
					2) sc_bw=5 ;;
					3) sc_bw=10 ;;
					4) sc_bw=15 ;;
					5) sc_bw=20 ;;
				esac
				local sc_pci=$(echo "$O" | awk -F [:,] '/\+XMCI: 5/{gsub(/"/,""); print $7 " " $8}' | while read -r pci_h earfcn_h; do
					e=$(printf "%d" "$earfcn_h" 2>/dev/null)
					if [ "$e" = "$sca" ]; then
						printf "%d" "$pci_h"
						break
					fi
				done)
				[ -z "$sc_pci" ] && sc_pci="?"
				local bw_str=""
				[ "$sc_bw" != "0" ] && bw_str=" @${sc_bw} MHz"
				local s_str="SCC${sc_idx} B${sc_b} (${sc_mhz} MHz)${bw_str} | ${sc_pci} ${sca}"
				if [ -z "$scc_str" ]; then
					scc_str="$s_str"
				else
					scc_str="${scc_str}<br>${s_str}"
				fi
				sc_idx=$((sc_idx+1))
			done
			SCC_STR="$scc_str"
		fi
	else
		REGST=$(echo "$O" | awk -F[,] '/\+CREG/ {print $2}')
		LAC=$(echo "$O" | awk -F [,] '/\+CREG/{gsub("\"","");print $3}' | head -n1)
		CID=$(echo "$O" | awk -F [,] '/\+CREG/{gsub("\"","");print $4}' | head -n1)
		EARFCN=$(echo "$O" | awk -F [:,] '/\+RSCP:/{print $3}')
		SINx=$(echo "$O" | awk -F [:,] '/\+XCESQ:/{print $6}')
		if [ $SINx -eq 99 ]; then
			SINR=""
		else
			SINR=$(echo "$O" | awk -F [:,] '/\+XCESQ:/{printf "%.0f\n", ($6-50)/2}' | head -n1)
		fi
	fi
	CHIPTEMP=$(echo "$O" | awk -F[:,] '/\+MTSM:/{print $2}' | head -n1 | sed 's/[[:space:]\r]//g')
}
