summaryrefslogtreecommitdiff
path: root/statuses/battery.c
blob: 96e1ddd6d435aaa6204f14d5525c5714bffd5a60 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include "string.h"
#include "battery.h"

#ifndef POWER_BASEDIR
	#define POWER_BASEDIR "/sys/class/power_supply/"
#endif


void status_battery(char *batname)
{
	char batpath[256];
	int batpathlen;

	char stline[16];
	ssize_t stlen;

	int batt_now = 0;
	int batt_full = -1;
	int batt_percent = -1;
	int batt_current = 1;
	int batt_power = 1;
	int batt_voltage = 0;
	float batt_time = -1;
	float batt_watts = -1;


	// Prepare path
	batpathlen = sizeof(POWER_BASEDIR) - 1 + strlen(batname);
	if (batpathlen + 1 + sizeof("/energy_full") >= sizeof(batpath))
	{
		statusError("status_battery",
			"batpath buffer too small",
			batname);
		return;
	}
	strcpy(batpath, POWER_BASEDIR);
	strcat(batpath, batname);


	// Is the battery present?
	if (access(batpath, F_OK))
	{
		//printf(" ^fg(grey)[%s] ", batname);
		return;
	}


	// Get info
	strcpy(&batpath[batpathlen], "/energy_now");
	stlen = fileRead(stline, sizeof(stline), batpath);
	if (stlen > 0)
		batt_now = atoi(stline);

	strcpy(&batpath[batpathlen], "/energy_full");
	stlen = fileRead(stline, sizeof(stline), batpath);
	if (stlen > 0)
		batt_full = atoi(stline);

	strcpy(&batpath[batpathlen], "/power_now");
	stlen = fileRead(stline, sizeof(stline), batpath);
	if (stlen > 0)
		batt_power = atoi(stline);

	strcpy(&batpath[batpathlen], "/voltage_now");
	stlen = fileRead(stline, sizeof(stline), batpath);
	if (stlen > 0)
		batt_voltage = atoi(stline);


	// Prettyprint
	if (batt_full > 0)
		batt_percent = batt_now / (batt_full / 100);

	if (batt_percent <= 40) // 40
	{
		if (batt_percent <= 25) // 25
		{
			if (batt_percent <= 10) // 10
				fputs("^fg(red)", stdout);
			else // 11-25%
				fputs("^fg(orange)", stdout);
		}
		else // 26-40%
			fputs("^fg(yellow)", stdout);
	}
	else
	{
		if (batt_percent > 70) // 70
			fputs("^fg(white)", stdout);
		else // 41-70%
			fputs("^fg(green)", stdout);
	}

	batt_current = ((float)batt_power * 100) / ((float)batt_voltage / 100000);
	batt_time = (float)batt_now / (float)batt_current;
	batt_watts = ((float)batt_power / 1000000);

	if (batt_watts == 0)	// fully charged and not in use
		printf(" %s: %d%% _ _ ", batname, batt_percent);
	else
		printf(" %s: %d%% %.1fh %.1fW ",
			batname, batt_percent, batt_time, batt_watts);
}