]> git.webhop.me Git - lcd4linux.git/commitdiff
[lcd4linux @ 2001-03-02 10:18:03 by ltoetsch]
authorltoetsch <ltoetsch@3ae390bd-cb1e-0410-b409-cd5a39f66f1f>
Fri, 2 Mar 2001 10:19:07 +0000 (10:19 +0000)
committerltoetsch <ltoetsch@3ae390bd-cb1e-0410-b409-cd5a39f66f1f>
Fri, 2 Mar 2001 10:19:07 +0000 (10:19 +0000)
added /proc/apm battery stat

git-svn-id: https://ssl.bulix.org/svn/lcd4linux/trunk@93 3ae390bd-cb1e-0410-b409-cd5a39f66f1f

Makefile.am
Makefile.in
README
Raster.c
TODO
battery.c [new file with mode: 0644]
battery.h [new file with mode: 0644]
lcd4linux.conf.sample
parser.c
parser.h
processor.c

index 00f9462aada158a0dbca59f9918d9890574a615b..ad090ce5365be02bc9677c3e171c365bde43ac8a 100644 (file)
@@ -21,6 +21,7 @@ system.c system.h \
 isdn.c isdn.h \
 mail.c mail.h \
 seti.c seti.h \
+battery.c battery.h \
 filter.c filter.h \
 udelay.c udelay.h \
 display.c display.h \
index 7ef71dfc77a0a800a7fa5d424afa696b0e844f20..48acdae5225a607ee7ed48882d36777a8fcb288d 100644 (file)
@@ -76,7 +76,7 @@ lcd4linux_LDFLAGS = $(X_LIBS)
 lcd4linux_LDADD = @DRIVERS@ @DRVLIBS@
 lcd4linux_DEPENDENCIES = @DRIVERS@
 
-lcd4linux_SOURCES =  lcd4linux.c debug.c debug.h cfg.c cfg.h lock.c lock.h parser.c parser.h processor.c processor.h system.c system.h isdn.c isdn.h mail.c mail.h seti.c seti.h filter.c filter.h udelay.c udelay.h display.c display.h pixmap.c pixmap.h fontmap.c fontmap.h
+lcd4linux_SOURCES =  lcd4linux.c debug.c debug.h cfg.c cfg.h lock.c lock.h parser.c parser.h processor.c processor.h system.c system.h isdn.c isdn.h mail.c mail.h seti.c seti.h battery.c battery.h filter.c filter.h udelay.c udelay.h display.c display.h pixmap.c pixmap.h fontmap.c fontmap.h
 
 
 EXTRA_lcd4linux_SOURCES =  BeckmannEgle.c Crystalfontz.c Crystalfontz.h HD44780.c MatrixOrbital.c PalmPilot.c PNG.c PPM.c SIN.c Skeleton.c XWindow.c   
@@ -99,8 +99,8 @@ X_LIBS = @X_LIBS@
 X_EXTRA_LIBS = @X_EXTRA_LIBS@
 X_PRE_LIBS = @X_PRE_LIBS@
 lcd4linux_OBJECTS =  lcd4linux.o debug.o cfg.o lock.o parser.o \
-processor.o system.o isdn.o mail.o seti.o filter.o udelay.o display.o \
-pixmap.o fontmap.o
+processor.o system.o isdn.o mail.o seti.o battery.o filter.o udelay.o \
+display.o pixmap.o fontmap.o
 CFLAGS = @CFLAGS@
 COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
 CCLD = $(CC)
@@ -115,11 +115,11 @@ TAR = tar
 GZIP_ENV = --best
 DEP_FILES =  .deps/BeckmannEgle.P .deps/Crystalfontz.P .deps/HD44780.P \
 .deps/MatrixOrbital.P .deps/PNG.P .deps/PPM.P .deps/PalmPilot.P \
