xbattbar-check-sysfs

Descripción del contenido de la página

Programa en Forth para proporcionar a xbattbar los datos de la batería a partir de sysfs.

Etiquetas:

Tras lograr hacer funcionar Debian en la Pandora estuve varios meses sin poder usar el programa xbattbar, que muestra en pantalla una línea de color para representar el porcentaje de carga de la batería. El problema era que xbattbar lee los datos de la batería de forma predeterminada mediante el antiguo sistema APM y opcionalmente mediante el más moderno ACPI, pero ninguno de los dos estaba activado en el núcleo y recompilar el núcleo hubiera sido una tarea llena de dificultades debido a las peculiaridades de la Pandora.

Lo misterioso era que al arrancar la Pandora con su propio sistema operativo, el panel del escritorio XFCE4 muestra un aplique con la información de la batería, cuando el núcleo, como comprobé, tampoco tenía soporte para APM o ACPI. ¿De dónde obtenía la información?

Al cabo de un tiempo investigué con más atención el problema y hallé la solución en una descripción del programa xfce4-battery-plugin, que es el que muestra el aplique en el panel de XFCE4: puede obtener la información de la batería mediante APM, ACPI o sysfs, disponible en los núcleos de Línux más modernos. Tras aprender en qué consiste este sistema, descubrí que la información sobre la batería estaba efectivamente en el siguiente directorio (un dato por fichero):

/sys/class/power_supply/bq27500-0/

Por otra parte, ya había investigado el funcionamiento de xbattbar: dos programas le proporcionan los datos sobre la batería: uno usa ACPI y otro usa APM:

/usr/lib/xbattbar/xbattbar-check-acpi
/usr/lib/xbattbar/xbattbar-check-apm

El segundo es un binario; por suerte el primero está escrito en Perl y es posible adivinar lo que hace: simplemente imprime dos datos (estado y capacidad de la batería) en determinado formato.

Por tanto para hacer que xbattbar funcionara bastaría escribir otro programa que hiciera lo mismo a partir de los datos disponibles en el directorio /sys/class/power_supply/bq27500-0~ /, y sustituir con él uno o ambos de los programas originales. El resultado está a continuación, un programa escrito en Forth con Gforth.

Código fuente

El programa es más largo de lo que podría ser debido a que la palabra slurp-file de Gforth, que devuelve el contenido de un fichero a partir de su nombre, no funciona con los ficheros virtuales del sistema sysfs; tampoco funciona la palabra clásica de ANS Forth read-file. Por ello escribí una alternativa, la palabra content, para leer la primera línea de cada fichero, que en realidad es todo su contenido.

#! /usr/bin/env gforth 

\ xbattbar-check-sysfs.fs
\ xbattbar-check-sysfs (version A-0020121104)

\ This program, 'xbattbar-check-sysfs', prints the status of the
\ Pandora's battery with the format required by xbattbar
\ (emulating the output of the Perl program
\ /usr/lib/xbattbar/xbattbar-check-acpi) 
\
\ Its goal is to make xbattbar to work without APM or ACPI,
\ getting the battery data from sysfs instead.

\ Copyright (C) 2012 Marcos Cruz (programandala.net)

\ \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

\ 2012-11-04 First version.
\ 2012-12-04 Simpler usage intructions, without installation.

\ \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
\ Usage as a parameter (the simple way)

\ Simply start xbattbar as usual, but add the -s parameter and
\ the path to this program:

\ xbattbar -s ~/WHATEVER/YOUR/PATH/IS/TO/xbattbar-check-sysfs.fs

\ Of course, consult the other parameters in the manual ('man
\ xbattbar').

\ \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
\ Usage with installation (the hard way)

\ This way you don't need to change the way you call xbattbar,
\ but the installation may be overriden by an upgrade of
\ xbattbar.

\ As root user:

\ 1) cd /usr/lib/xbattbar/
\ 2) mv xbattbar-check-acpi xbattbar-check-acpi.ORIGINAL
\ 3) mv xbattbar-check-apm xbattbar-check-apm.ORIGINAL
\ 4) ln -s ~/WHATEVER/YOUR/PATH/IS/TO/xbattbar-check-sysfs.fs xbattbar-check-acpi
\ 5) ln -s ~/WHATEVER/YOUR/PATH/IS/TO/xbattbar-check-sysfs.fs xbattbar-check-apm

