--- a/addon/usb/8087095a
+++ b/addon/usb/8087095a
@@ -1,4 +1,7 @@
-# Fibocom L860
+# Fibocom L860 - v3 (naprawiony + RSSI/RSRP/RSRQ/SINR dla wszystkich pasm)
+# Zweryfikowano na żywych danych: PCC (+XMCI: 4) poprawny, SCC (+XMCI: 5)
+# poprawny dla band/RSSI/RSRP/RSRQ; SNR/SINR dla SCC niedostępne w tym
+# firmware (modem zwraca stałe 255); PCI dla SCC wyłączony jako niewiarygodny.
 
 bandwidth() {
 	case $1 in
@@ -12,370 +15,316 @@
 	esac
 }
 
-channeltoband()
-{
-	if [ $1 -ge 0 ] && [ $1 -le 599 ]; then
+# Liczba PRB dla danej szerokości pasma - potrzebna do liczenia RSSI z RSRP
+prb_count() {
+	case "$1" in
+		"1.4") echo 6;; "3") echo 15;; "5") echo 25;;
+		"10") echo 50;; "15") echo 75;; "20") echo 100;;
+		*) echo "";;
+	esac
+}
+
+channeltoband() {
+	# walidacja wejścia - bez tego puste/nieliczbowe $1 wywala [ -ge ]
+	case "$1" in
+		''|*[!0-9]*) echo "?"; return;;
+	esac
+	if [ "$1" -ge 0 ] && [ "$1" -le 599 ]; then
 		echo "1"
-	elif [ $1 -ge 1200 ] && [ $1 -le 1949 ]; then
+	elif [ "$1" -ge 1200 ] && [ "$1" -le 1949 ]; then
 		echo "3"
-	elif [ $1 -ge 2750 ] && [ $1 -le 3449 ]; then
+	elif [ "$1" -ge 2750 ] && [ "$1" -le 3449 ]; then
 		echo "7"
-	elif [ $1 -ge 3450 ] && [ $1 -le 3799 ]; then
+	elif [ "$1" -ge 3450 ] && [ "$1" -le 3799 ]; then
 		echo "8"
-	elif [ $1 -ge 6150 ] && [ $1 -le 6449 ]; then
+	elif [ "$1" -ge 6150 ] && [ "$1" -le 6449 ]; then
 		echo "20"
 	else
 		echo "?"
 	fi
 }
 
+# Bezpieczna konwersja do dziesiętnej - chroni przed:
+# - interpretacją jako ósemkową przy wiodącym zerze (np. "08")
+# - błędem printf przy pustym/niepoprawnym wejściu
+to_dec() {
+	case "$1" in
+		''|*[!0-9A-Fa-fxX]*) return 1;;
+	esac
+	printf "%d" "$1" 2>/dev/null
+}
 
