wip: wip wip wip
This commit is contained in:
parent
caa1dd29a7
commit
5ce95f8180
|
@ -45,7 +45,10 @@ file_contents(const char *path)
|
||||||
}
|
}
|
||||||
fclose(f);
|
fclose(f);
|
||||||
|
|
||||||
buf[len] = 0;
|
if (buf[len - 1] == '\n')
|
||||||
|
buf[len - 1] = 0;
|
||||||
|
else
|
||||||
|
buf[len] = 0;
|
||||||
|
|
||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
|
|
|
@ -271,10 +271,49 @@ batteries_find(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#elif defined(__linux__)
|
|
||||||
|
|
||||||
#elif defined(__FreeBSD__)
|
#elif defined(__FreeBSD__)
|
||||||
|
#elif defined(__linux__)
|
||||||
|
char *type;
|
||||||
|
struct dirent **names;
|
||||||
|
char *buf;
|
||||||
|
char path[PATH_MAX];
|
||||||
|
int i, n;
|
||||||
|
|
||||||
|
n = scandir("/sys/class/power_supply", &names, 0, alphasort);
|
||||||
|
if (n < 0) return 0;
|
||||||
|
|
||||||
|
for (i = 0; i < n; i++) {
|
||||||
|
snprintf(path, sizeof(path), "/sys/class/power_supply/%s/type", names[i]->d_name);
|
||||||
|
type = file_contents(path);
|
||||||
|
if (type)
|
||||||
|
{
|
||||||
|
if (!strncmp(type, "Battery", 7))
|
||||||
|
{
|
||||||
|
Battery *bat = calloc(1, sizeof(Battery));
|
||||||
|
if (bat)
|
||||||
|
{
|
||||||
|
bat->name = strdup(names[i]->d_name);
|
||||||
|
snprintf(path, sizeof(path), "/sys/class/power_supply/%s/manufacturer", names[i]->d_name);
|
||||||
|
bat->vendor = file_contents(path);
|
||||||
|
snprintf(path, sizeof(path), "/sys/class/power_supply/%s/model_name", names[i]->d_name);
|
||||||
|
bat->model = file_contents(path);
|
||||||
|
snprintf(path, sizeof(path), "/sys/class/power_supply/%s/present", names[i]->d_name);
|
||||||
|
bat->present = 1;
|
||||||
|
buf = file_contents(path);
|
||||||
|
if (buf)
|
||||||
|
{
|
||||||
|
bat->present = atoi(buf);
|
||||||
|
free(buf);
|
||||||
|
}
|
||||||
|
list = eina_list_append(list, bat);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
free(type);
|
||||||
|
}
|
||||||
|
free(names[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
free(names);
|
||||||
#endif
|
#endif
|
||||||
puts("AYE");
|
puts("AYE");
|
||||||
return list;
|
return list;
|
||||||
|
@ -313,50 +352,6 @@ _power_battery_count_get(power_t *power)
|
||||||
power->batteries[i]->present = true;
|
power->batteries[i]->present = true;
|
||||||
}
|
}
|
||||||
#elif defined(__linux__)
|
#elif defined(__linux__)
|
||||||
char *type;
|
|
||||||
struct dirent **names;
|
|
||||||
char *buf;
|
|
||||||
char path[PATH_MAX];
|
|
||||||
int i, n, id;
|
|
||||||
|
|
||||||
n = scandir("/sys/class/power_supply", &names, 0, alphasort);
|
|
||||||
if (n < 0) return power->battery_count;
|
|
||||||
|
|
||||||
for (i = 0; i < n; i++) {
|
|
||||||
snprintf(path, sizeof(path), "/sys/class/power_supply/%s/type", names[i]->d_name);
|
|
||||||
type = file_contents(path);
|
|
||||||
if (type)
|
|
||||||
{
|
|
||||||
if (!strncmp(type, "Battery", 7))
|
|
||||||
{
|
|
||||||
id = power->battery_count;
|
|
||||||
void *t = realloc(power->batteries, (1 +
|
|
||||||
power->battery_count) * sizeof(bat_t **));
|
|
||||||
power->batteries = t;
|
|
||||||
power->batteries[id] = calloc(1, sizeof(bat_t));
|
|
||||||
power->batteries[id]->name = strdup(names[i]->d_name);
|
|
||||||
snprintf(path, sizeof(path), "/sys/class/power_supply/%s/manufacturer", names[i]->d_name);
|
|
||||||
power->batteries[id]->vendor = file_contents(path);
|
|
||||||
snprintf(path, sizeof(path), "/sys/class/power_supply/%s/model_name", names[i]->d_name);
|
|
||||||
power->batteries[id]->model = file_contents(path);
|
|
||||||
snprintf(path, sizeof(path), "/sys/class/power_supply/%s/present", names[i]->d_name);
|
|
||||||
power->batteries[id]->present = 1;
|
|
||||||
buf = file_contents(path);
|
|
||||||
if (buf)
|
|
||||||
{
|
|
||||||
power->batteries[id]->present = atoi(buf);
|
|
||||||
free(buf);
|
|
||||||
}
|
|
||||||
|
|
||||||
power->battery_count++;
|
|
||||||
}
|
|
||||||
free(type);
|
|
||||||
}
|
|
||||||
|
|
||||||
free(names[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
free(names);
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -399,6 +394,79 @@ battery_check(Battery *bat)
|
||||||
#elif defined(__FreeBSD__)
|
#elif defined(__FreeBSD__)
|
||||||
|
|
||||||
#elif defined(__linux__)
|
#elif defined(__linux__)
|
||||||
|
char path[PATH_MAX];
|
||||||
|
struct dirent *dh;
|
||||||
|
struct stat st;
|
||||||
|
DIR *dir;
|
||||||
|
char *buf, *link = NULL, *naming = NULL;
|
||||||
|
|
||||||
|
naming = NULL;
|
||||||
|
|
||||||
|
snprintf(path, sizeof(path), "/sys/class/power_supply/%s", bat->name);
|
||||||
|
|
||||||
|
if ((stat(path, &st) < 0) || (!S_ISDIR(st.st_mode)))
|
||||||
|
return;
|
||||||
|
|
||||||
|
link = realpath(path, NULL);
|
||||||
|
if (!link) return;
|
||||||
|
|
||||||
|
dir = opendir(path);
|
||||||
|
if (!dir)
|
||||||
|
goto done;
|
||||||
|
|
||||||
|
while ((dh = readdir(dir)) != NULL)
|
||||||
|
{
|
||||||
|
char *e;
|
||||||
|
if (dh->d_name[0] == '.') continue;
|
||||||
|
|
||||||
|
if ((e = strstr(dh->d_name, "_full\0")))
|
||||||
|
{
|
||||||
|
naming = strndup(dh->d_name, e - dh->d_name);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
closedir(dir);
|
||||||
|
|
||||||
|
if (naming)
|
||||||
|
{
|
||||||
|
snprintf(path, sizeof(path), "%s/%s_full", link, naming);
|
||||||
|
buf = file_contents(path);
|
||||||
|
if (buf)
|
||||||
|
{
|
||||||
|
charge_full = atol(buf);
|
||||||
|
free(buf);
|
||||||
|
}
|
||||||
|
snprintf(path, sizeof(path), "%s/%s_now", link, naming);
|
||||||
|
buf = file_contents(path);
|
||||||
|
if (buf)
|
||||||
|
{
|
||||||
|
charge_current = atol(buf);
|
||||||
|
free(buf);
|
||||||
|
}
|
||||||
|
free(naming);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Fallback to "coarse" representation.
|
||||||
|
snprintf(path, sizeof(path), "%s/capacity_level", link);
|
||||||
|
buf = file_contents(path);
|
||||||
|
if (buf)
|
||||||
|
{
|
||||||
|
if (buf[0] == 'F')
|
||||||
|
bat->charge_current = 100;
|
||||||
|
else if (buf[0] == 'H')
|
||||||
|
bat->charge_current = 75;
|
||||||
|
else if (buf[0] == 'N')
|
||||||
|
bat->charge_current = 50;
|
||||||
|
else if (buf[0] == 'L')
|
||||||
|
bat->charge_current = 25;
|
||||||
|
else if (buf[0] == 'C')
|
||||||
|
bat->charge_current = 5;
|
||||||
|
free(buf);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
done:
|
||||||
|
if (link) free(link);
|
||||||
|
|
||||||
#else
|
#else
|
||||||
#endif
|
#endif
|
||||||
|
@ -406,7 +474,8 @@ battery_check(Battery *bat)
|
||||||
bat->charge_full = charge_full;
|
bat->charge_full = charge_full;
|
||||||
bat->charge_current = charge_current;
|
bat->charge_current = charge_current;
|
||||||
|
|
||||||
bat->percent = 100 * (charge_full / charge_current);
|
if (charge_full && charge_current)
|
||||||
|
bat->percent = 100 * (charge_full / charge_current);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -440,83 +509,6 @@ _battery_state_get(power_t *power)
|
||||||
close(fd);
|
close(fd);
|
||||||
|
|
||||||
#elif defined(__linux__)
|
#elif defined(__linux__)
|
||||||
char path[PATH_MAX];
|
|
||||||
struct dirent *dh;
|
|
||||||
struct stat st;
|
|
||||||
DIR *dir;
|
|
||||||
char *buf, *link = NULL, *naming = NULL;
|
|
||||||
|
|
||||||
|
|
||||||
for (int i = 0; i < power->battery_count; i++) {
|
|
||||||
naming = NULL;
|
|
||||||
|
|
||||||
snprintf(path, sizeof(path), "/sys/class/power_supply/%s", power->batteries[i]->name);
|
|
||||||
|
|
||||||
if ((stat(path, &st) < 0) || (!S_ISDIR(st.st_mode)))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
link = realpath(path, NULL);
|
|
||||||
if (!link) return;
|
|
||||||
|
|
||||||
dir = opendir(path);
|
|
||||||
if (!dir)
|
|
||||||
goto done;
|
|
||||||
|
|
||||||
while ((dh = readdir(dir)) != NULL)
|
|
||||||
{
|
|
||||||
char *e;
|
|
||||||
if (dh->d_name[0] == '.') continue;
|
|
||||||
|
|
||||||
if ((e = strstr(dh->d_name, "_full\0")))
|
|
||||||
{
|
|
||||||
naming = strndup(dh->d_name, e - dh->d_name);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
closedir(dir);
|
|
||||||
|
|
||||||
if (naming)
|
|
||||||
{
|
|
||||||
snprintf(path, sizeof(path), "%s/%s_full", link, naming);
|
|
||||||
buf = file_contents(path);
|
|
||||||
if (buf)
|
|
||||||
{
|
|
||||||
power->batteries[i]->charge_full = atol(buf);
|
|
||||||
free(buf);
|
|
||||||
}
|
|
||||||
snprintf(path, sizeof(path), "%s/%s_now", link, naming);
|
|
||||||
buf = file_contents(path);
|
|
||||||
if (buf)
|
|
||||||
{
|
|
||||||
power->batteries[i]->charge_current = atol(buf);
|
|
||||||
free(buf);
|
|
||||||
}
|
|
||||||
free(naming);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Fallback to "coarse" representation.
|
|
||||||
snprintf(path, sizeof(path), "%s/capacity_level", link);
|
|
||||||
buf = file_contents(path);
|
|
||||||
if (buf)
|
|
||||||
{
|
|
||||||
power->batteries[i]->charge_full = 100;
|
|
||||||
if (buf[0] == 'F')
|
|
||||||
power->batteries[i]->charge_current = 100;
|
|
||||||
else if (buf[0] == 'H')
|
|
||||||
power->batteries[i]->charge_current = 75;
|
|
||||||
else if (buf[0] == 'N')
|
|
||||||
power->batteries[i]->charge_current = 50;
|
|
||||||
else if (buf[0] == 'L')
|
|
||||||
power->batteries[i]->charge_current = 25;
|
|
||||||
else if (buf[0] == 'C')
|
|
||||||
power->batteries[i]->charge_current = 5;
|
|
||||||
free(buf);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
done:
|
|
||||||
if (link) free(link);
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue