forked from enlightenment/enlightenment
battery modules now... works... in theory. i have to test it on a real
laptop... SVN revision: 12600
This commit is contained in:
parent
2134890874
commit
b8112af500
|
@ -268,6 +268,7 @@ images {
|
|||
image: "e17_battery_080.png" COMP;
|
||||
image: "e17_battery_090.png" COMP;
|
||||
image: "e17_battery_100.png" COMP;
|
||||
image: "e17_battery_ac.png" COMP;
|
||||
}
|
||||
|
||||
collections {
|
||||
|
@ -5204,9 +5205,19 @@ collections {
|
|||
group {
|
||||
name: "modules/battery/main";
|
||||
max: 128 128;
|
||||
script {
|
||||
public message(Msg_Type:type, id, ...) {
|
||||
if ((type == MSG_FLOAT) && (id == 1)) {
|
||||
new Float:val;
|
||||
val = getfarg(2);
|
||||
set_state(PART:"battery", "default", val);
|
||||
}
|
||||
}
|
||||
}
|
||||
parts {
|
||||
part {
|
||||
name: "battery";
|
||||
clip_to: "fade_clip";
|
||||
description {
|
||||
state: "default" 0.0;
|
||||
aspect: 0.669291339 0.669291339;
|
||||
|
@ -5297,6 +5308,7 @@ collections {
|
|||
name: "reading";
|
||||
type: TEXT;
|
||||
effect: SOFT_SHADOW;
|
||||
clip_to: "fade_clip";
|
||||
description {
|
||||
state: "default" 0.0;
|
||||
align: 1.0 0.0;
|
||||
|
@ -5305,7 +5317,7 @@ collections {
|
|||
to_x: "battery";
|
||||
}
|
||||
rel2 {
|
||||
relative: 1.0 1.0;
|
||||
relative: 1.0 0.0;
|
||||
}
|
||||
color: 255 255 255 255;
|
||||
color3: 0 0 0 32;
|
||||
|
@ -5314,9 +5326,112 @@ collections {
|
|||
font: "Edje Vera";
|
||||
size: 7;
|
||||
min: 1 1;
|
||||
align: 0.0 0.0;
|
||||
}
|
||||
}
|
||||
align: 1.0 0.0;
|
||||
}
|
||||
}
|
||||
}
|
||||
part {
|
||||
name: "time";
|
||||
type: TEXT;
|
||||
effect: SOFT_SHADOW;
|
||||
clip_to: "fade_clip";
|
||||
description {
|
||||
state: "default" 0.0;
|
||||
align: 1.0 0.0;
|
||||
rel1 {
|
||||
relative: 1.0 1.0;
|
||||
to_x: "battery";
|
||||
to_y: "reading";
|
||||
}
|
||||
rel2 {
|
||||
relative: 1.0 1.0;
|
||||
to_y: "reading";
|
||||
}
|
||||
color: 255 255 255 255;
|
||||
color3: 0 0 0 32;
|
||||
text {
|
||||
text: "00:00";
|
||||
font: "Edje Vera";
|
||||
size: 7;
|
||||
min: 1 1;
|
||||
align: 1.0 0.0;
|
||||
}
|
||||
}
|
||||
}
|
||||
part {
|
||||
name: "ac";
|
||||
clip_to: "fade_clip";
|
||||
description {
|
||||
state: "default" 0.0;
|
||||
aspect: 0.975609756 0.975609756;
|
||||
align: 1.0 1.0;
|
||||
max: 40 41;
|
||||
visible: 0;
|
||||
rel1 {
|
||||
relative: 0.5 0.5;
|
||||
}
|
||||
rel2 {
|
||||
relative: 1.0 1.0;
|
||||
}
|
||||
image {
|
||||
normal: "e17_battery_ac.png";
|
||||
}
|
||||
}
|
||||
description {
|
||||
state: "active" 0.0;
|
||||
inherit: "default" 0.0;
|
||||
visible: 1;
|
||||
}
|
||||
}
|
||||
part {
|
||||
name: "fade_clip";
|
||||
type: RECT;
|
||||
mouse_events: 0;
|
||||
description {
|
||||
state: "default" 0.0;
|
||||
color: 255 255 255 255;
|
||||
}
|
||||
description {
|
||||
state: "faded" 0.0;
|
||||
color: 255 255 255 128;
|
||||
}
|
||||
}
|
||||
}
|
||||
programs {
|
||||
program {
|
||||
name: "charge";
|
||||
signal: "charge";
|
||||
source: "";
|
||||
action: STATE_SET "default" 0.0;
|
||||
target: "fade_clip";
|
||||
}
|
||||
program {
|
||||
name: "charge2";
|
||||
signal: "charge";
|
||||
source: "";
|
||||
action: STATE_SET "active" 0.0;
|
||||
target: "ac";
|
||||
}
|
||||
program {
|
||||
name: "discharge";
|
||||
signal: "discharge";
|
||||
source: "";
|
||||
action: STATE_SET "default" 0.0;
|
||||
target: "fade_clip";
|
||||
}
|
||||
program {
|
||||
name: "discharge2";
|
||||
signal: "discharge";
|
||||
source: "";
|
||||
action: STATE_SET "default" 0.0;
|
||||
target: "ac";
|
||||
}
|
||||
program {
|
||||
name: "unknown";
|
||||
signal: "unknown";
|
||||
source: "";
|
||||
action: STATE_SET "faded" 0.0;
|
||||
target: "fade_clip";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -242,4 +242,5 @@ e17_battery_060.png \
|
|||
e17_battery_070.png \
|
||||
e17_battery_080.png \
|
||||
e17_battery_090.png \
|
||||
e17_battery_100.png
|
||||
e17_battery_100.png \
|
||||
e17_battery_ac.png
|
||||
|
|
Binary file not shown.
After Width: | Height: | Size: 2.5 KiB |
|
@ -19,6 +19,10 @@ static void _battery_cb_face_down(void *data, Evas *e, Evas_Object *obj, voi
|
|||
static void _battery_cb_face_up(void *data, Evas *e, Evas_Object *obj, void *event_info);
|
||||
static void _battery_cb_face_move(void *data, Evas *e, Evas_Object *obj, void *event_info);
|
||||
static int _battery_cb_event_container_resize(void *data, int type, void *event);
|
||||
static int _battery_cb_check(void *data);
|
||||
static int _battery_linux_acpi_check(Battery_Face *ef);
|
||||
static int _battery_linux_apm_check(Battery_Face *ef);
|
||||
static void _battery_level_set(Battery_Face *ef, double level);
|
||||
|
||||
/* public module routines. all modules must have these */
|
||||
void *
|
||||
|
@ -222,6 +226,14 @@ _battery_face_init(Battery_Face *ef)
|
|||
|
||||
_battery_face_reconfigure(ef);
|
||||
|
||||
ef->battery_check_mode = CHECK_NONE;
|
||||
ef->battery_prev_drain = 1;
|
||||
ef->battery_prev_ac = -1;
|
||||
ef->battery_prev_battery = -1;
|
||||
ef->battery_check_timer = ecore_timer_add(5.0, _battery_cb_check, ef);
|
||||
|
||||
_battery_cb_check(ef);
|
||||
|
||||
evas_event_thaw(ef->evas);
|
||||
}
|
||||
|
||||
|
@ -347,3 +359,318 @@ _battery_cb_event_container_resize(void *data, int type, void *event)
|
|||
_battery_face_reconfigure(ef);
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int
|
||||
_battery_cb_check(void *data)
|
||||
{
|
||||
Battery_Face *ef;
|
||||
int ret = 0;
|
||||
|
||||
ef = data;
|
||||
if (ef->battery_check_mode == 0)
|
||||
{
|
||||
if (e_file_is_dir("/proc/acpi"))
|
||||
ef->battery_check_mode = CHECK_LINUX_ACPI;
|
||||
else if (e_file_is_dir("/proc/apm"))
|
||||
ef->battery_check_mode = CHECK_LINUX_APM;
|
||||
}
|
||||
switch (ef->battery_check_mode)
|
||||
{
|
||||
case CHECK_LINUX_ACPI:
|
||||
ret = _battery_linux_acpi_check(ef);
|
||||
break;
|
||||
case CHECK_LINUX_APM:
|
||||
ret = _battery_linux_acpi_check(ef);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
if (!ret)
|
||||
{
|
||||
if (ef->battery_prev_battery != -2)
|
||||
{
|
||||
edje_object_signal_emit(ef->bat_object, "unknown", "");
|
||||
ef->battery_prev_battery = -2;
|
||||
}
|
||||
edje_object_part_text_set(ef->bat_object, "reading", "NO INFO");
|
||||
edje_object_part_text_set(ef->bat_object, "time", "--:--");
|
||||
ef->battery_check_mode = CHECK_NONE;
|
||||
_battery_level_set(ef, (double)(rand() & 0xff) / 255.0);
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int
|
||||
_battery_linux_acpi_check(Battery_Face *ef)
|
||||
{
|
||||
Evas_List *bats;
|
||||
char buf[4096], buf2[4096];
|
||||
|
||||
int bat_max = 0;
|
||||
int bat_filled = 0;
|
||||
int bat_level = 0;
|
||||
int bat_drain = 1;
|
||||
|
||||
int bat_val = 0;
|
||||
|
||||
char current_status[256];
|
||||
int discharging = 0;
|
||||
int charging = 0;
|
||||
int battery = 0;
|
||||
|
||||
int design_cap_unknown = 0;
|
||||
int last_full_unknown = 0;
|
||||
int rate_unknown = 0;
|
||||
int level_unknown = 0;
|
||||
|
||||
int hours, minutes;
|
||||
|
||||
/* Read some information on first run. */
|
||||
bats = e_file_ls("/proc/acpi/battery");
|
||||
if (!bats) return 0;
|
||||
while (bats)
|
||||
{
|
||||
FILE *f;
|
||||
char *name;
|
||||
|
||||
name = bats->data;
|
||||
if ((!strcmp(name, ".")) || (!strcmp(name, "..")))
|
||||
{
|
||||
bats = evas_list_remove_list(bats, bats);
|
||||
free(name);
|
||||
continue;
|
||||
}
|
||||
snprintf(buf, sizeof(buf), "/proc/acpi/battery/%s/info", name);
|
||||
f = fopen(buf, "r");
|
||||
if (f)
|
||||
{
|
||||
int design_cap = 0;
|
||||
int last_full = 0;
|
||||
|
||||
fgets(buf2, sizeof(buf2), f); buf[sizeof(buf2) - 1] = 0;
|
||||
fgets(buf2, sizeof(buf2), f); buf[sizeof(buf2) - 1] = 0;
|
||||
sscanf(buf2, "%*[^:]: %250s %*s", buf);
|
||||
if (!strcmp(buf, "unknown")) design_cap_unknown = 1;
|
||||
else sscanf(buf2, "%*[^:]: %i %*s", &design_cap);
|
||||
fgets(buf2, sizeof(buf2), f); buf[sizeof(buf2) - 1] = 0;
|
||||
sscanf(buf2, "%*[^:]: %250s %*s", buf);
|
||||
if (!strcmp(buf, "unknown")) last_full_unknown = 1;
|
||||
else sscanf(buf2, "%*[^:]: %i %*s", &last_full);
|
||||
fclose(f);
|
||||
bat_max += design_cap;
|
||||
bat_filled += last_full;
|
||||
}
|
||||
snprintf(buf, sizeof(buf), "/proc/acpi/battery/%s/state", name);
|
||||
f = fopen(buf, "r");
|
||||
if (f)
|
||||
{
|
||||
char present[256];
|
||||
char capacity_state[256];
|
||||
char charging_state[256];
|
||||
int rate = 1;
|
||||
int level = 0;
|
||||
|
||||
fgets(buf2, sizeof(buf2), f); buf[sizeof(buf2) - 1] = 0;
|
||||
sscanf(buf2, "%*[^:]: %250s", present);
|
||||
fgets(buf2, sizeof(buf2), f); buf[sizeof(buf2) - 1] = 0;
|
||||
sscanf(buf2, "%*[^:]: %250s", capacity_state);
|
||||
fgets(buf2, sizeof(buf2), f); buf[sizeof(buf2) - 1] = 0;
|
||||
sscanf(buf2, "%*[^:]: %250s", charging_state);
|
||||
fgets(buf2, sizeof(buf2), f); buf[sizeof(buf2) - 1] = 0;
|
||||
sscanf(buf2, "%*[^:]: %250s %*s", buf);
|
||||
if (!strcmp(buf, "unknown")) rate_unknown = 1;
|
||||
else sscanf(buf2, "%*[^:]: %i %*s", &rate);
|
||||
fgets(buf2, sizeof(buf2), f); buf[sizeof(buf2) - 1] = 0;
|
||||
sscanf(buf2, "%*[^:]: %250s %*s", buf);
|
||||
if (!strcmp(buf, "unknown")) level_unknown = 1;
|
||||
else sscanf(buf2, "%*[^:]: %i %*s", &level);
|
||||
fclose(f);
|
||||
if (!strcmp(present, "yes")) battery++;
|
||||
if (!strcmp(charging_state, "discharging")) discharging++;
|
||||
if (!strcmp(charging_state, "charging")) charging++;
|
||||
bat_drain += rate;
|
||||
bat_level += level;
|
||||
}
|
||||
bats = evas_list_remove_list(bats, bats);
|
||||
free(name);
|
||||
}
|
||||
if (ef->battery_prev_drain < 1) ef->battery_prev_drain = 1;
|
||||
if (bat_drain < 1) bat_drain = ef->battery_prev_drain;
|
||||
ef->battery_prev_drain = bat_drain;
|
||||
|
||||
if (bat_filled > 0) bat_val = (100 * bat_level) / bat_filled;
|
||||
else bat_val = 100;
|
||||
|
||||
if (discharging) minutes = (60 * bat_level) / bat_drain;
|
||||
else
|
||||
{
|
||||
if (bat_filled > 0)
|
||||
minutes = (60 * (bat_filled - bat_level)) / bat_drain;
|
||||
else
|
||||
minutes = 0;
|
||||
}
|
||||
hours = minutes / 60;
|
||||
minutes -= (hours * 60);
|
||||
|
||||
if ((charging) || (discharging))
|
||||
{
|
||||
ef->battery_prev_battery = 1;
|
||||
if ((charging ) && (ef->battery_prev_ac == 0))
|
||||
{
|
||||
edje_object_signal_emit(ef->bat_object, "charge", "");
|
||||
ef->battery_prev_ac = 1;
|
||||
}
|
||||
else if ((discharging) && (ef->battery_prev_ac == 1))
|
||||
{
|
||||
edje_object_signal_emit(ef->bat_object, "discharge", "");
|
||||
ef->battery_prev_ac = 0;
|
||||
}
|
||||
if (level_unknown)
|
||||
{
|
||||
edje_object_part_text_set(ef->bat_object, "reading", "BAD DIRVER");
|
||||
edje_object_part_text_set(ef->bat_object, "time", "--:--");
|
||||
_battery_level_set(ef, 0.0);
|
||||
}
|
||||
else if (rate_unknown)
|
||||
{
|
||||
snprintf(buf, sizeof(buf), "%i%%", bat_val);
|
||||
edje_object_part_text_set(ef->bat_object, "reading", buf);
|
||||
edje_object_part_text_set(ef->bat_object, "time", "--:--");
|
||||
_battery_level_set(ef, (double)bat_val / 100.0);
|
||||
}
|
||||
else
|
||||
{
|
||||
snprintf(buf, sizeof(buf), "%i%%", bat_val);
|
||||
edje_object_part_text_set(ef->bat_object, "reading", buf);
|
||||
snprintf(buf, sizeof(buf), "%i:%02i", hours, minutes);
|
||||
edje_object_part_text_set(ef->bat_object, "time", buf);
|
||||
_battery_level_set(ef, (double)bat_val / 100.0);
|
||||
}
|
||||
}
|
||||
else if (!battery)
|
||||
{
|
||||
if (ef->battery_prev_battery != 0)
|
||||
{
|
||||
edje_object_signal_emit(ef->bat_object, "unknown", "");
|
||||
ef->battery_prev_battery = 0;
|
||||
}
|
||||
edje_object_part_text_set(ef->bat_object, "reading", "NO BAT");
|
||||
edje_object_part_text_set(ef->bat_object, "time", "--:--");
|
||||
_battery_level_set(ef, 1.0);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (ef->battery_prev_battery == 0)
|
||||
{
|
||||
edje_object_signal_emit(ef->bat_object, "charge", "");
|
||||
ef->battery_prev_battery = 1;
|
||||
}
|
||||
edje_object_part_text_set(ef->bat_object, "reading", "FULL");
|
||||
edje_object_part_text_set(ef->bat_object, "time", "--:--");
|
||||
_battery_level_set(ef, 1.0);
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int
|
||||
_battery_linux_apm_check(Battery_Face *ef)
|
||||
{
|
||||
FILE *f;
|
||||
char s[256], s1[32], s2[32], s3[32], buf[4096];
|
||||
int apm_flags, ac_stat, bat_stat, bat_flags, bat_val, time_val;
|
||||
int hours, minutes;
|
||||
|
||||
f = fopen("/proc/apm", "r");
|
||||
if (!f) return 0;
|
||||
|
||||
fgets(s, sizeof(s), f); s[sizeof(s) - 1] = 0;
|
||||
if (sscanf(s, "%*s %*s %x %x %x %x %s %s %s",
|
||||
&apm_flags, &ac_stat, &bat_stat, &bat_flags, s1, s2, s3) != 7)
|
||||
{
|
||||
fclose(f);
|
||||
return 0;
|
||||
}
|
||||
s1[strlen(s1) - 1] = 0;
|
||||
bat_val = atoi(s1);
|
||||
if (!strcmp(s3, "sec")) time_val = atoi(s2);
|
||||
else if (!strcmp(s3, "min")) time_val = atoi(s2) * 60;
|
||||
fclose(f);
|
||||
|
||||
if ((bat_flags != 0xff) && (bat_flags & 0x80))
|
||||
{
|
||||
if (ef->battery_prev_battery != 0)
|
||||
{
|
||||
edje_object_signal_emit(ef->bat_object, "unknown", "");
|
||||
ef->battery_prev_battery = 0;
|
||||
}
|
||||
edje_object_part_text_set(ef->bat_object, "reading", "NO BAT");
|
||||
edje_object_part_text_set(ef->bat_object, "time", "--:--");
|
||||
_battery_level_set(ef, 1.0);
|
||||
}
|
||||
else
|
||||
{
|
||||
ef->battery_prev_battery = 1;
|
||||
if (bat_val > 0)
|
||||
{
|
||||
snprintf(buf, sizeof(buf), "%i%%", bat_val);
|
||||
edje_object_part_text_set(ef->bat_object, "reading", buf);
|
||||
_battery_level_set(ef, (double)bat_val / 100.0);
|
||||
}
|
||||
else
|
||||
{
|
||||
switch( bat_stat )
|
||||
{
|
||||
case 0:
|
||||
edje_object_part_text_set(ef->bat_object, "reading", "High");
|
||||
_battery_level_set(ef, 1.0);
|
||||
break;
|
||||
case 1:
|
||||
edje_object_part_text_set(ef->bat_object, "reading", "Low");
|
||||
_battery_level_set(ef, 0.50);
|
||||
break;
|
||||
case 2:
|
||||
edje_object_part_text_set(ef->bat_object, "reading", "Danger");
|
||||
_battery_level_set(ef, 0.25);
|
||||
break;
|
||||
case 3:
|
||||
edje_object_part_text_set(ef->bat_object, "reading", "Charge");
|
||||
_battery_level_set(ef, 1.0);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (ac_stat == 1)
|
||||
{
|
||||
if ((ac_stat == 1) && (ef->battery_prev_ac == 0))
|
||||
{
|
||||
edje_object_signal_emit(ef->bat_object, "charge", "");
|
||||
ef->battery_prev_ac = 1;
|
||||
}
|
||||
else if ((ac_stat == 0) && (ef->battery_prev_ac == 1))
|
||||
{
|
||||
edje_object_signal_emit(ef->bat_object, "discharge", "");
|
||||
ef->battery_prev_ac = 0;
|
||||
}
|
||||
edje_object_part_text_set(ef->bat_object, "time", "--:--");
|
||||
}
|
||||
else
|
||||
{
|
||||
hours = time_val / 3600;
|
||||
minutes = (time_val / 60) % 60;
|
||||
snprintf(buf, sizeof(buf), "%i:%02i", hours, minutes);
|
||||
edje_object_part_text_set(ef->bat_object, "time", buf);
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
static void
|
||||
_battery_level_set(Battery_Face *ef, double level)
|
||||
{
|
||||
Edje_Message_Float msg;
|
||||
|
||||
if (level < 0.0) level = 0.0;
|
||||
else if (level > 1.0) level = 1.0;
|
||||
msg.val = level;
|
||||
edje_object_message_send(ef->bat_object, EDJE_MESSAGE_FLOAT, 1, &msg);
|
||||
}
|
||||
|
|
|
@ -5,6 +5,10 @@ typedef struct _Config Config;
|
|||
typedef struct _Battery Battery;
|
||||
typedef struct _Battery_Face Battery_Face;
|
||||
|
||||
#define CHECK_NONE 0
|
||||
#define CHECK_LINUX_ACPI 1
|
||||
#define CHECK_LINUX_APM 2
|
||||
|
||||
struct _Config
|
||||
{
|
||||
int width;
|
||||
|
@ -36,6 +40,12 @@ struct _Battery_Face
|
|||
Evas_Coord xx, yy;
|
||||
Evas_Coord fx, fy, fw;
|
||||
|
||||
int battery_check_mode;
|
||||
Ecore_Timer *battery_check_timer;
|
||||
int battery_prev_drain;
|
||||
int battery_prev_ac;
|
||||
int battery_prev_battery;
|
||||
|
||||
Ecore_Event_Handler *ev_handler_container_resize;
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in New Issue