Use the local state for battery monitor state 93/228393/5
authorDoHyun Pyun <dh79.pyun@samsung.com>
Sun, 22 Mar 2020 23:20:17 +0000 (08:20 +0900)
committerDoHyun Pyun <dh79.pyun@samsung.com>
Mon, 23 Mar 2020 22:27:09 +0000 (07:27 +0900)
Change-Id: I0fe1d00eed7d030f5af836aa0b0018439e7422c0
Signed-off-by: DoHyun Pyun <dh79.pyun@samsung.com>
bt-api/bt-adapter.c
bt-api/bt-common.c
bt-api/bt-rfcomm-client.c
bt-api/bt-rfcomm-server.c
bt-api/include/bt-common.h

index 36edc67..fc41fa2 100644 (file)
 #define VCONFKEY_BATTERY_MONITOR_STATUS "db/bluetooth/bmstatus"
 #endif
 
+
+typedef enum {
+       BT_MONITOR_NONE = -1,
+       BT_MONITOR_OFF = 0,
+       BT_MONITOR_ON = 1,
+} bt_battery_monitor_state_t;
+
+static int battery_monitor_state = BT_MONITOR_NONE;
+
 static int __bt_fill_device_list(GArray *out_param2, GPtrArray **dev_list)
 {
        int i;
@@ -117,16 +126,57 @@ BT_EXPORT_API int bluetooth_set_battery_monitor_state(bool state)
                BT_ERR("vconf_set_bool failed");
                return BLUETOOTH_ERROR_INTERNAL;
        }
+
+       battery_monitor_state = (state == false) ? BT_MONITOR_OFF : BT_MONITOR_ON;
+
        return BLUETOOTH_ERROR_NONE;
 }
 
+static void __bt_battery_monitor_status_changed_cb(keynode_t *node, void *data)
+{
+       gboolean status = FALSE;
+       int type;
+
+       type = vconf_keynode_get_type(node);
+       if (type == VCONF_TYPE_BOOL) {
+               status = vconf_keynode_get_bool(node);
+
+               BT_DBG("Update the monitor state to %d", status);
+
+               battery_monitor_state = (status == FALSE) ? BT_MONITOR_OFF : BT_MONITOR_ON;
+       } else {
+               BT_ERR("Invaild vconf key type : %d", type);
+               return;
+       }
+}
+
+void _bt_reset_battery_monitor_info(void)
+{
+       vconf_ignore_key_changed(VCONFKEY_BATTERY_MONITOR_STATUS,
+                       (vconf_callback_fn)__bt_battery_monitor_status_changed_cb);
+
+       _bt_rfcomm_server_reset_timer();
+       _bt_rfcomm_client_reset_timer();
+
+       battery_monitor_state = BT_MONITOR_NONE;
+}
+
 BT_EXPORT_API int bluetooth_get_battery_monitor_state()
 {
        int state = 0;
 
+       if (battery_monitor_state != BT_MONITOR_NONE)
+               return battery_monitor_state;
+
        if (vconf_get_bool(VCONFKEY_BATTERY_MONITOR_STATUS, &state) != 0)
                BT_ERR("vconf_get_bool failed");
 
+       battery_monitor_state = state;
+
+       if (vconf_notify_key_changed(VCONFKEY_BATTERY_MONITOR_STATUS,
+               (vconf_callback_fn)__bt_battery_monitor_status_changed_cb, NULL) < 0)
+                       BT_ERR("Unable to register key handler");
+
        return state;
 }
 
