2 * Copyright (c) 2019 Samsung Electronics Co., Ltd. All rights reserved.
4 * Licensed under the Apache License, Version 2.0 (the "License")
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
18 #include <dumpsys-system.h>
22 #include <glib/gprintf.h>
25 #include "bd_history_item.h"
28 #include "bm_common.h"
29 #include "bm_server_db.h"
30 #include "bm_private.h"
31 #include "bd_private.h"
32 #include "bm_config_parser.h"
34 //#define DUMP_DUMMY 1
36 #include "bd_history_item_dummy.h"
39 dump_data_s history_data[HISTORY_SIZE_MAX];
40 int h_count = 0; int h_flag = false;
41 char state1_map[32][4] = {"", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "Wm",
42 "", "Sd", "BP", "S", "Psc", "a", "s", "", "Pr", "Wr", "Ws", "Wl", "g", "w", "r"};
43 char state2_map[32][5] = {"", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
44 "", "Ud", "Chtp", "bles", "ca", "b", "Pcl", "ch", "", "", "fl", "W", "Ww", "v", "ps"};
45 char event_map[32][4] = {"Enl", "Epr", "Efg", "Etp", "Esy", "Ewl", "Ejb", "Eur", "Euf", "Ecn",
46 "Eac", "Epi", "Epu", "Eal", "Est", "Eai", "Eaa", "Etw", "Esw", "Ewa", "Elw", "Eec"};
47 char usage_map[32][4] = {"Bu", "Wu", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
48 "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""};
49 GHashTable *app_map = NULL;
50 static long int lst_charge = -1;
52 static long long min_idle_check_time;
54 static int bd_print_pool_entry(int fd, int idx, int pc, history_tag_s *pool_info)
58 BM_CHECK_INPUT_PARAM(pool_info);
59 _DBG("Value from history data %d", idx);
61 GString *dump_p = g_string_sized_new(30);
62 BM_CHECK_MEM_ALLOC(dump_p, {});
64 g_string_append(dump_p, TIZEN_DUMP_VERSION);
65 g_string_append_c(dump_p, ',');
66 g_string_append(dump_p, DUMP_DATA_TAG_1);
67 g_string_append_c(dump_p, ',');
68 g_string_append_printf(dump_p, "%d,", pc);
69 g_string_append_printf(dump_p, "%d,", pool_info->uid);
70 g_string_append(dump_p, "\"");
72 if (pool_info->string_info != NULL) {
73 gchar *temp = g_strdup(pool_info->string_info->str);
74 g_string_append(dump_p, temp);
78 g_string_append(dump_p, "\"");
79 g_string_append(dump_p, "\n");
81 _DBG("%s", dump_p->str);
83 if (write(fd, dump_p->str, dump_p->len) < 0)
86 g_string_free(dump_p, TRUE);
89 return BATTERY_MONITOR_ERROR_NONE;
92 static int bd_get_pool_entry_from_dump(int fd)
96 GString *dump_p = g_string_sized_new(30);
97 BM_CHECK_MEM_ALLOC(dump_p, {});
99 g_string_append(dump_p, TIZEN_DUMP_VERSION);
100 g_string_append(dump_p, ",0");
101 g_string_append(dump_p, ",i");
102 g_string_append(dump_p, ",vers");
103 g_string_append(dump_p, ",19,150,NMF26V,NMF26V");
104 g_string_append(dump_p, "\n");
106 _DBG("%s", dump_p->str);
108 if (write(fd, dump_p->str, dump_p->len) < 0)
109 _WARN("write error");
110 g_string_free(dump_p, TRUE);
112 int ret = BATTERY_MONITOR_ERROR_NONE;
113 int log_count = h_count; int pool_count = 0;
114 for (int i = 0; i < log_count; i++) {
115 history_tag_s *pool_info = NULL;
116 if (history_data[i].event_tag != NULL && (history_data[i].event_code & ET_FLAG_START)) {
117 pool_info = history_data[i].event_tag;
118 ret = bd_print_pool_entry(fd, i, pool_count, pool_info);
120 if (ret != BATTERY_MONITOR_ERROR_NONE)
121 return BATTERY_MONITOR_ERROR_INTERNAL;
123 if (history_data[i].wakelock_tag != NULL) {
124 pool_info = history_data[i].wakelock_tag;
125 ret = bd_print_pool_entry(fd, i, pool_count, pool_info);
127 if (ret != BATTERY_MONITOR_ERROR_NONE)
128 return BATTERY_MONITOR_ERROR_INTERNAL;
130 if (history_data[i].wakereason_tag != NULL) {
131 pool_info = history_data[i].wakereason_tag;
132 ret = bd_print_pool_entry(fd, i, pool_count, pool_info);
134 if (ret != BATTERY_MONITOR_ERROR_NONE)
135 return BATTERY_MONITOR_ERROR_INTERNAL;
140 return BATTERY_MONITOR_ERROR_NONE;
143 static int bd_get_and_print_system_base_battery_usage_from_dump(int fd, long int duration)
147 int ret = BATTERY_MONITOR_ERROR_NONE;
149 time_t crr_time = 0; time(&crr_time);
150 int uid_n = 1000; //For Tizen
151 // Base Resource usage;
152 const char *rid_str = NULL;
153 for (int i = 0; i < 6; i++) {
154 rid_str = bm_get_resource_id_string(i);
155 if (g_strcmp0(rid_str, "UNKNOWN RESOURCE-ID") == 0) {
156 _ERR("invalid resource-id");
157 return BATTERY_MONITOR_ERROR_INTERNAL;
159 resourceid_usage_s *res_use =
160 bm_server_query_resource_base_usage_resourceid_ci(rid_str, duration, crr_time, &ret);
161 if (res_use == NULL || ret != BATTERY_MONITOR_ERROR_NONE) {
162 _ERR("For resourceid %s", rid_str);
165 usage_mah += res_use->usage;
166 bm_resourceid_usage_free(res_use);
169 GString *dump_p = NULL;
170 dump_p = g_string_sized_new(30);
171 BM_CHECK_MEM_ALLOC(dump_p, {});
172 g_string_append(dump_p, TIZEN_DUMP_VERSION);
173 g_string_append_printf(dump_p, ",%d,l,pwi,uid,", uid_n);
174 g_string_append_printf(dump_p, "%0.2f", usage_mah);
175 g_string_append(dump_p, "\n");
176 _DBG("%s", dump_p->str);
177 if (write(fd, dump_p->str, dump_p->len) < 0)
178 _WARN("write error");
179 g_string_free(dump_p, TRUE);
185 static int bd_get_and_print_battery_usage_from_dump(int fd, long int duration)
188 int ret = BATTERY_MONITOR_ERROR_NONE;
189 // Application usage;
191 gpointer key, value; GString *dump_p = NULL;
192 char *appid = NULL; int *uid_n = NULL;
193 time_t crr_time = 0; time(&crr_time);
194 long int end_t = crr_time;
195 float usageMAh = 0; int battery_capacity = 500;//default
197 ret = bm_get_battery_power_params(&battery_capacity);
198 if (ret != BATTERY_MONITOR_ERROR_NONE) {
199 _ERR("unable read read battery capacity");
200 battery_capacity = 500;
203 dump_p = g_string_sized_new(30);
204 BM_CHECK_MEM_ALLOC(dump_p, {});
206 g_string_append(dump_p, TIZEN_DUMP_VERSION);
208 g_string_append_printf(dump_p, ",0,l,pws,%d,0,0,0", battery_capacity);
209 g_string_append(dump_p, "\n");
211 _DBG("%s", dump_p->str);
213 if (write(fd, dump_p->str, dump_p->len) < 0)
214 _WARN("write error");
216 g_string_free(dump_p, TRUE);
218 g_hash_table_iter_init(&iter, app_map);
219 while (g_hash_table_iter_next(&iter, &key, &value)) {
220 uid_n = (int *)key; appid = (char *)value;
221 _DBG("%d %s", *uid_n, appid); usageMAh = 0;
222 // Currently giving app usage of last one week;
223 // Modify it wrt to time
224 appid_usage_s *app_use = bm_server_query_app_usage_by_appid_ci(appid, duration, end_t, &ret);
225 if (app_use == NULL || ret != BATTERY_MONITOR_ERROR_NONE) {
226 _ERR("For appid %s", appid);
229 usageMAh = (app_use->rId_ble + app_use->rId_wifi + app_use->rId_cpu +
230 app_use->rId_display + app_use->rId_device_network +
231 app_use->rId_gps + app_use->rId_hrm);
232 // usage stored as mAs changed to mAh
233 usageMAh = (usageMAh/3600);
234 dump_p = g_string_sized_new(30);
235 BM_CHECK_MEM_ALLOC(dump_p, { BM_FREE(app_use); });
236 g_string_append(dump_p, TIZEN_DUMP_VERSION);
237 g_string_append_printf(dump_p, ",%d,l,pwi,uid,", *uid_n);
238 g_string_append_printf(dump_p, "%0.2f", usageMAh);
239 g_string_append(dump_p, "\n");
240 bm_appid_usage_free(app_use);
241 _DBG("%s", dump_p->str);
242 if (write(fd, dump_p->str, dump_p->len) < 0)
243 _WARN("write error");
244 g_string_free(dump_p, TRUE);
247 const char *rid_str = NULL;
248 for (int i = 0; i < 6; i++) {
250 rid_str = bm_get_resource_id_string(i);
251 if (g_strcmp0(rid_str, "UNKNOWN RESOURCE-ID") == 0) {
252 _ERR("invalid resource-id");
253 return BATTERY_MONITOR_ERROR_INTERNAL;
255 resourceid_usage_s *res_use =
256 bm_server_query_resource_usage_resourceid_ci(rid_str, duration, end_t, &ret);
257 if (res_use == NULL || ret != BATTERY_MONITOR_ERROR_NONE) {
258 _ERR("For resourceid %s", rid_str);
261 dump_p = g_string_sized_new(30);
262 BM_CHECK_MEM_ALLOC(dump_p, {BM_FREE(res_use); });
263 usage = res_use->usage;
264 // usage stored as mAs changed to mAh
265 usageMAh = (float)usage/3600;
266 g_string_append(dump_p, TIZEN_DUMP_VERSION);
269 g_string_append(dump_p, ",0,l,pwi,blue,");
272 g_string_append(dump_p, ",0,l,pwi,wifi,");
275 g_string_append(dump_p, ",0,l,pwi,phone,");
278 g_string_append(dump_p, ",0,l,pwi,scrn,");
281 g_string_append(dump_p, ",0,l,pwi,cell,");
284 g_string_append(dump_p, ",0,l,pwi,unacc,");
287 g_string_append_printf(dump_p, "%0.2f", usageMAh);
288 g_string_append(dump_p, "\n");
289 bm_resourceid_usage_free(res_use);
290 _DBG("%s", dump_p->str);
291 if (write(fd, dump_p->str, dump_p->len) < 0)
292 _WARN("write error");
293 g_string_free(dump_p, TRUE);
296 ret = bd_get_and_print_system_base_battery_usage_from_dump(fd, duration);
297 if (ret != BATTERY_MONITOR_ERROR_NONE)
298 _ERR("Base usage dump failed");
304 static int bd_get_and_print_gbr_stat_entry_from_dump(int fd, long int duration)
307 // Dump brightness Data
308 bd_gl_sbr_stat_s *gbr_stat = (bd_gl_sbr_stat_s *)calloc(1, sizeof(bd_gl_sbr_stat_s));
309 BM_CHECK_MEM_ALLOC(gbr_stat, {});
311 int ret = BATTERY_MONITOR_ERROR_NONE;
312 ret = bm_server_battery_dump_query_from_db(gbr_stat, 3, duration);
313 if (ret != BATTERY_MONITOR_ERROR_NONE) {
314 _ERR("Unable to fetch data from DB");
319 GString *dump_p = g_string_sized_new(30);
320 BM_CHECK_MEM_ALLOC(dump_p, {BM_FREE(gbr_stat); });
321 g_string_append(dump_p, TIZEN_DUMP_VERSION);
322 g_string_append(dump_p, ",0,l,");
323 g_string_append(dump_p, "br,");
324 g_string_append_printf(dump_p, "%ld,", gbr_stat->dark); //OFF
325 g_string_append_printf(dump_p, "%ld,", gbr_stat->dim); // All are time values
326 g_string_append_printf(dump_p, "%ld,", gbr_stat->medium);
327 g_string_append_printf(dump_p, "%ld,", gbr_stat->light); //DEF: 0
328 g_string_append_printf(dump_p, "%ld", gbr_stat->bright);
329 g_string_append(dump_p, "\n");
330 _DBG("%s", dump_p->str);//write
331 if (write(fd, dump_p->str, dump_p->len) < 0)
332 _WARN("write error");
333 g_string_free(dump_p, TRUE);
340 static int bd_get_and_print_misc_stat_entry_from_dump(int fd, long int duration)
343 //Dump screen on and off time
344 //Modify m - field accordingly.
345 bd_gl_sbr_stat_s *gbr_stat = (bd_gl_sbr_stat_s *)calloc(1, sizeof(bd_gl_sbr_stat_s));
346 BM_CHECK_MEM_ALLOC(gbr_stat, {});
348 int ret = BATTERY_MONITOR_ERROR_NONE;
349 ret = bm_server_battery_dump_query_from_db(gbr_stat, 3, duration);
350 if (ret != BATTERY_MONITOR_ERROR_NONE) {
351 _ERR("Unable to fetch data from DB");
356 GString *dump_p = g_string_sized_new(30);
357 BM_CHECK_MEM_ALLOC(dump_p, {BM_FREE(gbr_stat); });
358 g_string_append(dump_p, TIZEN_DUMP_VERSION);
359 g_string_append(dump_p, ",0,l,");
360 g_string_append(dump_p, "m,");
361 long int off_time = gbr_stat->dark;
362 long int on_time = (gbr_stat->dim + gbr_stat->medium + gbr_stat->bright);
363 g_string_append_printf(dump_p, "%ld,", on_time);
364 g_string_append_printf(dump_p, "%ld", off_time);
365 g_string_append(dump_p, "\n");
367 _DBG("%s", dump_p->str);
368 if (write(fd, dump_p->str, dump_p->len) < 0)
369 _WARN("write error");*/
370 g_string_free(dump_p, TRUE);
377 static int bd_get_and_print_gn_stat_entry_from_dump(int fd, long int duration)
382 bd_gl_ntw_stat_s *gn_stat = (bd_gl_ntw_stat_s *)calloc(1, sizeof(bd_gl_ntw_stat_s));
383 BM_CHECK_MEM_ALLOC(gn_stat, {});
384 int ret = BATTERY_MONITOR_ERROR_NONE;
385 ret = bm_server_battery_dump_query_from_db(gn_stat, 2, duration);
386 if (ret != BATTERY_MONITOR_ERROR_NONE) {
387 _ERR("Unable to fetch data from DB");
392 GString *dump_p = g_string_sized_new(30);
393 BM_CHECK_MEM_ALLOC(dump_p, {BM_FREE(gn_stat); });
395 g_string_append(dump_p, TIZEN_DUMP_VERSION);
396 g_string_append(dump_p, ",0,l,");
397 g_string_append(dump_p, "gn,");
398 g_string_append_printf(dump_p, "%ld,", gn_stat->dn_rx_byt);
399 g_string_append_printf(dump_p, "%ld,", gn_stat->dn_tx_byt);
400 g_string_append_printf(dump_p, "%ld,", gn_stat->wifi_rx_byt);
401 g_string_append_printf(dump_p, "%ld,", gn_stat->wifi_tx_byt);
402 g_string_append_printf(dump_p, "%ld,", gn_stat->dn_rx_pkt);
403 g_string_append_printf(dump_p, "%ld,", gn_stat->dn_tx_pkt);
404 g_string_append_printf(dump_p, "%ld,", gn_stat->wifi_rx_pkt);
405 g_string_append_printf(dump_p, "%ld,", gn_stat->wifi_tx_pkt);
406 g_string_append_printf(dump_p, "%d,", 0); //add this to struct as well
407 g_string_append_printf(dump_p, "%d", 0);
408 g_string_append(dump_p, "\n");
410 _DBG("%s", dump_p->str);//write
411 if (write(fd, dump_p->str, dump_p->len) < 0)
412 _WARN("write error");
414 g_string_free(dump_p, TRUE);
421 static int bd_get_and_print_gwf_stat_entry_from_dump(int fd, long int duration)
425 bd_gl_wifi_stat_s *gwfl_stat = (bd_gl_wifi_stat_s *)calloc(1, sizeof(bd_gl_wifi_stat_s));
426 BM_CHECK_MEM_ALLOC(gwfl_stat, {});
428 int ret = BATTERY_MONITOR_ERROR_NONE;
429 ret = bm_server_battery_dump_query_from_db(gwfl_stat, 1, duration);
430 if (ret != BATTERY_MONITOR_ERROR_NONE) {
431 _ERR("Unable to fetch data from DB");
436 GString *dump_p = g_string_sized_new(30);
437 BM_CHECK_MEM_ALLOC(dump_p, {BM_FREE(gwfl_stat); });
438 g_string_append(dump_p, TIZEN_DUMP_VERSION);
439 g_string_append(dump_p, ",0,l,");
440 g_string_append(dump_p, "gwfl,");
441 g_string_append_printf(dump_p, "%ld,", gwfl_stat->wifi_on_time);
442 g_string_append_printf(dump_p, "%ld,", gwfl_stat->wifi_conn_time);
443 g_string_append(dump_p, "0,0,0");//legacy
445 g_string_append(dump_p, "\n");
446 _DBG("%s", dump_p->str);//write
447 if (write(fd, dump_p->str, dump_p->len) < 0)
448 _WARN("write error");
449 g_string_free(dump_p, TRUE);
451 dump_p = g_string_sized_new(30);
452 BM_CHECK_MEM_ALLOC(dump_p, {BM_FREE(gwfl_stat); });
453 g_string_append(dump_p, TIZEN_DUMP_VERSION);
454 g_string_append(dump_p, ",0,l,");
455 g_string_append(dump_p, "gwfcd,");
457 float usage_mah = (float)gwfl_stat->wifi_pwi_val/3600;
458 g_string_append_printf(dump_p, "%ld,", gwfl_stat->wifi_idle_time);
459 g_string_append_printf(dump_p, "%ld,", gwfl_stat->wifi_rx_time);
460 g_string_append_printf(dump_p, "%0.2f,", usage_mah);
461 g_string_append_printf(dump_p, "%ld", gwfl_stat->wifi_tx_time);
462 g_string_append(dump_p, "\n");
463 _DBG("%s", dump_p->str);//write
464 if (write(fd, dump_p->str, dump_p->len) < 0)
465 _WARN("write error");
466 g_string_free(dump_p, TRUE);
473 static int bd_get_and_print_gble_stat_entry_from_dump(int fd, long int duration)
477 bd_gl_ble_stat_s *gble_stat = (bd_gl_ble_stat_s *)calloc(1, sizeof(bd_gl_ble_stat_s));
478 BM_CHECK_MEM_ALLOC(gble_stat, {});
480 int ret = BATTERY_MONITOR_ERROR_NONE;
481 ret = bm_server_battery_dump_query_from_db(gble_stat, 0, duration);
482 if (ret != BATTERY_MONITOR_ERROR_NONE) {
483 _ERR("Unable to fetch data from DB");
488 GString *dump_p = g_string_sized_new(30);
489 BM_CHECK_MEM_ALLOC(dump_p, {BM_FREE(gble_stat); });
490 g_string_append(dump_p, TIZEN_DUMP_VERSION);
491 g_string_append(dump_p, ",0,l,");
492 g_string_append(dump_p, "gble,");
493 float usage_mah = (float)gble_stat->ble_pwi_val/3600;
494 g_string_append_printf(dump_p, "%ld,", gble_stat->ble_idle_time);
495 g_string_append_printf(dump_p, "%ld,", gble_stat->ble_rx_time);
496 g_string_append_printf(dump_p, "%ld,", gble_stat->ble_tx_time);
497 g_string_append_printf(dump_p, "%0.2f", usage_mah);
498 g_string_append(dump_p, "\n");
500 _DBG("%s", dump_p->str);//write
501 if (write(fd, dump_p->str, dump_p->len) < 0)
502 _WARN("write error");
503 g_string_free(dump_p, TRUE);
510 static int bd_get_and_print_gst_stat_entry_from_dump(int fd, long int duration)
514 int ret = BATTERY_MONITOR_ERROR_NONE;
516 bd_gl_sgt_stat_s *gst_stat = (bd_gl_sgt_stat_s *)calloc(1, sizeof(bd_gl_sgt_stat_s));
517 BM_CHECK_MEM_ALLOC(gst_stat, {});
519 ret = bm_server_battery_dump_query_from_db(gst_stat, 4, duration);
520 if (ret != BATTERY_MONITOR_ERROR_NONE) {
521 _ERR("Unable to fetch data from DB");
526 GString *dump_p = g_string_sized_new(30);
527 BM_CHECK_MEM_ALLOC(dump_p, {BM_FREE(gst_stat); });
529 g_string_append(dump_p, TIZEN_DUMP_VERSION);
530 g_string_append(dump_p, ",0,l,");
531 g_string_append(dump_p, "sgt,");
532 g_string_append_printf(dump_p, "%ld,", gst_stat->none_time);
533 g_string_append_printf(dump_p, "%ld,", gst_stat->poor_time);
534 g_string_append_printf(dump_p, "%ld,", gst_stat->med_time);
535 g_string_append_printf(dump_p, "%ld,", gst_stat->good_time);
536 g_string_append_printf(dump_p, "%ld", gst_stat->grt_time);
537 g_string_append(dump_p, "\n");
539 _DBG("%s", dump_p->str);//write
541 if (write(fd, dump_p->str, dump_p->len) < 0)
542 _WARN("write error");
543 g_string_free(dump_p, TRUE);
545 dump_p = g_string_sized_new(30);
546 BM_CHECK_MEM_ALLOC(dump_p, {BM_FREE(gst_stat); });
548 g_string_append(dump_p, TIZEN_DUMP_VERSION);
549 g_string_append(dump_p, ",0,l,");
550 g_string_append(dump_p, "sst,");
551 g_string_append_printf(dump_p, "%ld", gst_stat->scan_time);
553 g_string_append(dump_p, "\n");
554 _DBG("%s", dump_p->str);//write
555 if (write(fd, dump_p->str, dump_p->len) < 0)
556 _WARN("write error");
558 g_string_free(dump_p, TRUE);
565 static int bd_get_and_print_gwst_stat_entry_from_dump(int fd, long int duration)
568 bd_gl_wst_stat_s *gwst_stat = (bd_gl_wst_stat_s *)calloc(1, sizeof(bd_gl_wst_stat_s));
569 BM_CHECK_MEM_ALLOC(gwst_stat, {});
571 int ret = BATTERY_MONITOR_ERROR_NONE;
572 ret = bm_server_battery_dump_query_from_db(gwst_stat, 5, duration);
573 if (ret != BATTERY_MONITOR_ERROR_NONE) {
574 _ERR("Unable to fetch data from DB");
579 GString *dump_p = g_string_sized_new(30);
580 BM_CHECK_MEM_ALLOC(dump_p, {BM_FREE(gwst_stat); });
581 g_string_append(dump_p, TIZEN_DUMP_VERSION);
582 g_string_append(dump_p, ",0,l,");
583 g_string_append(dump_p, "wsgt,");
584 // g_string_append_printf(dump_p, "%ld,", gwst_stat->wscan_time);
585 g_string_append_printf(dump_p, "%ld,", gwst_stat->wnone_time);
586 g_string_append_printf(dump_p, "%ld,", gwst_stat->wpoor_time);
587 g_string_append_printf(dump_p, "%ld,", gwst_stat->wmed_time);
588 g_string_append_printf(dump_p, "%ld,", gwst_stat->wgood_time);
589 g_string_append_printf(dump_p, "%ld", gwst_stat->wgrt_time);
590 g_string_append(dump_p, "\n");
591 _DBG("%s", dump_p->str);//write
592 if (write(fd, dump_p->str, dump_p->len) < 0)
593 _WARN("write error");
594 g_string_free(dump_p, TRUE);
601 static int bd_get_and_print_gcpu_stat_entry_from_dump(int fd, long int duration)
605 int ret = BATTERY_MONITOR_ERROR_NONE;
606 const char *rid_str = NULL; int usage = 0;
607 time_t crr_time = 0; time(&crr_time);
608 long int end_t = crr_time;
609 rid_str = bm_get_resource_id_string(2);
610 resourceid_usage_s *res_use =
611 bm_server_query_resource_usage_resourceid_ci(rid_str, duration, end_t, &ret);
612 if (res_use == NULL || ret != BATTERY_MONITOR_ERROR_NONE) {
613 _ERR("For resourceid %s", rid_str);
616 usage = res_use->usage;
617 float usagemah = (float)usage/3600;
618 bd_gl_cpu_stat_s *gcpu_stat = (bd_gl_cpu_stat_s *)calloc(1, sizeof(bd_gl_cpu_stat_s));
619 BM_CHECK_MEM_ALLOC(gcpu_stat, {BM_FREE(res_use); });
620 ret = bm_server_battery_dump_query_from_db(gcpu_stat, 7, duration);
621 if (ret != BATTERY_MONITOR_ERROR_NONE) {
622 _ERR("Unable to fetch data from DB");
628 GString *dump_p = g_string_sized_new(30);
629 BM_CHECK_MEM_ALLOC(dump_p, {BM_FREE(gcpu_stat); BM_FREE(res_use); });
630 g_string_append(dump_p, TIZEN_DUMP_VERSION);
631 g_string_append(dump_p, ",0,l,");
632 g_string_append(dump_p, "cpu,");
633 g_string_append_printf(dump_p, "%ld,", gcpu_stat->usr_time);
634 g_string_append_printf(dump_p, "%ld,", gcpu_stat->sys_time);
635 g_string_append_printf(dump_p, "%0.2f", usagemah);
636 g_string_append(dump_p, "\n");
637 bm_resourceid_usage_free(res_use);
638 _DBG("%s", dump_p->str);
639 if (write(fd, dump_p->str, dump_p->len) < 0)
640 _WARN("write error");
642 g_string_free(dump_p, TRUE);
649 static int bd_get_and_print_uid_info_entry_from_dump(int fd)
653 int ret = BATTERY_MONITOR_ERROR_NONE;
654 GSList *list = bm_server_query_appid_map(&ret);
656 _ERR("NO LIST DATA FOUND");
659 app_map = g_hash_table_new_full(g_int_hash, g_int_equal, g_free, g_free);
660 GSList *iter = NULL; GString *dump_p = NULL;
661 dump_p = g_string_sized_new(30);
662 BM_CHECK_MEM_ALLOC(dump_p, {bm_set_free_gslist_appid_map(list); });
663 g_string_append(dump_p, TIZEN_DUMP_VERSION);
664 g_string_append(dump_p, ",0,i,uid,1000,Tizen\n");
665 if (write(fd, dump_p->str, dump_p->len) < 0)
666 _WARN("write error");
667 g_string_free(dump_p, TRUE);
669 for (iter = list; iter != NULL; iter = g_slist_next(iter)) {
670 dump_p = g_string_sized_new(30);
671 BM_CHECK_MEM_ALLOC(dump_p, {bm_set_free_gslist_appid_map(list); });
672 g_string_append(dump_p, TIZEN_DUMP_VERSION);
673 g_string_append(dump_p, ",0");
674 g_string_append(dump_p, ",i");
675 g_string_append(dump_p, ",uid,");
676 appid_map_s *amap_data = (appid_map_s *)iter->data;
677 g_string_append_printf(dump_p, "%d,", (amap_data->id+10000));
678 gchar *temp_str = g_strdup(amap_data->AppId);
679 g_string_append(dump_p, amap_data->AppId);
680 g_string_append(dump_p, "\n");
681 _DBG("%s", dump_p->str);//write
682 if (write(fd, dump_p->str, dump_p->len) < 0)
683 _WARN("write error");
684 g_string_free(dump_p, TRUE);
685 int *temp_id = (int *)calloc(1, sizeof(int));
686 if (temp_id != NULL) {
687 *temp_id = (amap_data->id + 10000);
688 _DBG("Insert id %d, str %s, res %d", *temp_id, temp_str,
689 g_hash_table_insert(app_map, temp_id, temp_str));
691 _WARN("Memory Allocation Failed");
695 bm_set_free_gslist_appid_map(list);
701 static int bd_get_history_detail_from_dump(int index, history_item_s* dump_node)
704 BM_CHECK_INPUT_PARAM(dump_node);
706 if (h_count >= HISTORY_SIZE_MAX || index > h_count) {
707 _ERR("Some Error occured with global index");
708 return BATTERY_MONITOR_ERROR_OUT_OF_MEMORY;
711 _DBG("Value of index %d", index);
712 _DBG("Value of h_count %d", h_count);
714 int dvar1 = 0, dvar2 = 0;
715 dvar1 = history_data[index].dump_1;
716 dvar2 = history_data[index].dump_2;
718 _DBG("Value of encoded value 1 %d", dvar1);
719 _DBG("Value of encoded value 2 %d", dvar2);
721 dump_node->cmd_s = ((dvar1) & 0xff);
722 _DBG("cmd_s %d", dump_node->cmd_s);
724 dump_node->battery_level = ((dvar1>>8) & 0xff);
725 _DBG("battery_level %d", dump_node->battery_level);
727 dump_node->battery_status = ((dvar1>>16) & 0xf);
728 _DBG("battery_status %d", dump_node->battery_status);
730 dump_node->battery_health = ((dvar1>>20) & 0xf);
731 _DBG("battery_health %d", dump_node->battery_health);
733 dump_node->battery_plugtype = ((dvar1>>24) & 0xf);
734 _DBG("battery_plugtype %d", dump_node->battery_plugtype);
736 dump_node->battery_temperature = ((dvar2) & 0xffff);
737 _DBG("battery_temperature %d", dump_node->battery_temperature);
739 dump_node->battery_voltage = ((dvar2>>16) & 0xffff);
740 _DBG("battery_voltage %d", dump_node->battery_voltage);
742 dump_node->battery_charge = history_data[index].battery_chargeUAh;
743 _DBG("battery_charge %d", dump_node->battery_charge);
745 dump_node->event_code = history_data[index].event_code;
746 _DBG("eventcode %d", dump_node->event_code);
748 dump_node->state_1 = history_data[index].state_1;
749 _DBG("state_1 %d", dump_node->state_1);
751 dump_node->state_2 = history_data[index].state_2;
752 _DBG("state_2 %d", dump_node->state_2);
754 dump_node->event_tag = history_data[index].event_tag;
755 if (dump_node->event_tag == NULL)
756 _DBG("Event_Tag_NULL");
757 dump_node->wakelock_tag = history_data[index].wakelock_tag;
758 if (dump_node->wakelock_tag == NULL)
759 _DBG("Wakelock_Tag_NULL");
760 dump_node->wakereason_tag = history_data[index].wakereason_tag;
762 if (dump_node->wakereason_tag == NULL)
763 _DBG("Wakereason_Tag_NULL");
765 dump_node->time_s = history_data[index].time_s;
766 _DBG("TIME_S is %lld", dump_node->time_s);
768 dump_node->time_current = history_data[index].time_current;
769 _DBG("C TIME is %lld", dump_node->time_current);
771 dump_node->usage_type = history_data[index].usage_type;
772 _DBG("Usage type is %d", dump_node->usage_type);
774 dump_node->usage = history_data[index].usage;
775 _DBG("Usage is %d", dump_node->usage);
778 return BATTERY_MONITOR_ERROR_NONE;
781 static void bd_get_last_charge_time(long int def_time, int *ret)
785 if (lst_charge < 0) {
786 char *str = "battery";
787 resourceid_usage_s *bat_use = bm_server_query_battery_last_charge(str, ret);
788 if (*ret == BATTERY_MONITOR_ERROR_NONE) {
789 if (bat_use->log_time > 0)
790 lst_charge = bat_use->log_time;
792 lst_charge = def_time;
793 _DBG("LC [%ld]", lst_charge);
796 _ERR("LAST CHG time failed");
797 lst_charge = def_time;
805 int bd_print_history_item_reset(history_item_s* old_state)
808 BM_CHECK_INPUT_PARAM(old_state);
810 old_state->time_s = -1;
811 old_state->state_1 = 0;
812 old_state->state_2 = 0;
813 old_state->usage_type = 0;
814 old_state->usage = 0;
815 old_state->battery_level = -1;
816 old_state->battery_status = -1;
817 old_state->battery_health = -1;
818 old_state->battery_plugtype = -1;
819 old_state->battery_temperature = -1;
820 old_state->battery_voltage = -1;
821 old_state->battery_charge = -1;
822 old_state->event_code = 0;
823 old_state->event_tag = NULL;
824 old_state->wakelock_tag = NULL;
825 old_state->wakereason_tag = NULL;
828 return BATTERY_MONITOR_ERROR_NONE;
831 int bd_get_base_time_from_dump(long long *base_time)
835 *base_time = history_data[0].time_s;
838 return BATTERY_MONITOR_ERROR_NONE;
841 int bd_print_history_item_main(int fd, int num_h_items, long long base_time, bool chkin)
847 return BATTERY_MONITOR_ERROR_INVALID_PARAMETER;
850 if (h_count >= HISTORY_SIZE_MAX) {
851 _ERR("Some Error occured with global index");
852 return BATTERY_MONITOR_ERROR_OUT_OF_MEMORY;
855 int ret = BATTERY_MONITOR_ERROR_NONE;
856 h_flag = false; //Lock
858 history_item_s new_state;
859 history_item_s old_state;
861 ret = bd_print_history_item_reset(&old_state);
862 if (ret != BATTERY_MONITOR_ERROR_NONE) {
863 _ERR("Old State reset failed");
867 ret = bd_get_pool_entry_from_dump(fd);
868 if (ret != BATTERY_MONITOR_ERROR_NONE)
869 _ERR("S pool data dump failed");
871 ret = bd_get_base_time_from_dump(&base_time);
872 if (ret != BATTERY_MONITOR_ERROR_NONE)
873 _ERR("Base time error");
875 int log_count = h_count; GString *dump_p = NULL;
876 for (int i = 0; i < log_count; i++) {
877 ret = bd_get_history_detail_from_dump(i, &new_state);
878 if (ret != BATTERY_MONITOR_ERROR_NONE) {
879 _ERR("Decode Failed");
882 dump_p = g_string_sized_new(30);
883 BM_CHECK_MEM_ALLOC(dump_p, {});
885 g_string_append(dump_p, TIZEN_DUMP_VERSION);
886 g_string_append_c(dump_p, ',');
887 _DBG("value %s", dump_p->str);
888 g_string_append(dump_p, DUMP_DATA_TAG);
889 g_string_append_c(dump_p, ',');
890 _DBG("value %s", dump_p->str);
891 if (old_state.time_s < 0) {
892 g_string_append_printf(dump_p, "%lld",
893 (new_state.time_s - base_time));
894 _DBG("value %s", dump_p->str);
896 g_string_append_printf(dump_p, "%lld",
897 (new_state.time_s - old_state.time_s));
898 _DBG("value %s", dump_p->str);
900 old_state.time_s = new_state.time_s;
901 _DBG("Value old_state.time_s %lld", old_state.time_s);
902 } else { //: Let's skip the NC mode in initial version
904 if (new_state.cmd_s == CM_ST) {
906 g_string_append_c(dump_p, ':');
907 _DBG("value %s", dump_p->str);
911 g_string_append(dump_p, "START\n");
912 _DBG("value %s", dump_p->str);
913 bd_print_history_item_reset(&old_state);
914 } else if (new_state.cmd_s == CM_CRR_TIME || new_state.cmd_s == CM_RST) {
916 g_string_append_c(dump_p, ':');
917 _DBG("value %s", dump_p->str);
919 if (new_state.cmd_s == CM_RST) {
920 g_string_append(dump_p, "RESET:");
921 _DBG("value %s", dump_p->str);
922 bd_print_history_item_reset(&old_state);
924 g_string_append(dump_p, "TIME:");
925 _DBG("value %s", dump_p->str);
927 g_string_append_printf(dump_p, "%lld", new_state.time_current);
928 _DBG("value %s", dump_p->str);
929 g_string_append(dump_p, "\n");
930 _DBG("value %s", dump_p->str);
934 } else if (new_state.cmd_s == CM_USAGE) {
935 for (int i = 0; i < 32; i++) {
936 if (new_state.usage_type == (1 << i)) {
937 g_string_append(dump_p, ",");
938 g_string_append_printf(dump_p, "%s", usage_map[i]);
939 g_string_append(dump_p, "=");
940 g_string_append_printf(dump_p, "%d", new_state.usage);
941 g_string_append(dump_p, ",");
942 g_string_append_printf(dump_p, "%lld", new_state.time_current);
943 g_string_append(dump_p, ",");
944 g_string_append_printf(dump_p, "%lld", (new_state.time_s - min_idle_check_time) / 1000);
945 g_string_append(dump_p, "\n");
946 _DBG("value %d", new_state.usage);
953 if (old_state.battery_level != new_state.battery_level) {
954 old_state.battery_level = new_state.battery_level;
955 g_string_append(dump_p, ",Bl=");
956 _DBG("value %s", dump_p->str);
957 g_string_append_printf(dump_p, "%d",
958 new_state.battery_level);
959 _DBG("value %s", dump_p->str);
962 if (old_state.battery_status != new_state.battery_status) {
963 old_state.battery_status = new_state.battery_status;
964 g_string_append(dump_p, ",Bs="); //:for NC
965 _DBG("value %s", dump_p->str);
966 switch (old_state.battery_status) {
968 g_string_append_c(dump_p, '?');
971 g_string_append_c(dump_p, 'c');
974 g_string_append_c(dump_p, 'd');
977 g_string_append_c(dump_p, 'n');
980 g_string_append_c(dump_p, 'f');
983 g_string_append_c(dump_p, '?');
984 _DBG("value %s", dump_p->str);
988 if (old_state.battery_health != new_state.battery_health) {
989 old_state.battery_health = new_state.battery_health;
990 g_string_append(dump_p, ",Bh="); //:for NC
991 _DBG("value %s", dump_p->str);
992 switch (old_state.battery_health) {
994 g_string_append_c(dump_p, 'g');
997 g_string_append_c(dump_p, '?');
1000 g_string_append_c(dump_p, 'h');
1003 g_string_append_c(dump_p, 'd');
1006 g_string_append_c(dump_p, 'v');
1009 g_string_append_c(dump_p, 'f');
1012 g_string_append_c(dump_p, 'c');
1015 g_string_append_c(dump_p, '?');
1016 _DBG("value %s", dump_p->str);
1020 if (old_state.battery_plugtype != new_state.battery_plugtype) {
1021 old_state.battery_plugtype = new_state.battery_plugtype;
1022 g_string_append(dump_p, ",Bp="); //:for NC
1023 _DBG("value %s", dump_p->str);
1024 switch (old_state.battery_plugtype) {
1026 g_string_append_c(dump_p, 'n');
1029 g_string_append_c(dump_p, 'a');
1032 g_string_append_c(dump_p, 'u');
1035 g_string_append_c(dump_p, 'w');
1038 g_string_append_c(dump_p, 'n');
1039 _DBG("value %s", dump_p->str);
1043 if (old_state.battery_temperature != new_state.battery_temperature) {
1044 old_state.battery_temperature = new_state.battery_temperature;
1045 g_string_append(dump_p, ",Bt="); //:for NC
1046 g_string_append_printf(dump_p, "%d",
1047 new_state.battery_temperature);
1048 _DBG("value %s", dump_p->str);
1050 if (old_state.battery_voltage != new_state.battery_voltage) {
1051 old_state.battery_voltage = new_state.battery_voltage;
1052 g_string_append(dump_p, ",Bv="); //:for NC
1053 _DBG("value %s", dump_p->str);
1054 g_string_append_printf(dump_p, "%d", new_state.battery_voltage);
1055 _DBG("value %s", dump_p->str);
1057 if (old_state.battery_charge != new_state.battery_charge) {
1058 old_state.battery_charge = new_state.battery_charge;
1059 g_string_append(dump_p, ",Bcc=");
1060 _DBG("value %s", dump_p->str);
1062 g_string_append_printf(dump_p, "%d", (new_state.battery_charge/1000));
1063 _DBG("value %s", dump_p->str);
1065 int change = (old_state.state_1 ^ new_state.state_1);
1067 bool wake_fl = false; int k = 0;
1068 if ((change & ST1_BRIGHTNESS_MASK) != 0) {
1069 k = (new_state.state_1 & ST1_BRIGHTNESS_MASK);
1070 g_string_append(dump_p, ",Sb=");
1071 k = k >> ST1_BRIGHTNESS_SHIFT;
1073 g_string_append_printf(dump_p, "%d", k);
1076 if ((change & ST1_PHONE_SIGNAL_STRENGTH_MASK) != 0) {
1077 k = (new_state.state_1 & ST1_PHONE_SIGNAL_STRENGTH_MASK);
1078 g_string_append(dump_p, ",Pss=");
1079 k = k >> ST1_PHONE_SIGNAL_STRENGTH_SHIFT;
1080 _DBG("Pss = %d", k);
1081 g_string_append_printf(dump_p, "%d", k);
1084 int shifts = (1 << 14);
1085 for (int i = 14; i < 32; i++) {
1086 if ((change & shifts) != 0) {
1087 g_string_append_c(dump_p, ',');
1088 //Considering only -ve shift cases
1091 if ((new_state.state_1 & (1 << i)) != 0)
1092 g_string_append_c(dump_p, '+');
1094 g_string_append_c(dump_p, '-');
1095 gchar *temp = g_strdup(state1_map[i]);
1096 g_string_append(dump_p, temp);
1098 //_DBG("value %s", dump_p->str);
1099 if ((1 << i) == ST1_WAKE_LOCK_FLAG &&
1100 new_state.wakelock_tag != NULL) {
1102 g_string_append_c(dump_p, '=');
1103 //_DBG("value %s", dump_p->str);
1105 g_string_append_printf(dump_p,
1106 "%d", new_state.wakelock_tag->sp_idx);
1110 //_DBG("value %s", dump_p->str);
1113 //With non-negative shift
1116 shifts = (shifts << 1);
1118 if (!wake_fl && new_state.wakelock_tag != NULL) {
1119 g_string_append(dump_p, ",w=");
1121 g_string_append_printf(dump_p, "%d",
1122 new_state.wakelock_tag->sp_idx);
1123 _DBG("value %s", dump_p->str);
1128 change = (old_state.state_2 ^ new_state.state_2);
1131 for (int i = 0; i < 32; i++) {
1132 if ((change & shifts) != 0) {
1133 g_string_append_c(dump_p, ',');
1134 //_DBG("value %s", dump_p->str);
1137 if ((new_state.state_2 & (1 << i) & change) != 0)
1138 g_string_append_c(dump_p, '+');
1140 g_string_append_c(dump_p, '-');
1141 //_DBG("value %s", dump_p->str);
1142 gchar *temp = g_strdup(state2_map[i]);
1143 g_string_append(dump_p, temp);
1145 _DBG("value %s", dump_p->str);
1148 shifts = (shifts << 1);
1151 if (new_state.wakereason_tag != NULL) {
1153 g_string_append(dump_p, ",wr=");
1154 _DBG("value %s", dump_p->str);
1155 g_string_append_printf(dump_p, "%d",
1156 new_state.wakereason_tag->sp_idx);
1157 _DBG("value %s", dump_p->str);
1162 if (new_state.event_code != ET_NONE) {
1163 g_string_append_c(dump_p, ',');
1164 _DBG("value %s", dump_p->str);
1165 if ((new_state.event_code & ET_FLAG_START) != 0)
1166 g_string_append_c(dump_p, '+');
1167 else if ((new_state.event_code & ET_FLAG_FINISH) != 0)
1168 g_string_append_c(dump_p, '-');
1169 _DBG("value %s", dump_p->str);
1170 int k = new_state.event_code & ~(ET_FLAG_START | ET_FLAG_FINISH);
1171 if (k >= 0 && k < 32) {
1172 gchar* temp = g_strdup(event_map[k]);
1173 g_string_append(dump_p, temp);
1174 _DBG("value %s", dump_p->str);
1177 g_string_append(dump_p, "Ev");
1178 g_string_append_printf(dump_p, "%d", k);
1179 _DBG("value %s", dump_p->str);
1181 g_string_append_c(dump_p, '=');
1182 _DBG("value %s", dump_p->str);
1184 g_string_append_printf(dump_p, "%d",
1185 new_state.event_tag->sp_idx);
1191 g_string_append(dump_p, "\n");
1193 old_state.state_1 = new_state.state_1;
1194 old_state.state_2 = new_state.state_2;
1196 _DBG("State assigned");
1197 _DBG("%s", dump_p->str);
1198 if (write(fd, dump_p->str, dump_p->len) < 0)
1199 _WARN("write error");
1200 g_string_free(dump_p, TRUE);
1203 // Dump the elapsed time from last event
1204 // It should be dumped without storing
1205 GString *dump_tmp_p = g_string_sized_new(30);
1206 BM_CHECK_MEM_ALLOC(dump_tmp_p, {});
1208 gettimeofday(&tv, NULL);
1210 g_string_append(dump_tmp_p, TIZEN_DUMP_VERSION);
1211 g_string_append_c(dump_tmp_p, ',');
1212 g_string_append(dump_tmp_p, DUMP_DATA_TAG);
1213 g_string_append_c(dump_tmp_p, ',');
1214 g_string_append_printf(dump_tmp_p, "%lld",
1215 ((long long)tv.tv_sec * 1000) + ((long long)tv.tv_usec / 1000) - old_state.time_s);
1216 g_string_append(dump_tmp_p, "\n");
1218 if (write(fd, dump_tmp_p->str, dump_tmp_p->len) < 0)
1219 _WARN("write error");
1220 g_string_free(dump_tmp_p, TRUE);
1222 //Dump i & l values after this
1223 ret = bd_get_and_print_uid_info_entry_from_dump(fd);
1224 if (ret != BATTERY_MONITOR_ERROR_NONE)
1225 _ERR("UID data dump failed");
1226 // Get Last charge time to dump "l" field
1227 long int duration = 0;
1228 bd_get_last_charge_time(base_time/1000, &ret);
1229 duration = lst_charge;
1231 ret = bd_get_and_print_gn_stat_entry_from_dump(fd, duration);
1232 if (ret != BATTERY_MONITOR_ERROR_NONE)
1233 _ERR("GN dump failed");
1234 ret = bd_get_and_print_gwf_stat_entry_from_dump(fd, duration);
1235 if (ret != BATTERY_MONITOR_ERROR_NONE)
1236 _ERR("GWF data dump failed");
1237 ret = bd_get_and_print_gble_stat_entry_from_dump(fd, duration);
1238 if (ret != BATTERY_MONITOR_ERROR_NONE)
1239 _ERR("GBL data dump failed");
1240 ret = bd_get_and_print_gbr_stat_entry_from_dump(fd, duration);
1241 if (ret != BATTERY_MONITOR_ERROR_NONE)
1242 _ERR("GBR data dump failed");
1243 ret = bd_get_and_print_gst_stat_entry_from_dump(fd, duration);
1244 if (ret != BATTERY_MONITOR_ERROR_NONE)
1245 _ERR("GST data dump failed");
1246 ret = bd_get_and_print_gwst_stat_entry_from_dump(fd, duration);
1247 if (ret != BATTERY_MONITOR_ERROR_NONE)
1248 _ERR("GWST data dump failed");
1249 ret = bd_get_and_print_gcpu_stat_entry_from_dump(fd, duration);
1250 if (ret != BATTERY_MONITOR_ERROR_NONE)
1251 _ERR("GCPU data dump failed");
1252 ret = bd_get_and_print_misc_stat_entry_from_dump(fd, duration);
1253 if (ret != BATTERY_MONITOR_ERROR_NONE)
1254 _ERR("MISc data dump failed");
1255 // Battery Usage Dump
1256 ret = bd_get_and_print_battery_usage_from_dump(fd, duration);
1257 if (ret != BATTERY_MONITOR_ERROR_NONE)
1258 _ERR("Battery Usage failed");
1260 _DBG("DUMP COMPLETED/DELETE HASH TABLE");
1262 g_hash_table_destroy(app_map);
1266 return BATTERY_MONITOR_ERROR_NONE;
1269 static int bd_dump_data_item_reset(dump_data_s* old_state)
1272 BM_CHECK_INPUT_PARAM(old_state);
1274 old_state->time_s = -1;
1275 old_state->time_current = -1;
1276 old_state->dump_1 = 0;
1277 old_state->dump_2 = 0;
1278 old_state->state_1 = 0;
1279 old_state->state_2 = 0;
1280 old_state->battery_chargeUAh = 0;
1281 old_state->usage_type = 0;
1282 old_state->usage = 0;
1283 old_state->event_code = ET_NONE;
1284 old_state->event_tag = NULL;
1285 old_state->wakelock_tag = NULL;
1286 old_state->wakereason_tag = NULL;
1289 return BATTERY_MONITOR_ERROR_NONE;
1292 static int bd_free_history_data_memory()
1296 int ret = BATTERY_MONITOR_ERROR_NONE;
1297 h_flag = false; //Lock
1298 _DBG("Free History Data Memory");
1299 for (int i = 0; i < h_count; i++) {
1300 if (history_data[i].wakelock_tag != NULL) {
1301 g_string_free(history_data[i].wakelock_tag->string_info, TRUE);
1302 free(history_data[i].wakelock_tag);
1304 if (history_data[i].wakereason_tag != NULL) {
1305 g_string_free(history_data[i].wakereason_tag->string_info, TRUE);
1306 free(history_data[i].wakereason_tag);
1308 if (history_data[i].event_tag != NULL) {
1309 g_string_free(history_data[i].event_tag->string_info, TRUE);
1310 free(history_data[i].event_tag);
1312 ret = bd_dump_data_item_reset(&history_data[i]);
1313 if (ret != BATTERY_MONITOR_ERROR_NONE)
1314 _ERR("Internal error %d while freeing at idx %d", ret , i);
1317 h_count = 0; h_flag = true;
1322 static int bd_set_history_from_listener(history_item_s* nrec)
1325 BM_CHECK_INPUT_PARAM(nrec);
1327 int dvar1 = 0, dvar2 = 0;
1329 gettimeofday(&tv, NULL);
1331 time_t current_time = tv.tv_sec;
1334 history_data[h_count].time_s = nrec->time_s;
1336 history_data[h_count].time_s = ((long long)tv.tv_sec * 1000) + ((long long)tv.tv_usec / 1000);
1339 if (nrec->battery_plugtype == BD_BPLT_AC || nrec->battery_plugtype == BD_BPLT_WL)
1340 lst_charge = tv.tv_sec;
1342 dvar1 = ((nrec->cmd_s) & 0xff) | ((nrec->battery_level << 8) & 0xff00) |
1343 ((nrec->battery_status << 16) & 0xf0000) |
1344 ((nrec->battery_health << 20) & 0xf00000) |
1345 ((nrec->battery_plugtype << 24) & 0xf000000) |
1346 ((nrec->wakelock_tag != NULL) ? 0x10000000 : 0) |
1347 ((nrec->wakereason_tag != NULL) ? 0x20000000 : 0) |
1348 ((nrec->event_code != ET_NONE) ? 0x40000000 : 0);
1350 dvar2 = ((nrec->battery_temperature) & 0xffff) |
1351 ((nrec->battery_voltage << 16) & 0xffff0000);
1353 _DBG("Value of encoded value 1 %d", dvar1);
1354 _DBG("Value of encoded value 2 %d", dvar2);
1356 history_data[h_count].dump_1 = dvar1;
1357 history_data[h_count].dump_2 = dvar2;
1358 history_data[h_count].battery_chargeUAh = nrec->battery_charge;
1360 if (nrec->wakelock_tag != NULL)
1361 history_data[h_count].wakelock_tag = nrec->wakelock_tag;
1362 if (nrec->wakereason_tag != NULL)
1363 history_data[h_count].wakereason_tag = nrec->wakereason_tag;
1364 if (nrec->event_code != ET_NONE) {
1365 if (nrec->event_tag == NULL) {
1366 _ERR("ET is NULL but Event Code is not");
1367 BM_FREE(history_data[h_count].wakelock_tag);
1368 BM_FREE(history_data[h_count].wakereason_tag);
1369 bd_dump_data_item_reset(&history_data[h_count]);
1370 return BATTERY_MONITOR_ERROR_NO_DATA;
1372 history_data[h_count].event_code = nrec->event_code;
1373 history_data[h_count].event_tag = nrec->event_tag;
1375 if (nrec->cmd_s == CM_CRR_TIME || nrec->cmd_s == CM_RST)
1376 history_data[h_count].time_current = ((long long)tv.tv_sec * 1000) + ((long long)tv.tv_usec / 1000);
1377 else if (nrec->cmd_s == CM_USAGE)
1378 history_data[h_count].time_current = nrec->time_current;
1380 history_data[h_count].state_1 = nrec->state_1;
1381 history_data[h_count].state_2 = nrec->state_2;
1383 history_data[h_count].usage_type = nrec->usage_type;
1384 history_data[h_count].usage = nrec->usage;
1386 nrec->event_tag = NULL; nrec->wakereason_tag = NULL;
1387 nrec->wakelock_tag = NULL;
1388 if (h_count < HISTORY_SIZE_MAX - 1)
1391 // FIXME modify 1st argument (fd)
1392 int ret = bd_print_history_item_main(-1, 0, current_time, 1);
1393 if (ret != BATTERY_MONITOR_ERROR_NONE) {
1397 ret = bd_free_history_data_memory();
1398 if (ret != BATTERY_MONITOR_ERROR_NONE) {
1399 _WARN("Error while memory free %x", ret);
1405 return BATTERY_MONITOR_ERROR_NONE;
1408 int bd_store_history_item(history_item_s* nrec)
1411 BM_CHECK_INPUT_PARAM(nrec);
1414 _ERR("Data Dump in progress");
1415 return BATTERY_MONITOR_ERROR_DATABASE_BUSY;
1417 int ret = BATTERY_MONITOR_ERROR_NONE;
1418 ret = bd_set_history_from_listener(nrec);
1419 if (ret != BATTERY_MONITOR_ERROR_NONE) {
1420 _ERR("Failed to store history");
1421 return BATTERY_MONITOR_ERROR_INTERNAL;
1425 return BATTERY_MONITOR_ERROR_NONE;
1428 static int *dumpsys_handler;
1430 int bd_callback(const int fd, const int argc, char **argv)
1434 bool checkin = false;
1437 * We must reset optind because it isn't initialized
1438 * on subsequent getopt calls
1441 while ((opt = getopt(argc, argv, "c")) != -1) {
1452 ret = bd_print_history_item_main(fd, -1, 0, checkin);
1453 if (ret != BATTERY_MONITOR_ERROR_NONE) {
1454 _ERR("bd_print_history_item_main failed (%x)", ret);
1461 void bd_get_idle_check_time()
1467 int data_collection_try_period;
1468 int data_collection_accept_count;
1470 ret = bm_get_job_scheduler_params(¬_used_int, &data_collection_try_period, &data_collection_accept_count, ¬_used_int);
1471 if (ret != BATTERY_MONITOR_ERROR_NONE) {
1472 min_idle_check_time = 0;
1476 min_idle_check_time = (long long)data_collection_try_period * data_collection_accept_count;
1482 int bd_initialize_battery_dump()
1486 int ret = BATTERY_MONITOR_ERROR_NONE;
1488 h_count = 0; h_flag = true;
1494 ret = bd_print_history_item_reset(&ts);
1495 if (ret == BATTERY_MONITOR_ERROR_NONE) {
1496 ts.cmd_s = CM_CRR_TIME;
1497 ret = bd_store_history_item(&ts);
1498 if (ret != BATTERY_MONITOR_ERROR_NONE)
1499 _WARN("Init Node addition failed");
1503 ret = dumpsys_system_register_dump_cb(bd_callback, "batterystats", (void **)&dumpsys_handler);
1504 if (ret != TIZEN_ERROR_NONE) {
1505 _ERR("dumpsys_system_register_dump_cb failed (%x)", ret);
1506 return BATTERY_MONITOR_ERROR_NOT_INITIALIZED;
1509 bd_get_idle_check_time();
1511 _INFO("Battery Dump Init Successful");
1514 return BATTERY_MONITOR_ERROR_NONE;
1517 int bd_deinitialize_battery_dump()
1523 ret = dumpsys_system_unregister_dump_cb(dumpsys_handler);
1524 if (ret != TIZEN_ERROR_NONE) {
1525 _WARN("dumpsys_system_unregister_dump_cb failed (%x)", ret);
1526 return BATTERY_MONITOR_ERROR_NOT_INITIALIZED;
1529 if (lst_charge != -1) {
1530 resourceid_usage_s battery_use;
1531 battery_use.ResourceId = "battery";
1532 battery_use.log_time = lst_charge;
1533 battery_use.usage = 0;
1534 ret = bm_server_resource_base_usage_insert_to_db(&battery_use);
1535 if (ret != BATTERY_MONITOR_ERROR_NONE)
1536 _WARN("Battery Time Insert fail");
1539 ret = bd_free_history_data_memory();
1540 if (ret != BATTERY_MONITOR_ERROR_NONE)
1541 _WARN("memory free failed (%x)", ret);
1543 _INFO("Battery Dump De-Init Successful");
1546 return BATTERY_MONITOR_ERROR_NONE;