-.deps/SIN.P .deps/Skeleton.P .deps/XWindow.P .deps/cfg.P .deps/debug.P \
-.deps/display.P .deps/filter.P .deps/fontmap.P .deps/isdn.P \
-.deps/lcd4linux.P .deps/lock.P .deps/mail.P .deps/parser.P \
-.deps/pixmap.P .deps/processor.P .deps/seti.P .deps/system.P \
-.deps/udelay.P
+.deps/SIN.P .deps/Skeleton.P .deps/XWindow.P .deps/battery.P \
+.deps/cfg.P .deps/debug.P .deps/display.P .deps/filter.P \
+.deps/fontmap.P .deps/isdn.P .deps/lcd4linux.P .deps/lock.P \
+.deps/mail.P .deps/parser.P .deps/pixmap.P .deps/processor.P \
+.deps/seti.P .deps/system.P .deps/udelay.P
 SOURCES = $(lcd4linux_SOURCES) $(EXTRA_lcd4linux_SOURCES)
 OBJECTS = $(lcd4linux_OBJECTS)
 
diff --git a/README b/README
index 07b135bd31eb3321408034359b3b7e5839c6a5c0..eb3af90cf388ac66d34b261c1f6a34c1d859c1b0 100644 (file)
--- a/README
+++ b/README
@@ -1,5 +1,5 @@
 #
-# $Id: README,v 1.11 2001/02/16 08:23:09 reinelt Exp $
+# $Id: README,v 1.12 2001/03/02 10:18:45 ltoetsch Exp $
 #
 
 This is the README file for lcd4linux
@@ -178,3 +178,6 @@ Tokens:
   'tm', PPP bytes max (received, send)
   's1', temperature of sensor 1
   's2', temperature of sensor 2 (up to s9)
+  'bp', battery percentage (APM by now)
+  'bs', battery status ('=' = online, '+' = charging, '-' discharging)
+  'bd', battery duration in s{econds}, m{ins}, h{ours} or d{ays}
index a475e94f593e5e989eae9881620686fc29df7142..985c888e2f40bf11e5ab403097d58c0fd0bf0743 100644 (file)
--- a/Raster.c
+++ b/Raster.c
@@ -1,4 +1,4 @@
-/* $Id: Raster.c,v 1.14 2001/03/01 22:33:50 reinelt Exp $
+/* $Id: Raster.c,v 1.15 2001/03/02 10:18:03 ltoetsch Exp $
  *
  * driver for raster formats
  *
@@ -20,6 +20,9 @@
  *
  *
  * $Log: Raster.c,v $
+ * Revision 1.15  2001/03/02 10:18:03  ltoetsch
+ * added /proc/apm battery stat
+ *
  * Revision 1.14  2001/03/01 22:33:50  reinelt
  *
  * renamed Raster_flush() to PPM_flush()
 #include <sys/types.h>
 #include <sys/stat.h>
 #ifdef WITH_PNG
-#include <gd/gd.h>
+/* #include <gd/gd.h> */
+#include <gd.h>
 #endif
 
 #include "debug.h"
diff --git a/TODO b/TODO
index 06c992ac8b16caa10dcee480b71d08bb4760a092..109a2e939e808318db1d1418f08c68e828db58d7 100644 (file)
--- a/TODO
+++ b/TODO
@@ -4,8 +4,9 @@ ToDo-List / Wishlist for lcd4linux
 implement some sort of 'graphs', similar to bars, but with a time axis
 can be filled (made up of bars) or not (needs raster graphics)
 
-2000-04-04 Michael Reinelt <reinelt@eunet.at>
-write a driver for PNG. This should be the first step towards a WWW-driver.
+// 2000-04-04 Michael Reinelt <reinelt@eunet.at>
+// write a driver for PNG. This should be the first step towards a WWW-driver.
+Done 2001-03-01 -lt.
 
 2000-04-15 Thomas Skyt Jessen <thskyt@foni.net>
 show partition information (used, free, ...)
@@ -30,6 +31,7 @@ accept data from external sources (fifo?)
 connect a LED to a spare pin of the parallel port and show if ISDN
 is online
 
