pkgsrc-WIP-changes archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

btop-git: Add support for battery stats.



Module Name:	pkgsrc-wip
Committed By:	Santhosh Raju <fox%NetBSD.org@localhost>
Pushed By:	fox
Date:		Thu Feb 29 20:18:13 2024 +0100
Changeset:	b1676779cf1b0bc96855f366878f69ffb06edcd5

Modified Files:
	btop-git/Makefile
	btop-git/distinfo
	btop-git/patches/patch-src_netbsd_btop__collect.cpp

Log Message:
btop-git: Add support for battery stats.

To see a diff of this commit:
https://wip.pkgsrc.org/cgi-bin/gitweb.cgi?p=pkgsrc-wip.git;a=commitdiff;h=b1676779cf1b0bc96855f366878f69ffb06edcd5

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

diffstat:
 btop-git/Makefile                                  |   3 +-
 btop-git/distinfo                                  |   2 +-
 .../patches/patch-src_netbsd_btop__collect.cpp     | 174 +++++++++++++--------
 3 files changed, 111 insertions(+), 68 deletions(-)

diffs:
diff --git a/btop-git/Makefile b/btop-git/Makefile
index 2244e99880..32e86f60b2 100644
--- a/btop-git/Makefile
+++ b/btop-git/Makefile
@@ -11,12 +11,11 @@ HOMEPAGE=	https://github.com/aristocratos/btop
 COMMENT=	Colorful TTY resource monitor
 LICENSE=	apache-2.0
 
-DEPENDS+=	coreutils-[0-9]*:../../sysutils/coreutils
-
 USE_LANGUAGES=	c c++
 USE_TOOLS+=	gmake
 GCC_REQD+=	10
 CXXFLAGS+=	-DNDEBUG
+LDFLAGS.NetBSD+=-lprop
 
 MAKE_ARGS=	STRIP=true VERBOSE=true
 
diff --git a/btop-git/distinfo b/btop-git/distinfo
index 89bff9cccd..d9b01f9c0e 100644
--- a/btop-git/distinfo
+++ b/btop-git/distinfo
@@ -5,4 +5,4 @@ SHA512 (btop-1.2.13.20240218-6c667402907171f3ba7ebb637e553cc6f66f4e66.tar.gz) =
 Size (btop-1.2.13.20240218-6c667402907171f3ba7ebb637e553cc6f66f4e66.tar.gz) = 1145612 bytes
 SHA1 (patch-Makefile) = c881cc9121de99902f560728da201473b2ea9ef9
 SHA1 (patch-src_btop.cpp) = 60c805d6a5343d2e46f8f7cb0b03059426871fe9
-SHA1 (patch-src_netbsd_btop__collect.cpp) = 579033f58959b83602f1591ab7b7587d83c55c75
+SHA1 (patch-src_netbsd_btop__collect.cpp) = b95700f12401cc67f23a484b8ff937ff8e2621d7
diff --git a/btop-git/patches/patch-src_netbsd_btop__collect.cpp b/btop-git/patches/patch-src_netbsd_btop__collect.cpp
index e92931b32c..3c25aadc58 100644
--- a/btop-git/patches/patch-src_netbsd_btop__collect.cpp
+++ b/btop-git/patches/patch-src_netbsd_btop__collect.cpp
@@ -2,9 +2,9 @@ $NetBSD$
 
 Add support for NetBSD.
 
---- src/netbsd/btop_collect.cpp.orig	2024-02-24 10:19:36.470949441 +0000
+--- src/netbsd/btop_collect.cpp.orig	2024-02-28 16:37:10.878578423 +0000
 +++ src/netbsd/btop_collect.cpp
