2
* * Copyright (C) 2008-2009 Ali <aliov@xfce.org>
4
* Licensed under the GNU General Public License Version 2
6
* This program is free software; you can redistribute it and/or modify
7
* it under the terms of the GNU General Public License as published by
8
* the Free Software Foundation; either version 2 of the License, or
9
* (at your option) any later version.
11
* This program is distributed in the hope that it will be useful,
12
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
* GNU General Public License for more details.
16
* You should have received a copy of the GNU General Public License
17
* along with this program; if not, write to the Free Software
18
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
30
#include <glib/gi18n.h>
32
#include "hal-battery.h"
33
#include "hal-manager.h"
36
static void hal_battery_finalize (GObject *object);
38
static void hal_battery_get_property(GObject *object,
43
#define HAL_BATTERY_GET_PRIVATE(o) \
44
(G_TYPE_INSTANCE_GET_PRIVATE((o), HAL_TYPE_BATTERY, HalBatteryPrivate))
46
#define FREE_STR_PROP(str) \
51
struct HalBatteryPrivate
53
/* Properties read-only */
58
gboolean is_discharging;
62
guint32 current_charge;
65
guint32 reporting_design;
66
guint32 reporting_last_full;
81
PROP_REPORTING_DESIGN,
83
PROP_REPORTING_LAST_FULL,
97
static guint signals[LAST_SIGNAL] = { 0 };
99
G_DEFINE_TYPE(HalBattery, hal_battery, HAL_TYPE_DEVICE)
102
hal_battery_get_info_string (HalBattery *battery, const gchar *key)
106
if ( hal_device_has_key (HAL_DEVICE (battery), key) )
108
val = hal_device_get_property_string (HAL_DEVICE(battery), key);
115
hal_battery_class_init(HalBatteryClass *klass)
117
GObjectClass *object_class = G_OBJECT_CLASS(klass);
119
object_class->get_property = hal_battery_get_property;
120
object_class->finalize = hal_battery_finalize;
122
signals[BATTERY_CHANGED] =
123
g_signal_new("battery-changed",
126
G_STRUCT_OFFSET(HalBatteryClass, battery_changed),
128
g_cclosure_marshal_VOID__VOID,
129
G_TYPE_NONE, 0, G_TYPE_NONE);
131
g_object_class_install_property(object_class,
133
g_param_spec_boolean("is-present",
138
g_object_class_install_property(object_class,
140
g_param_spec_boolean("is-charging",
145
g_object_class_install_property(object_class,
147
g_param_spec_boolean("is-discharging",
151
g_object_class_install_property(object_class,
153
g_param_spec_uint("current-charge",
160
g_object_class_install_property(object_class,
162
g_param_spec_uint("last-full",
169
g_object_class_install_property(object_class,
170
PROP_REPORTING_DESIGN,
171
g_param_spec_uint("reporting-design",
177
g_object_class_install_property(object_class,
178
PROP_REPORTING_LAST_FULL,
179
g_param_spec_uint("reporting-last-full",
185
g_object_class_install_property(object_class,
187
g_param_spec_uint("time",
193
g_object_class_install_property(object_class,
195
g_param_spec_uint("type",
198
HAL_DEVICE_TYPE_UNKNOWN,
199
HAL_DEVICE_TYPE_UNKNOWN,
201
g_object_class_install_property(object_class,
203
g_param_spec_uint("percentage",
210
g_object_class_install_property(object_class,
212
g_param_spec_string("technology",
216
g_object_class_install_property(object_class,
218
g_param_spec_string("vendor",
222
g_object_class_install_property(object_class,
224
g_param_spec_string("model",
228
g_object_class_install_property(object_class,
230
g_param_spec_string("unit",
235
g_type_class_add_private(klass,sizeof(HalBatteryPrivate));
239
hal_battery_init (HalBattery *battery)
242
battery->priv = HAL_BATTERY_GET_PRIVATE(battery);
244
battery->priv->is_present = FALSE;
245
battery->priv->is_charging = FALSE;
246
battery->priv->is_discharging = FALSE;
248
battery->priv->type = HAL_DEVICE_TYPE_UNKNOWN;
250
battery->priv->percentage = 0;
251
battery->priv->current_charge = 0;
252
battery->priv->last_full = 0;
253
battery->priv->time = 0;
254
battery->priv->reporting_design = 0;
255
battery->priv->reporting_last_full = 0;
258
static const gchar * G_GNUC_PURE
259
_translate_technology (const gchar *tech)
261
if ( !g_strcmp0 (tech, "lithium-ion") )
263
return _("Lithium ion");
265
else if ( !g_strcmp0 (tech, "lead-acid") )
267
return _("Lead acid");
269
else if ( !g_strcmp0 (tech, "lithium-polymer") )
271
return _("Lithium polymer");
273
else if ( !g_strcmp0 (tech, "nickel-metal-hydride") )
275
return _("Nickel metal hydride");
281
static const gchar * G_GNUC_PURE
282
_translate_unit (const gchar *unit)
284
if ( !g_strcmp0 (unit, "mWh") )
288
else if ( !g_strcmp0 (unit, "mAh") )
293
return _("Unknown unit");
296
static void hal_battery_get_property(GObject *object,
302
battery = HAL_BATTERY(object);
307
g_value_set_uint (value, battery->priv->type);
309
case PROP_IS_PRESENT:
310
g_value_set_boolean (value, battery->priv->is_present);
312
case PROP_IS_CHARGING:
313
g_value_set_boolean (value, battery->priv->is_charging);
315
case PROP_IS_DISCHARGING:
316
g_value_set_boolean (value, battery->priv->is_discharging);
323
val = hal_battery_get_info_string (battery, "battery.reporting.unit");
326
unit = g_strdup(_translate_unit (val));
329
g_value_set_string (value, unit);
332
case PROP_TECHNOLOGY:
335
gchar *technology = NULL;
336
val = hal_battery_get_info_string (battery, "battery.technology");
339
technology = g_strdup (_translate_technology (val));
343
g_value_set_string (value, technology);
349
gchar *vendor = NULL;
350
vendor = hal_battery_get_info_string (battery, "battery.vendor");
351
g_value_set_string (value, vendor);
358
model = hal_battery_get_info_string (battery, "battery.model");
359
g_value_set_string (value, model);
363
case PROP_PERCENTAGE:
364
g_value_set_uint (value, battery->priv->percentage);
366
case PROP_CURRENT_CHARGE:
367
g_value_set_uint (value, battery->priv->current_charge);
370
g_value_set_uint (value, battery->priv->last_full);
372
case PROP_REPORTING_DESIGN:
373
g_value_set_uint (value, battery->priv->reporting_design);
375
case PROP_REPORTING_LAST_FULL:
376
g_value_set_uint (value, battery->priv->reporting_last_full);
379
g_value_set_uint (value, battery->priv->time);
382
G_OBJECT_WARN_INVALID_PROPERTY_ID(object,prop_id,pspec);
388
hal_battery_finalize(GObject *object)
392
battery = HAL_BATTERY(object);
394
G_OBJECT_CLASS(hal_battery_parent_class)->finalize(object);
397
static HalDeviceType G_GNUC_PURE
398
hal_battery_type_enum_from_string(const gchar *string)
400
if ( !g_strcmp0 (string, "primary") )
402
return HAL_DEVICE_TYPE_PRIMARY;
404
else if ( !g_strcmp0 (string, "ups") )
406
return HAL_DEVICE_TYPE_UPS;
408
else if ( !g_strcmp0 (string, "mouse") )
410
return HAL_DEVICE_TYPE_MOUSE;
412
else if ( !g_strcmp0 (string, "keyboard") )
414
return HAL_DEVICE_TYPE_KEYBOARD;
416
else if ( !g_strcmp0 (string, "camera") )
418
return HAL_DEVICE_TYPE_CAMERA;
420
else if ( !g_strcmp0 (string, "keyboard_mouse") )
422
return HAL_DEVICE_TYPE_KEYBOARD_MOUSE;
425
return HAL_DEVICE_TYPE_UNKNOWN;
429
hal_battery_get_device_type (HalBattery *battery)
434
HalDeviceType type_enum = HAL_DEVICE_TYPE_UNKNOWN;
436
udi = hal_device_get_udi (HAL_DEVICE(battery));
438
g_return_val_if_fail (udi != NULL, HAL_DEVICE_TYPE_UNKNOWN);
440
type = hal_device_get_property_string (HAL_DEVICE(battery), "battery.type");
444
type_enum = hal_battery_type_enum_from_string(type);
450
static guint G_GNUC_CONST
451
_get_battery_percentage (guint32 last_full, guint32 current)
456
if ( G_UNLIKELY (last_full <= current) ) return val;
459
* Special case when we get 0 as last full
460
* this happens for me once i had the battery
461
* totally empty on my aspire one.
463
if ( G_UNLIKELY (last_full == 0 ) )
466
f = (float)current/last_full *100;
474
hal_battery_refresh_all (HalBattery *battery)
477
battery->priv->is_present =
478
hal_device_get_property_bool(HAL_DEVICE(battery), "battery.present");
480
battery->priv->is_charging =
481
hal_device_get_property_bool(HAL_DEVICE(battery), "battery.rechargeable.is_charging");
483
battery->priv->is_discharging =
484
hal_device_get_property_bool(HAL_DEVICE(battery), "battery.rechargeable.is_discharging");
486
battery->priv->current_charge =
487
hal_device_get_property_int(HAL_DEVICE(battery), "battery.charge_level.current");
489
battery->priv->last_full =
490
hal_device_get_property_int(HAL_DEVICE(battery), "battery.charge_level.last_full");
492
if ( hal_device_has_key (HAL_DEVICE(battery), "battery.remaining_time") )
493
battery->priv->time =
494
hal_device_get_property_int(HAL_DEVICE(battery), "battery.remaining_time");
496
battery->priv->time = 0;
498
if ( hal_device_has_key(HAL_DEVICE(battery), "battery.charge_level.percentage") )
499
battery->priv->percentage =
500
hal_device_get_property_int(HAL_DEVICE(battery), "battery.charge_level.percentage");
501
else battery->priv->percentage = _get_battery_percentage(battery->priv->last_full, battery->priv->current_charge);
503
if ( hal_device_has_key(HAL_DEVICE(battery), "battery.reporting.last_full") )
504
battery->priv->reporting_last_full =
505
hal_device_get_property_int(HAL_DEVICE(battery), "battery.reporting.last_full");
507
battery->priv->reporting_design = hal_device_get_property_int (HAL_DEVICE(battery),
508
"battery.reporting.design");
512
hal_battery_battery_changed_cb (HalBattery *battery, const gchar *key)
514
if ( !g_strcmp0 (key, "battery.present") ||
515
!g_strcmp0 (key, "battery.rechargeable.is_charging") ||
516
!g_strcmp0 (key, "battery.rechargeable.is_discharging") ||
517
!g_strcmp0 (key, "battery.charge_level.current") ||
518
!g_strcmp0 (key, "battery.remaining_time") ||
519
!g_strcmp0 (key, "battery.charge_level.percentage") )
521
hal_battery_refresh_all (battery);
522
g_signal_emit (G_OBJECT (battery), signals[BATTERY_CHANGED], 0);
527
hal_battery_property_modified_cb(HalBattery *battery,
534
hal_battery_battery_changed_cb (battery, key);
538
hal_battery_new (const gchar *udi)
540
HalBattery *battery = NULL;
542
battery = g_object_new (HAL_TYPE_BATTERY, NULL);
543
hal_device_set_udi (HAL_DEVICE(battery), udi);
545
battery->priv->type = hal_battery_get_device_type (battery);
547
hal_battery_refresh_all (battery);
549
hal_device_watch (HAL_DEVICE(battery));
551
g_signal_connect (G_OBJECT(battery), "device-changed",
552
G_CALLBACK(hal_battery_property_modified_cb), battery);