Subject: Battery status support for kismet on NetBSD
To: None <pkgsrc-users@netbsd.org>
From: khorben <khorben@defora.org>
List: pkgsrc-users
Date: 11/11/2006 23:22:57
This is a multi-part message in MIME format.
--------------010003020300010005060500
Content-Type: text/plain; charset=ISO-8859-15
Content-Transfer-Encoding: 7bit

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

	Hi list,

I just wrote a patch for kismet to display the battery status on NetBSD
as well.

It also includes a small modification of the ACPI support detection on
Linux, but feel free to remove it (plus I think it lacks the inclusion
of unistd.h for this matter).

HTH,
- --
khorben
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.5 (NetBSD)

iD8DBQFFVk1BF/6l+XqPVO4RAignAJwKqPrMkqXdyMmxNDClABfJJtOXzgCgjOsR
f6S8jUqH0S8jp5Hr2TLKfZ0=
=oCFK
-----END PGP SIGNATURE-----

--------------010003020300010005060500
Content-Type: text/plain;
 name="patch-ai"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
 filename="patch-ai"

$NetBSD$

--- panelfront.cc.orig	2005-06-29 20:04:43.000000000 +0200
+++ panelfront.cc
@@ -26,6 +26,14 @@
 #include <machine/apmvar.h>
 #endif
 
+#ifdef SYS_NETBSD
+#include <sys/types.h>
+#include <sys/ioctl.h>
+#include <sys/envsys.h>
+#include <fcntl.h>
+#include <paths.h>
+#endif
+
 #include "panelfront.h"
 #include "displaynetworksort.h"
 
@@ -450,12 +458,10 @@ PanelFront::PanelFront() {
     tainted = 0;
 
     // Do we have an acpi info file?
-    FILE *acpinfo = fopen("/proc/acpi/info", "r");
-    if (acpinfo == NULL) {
+    if (access("/proc/acpi/info", R_OK) != 0) {
         use_acpi = 0;
     } else {
         use_acpi = 1;
-        fclose(acpinfo);
     }
 
     probe_group = NULL;
@@ -1582,6 +1588,66 @@ int PanelFront::Tick() {
 				}
 			}
 		}
+#elif defined(SYS_NETBSD)
+		static int fd = -1;
+		int i;
+		envsys_basic_info_t info;
+		envsys_tre_data_t data;
+		unsigned int charge = 0;
+		unsigned int maxcharge = 0;
+		unsigned int rate = 0;
+
+		if(fd < 0 && (fd = open(_PATH_SYSMON, O_RDONLY)) < 0)
+		{
+			bat_available = 0;
+			WriteStatus("Unable to open " _PATH_SYSMON);
+			return 1;
+		}
+		bat_ac = 0;
+		bat_available = 0;
+		bat_charging = 0;
+		bat_percentage = 0;
+		bat_time = 0;
+		for(i = 0; i >= 0; i++)
+		{
+			memset(&info, 0, sizeof(info));
+			info.sensor = i;
+			if(ioctl(fd, ENVSYS_GTREINFO, &info) == -1)
+			{
+				bat_available = 0;
+				WriteStatus("ioctl ENVSYS_GTREINFO failed");
+				return 1;
+			}
+			if(!(info.validflags & ENVSYS_FVALID))
+				break;
+			memset(&data, 0, sizeof(data));
+			data.sensor = i;
+			if(ioctl(fd, ENVSYS_GTREDATA, &data) == -1)
+			{
+				bat_available = 0;
+				WriteStatus("ioctl ENVSYS_GTREDATA failed");
+				return 1;
+			}
+			if(!(data.validflags & ENVSYS_FVALID))
+				continue;
+			if(strcmp("acpiacad0 connected", info.desc) == 0)
+				bat_ac = data.cur.data_us;
+			else if(strcmp("acpibat0 charge", info.desc) == 0)
+			{
+				bat_available = 1;
+				bat_percentage = (unsigned int)((data.cur.data_us * 100.0) / data.max.data_us);
+				charge = data.cur.data_us;
+				maxcharge = data.max.data_us;
+			}
+			else if(strcmp("acpibat0 charging", info.desc) == 0)
+				bat_charging = data.cur.data_us > 0 ? 1 : 0;
+			else if(strcmp("acpibat0 discharge rate", info.desc) == 0)
+				rate = data.cur.data_us;
+		}
+		if(bat_charging != 0)
+			bat_time = rate ? (unsigned int)((maxcharge - charge) * 3600.0 / rate) : 0;
+		else
+			bat_time = rate ? (unsigned int)((charge * 3600.0) / rate) : 0;
 #endif
     }
 

--------------010003020300010005060500--