-O=$(sms_tool -d $DEVICE at "AT+MTSM=1")
+# Dodaje wpis pasma dodatkowego (S1-S4) i aktualizuje zmienną globalną MODE.
+# $1=surowa wartość z +XLEC, $2=indeks addon dla "band", $3=szerokość pasma (BWSx),
+# $4=etykieta np. "(S1)". Zwraca (echo) nazwę pasma albo pusty string.
+compute_secondary_band() {
+	VAL="$1"
+	case "$VAL" in
+		''|0) echo ""; return;;
+	esac
+	B=$(band4g "$VAL")
+	if [ -z "$3" ]; then
+		addon "$2" "$4 band" "$B"
+	else
+		addon "$2" "$4 band" "$B @${3} MHz"
+	fi
+	echo "$B"
+}
+
+# Wspólna logika RSSI/RSRP/RSRQ/SINR - dla PCC i każdego SCC.
+# $1=linia danych (+XMCI: 4 albo +XMCI: 5), $2=szerokość pasma,
+# $3..$6=indeksy addon (RSSI RSRP RSRQ SINR), $7=prefiks etykiety np. "(S1) "
+# Ustawia globalne LAST_RSSI, jeśli policzone (do dalszego użytku, np. CSQ_PER).
+#
+# UWAGA: dla SCC (+XMCI: 5) modem zwraca w polu SNR (13) stałą wartość 255
+# ("brak danych") - to ograniczenie firmware, nie błąd skryptu. SINR dla
+# pasm dodatkowych realnie nigdy się nie pojawi, dopóki modem tego nie zacznie
+# raportować. Dla PCC (+XMCI: 4) dane są poprawne.
+report_signal() {
+	_LINE="$1"; _BW="$2"
+	_I_RSSI="$3"; _I_RSRP="$4"; _I_RSRQ="$5"; _I_SINR="$6"
+	_LBL="$7"
+	LAST_RSSI=""
+
+	T=$(echo "$_LINE" | awk -F[,:] '{print $11}' | xargs)
+	T=$(to_dec "$T")
+	if [ -n "$T" ] && [ "$T" != "255" ]; then
+		addon "$_I_RSRP" "${_LBL}RSRP" "$((-141 + T)) dBm"
+		N=$(prb_count "$_BW")
+		if [ -n "$N" ]; then
+			RSSI=$(echo "$((-141 + T)) $N" | awk '{printf "%d\n", $1 + 10*log(12*$2)/log(10)}')
+			if [ -n "$RSSI" ]; then
+				[ "$RSSI" -lt -113 ] && RSSI=-113
+				[ "$RSSI" -gt -51 ]  && RSSI=-51
+				addon "$_I_RSSI" "${_LBL}RSSI" "$RSSI dBm"
+				LAST_RSSI="$RSSI"
+			fi
+		fi
+	fi
 
+	T=$(echo "$_LINE" | awk -F[,:] '{print $12}' | xargs)
+	T=$(to_dec "$T")
+	[ -n "$T" ] && [ "$T" != "255" ] && addon "$_I_RSRQ" "${_LBL}RSRQ" "$((-20 + T/2)) dB"
+
+	T=$(echo "$_LINE" | awk -F[,:] '{print $13}' | xargs)
+	T=$(to_dec "$T")
+	if [ -n "$T" ] && [ "$T" != "255" ]; then
+		VAL=$(echo "$T" | awk '{printf "%.1f", $1/4+5}')
+		addon "$_I_SINR" "${_LBL}SINR" "${VAL} dB"
+	fi
+}
+
+O=$(sms_tool -d "$DEVICE" at "AT+MTSM=1")
 T=$(echo "$O" | awk -F: '/^\+MTSM:/ {print $2}' | xargs)
 [ -n "$T" ] && addon 10 "Temperature" "$T &deg;C"
 
 if [ "$REGOK" = "1" ]; then
-
-O=$(sms_tool -d $DEVICE at "AT+XLEC?;+XMCI=1;+XCCINFO=1;+XCCINFO?")
-
-if [ "x$MODE_NUM" = "x7" ]; then
+O=$(sms_tool -d "$DEVICE" at "AT+XLEC?;+XMCI=1;+XCCINFO=1;+XCCINFO?")
+if [ -n "$O" ] && [ "x$MODE_NUM" = "x7" ]; then
 	T=$(echo "$O" | awk -F[,:] '/^\+XCCINFO:/{print $11}' | xargs)
 	if [ -n "$T" ]; then
-		T_DEC=$(printf "%d" "0x$T")
-		addon 23 "TAC" "${T_DEC} ($T)"
+		T_DEC=$(printf "%d" "0x$T" 2>/dev/null)
+		[ -n "$T_DEC" ] && addon 23 "TAC" "${T_DEC} ($T)"
 	fi
 
-	PB=""
-	S1B=""
-	S2B=""
-	S3B=""
-	S4B=""
-	BWP=""
-	BWS1=""
-	BWS2=""
-	BWS3=""
-	BWS4=""
+	PB=""; S1B=""; S2B=""; S3B=""; S4B=""
+	BWP=""; BWS1=""; BWS2=""; BWS3=""; BWS4=""
+
+	CELLS=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $3}' | xargs)
+	case "$CELLS" in
+		''|*[!0-9]*) CELLS=0;;
+	esac
 
