battery: add dbus method to get all of battery information 73/69373/5 accepted/tizen/common/20160615.193912 accepted/tizen/ivi/20160616.003436 accepted/tizen/mobile/20160616.003547 accepted/tizen/tv/20160616.003414 accepted/tizen/wearable/20160616.003529 submit/tizen/20160615.115707
authorTaeyoung Kim <ty317.kim@samsung.com>
Fri, 13 May 2016 02:44:18 +0000 (11:44 +0900)
committertaeyoung <ty317.kim@samsung.com>
Wed, 15 Jun 2016 07:27:40 +0000 (16:27 +0900)
- Apps want to know the battery status in detail, and thus
  the getter of the all battery information is required

Change-Id: I5b21e9f73f83cab1aaec73802933a8814f259984
Signed-off-by: taeyoung <ty317.kim@samsung.com>
src/battery/power-supply.c
src/battery/power-supply.h

index 74559db..6a936c2 100644 (file)
@@ -728,15 +728,31 @@ static void battery_changed(struct battery_info *info, void *data)
        if (!info)
                return;
 
-       if (info->status)
+       if (info->status) {
+               snprintf(battery.status_s, sizeof(battery.status_s),
+                               "%s", info->status);
                check_charge_status(info->status);
+       } else
+               battery.status_s[0] = '\0';
 
-       if (info->health)
+       if (info->health) {
+               snprintf(battery.health_s, sizeof(battery.health_s),
+                               "%s", info->health);
                check_health_status(info->health);
+       } else
+               battery.health_s[0] = '\0';
+
+       if (info->power_source)
+               snprintf(battery.power_source_s, sizeof(battery.power_source_s),
+                               "%s", info->power_source);
+       else
+               battery.power_source_s[0] = '\0';
 
        battery.online = info->online;
        battery.present = info->present;
        battery.capacity = info->capacity;
+       battery.current_now = info->current_now;
+       battery.current_average = info->current_average;
 
        battery_print_info(info);
 
@@ -1018,6 +1034,98 @@ out:
        return reply;
 }
 
