# Fibocom FM350 parse data
function modem_data(){
	generic_data
	# AT+CSQ not correct RSSI value data use AT+CESQ
	RXLEV=$(echo "$O" | awk -F[,\ ] '/^\+CESQ/ {print $2}')
	if [ "$RXLEV" != "99" ] && [ -n "$RXLEV" ]; then
		CSQ_RSSI=$(( -110 + RXLEV ))
		CSQ_PER=$(echo $CSQ_RSSI | awk '{printf "%d\n", (100*(1 - (-50 - $1)/(-50 - -120)))}')
		[ $CSQ_RSSI -ge -110 ] && CSQ_COL="black"
		[ $CSQ_RSSI -ge -105 ] && CSQ_COL="red"
		[ $CSQ_RSSI -ge -95 ] && CSQ_COL="orange"
		[ $CSQ_RSSI -ge -75 ] && CSQ_COL="green"
		if [ "$CSQ_PER" -gt 100 ]; then
			CSQ_PER=100
		elif [ "$CSQ_PER" -lt 0 ]; then
			CSQ_PER=0
		fi
	fi
	. /usr/share/modeminfo/scripts/ch_to_band
	MANUF=$(echo "$O" | awk -F [:,] '/\+CGMI/{gsub("\"","");print $2}')
	MODEL=$(echo "$O" | awk -F [:,] '/\+CGMM/{gsub("\"","");print $2}')
	DEVICE="$MANUF $MODEL"
	FW=$(echo "$O" | awk '/\+GTPKGVER/{gsub("\"",""); print $2}')
	ICCID=$(echo "$O" | awk -F [:] '/ICCID:/{gsub("\r","");print $2}')
	IMSI=$(echo "$O" | awk -F [:,] '/\+CIMI/{gsub("\"","");print $2}')
	IMEI=$(echo "$O" | awk -F [:,] '/\+CGSN/{gsub("\"","");print $2}')
	NETWORK=$(echo "$O"| grep -A2 '+GTCCINFO:' | awk 'NR ==2{print}')
	EARFCN=$(echo "$NETWORK" | awk -F [,] '{print $7}')
	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
		REGST=$(echo "$O" | awk -F[,] '/\+CEREG/ {print $2}')
		LAC=$(echo "$O" | awk -F[,] '/^\+CEREG/{gsub("\"","");print $3}' | tail -1)
		CID=$(echo "$O" | awk -F[,] '/^\+CEREG/{gsub("\"","");print $4}' | tail -1)
		TA=$(echo "$O" | awk -F',' '/\+ECELL:/{gsub(/"/,""); gsub(/ /,"",$12); print $12}')
		DISTANCE=$(echo "$O" | awk -F',' '/\+ECELL:/ {ta=$12; gsub(/ /,"",ta); printf "%.2f\n", (ta*78.125)/1000}')
		RSRQ=$(echo "$NETWORK" | awk -F [,] '{printf "%.0f\n", -20+($14/2)}')
		RSRP=$(echo "$NETWORK" | awk -F [,] '{printf "%.0f\n", $13-140}')
		SINR=$(echo "$NETWORK" | awk -F [,] '{printf "%.0f\n", ($11/4)+5}')
		ENBx=$(echo $CID | sed -e 's/..$//')
		CELL=$(printf %d 0x${CID: -2})
		ENBID=$(printf %d 0x$ENBx)
		PCI=$(echo "$NETWORK" | awk -F [,] '{print $8}')
		BWDx=$(echo "$NETWORK" | awk -F [,] '{print $10}')
		case $BWDx in
			15)  BWDL=1 NP=3 ;;
			25)  BWDL=2 NP=5 ;;
			50)  BWDL=3 NP=10 ;;
			75)  BWDL=4 NP=15 ;;
			100) BWDL=5 NP=20 ;;
			*)   NP=0  ;;
		esac
		BWCA=$NP
		LTE_CA=$(echo "$O" | awk '/SCC/{print $0}' | wc -l)
		if [ $LTE_CA -ge 1 ]; then
			SCx=$(echo "$O" | awk -F [:,] '/SCC/{print $6}')
			for sca in $SCx; do
				ch_to_band $sca
				SCC=$SCC+$SC
			done
			BWCx=$(echo "$O" | awk -F [:,] '/SCC/{printf "%.0f\n", $7}')
			for ca in $BWCx; do
				case $ca in
					15)  N=3 ;;
					25)  N=5 ;;
					50)  N=10 ;;
					75)  N=15 ;;
					100) N=20 ;;
					*)   N=0 ;;
				esac
				BWCA=$(($BWCA+$N))
			done
			
			local sc_idx=1
			local scc_str=""
			local sc_count=0
			local PCIx=$(echo "$O" | awk -F [:,] '/SCC/{print $5}')
			local STATEx=$(echo "$O" | awk -F [:,] '/SCC/{print $3}')
			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" | sed -n "${sc_count}p")
				local sc_pci=$(echo "$PCIx" | sed -n "${sc_count}p")
				[ -z "$sc_pci" ] && sc_pci="?"
				local sc_bw=0
				case "$bw_code" in
					15)  sc_bw=3 ;;
					25)  sc_bw=5 ;;
					50)  sc_bw=10 ;;
					75)  sc_bw=15 ;;
					100) sc_bw=20 ;;
				esac
				local bw_str=""
				[ "$sc_bw" != "0" ] && bw_str=" @${sc_bw} MHz"
				local sc_state=$(echo "$STATEx" | sed -n "${sc_count}p")
				local state_str=""
				[ "$sc_state" = "0" ] && state_str=" (deactivated)"
				local s_str="SCC${sc_idx} B${sc_b} (${sc_mhz} MHz)${bw_str} | ${sc_pci} ${sca}${state_str}"
				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

		# Generate PCC_STR
		ch_to_band $EARFCN
		local pcc_b=$SC
		local pcc_mhz=$(get_band_mhz $pcc_b)
		local pcc_bw=0
		case $BWDx in
			15)  pcc_bw=3 ;;
			25)  pcc_bw=5 ;;
			50)  pcc_bw=10 ;;
			75)  pcc_bw=15 ;;
			100) pcc_bw=20 ;;
		esac
		local bw_str=""
		[ "$pcc_bw" != "0" ] && bw_str=" @${pcc_bw} MHz"
		PCC_STR="PCC B${pcc_b} (${pcc_mhz} MHz)${bw_str} | ${PCI:-?} ${EARFCN:-?}"		
	else
		if [ "$MODE" = "UMTS" ] || [ "$MODE" = "HSPA" ] || [ "$MODE" = "HSPA+" ]; then
			RSCP_RAW=$(echo "$O" | awk -F[,\ ] '/^\+CESQ/ {print $4}')
			ECNO_RAW=$(echo "$O" | awk -F[,\ ] '/^\+CESQ/ {print $5}')

			if [ "$RSCP_RAW" != "99" ] && [ "$RSCP_RAW" != "255" ] && [ -n "$RSCP_RAW" ]; then
				RSCP=$(( RSCP_RAW - 120 ))
				CSQ_RSSI="$RSCP"
				CSQ_PER=$(( (120 + CSQ_RSSI) * 100 / 70 ))
				CSQ_COL="black"
				[ "$CSQ_RSSI" -ge -105 ] && CSQ_COL="red"
				[ "$CSQ_RSSI" -ge -95 ] && CSQ_COL="orange"
				[ "$CSQ_RSSI" -ge -75 ] && CSQ_COL="green"
			fi

			if [ "$ECNO_RAW" != "99" ] && [ "$ECNO_RAW" != "255" ] && [ -n "$ECNO_RAW" ]; then
				ECIO_10=$(( ECNO_RAW * 5 - 240 ))
				if [ "$ECIO_10" -lt 0 ]; then
					abs_ecio=${ECIO_10#-}
					ECIO="-$(($abs_ecio / 10)).$(($abs_ecio % 10))"
				else
					ECIO="$(($ECIO_10 / 10)).$(($ECIO_10 % 10))"
				fi
				SINR="$ECIO"
				ECIO_PER=$(( (ECIO_10 + 200) * 10 / 16 ))
				if [ "$ECIO_PER" -gt 100 ]; then ECIO_PER=100; elif [ "$ECIO_PER" -lt 0 ]; then ECIO_PER=0; fi
				if [ -n "$CSQ_PER" ]; then
					CSQ_PER=$(( (CSQ_PER + ECIO_PER) / 2 ))
				else
					CSQ_PER="$ECIO_PER"
				fi
				if [ "$ECIO_10" -le -150 ]; then
					CSQ_COL="red"
				elif [ "$ECIO_10" -le -100 ] && [ "$CSQ_COL" = "green" ]; then
					CSQ_COL="orange"
				fi
			fi

			if [ -n "$CSQ_PER" ]; then
				if [ "$CSQ_PER" -gt 100 ]; then
					CSQ_PER=100
				elif [ "$CSQ_PER" -lt 0 ]; then
					CSQ_PER=0
				fi
			fi
		fi
	fi
	CHIPTEMP=$(echo "$O" | awk -F [,] '/^\+GTSENRDTEMP:/{printf "%.0f", $2/1000}')
}