-	CELLS=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $3}')
-	[ -z "$CELLS" ] && CELLS=0
 	case $CELLS in
 		"1")
-			T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $4}')
-			BWP=$(bandwidth "$T")
-			T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $5}')
+			T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $4}' | xargs); BWP=$(bandwidth "$T")
+			T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $5}' | xargs)
 			if [ -n "$T" ] && [ "x$T" != "x0" ]; then
-				PB=$(band4g ${T/BAND_LTE_/})
-				if [ -z "$BWP" ]; then
-					addon 30 "Primary band" "$PB"
-				else
-					addon 30 "Primary band" "$PB @${BWP} MHz"
-				fi
+				PB=$(band4g "${T#BAND_LTE_}")
+				[ -z "$BWP" ] && addon 30 "Primary band" "$PB" || addon 30 "Primary band" "$PB @${BWP} MHz"
 				MODE="$MODE $PB"
 			fi
 			;;
 		"2")
-			T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $4}')
-			BWP=$(bandwidth "$T")
-			T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $5}')
-			BWS1=$(bandwidth "$T")
-			T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $6}')
+			T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $4}' | xargs); BWP=$(bandwidth "$T")
+			T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $5}' | xargs); BWS1=$(bandwidth "$T")
+			T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $6}' | xargs)
 			if [ -n "$T" ] && [ "x$T" != "x0" ]; then
-				PB=$(band4g ${T/BAND_LTE_/})
-				if [ -z "$BWP" ]; then
-					addon 30 "Primary band" "$(band4g ${T/BAND_LTE_/})"
-				else
-					addon 30 "Primary band" "$(band4g ${T/BAND_LTE_/}) @${BWP} MHz"
-				fi
+				PB=$(band4g "${T#BAND_LTE_}")
+				[ -z "$BWP" ] && addon 30 "Primary band" "$PB" || addon 30 "Primary band" "$PB @${BWP} MHz"
 				MODE="$MODE $PB"
 			fi
-			T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $7}')
-			if [ -n "$T" ] && [ "x$T" != "x0" ]; then
-				S1B=$(band4g $T)
-				if [ -z "$BWS1" ]; then
-					addon 50 "(S1) band" "$S1B"
-				else
-					addon 50 "(S1) band" "$S1B @${BWS1} MHz"
-				fi
-				MODE="${MODE/LTE/LTE-A} / $S1B"
-			fi
+			T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $7}' | xargs)
+			S1B=$(compute_secondary_band "$T" 50 "$BWS1" "(S1)")
+			[ -n "$S1B" ] && MODE="${MODE/LTE/LTE-A} / $S1B"
 			;;
 		"3")
-			T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $4}')
-			BWP=$(bandwidth "$T")
-			T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $5}')
-			BWS1=$(bandwidth "$T")
-			T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $6}')
-			BWS2=$(bandwidth "$T")
-			T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $7}')
+			T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $4}' | xargs); BWP=$(bandwidth "$T")
+			T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $5}' | xargs); BWS1=$(bandwidth "$T")
+			T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $6}' | xargs); BWS2=$(bandwidth "$T")
+			T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $7}' | xargs)
 			if [ -n "$T" ] && [ "x$T" != "x0" ]; then
-				PB=$(band4g ${T/BAND_LTE_/})
-				if [ -z "$BWP" ]; then
-					addon 30 "Primary band" "$(band4g ${T/BAND_LTE_/})"
-				else
-					addon 30 "Primary band" "$(band4g ${T/BAND_LTE_/}) @${BWP} MHz"
-				fi
+				PB=$(band4g "${T#BAND_LTE_}")
+				[ -z "$BWP" ] && addon 30 "Primary band" "$PB" || addon 30 "Primary band" "$PB @${BWP} MHz"
 				MODE="$MODE $PB"
 			fi