-@@ -0,0 +1,1282 @@
+@@ -0,0 +1,1326 @@
 +/* Copyright 2021 Aristocratos (jakob%qvantnet.com@localhost)
 +
 +   Licensed under the Apache License, Version 2.0 (the "License");
@@ -36,8 +36,10 @@ Add support for NetBSD.
 +#include <netinet/tcp_fsm.h>
 +#include <netinet/in.h> // for inet_ntop stuff
 +#include <pwd.h>
++#include <prop/proplib.h>
 +#include <sys/endian.h>
 +#include <sys/iostat.h>
++#include <sys/envsys.h>
 +#include <sys/resource.h>
 +#include <sys/socket.h>
 +#include <sys/statvfs.h>
@@ -267,40 +269,6 @@ Add support for NetBSD.
 +		return name;
 +	}
 +
-+	int64_t get_sensor(string device, int num) {
-+		int64_t temp = -1;
-+//		struct sensordev sensordev;
-+//		struct sensor sensor;
-+//		size_t sdlen, slen;
-+//		int dev;
-+//		int mib[] = {CTL_HW, HW_SENSORS, 0, 0, 0};
-+//
-+//		sdlen = sizeof(sensordev);
-+//		slen = sizeof(sensor);
-+//		for (dev = 0;; dev++) {
-+//			mib[2] = dev;
-+//			if (sysctl(mib, 3, &sensordev, &sdlen, NULL, 0) == -1) {
-+//				if (errno == ENXIO)
-+//					continue;
-+//				if (errno == ENOENT)
-+//					break;
-+//			}
-+//			if (strstr(sensordev.xname, device.c_str())) {
-+//				mib[3] = type;
-+//				mib[4] = num;
-+//				if (sysctl(mib, 5, &sensor, &slen, NULL, 0) == -1) {
-+//					if (errno != ENOENT) {
-+//						Logger::warning("sysctl");
-+//						continue;
-+//					}
-+//				}
-+//				temp = sensor.value;
-+//			 	break;
-+//			}
-+//		}
-+		return temp;
-+	}
-+
 +	bool get_sensors() {
 +		got_sensors = false;
 +//		if (Config::getB("show_coretemp") and Config::getB("check_temp")) {
@@ -394,36 +362,112 @@ Add support for NetBSD.
 +	auto get_battery() -> tuple<int, float, long, string> {
 +		if (not has_battery) return {0, 0.0, 0, ""};
 +
-+		long seconds = -1;
-+		uint32_t percent = -1;
-+		string status = "discharging";
-+		int64_t full, remaining;
-+		full = get_sensor("acpibat0", 0);
-+		remaining = get_sensor("acpibat0", 3);
-+		int64_t state = get_sensor("acpibat0", 0);
-+		if (full < 0) {
++		prop_dictionary_t dict, fields, props;
++
++		int64_t totalCharge = 0;
++		int64_t totalCapacity = 0;
++
++		int fd = open(_PATH_SYSMON, O_RDONLY);
++		if (fd == -1) {
++			Logger::warning("failed to open " + string(_PATH_SYSMON));
 +			has_battery = false;
-+			Logger::warning("failed to get battery");
-+		} else {
-+			float_t f = full / 1000;
-+			float_t r = remaining / 1000;
-+			has_battery = true;
-+			percent = r / f * 100;
-+			if (percent == 100) {
-+				status = "full";
++			return {0, 0.0, 0, ""};
++		}
++
++		if (prop_dictionary_recv_ioctl(fd, ENVSYS_GETDICTIONARY, &dict) != 0) {
++			if (fd != -1) {
++				close(fd);
 +			}
-+			switch (state) {
-+				case 0:
-+					status = "full";
-+					percent = 100;
-+					break;
-+				case 2:
-+					status = "charging";
-+					break;
++			has_battery = false;
++			Logger::warning("failed to open envsys dict");
++			return {0, 0.0, 0, ""};
++		}
++
++		if (prop_dictionary_count(dict) == 0) {
++			if (fd != -1) {
++				close(fd);
++			}
++			has_battery = false;
++			Logger::warning("no drivers registered for envsys");
++			return {0, 0.0, 0, ""};
++		}
++
++		prop_object_t fieldsArray = prop_dictionary_get(prop_dictionary_t(dict), "acpibat0");
++		if (prop_object_type(fieldsArray) != PROP_TYPE_ARRAY) {
++			if (fd != -1) {
++				close(fd);
 +			}
++			has_battery = false;
++			Logger::warning("unknown device 'acpibat0'");
++			return {0, 0.0, 0, ""};
 +		}
 +
-+		return {percent, 0.0, seconds, status};
++		prop_object_iterator_t fieldsIter = prop_array_iterator(prop_array_t(fieldsArray));
++		if (fieldsIter == NULL) {
++			if (fd != -1) {
++				close(fd);
++			}
++			has_battery = false;
++			return {0, 0.0, 0, ""};
++		}
++
++		/* only assume battery is not present if explicitly stated */
++		bool isBattery = false;
++		int64_t isPresent = 1;
++		int64_t curCharge = 0;
++		int64_t maxCharge = 0;
++		string status = "unknown";
++		string prop_description = "no description";
++
++		while ((fields = (prop_dictionary_t) prop_object_iterator_next(prop_object_iterator_t(fieldsIter))) != NULL) {
++			props = (prop_dictionary_t) prop_dictionary_get(fields, "device-properties");
++			if (props != NULL) continue;
++
++			prop_object_t curValue = prop_dictionary_get(fields, "cur-value");
++			prop_object_t maxValue = prop_dictionary_get(fields, "max-value");
++			prop_object_t description = prop_dictionary_get(fields, "description");
++
++			if (description == NULL || curValue == NULL) {
++				continue;
++			}
++
++
++			prop_description = prop_string_cstring(prop_string_t(description));
++
++			if (prop_description == "charge") {
++				if (maxValue == NULL) {
++					continue;
++				}
++				curCharge = prop_number_integer_value(prop_number_t(curValue));
++				maxCharge = prop_number_integer_value(prop_number_t(maxValue));
++			}
++
++			if (prop_description == "present") {
++				isPresent = prop_number_integer_value(prop_number_t(curValue));
++			}
++
++			if (prop_description == "charging") {
++				status = prop_description;
++				string charging_type = prop_string_cstring(prop_string_t(prop_dictionary_get(fields, "type")));
++				isBattery = charging_type == "Battery charge" ? true : false;
++			}
++
++			if (isBattery && isPresent) {
++				totalCharge += curCharge;
++				totalCapacity += maxCharge;
++			}
++		}
++
++		prop_object_iterator_release(fieldsIter);
++		prop_object_release(dict);
++
++		uint32_t percent = ((double)totalCharge / (double)totalCapacity) * 100.0;
++
++		if (percent == 100) {
++			status = "full";
++		}
++
++		return {percent, -1, -1, status};
 +	}
 +
 +	auto collect(bool no_update) -> cpu_info & {
@@ -569,7 +613,7 @@ Add support for NetBSD.
 +
 +		size_t size;
 +		if (sysctl(mib, 3, NULL, &size, NULL, 0) == -1) {
-+		        Logger::error("sysctl hw.drivestats failed");
++			Logger::error("sysctl hw.drivestats failed");
 +			return;
 +		}
 +		num_drives = size / sizeof(struct io_sysctl);
@@ -580,12 +624,12 @@ Add support for NetBSD.
 +		};
 +
 +		if (sysctl(mib, 3, drives.get(), &size, NULL, 0) == -1) {
-+		        Logger::error("sysctl hw.iostats failed");
++			Logger::error("sysctl hw.iostats failed");
 +		}
 +		for (int i = 0; i < num_drives; i++) {
 +			for (auto& [ignored, disk] : disks) {
 +				if (disk.dev.string().find(drives[i].name) != string::npos) {
-+				        string mountpoint = mapping.at(disk.dev);
++					string mountpoint = mapping.at(disk.dev);
 +					total_bytes_read = drives[i].rbytes;
 +					total_bytes_write = drives[i].wbytes;
 +					assign_values(disk, total_bytes_read, total_bytes_write);
@@ -778,7 +822,7 @@ Add support for NetBSD.
 +	class getifaddr_wrapper {
 +		struct ifaddrs *ifaddr;
 +
-+	   public:
++	public:
 +		int status;
 +		getifaddr_wrapper() { status = getifaddrs(&ifaddr); }
 +		~getifaddr_wrapper() { freeifaddrs(ifaddr); }


Home | Main Index | Thread Index | Old Index