Skip to content

Commit cdc8124

Browse files
committed
Battery (Haiku): add support (untested)
1 parent c53191a commit cdc8124

File tree

1 file changed

+40
-11
lines changed

1 file changed

+40
-11
lines changed
Lines changed: 40 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,60 @@
11
#include "fastfetch.h"
22
#include "battery.h"
33
#include "common/io/io.h"
4-
#include "util/stringUtils.h"
54

6-
void parseBattery(FFstrbuf* content, FFlist* results)
5+
#include <private/device/power_managment.h>
6+
#include <sys/ioctl.h>
7+
#include <fcntl.h>
8+
9+
const char* parseBattery(int dfd, const char* battId, FFlist* results)
710
{
8-
char* line = NULL;
9-
size_t n = 0;
10-
while (ffStrbufGetline(&line, &n, content))
11-
{
11+
FF_AUTO_CLOSE_FD int fd = openat(dfd, battId, O_RDWR);
12+
if (fd < 0) return "openat() failed";
1213

13-
}
14+
acpi_battery_info basic = {};
15+
if (ioctl(fd, GET_BATTERY_INFO, &basic, sizeof(basic)) != 0)
16+
return "ioctl(GET_BATTERY_INFO) failed";
17+
acpi_extended_battery_info extended = {};
18+
if (ioctl(fd, GET_EXTENDED_BATTERY_INFO, &extended, sizeof(extended)) != 0)
19+
return "ioctl(GET_EXTENDED_BATTERY_INFO) failed";
20+
21+
FFBatteryResult* battery = (FFBatteryResult*)ffListAdd(results);
22+
ffStrbufInitS(&battery->modelName, extended.model_number);
23+
ffStrbufInitS(&battery->manufacturer, extended.oem_info);
24+
ffStrbufInit(&battery->manufactureDate);
25+
ffStrbufInitS(&battery->technology, extended.type); // extended.technology?
26+
ffStrbufInit(&battery->status);
27+
ffStrbufInitS(&battery->serial, extended.serial_number);
28+
battery->temperature = FF_BATTERY_TEMP_UNSET;
29+
battery->cycleCount = extended.cycles;
30+
battery->timeRemaining = -1;
31+
battery->capacity = (double) basic.capacity / (double) extended.last_full_charge;
32+
33+
if (basic.state & BATTERY_DISCHARGING)
34+
ffStrbufAppendS(&battery->status, "Discharging, ");
35+
if (basic.state & BATTERY_CHARGING)
36+
ffStrbufAppendS(&battery->status, "Charging, ");
37+
if (basic.state & BATTERY_CRITICAL_STATE)
38+
ffStrbufAppendS(&battery->status, "Critical, ");
39+
if (basic.state & BATTERY_NOT_CHARGING)
40+
ffStrbufAppendS(&battery->status, "AC Connected, ");
41+
ffStrbufTrimRight(&battery->status, ' ');
42+
ffStrbufTrimRight(&battery->status, ',');
43+
44+
return NULL;
1445
}
1546

1647
const char* ffDetectBattery(FFBatteryOptions* options, FFlist* results)
1748
{
1849
FF_AUTO_CLOSE_DIR DIR* dir = opendir("/dev/power/acpi_battery/");
1950
if (!dir) return "opendir(/dev/power/acpi_battery) failed";
2051

21-
FF_STRBUF_AUTO_DESTROY content = ffStrbufCreate();
2252
struct dirent* entry;
2353
while ((entry = readdir(dir)))
2454
{
2555
if (entry->d_name[0] == '.') continue;
26-
if (!ffReadFileBufferRelative(dirfd(dir), entry->d_name, &content)) continue;
27-
parseBattery(&content, results);
56+
parseBattery(dirfd(dir), entry->d_name, results);
2857
}
2958

30-
return "To be supported";
59+
return NULL;
3160
}

0 commit comments

Comments
 (0)