В общем, в свободное от игрулек и праздников с выходными время, я таки родил такой код:
#if defined __linux__
#define BAT_PATH "/sys/class/power_supply/BAT0"
#define BAT_DCAP "/sys/class/power_supply/BAT0/charge_full_design"
#define BAT_RCAP "/sys/class/power_supply/BAT0/charge_now"
#define BAT_STAT "/sys/class/power_supply/BAT0/status"
static void
battery_update_os(battery_priv *c)
{
gchar *buf;
gboolean ret = FALSE, charging = FALSE;
int dcap = 0, rcap = 0;
ENTER;
ret = g_file_test(BAT_PATH, G_FILE_TEST_EXISTS);
if (!ret)
goto exit;
// Read designed capcity
ret = g_file_get_contents(BAT_DCAP, &buf, 0, NULL);
if (!ret)
goto exit;
sscanf(buf, "%d", &dcap);
g_free(buf);
// Read remaing capacity
ret = g_file_get_contents(BAT_RCAP, &buf, 0, NULL);
if (!ret)
goto exit;
sscanf(buf, "%d", &rcap);
g_free(buf);
// Read battery status
ret = g_file_get_contents(BAT_STAT, &buf, 0, NULL);
if (!ret)
goto exit;
charging = (strcmp(buf, "Charging\n") == 0);
g_free(buf);
// Set values
c->exist = TRUE;
c->level = (int) ((gfloat) rcap * 100 / (gfloat) dcap);
c->charging = charging;
exit:
RET(ret);
}
#else
static void
battery_update_os(battery_priv *c)
{
c->exist = FALSE;
}
#endif
В нем еще можно добавить альтернативные имена для charge* (типа energy*), но это скучно. Как передавать батарею через конфиг - я еще не разобрался. Там механизм сложнее, чем кажется на первый взгляд.
Зато придумал, что нужно запилить полюбому - время работы от батареи и время до полной зарядки. Такая штука есть в тинте, но я не совсем разобрался, по этому и решил запостить вопрос:
//Здесь energy_full - /sys/class/power_supply/BATN/charge_full
//Здесь energy_now - /sys/class/power_supply/BATN/charge_now
//Здесь current_now - /sys/class/power_supply/BATN/current_now
if(current_now > 0) {
switch(battery_state.state) {
case BATTERY_CHARGING:
seconds = 3600 * (energy_full - energy_now) / current_now;
break;
case BATTERY_DISCHARGING:
seconds = 3600 * energy_now / current_now;
break;
default:
seconds = 0;
break;
}
} else seconds = 0;
//... вычисляем время
Ну и вопросы:
- 3600 - что же час времени?
- Почему за energy_full берут charge_full, а не charge_full_design? Или в charge_full отражается деградация батареи?
- Cамое главное - что такое current_now? Потребление энергии в данный момент времени?
Выручайте :)