|
| 1 | +#!/bin/sh |
| 2 | + |
| 3 | +# envs |
| 4 | +# led names |
| 5 | +# LED_4G_POOR="red:4g" |
| 6 | +# LED_4G_GOOD="blue:4g" |
| 7 | +# LED_5G_POOR="red:5g" |
| 8 | +# LED_5G_GOOD="blue:5g" |
| 9 | +# LED_INTERNET_BLUE="blue:internet" |
| 10 | +# LED_INTERNET_RED="red:internet" |
| 11 | +# modem_cfg |
| 12 | +# MODEM_CFG / AT_PORT / NET_DEV / USE_UBUS_DAEMON |
| 13 | + |
| 14 | +. /usr/share/qmodem/modem_util.sh |
| 15 | +. /lib/functions.sh |
| 16 | +LED_4G_POOR="red:4g" |
| 17 | +LED_4G_GOOD="blue:4g" |
| 18 | +LED_5G_POOR="red:5g" |
| 19 | +LED_5G_GOOD="blue:5g" |
| 20 | +LED_INTERNET_BLUE="blue:internet" |
| 21 | +LED_INTERNET_RED="red:internet" |
| 22 | +MODEM_CFG=$1 |
| 23 | +ON_OFF=$2 |
| 24 | + |
| 25 | +update_cfg(){ |
| 26 | + config_load qmodem |
| 27 | + config_get AT_PORT "$MODEM_CFG" at_port |
| 28 | + config_get ALIAS "$MODEM_CFG" alias |
| 29 | + config_get USE_UBUS "$MODEM_CFG" use_ubus |
| 30 | + [ "$USE_UBUS" = "1" ] && use_ubus_flag="-u" |
| 31 | + config_load network |
| 32 | + # if alias is set, network config name is alias else modem_cfg name |
| 33 | + if [ -n "$ALIAS" ]; then |
| 34 | + config_get NET_DEV "$ALIAS" ifname |
| 35 | + else |
| 36 | + config_get NET_DEV "$MODEM_CFG" ifname |
| 37 | + fi |
| 38 | +} |
| 39 | + |
| 40 | +last_siminserted="" |
| 41 | +last_netstat="" |
| 42 | + |
| 43 | +led_turn() { |
| 44 | + local path="/sys/class/leds/$1" |
| 45 | + local brightness="$2" |
| 46 | + |
| 47 | + echo "$brightness" > "$path/brightness" |
| 48 | +} |
| 49 | + |
| 50 | +led_heartbeat() { |
| 51 | + local path="/sys/class/leds/$1" |
| 52 | + |
| 53 | + echo "1" > "$path/brightness" |
| 54 | + echo "heartbeat" > "$path/trigger" |
| 55 | +} |
| 56 | + |
| 57 | +led_netdev() { |
| 58 | + local path="/sys/class/leds/$1" |
| 59 | + local device="$2" |
| 60 | + |
| 61 | + echo "1" > "$path/brightness" |
| 62 | + echo "netdev" > "$path/trigger" |
| 63 | + echo "$device" > "$path/device_name" |
| 64 | + echo "1" > "$path/link" |
| 65 | + echo "1" > "$path/rx" |
| 66 | + echo "1" > "$path/tx" |
| 67 | +} |
| 68 | + |
| 69 | +led_off_all() { |
| 70 | + led_turn "${LED_4G_POOR}" "0" |
| 71 | + led_turn "${LED_4G_GOOD}" "0" |
| 72 | + led_turn "${LED_5G_POOR}" "0" |
| 73 | + led_turn "${LED_5G_GOOD}" "0" |
| 74 | +} |
| 75 | + |
| 76 | +nr_bw() { |
| 77 | + local bw="$1" |
| 78 | + case "$bw" in |
| 79 | + "0"|"1"|"2"|"3"|"4"|"5") |
| 80 | + echo "$(((bw + 1) * 5))" ;; |
| 81 | + "6"|"7"|"8"|"9"|"10"|"11"|"12") |
| 82 | + echo "$(((bw - 2) * 10))" ;; |
| 83 | + "13") |
| 84 | + echo "200" ;; |
| 85 | + "14") |
| 86 | + echo "400" ;; |
| 87 | + "15"|"25"|"75"|"100") |
| 88 | + echo "$(( bw / 5 ))" ;; |
| 89 | + esac |
| 90 | +} |
| 91 | + |
| 92 | +sim_inserted() { |
| 93 | + |
| 94 | + if at $AT_PORT "AT+CPIN?" | grep -q "CPIN: READY"; then |
| 95 | + echo "1" |
| 96 | + else |
| 97 | + echo "0" |
| 98 | + fi |
| 99 | +} |
| 100 | + |
| 101 | +internet_led() { |
| 102 | + if wget-ssl --spider --quiet --tries=1 --timeout=3 www.baidu.com; then |
| 103 | + led_turn "${LED_INTERNET_BLUE}" "1" |
| 104 | + led_turn "${LED_INTERNET_RED}" "0" |
| 105 | + else |
| 106 | + led_turn "${LED_INTERNET_BLUE}" "0" |
| 107 | + led_turn "${LED_INTERNET_RED}" "1" |
| 108 | + fi |
| 109 | +} |
| 110 | + |
| 111 | +sim_netstat() { |
| 112 | + local mode |
| 113 | + local bw csq rscp rssi |
| 114 | + |
| 115 | + local srvinfo="$(at $AT_PORT 'AT+QENG="servingcell"')" |
| 116 | + if echo "$srvinfo" | grep -q "NR5G"; then |
| 117 | + mode="5g" |
| 118 | + else |
| 119 | + mode="4g" |
| 120 | + fi |
| 121 | + |
| 122 | + csq="$(tom_modem -d /dev/mhi_DUN -c "AT+CSQ" | grep -Eo '\+CSQ: [0-9]{2}' | awk '{print $2}')" |
| 123 | + rssi="$(( 2 * csq - 113 ))" |
| 124 | + if [ "$csq" = "99" ]; then |
| 125 | + bw="$(nr_bw "$(echo "$srvinfo" | awk -F ',' '/^\+QENG/ {print $12}')")" |
| 126 | + rscp="$(echo "$srvinfo" | awk -F ',' '/^\+QENG/ {print $13}')" |
| 127 | + rssi="$(rsrp2rssi "$rscp" "$bw")" |
| 128 | + fi |
| 129 | + |
| 130 | + # 0: no service, 1: weak, 2: good |
| 131 | + if [ "$rssi" = "-113" ] || [ "$rssi" = "85" ]; then |
| 132 | + echo "$mode,0" |
| 133 | + elif [ "$rssi" -le "-70" ]; then |
| 134 | + echo "$mode,1" |
| 135 | + else |
| 136 | + echo "$mode,2" |
| 137 | + fi |
| 138 | +} |
| 139 | + |
| 140 | +main() { |
| 141 | + local siminserted="$(sim_inserted "/dev/mhi_DUN")" |
| 142 | + if [ "$siminserted" = "0" ] && [ "$siminserted" = "$last_siminserted" ]; then |
| 143 | + # there's no update, return |
| 144 | + return |
| 145 | + fi |
| 146 | + |
| 147 | + last_siminserted="$siminserted" |
| 148 | + |
| 149 | + if [ "$siminserted" = "0" ]; then |
| 150 | + led_off_all |
| 151 | + led_heartbeat ${LED_4G_POOR} |
| 152 | + led_heartbeat ${LED_5G_POOR} |
| 153 | + |
| 154 | + last_netstat="" |
| 155 | + return |
| 156 | + fi |
| 157 | + |
| 158 | + local netstat="$(sim_netstat)" |
| 159 | + |
| 160 | + if [ "$netstat" = "$last_netstat" ]; then |
| 161 | + # there's no update, return |
| 162 | + return |
| 163 | + fi |
| 164 | + local mode="${netstat%,*}" |
| 165 | + local signal="${netstat#*,}" |
| 166 | + |
| 167 | + case "$signal" in |
| 168 | + "0") |
| 169 | + led_off_all |
| 170 | + case "$mode" in |
| 171 | + "4g") |
| 172 | + led_heartbeat "${LED_4G_POOR}" |
| 173 | + ;; |
| 174 | + "5g") |
| 175 | + led_heartbeat "${LED_5G_POOR}" |
| 176 | + ;; |
| 177 | + esac |
| 178 | + ;; |
| 179 | + "1") |
| 180 | + led_off_all |
| 181 | + case "$mode" in |
| 182 | + "4g") |
| 183 | + led_turn "${LED_4G_POOR}" "1" |
| 184 | + led_netdev "${LED_4G_GOOD}" "$NET_DEV" |
| 185 | + ;; |
| 186 | + "5g") |
| 187 | + led_turn "${LED_5G_POOR}" "1" |
| 188 | + led_netdev "${LED_5G_GOOD}" "$NET_DEV" |
| 189 | + ;; |
| 190 | + esac |
| 191 | + ;; |
| 192 | + "2") |
| 193 | + led_off_all |
| 194 | + case "$mode" in |
| 195 | + "4g") |
| 196 | + led_turn "${LED_4G_GOOD}" "1" |
| 197 | + led_netdev "${LED_4G_GOOD}" "$NET_DEV" |
| 198 | + ;; |
| 199 | + "5g") |
| 200 | + led_turn "${LED_5G_GOOD}" "1" |
| 201 | + led_netdev "${LED_5G_GOOD}" "$NET_DEV" |
| 202 | + ;; |
| 203 | + esac |
| 204 | + ;; |
| 205 | + esac |
| 206 | +} |
| 207 | + |
| 208 | +# Loop forever |
| 209 | +update_cfg |
| 210 | +if [ "$ON_OFF" = "off" ]; then |
| 211 | + led_off_all |
| 212 | + exit 0 |
| 213 | +fi |
| 214 | +while true; do |
| 215 | + main |
| 216 | + internet_led |
| 217 | + sleep 5s |
| 218 | +done |
0 commit comments