Code/thinkpad-smapi.sh
- !/bin/bash
- Copyright (C) 2007 William Poetra Yoga Hadisoeseno <williampoetra@gmail.com>
- This file is licensed under the GPL v2. E-mail me if you have any ideas of
- other licenses to use (BSD, GPL v3, Public Domain, etc.), I'm open :)
- IDEAS
- - make an ncurses interface, and also maybe gtk+ and qt
- - add option to enable modifying the charge control variables
TP_SMAPI_BASE=/sys/devices/platform/smapi
- function to simplify reading from files
- syntax: read_file <variable> <filename> <check_return_value 0/1> <translate 0/1> [[value] [translation_string]]
read_file() {
local VARIABLE local FILENAME local CHECK_RETURN local TRANSLATE local VAL local RET
VARIABLE="$1"; shift FILENAME="$1"; shift CHECK_RETURN="$1"; shift TRANSLATE="$1"; shift
VAL=`cat "$FILENAME" 2> /dev/null` RET=$?
if "$CHECK_RETURN" == "1" && $RET -gt 0 then RESULT="[unavailable]" elif [ "$TRANSLATE" == "1" ] then RESULT="unknown ($RET)" while [ -n "$1" ] do if [ "$VAL" == "$1" ] then RESULT="$2" break fi shift 2 done else RESULT="$VAL" fi
eval "$VARIABLE="'"'"$RESULT"'"'
- eval "$VARIABLE=$RESULT"
}
give_units() {
local VARIABLE local UNIT local VALUE local RESULT
VARIABLE="$1" UNIT="$2" eval "VALUE=\$$VARIABLE"
if (echo "$VALUE" | grep -qs "^-\?[0-9]") then RESULT="$VALUE $UNIT" else RESULT="$VALUE" fi
eval "$VARIABLE="'"'"$RESULT"'"'
}
replace_val() {
local VARIABLE local OLD_VALUE local NEW_VALUE local VALUE local RESULT
VARIABLE="$1" OLD_VALUE="$2" NEW_VALUE="$3"
eval "VALUE=\$$VARIABLE"
if [ "$VALUE" == "$OLD_VALUE" ] then RESULT="$NEW_VALUE" else RESULT="$VALUE" fi
eval "$VARIABLE="'"'"$RESULT"'"'
}
show_help() {
cat << EOF
thinkpad-smapi.sh - Show SMAPI information on ThinkPad laptops, through the exported SMAPI information by the tp_smapi module.
-a Show all available information -b [n] Show all available information for battery [n] -h Show this help text -m Show miscellaneous information
EOF }
show_misc() {
cd $TP_SMAPI_BASE
read_file PCI_POWER_SAVINGS "enable_pci_power_saving_on_boot" 1 1 1 "enabled" 0 "disabled" read_file AC_ADAPTER "ac_connected" 1 1 1 "connected" 0 "disconnected"
cat << EOF
MISCELLANEOUS INFORMATION
=============
PCI power savings on boot: $PCI_POWER_SAVINGS AC adapter status: $AC_ADAPTER
EOF }
show_batt() {
SLOT=$1 cd $TP_SMAPI_BASE/BAT$SLOT
TMP=`cat installed` if [ $TMP -eq 1 ] then BATT_INSTALLED="yes" else BATT_INSTALLED="no" fi
BATT_STATE=`cat state`
if [ $BATT_INSTALLED == "yes" ] then
read_file BARCODING "barcoding" 1 0 read_file BATT_CHEMISTRY "chemistry" 1 0 read_file DESIGN_CAPACITY "design_capacity" 1 0 read_file DESIGN_VOLTAGE "design_voltage" 1 0 read_file MANUFACTURE_DATE "manufacture_date" 1 0 read_file BATT_FRU "model" 1 0 read_file MANUFACTURER "manufacturer" 1 0 read_file BATT_SERIAL "serial" 1 0
read_file FIRST_USE_DATE "first_use_date" 1 0 read_file CYCLE_COUNT "cycle_count" 1 0 read_file LAST_FULL_CAPACITY "last_full_capacity" 1 0 read_file CURRENT_1MIN "current_avg" 1 0 read_file POWER_1MIN "power_avg" 1 0
read_file CAPACITY_MWH "remaining_capacity" 1 0 read_file CAPACITY_PERCENT "remaining_percent" 1 0 read_file REMAINING_RUNNING_TIME "remaining_running_time" 1 0 read_file CURRENT_NOW "current_now" 1 0 read_file POWER_NOW "power_now" 1 0 read_file BATT_TEMPERATURE "temperature" 1 0 read_file BATT_VOLTAGE "voltage" 1 0 read_file REMAINING_CHARGING_TIME "remaining_charging_time" 1 0
# fixups give_units DESIGN_CAPACITY "mWh" give_units DESIGN_VOLTAGE "mV" give_units CURRENT_NOW "mA" give_units POWER_NOW "mW" give_units CURRENT_1MIN "mA" give_units POWER_1MIN "mW" give_units LAST_FULL_CAPACITY "mWh" give_units REMAINING_RUNNING_TIME "min" give_units REMAINING_CHARGING_TIME "min" give_units CAPACITY_PERCENT "%" give_units BATT_TEMPERATURE "mC" give_units BATT_VOLTAGE "mV"
# some more replace_val REMAINING_RUNNING_TIME "not_discharging" "[not discharging]" replace_val REMAINING_CHARGING_TIME "not_charging" "[not charging]"
else
BATT_FRU= MANUFACTURER= BATT_SERIAL= BARCODING= BATT_CHEMISTRY= DESIGN_CAPACITY= DESIGN_VOLTAGE= MANUFACTURE_DATE=
FIRST_USE_DATE= CYCLE_COUNT= LAST_FULL_CAPACITY= CURRENT_1MIN= POWER_1MIN=
CAPACITY_MWH= CAPACITY_PERCENT= REMAINING_RUNNING_TIME= CURRENT_NOW= POWER_NOW= BATT_TEMPERATURE= BATT_VOLTAGE= REMAINING_CHARGING_TIME=
fi
read_file START_CHARGE_THRESH "start_charge_thresh" 1 0 read_file STOP_CHARGE_THRESH "stop_charge_thresh" 1 0 read_file INHIBIT_CHARGE_MIN "inhibit_charge_minutes" 1 0 read_file BATT_FORCE_DISCHARGE "force_discharge" 1 1 1 "yes" 0 "no"
- installed*, state*, dump
- barcoding, chemistry, design_capacity, design_voltage, manufacture_date, model, manufacturer, serial
- first_use_date, cycle_count, last_full_capacity, current_avg, power_avg
- remaining_capacity, remaining_percent, remaining_running_time, current_now, power_now, temperature, voltage, remaining_charging_time
- start_charge_thresh*, stop_charge_thresh*, inhibit_charge_minutes*, force_discharge*
cat << EOF
BATTERY $SLOT INFORMATION
=========
Battery slot:
Battery present: $BATT_INSTALLED Battery state: $BATT_STATE
EOF
if [ "$BATT_INSTALLED" == "yes" ] then cat << EOF
Embedded info:
FRU P/N: $BATT_FRU Barcoding: $BARCODING Serial number: $BATT_SERIAL OEM Manufacturer: $MANUFACTURER Chemistry: $BATT_CHEMISTRY Manufacture date: $MANUFACTURE_DATE Design capacity & voltage: $DESIGN_CAPACITY, $DESIGN_VOLTAGE
Battery health:
First use date: $FIRST_USE_DATE Cycle count: $CYCLE_COUNT Last full capacity: $LAST_FULL_CAPACITY Average current / power (past 1 minute): $CURRENT_1MIN, $POWER_1MIN
Battery status:
Remaining capacity: $CAPACITY_MWH mWh ($CAPACITY_PERCENT) Remaining running time: $REMAINING_RUNNING_TIME Running current & power: $CURRENT_NOW, $POWER_NOW Temperature: $BATT_TEMPERATURE Voltage: $BATT_VOLTAGE Remaining charging time: $REMAINING_CHARGING_TIME
EOF
fi
cat << EOF
Battery charging control:
Start charging at: $START_CHARGE_THRESH % Stop charging at: $STOP_CHARGE_THRESH % Prevent charging for: $INHIBIT_CHARGE_MIN min Force battery discharge: $BATT_FORCE_DISCHARGE
EOF }
SHOW_ALL= SHOW_BATT= SHOW_MISC= GOT_OPTS=
while getopts ab:hm OPT do
GOT_OPTS=y case ${OPT} in a) SHOW_ALL=y;; b) if [ ${OPTARG} -eq 0 -o ${OPTARG} -eq 1 ] then SHOW_BATT=${OPTARG} else SHOW_BATT=y fi ;; h) show_help exit 0 ;; m) SHOW_MISC=y;; \?) show_help exit 1 ;; esac
done
if [ "$GOT_OPTS" != y ] then
show_help exit 1
fi
if [ "$SHOW_ALL" == y ] then
show_misc show_batt 0 show_batt 1
else
if [ -n "$SHOW_MISC" ] then show_misc fi if [ -n "$SHOW_BATT" ] then show_batt $SHOW_BATT fi
fi