#define MOCK_LOCATION_CLEAR_VALUE 999
#define MOCK_RUNNING_OFF LBS_SERVER_METHOD_SIZE
+#define MAX_BATCH_INTERVAL 255
+#define MAX_BATCH_PERIOD 60000
typedef struct {
/* gps variables */
}
}
+/*
+*
+* Please reference following diagram when you need to manipulate the dynamic_interval_table.
+*
+* |----------------------------------------------------------------------|
+* | | Interval | Index |
+* |----------------------------------------------------------------------|
+* | LBS_SERVER_METHOD_GPS | Used | 0 |
+* | LBS_SERVER_METHOD_NPS | Used | 1 |
+* | LBS_SERVER_METHOD_AGPS | Not Used | 2 |
+* | LBS_SERVER_METHOD_GEOFENCE | Not Used | 3 |
+* | LBS_SERVER_METHOD_MOCK | Not Used | 4 |
+* | INTERVAL_ARRAY_GPS2 | Used | 5 (LBS_SERVER_METHOD_SIZE) |
+* | INTERVAL_ARRAY_WPS2 | Used | 6 |
+* |----------------------------------------------------------------------|
+*
+*/
+
static void update_dynamic_interval_table_foreach_cb(gpointer key, gpointer value, gpointer userdata)
{
guint *interval_array = (guint *)value;
lbs_server_s *lbs_server = updator_ud->lbs_server;
int method = updator_ud->method;
- LOG_GPS(DBG_LOW, "method:[%d], key:[%s] interval:[%u], current optimized interval [%u]", method, (char *)key, interval_array[method], lbs_server->optimized_interval_array[method]);
- if ((lbs_server->temp_minimum_interval > interval_array[method]))
- lbs_server->temp_minimum_interval = interval_array[method];
+ if (method == LBS_SERVER_METHOD_GPS || method == LBS_SERVER_METHOD_NPS) {
+ guint interval1 = interval_array[method];
+ guint interval2 = interval_array[method + LBS_SERVER_METHOD_SIZE];
+
+ if ((lbs_server->temp_minimum_interval > interval1) && (interval1 > 0))
+ lbs_server->temp_minimum_interval = interval1;
+
+ if ((lbs_server->temp_minimum_interval > interval2) && (interval2 > 0))
+ lbs_server->temp_minimum_interval = interval2;
+ }
+ LOG_GPS(DBG_LOW, "method:[%d], key:[%s] interval:[%u], temp_min[%u]", method, (char *)key, interval_array[method], lbs_server->temp_minimum_interval);
+}
+
+static void __add_interval_table(guint *interval_array, int method, guint interval, gpointer userdata)
+{
+ LOG_GPS(DBG_LOW, "Add interval to dynamic array [%u]", interval);
+ lbs_server_s *lbs_server = (lbs_server_s *)userdata;
+ lbs_server->temp_minimum_interval = interval;
+
+ if (method == LBS_SERVER_METHOD_GPS || method == LBS_SERVER_METHOD_NPS) {
+ if (interval_array[method] == 0) {
+ interval_array[method] = interval;
+ } else {
+ if (interval_array[method + LBS_SERVER_METHOD_SIZE] == 0) {
+ interval_array[method + LBS_SERVER_METHOD_SIZE] = interval;
+
+ if (interval_array[method] < interval)
+ lbs_server->temp_minimum_interval = interval_array[method];
+ }
+ }
+ }
+}
+
+static void __remove_interval_table(guint *interval_array, int method, guint interval, gpointer userdata)
+{
+ LOG_GPS(DBG_LOW, "Remove interval from table[%u]", interval);
+ lbs_server_s *lbs_server = (lbs_server_s *)userdata;
+ lbs_server->temp_minimum_interval = interval;
+
+ if (method == LBS_SERVER_METHOD_GPS || method == LBS_SERVER_METHOD_NPS) {
+ if (interval == 0) {
+ interval_array[method] = 0;
+ interval_array[method + LBS_SERVER_METHOD_SIZE] = 0;
+ } else if (interval_array[method + LBS_SERVER_METHOD_SIZE] == interval) {
+ interval_array[method + LBS_SERVER_METHOD_SIZE] = 0;
+ } else if (interval_array[method] == interval) {
+ interval_array[method] = interval_array[method + LBS_SERVER_METHOD_SIZE];
+ interval_array[method + LBS_SERVER_METHOD_SIZE] = 0;
+ } else {
+ LOG_GPS(DBG_LOW, "interval[%u] is not exist.", interval);
+ }
+ }
+}
+
+static void __update_interval_table(guint *interval_array, int method, guint interval, guint prev_interval, gpointer userdata)
+{
+ LOG_GPS(DBG_LOW, "Update interval from table[%u -> %u]", prev_interval, interval);
+ lbs_server_s *lbs_server = (lbs_server_s *)userdata;
+ lbs_server->temp_minimum_interval = interval;
+
+ if (method == LBS_SERVER_METHOD_GPS || method == LBS_SERVER_METHOD_NPS) {
+ if (interval_array[method] == prev_interval)
+ interval_array[method] = interval;
+ else if (interval_array[method + LBS_SERVER_METHOD_SIZE] == prev_interval)
+ interval_array[method + LBS_SERVER_METHOD_SIZE] = interval;
+ else
+ LOG_GPS(DBG_LOW, "interval[%u] is not exist. cannot change to [%u]", prev_interval, interval);
+ }
}
-static gboolean update_pos_tracking_interval(lbs_server_interval_manipulation_type type, const gchar *client, int method, guint interval, gpointer userdata)
+static gboolean update_pos_tracking_interval(lbs_server_interval_manipulation_type type, const gchar *client, int method, guint interval, guint prev_interval, gpointer userdata)
{
LOG_GPS(DBG_LOW, "ENTER >>>");
if (userdata == NULL) return FALSE;
guint *interval_array = (guint *) g_hash_table_lookup(lbs_server->dynamic_interval_table, client_cpy);
if (!interval_array) {
- /* LOG_GPS(DBG_LOW, "first add key[%s] to interval-table", client); */
- interval_array = (guint *)g_malloc0(LBS_SERVER_METHOD_SIZE * sizeof(guint));
+ LOG_GPS(DBG_LOW, "first add key[%s] to interval-table", client);
+ interval_array = (guint *)g_malloc0(INTERVAL_ARRAY_MAX * sizeof(guint));
if (!interval_array) {
- /* LOG_GPS(DBG_ERR, "interval_array is NULL"); */
+ LOG_GPS(DBG_ERR, "interval_array is NULL");
g_free(client_cpy);
return FALSE;
}
g_hash_table_insert(lbs_server->dynamic_interval_table, (gpointer)client_cpy, (gpointer)interval_array);
}
- interval_array[method] = interval;
- lbs_server->temp_minimum_interval = interval;
- /* LOG_GPS(DBG_LOW, "ADD done"); */
+
+ __add_interval_table(interval_array, method, interval, userdata);
+
+ LOG_GPS(DBG_LOW, "ADD done");
break;
}
case LBS_SERVER_INTERVAL_REMOVE: {
- LOG_GPS(DBG_LOW, "REMOVE, client[%s], method[%d]", client, method);
- lbs_server->temp_minimum_interval = 120; /* interval max value */
+ LOG_GPS(DBG_LOW, "REMOVE, client[%s], method[%d], interval[%u]", client, method, interval);
+ lbs_server->temp_minimum_interval = 120;
guint *interval_array = (guint *) g_hash_table_lookup(lbs_server->dynamic_interval_table, client);
if (!interval_array) {
LOG_GPS(DBG_INFO, "Client[%s] Method[%d] is already removed from interval-table", client, method);
break;
}
LOG_GPS(DBG_LOW, "Found interval_array[%d](%p):[%u] from interval-table", method, interval_array, interval_array[method]);
- interval_array[method] = 0;
+
+ __remove_interval_table(interval_array, method, interval, userdata);
int i = 0;
- guint interval_each = 0;
gboolean is_need_remove_client_from_table = TRUE;
for (i = 0; i < LBS_SERVER_METHOD_SIZE; i++) {
- interval_each = interval_array[i];
- if (interval_each != 0) {
- LOG_GPS(DBG_LOW, "[%s] method[%d]'s interval is not zero - interval: %d. It will not be removed.", client, i, interval_each);
+ if (interval_array[i] != 0) {
+ LOG_GPS(DBG_LOW, "[%s] method[%d]'s interval[%d] is not zero.", client, i, interval_array[i]);
is_need_remove_client_from_table = FALSE;
break;
}
}
case LBS_SERVER_INTERVAL_UPDATE: {
- LOG_GPS(DBG_LOW, "UPDATE client[%s], method[%d], interval[%u]", client, method, interval);
+ LOG_GPS(DBG_LOW, "UPDATE client[%s], method[%d], interval[%u -> %u]", client, method, prev_interval, interval);
guint *interval_array = (guint *) g_hash_table_lookup(lbs_server->dynamic_interval_table, client);
if (!interval_array) {
LOG_GPS(DBG_LOW, "Client[%s] is not exist in interval-table", client, method);
break;
}
- interval_array[method] = interval;
- lbs_server->temp_minimum_interval = interval;
+
+ __update_interval_table(interval_array, method, interval, prev_interval, userdata);
+
LOG_GPS(DBG_LOW, "UPDATE done.");
break;
}
g_hash_table_foreach(lbs_server->dynamic_interval_table, (GHFunc)update_dynamic_interval_table_foreach_cb, (gpointer)&updator_user_data);
if (lbs_server->optimized_interval_array[method] != lbs_server->temp_minimum_interval) {
- LOG_GPS(DBG_INFO, "Changing optimized_interval value [%u -> %u] for method [%d]",
- lbs_server->optimized_interval_array[method], lbs_server->temp_minimum_interval, method);
+ LOG_GPS(DBG_INFO, "Changing method[%d]'s optimized_interval value %u -> [ %u ]",
+ method, lbs_server->optimized_interval_array[method], lbs_server->temp_minimum_interval);
lbs_server->optimized_interval_array[method] = lbs_server->temp_minimum_interval;
/* need to send message to provider device */
char *option = NULL;
char *app_id = NULL;
guint interval = 0;
+ guint prev_interval = 0;
lbs_server_method_e method = 0;
if (!g_strcmp0(g_variant_get_string(value, &length), "START")) {
while (g_variant_iter_next(&iter, "{&sv}", &key, &value)) {
- if (!g_strcmp0(key, "METHOD")) {
+ if (!g_strcmp0(key, "METHOD"))
method = g_variant_get_int32(value);
- LOG_GPS(DBG_LOW, "METHOD [%d]", method);
- }
- if (!g_strcmp0(key, "INTERVAL")) {
+ if (!g_strcmp0(key, "INTERVAL"))
interval = g_variant_get_uint32(value);
- LOG_GPS(DBG_LOW, "INTERVAL [%u]", interval);
- }
- if (!g_strcmp0(key, "APP_ID")) {
+ if (!g_strcmp0(key, "APP_ID"))
app_id = g_variant_dup_string(value, &length);
- LOG_GPS(DBG_LOW, "APP_ID [%s]", app_id);
- }
}
+ LOG_GPS(DBG_LOW, "METHOD [%d], INTERVAL [%u], APP_ID [%s]", method, interval, app_id);
if (client)
- update_pos_tracking_interval(LBS_SERVER_INTERVAL_ADD, client, method, interval, lbs_server);
+ update_pos_tracking_interval(LBS_SERVER_INTERVAL_ADD, client, method, interval, 0, lbs_server);
if (app_id) {
if (LBS_SERVER_METHOD_GPS == method)
} else if (!g_strcmp0(g_variant_get_string(value, &length), "STOP")) {
while (g_variant_iter_next(&iter, "{&sv}", &key, &value)) {
- if (!g_strcmp0(key, "METHOD")) {
+ if (!g_strcmp0(key, "METHOD"))
method = g_variant_get_int32(value);
- LOG_GPS(DBG_LOW, "METHOD [%d]", method);
- }
- if (!g_strcmp0(key, "APP_ID")) {
+ if (!g_strcmp0(key, "INTERVAL"))
+ interval = g_variant_get_uint32(value);
+
+ if (!g_strcmp0(key, "APP_ID"))
app_id = g_variant_dup_string(value, &length);
- LOG_GPS(DBG_LOW, "APP_ID [%s]", app_id);
- }
}
+ LOG_GPS(DBG_LOW, "METHOD [%d], INTERVAL [%u], APP_ID [%s]", method, interval, app_id);
if (client)
- update_pos_tracking_interval(LBS_SERVER_INTERVAL_REMOVE, client, method, interval, lbs_server);
+ update_pos_tracking_interval(LBS_SERVER_INTERVAL_REMOVE, client, method, interval, 0, lbs_server);
if (app_id) {
if (LBS_SERVER_METHOD_GPS == method)
is_update_interval_method = TRUE;
}
- if (!g_strcmp0(key, "INTERVAL_UPDATE")) {
+ if (!g_strcmp0(key, "INTERVAL_UPDATE"))
interval = g_variant_get_uint32(value);
- LOG_GPS(DBG_LOW, "INTERVAL_UPDATE [%u] <-- [%u] ", interval, lbs_server->temp_minimum_interval);
- if (interval != lbs_server->temp_minimum_interval)
- is_update_interval = TRUE;
- }
+
+ if (!g_strcmp0(key, "PREV_INTERVAL"))
+ prev_interval = g_variant_get_uint32(value);
}
+ LOG_GPS(DBG_LOW, "PREV_INTERVAL [%u] --> INTERVAL_UPDATE [%u], min [%u] ", prev_interval, interval, lbs_server->temp_minimum_interval);
+ if ((interval != prev_interval) && (prev_interval > 0))
+ is_update_interval = TRUE;
+
if (is_update_interval && is_update_interval_method && client) {
- update_pos_tracking_interval(LBS_SERVER_INTERVAL_UPDATE, client, method, interval, lbs_server);
+ update_pos_tracking_interval(LBS_SERVER_INTERVAL_UPDATE, client, method, interval, prev_interval, lbs_server);
if (lbs_server->is_needed_changing_interval) {
lbs_server->is_needed_changing_interval = FALSE;
request_change_pos_update_interval(method, (gpointer)lbs_server);
static void gps_update_position_cb(pos_data_t *pos, gps_error_t error, void *user_data)
{
- /* LOG_GPS(DBG_LOW, "ENTER >>>"); */
GVariant *accuracy = NULL;
LbsPositionExtFields fields;
static void gps_update_batch_cb(batch_data_t *batch, void *user_data)
{
- /* LOG_GPS(DBG_LOW, "gps_update_batch_cb"); */
lbs_server_s *lbs_server = (lbs_server_s *)(user_data);
memcpy(&lbs_server->batch, batch, sizeof(batch_data_t));
#ifndef TIZEN_DEVICE
lbs_server->batch_interval_table = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free);
lbs_server->optimized_batch_array = (guint *)g_malloc0(LBS_BATCH_SIZE * sizeof(guint));
- lbs_server->optimized_batch_array[LBS_BATCH_INTERVAL] = 150;
- lbs_server->optimized_batch_array[LBS_BATCH_PERIOD] = 60000;
+ lbs_server->optimized_batch_array[LBS_BATCH_INTERVAL] = MAX_BATCH_INTERVAL;
+ lbs_server->optimized_batch_array[LBS_BATCH_PERIOD] = MAX_BATCH_PERIOD;
#endif
}
}
}
- lbs_server->optimized_batch_array[LBS_BATCH_INTERVAL] = 151;
- lbs_server->optimized_batch_array[LBS_BATCH_PERIOD] = 60001;
+ lbs_server->optimized_batch_array[LBS_BATCH_INTERVAL] = MAX_BATCH_INTERVAL + 1;
+ lbs_server->optimized_batch_array[LBS_BATCH_PERIOD] = MAX_BATCH_PERIOD + 1;
if (g_hash_table_size(lbs_server->batch_interval_table) == 0) {
return FALSE;