+static void battery_get_info(struct battery_info *info, void *data)
+{
+       struct battery_info *bat = data;
+
+       if (!info || !bat)
+               return;
+
+       bat->status = strdup(info->status);
+       bat->health = strdup(info->health);
+       bat->power_source = strdup(info->power_source);
+       bat->online = info->online;
+       bat->present = info->present;
+       bat->capacity = info->capacity;
+       bat->current_now = info->current_now;
+       bat->current_average = info->current_average;
+}
+
+static DBusMessage *dbus_get_battery_info(E_DBus_Object *obj, DBusMessage *msg)
+{
+       DBusMessageIter iter;
+       DBusMessage *reply;
+       int ret, val;
+       const char *str;
+       struct battery_info info = { 0, };
+
+       if (battery_dev && battery_dev->get_current_state) {
+               ret = battery_dev->get_current_state(battery_get_info, &info);
+               if (ret < 0)
+                       _E("Failed to get battery info (%d)", ret);
+
+               battery_changed(&info, NULL);
+               free(info.status);
+               free(info.health);
+               free(info.power_source);
+       } else {
+               if (battery.charge_status == CHARGE_STATUS_FULL)
+                       str = CHARGEFULL_NAME;
+               else if (battery.charge_status == CHARGE_STATUS_CHARGING)
+                       str = CHARGENOW_NAME;
+               else if (battery.charge_status == CHARGE_STATUS_DISCHARGING)
+                       str = DISCHARGE_NAME;
+               else if (battery.charge_status == CHARGE_STATUS_NOT_CHARGING)
+                       str = NOTCHARGE_NAME;
+               else
+                       str = "Unknown";
+               snprintf(battery.status_s, sizeof(battery.status_s), "%s", str);
+
+               if (battery.health == HEALTH_GOOD) {
+                       if (battery.temp == TEMP_LOW && battery.ovp == OVP_ABNORMAL)
+                               str = OVERVOLT_NAME;
+                       else
+                               str = "Good";
+               } else { /* HEALTH_BAD */
+                       if (battery.temp == TEMP_HIGH)
+                               str = OVERHEAT_NAME;
+                       else /* TEMP_LOW */
+                               str = TEMPCOLD_NAME;
+               }
+               snprintf(battery.health_s, sizeof(battery.health_s), "%s", str);
+
+               if (vconf_get_int(VCONFKEY_SYSMAN_USB_STATUS, &val) == 0 &&
+                       val != VCONFKEY_SYSMAN_USB_DISCONNECTED)
+                       str = POWER_SOURCE_USB;
+               else if (vconf_get_int(VCONFKEY_SYSMAN_CHARGER_STATUS, &val) == 0 &&
+                       val == VCONFKEY_SYSMAN_CHARGER_CONNECTED)
+                       str = POWER_SOURCE_AC;
+               else
+                       str = POWER_SOURCE_NONE;
+               snprintf(battery.power_source_s, sizeof(battery.power_source_s), "%s", str);
+
+               battery.current_now = -1; /* Not supported */
+               battery.current_average = -1; /* Not supported */
+               ret = 0;
+       }
+
+       reply = dbus_message_new_method_return(msg);
+       dbus_message_iter_init_append(reply, &iter);
+       dbus_message_iter_append_basic(&iter, DBUS_TYPE_INT32, &ret);
+       str = battery.status_s;
+       dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &str);
+       str = battery.health_s;
+       dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &str);
+       str = battery.power_source_s;
+       dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &str);
+       dbus_message_iter_append_basic(&iter, DBUS_TYPE_INT32, &(battery.online));
+       dbus_message_iter_append_basic(&iter, DBUS_TYPE_INT32, &(battery.present));
+       dbus_message_iter_append_basic(&iter, DBUS_TYPE_INT32, &(battery.capacity));
+       dbus_message_iter_append_basic(&iter, DBUS_TYPE_INT32, &(battery.current_now));
+       dbus_message_iter_append_basic(&iter, DBUS_TYPE_INT32, &(battery.current_average));
+       return reply;
+}
+
 static const struct edbus_method edbus_methods[] = {
        { CHARGER_STATUS_SIGNAL,      NULL, "i", dbus_get_charger_status },
        { CHARGE_NOW_SIGNAL,          NULL, "i", dbus_get_charge_now },
@@ -1027,6 +1135,7 @@ static const struct edbus_method edbus_methods[] = {
        { CHARGE_FULL_SIGNAL,         NULL, "i", dbus_is_full },
        { CHARGE_HEALTH_SIGNAL,       NULL, "i", dbus_get_health },
        { POWER_SUBSYSTEM,       "sisssss", "i", dbus_power_supply_handler },
+       { "GetBatteryInfo",           NULL, "isssiiiii", dbus_get_battery_info },
 };
 
 static int booting_done(void *data)
@@ -1081,8 +1190,11 @@ static int load_uevent(struct parse_result *result, void *user_data)
                        info->charge_now = CHARGER_ABNORMAL;
                        info->charge_full = CHARGING_NOT_FULL;
                }
+               snprintf(info->status_s, sizeof(info->status_s), "%s", result->value);
        } else if (MATCH(result->name, CAPACITY))
                info->capacity = atoi(result->value);
+       else if (MATCH(result->name, CHARGE_HEALTH))
+               snprintf(info->health_s, sizeof(info->health_s), "%s", result->value);
        return 0;
 }
 
@@ -1114,6 +1226,11 @@ static int power_supply_probe(void *data)
                return ret;
        }
 
+       if (!battery_dev || !battery_dev->get_current_state) {
+               _E("get_current_state() is not supported by the Battery HAL");
+               return -ENODEV;
+       }
+
        _I("battery device structure load success");
        return 0;
 
index 47df1e2..24fb949 100644 (file)
@@ -85,6 +85,11 @@ struct battery_status {
        int online;
        int temp;
        int ovp;
+       int current_now;
+       int current_average;
+       char status_s[32];
+       char health_s[32];
+       char power_source_s[32];
 };
 
 extern struct battery_status battery;