-			T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $8}')
-			if [ -n "$T" ] && [ "x$T" != "x0" ]; then
-				S1B=$(band4g $T)
-				if [ -z "$BWS1" ]; then
-					addon 50 "(S1) band" "$S1B"
-				else
-					addon 50 "(S1) band" "$S1B @${BWS1} MHz"
-				fi
-				MODE="${MODE/LTE/LTE-A} / $S1B"
-			fi
-			T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $9}')
-			if [ -n "$T" ] && [ "x$T" != "x0" ]; then
-				S2B=$(band4g $T)
-				if [ -z "$BWS2" ]; then
-					addon 60 "(S2) band" "$S2B"
-				else
-					addon 60 "(S2) band" "$S2B @${BWS2} MHz"
-				fi
-				MODE="$MODE / $S2B"
-			fi
+			T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $8}' | xargs)
+			S1B=$(compute_secondary_band "$T" 50 "$BWS1" "(S1)")
+			[ -n "$S1B" ] && MODE="${MODE/LTE/LTE-A} / $S1B"
+			T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $9}' | xargs)
+			S2B=$(compute_secondary_band "$T" 60 "$BWS2" "(S2)")
+			[ -n "$S2B" ] && MODE="$MODE / $S2B"
 			;;
 		"4")
-			T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $4}')
-			BWP=$(bandwidth "$T")
-			T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $5}')
-			BWS1=$(bandwidth "$T")
-			T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $6}')
-			BWS2=$(bandwidth "$T")
-			T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $7}')
-			BWS3=$(bandwidth "$T")
-			T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $8}')
+			T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $4}' | xargs); BWP=$(bandwidth "$T")
+			T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $5}' | xargs); BWS1=$(bandwidth "$T")
+			T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $6}' | xargs); BWS2=$(bandwidth "$T")
+			T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $7}' | xargs); BWS3=$(bandwidth "$T")
+			T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $8}' | xargs)
 			if [ -n "$T" ] && [ "x$T" != "x0" ]; then
-				PB=$(band4g ${T/BAND_LTE_/})
-				if [ -z "$BWP" ]; then
-					addon 30 "Primary band" "$PB"
-				else
-					addon 30 "Primary band" "$PB @${BWP} MHz"
-				fi
+				PB=$(band4g "${T#BAND_LTE_}")
+				[ -z "$BWP" ] && addon 30 "Primary band" "$PB" || addon 30 "Primary band" "$PB @${BWP} MHz"
 				MODE="$MODE $PB"
 			fi
-			T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $9}')
-			if [ -n "$T" ] && [ "x$T" != "x0" ]; then
-				S1B=$(band4g $T)
-				if [ -z "$BWS1" ]; then
-					addon 50 "(S1) band" "$S1B"
-				else
-					addon 50 "(S1) band" "$S1B @${BWS1} MHz"
-				fi
-				MODE="${MODE/LTE/LTE-A} / $S1B"
-			fi
-			T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $10}')
-			if [ -n "$T" ] && [ "x$T" != "x0" ]; then
-				S2B=$(band4g $T)
-				if [ -z "$BWS2" ]; then
-					addon 60 "(S2) band" "$S2B"
-				else
-					addon 60 "(S2) band" "$S2B @${BWS2} MHz"
-				fi
-				MODE="$MODE / $S2B"
-			fi
-			T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $11}')
-			if [ -n "$T" ] && [ "x$T" != "x0" ]; then
-				S3B=$(band4g $T)
-				if [ -z "$BWS3" ]; then
-					addon 70 "(S3) band" "$S3B"
-				else
-					addon 70 "(S3) band" "$S3B @${BWS3} MHz"
-				fi
-				MODE="$MODE / $S3B"
-			fi
+			T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $9}' | xargs)
+			S1B=$(compute_secondary_band "$T" 50 "$BWS1" "(S1)")
+			[ -n "$S1B" ] && MODE="${MODE/LTE/LTE-A} / $S1B"
+			T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $10}' | xargs)
+			S2B=$(compute_secondary_band "$T" 60 "$BWS2" "(S2)")
+			[ -n "$S2B" ] && MODE="$MODE / $S2B"
+			T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $11}' | xargs)
+			S3B=$(compute_secondary_band "$T" 70 "$BWS3" "(S3)")
+			[ -n "$S3B" ] && MODE="$MODE / $S3B"
 			;;
 		"5")