-2001-01-27 Axel Ehnert <axel@ehnert.net>
-- display numer of emails in a mailbox
-- display seti@home values
+// 2001-01-27 Axel Ehnert <axel@ehnert.net>
+// - display numer of emails in a mailbox
+// - display seti@home values
+done.
diff --git a/battery.c b/battery.c
new file mode 100644 (file)
index 0000000..a4a35e0
--- /dev/null
+++ b/battery.c
@@ -0,0 +1,111 @@
+/*
+ * battery.c interface to APM and (TODO:) ACPI
+ * 
+ */
+
+/* exported functions:
+ *
+ * int Battery (double *perc, int *status, double *lasting);
+ *   returns:
+ *     perc ... percentage of battery (0..100)
+ *     status .. 0 (online), 1 (charging), 2 (discharging)
+ *     lasting ... seconds, how long battery will last
+ * 
+ */
+#include <stdlib.h>
+#include <stdio.h>
+#include <fcntl.h>
+#include <ctype.h>
+#include <string.h>
+#include <unistd.h>
+#include <errno.h>
+#include <sys/time.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+
+#include "debug.h"
+
+
+int Battery (int *perc, int *status, double *dur) 
+{
+  static int fd = -2;
+  static int apm = 0;
+
+  if (fd==-1) return -1;
+
+  if (fd==-2) {
+    fd = open("/proc/apm", O_RDONLY | O_NDELAY);
+    if (fd==-1) {
+      error ("open(/proc/apm) failed: %s", strerror(errno));
+      fd = open("/proc/acpi", O_RDONLY | O_NDELAY); /* FIXME */
+      if (fd==-1) {
+        error ("open(/proc/acpi) failed: %s", strerror(errno));
+        return -1;
+      }
+      debug ("open(/proc/acpi)=%d", fd);
+    }
+    else {
+      debug ("open(/proc/apm)=%d", fd);
+      apm = 1;
+    }
+  }
+  if (lseek(fd, 0L, SEEK_SET)!=0) {
+    error ("lseek(/proc/apm|acpi) failed: %s", strerror(errno));
+    fd=-1;
+    return -1;
+  }
+  if (apm) {
+    int f3, f4;
+    char eh[4];
+    char buffer[128];
+    /* /usr/src/linux/arch/i386/kernel/apm.c :
+       p += sprintf(p, "%s %d.%d 0x%02x 0x%02x 0x%02x 0x%02x %d%% %d %s\n",
+                    driver_version,
+                    (apm_bios_info.version >> 8) & 0xff,
+                    apm_bios_info.version & 0xff,
+                    apm_bios_info.flags,
+                    ac_line_status,
+                    battery_status,
+                    battery_flag,
+                    percentage,
+                    time_units,
+                    units);
+          3) AC line status
+             0x00: Off-line
+             0x01: On-line
+             0x02: On backup power (BIOS >= 1.1 only)
+             0xff: Unknown
+          4) Battery status
+             0x00: High
+             0x01: Low
+             0x02: Critical
+             0x03: Charging
+             0x04: Selected battery not present (BIOS >= 1.2 only)
+             0xff: Unknown
+    */
+    
+    if (read (fd, &buffer, sizeof(buffer)-1)==-1) {
+      error ("read(/proc/apm) failed: %s", strerror(errno));
+      fd=-1;
+      return -1;
+    }
+    /*              Ver v.v fl  as bs bf perc tu u*/
+    sscanf(buffer, "%*s %*s %*s %x %x %*s %d%% %lf %3s", &f3, &f4, perc, dur, eh);
+    if (f3 == 0x1) 
+      *status = 0; /* Online */
+    else
+      *status = 2; /* Offline = discharging */
+    if (f4 == 0x3)
+      *status = 1; /* charging */
+    eh[1] = '\0'; /* m | s */
+    if (*eh == 'm')
+      *dur *= 60;
+#ifdef DEBUG_BATT    
+    info("perc=%d, f3=%x, f4=%x, stat=%d, dur=%lf", *perc,f3,f4, *status, *dur);
+#endif    
+  }
+  else {
+    /* FIXME: parse ACPI */
+  }
+  return 0;
+}
diff --git a/battery.h b/battery.h
new file mode 100644 (file)
index 0000000..023323c
--- /dev/null
+++ b/battery.h
@@ -0,0 +1,7 @@
+#ifndef _BATTERY_H_
+#define _BATTERY_H_
+
+
+int Battery ( int *perc, int *stat, double *dur);
+
+#endif
index 07c1b11ad4d5af2f97a4e8cf6476400152a1f717..0032ff315c74d36ccfe988e7651cdb20ae59af67 100644 (file)
@@ -75,6 +75,13 @@ Tau 500
 
 Overload 2.0
 