index b87ebe4..2161643 100644 (file)
@@ -182,7 +182,6 @@ int _bt_common_send_rfcomm_tx_details(int len)
 void _bt_common_event_cb(int event, int result, void *param,
                                        void *callback, void *user_data)
 {
-       BT_DBG("+");
        bluetooth_event_param_t bt_event = { 0, };
        bt_event.event = event;
        bt_event.result = result;
@@ -2496,6 +2495,8 @@ BT_EXPORT_API int bluetooth_unregister_callback(void)
 
        _bt_set_obex_server_id(BT_NO_SERVER);
 
+       _bt_reset_battery_monitor_info();
+
        _bt_gdbus_deinit_proxys();
 
        if (profile_gproxy) {
index a0f5aff..65c983c 100644 (file)
@@ -78,40 +78,38 @@ static void __client_connected_cb(rfcomm_cb_data_t *cb_data,
 
 static bool __rfcomm_record_tx_data(void)
 {
-       if (bluetooth_get_battery_monitor_state()) {
-               if (tx_data > 0) {
-                       int ret = _bt_common_send_rfcomm_tx_details(tx_data);
-                       if (ret == BLUETOOTH_ERROR_NONE) {
-                               tx_data = 0;
-                               return TRUE;
-                       } else {
-                               BT_ERR("RFCOMM tx data could not be registered");
-                       }
+       if (tx_data > 0) {
+               int ret = _bt_common_send_rfcomm_tx_details(tx_data);
+               if (ret == BLUETOOTH_ERROR_NONE) {
+                       tx_data = 0;
+                       return TRUE;
+               } else {
+                       BT_ERR("RFCOMM tx data could not be registered");
                }
        }
 
        tx_data = 0;
        tx_tag = 0;
+
        return FALSE;
 }
 
 static bool __rfcomm_record_rx_data(void)
 {
-       if (bluetooth_get_battery_monitor_state()) {
-               if (rx_data) {
-                       int ret = _bt_common_send_rfcomm_rx_details(rx_data);
-                       if (ret == BLUETOOTH_ERROR_NONE) {
-                               rx_data = 0;
-                               return TRUE;
-                       } else {
-                               BT_ERR("RFCOMM rx data could not be registered");
-                       }
+       if (rx_data) {
+               int ret = _bt_common_send_rfcomm_rx_details(rx_data);
+               if (ret == BLUETOOTH_ERROR_NONE) {
+                       rx_data = 0;
+                       return TRUE;
+               } else {
+                       BT_ERR("RFCOMM rx data could not be registered");
                }
        }
 
        rx_data = 0;
        rx_tag = 0;
-        return FALSE;
+
+       return FALSE;
 }
 
 static void __bt_free_cb_data(rfcomm_cb_data_t *cb_data)
@@ -366,7 +364,6 @@ static gboolean __client_data_received_cb(GIOChannel *chan, GIOCondition cond,
        GIOStatus status = G_IO_STATUS_NORMAL;
        GError *err = NULL;
        int fd;
-       BT_DBG("+");
 
        retv_if(info == NULL, FALSE);
        fd = g_io_channel_unix_get_fd(chan);
@@ -448,7 +445,6 @@ static gboolean __client_data_received_cb(GIOChannel *chan, GIOCondition cond,
        }
 
        g_free(buffer);
-       BT_DBG("-");
        return TRUE;
 }
 
@@ -520,6 +516,22 @@ void _bt_rfcomm_client_disconnect_all(void)
        return;
 }
 
+void _bt_rfcomm_client_reset_timer(void)
+{
+       if (rx_tag > 0) {
+               rx_tag = 0;
+               g_source_remove(rx_tag);
+       }
+
+       if (tx_tag > 0) {
+               g_source_remove(tx_tag);
+               tx_tag = 0;
+       }
+
+       rx_data = 0;
+       tx_data = 0;
+}
+
 int new_connection(const char *path, int fd, bluetooth_device_address_t *addr)
 {
        rfcomm_cb_data_t *info;
index d8a42f3..1365077 100644 (file)
@@ -61,20 +61,19 @@ static guint rx_tag = 0;
 
 static bool __rfcomm_record_rx_data(void)
 {
-       BT_INFO("");
-       if (bluetooth_get_battery_monitor_state()) {
-               if (rx_data) {
-                       int ret = _bt_common_send_rfcomm_rx_details(rx_data);
-                       if (ret == BLUETOOTH_ERROR_NONE) {
-                               rx_data = 0;
-                               return TRUE;
-                       }
-                       else {
-                               BT_ERR("RFCOMM rx data could not be registered");
-                       }
+       if (rx_data) {
+               int ret = _bt_common_send_rfcomm_rx_details(rx_data);
+               if (ret == BLUETOOTH_ERROR_NONE) {
+                       rx_data = 0;
+                       return TRUE;
+               } else {
+                       BT_ERR("RFCOMM rx data could not be registered");
                }
        }
+
+       rx_data = 0;
        rx_tag = 0;
+
        return FALSE;
 }
 
@@ -548,6 +547,16 @@ void _bt_rfcomm_server_disconnect_all(void)
 
        return;
 }
+
+void _bt_rfcomm_server_reset_timer(void)
+{
+       if (rx_tag > 0) {
+               g_source_remove(rx_tag);
+               rx_tag = 0;
+       }
+
+       rx_data = 0;
+}
 #else
 
 #define BT_RFCOMM_SERVER_ID_MAX 254
index f3019a5..c74baaf 100644 (file)
@@ -408,6 +408,12 @@ void _bt_rfcomm_client_disconnect_all(void);
 gboolean _check_uuid_path(char *path, char *uuid);
 #endif
 
+void _bt_rfcomm_server_reset_timer(void);
+
+void _bt_rfcomm_client_reset_timer(void);
+
+void _bt_reset_battery_monitor_info(void);
+
 int _bt_hid_device_get_fd(const char *address, int *ctrl, int *intr);
 
 int _bt_hid_new_connection(bluetooth_device_address_t *addr,
@@ -420,6 +426,7 @@ int _bt_get_error_value_from_message(const char *error_message);
 void _bt_hdp_app_remove_obj_info(unsigned int channe_id);
 int _bt_hdp_app_acquire_fd(bt_hdp_connected_t *conn_info);
 
+
 #ifdef __cplusplus
 }
 #endif /* __cplusplus */