battery modules now... works... in theory. i have to test it on a real

laptop...


SVN revision: 12600
This commit is contained in:
Carsten Haitzler 2004-12-27 10:49:46 +00:00
parent 2134890874
commit b8112af500
5 changed files with 457 additions and 4 deletions

View File

@ -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,10 +5326,113 @@ 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";
}
}
}
}

View File

@ -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

View File

@ -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);
}

View File

@ -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;
@ -35,7 +39,13 @@ struct _Battery_Face
unsigned char resize : 1;
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;
};