-			T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $4}')
-			BWP=$(bandwidth "$T")
-			T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $5}')
-			BWS1=$(bandwidth "$T")
-			T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $6}')
-			BWS2=$(bandwidth "$T")
-			T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $7}')
-			BWS3=$(bandwidth "$T")
-			T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $8}')
-			BWS4=$(bandwidth "$T")
-			T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $9}')
+			T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $4}' | xargs); BWP=$(bandwidth "$T")
+			T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $5}' | xargs); BWS1=$(bandwidth "$T")
+			T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $6}' | xargs); BWS2=$(bandwidth "$T")
+			T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $7}' | xargs); BWS3=$(bandwidth "$T")
+			T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $8}' | xargs); BWS4=$(bandwidth "$T")
+			T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $9}' | xargs)
 			if [ -n "$T" ] && [ "x$T" != "x0" ]; then
-				PB=$(band4g ${T/BAND_LTE_/})
-				if [ -z "$BWP" ]; then
-					addon 30 "Primary band" "$PB"
-				else
-					addon 30 "Primary band" "$PB @${BWP} MHz"
-				fi
+				PB=$(band4g "${T#BAND_LTE_}")
+				[ -z "$BWP" ] && addon 30 "Primary band" "$PB" || addon 30 "Primary band" "$PB @${BWP} MHz"
 				MODE="$MODE $PB"
 			fi
-			T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $10}')
-			if [ -n "$T" ] && [ "x$T" != "x0" ]; then
-				S1B=$(band4g $T)
-				if [ -z "$BWS1" ]; then
-					addon 50 "(S1) band" "$S1B"
-				else
-					addon 50 "(S1) band" "$S1B @${BWS1} MHz"
-				fi
-				MODE="${MODE/LTE/LTE-A} / $S1B"
-			fi
-			T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $11}')
-			if [ -n "$T" ] && [ "x$T" != "x0" ]; then
-				S2B=$(band4g $T)
-				if [ -z "$BWS2" ]; then
-					addon 60 "(S2) band" "S2B"
-				else
-					addon 60 "(S2) band" "S2B @${BWS2} MHz"
-				fi
-				MODE="$MODE / $S2B"
-			fi
-			T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $12}')
-			if [ -n "$T" ] && [ "x$T" != "x0" ]; then
-				S3B=$(band4g $T)
-				if [ -z "$BWS3" ]; then
-					addon 70 "(S3) band" "$S3B"
-				else
-					addon 70 "(S3) band" "$S3B @${BWS3} MHz"
-				fi
-				MODE="$MODE / $S3B"
-			fi
-			T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $13}')
-			if [ -n "$T" ] && [ "x$T" != "x0" ]; then
-				S4B=$(band4g $T)
-				if [ -z "$BWS4" ]; then
-					addon 80 "(S4) band" "$S4B"
-				else
-					addon 80 "(S4) band" "$S4B @${BWS4} MHz"
-				fi
-				MODE="$MODE / $S4B"
-			fi
+			T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $10}' | xargs)
+			S1B=$(compute_secondary_band "$T" 50 "$BWS1" "(S1)")
+			[ -n "$S1B" ] && MODE="${MODE/LTE/LTE-A} / $S1B"
+			T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $11}' | xargs)
+			S2B=$(compute_secondary_band "$T" 60 "$BWS2" "(S2)")
+			[ -n "$S2B" ] && MODE="$MODE / $S2B"
+			T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $12}' | xargs)
+			S3B=$(compute_secondary_band "$T" 70 "$BWS3" "(S3)")
+			[ -n "$S3B" ] && MODE="$MODE / $S3B"
+			T=$(echo "$O" | awk -F[,:] '/^\+XLEC:/{print $13}' | xargs)
+			S4B=$(compute_secondary_band "$T" 80 "$BWS4" "(S4)")
+			[ -n "$S4B" ] && MODE="$MODE / $S4B"
 			;;
 	esac
 
-	T=$(echo "$O" | awk -F[,:] '/^\+XMCI: 4/{print $7}' | xargs)
+	# ---- PCC (+XMCI: 4) ----
+	PCC_LINE=$(echo "$O" | grep "^+XMCI: 4")
+	T=$(echo "$PCC_LINE" | awk -F[,:] '{print $7}' | xargs)
+	T=$(to_dec "$T")
 	if [ -n "$T" ]; then
