#!/bin/sh
# SPDX-License-Identifier: MIT

led_sysfs="/sys/class/leds/wwan"
check_interval_sec=10
check_modem_count=0
recheck_modem_count=2
signal_quality_threshold=40

state_init="initializing..."
state_modem_none="modem none"
state_connected="connected"
state_weak_signal="weak signal"
state_not_connected="not connected"
state_sim_not_found="sim or modem not found or startup..."

current_state="$state_init"

ems31_exists() {
	return 0
}

led_on () {
	echo none > "$led_sysfs"/trigger
	echo 1 > "$led_sysfs"/brightness
}

led_off () {
	echo none > "$led_sysfs"/trigger
	echo 0 > "$led_sysfs"/brightness
}

set_led_pulse() {
	echo timer > "$led_sysfs"/trigger
	echo "$1" > "$led_sysfs"/delay_on
	echo "$1" > "$led_sysfs"/delay_off
}

led_blink_slow() {
	set_led_pulse 1000
}

led_blink_fast() {
	set_led_pulse 500
}

led_blink_very_fast() {
	set_led_pulse 250
}

update_status() {
	if [ "$current_state" != "$1" ]; then
		logger -t wwan-led "$1"
		current_state="$1"
	fi
}

check_wwan_status() {
	mode_num=$(mm-modem-num)
	connection_str=$(mmcli -m "$mode_num" -K 2>/dev/null | awk '$1 == "modem.generic.state" { print $3 }')
	if [ -z "$connection_str" ]; then
		# modem not found or start up
		led_off
		update_status "$state_sim_not_found"
		return
	fi

	case "$connection_str" in
	*connected*)
		led_on
		update_status "$state_connected"
		;;
	*failed*|*locked*|*unknown*|*initializing*)
		led_off
		update_status "$state_sim_not_found"
		;;
	*registered*|*connecting*|*) # disabled, disabling, enabling, enabled, searching, disconnecting
		signal_quality=$(mmcli -m "$mode_num" -K 2>/dev/null | awk '$1 == "modem.generic.signal-quality.value" { print $3 }')
		if [ "$signal_quality" -lt "$signal_quality_threshold" ]; then
			led_blink_fast
			update_status "$state_weak_signal"
		else
			led_blink_slow
			update_status "$state_not_connected"
		fi
		;;
	esac
}

while true; do
	if ! ems31_exists; then
		if [ "$check_modem_count" -lt "$recheck_modem_count" ]; then
			check_modem_count=$(( "$check_modem_count"+1 ))
			sleep 30
			continue
		fi

		check_modem_count=0
		led_blink_very_fast
		update_status "$state_modem_none"
	fi

	check_wwan_status
	sleep "$check_interval_sec"
done