\ Remark: xbattbar uses APM by default unless you start it with
\ the "-c" option to use ACPI instead. Since both original
\ programs have been redirected to this new one, xbattbar will
\ work fine in both cases.

\ \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

: sconstant  (  a1 u1 "name" -- )
  create  s,
  does>  ( pfa -- a2 u1 )  count
  ;

\ Directory that contains the Pandora's battery information:
s" /sys/class/power_supply/bq27500-0/" sconstant sys_dir

sys_dir s" status" s+ sconstant status_file
sys_dir s" capacity" s+ sconstant capacity_file

false [if]  \ use Gforth's 'slurp-file'

\ 'slurp-file' does not work with files under /sys/,
\ it causes the error "could not read whole file".

' slurp-file alias content

[else] \ alternative to 'slurp-file'

variable fid  \ file id
256 constant max_line
create line_buffer max_line 2 + allot

: open_file  ( a u -- )
  \ a u = file name
  r/o open-file throw fid !
  ;
: close_file  ( -- )
  fid @ close-file throw
  ;
: read_file  ( -- a u )
  \ Get the content of the open file (only its first line).
  \ a u = file content (first line)
  line_buffer dup max_line fid @ read-line throw and
  ;
: content  ( a1 u1 -- a2 u2 )
  \ Get file content; an alternative to 'slurp-file'.
  \ a1 u1 = file name
  \ a2 u2 = file content (first line)
  open_file read_file close_file
  ;

[then]

: .battery
  \ Print the capacity of the battery.
  s" battery=" type
  capacity_file content type cr
  ;
: .ac_line
  \ Print the status of the charger.
  s" ac_line=" type
  status_file content s" Charging" compare
  if  s" off"  else  s" on"  then  type cr
  ;

.battery .ac_line bye

Descargas

Instrucciones de uso

El programa puede usarse de dos formas: como un parámetro en la invocación de xbattbar o enlazado en sustitución de los programas originales que proporcionan a xbattbar los datos de la batería. El primer método es más sencillo.

Nota para principiantes en Línux: En los códigos siguientes, «~/RUTA/LA/QUE/SEA/A/» es un ejemplo que debe ser sustituido por la ruta real a este programa, el directorio donde lo hayamos guardado.

Invocar con un parámetro

Basta añadir a los parámetros que ya utilicemos (consúltese el manual con man xbattbar) el parámetro -s con la ruta completa a este programa:

xbattbar -s ~/RUTA/LA/QUE/SEA/A/xbattbar-check-sysfs.fs

Instalación

Este instalación sustituye los dos programas provistos por xbattbar parar obtener los datos de la batería, y por tanto no es necesario modificar la invocación a xbattbar, pero probablemente una actualización futura del programa obligará a hacer de nuevo la instalación.

El programa xbattbar usa APM de forma predeterminada a menos que lo arranquemos con el parámetro -c para que use ACPI. Sustituyendo los dos programas originales citados por enlaces simbólicos a este nuevo programa, como se muestra a continuación, lograremos que xbattbar funcione bien en ambos casos.

Los comandos que hay dar (como administrador, usuario root) son los siguientes:

  1. cd /usr/lib/xbattbar/
  2. mv xbattbar-check-acpi xbattbar-check-acpi.ORIGINAL
  3. mv xbattbar-check-apm xbattbar-check-apm.ORIGINAL
  4. ln -s ~/RUTA/LA/QUE/SEA/A/xbattbar-check-sysfs.fs xbattbar-check-acpi
  5. ln -s ~/RUTA/LA/QUE/SEA/A/xbattbar-check-sysfs.fs xbattbar-check-apm

Páginas relacionadas

Pandbatt
Programa en Forth para mostrar el estado de la batería de una Pandora.