-		addon 33 "PCI" "$(printf "%d" "$T")"
-		T=$(echo "$O" | awk -F[,:] '/^\+XMCI: 4/{print $8}' | xargs)
-		if [ "$T" != "0xFFFFFFFF" ]; then
-			addon 34 "EARFCN DL" "$(printf "%d" "$T")"
-			if [ -z "$PB" ]; then
-				T1=$(channeltoband $(printf "%d" "$T"))
-				PB=$(band4g $T1)
-				if [ -z "$BWP" ]; then
-					addon 30 "Primary band" "$PB"
-				else
-					addon 30 "Primary band" "$PB @${BWP} MHz"
-				fi
-				MODE="$MODE $PB"
-			fi
+		addon 33 "PCI" "$T"
+
+		# Cell ID (pole 6) -> eNB ID / Sector ID (standardowy podział LTE
+		# ECI: 20 bitów eNB ID + 8 bitów Sector ID, stąd /256 i %256).
+		# Zweryfikowane na żywych danych: 0x03893216 = 59322902 =
+		# eNB 231730 / Sector 22 - zgodne z niezależnym skryptem xmm75xx-info.
+		T=$(echo "$PCC_LINE" | awk -F[,:] '{print $6}' | xargs)
+		CID=$(to_dec "$T")
+		if [ -n "$CID" ]; then
+			addon 24 "eNB ID" "$((CID / 256))"
+			addon 25 "Sector ID" "$((CID % 256))"
+		fi
+
+		# Timing Advance (pole 14) -> przybliżony dystans od stacji bazowej.
+		# Krok TA w LTE = 78m. Wzór i wynik zweryfikowany 1:1 ze skryptem
+		# xmm75xx-info (TA=20 -> 1.56 km, dokładnie zgodne).
+		T=$(echo "$PCC_LINE" | awk -F[,:] '{print $14}' | xargs)
+		TD=$(to_dec "$T")
+		if [ -n "$TD" ]; then
+			DIST=$(awk -v ta="$TD" 'BEGIN{printf "%.2f", (ta*78)/1000}')
+			addon 26 "Distance" "~${DIST} km"
 		fi
-		T=$(echo "$O" | awk -F[,:] '/^\+XMCI: 4/{print $9}' | xargs)
-		[ "$T" != "0xFFFFFFFF" ] && addon 34 "EARFCN UL" "$(printf "%d" "$T")"
-		T=$(echo "$O" | awk -F[,:] '/^\+XMCI: 4/{print $11}')
-		if [ "$T" != "255" ]; then
-			addon 36 "RSRP" "$((-141 + T)) dBm"
-			N=""
-			case $BWP in
-				"1.4") N=6;;
-				"3") N=15;;
-				"5") N=25;;
-				"10") N=50;;
-				"15") N=75;;
-				"20") N=100;;
-			esac
-			if [ -n "$N" ]; then
-				RSSI=$(echo "$((-141 + T)) $N" | awk '{printf "%d\n", $1 + 10*log(12*$2)/log(10)}')
-				if [ -n "$RSSI" ]; then
-					[ $RSSI -lt -113 ] && RSSI="-113"
-					[ $RSSI -gt -51 ] && RSSI="-51"
-					addon 35 "RSSI" "$RSSI dBm"
-					CSQ_PER=$(((RSSI + 113) * 100 / 62))
+
+		T=$(echo "$PCC_LINE" | awk -F[,:] '{print $8}' | xargs)
+		if [ -n "$T" ] && [ "$T" != "0xFFFFFFFF" ]; then
+			TD=$(to_dec "$T")
+			if [ -n "$TD" ]; then
+				addon 34 "EARFCN DL" "$TD"
+				if [ -z "$PB" ]; then
+					PB=$(band4g "$(channeltoband "$TD")")
+					[ -z "$BWP" ] && addon 30 "Primary band" "$PB" || addon 30 "Primary band" "$PB @${BWP} MHz"
+					MODE="$MODE $PB"
 				fi
 			fi
 		fi
