commit d330271396059d04a7839fdd09f622376ac50fa7 Author: Ben Date: Wed Sep 20 05:18:19 2023 +0000 first commit diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..7667e9d --- /dev/null +++ b/Makefile @@ -0,0 +1,39 @@ +include $(TOPDIR)/rules.mk + +PKG_NAME:=cellled +PKG_VERSION:=0.0.1 +PKG_RELEASE:=1 +PKG_MAINTAINER:=Konstantine Shevlakov + +include $(INCLUDE_DIR)/package.mk + +define Package/$(PKG_NAME) + PKGARCH:=all + TITLE:=LED cellular signal signal strength +endef + +define Package/$(PKG_NAME)/description + Indicate LED cellular signal signal strength. +endef + +define Package/$(PKG_NAME)/conffiles + /etc/config/cellled +endef + + +define Build/Prepare +endef + +define Build/Configure +endef + +define Build/Compile +endef + + +define Package/$(PKG_NAME)/install + $(CP) ./root/* $(1)/ +endef + +$(eval $(call BuildPackage,$(PKG_NAME))) + diff --git a/README.md b/README.md new file mode 100644 index 0000000..e69de29 diff --git a/root/etc/config/cellled b/root/etc/config/cellled new file mode 100644 index 0000000..76d777b --- /dev/null +++ b/root/etc/config/cellled @@ -0,0 +1,25 @@ + +config device + option data_type 'qmi' + option device_qmi '/dev/cdc-wdm0' + option timeout '5' + +config rssi_led + option led 'blue:sys' + option rssi_min '20' + option rssi_max '39' + +config rssi_led + option led 'blue:wlan0' + option rssi_min '40' + option rssi_max '59' + +config rssi_led + option led 'blue:wlan1' + option rssi_min '60' + option rssi_max '79' + +config rssi_led + option led 'blue:net' + option rssi_min '80' + option rssi_max '100' diff --git a/root/etc/init.d/cellled b/root/etc/init.d/cellled new file mode 100644 index 0000000..a5cb120 --- /dev/null +++ b/root/etc/init.d/cellled @@ -0,0 +1,32 @@ +#!/bin/sh /etc/rc.common +# Copyright (c) 2011-2015 OpenWrt.org + +START=99 + +start() { + if [ ! -f "/var/run/cellled.pid" ]; then + /usr/bin/cellled >/dev/null 2>&1 & + PID=$(pgrep -f /usr/bin/cellled) + if [ $PID ]; then + echo $PID > /var/run/cellled.pid + fi + fi + return 0 +} + +stop() { + rm -f /var/run/cellled.pid + kill $(pgrep -f /usr/bin/cellled) >/dev/null 2>&1 + /etc/init.d/led start +} + +restart(){ + stop + sleep 1 + start +} + +boot() { + (sleep 5 && start >/dev/null 2>&1) & + return 0 +} diff --git a/root/usr/bin/cellled b/root/usr/bin/cellled new file mode 100644 index 0000000..7696b20 --- /dev/null +++ b/root/usr/bin/cellled @@ -0,0 +1,4 @@ +#!/bin/sh +while true :; do + /usr/share/cellled.sh >/dev/null 2>&1 +done diff --git a/root/usr/share/cellled.sh b/root/usr/share/cellled.sh new file mode 100644 index 0000000..3164ea0 --- /dev/null +++ b/root/usr/share/cellled.sh @@ -0,0 +1,174 @@ +#!/bin/sh + +# get data +get_data(){ + DATATYPE=$(uci -q get cellled.@device[0].data_type) + case $DATATYPE in + mm) + PORT=$(uci -q get cellled.@device[0].device_mm) + RSSI=$(mmcli -m ${PORT} -J | jsonfilter -e '@["modem"]["generic"]["signal-quality"]["value"]') + ;; + qmi) + PORT=$(uci -q get cellled.@device[0].device_qmi) + QMICTL="qmicli -p -d $PORT" + RSSIDB=$($QMICTL --nas-get-signal-info | awk -F [\'\:\ ] '/RSSI:/{print $4}') + RSSI=$(echo $RSSIDB |awk '{printf "%d\n", (100*(1-(-51 - $1)/(-50 - -113)))}') + ;; + uqmi) + PORT=$(uci -q get cellled.@device[0].device_qmi) + RSSIDB=$(uqmi -d ${PORT} --get-signal-info | jsonfilter -e '@["rssi"]') + RSSI=$(echo $RSSIDB |awk '{printf "%d\n", (100*(1-(-51 - $1)/(-51 - -113)))}') + ;; + serial) + PORT=$(uci -q get cellled.@device[0].device) + RSSI=$(gcom -d ${PORT} -s /etc/gcom/getstrength.gcom | awk -F [:,] '/CSQ:/{printf "%.0f\n", $2*100/31}') + ;; + esac +} + +# get rssi levels +get_led_level(){ + RSSI_MIN=$(uci -q get cellled.@rssi_led[$n].rssi_min) + RSSI_MAX=$(uci -q get cellled.@rssi_led[$n].rssi_max) +} + +# set rgb light +set_led_rgb(){ + if [ $RSSI -ge $RSSI_MIN -a $RSSI -le $RSSI_MAX ]; then + LED_ON=$(echo $RSSI_MIN $RSSI_MAX $RSSI | awk '{printf "%.0f\n", (255/($2-$1)*($3-$1))}') + STATE=true + else + LED_ON=0 + STATE=false + fi +} + +# set linear light +set_led_linear(){ + if [ $RSSI -ge $RSSI_MIN -a $RSSI -lt $RSSI_MAX ]; then + STATE=true + elif [ $RSSI -ge $RSSI_MAX ]; then + STATE=true + elif [ $RSSI -lt $RSSI_MIN ]; then + STATE=false + else + STATE=false + fi +} + +# set linear led level +if_linear(){ + LED=$(uci -q get cellled.@rssi_led[$n].led) + get_led_level + set_led_linear + if [ $STATE = true -a $LED ]; then + LED_ON=255 + echo $LED_ON > /sys/class/leds/$LED/brightness + else + LED_ON=0 + echo $LED_ON > /sys/class/leds/$LED/brightness + fi + +} + +# set grb led level +if_rgb(){ + PWM=$(uci -q get cellled.@device[0].pwm_mode) + LED_R=$(uci -q get cellled.@device[0].red_led) + LED_G=$(uci -q get cellled.@device[0].green_led) + LED_B=$(uci -q get cellled.@device[0].blue_led) + case $TYPE in + poor) + get_led_level + set_led_rgb + if [ $STATE = true ]; then + R=255 + G=0 + if [ "$PWM" = "1" ]; then + B=$((255-$LED_ON)) + else + B=255 + fi + fi + ;; + bad) + get_led_level + set_led_rgb + if [ $STATE = true ]; then + R=255 + if [ "$PWM" = "1" ]; then + G=$LED_ON + else + G=0 + fi + B=0 + fi + ;; + fair) + get_led_level + set_led_rgb + if [ $STATE = true ]; then + if [ "$PWM" = "1" ]; then + R=$((255-$LED_ON)) + else + R=255 + fi + G=255 + B=0 + fi + ;; + good|best|excellend) + get_led_level + set_led_rgb + if [ $STATE = true ]; then + R=0 + G=255 + B=0 + fi + ;; + esac + if [ ! $R ]; then R=0; fi + if [ ! $G ]; then G=0; fi + if [ ! $B ]; then B=0; fi +} + +# select type led (rgb or linear) +select_led(){ + if [ "$RGB_LED" = "1" ]; then + TYPE=$(uci -q get cellled.@rssi_led[$n].type) + if_rgb + else + if_linear + fi +} + +# get param +get_param(){ + RSSI=$RSSI + if [ $RSSI -lt 0 ]; then + RSSI=0 + elif [ $RSSI -gt 100 ]; then + RSSI=100 + fi + LED_ON=0 + RGB_LED=$(uci -q get cellled.@device[0].rgb_led) + SECTIONS=$(uci show cellled | awk -F [\]\[\@=] '/=rssi_led/{print $3}') + TIMEOUT=$(uci -q get cellled.@device[0].timeout) + if [ -z $RSSI ]; then + exit 2 + fi +} + +get_data +get_param +for n in $SECTIONS; do + select_led +done +if [ "$RGB_LED" = "1" -a $LED_R -a $LED_G -a $LED_B ]; then + #echo "${LED_R}=${R} ${LED_G}=${G} ${LED_B}=${B}" + echo $R > /sys/class/leds/$LED_R/brightness + echo $G > /sys/class/leds/$LED_G/brightness + echo $B > /sys/class/leds/$LED_B/brightness +fi + +sleep $TIMEOUT