+# flash bp-Bar if below Battwarning
+# I use Row6 "Bat%bp%bs%bd$r10bp+bp"
+# which gives a nice flash effect
+# default 10
+
+Battwarning 10
+
 SetiDir /etc/setiathome
 Mailbox1 /var/spool/mail/michii
 
index 22759239c2d761b35d6dcbc15431d5f5f60bd655..fb3f3be6a664102e0836a2575050f1c36fc6da5d 100644 (file)
--- a/parser.c
+++ b/parser.c
@@ -1,4 +1,4 @@
-/* $Id: parser.c,v 1.10 2001/02/19 00:15:46 reinelt Exp $
+/* $Id: parser.c,v 1.11 2001/03/02 10:18:03 ltoetsch Exp $
  *
  * row definition parser
  *
@@ -20,6 +20,9 @@
  *
  *
  * $Log: parser.c,v $
+ * Revision 1.11  2001/03/02 10:18:03  ltoetsch
+ * added /proc/apm battery stat
+ *
  * Revision 1.10  2001/02/19 00:15:46  reinelt
  *
  * integrated mail and seti client
@@ -145,6 +148,9 @@ static SYMTAB Symtab[] = {{ "%",  T_PERCENT,    C_GENERIC, 0 },
                          { "tm", T_PPP_MAX,    C_PPP,     1 },
                          { "hc", T_SETI_PRC,   C_SETI,    1 },
                          { "ht", T_SETI_CPU,   C_SETI,    0 },
+                         { "bp", T_BATT_PERC,  C_BATT,    1 },
+                         { "bs", T_BATT_STAT,  C_BATT,    0 },
+                         { "bd", T_BATT_DUR,   C_BATT,    0 },
                          { "e*", T_MAIL,       C_MAIL,    0 },
                          { "s*", T_SENSOR,     C_SENSOR,  1 },
                          { "",  -1,            0 }};
index 1d0e1d3543d37600cc161f1e6bf1244419d078ee..ecc4e4b3927578aaf0644d2ee002bb269dd8bdd3 100644 (file)
--- a/parser.h
+++ b/parser.h
@@ -1,4 +1,4 @@
-/* $Id: parser.h,v 1.8 2001/02/19 00:15:46 reinelt Exp $
+/* $Id: parser.h,v 1.9 2001/03/02 10:18:03 ltoetsch Exp $
  *
  * row definition parser
  *
@@ -20,6 +20,9 @@
  *
  *
  * $Log: parser.h,v $
+ * Revision 1.9  2001/03/02 10:18:03  ltoetsch
+ * added /proc/apm battery stat
+ *
  * Revision 1.8  2001/02/19 00:15:46  reinelt
  *
  * integrated mail and seti client
@@ -76,13 +79,16 @@ typedef enum {
   T_PPP_RX, T_PPP_TX, T_PPP_TOTAL, T_PPP_MAX,
   T_ISDN_USED, T_ISDN_IN, T_ISDN_OUT, T_ISDN_TOTAL, T_ISDN_MAX,
   T_SETI_PRC, T_SETI_CPU,
+  T_BATT_PERC, T_BATT_STAT, T_BATT_DUR,
   T_EXTENDED,
   T_MAIL,
   T_SENSOR
 } TOKEN;
 
 typedef enum {
-  C_GENERIC, C_MEM, C_LOAD, C_CPU, C_DISK, C_ETH, C_PPP, C_ISDN, C_SETI, C_MAIL, C_SENSOR
+  C_GENERIC, C_MEM, C_LOAD, C_CPU, C_DISK, C_ETH, C_PPP, C_ISDN, C_SETI, 
+  C_BATT,  
+  C_MAIL, C_SENSOR
 } CLASS;
 
 char *parse_row (char *string, int supported_bars, int usage[]);
index 0687fc6d7ffe795e77e0f0edd1718c850ec32ea0..aa320c65c741ca8dbef1a9e51f5f21de09650f37 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: processor.c,v 1.14 2001/02/19 00:15:46 reinelt Exp $
+/* $Id: processor.c,v 1.15 2001/03/02 10:18:03 ltoetsch Exp $
  *
  * main data processing
  *
@@ -20,6 +20,9 @@
  *
  *
  * $Log: processor.c,v $
+ * Revision 1.15  2001/03/02 10:18:03  ltoetsch
+ * added /proc/apm battery stat
+ *
  * Revision 1.14  2001/02/19 00:15:46  reinelt
  *
  * integrated mail and seti client
 #include "display.h"
 #include "processor.h"
 #include "mail.h"
+#include "battery.h"
 #include "seti.h"
 
 #define ROWS 16
@@ -130,6 +134,7 @@ struct { int read, write, total, max, peak; } disk;
 struct { int rx, tx, total, max, peak, bytes; } net;
 struct { int usage, in, out, total, max, peak; } isdn;
 struct { int rx, tx, total, max, peak; } ppp;
+struct { int perc, stat; double dur; } batt;
 struct { double perc, cput; } seti;
 struct { int num; } mail[MAILBOXES];
 struct { double val, min, max; } sensor[SENSORS];
@@ -215,6 +220,13 @@ static double query (int token)
   case T_SETI_CPU:
     return seti.cput;
     
+  case T_BATT_PERC:
+    return batt.perc;
+  case T_BATT_STAT:
+    return batt.stat;
+  case T_BATT_DUR:
+    return batt.dur;
+    
   case T_MAIL:
     return mail[(token>>8)-'0'].num;
 
@@ -224,6 +236,7 @@ static double query (int token)
   return 0.0;
 }
 
+/* return a value 0..1 */
 static double query_bar (int token)
 {
   int i;
@@ -275,7 +288,15 @@ static double query_bar (int token)
     
   case T_SETI_PRC:
     return value;
-
+    
+  case T_BATT_PERC:
+    {
+      static int alarm;
+      alarm=(++alarm % 3);
+      if(value < atoi(cfg_get("battwarning")?:"10") && !alarm) /* flash bar */
+       value = 0;
+      return value/100;
+    }
   case T_SENSOR:
     i=(token>>8)-'0';
     return (value-sensor[i].min)/(sensor[i].max-sensor[i].min);
@@ -374,6 +395,41 @@ static void print_token (int token, char **p)
                 (int)((int)val%86400)/3600,
                 (int)(((int)val%86400)%3600)/60 );
     break;