-		T=$(echo "$O" | awk -F[,:] '/^\+XMCI: 4/{print $12}')
-		[ "$T" != "255" ] && addon 37 "RSRQ" "$((-20 + T/2)) dB"
-#		T=$(echo "$O" | awk -F[,:] '/^\+XMCI: 4/{print $13}')
-#		[ "$T" != "255" ] && addon 38 "SNR" "$T dB"
+
+		T=$(echo "$PCC_LINE" | awk -F[,:] '{print $9}' | xargs)
+		if [ -n "$T" ] && [ "$T" != "0xFFFFFFFF" ]; then
+			TD=$(to_dec "$T")
+			[ -n "$TD" ] && addon 32 "EARFCN UL" "$TD"
+		fi
+
+		report_signal "$PCC_LINE" "$BWP" 35 36 37 39 ""
+		[ -n "$LAST_RSSI" ] && CSQ_PER=$(( (LAST_RSSI + 113) * 100 / 62 ))
 	fi
 
-IFS="
+	# ---- SCC (+XMCI: 5) ----
+	OLDIFS="$IFS"
+	IFS="
 "
-
 	IDX=1
 	POS=50
-	LINES=$(echo "$O" | grep "+XMCI: 5")
+	LINES=$(echo "$O" | grep "^+XMCI: 5")
 	for LINE in $LINES; do
-		T=$(echo "$LINE" | awk -F[,:] '/^\+XMCI: 5/{print $7}' | xargs)
-		if [ -n "$T" ]; then
-			addon $((POS + 3)) "(S${IDX}) PCI" "$(printf "%d" "$T")"
-			T=$(echo "$LINE" | awk -F[,:] '/^\+XMCI: 5/{print $8}' | xargs)
-			if [ "$T" != "0xFFFFFFFF" ]; then
-				addon $((POS + 4)) "(S${IDX}) EARFCN DL" "$(printf "%d" "$T")"
+		T=$(echo "$LINE" | awk -F[,:] '{print $7}' | xargs)
+		T=$(to_dec "$T")
+		[ -z "$T" ] && continue
+		# UWAGA: w testach zaobserwowano, że to pole bywa identyczne dla
+		# wszystkich SCC i tożsame z PCI PCC (możliwe pole referencyjne
+		# w niektórych firmware). Przywrócone na życzenie - zweryfikuj na
+		# swoich danych, czy wartości faktycznie się różnią między SCC.
+		addon $((POS + 3)) "(S${IDX}) PCI" "$T"
+
+		T=$(echo "$LINE" | awk -F[,:] '{print $8}' | xargs)
+		CBW=""
+		case $IDX in
+			1) CBW=$BWS1;;
+			2) CBW=$BWS2;;
+			3) CBW=$BWS3;;
+			4) CBW=$BWS4;;
+		esac
+		if [ -n "$T" ] && [ "$T" != "0xFFFFFFFF" ]; then
+			TD=$(to_dec "$T")
+			if [ -n "$TD" ]; then
+				addon $((POS + 4)) "(S${IDX}) EARFCN DL" "$TD"
 				case $IDX in
