Difference between revisions of "Code/thinkpad-smapi.sh"

From ThinkWiki
Jump to: navigation, search
m (-c option in shebang is unnecessary.)
(Put script in pre block.)
Line 1: Line 1:
 +
<pre>
 
#!/bin/bash
 
#!/bin/bash
 
# Copyright (C) 2007 William Poetra Yoga Hadisoeseno <williampoetra@gmail.com>
 
# Copyright (C) 2007 William Poetra Yoga Hadisoeseno <williampoetra@gmail.com>
Line 325: Line 326:
 
   fi
 
   fi
 
fi
 
fi
 +
</pre>

Revision as of 09:53, 11 April 2025

#!/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