+    
+  case T_BATT_PERC:
+    *p+=sprintf(*p, "%3.0f", query(token));
+    break;
+  case T_BATT_STAT:  
+    { int ival = (int) query(token);
+      switch (ival) {
+        case 0: **p = '='; break;
+        case 1: **p = '+'; break;
+        case 2: **p = '-'; break;
+        default: **p = '?'; break;
+      }
+    }
+    (*p)++;
+    break;
+  case T_BATT_DUR:
+    {
+      char eh = 's';
+      val = query(token);
+      if (val > 99) {
+       val /= 60;
+       eh = 'm';
+      }
+      if (val > 99) {
+       val /= 60;
+       eh = 'h';
+      }
+      if (val > 99) {
+       val /= 24;
+       eh = 'd';
+      }
+      *p+=sprintf(*p, "%2.0f%c", val, eh);
+    }
+    break;
+    
   case T_MAIL:
     val=query(token);
     *p+=sprintf (*p, "%3.0f", val);
@@ -432,6 +488,10 @@ static void collect_data (void)
   if (token_usage[C_SETI]) {
     Seti (&seti.perc, &seti.cput);
   }
+
+  if (token_usage[C_BATT]) {
+    Battery (&batt.perc, &batt.stat, &batt.dur);
+  }
   
   for (i=1; i<=MAILBOXES; i++) {
     if (token_usage[T_MAIL]&(1<<i)) {