-					1)
-						if [ -z "$S1B" ]; then
-							T1=$(channeltoband $(printf "%d" "$T"))
-							S1B=$(band4g $T1)
-							if [ -z "$BWS1" ]; then
-								addon $POS "(S1) band" "$S1B"
-							else
-								addon $POS "(S1) band" "$S1B @${BWS1} MHz"
-							fi
-							MODE="${MODE/LTE/LTE-A} / $S1B"
-						fi
-						;;
-					2)
-						if [ -z "$S2B" ]; then
-							T1=$(channeltoband $(printf "%d" "$T"))
-							S2B=$(band4g $T1)
-							if [ -z "$BWS2" ]; then
-								addon $POS "(S2) band" "$S2B"
-							else
-								addon $POS "(S2) band" "$S2B @${BWS2} MHz"
-							fi
-							MODE="$MODE / $S2B"
-						fi
-						;;
-					3)
-						if [ -z "$S3B" ]; then
-							T1=$(channeltoband $(printf "%d" "$T"))
-							S3B=$(band4g $T1)
-							if [ -z "$BWS3" ]; then
-								addon $POS "(S3) band" "$S3B"
-							else
-								addon $POS "(S3) band" "$S3B @${BWS3} MHz"
-							fi
-							MODE="$MODE / $S3B"
-						fi
-						;;
-					4)
-						if [ -z "$S4B" ]; then
-							T1=$(channeltoband $(printf "%d" "$T"))
-							S4B=$(band4g $T1)
-							if [ -z "$BWS4" ]; then
-								addon $POS "(S4) band" "$S4B"
-							else
-								addon $POS "(S4) band" "$S4B @${BWS4} MHz"
-							fi
-							MODE="$MODE / $S4B"
-						fi
-						;;
+					1) if [ -z "$S1B" ]; then S1B=$(band4g "$(channeltoband "$TD")"); [ -z "$CBW" ] && addon $POS "(S1) band" "$S1B" || addon $POS "(S1) band" "$S1B @${CBW} MHz"; MODE="${MODE/LTE/LTE-A} / $S1B"; fi ;;
+					2) if [ -z "$S2B" ]; then S2B=$(band4g "$(channeltoband "$TD")"); [ -z "$CBW" ] && addon $POS "(S2) band" "$S2B" || addon $POS "(S2) band" "$S2B @${CBW} MHz"; MODE="$MODE / $S2B"; fi ;;
+					3) if [ -z "$S3B" ]; then S3B=$(band4g "$(channeltoband "$TD")"); [ -z "$CBW" ] && addon $POS "(S3) band" "$S3B" || addon $POS "(S3) band" "$S3B @${CBW} MHz"; MODE="$MODE / $S3B"; fi ;;
+					4) if [ -z "$S4B" ]; then S4B=$(band4g "$(channeltoband "$TD")"); [ -z "$CBW" ] && addon $POS "(S4) band" "$S4B" || addon $POS "(S4) band" "$S4B @${CBW} MHz"; MODE="$MODE / $S4B"; fi ;;
 				esac
 			fi
-			T=$(echo "$LINE" | awk -F[,:] '/^\+XMCI: 5/{print $9}' | xargs)
-			[ "$T" != "0xFFFFFFFF" ] && addon $((POS + 4)) "(S${IDX}) EARFCN UL" "$(printf "%d" "$T")"
-			T=$(echo "$LINE" | awk -F[,:] '/^\+XMCI: 5/{print $11}')
-			[ "$T" != "255" ] && addon $((POS + 6)) "(S${IDX}) RSRP" "$((-141 + T)) dBm"
-			T=$(echo "$LINE" | awk -F[,:] '/^\+XMCI: 5/{print $12}')
-			[ "$T" != "255" ] && addon $((POS + 7)) "(S${IDX}) RSRQ" "$((-20 + T/2)) dB"
-#			T=$(echo "$LINE" | awk -F[,:] '/^\+XMCI: 4/{print $13}')
-#			[ "$T" != "255" ] && addon $((POS + 8)) "(S${IDX}) SNR" "$T dB"
-			IDX=$((IDX + 1))
-			[ $IDX -ge $CELLS ] && break
-			POS=$((POS + 10))
 		fi
+
+		T=$(echo "$LINE" | awk -F[,:] '{print $9}' | xargs)
+		if [ -n "$T" ] && [ "$T" != "0xFFFFFFFF" ]; then
+			TD=$(to_dec "$T")
+			[ -n "$TD" ] && addon $((POS + 2)) "(S${IDX}) EARFCN UL" "$TD"
+		fi
+
+		report_signal "$LINE" "$CBW" $((POS+5)) $((POS+6)) $((POS+7)) $((POS+9)) "(S${IDX}) "
+
+		IDX=$((IDX + 1))
+		[ $IDX -gt 4 ] && break
+		[ "$IDX" -ge "$CELLS" ] && break
+		POS=$((POS + 10))
 	done
+	IFS="$OLDIFS"
 fi
-
 fi
