upload android base code part4
This commit is contained in:
parent
b9e30e05b1
commit
78ea2404cd
23455 changed files with 5250148 additions and 0 deletions
61
android/hardware/qcom/gps/utils/Android.mk
Normal file
61
android/hardware/qcom/gps/utils/Android.mk
Normal file
|
@ -0,0 +1,61 @@
|
|||
ifneq ($(BOARD_VENDOR_QCOM_GPS_LOC_API_HARDWARE),)
|
||||
ifneq ($(BUILD_TINY_ANDROID),true)
|
||||
#Compile this library only for builds with the latest modem image
|
||||
|
||||
LOCAL_PATH := $(call my-dir)
|
||||
|
||||
include $(CLEAR_VARS)
|
||||
|
||||
## Libs
|
||||
LOCAL_SHARED_LIBRARIES := \
|
||||
libutils \
|
||||
libcutils \
|
||||
liblog
|
||||
|
||||
LOCAL_SRC_FILES += \
|
||||
loc_log.cpp \
|
||||
loc_cfg.cpp \
|
||||
msg_q.c \
|
||||
linked_list.c \
|
||||
loc_target.cpp \
|
||||
loc_timer.c \
|
||||
../platform_lib_abstractions/elapsed_millis_since_boot.cpp \
|
||||
loc_misc_utils.cpp
|
||||
|
||||
LOCAL_CFLAGS += \
|
||||
-fno-short-enums \
|
||||
-D_ANDROID_
|
||||
|
||||
ifeq ($(TARGET_BUILD_VARIANT),user)
|
||||
LOCAL_CFLAGS += -DTARGET_BUILD_VARIANT_USER
|
||||
endif
|
||||
|
||||
LOCAL_LDFLAGS += -Wl,--export-dynamic
|
||||
|
||||
## Includes
|
||||
LOCAL_C_INCLUDES:= \
|
||||
$(LOCAL_PATH)/../platform_lib_abstractions
|
||||
|
||||
LOCAL_COPY_HEADERS_TO:= gps.utils/
|
||||
LOCAL_COPY_HEADERS:= \
|
||||
loc_log.h \
|
||||
loc_cfg.h \
|
||||
log_util.h \
|
||||
linked_list.h \
|
||||
msg_q.h \
|
||||
loc_target.h \
|
||||
loc_timer.h \
|
||||
../platform_lib_abstractions/platform_lib_includes.h \
|
||||
../platform_lib_abstractions/platform_lib_time.h \
|
||||
../platform_lib_abstractions/platform_lib_macros.h \
|
||||
loc_misc_utils.h
|
||||
|
||||
LOCAL_MODULE := libgps.utils
|
||||
|
||||
LOCAL_MODULE_TAGS := optional
|
||||
|
||||
LOCAL_PRELINK_MODULE := false
|
||||
|
||||
include $(BUILD_SHARED_LIBRARY)
|
||||
endif # not BUILD_TINY_ANDROID
|
||||
endif # BOARD_VENDOR_QCOM_GPS_LOC_API_HARDWARE
|
44
android/hardware/qcom/gps/utils/Makefile.am
Normal file
44
android/hardware/qcom/gps/utils/Makefile.am
Normal file
|
@ -0,0 +1,44 @@
|
|||
AM_CFLAGS = -Wundef \
|
||||
-MD \
|
||||
-Wno-trigraphs \
|
||||
-g -O0 \
|
||||
-fno-inline \
|
||||
-fno-short-enums \
|
||||
-fpic \
|
||||
-I../platform_lib_abstractions
|
||||
|
||||
libgps_utils_so_la_h_sources = log_util.h \
|
||||
msg_q.h \
|
||||
linked_list.h \
|
||||
loc_cfg.h \
|
||||
loc_log.h \
|
||||
../platform_lib_abstractions/platform_lib_includes.h \
|
||||
../platform_lib_abstractions/platform_lib_time.h \
|
||||
../platform_lib_abstractions/platform_lib_macros.h
|
||||
|
||||
libgps_utils_so_la_c_sources = linked_list.c \
|
||||
msg_q.c \
|
||||
loc_cfg.cpp \
|
||||
loc_log.cpp \
|
||||
../platform_lib_abstractions/elapsed_millis_since_boot.cpp
|
||||
|
||||
library_includedir = $(pkgincludedir)/utils
|
||||
|
||||
library_include_HEADERS = $(libgps_utils_so_la_h_sources)
|
||||
|
||||
libgps_utils_so_la_SOURCES = $(libgps_utils_so_la_c_sources)
|
||||
|
||||
if USE_GLIB
|
||||
libgps_utils_so_la_CFLAGS = -DUSE_GLIB $(AM_CFLAGS) @GLIB_CFLAGS@
|
||||
libgps_utils_so_la_LDFLAGS = -lstdc++ -lpthread @GLIB_LIBS@ -shared -version-info 1:0:0
|
||||
libgps_utils_so_la_CPPFLAGS = -DUSE_GLIB $(AM_CFLAGS) $(AM_CPPFLAGS) @GLIB_CFLAGS@
|
||||
else
|
||||
libgps_utils_so_la_CFLAGS = $(AM_CFLAGS)
|
||||
libgps_utils_so_la_LDFLAGS = -lpthread -shared -version-info 1:0:0
|
||||
libgps_utils_so_la_CPPFLAGS = $(AM_CFLAGS) $(AM_CPPFLAGS)
|
||||
endif
|
||||
|
||||
libgps_utils_so_la_LIBADD = -lstdc++ -lcutils
|
||||
|
||||
#Create and Install libraries
|
||||
lib_LTLIBRARIES = libgps_utils_so.la
|
328
android/hardware/qcom/gps/utils/linked_list.c
Normal file
328
android/hardware/qcom/gps/utils/linked_list.c
Normal file
|
@ -0,0 +1,328 @@
|
|||
/* Copyright (c) 2011, The Linux Foundation. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are
|
||||
* met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following
|
||||
* disclaimer in the documentation and/or other materials provided
|
||||
* with the distribution.
|
||||
* * Neither the name of The Linux Foundation nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
|
||||
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
|
||||
* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
|
||||
* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include "linked_list.h"
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#define LOG_TAG "LocSvc_utils_ll"
|
||||
#include "log_util.h"
|
||||
#include "platform_lib_includes.h"
|
||||
#include <stdlib.h>
|
||||
#include <stdint.h>
|
||||
|
||||
typedef struct list_element {
|
||||
struct list_element* next;
|
||||
struct list_element* prev;
|
||||
void* data_ptr;
|
||||
void (*dealloc_func)(void*);
|
||||
}list_element;
|
||||
|
||||
typedef struct list_state {
|
||||
list_element* p_head;
|
||||
list_element* p_tail;
|
||||
} list_state;
|
||||
|
||||
/* ----------------------- END INTERNAL FUNCTIONS ---------------------------------------- */
|
||||
|
||||
/*===========================================================================
|
||||
|
||||
FUNCTION: linked_list_init
|
||||
|
||||
===========================================================================*/
|
||||
linked_list_err_type linked_list_init(void** list_data)
|
||||
{
|
||||
if( list_data == NULL )
|
||||
{
|
||||
LOC_LOGE("%s: Invalid list parameter!\n", __FUNCTION__);
|
||||
return eLINKED_LIST_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
list_state* tmp_list;
|
||||
tmp_list = (list_state*)calloc(1, sizeof(list_state));
|
||||
if( tmp_list == NULL )
|
||||
{
|
||||
LOC_LOGE("%s: Unable to allocate space for list!\n", __FUNCTION__);
|
||||
return eLINKED_LIST_FAILURE_GENERAL;
|
||||
}
|
||||
|
||||
tmp_list->p_head = NULL;
|
||||
tmp_list->p_tail = NULL;
|
||||
|
||||
*list_data = tmp_list;
|
||||
|
||||
return eLINKED_LIST_SUCCESS;
|
||||
}
|
||||
|
||||
/*===========================================================================
|
||||
|
||||
FUNCTION: linked_list_destroy
|
||||
|
||||
===========================================================================*/
|
||||
linked_list_err_type linked_list_destroy(void** list_data)
|
||||
{
|
||||
if( list_data == NULL )
|
||||
{
|
||||
LOC_LOGE("%s: Invalid list parameter!\n", __FUNCTION__);
|
||||
return eLINKED_LIST_INVALID_HANDLE;
|
||||
}
|
||||
|
||||
list_state* p_list = (list_state*)*list_data;
|
||||
|
||||
linked_list_flush(p_list);
|
||||
|
||||
free(*list_data);
|
||||
*list_data = NULL;
|
||||
|
||||
return eLINKED_LIST_SUCCESS;
|
||||
}
|
||||
|
||||
/*===========================================================================
|
||||
|
||||
FUNCTION: linked_list_add
|
||||
|
||||
===========================================================================*/
|
||||
linked_list_err_type linked_list_add(void* list_data, void *data_obj, void (*dealloc)(void*))
|
||||
{
|
||||
LOC_LOGD("%s: Adding to list data_obj = 0x%08X\n", __FUNCTION__, data_obj);
|
||||
if( list_data == NULL )
|
||||
{
|
||||
LOC_LOGE("%s: Invalid list parameter!\n", __FUNCTION__);
|
||||
return eLINKED_LIST_INVALID_HANDLE;
|
||||
}
|
||||
|
||||
if( data_obj == NULL )
|
||||
{
|
||||
LOC_LOGE("%s: Invalid input parameter!\n", __FUNCTION__);
|
||||
return eLINKED_LIST_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
list_state* p_list = (list_state*)list_data;
|
||||
list_element* elem = (list_element*)malloc(sizeof(list_element));
|
||||
if( elem == NULL )
|
||||
{
|
||||
LOC_LOGE("%s: Memory allocation failed\n", __FUNCTION__);
|
||||
return eLINKED_LIST_FAILURE_GENERAL;
|
||||
}
|
||||
|
||||
/* Copy data to newly created element */
|
||||
elem->data_ptr = data_obj;
|
||||
elem->next = NULL;
|
||||
elem->prev = NULL;
|
||||
elem->dealloc_func = dealloc;
|
||||
|
||||
/* Replace head element */
|
||||
list_element* tmp = p_list->p_head;
|
||||
p_list->p_head = elem;
|
||||
/* Point next to the previous head element */
|
||||
p_list->p_head->next = tmp;
|
||||
|
||||
if( tmp != NULL )
|
||||
{
|
||||
tmp->prev = p_list->p_head;
|
||||
}
|
||||
else
|
||||
{
|
||||
p_list->p_tail = p_list->p_head;
|
||||
}
|
||||
|
||||
return eLINKED_LIST_SUCCESS;
|
||||
}
|
||||
|
||||
/*===========================================================================
|
||||
|
||||
FUNCTION: linked_list_remove
|
||||
|
||||
===========================================================================*/
|
||||
linked_list_err_type linked_list_remove(void* list_data, void **data_obj)
|
||||
{
|
||||
LOC_LOGD("%s: Removing from list\n", __FUNCTION__);
|
||||
if( list_data == NULL )
|
||||
{
|
||||
LOC_LOGE("%s: Invalid list parameter!\n", __FUNCTION__);
|
||||
return eLINKED_LIST_INVALID_HANDLE;
|
||||
}
|
||||
|
||||
if( data_obj == NULL )
|
||||
{
|
||||
LOC_LOGE("%s: Invalid input parameter!\n", __FUNCTION__);
|
||||
return eLINKED_LIST_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
list_state* p_list = (list_state*)list_data;
|
||||
if( p_list->p_tail == NULL )
|
||||
{
|
||||
return eLINKED_LIST_UNAVAILABLE_RESOURCE;
|
||||
}
|
||||
|
||||
list_element* tmp = p_list->p_tail;
|
||||
|
||||
/* Replace tail element */
|
||||
p_list->p_tail = tmp->prev;
|
||||
|
||||
if( p_list->p_tail != NULL )
|
||||
{
|
||||
p_list->p_tail->next = NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
p_list->p_head = p_list->p_tail;
|
||||
}
|
||||
|
||||
/* Copy data to output param */
|
||||
*data_obj = tmp->data_ptr;
|
||||
|
||||
/* Free allocated list element */
|
||||
free(tmp);
|
||||
|
||||
return eLINKED_LIST_SUCCESS;
|
||||
}
|
||||
|
||||
/*===========================================================================
|
||||
|
||||
FUNCTION: linked_list_empty
|
||||
|
||||
===========================================================================*/
|
||||
int linked_list_empty(void* list_data)
|
||||
{
|
||||
if( list_data == NULL )
|
||||
{
|
||||
LOC_LOGE("%s: Invalid list parameter!\n", __FUNCTION__);
|
||||
return (int)eLINKED_LIST_INVALID_HANDLE;
|
||||
}
|
||||
else
|
||||
{
|
||||
list_state* p_list = (list_state*)list_data;
|
||||
return p_list->p_head == NULL ? 1 : 0;
|
||||
}
|
||||
}
|
||||
|
||||
/*===========================================================================
|
||||
|
||||
FUNCTION: linked_list_flush
|
||||
|
||||
===========================================================================*/
|
||||
linked_list_err_type linked_list_flush(void* list_data)
|
||||
{
|
||||
if( list_data == NULL )
|
||||
{
|
||||
LOC_LOGE("%s: Invalid list parameter!\n", __FUNCTION__);
|
||||
return eLINKED_LIST_INVALID_HANDLE;
|
||||
}
|
||||
|
||||
list_state* p_list = (list_state*)list_data;
|
||||
|
||||
/* Remove all dynamically allocated elements */
|
||||
while( p_list->p_head != NULL )
|
||||
{
|
||||
list_element* tmp = p_list->p_head->next;
|
||||
|
||||
/* Free data pointer if told to do so. */
|
||||
if( p_list->p_head->dealloc_func != NULL )
|
||||
{
|
||||
p_list->p_head->dealloc_func(p_list->p_head->data_ptr);
|
||||
}
|
||||
|
||||
/* Free list element */
|
||||
free(p_list->p_head);
|
||||
|
||||
p_list->p_head = tmp;
|
||||
}
|
||||
|
||||
p_list->p_tail = NULL;
|
||||
|
||||
return eLINKED_LIST_SUCCESS;
|
||||
}
|
||||
|
||||
/*===========================================================================
|
||||
|
||||
FUNCTION: linked_list_search
|
||||
|
||||
===========================================================================*/
|
||||
linked_list_err_type linked_list_search(void* list_data, void **data_p,
|
||||
bool (*equal)(void* data_0, void* data),
|
||||
void* data_0, bool rm_if_found)
|
||||
{
|
||||
LOC_LOGD("%s: Search the list\n", __FUNCTION__);
|
||||
if( list_data == NULL || NULL == equal )
|
||||
{
|
||||
LOC_LOGE("%s: Invalid list parameter! list_data %p equal %p\n",
|
||||
__FUNCTION__, list_data, equal);
|
||||
return eLINKED_LIST_INVALID_HANDLE;
|
||||
}
|
||||
|
||||
list_state* p_list = (list_state*)list_data;
|
||||
if( p_list->p_tail == NULL )
|
||||
{
|
||||
return eLINKED_LIST_UNAVAILABLE_RESOURCE;
|
||||
}
|
||||
|
||||
list_element* tmp = p_list->p_head;
|
||||
|
||||
if (NULL != data_p) {
|
||||
*data_p = NULL;
|
||||
}
|
||||
|
||||
while (NULL != tmp) {
|
||||
if ((*equal)(data_0, tmp->data_ptr)) {
|
||||
if (NULL != data_p) {
|
||||
*data_p = tmp->data_ptr;
|
||||
}
|
||||
|
||||
if (rm_if_found) {
|
||||
if (NULL == tmp->prev) {
|
||||
p_list->p_head = tmp->next;
|
||||
} else {
|
||||
tmp->prev->next = tmp->next;
|
||||
}
|
||||
|
||||
if (NULL == tmp->next) {
|
||||
p_list->p_tail = tmp->prev;
|
||||
} else {
|
||||
tmp->next->prev = tmp->prev;
|
||||
}
|
||||
|
||||
tmp->prev = tmp->next = NULL;
|
||||
|
||||
// dealloc data if it is not copied out && caller
|
||||
// has given us a dealloc function pointer.
|
||||
if (NULL == data_p && NULL != tmp->dealloc_func) {
|
||||
tmp->dealloc_func(tmp->data_ptr);
|
||||
}
|
||||
free(tmp);
|
||||
}
|
||||
|
||||
tmp = NULL;
|
||||
} else {
|
||||
tmp = tmp->next;
|
||||
}
|
||||
}
|
||||
|
||||
return eLINKED_LIST_SUCCESS;
|
||||
}
|
||||
|
217
android/hardware/qcom/gps/utils/linked_list.h
Normal file
217
android/hardware/qcom/gps/utils/linked_list.h
Normal file
|
@ -0,0 +1,217 @@
|
|||
/* Copyright (c) 2011, The Linux Foundation. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are
|
||||
* met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following
|
||||
* disclaimer in the documentation and/or other materials provided
|
||||
* with the distribution.
|
||||
* * Neither the name of The Linux Foundation nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
|
||||
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
|
||||
* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
|
||||
* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
#ifndef __LINKED_LIST_H__
|
||||
#define __LINKED_LIST_H__
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif /* __cplusplus */
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
/** Linked List Return Codes */
|
||||
typedef enum
|
||||
{
|
||||
eLINKED_LIST_SUCCESS = 0,
|
||||
/**< Request was successful. */
|
||||
eLINKED_LIST_FAILURE_GENERAL = -1,
|
||||
/**< Failed because of a general failure. */
|
||||
eLINKED_LIST_INVALID_PARAMETER = -2,
|
||||
/**< Failed because the request contained invalid parameters. */
|
||||
eLINKED_LIST_INVALID_HANDLE = -3,
|
||||
/**< Failed because an invalid handle was specified. */
|
||||
eLINKED_LIST_UNAVAILABLE_RESOURCE = -4,
|
||||
/**< Failed because an there were not enough resources. */
|
||||
eLINKED_LIST_INSUFFICIENT_BUFFER = -5,
|
||||
/**< Failed because an the supplied buffer was too small. */
|
||||
}linked_list_err_type;
|
||||
|
||||
/*===========================================================================
|
||||
FUNCTION linked_list_init
|
||||
|
||||
DESCRIPTION
|
||||
Initializes internal structures for linked list.
|
||||
|
||||
list_data: State of list to be initialized.
|
||||
|
||||
DEPENDENCIES
|
||||
N/A
|
||||
|
||||
RETURN VALUE
|
||||
Look at error codes above.
|
||||
|
||||
SIDE EFFECTS
|
||||
N/A
|
||||
|
||||
===========================================================================*/
|
||||
linked_list_err_type linked_list_init(void** list_data);
|
||||
|
||||
/*===========================================================================
|
||||
FUNCTION linked_list_destroy
|
||||
|
||||
DESCRIPTION
|
||||
Destroys internal structures for linked list.
|
||||
|
||||
p_list_data: State of list to be destroyed.
|
||||
|
||||
DEPENDENCIES
|
||||
N/A
|
||||
|
||||
RETURN VALUE
|
||||
Look at error codes above.
|
||||
|
||||
SIDE EFFECTS
|
||||
N/A
|
||||
|
||||
===========================================================================*/
|
||||
linked_list_err_type linked_list_destroy(void** list_data);
|
||||
|
||||
/*===========================================================================
|
||||
FUNCTION linked_list_add
|
||||
|
||||
DESCRIPTION
|
||||
Adds an element to the head of the linked list. The passed in data pointer
|
||||
is not modified or freed. Passed in data_obj is expected to live throughout
|
||||
the use of the linked_list (i.e. data is not allocated internally)
|
||||
|
||||
p_list_data: List to add data to the head of.
|
||||
data_obj: Pointer to data to add into list
|
||||
dealloc: Function used to deallocate memory for this element. Pass NULL
|
||||
if you do not want data deallocated during a flush operation
|
||||
|
||||
DEPENDENCIES
|
||||
N/A
|
||||
|
||||
RETURN VALUE
|
||||
Look at error codes above.
|
||||
|
||||
SIDE EFFECTS
|
||||
N/A
|
||||
|
||||
===========================================================================*/
|
||||
linked_list_err_type linked_list_add(void* list_data, void *data_obj, void (*dealloc)(void*));
|
||||
|
||||
/*===========================================================================
|
||||
FUNCTION linked_list_remove
|
||||
|
||||
DESCRIPTION
|
||||
Retrieves data from the list tail. data_obj is the tail element from the list
|
||||
passed in by linked_list_add.
|
||||
|
||||
p_list_data: List to remove the tail from.
|
||||
data_obj: Pointer to data removed from list
|
||||
|
||||
DEPENDENCIES
|
||||
N/A
|
||||
|
||||
RETURN VALUE
|
||||
Look at error codes above.
|
||||
|
||||
SIDE EFFECTS
|
||||
N/A
|
||||
|
||||
===========================================================================*/
|
||||
linked_list_err_type linked_list_remove(void* list_data, void **data_obj);
|
||||
|
||||
/*===========================================================================
|
||||
FUNCTION linked_list_empty
|
||||
|
||||
DESCRIPTION
|
||||
Tells whether the list currently contains any elements
|
||||
|
||||
p_list_data: List to check if empty.
|
||||
|
||||
DEPENDENCIES
|
||||
N/A
|
||||
|
||||
RETURN VALUE
|
||||
0/FALSE : List contains elements
|
||||
1/TRUE : List is Empty
|
||||
Otherwise look at error codes above.
|
||||
|
||||
SIDE EFFECTS
|
||||
N/A
|
||||
|
||||
===========================================================================*/
|
||||
int linked_list_empty(void* list_data);
|
||||
|
||||
/*===========================================================================
|
||||
FUNCTION linked_list_flush
|
||||
|
||||
DESCRIPTION
|
||||
Removes all elements from the list and deallocates them using the provided
|
||||
dealloc function while adding elements.
|
||||
|
||||
p_list_data: List to remove all elements from.
|
||||
|
||||
DEPENDENCIES
|
||||
N/A
|
||||
|
||||
RETURN VALUE
|
||||
Look at error codes above.
|
||||
|
||||
SIDE EFFECTS
|
||||
N/A
|
||||
|
||||
===========================================================================*/
|
||||
linked_list_err_type linked_list_flush(void* list_data);
|
||||
|
||||
/*===========================================================================
|
||||
FUNCTION linked_list_search
|
||||
|
||||
DESCRIPTION
|
||||
Searches for an element in the linked list.
|
||||
|
||||
p_list_data: List handle.
|
||||
data_p: to be stored with the data found; NUll if no match.
|
||||
if data_p passed in as NULL, then no write to it.
|
||||
equal: Function ptr takes in a list element, and returns
|
||||
indication if this the one looking for.
|
||||
data_0: The data being compared against.
|
||||
rm_if_found: Should data be removed if found?
|
||||
|
||||
DEPENDENCIES
|
||||
N/A
|
||||
|
||||
RETURN VALUE
|
||||
Look at error codes above.
|
||||
|
||||
SIDE EFFECTS
|
||||
N/A
|
||||
|
||||
===========================================================================*/
|
||||
linked_list_err_type linked_list_search(void* list_data, void **data_p,
|
||||
bool (*equal)(void* data_0, void* data),
|
||||
void* data_0, bool rm_if_found);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif /* __cplusplus */
|
||||
|
||||
#endif /* __LINKED_LIST_H__ */
|
400
android/hardware/qcom/gps/utils/loc_cfg.cpp
Normal file
400
android/hardware/qcom/gps/utils/loc_cfg.cpp
Normal file
|
@ -0,0 +1,400 @@
|
|||
/* Copyright (c) 2011-2014, The Linux Foundation. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are
|
||||
* met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following
|
||||
* disclaimer in the documentation and/or other materials provided
|
||||
* with the distribution.
|
||||
* * Neither the name of The Linux Foundation, nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
|
||||
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
|
||||
* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
|
||||
* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
#define LOG_NDDEBUG 0
|
||||
#define LOG_TAG "LocSvc_utils_cfg"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <pthread.h>
|
||||
#include <string.h>
|
||||
#include <ctype.h>
|
||||
#include <unistd.h>
|
||||
#include <time.h>
|
||||
#include <loc_cfg.h>
|
||||
#include <log_util.h>
|
||||
#include <loc_misc_utils.h>
|
||||
#ifdef USE_GLIB
|
||||
#include <glib.h>
|
||||
#endif
|
||||
#include "platform_lib_includes.h"
|
||||
|
||||
/*=============================================================================
|
||||
*
|
||||
* GLOBAL DATA DECLARATION
|
||||
*
|
||||
*============================================================================*/
|
||||
|
||||
/* Parameter data */
|
||||
static uint32_t DEBUG_LEVEL = 0xff;
|
||||
static uint32_t TIMESTAMP = 0;
|
||||
|
||||
/* Parameter spec table */
|
||||
static loc_param_s_type loc_param_table[] =
|
||||
{
|
||||
{"DEBUG_LEVEL", &DEBUG_LEVEL, NULL, 'n'},
|
||||
{"TIMESTAMP", &TIMESTAMP, NULL, 'n'},
|
||||
};
|
||||
int loc_param_num = sizeof(loc_param_table) / sizeof(loc_param_s_type);
|
||||
|
||||
typedef struct loc_param_v_type
|
||||
{
|
||||
char* param_name;
|
||||
char* param_str_value;
|
||||
int param_int_value;
|
||||
double param_double_value;
|
||||
}loc_param_v_type;
|
||||
|
||||
/*===========================================================================
|
||||
FUNCTION loc_set_config_entry
|
||||
|
||||
DESCRIPTION
|
||||
Potentially sets a given configuration table entry based on the passed in
|
||||
configuration value. This is done by using a string comparison of the
|
||||
parameter names and those found in the configuration file.
|
||||
|
||||
PARAMETERS:
|
||||
config_entry: configuration entry in the table to possibly set
|
||||
config_value: value to store in the entry if the parameter names match
|
||||
|
||||
DEPENDENCIES
|
||||
N/A
|
||||
|
||||
RETURN VALUE
|
||||
None
|
||||
|
||||
SIDE EFFECTS
|
||||
N/A
|
||||
===========================================================================*/
|
||||
int loc_set_config_entry(loc_param_s_type* config_entry, loc_param_v_type* config_value)
|
||||
{
|
||||
int ret=-1;
|
||||
if(NULL == config_entry || NULL == config_value)
|
||||
{
|
||||
LOC_LOGE("%s: INVALID config entry or parameter", __FUNCTION__);
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (strcmp(config_entry->param_name, config_value->param_name) == 0 &&
|
||||
config_entry->param_ptr)
|
||||
{
|
||||
switch (config_entry->param_type)
|
||||
{
|
||||
case 's':
|
||||
if (strcmp(config_value->param_str_value, "NULL") == 0)
|
||||
{
|
||||
*((char*)config_entry->param_ptr) = '\0';
|
||||
}
|
||||
else {
|
||||
strlcpy((char*) config_entry->param_ptr,
|
||||
config_value->param_str_value,
|
||||
LOC_MAX_PARAM_STRING + 1);
|
||||
}
|
||||
/* Log INI values */
|
||||
LOC_LOGD("%s: PARAM %s = %s", __FUNCTION__,
|
||||
config_entry->param_name, (char*)config_entry->param_ptr);
|
||||
|
||||
if(NULL != config_entry->param_set)
|
||||
{
|
||||
*(config_entry->param_set) = 1;
|
||||
}
|
||||
ret = 0;
|
||||
break;
|
||||
case 'n':
|
||||
*((int *)config_entry->param_ptr) = config_value->param_int_value;
|
||||
/* Log INI values */
|
||||
LOC_LOGD("%s: PARAM %s = %d", __FUNCTION__,
|
||||
config_entry->param_name, config_value->param_int_value);
|
||||
|
||||
if(NULL != config_entry->param_set)
|
||||
{
|
||||
*(config_entry->param_set) = 1;
|
||||
}
|
||||
ret = 0;
|
||||
break;
|
||||
case 'f':
|
||||
*((double *)config_entry->param_ptr) = config_value->param_double_value;
|
||||
/* Log INI values */
|
||||
LOC_LOGD("%s: PARAM %s = %f", __FUNCTION__,
|
||||
config_entry->param_name, config_value->param_double_value);
|
||||
|
||||
if(NULL != config_entry->param_set)
|
||||
{
|
||||
*(config_entry->param_set) = 1;
|
||||
}
|
||||
ret = 0;
|
||||
break;
|
||||
default:
|
||||
LOC_LOGE("%s: PARAM %s parameter type must be n, f, or s",
|
||||
__FUNCTION__, config_entry->param_name);
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*===========================================================================
|
||||
FUNCTION loc_fill_conf_item
|
||||
|
||||
DESCRIPTION
|
||||
Takes a line of configuration item and sets defined values based on
|
||||
the passed in configuration table. This table maps strings to values to
|
||||
set along with the type of each of these values.
|
||||
|
||||
PARAMETERS:
|
||||
input_buf : buffer contanis config item
|
||||
config_table: table definition of strings to places to store information
|
||||
table_length: length of the configuration table
|
||||
|
||||
DEPENDENCIES
|
||||
N/A
|
||||
|
||||
RETURN VALUE
|
||||
0: Number of records in the config_table filled with input_buf
|
||||
|
||||
SIDE EFFECTS
|
||||
N/A
|
||||
===========================================================================*/
|
||||
int loc_fill_conf_item(char* input_buf,
|
||||
loc_param_s_type* config_table, uint32_t table_length)
|
||||
{
|
||||
int ret = 0;
|
||||
|
||||
if (input_buf && config_table) {
|
||||
char *lasts;
|
||||
loc_param_v_type config_value;
|
||||
memset(&config_value, 0, sizeof(config_value));
|
||||
|
||||
/* Separate variable and value */
|
||||
config_value.param_name = strtok_r(input_buf, "=", &lasts);
|
||||
/* skip lines that do not contain "=" */
|
||||
if (config_value.param_name) {
|
||||
config_value.param_str_value = strtok_r(NULL, "=", &lasts);
|
||||
|
||||
/* skip lines that do not contain two operands */
|
||||
if (config_value.param_str_value) {
|
||||
/* Trim leading and trailing spaces */
|
||||
loc_util_trim_space(config_value.param_name);
|
||||
loc_util_trim_space(config_value.param_str_value);
|
||||
|
||||
/* Parse numerical value */
|
||||
if ((strlen(config_value.param_str_value) >=3) &&
|
||||
(config_value.param_str_value[0] == '0') &&
|
||||
(tolower(config_value.param_str_value[1]) == 'x'))
|
||||
{
|
||||
/* hex */
|
||||
config_value.param_int_value = (int) strtol(&config_value.param_str_value[2],
|
||||
(char**) NULL, 16);
|
||||
}
|
||||
else {
|
||||
config_value.param_double_value = (double) atof(config_value.param_str_value); /* float */
|
||||
config_value.param_int_value = atoi(config_value.param_str_value); /* dec */
|
||||
}
|
||||
|
||||
for(uint32_t i = 0; NULL != config_table && i < table_length; i++)
|
||||
{
|
||||
if(!loc_set_config_entry(&config_table[i], &config_value)) {
|
||||
ret += 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*===========================================================================
|
||||
FUNCTION loc_read_conf_r (repetitive)
|
||||
|
||||
DESCRIPTION
|
||||
Reads the specified configuration file and sets defined values based on
|
||||
the passed in configuration table. This table maps strings to values to
|
||||
set along with the type of each of these values.
|
||||
The difference between this and loc_read_conf is that this function returns
|
||||
the file pointer position at the end of filling a config table. Also, it
|
||||
reads a fixed number of parameters at a time which is equal to the length
|
||||
of the configuration table. This functionality enables the caller to
|
||||
repeatedly call the function to read data from the same file.
|
||||
|
||||
PARAMETERS:
|
||||
conf_fp : file pointer
|
||||
config_table: table definition of strings to places to store information
|
||||
table_length: length of the configuration table
|
||||
|
||||
DEPENDENCIES
|
||||
N/A
|
||||
|
||||
RETURN VALUE
|
||||
0: Table filled successfully
|
||||
1: No more parameters to read
|
||||
-1: Error filling table
|
||||
|
||||
SIDE EFFECTS
|
||||
N/A
|
||||
===========================================================================*/
|
||||
int loc_read_conf_r(FILE *conf_fp, loc_param_s_type* config_table, uint32_t table_length)
|
||||
{
|
||||
int ret=0;
|
||||
|
||||
unsigned int num_params=table_length;
|
||||
if(conf_fp == NULL) {
|
||||
LOC_LOGE("%s:%d]: ERROR: File pointer is NULL\n", __func__, __LINE__);
|
||||
ret = -1;
|
||||
goto err;
|
||||
}
|
||||
|
||||
/* Clear all validity bits */
|
||||
for(uint32_t i = 0; NULL != config_table && i < table_length; i++)
|
||||
{
|
||||
if(NULL != config_table[i].param_set)
|
||||
{
|
||||
*(config_table[i].param_set) = 0;
|
||||
}
|
||||
}
|
||||
|
||||
char input_buf[LOC_MAX_PARAM_LINE]; /* declare a char array */
|
||||
|
||||
LOC_LOGD("%s:%d]: num_params: %d\n", __func__, __LINE__, num_params);
|
||||
while(num_params)
|
||||
{
|
||||
if(!fgets(input_buf, LOC_MAX_PARAM_LINE, conf_fp)) {
|
||||
LOC_LOGD("%s:%d]: fgets returned NULL\n", __func__, __LINE__);
|
||||
break;
|
||||
}
|
||||
|
||||
num_params -= loc_fill_conf_item(input_buf, config_table, table_length);
|
||||
}
|
||||
|
||||
err:
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*===========================================================================
|
||||
FUNCTION loc_udpate_conf
|
||||
|
||||
DESCRIPTION
|
||||
Parses the passed in buffer for configuration items, and update the table
|
||||
that is also passed in.
|
||||
|
||||
Reads the specified configuration file and sets defined values based on
|
||||
the passed in configuration table. This table maps strings to values to
|
||||
set along with the type of each of these values.
|
||||
|
||||
PARAMETERS:
|
||||
conf_data: configuration items in bufferas a string
|
||||
length: strlen(conf_data)
|
||||
config_table: table definition of strings to places to store information
|
||||
table_length: length of the configuration table
|
||||
|
||||
DEPENDENCIES
|
||||
N/A
|
||||
|
||||
RETURN VALUE
|
||||
number of the records in the table that is updated at time of return.
|
||||
|
||||
SIDE EFFECTS
|
||||
N/A
|
||||
===========================================================================*/
|
||||
int loc_update_conf(const char* conf_data, int32_t length,
|
||||
loc_param_s_type* config_table, uint32_t table_length)
|
||||
{
|
||||
int ret = -1;
|
||||
|
||||
if (conf_data && length && config_table && table_length) {
|
||||
// make a copy, so we do not tokenize the original data
|
||||
char* conf_copy = (char*)malloc(length+1);
|
||||
|
||||
if (conf_copy != NULL)
|
||||
{
|
||||
memcpy(conf_copy, conf_data, length);
|
||||
// we hard NULL the end of string to be safe
|
||||
conf_copy[length] = 0;
|
||||
|
||||
// start with one record off
|
||||
uint32_t num_params = table_length - 1;
|
||||
char* saveptr = NULL;
|
||||
char* input_buf = strtok_r(conf_copy, "\n", &saveptr);
|
||||
ret = 0;
|
||||
|
||||
LOC_LOGD("%s:%d]: num_params: %d\n", __func__, __LINE__, num_params);
|
||||
while(num_params && input_buf) {
|
||||
ret++;
|
||||
num_params -= loc_fill_conf_item(input_buf, config_table, table_length);
|
||||
input_buf = strtok_r(NULL, "\n", &saveptr);
|
||||
}
|
||||
free(conf_copy);
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*===========================================================================
|
||||
FUNCTION loc_read_conf
|
||||
|
||||
DESCRIPTION
|
||||
Reads the specified configuration file and sets defined values based on
|
||||
the passed in configuration table. This table maps strings to values to
|
||||
set along with the type of each of these values.
|
||||
|
||||
PARAMETERS:
|
||||
conf_file_name: configuration file to read
|
||||
config_table: table definition of strings to places to store information
|
||||
table_length: length of the configuration table
|
||||
|
||||
DEPENDENCIES
|
||||
N/A
|
||||
|
||||
RETURN VALUE
|
||||
None
|
||||
|
||||
SIDE EFFECTS
|
||||
N/A
|
||||
===========================================================================*/
|
||||
void loc_read_conf(const char* conf_file_name, loc_param_s_type* config_table,
|
||||
uint32_t table_length)
|
||||
{
|
||||
FILE *conf_fp = NULL;
|
||||
char *lasts;
|
||||
loc_param_v_type config_value;
|
||||
uint32_t i;
|
||||
|
||||
if((conf_fp = fopen(conf_file_name, "r")) != NULL)
|
||||
{
|
||||
LOC_LOGD("%s: using %s", __FUNCTION__, conf_file_name);
|
||||
if(table_length && config_table) {
|
||||
loc_read_conf_r(conf_fp, config_table, table_length);
|
||||
rewind(conf_fp);
|
||||
}
|
||||
loc_read_conf_r(conf_fp, loc_param_table, loc_param_num);
|
||||
fclose(conf_fp);
|
||||
}
|
||||
/* Initialize logging mechanism with parsed data */
|
||||
loc_logger_init(DEBUG_LEVEL, TIMESTAMP);
|
||||
}
|
91
android/hardware/qcom/gps/utils/loc_cfg.h
Normal file
91
android/hardware/qcom/gps/utils/loc_cfg.h
Normal file
|
@ -0,0 +1,91 @@
|
|||
/* Copyright (c) 2011-2014, The Linux Foundation. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are
|
||||
* met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following
|
||||
* disclaimer in the documentation and/or other materials provided
|
||||
* with the distribution.
|
||||
* * Neither the name of The Linux Foundation, nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
|
||||
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
|
||||
* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
|
||||
* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef LOC_CFG_H
|
||||
#define LOC_CFG_H
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#define LOC_MAX_PARAM_NAME 80
|
||||
#define LOC_MAX_PARAM_STRING 80
|
||||
#define LOC_MAX_PARAM_LINE (LOC_MAX_PARAM_NAME + LOC_MAX_PARAM_STRING)
|
||||
|
||||
#define UTIL_UPDATE_CONF(conf_data, len, config_table) \
|
||||
loc_update_conf((conf_data), (len), (config_table), \
|
||||
sizeof(config_table) / sizeof(config_table[0]))
|
||||
|
||||
#define UTIL_READ_CONF_DEFAULT(filename) \
|
||||
loc_read_conf((filename), NULL, 0);
|
||||
|
||||
#define UTIL_READ_CONF(filename, config_table) \
|
||||
loc_read_conf((filename), (config_table), sizeof(config_table) / sizeof(config_table[0]))
|
||||
|
||||
/*=============================================================================
|
||||
*
|
||||
* MODULE TYPE DECLARATION
|
||||
*
|
||||
*============================================================================*/
|
||||
typedef struct
|
||||
{
|
||||
char param_name[LOC_MAX_PARAM_NAME];
|
||||
void *param_ptr;
|
||||
uint8_t *param_set; /* was this value set by config file? */
|
||||
char param_type; /* 'n' for number,
|
||||
's' for string,
|
||||
'f' for float */
|
||||
} loc_param_s_type;
|
||||
|
||||
/*=============================================================================
|
||||
*
|
||||
* MODULE EXTERNAL DATA
|
||||
*
|
||||
*============================================================================*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*=============================================================================
|
||||
*
|
||||
* MODULE EXPORTED FUNCTIONS
|
||||
*
|
||||
*============================================================================*/
|
||||
void loc_read_conf(const char* conf_file_name,
|
||||
loc_param_s_type* config_table,
|
||||
uint32_t table_length);
|
||||
int loc_read_conf_r(FILE *conf_fp, loc_param_s_type* config_table,
|
||||
uint32_t table_length);
|
||||
int loc_update_conf(const char* conf_data, int32_t length,
|
||||
loc_param_s_type* config_table, uint32_t table_length);
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* LOC_CFG_H */
|
242
android/hardware/qcom/gps/utils/loc_log.cpp
Normal file
242
android/hardware/qcom/gps/utils/loc_log.cpp
Normal file
|
@ -0,0 +1,242 @@
|
|||
/* Copyright (c) 2011-2012, The Linux Foundation. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are
|
||||
* met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following
|
||||
* disclaimer in the documentation and/or other materials provided
|
||||
* with the distribution.
|
||||
* * Neither the name of The Linux Foundation, nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
|
||||
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
|
||||
* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
|
||||
* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
#define LOG_NDDEBUG 0
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <sys/time.h>
|
||||
#include <time.h>
|
||||
#include "loc_log.h"
|
||||
#include "msg_q.h"
|
||||
#ifdef USE_GLIB
|
||||
#include <time.h>
|
||||
#endif /* USE_GLIB */
|
||||
#include "log_util.h"
|
||||
#include "platform_lib_includes.h"
|
||||
|
||||
#define BUFFER_SIZE 120
|
||||
|
||||
// Logging Improvements
|
||||
const char *loc_logger_boolStr[]={"False","True"};
|
||||
const char VOID_RET[] = "None";
|
||||
const char FROM_AFW[] = "===>";
|
||||
const char TO_MODEM[] = "--->";
|
||||
const char FROM_MODEM[] = "<---";
|
||||
const char TO_AFW[] = "<===";
|
||||
const char EXIT_TAG[] = "Exiting";
|
||||
const char ENTRY_TAG[] = "Entering";
|
||||
|
||||
/* Logging Mechanism */
|
||||
loc_logger_s_type loc_logger;
|
||||
|
||||
/* Get names from value */
|
||||
const char* loc_get_name_from_mask(loc_name_val_s_type table[], int table_size, long mask)
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < table_size; i++)
|
||||
{
|
||||
if (table[i].val & (long) mask)
|
||||
{
|
||||
return table[i].name;
|
||||
}
|
||||
}
|
||||
return UNKNOWN_STR;
|
||||
}
|
||||
|
||||
/* Get names from value */
|
||||
const char* loc_get_name_from_val(loc_name_val_s_type table[], int table_size, long value)
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < table_size; i++)
|
||||
{
|
||||
if (table[i].val == (long) value)
|
||||
{
|
||||
return table[i].name;
|
||||
}
|
||||
}
|
||||
return UNKNOWN_STR;
|
||||
}
|
||||
|
||||
static loc_name_val_s_type loc_msg_q_status[] =
|
||||
{
|
||||
NAME_VAL( eMSG_Q_SUCCESS ),
|
||||
NAME_VAL( eMSG_Q_FAILURE_GENERAL ),
|
||||
NAME_VAL( eMSG_Q_INVALID_PARAMETER ),
|
||||
NAME_VAL( eMSG_Q_INVALID_HANDLE ),
|
||||
NAME_VAL( eMSG_Q_UNAVAILABLE_RESOURCE ),
|
||||
NAME_VAL( eMSG_Q_INSUFFICIENT_BUFFER )
|
||||
};
|
||||
static int loc_msg_q_status_num = sizeof(loc_msg_q_status) / sizeof(loc_name_val_s_type);
|
||||
|
||||
/* Find msg_q status name */
|
||||
const char* loc_get_msg_q_status(int status)
|
||||
{
|
||||
return loc_get_name_from_val(loc_msg_q_status, loc_msg_q_status_num, (long) status);
|
||||
}
|
||||
|
||||
const char* log_succ_fail_string(int is_succ)
|
||||
{
|
||||
return is_succ? "successful" : "failed";
|
||||
}
|
||||
|
||||
//Target names
|
||||
loc_name_val_s_type target_name[] =
|
||||
{
|
||||
NAME_VAL(GNSS_NONE),
|
||||
NAME_VAL(GNSS_MSM),
|
||||
NAME_VAL(GNSS_GSS),
|
||||
NAME_VAL(GNSS_MDM),
|
||||
NAME_VAL(GNSS_QCA1530),
|
||||
NAME_VAL(GNSS_AUTO),
|
||||
NAME_VAL(GNSS_UNKNOWN)
|
||||
};
|
||||
|
||||
static int target_name_num = sizeof(target_name)/sizeof(loc_name_val_s_type);
|
||||
|
||||
/*===========================================================================
|
||||
|
||||
FUNCTION loc_get_target_name
|
||||
|
||||
DESCRIPTION
|
||||
Returns pointer to a string that contains name of the target
|
||||
|
||||
XX:XX:XX.000\0
|
||||
|
||||
RETURN VALUE
|
||||
The target name string
|
||||
|
||||
===========================================================================*/
|
||||
const char *loc_get_target_name(unsigned int target)
|
||||
{
|
||||
int index = 0;
|
||||
static char ret[BUFFER_SIZE];
|
||||
|
||||
index = getTargetGnssType(target);
|
||||
if( index >= target_name_num || index < 0)
|
||||
index = target_name_num - 1;
|
||||
|
||||
if( (target & HAS_SSC) == HAS_SSC ) {
|
||||
snprintf(ret, sizeof(ret), " %s with SSC",
|
||||
loc_get_name_from_val(target_name, target_name_num, (long)index) );
|
||||
}
|
||||
else {
|
||||
snprintf(ret, sizeof(ret), " %s without SSC",
|
||||
loc_get_name_from_val(target_name, target_name_num, (long)index) );
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
/*===========================================================================
|
||||
|
||||
FUNCTION loc_get_time
|
||||
|
||||
DESCRIPTION
|
||||
Logs a callback event header.
|
||||
The pointer time_string should point to a buffer of at least 13 bytes:
|
||||
|
||||
XX:XX:XX.000\0
|
||||
|
||||
RETURN VALUE
|
||||
The time string
|
||||
|
||||
===========================================================================*/
|
||||
char *loc_get_time(char *time_string, unsigned long buf_size)
|
||||
{
|
||||
struct timeval now; /* sec and usec */
|
||||
struct tm now_tm; /* broken-down time */
|
||||
char hms_string[80]; /* HH:MM:SS */
|
||||
|
||||
gettimeofday(&now, NULL);
|
||||
localtime_r(&now.tv_sec, &now_tm);
|
||||
|
||||
strftime(hms_string, sizeof hms_string, "%H:%M:%S", &now_tm);
|
||||
snprintf(time_string, buf_size, "%s.%03d", hms_string, (int) (now.tv_usec / 1000));
|
||||
|
||||
return time_string;
|
||||
}
|
||||
|
||||
|
||||
/*===========================================================================
|
||||
FUNCTION loc_logger_init
|
||||
|
||||
DESCRIPTION
|
||||
Initializes the state of DEBUG_LEVEL and TIMESTAMP
|
||||
|
||||
DEPENDENCIES
|
||||
N/A
|
||||
|
||||
RETURN VALUE
|
||||
None
|
||||
|
||||
SIDE EFFECTS
|
||||
N/A
|
||||
===========================================================================*/
|
||||
void loc_logger_init(unsigned long debug, unsigned long timestamp)
|
||||
{
|
||||
loc_logger.DEBUG_LEVEL = debug;
|
||||
#ifdef TARGET_BUILD_VARIANT_USER
|
||||
// force user builds to 2 or less
|
||||
if (loc_logger.DEBUG_LEVEL > 2) {
|
||||
loc_logger.DEBUG_LEVEL = 2;
|
||||
}
|
||||
#endif
|
||||
loc_logger.TIMESTAMP = timestamp;
|
||||
}
|
||||
|
||||
|
||||
/*===========================================================================
|
||||
FUNCTION get_timestamp
|
||||
|
||||
DESCRIPTION
|
||||
Generates a timestamp using the current system time
|
||||
|
||||
DEPENDENCIES
|
||||
N/A
|
||||
|
||||
RETURN VALUE
|
||||
Char pointer to the parameter str
|
||||
|
||||
SIDE EFFECTS
|
||||
N/A
|
||||
===========================================================================*/
|
||||
char * get_timestamp(char *str, unsigned long buf_size)
|
||||
{
|
||||
struct timeval tv;
|
||||
struct timezone tz;
|
||||
int hh, mm, ss;
|
||||
gettimeofday(&tv, &tz);
|
||||
hh = tv.tv_sec/3600%24;
|
||||
mm = (tv.tv_sec%3600)/60;
|
||||
ss = tv.tv_sec%60;
|
||||
snprintf(str, buf_size, "%02d:%02d:%02d.%06ld", hh, mm, ss, tv.tv_usec);
|
||||
return str;
|
||||
}
|
||||
|
68
android/hardware/qcom/gps/utils/loc_log.h
Normal file
68
android/hardware/qcom/gps/utils/loc_log.h
Normal file
|
@ -0,0 +1,68 @@
|
|||
/* Copyright (c) 2011-2012, The Linux Foundation. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are
|
||||
* met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following
|
||||
* disclaimer in the documentation and/or other materials provided
|
||||
* with the distribution.
|
||||
* * Neither the name of The Linux Foundation, nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
|
||||
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
|
||||
* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
|
||||
* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef LOC_LOG_H
|
||||
#define LOC_LOG_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
#include <ctype.h>
|
||||
#include "loc_target.h"
|
||||
|
||||
typedef struct
|
||||
{
|
||||
char name[128];
|
||||
long val;
|
||||
} loc_name_val_s_type;
|
||||
|
||||
#define NAME_VAL(x) {"" #x "", x }
|
||||
|
||||
#define UNKNOWN_STR "UNKNOWN"
|
||||
|
||||
#define CHECK_MASK(type, value, mask_var, mask) \
|
||||
((mask_var & mask) ? (type) value : (type) (-1))
|
||||
|
||||
/* Get names from value */
|
||||
const char* loc_get_name_from_mask(loc_name_val_s_type table[], int table_size, long mask);
|
||||
const char* loc_get_name_from_val(loc_name_val_s_type table[], int table_size, long value);
|
||||
const char* loc_get_msg_q_status(int status);
|
||||
const char* loc_get_target_name(unsigned int target);
|
||||
|
||||
extern const char* log_succ_fail_string(int is_succ);
|
||||
|
||||
extern char *loc_get_time(char *time_string, unsigned long buf_size);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* LOC_LOG_H */
|
114
android/hardware/qcom/gps/utils/loc_misc_utils.cpp
Normal file
114
android/hardware/qcom/gps/utils/loc_misc_utils.cpp
Normal file
|
@ -0,0 +1,114 @@
|
|||
/* Copyright (c) 2014, The Linux Foundation. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are
|
||||
* met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following
|
||||
* disclaimer in the documentation and/or other materials provided
|
||||
* with the distribution.
|
||||
* * Neither the name of The Linux Foundation, nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
|
||||
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
|
||||
* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
|
||||
* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <log_util.h>
|
||||
#include <loc_misc_utils.h>
|
||||
#include <ctype.h>
|
||||
|
||||
#define LOG_NDDEBUG 0
|
||||
#define LOG_TAG "LocSvc_misc_utils"
|
||||
|
||||
int loc_util_split_string(char *raw_string, char **split_strings_ptr,
|
||||
int max_num_substrings, char delimiter)
|
||||
{
|
||||
int raw_string_index=0;
|
||||
int num_split_strings=0;
|
||||
unsigned char end_string=0;
|
||||
int raw_string_length=0;
|
||||
|
||||
if(!raw_string || !split_strings_ptr) {
|
||||
LOC_LOGE("%s:%d]: NULL parameters", __func__, __LINE__);
|
||||
num_split_strings = -1;
|
||||
goto err;
|
||||
}
|
||||
LOC_LOGD("%s:%d]: raw string: %s\n", __func__, __LINE__, raw_string);
|
||||
raw_string_length = strlen(raw_string) + 1;
|
||||
split_strings_ptr[num_split_strings] = &raw_string[raw_string_index];
|
||||
for(raw_string_index=0; raw_string_index < raw_string_length; raw_string_index++) {
|
||||
if(raw_string[raw_string_index] == '\0')
|
||||
end_string=1;
|
||||
if((raw_string[raw_string_index] == delimiter) || end_string) {
|
||||
raw_string[raw_string_index] = '\0';
|
||||
LOC_LOGD("%s:%d]: split string: %s\n",
|
||||
__func__, __LINE__, split_strings_ptr[num_split_strings]);
|
||||
num_split_strings++;
|
||||
if(((raw_string_index + 1) < raw_string_length) &&
|
||||
(num_split_strings < max_num_substrings)) {
|
||||
split_strings_ptr[num_split_strings] = &raw_string[raw_string_index+1];
|
||||
}
|
||||
else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(end_string)
|
||||
break;
|
||||
}
|
||||
err:
|
||||
LOC_LOGD("%s:%d]: num_split_strings: %d\n", __func__, __LINE__, num_split_strings);
|
||||
return num_split_strings;
|
||||
}
|
||||
|
||||
void loc_util_trim_space(char *org_string)
|
||||
{
|
||||
char *scan_ptr, *write_ptr;
|
||||
char *first_nonspace = NULL, *last_nonspace = NULL;
|
||||
|
||||
if(org_string == NULL) {
|
||||
LOC_LOGE("%s:%d]: NULL parameter", __func__, __LINE__);
|
||||
goto err;
|
||||
}
|
||||
|
||||
scan_ptr = write_ptr = org_string;
|
||||
|
||||
while (*scan_ptr) {
|
||||
//Find the first non-space character
|
||||
if ( !isspace(*scan_ptr) && first_nonspace == NULL) {
|
||||
first_nonspace = scan_ptr;
|
||||
}
|
||||
//Once the first non-space character is found in the
|
||||
//above check, keep shifting the characters to the left
|
||||
//to replace the spaces
|
||||
if (first_nonspace != NULL) {
|
||||
*(write_ptr++) = *scan_ptr;
|
||||
//Keep track of which was the last non-space character
|
||||
//encountered
|
||||
//last_nonspace will not be updated in the case where
|
||||
//the string ends with spaces
|
||||
if ( !isspace(*scan_ptr)) {
|
||||
last_nonspace = write_ptr;
|
||||
}
|
||||
}
|
||||
scan_ptr++;
|
||||
}
|
||||
//Add NULL terminator after the last non-space character
|
||||
if (last_nonspace) { *last_nonspace = '\0'; }
|
||||
err:
|
||||
return;
|
||||
}
|
99
android/hardware/qcom/gps/utils/loc_misc_utils.h
Normal file
99
android/hardware/qcom/gps/utils/loc_misc_utils.h
Normal file
|
@ -0,0 +1,99 @@
|
|||
/* Copyright (c) 2014, The Linux Foundation. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are
|
||||
* met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following
|
||||
* disclaimer in the documentation and/or other materials provided
|
||||
* with the distribution.
|
||||
* * Neither the name of The Linux Foundation, nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
|
||||
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
|
||||
* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
|
||||
* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
#ifndef _LOC_MISC_UTILS_H_
|
||||
#define _LOC_MISC_UTILS_H_
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*===========================================================================
|
||||
FUNCTION loc_split_string
|
||||
|
||||
DESCRIPTION:
|
||||
This function is used to split a delimiter separated string into
|
||||
sub-strings. This function does not allocate new memory to store the split
|
||||
strings. Instead, it places '\0' in places of delimiters and assings the
|
||||
starting address of the substring within the raw string as the string address
|
||||
The input raw_string no longer remains to be a collection of sub-strings
|
||||
after this function is executed.
|
||||
Please make a copy of the input string before calling this function if
|
||||
necessary
|
||||
|
||||
PARAMETERS:
|
||||
char *raw_string: is the original string with delimiter separated substrings
|
||||
char **split_strings_ptr: is the arraw of pointers which will hold the addresses
|
||||
of individual substrings
|
||||
int max_num_substrings: is the maximum number of substrings that are expected
|
||||
by the caller. The array of pointers in the above parameter
|
||||
is usually this long
|
||||
char delimiter: is the delimiter that separates the substrings. Examples: ' ', ';'
|
||||
|
||||
DEPENDENCIES
|
||||
N/A
|
||||
|
||||
RETURN VALUE
|
||||
int Number of split strings
|
||||
|
||||
SIDE EFFECTS
|
||||
The input raw_string no longer remains a delimiter separated single string.
|
||||
|
||||
EXAMPLE
|
||||
delimiter = ' ' //space
|
||||
raw_string = "hello new user" //delimiter is space ' '
|
||||
addresses = 0123456789abcd
|
||||
split_strings_ptr[0] = &raw_string[0]; //split_strings_ptr[0] contains "hello"
|
||||
split_strings_ptr[1] = &raw_string[6]; //split_strings_ptr[1] contains "new"
|
||||
split_strings_ptr[2] = &raw_string[a]; //split_strings_ptr[2] contains "user"
|
||||
|
||||
===========================================================================*/
|
||||
int loc_util_split_string(char *raw_string, char **split_strings_ptr, int max_num_substrings,
|
||||
char delimiter);
|
||||
|
||||
/*===========================================================================
|
||||
FUNCTION trim_space
|
||||
|
||||
DESCRIPTION
|
||||
Removes leading and trailing spaces of the string
|
||||
|
||||
DEPENDENCIES
|
||||
N/A
|
||||
|
||||
RETURN VALUE
|
||||
None
|
||||
|
||||
SIDE EFFECTS
|
||||
N/A
|
||||
===========================================================================*/
|
||||
void loc_util_trim_space(char *org_string);
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif //_LOC_MISC_UTILS_H_
|
247
android/hardware/qcom/gps/utils/loc_target.cpp
Normal file
247
android/hardware/qcom/gps/utils/loc_target.cpp
Normal file
|
@ -0,0 +1,247 @@
|
|||
/* Copyright (c) 2012-2015, The Linux Foundation. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are
|
||||
* met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following
|
||||
* disclaimer in the documentation and/or other materials provided
|
||||
* with the distribution.
|
||||
* * Neither the name of The Linux Foundation nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
|
||||
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
|
||||
* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
|
||||
* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <fcntl.h>
|
||||
#include <errno.h>
|
||||
#include <hardware/gps.h>
|
||||
#include <cutils/properties.h>
|
||||
#include "loc_target.h"
|
||||
#include "loc_log.h"
|
||||
#include "log_util.h"
|
||||
|
||||
#define APQ8064_ID_1 "109"
|
||||
#define APQ8064_ID_2 "153"
|
||||
#define MPQ8064_ID_1 "130"
|
||||
#define MSM8930_ID_1 "142"
|
||||
#define MSM8930_ID_2 "116"
|
||||
#define APQ8030_ID_1 "157"
|
||||
#define APQ8074_ID_1 "184"
|
||||
|
||||
#define LINE_LEN 100
|
||||
#define STR_LIQUID "Liquid"
|
||||
#define STR_SURF "Surf"
|
||||
#define STR_MTP "MTP"
|
||||
#define STR_APQ "apq"
|
||||
#define STR_AUTO "auto"
|
||||
#define IS_STR_END(c) ((c) == '\0' || (c) == '\n' || (c) == '\r')
|
||||
#define LENGTH(s) (sizeof(s) - 1)
|
||||
#define GPS_CHECK_NO_ERROR 0
|
||||
#define GPS_CHECK_NO_GPS_HW 1
|
||||
/* When system server is started, it uses 20 seconds as ActivityManager
|
||||
* timeout. After that it sends SIGSTOP signal to process.
|
||||
*/
|
||||
#define QCA1530_DETECT_TIMEOUT 15
|
||||
#define QCA1530_DETECT_PRESENT "yes"
|
||||
#define QCA1530_DETECT_PROGRESS "detect"
|
||||
|
||||
static unsigned int gTarget = (unsigned int)-1;
|
||||
|
||||
static int read_a_line(const char * file_path, char * line, int line_size)
|
||||
{
|
||||
FILE *fp;
|
||||
int result = 0;
|
||||
|
||||
* line = '\0';
|
||||
fp = fopen(file_path, "r" );
|
||||
if( fp == NULL ) {
|
||||
LOC_LOGE("open failed: %s: %s\n", file_path, strerror(errno));
|
||||
result = -1;
|
||||
} else {
|
||||
int len;
|
||||
fgets(line, line_size, fp);
|
||||
len = strlen(line);
|
||||
len = len < line_size - 1? len : line_size - 1;
|
||||
line[len] = '\0';
|
||||
LOC_LOGD("cat %s: %s", file_path, line);
|
||||
fclose(fp);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/*!
|
||||
* \brief Checks if QCA1530 is avalable.
|
||||
*
|
||||
* Function verifies if qca1530 SoC is configured on the device. The test is
|
||||
* based on property value. For 1530 scenario, the value shall be one of the
|
||||
* following: "yes", "no", "detect". All other values are treated equally to
|
||||
* "no". When the value is "detect" the system waits for SoC detection to
|
||||
* finish before returning result.
|
||||
*
|
||||
* \retval true - QCA1530 is available.
|
||||
* \retval false - QCA1530 is not available.
|
||||
*/
|
||||
static bool is_qca1530(void)
|
||||
{
|
||||
static const char qca1530_property_name[] = "sys.qca1530";
|
||||
bool res = false;
|
||||
int ret, i;
|
||||
char buf[PROPERTY_VALUE_MAX];
|
||||
|
||||
memset(buf, 0, sizeof(buf));
|
||||
|
||||
for (i = 0; i < QCA1530_DETECT_TIMEOUT; ++i)
|
||||
{
|
||||
ret = property_get(qca1530_property_name, buf, NULL);
|
||||
if (ret < 0)
|
||||
{
|
||||
LOC_LOGV( "qca1530: property %s is not accessible, ret=%d",
|
||||
qca1530_property_name,
|
||||
ret);
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
LOC_LOGV( "qca1530: property %s is set to %s",
|
||||
qca1530_property_name,
|
||||
buf);
|
||||
|
||||
if (!memcmp(buf, QCA1530_DETECT_PRESENT,
|
||||
sizeof(QCA1530_DETECT_PRESENT)))
|
||||
{
|
||||
res = true;
|
||||
break;
|
||||
}
|
||||
if (!memcmp(buf, QCA1530_DETECT_PROGRESS,
|
||||
sizeof(QCA1530_DETECT_PROGRESS)))
|
||||
{
|
||||
LOC_LOGV("qca1530: SoC detection is in progress.");
|
||||
sleep(1);
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
LOC_LOGD("qca1530: detected=%s", res ? "true" : "false");
|
||||
return res;
|
||||
}
|
||||
|
||||
/*The character array passed to this function should have length
|
||||
of atleast PROPERTY_VALUE_MAX*/
|
||||
void loc_get_target_baseband(char *baseband, int array_length)
|
||||
{
|
||||
if(baseband && (array_length >= PROPERTY_VALUE_MAX)) {
|
||||
property_get("ro.baseband", baseband, "");
|
||||
LOC_LOGD("%s:%d]: Baseband: %s\n", __func__, __LINE__, baseband);
|
||||
}
|
||||
else {
|
||||
LOC_LOGE("%s:%d]: NULL parameter or array length less than PROPERTY_VALUE_MAX\n",
|
||||
__func__, __LINE__);
|
||||
}
|
||||
}
|
||||
|
||||
/*The character array passed to this function should have length
|
||||
of atleast PROPERTY_VALUE_MAX*/
|
||||
void loc_get_platform_name(char *platform_name, int array_length)
|
||||
{
|
||||
if(platform_name && (array_length >= PROPERTY_VALUE_MAX)) {
|
||||
property_get("ro.board.platform", platform_name, "");
|
||||
LOC_LOGD("%s:%d]: Target name: %s\n", __func__, __LINE__, platform_name);
|
||||
}
|
||||
else {
|
||||
LOC_LOGE("%s:%d]: Null parameter or array length less than PROPERTY_VALUE_MAX\n",
|
||||
__func__, __LINE__);
|
||||
}
|
||||
}
|
||||
|
||||
unsigned int loc_get_target(void)
|
||||
{
|
||||
if (gTarget != (unsigned int)-1)
|
||||
return gTarget;
|
||||
|
||||
static const char hw_platform[] = "/sys/devices/soc0/hw_platform";
|
||||
static const char id[] = "/sys/devices/soc0/soc_id";
|
||||
static const char hw_platform_dep[] =
|
||||
"/sys/devices/system/soc/soc0/hw_platform";
|
||||
static const char id_dep[] = "/sys/devices/system/soc/soc0/id";
|
||||
static const char mdm[] = "/dev/mdm"; // No such file or directory
|
||||
|
||||
char rd_hw_platform[LINE_LEN];
|
||||
char rd_id[LINE_LEN];
|
||||
char rd_mdm[LINE_LEN];
|
||||
char baseband[LINE_LEN];
|
||||
|
||||
if (is_qca1530()) {
|
||||
gTarget = TARGET_QCA1530;
|
||||
goto detected;
|
||||
}
|
||||
|
||||
loc_get_target_baseband(baseband, sizeof(baseband));
|
||||
|
||||
if (!access(hw_platform, F_OK)) {
|
||||
read_a_line(hw_platform, rd_hw_platform, LINE_LEN);
|
||||
} else {
|
||||
read_a_line(hw_platform_dep, rd_hw_platform, LINE_LEN);
|
||||
}
|
||||
if (!access(id, F_OK)) {
|
||||
read_a_line(id, rd_id, LINE_LEN);
|
||||
} else {
|
||||
read_a_line(id_dep, rd_id, LINE_LEN);
|
||||
}
|
||||
if( !memcmp(baseband, STR_AUTO, LENGTH(STR_AUTO)) )
|
||||
{
|
||||
gTarget = TARGET_AUTO;
|
||||
goto detected;
|
||||
}
|
||||
if( !memcmp(baseband, STR_APQ, LENGTH(STR_APQ)) ){
|
||||
|
||||
if( !memcmp(rd_id, MPQ8064_ID_1, LENGTH(MPQ8064_ID_1))
|
||||
&& IS_STR_END(rd_id[LENGTH(MPQ8064_ID_1)]) )
|
||||
gTarget = TARGET_MPQ;
|
||||
else
|
||||
gTarget = TARGET_APQ_SA;
|
||||
}
|
||||
else {
|
||||
if( (!memcmp(rd_hw_platform, STR_LIQUID, LENGTH(STR_LIQUID))
|
||||
&& IS_STR_END(rd_hw_platform[LENGTH(STR_LIQUID)])) ||
|
||||
(!memcmp(rd_hw_platform, STR_SURF, LENGTH(STR_SURF))
|
||||
&& IS_STR_END(rd_hw_platform[LENGTH(STR_SURF)])) ||
|
||||
(!memcmp(rd_hw_platform, STR_MTP, LENGTH(STR_MTP))
|
||||
&& IS_STR_END(rd_hw_platform[LENGTH(STR_MTP)]))) {
|
||||
|
||||
if (!read_a_line( mdm, rd_mdm, LINE_LEN))
|
||||
gTarget = TARGET_MDM;
|
||||
}
|
||||
else if( (!memcmp(rd_id, MSM8930_ID_1, LENGTH(MSM8930_ID_1))
|
||||
&& IS_STR_END(rd_id[LENGTH(MSM8930_ID_1)])) ||
|
||||
(!memcmp(rd_id, MSM8930_ID_2, LENGTH(MSM8930_ID_2))
|
||||
&& IS_STR_END(rd_id[LENGTH(MSM8930_ID_2)])) )
|
||||
gTarget = TARGET_MSM_NO_SSC;
|
||||
else
|
||||
gTarget = TARGET_UNKNOWN;
|
||||
}
|
||||
|
||||
detected:
|
||||
LOC_LOGD("HAL: %s returned %d", __FUNCTION__, gTarget);
|
||||
return gTarget;
|
||||
}
|
77
android/hardware/qcom/gps/utils/loc_target.h
Normal file
77
android/hardware/qcom/gps/utils/loc_target.h
Normal file
|
@ -0,0 +1,77 @@
|
|||
/* Copyright (c) 2012-2014, The Linux Foundation. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are
|
||||
* met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following
|
||||
* disclaimer in the documentation and/or other materials provided
|
||||
* with the distribution.
|
||||
* * Neither the name of The Linux Foundation nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
|
||||
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
|
||||
* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
|
||||
* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
#ifndef LOC_TARGET_H
|
||||
#define LOC_TARGET_H
|
||||
#define TARGET_SET(gnss,ssc) ( (gnss<<1)|ssc )
|
||||
#define TARGET_DEFAULT TARGET_SET(GNSS_MSM, HAS_SSC)
|
||||
#define TARGET_MDM TARGET_SET(GNSS_MDM, HAS_SSC)
|
||||
#define TARGET_APQ_SA TARGET_SET(GNSS_GSS, NO_SSC)
|
||||
#define TARGET_MPQ TARGET_SET(GNSS_NONE,NO_SSC)
|
||||
#define TARGET_MSM_NO_SSC TARGET_SET(GNSS_MSM, NO_SSC)
|
||||
#define TARGET_QCA1530 TARGET_SET(GNSS_QCA1530, NO_SSC)
|
||||
#define TARGET_AUTO TARGET_SET(GNSS_AUTO, NO_SSC)
|
||||
#define TARGET_UNKNOWN TARGET_SET(GNSS_UNKNOWN, NO_SSC)
|
||||
#define getTargetGnssType(target) (target>>1)
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
unsigned int loc_get_target(void);
|
||||
|
||||
/*The character array passed to this function should have length
|
||||
of atleast PROPERTY_VALUE_MAX*/
|
||||
void loc_get_target_baseband(char *baseband, int array_length);
|
||||
/*The character array passed to this function should have length
|
||||
of atleast PROPERTY_VALUE_MAX*/
|
||||
void loc_get_platform_name(char *platform_name, int array_length);
|
||||
|
||||
/* Please remember to update 'target_name' in loc_log.cpp,
|
||||
if do any changes to this enum. */
|
||||
typedef enum {
|
||||
GNSS_NONE = 0,
|
||||
GNSS_MSM,
|
||||
GNSS_GSS,
|
||||
GNSS_MDM,
|
||||
GNSS_QCA1530,
|
||||
GNSS_AUTO,
|
||||
GNSS_UNKNOWN
|
||||
}GNSS_TARGET;
|
||||
|
||||
typedef enum {
|
||||
NO_SSC = 0,
|
||||
HAS_SSC
|
||||
}SSC_TYPE;
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /*LOC_TARGET_H*/
|
202
android/hardware/qcom/gps/utils/loc_timer.c
Normal file
202
android/hardware/qcom/gps/utils/loc_timer.c
Normal file
|
@ -0,0 +1,202 @@
|
|||
/* Copyright (c) 2013, The Linux Foundation. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are
|
||||
* met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following
|
||||
* disclaimer in the documentation and/or other materials provided
|
||||
* with the distribution.
|
||||
* * Neither the name of The Linux Foundation, nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
|
||||
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
|
||||
* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
|
||||
* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
#include<stdio.h>
|
||||
#include<stdlib.h>
|
||||
#include<sys/time.h>
|
||||
#include "loc_timer.h"
|
||||
#include<time.h>
|
||||
#include<errno.h>
|
||||
|
||||
enum timer_state {
|
||||
READY = 100,
|
||||
WAITING,
|
||||
DONE,
|
||||
ABORT
|
||||
};
|
||||
|
||||
typedef struct {
|
||||
loc_timer_callback callback_func;
|
||||
void *user_data;
|
||||
unsigned int time_msec;
|
||||
pthread_cond_t timer_cond;
|
||||
pthread_mutex_t timer_mutex;
|
||||
enum timer_state state;
|
||||
}timer_data;
|
||||
|
||||
static void *timer_thread(void *thread_data)
|
||||
{
|
||||
int ret = -ETIMEDOUT;
|
||||
struct timespec ts;
|
||||
struct timeval tv;
|
||||
timer_data* t = (timer_data*)thread_data;
|
||||
|
||||
LOC_LOGD("%s:%d]: Enter. Delay = %d\n", __func__, __LINE__, t->time_msec);
|
||||
|
||||
gettimeofday(&tv, NULL);
|
||||
clock_gettime(CLOCK_REALTIME, &ts);
|
||||
if(t->time_msec >= 1000) {
|
||||
ts.tv_sec += t->time_msec/1000;
|
||||
t->time_msec = t->time_msec % 1000;
|
||||
}
|
||||
if(t->time_msec)
|
||||
ts.tv_nsec += t->time_msec * 1000000;
|
||||
if(ts.tv_nsec > 999999999) {
|
||||
LOC_LOGD("%s:%d]: Large nanosecs\n", __func__, __LINE__);
|
||||
ts.tv_sec += 1;
|
||||
ts.tv_nsec -= 1000000000;
|
||||
}
|
||||
LOC_LOGD("%s:%d]: ts.tv_sec:%d; ts.tv_nsec:%d\n"
|
||||
"\t Current time: %d sec; %d nsec",
|
||||
__func__, __LINE__, (int)ts.tv_sec, (int)ts.tv_nsec,
|
||||
(int)tv.tv_sec, (int)tv.tv_usec*1000);
|
||||
|
||||
pthread_mutex_lock(&(t->timer_mutex));
|
||||
if (READY == t->state) {
|
||||
t->state = WAITING;
|
||||
ret = pthread_cond_timedwait(&t->timer_cond, &t->timer_mutex, &ts);
|
||||
t->state = DONE;
|
||||
}
|
||||
pthread_mutex_unlock(&(t->timer_mutex));
|
||||
|
||||
switch (ret) {
|
||||
case ETIMEDOUT:
|
||||
LOC_LOGV("%s:%d]: loc_timer timed out", __func__, __LINE__);
|
||||
break;
|
||||
case 0:
|
||||
LOC_LOGV("%s:%d]: loc_timer stopped", __func__, __LINE__);
|
||||
break;
|
||||
case -ETIMEDOUT:
|
||||
LOC_LOGV("%s:%d]: loc_timer cancelled", __func__, __LINE__);
|
||||
break;
|
||||
default:
|
||||
LOC_LOGE("%s:%d]: Call to pthread timedwait failed; ret=%d\n",
|
||||
__func__, __LINE__, ret);
|
||||
break;
|
||||
}
|
||||
|
||||
if(ETIMEDOUT == ret)
|
||||
t->callback_func(t->user_data, ret);
|
||||
|
||||
// A (should be rare) race condition is that, when the loc_time_stop is called
|
||||
// and acquired mutex, we reach here. pthread_mutex_destroy will fail with
|
||||
// error code EBUSY. We give it 6 tries in 5 seconds. Should be eanough time
|
||||
// for loc_timer_stop to complete. With the 7th try, we also perform unlock
|
||||
// prior to destroy.
|
||||
{
|
||||
int i;
|
||||
for (i = 0; EBUSY == pthread_mutex_destroy(&t->timer_mutex) && i <= 5; i++) {
|
||||
if (i < 5) {
|
||||
sleep(1);
|
||||
} else {
|
||||
// nah, forget it, something is seriously wrong. Mutex has been
|
||||
// held too long. Unlock the mutext here.
|
||||
pthread_mutex_unlock(&t->timer_mutex);
|
||||
}
|
||||
}
|
||||
}
|
||||
pthread_cond_destroy(&t->timer_cond);
|
||||
|
||||
free(t);
|
||||
LOC_LOGD("%s:%d]: Exit\n", __func__, __LINE__);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void* loc_timer_start(unsigned int msec, loc_timer_callback cb_func,
|
||||
void* caller_data)
|
||||
{
|
||||
timer_data *t=NULL;
|
||||
pthread_attr_t tattr;
|
||||
pthread_t id;
|
||||
LOC_LOGD("%s:%d]: Enter\n", __func__, __LINE__);
|
||||
if(cb_func == NULL || msec == 0) {
|
||||
LOC_LOGE("%s:%d]: Error: Wrong parameters\n", __func__, __LINE__);
|
||||
goto _err;
|
||||
}
|
||||
t = (timer_data *)calloc(1, sizeof(timer_data));
|
||||
if(t == NULL) {
|
||||
LOC_LOGE("%s:%d]: Could not allocate memory. Failing.\n",
|
||||
__func__, __LINE__);
|
||||
goto _err;
|
||||
}
|
||||
|
||||
if(pthread_cond_init(&(t->timer_cond), NULL)) {
|
||||
LOC_LOGE("%s:%d]: Pthread cond init failed\n", __func__, __LINE__);
|
||||
goto t_err;
|
||||
}
|
||||
if(pthread_mutex_init(&(t->timer_mutex), NULL)) {
|
||||
LOC_LOGE("%s:%d]: Pthread mutex init failed\n", __func__, __LINE__);
|
||||
goto cond_err;
|
||||
}
|
||||
|
||||
t->callback_func = cb_func;
|
||||
t->user_data = caller_data;
|
||||
t->time_msec = msec;
|
||||
t->state = READY;
|
||||
|
||||
if (pthread_attr_init(&tattr)) {
|
||||
LOC_LOGE("%s:%d]: Pthread mutex init failed\n", __func__, __LINE__);
|
||||
goto mutex_err;
|
||||
}
|
||||
pthread_attr_setdetachstate(&tattr, PTHREAD_CREATE_DETACHED);
|
||||
|
||||
if(pthread_create(&(id), &tattr, timer_thread, (void *)t)) {
|
||||
LOC_LOGE("%s:%d]: Could not create thread\n", __func__, __LINE__);
|
||||
goto attr_err;
|
||||
}
|
||||
|
||||
LOC_LOGD("%s:%d]: Created thread with id: %d\n",
|
||||
__func__, __LINE__, (int)id);
|
||||
goto _err;
|
||||
|
||||
attr_err:
|
||||
pthread_attr_destroy(&tattr);
|
||||
mutex_err:
|
||||
pthread_mutex_destroy(&t->timer_mutex);
|
||||
cond_err:
|
||||
pthread_cond_destroy(&t->timer_cond);
|
||||
t_err:
|
||||
free(t);
|
||||
_err:
|
||||
LOC_LOGD("%s:%d]: Exit\n", __func__, __LINE__);
|
||||
return t;
|
||||
}
|
||||
|
||||
void loc_timer_stop(void* handle) {
|
||||
timer_data* t = (timer_data*)handle;
|
||||
|
||||
if (NULL != t && (READY == t->state || WAITING == t->state) &&
|
||||
pthread_mutex_lock(&(t->timer_mutex)) == 0) {
|
||||
if (READY == t->state || WAITING == t->state) {
|
||||
pthread_cond_signal(&t->timer_cond);
|
||||
t->state = ABORT;
|
||||
}
|
||||
pthread_mutex_unlock(&(t->timer_mutex));
|
||||
}
|
||||
}
|
63
android/hardware/qcom/gps/utils/loc_timer.h
Normal file
63
android/hardware/qcom/gps/utils/loc_timer.h
Normal file
|
@ -0,0 +1,63 @@
|
|||
/* Copyright (c) 2013, The Linux Foundation. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are
|
||||
* met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following
|
||||
* disclaimer in the documentation and/or other materials provided
|
||||
* with the distribution.
|
||||
* * Neither the name of The Linux Foundation, nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
|
||||
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
|
||||
* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
|
||||
* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __LOC_DELAY_H__
|
||||
#define __LOC_DELAY_H__
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif /* __cplusplus */
|
||||
#include<pthread.h>
|
||||
#include "log_util.h"
|
||||
|
||||
/*
|
||||
Return values:
|
||||
Success = 0
|
||||
Failure = Non zero
|
||||
*/
|
||||
typedef void(*loc_timer_callback)(void *user_data, int result);
|
||||
|
||||
|
||||
/*
|
||||
Returns the handle, which can be used to stop the timer
|
||||
*/
|
||||
void* loc_timer_start(unsigned int delay_msec,
|
||||
loc_timer_callback,
|
||||
void* user_data);
|
||||
|
||||
/*
|
||||
handle becomes invalid upon the return of the callback
|
||||
*/
|
||||
void loc_timer_stop(void* handle);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif /* __cplusplus */
|
||||
|
||||
#endif //__LOC_DELAY_H__
|
158
android/hardware/qcom/gps/utils/log_util.h
Normal file
158
android/hardware/qcom/gps/utils/log_util.h
Normal file
|
@ -0,0 +1,158 @@
|
|||
/* Copyright (c) 2011-2014 The Linux Foundation. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are
|
||||
* met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following
|
||||
* disclaimer in the documentation and/or other materials provided
|
||||
* with the distribution.
|
||||
* * Neither the name of The Linux Foundation nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
|
||||
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
|
||||
* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
|
||||
* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __LOG_UTIL_H__
|
||||
#define __LOG_UTIL_H__
|
||||
|
||||
#ifndef USE_GLIB
|
||||
#include <utils/Log.h>
|
||||
#endif /* USE_GLIB */
|
||||
|
||||
#ifdef USE_GLIB
|
||||
|
||||
#include <stdio.h>
|
||||
#include <sys/types.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#ifndef LOG_TAG
|
||||
#define LOG_TAG "GPS_UTILS"
|
||||
|
||||
#endif // LOG_TAG
|
||||
|
||||
#endif /* USE_GLIB */
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
/*=============================================================================
|
||||
*
|
||||
* LOC LOGGER TYPE DECLARATION
|
||||
*
|
||||
*============================================================================*/
|
||||
/* LOC LOGGER */
|
||||
typedef struct loc_logger_s
|
||||
{
|
||||
unsigned long DEBUG_LEVEL;
|
||||
unsigned long TIMESTAMP;
|
||||
} loc_logger_s_type;
|
||||
|
||||
/*=============================================================================
|
||||
*
|
||||
* EXTERNAL DATA
|
||||
*
|
||||
*============================================================================*/
|
||||
extern loc_logger_s_type loc_logger;
|
||||
|
||||
// Logging Improvements
|
||||
extern const char *loc_logger_boolStr[];
|
||||
|
||||
extern const char *boolStr[];
|
||||
extern const char VOID_RET[];
|
||||
extern const char FROM_AFW[];
|
||||
extern const char TO_MODEM[];
|
||||
extern const char FROM_MODEM[];
|
||||
extern const char TO_AFW[];
|
||||
extern const char EXIT_TAG[];
|
||||
extern const char ENTRY_TAG[];
|
||||
/*=============================================================================
|
||||
*
|
||||
* MODULE EXPORTED FUNCTIONS
|
||||
*
|
||||
*============================================================================*/
|
||||
extern void loc_logger_init(unsigned long debug, unsigned long timestamp);
|
||||
extern char* get_timestamp(char* str, unsigned long buf_size);
|
||||
|
||||
#ifndef DEBUG_DMN_LOC_API
|
||||
|
||||
/* LOGGING MACROS */
|
||||
/*loc_logger.DEBUG_LEVEL is initialized to 0xff in loc_cfg.cpp
|
||||
if that value remains unchanged, it means gps.conf did not
|
||||
provide a value and we default to the initial value to use
|
||||
Android's logging levels*/
|
||||
#define IF_LOC_LOGE if((loc_logger.DEBUG_LEVEL >= 1) && (loc_logger.DEBUG_LEVEL <= 5))
|
||||
#define IF_LOC_LOGW if((loc_logger.DEBUG_LEVEL >= 2) && (loc_logger.DEBUG_LEVEL <= 5))
|
||||
#define IF_LOC_LOGI if((loc_logger.DEBUG_LEVEL >= 3) && (loc_logger.DEBUG_LEVEL <= 5))
|
||||
#define IF_LOC_LOGD if((loc_logger.DEBUG_LEVEL >= 4) && (loc_logger.DEBUG_LEVEL <= 5))
|
||||
#define IF_LOC_LOGV if((loc_logger.DEBUG_LEVEL >= 5) && (loc_logger.DEBUG_LEVEL <= 5))
|
||||
|
||||
#define LOC_LOGE(...) IF_LOC_LOGE { ALOGE(__VA_ARGS__); }
|
||||
#define LOC_LOGW(...) IF_LOC_LOGW { ALOGW(__VA_ARGS__); }
|
||||
#define LOC_LOGI(...) IF_LOC_LOGI { ALOGI(__VA_ARGS__); }
|
||||
#define LOC_LOGD(...) IF_LOC_LOGD { ALOGD(__VA_ARGS__); }
|
||||
#define LOC_LOGV(...) IF_LOC_LOGV { ALOGV(__VA_ARGS__); }
|
||||
|
||||
#else /* DEBUG_DMN_LOC_API */
|
||||
|
||||
#define LOC_LOGE(...) ALOGE(__VA_ARGS__)
|
||||
#define LOC_LOGW(...) ALOGW(__VA_ARGS__)
|
||||
#define LOC_LOGI(...) ALOGI(__VA_ARGS__)
|
||||
#define LOC_LOGD(...) ALOGD(__VA_ARGS__)
|
||||
#define LOC_LOGV(...) ALOGV(__VA_ARGS__)
|
||||
|
||||
#endif /* DEBUG_DMN_LOC_API */
|
||||
|
||||
/*=============================================================================
|
||||
*
|
||||
* LOGGING IMPROVEMENT MACROS
|
||||
*
|
||||
*============================================================================*/
|
||||
#define LOG_(LOC_LOG, ID, WHAT, SPEC, VAL) \
|
||||
do { \
|
||||
if (loc_logger.TIMESTAMP) { \
|
||||
char ts[32]; \
|
||||
LOC_LOG("[%s] %s %s line %d " #SPEC, \
|
||||
get_timestamp(ts, sizeof(ts)), ID, WHAT, __LINE__, VAL); \
|
||||
} else { \
|
||||
LOC_LOG("%s %s line %d " #SPEC, \
|
||||
ID, WHAT, __LINE__, VAL); \
|
||||
} \
|
||||
} while(0)
|
||||
|
||||
|
||||
#define LOG_I(ID, WHAT, SPEC, VAL) LOG_(LOC_LOGI, ID, WHAT, SPEC, VAL)
|
||||
#define LOG_V(ID, WHAT, SPEC, VAL) LOG_(LOC_LOGV, ID, WHAT, SPEC, VAL)
|
||||
|
||||
#define ENTRY_LOG() LOG_V(ENTRY_TAG, __func__, %s, "")
|
||||
#define EXIT_LOG(SPEC, VAL) LOG_V(EXIT_TAG, __func__, SPEC, VAL)
|
||||
|
||||
// Used for logging callflow from Android Framework
|
||||
#define ENTRY_LOG_CALLFLOW() LOG_I(FROM_AFW, __FUNCTION__, %s, "")
|
||||
// Used for logging callflow to Modem
|
||||
#define EXIT_LOG_CALLFLOW(SPEC, VAL) LOG_I(TO_MODEM, __FUNCTION__, SPEC, VAL)
|
||||
// Used for logging callflow from Modem(TO_MODEM, __FUNCTION__, %s, "")
|
||||
#define MODEM_LOG_CALLFLOW(SPEC, VAL) LOG_I(FROM_MODEM, __FUNCTION__, SPEC, VAL)
|
||||
// Used for logging callflow to Android Framework
|
||||
#define CALLBACK_LOG_CALLFLOW(CB, SPEC, VAL) LOG_I(TO_AFW, CB, SPEC, VAL)
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif // __LOG_UTIL_H__
|
336
android/hardware/qcom/gps/utils/msg_q.c
Normal file
336
android/hardware/qcom/gps/utils/msg_q.c
Normal file
|
@ -0,0 +1,336 @@
|
|||
/* Copyright (c) 2011-2012, The Linux Foundation. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are
|
||||
* met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following
|
||||
* disclaimer in the documentation and/or other materials provided
|
||||
* with the distribution.
|
||||
* * Neither the name of The Linux Foundation, nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
|
||||
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
|
||||
* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
|
||||
* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include "msg_q.h"
|
||||
|
||||
#define LOG_TAG "LocSvc_utils_q"
|
||||
#include "log_util.h"
|
||||
#include "platform_lib_includes.h"
|
||||
#include "linked_list.h"
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <pthread.h>
|
||||
|
||||
typedef struct msg_q {
|
||||
void* msg_list; /* Linked list to store information */
|
||||
pthread_cond_t list_cond; /* Condition variable for waiting on msg queue */
|
||||
pthread_mutex_t list_mutex; /* Mutex for exclusive access to message queue */
|
||||
int unblocked; /* Has this message queue been unblocked? */
|
||||
} msg_q;
|
||||
|
||||
/*===========================================================================
|
||||
FUNCTION convert_linked_list_err_type
|
||||
|
||||
DESCRIPTION
|
||||
Converts from one set of enum values to another.
|
||||
|
||||
linked_list_val: Value to convert to msg_q_enum_type
|
||||
|
||||
DEPENDENCIES
|
||||
N/A
|
||||
|
||||
RETURN VALUE
|
||||
Corresponding linked_list_enum_type in msg_q_enum_type
|
||||
|
||||
SIDE EFFECTS
|
||||
N/A
|
||||
|
||||
===========================================================================*/
|
||||
static msq_q_err_type convert_linked_list_err_type(linked_list_err_type linked_list_val)
|
||||
{
|
||||
switch( linked_list_val )
|
||||
{
|
||||
case eLINKED_LIST_SUCCESS:
|
||||
return eMSG_Q_SUCCESS;
|
||||
case eLINKED_LIST_INVALID_PARAMETER:
|
||||
return eMSG_Q_INVALID_PARAMETER;
|
||||
case eLINKED_LIST_INVALID_HANDLE:
|
||||
return eMSG_Q_INVALID_HANDLE;
|
||||
case eLINKED_LIST_UNAVAILABLE_RESOURCE:
|
||||
return eMSG_Q_UNAVAILABLE_RESOURCE;
|
||||
case eLINKED_LIST_INSUFFICIENT_BUFFER:
|
||||
return eMSG_Q_INSUFFICIENT_BUFFER;
|
||||
|
||||
case eLINKED_LIST_FAILURE_GENERAL:
|
||||
default:
|
||||
return eMSG_Q_FAILURE_GENERAL;
|
||||
}
|
||||
}
|
||||
|
||||
/* ----------------------- END INTERNAL FUNCTIONS ---------------------------------------- */
|
||||
|
||||
/*===========================================================================
|
||||
|
||||
FUNCTION: msg_q_init
|
||||
|
||||
===========================================================================*/
|
||||
msq_q_err_type msg_q_init(void** msg_q_data)
|
||||
{
|
||||
if( msg_q_data == NULL )
|
||||
{
|
||||
LOC_LOGE("%s: Invalid msg_q_data parameter!\n", __FUNCTION__);
|
||||
return eMSG_Q_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
msg_q* tmp_msg_q;
|
||||
tmp_msg_q = (msg_q*)calloc(1, sizeof(msg_q));
|
||||
if( tmp_msg_q == NULL )
|
||||
{
|
||||
LOC_LOGE("%s: Unable to allocate space for message queue!\n", __FUNCTION__);
|
||||
return eMSG_Q_FAILURE_GENERAL;
|
||||
}
|
||||
|
||||
if( linked_list_init(&tmp_msg_q->msg_list) != 0 )
|
||||
{
|
||||
LOC_LOGE("%s: Unable to initialize storage list!\n", __FUNCTION__);
|
||||
free(tmp_msg_q);
|
||||
return eMSG_Q_FAILURE_GENERAL;
|
||||
}
|
||||
|
||||
if( pthread_mutex_init(&tmp_msg_q->list_mutex, NULL) != 0 )
|
||||
{
|
||||
LOC_LOGE("%s: Unable to initialize list mutex!\n", __FUNCTION__);
|
||||
linked_list_destroy(&tmp_msg_q->msg_list);
|
||||
free(tmp_msg_q);
|
||||
return eMSG_Q_FAILURE_GENERAL;
|
||||
}
|
||||
|
||||
if( pthread_cond_init(&tmp_msg_q->list_cond, NULL) != 0 )
|
||||
{
|
||||
LOC_LOGE("%s: Unable to initialize msg q cond var!\n", __FUNCTION__);
|
||||
linked_list_destroy(&tmp_msg_q->msg_list);
|
||||
pthread_mutex_destroy(&tmp_msg_q->list_mutex);
|
||||
free(tmp_msg_q);
|
||||
return eMSG_Q_FAILURE_GENERAL;
|
||||
}
|
||||
|
||||
tmp_msg_q->unblocked = 0;
|
||||
|
||||
*msg_q_data = tmp_msg_q;
|
||||
|
||||
return eMSG_Q_SUCCESS;
|
||||
}
|
||||
|
||||
/*===========================================================================
|
||||
|
||||
FUNCTION: msg_q_init2
|
||||
|
||||
===========================================================================*/
|
||||
const void* msg_q_init2()
|
||||
{
|
||||
void* q = NULL;
|
||||
if (eMSG_Q_SUCCESS != msg_q_init(&q)) {
|
||||
q = NULL;
|
||||
}
|
||||
return q;
|
||||
}
|
||||
|
||||
/*===========================================================================
|
||||
|
||||
FUNCTION: msg_q_destroy
|
||||
|
||||
===========================================================================*/
|
||||
msq_q_err_type msg_q_destroy(void** msg_q_data)
|
||||
{
|
||||
if( msg_q_data == NULL )
|
||||
{
|
||||
LOC_LOGE("%s: Invalid msg_q_data parameter!\n", __FUNCTION__);
|
||||
return eMSG_Q_INVALID_HANDLE;
|
||||
}
|
||||
|
||||
msg_q* p_msg_q = (msg_q*)*msg_q_data;
|
||||
|
||||
linked_list_destroy(&p_msg_q->msg_list);
|
||||
pthread_mutex_destroy(&p_msg_q->list_mutex);
|
||||
pthread_cond_destroy(&p_msg_q->list_cond);
|
||||
|
||||
p_msg_q->unblocked = 0;
|
||||
|
||||
free(*msg_q_data);
|
||||
*msg_q_data = NULL;
|
||||
|
||||
return eMSG_Q_SUCCESS;
|
||||
}
|
||||
|
||||
/*===========================================================================
|
||||
|
||||
FUNCTION: msg_q_snd
|
||||
|
||||
===========================================================================*/
|
||||
msq_q_err_type msg_q_snd(void* msg_q_data, void* msg_obj, void (*dealloc)(void*))
|
||||
{
|
||||
msq_q_err_type rv;
|
||||
if( msg_q_data == NULL )
|
||||
{
|
||||
LOC_LOGE("%s: Invalid msg_q_data parameter!\n", __FUNCTION__);
|
||||
return eMSG_Q_INVALID_HANDLE;
|
||||
}
|
||||
if( msg_obj == NULL )
|
||||
{
|
||||
LOC_LOGE("%s: Invalid msg_obj parameter!\n", __FUNCTION__);
|
||||
return eMSG_Q_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
msg_q* p_msg_q = (msg_q*)msg_q_data;
|
||||
|
||||
pthread_mutex_lock(&p_msg_q->list_mutex);
|
||||
LOC_LOGD("%s: Sending message with handle = 0x%08X\n", __FUNCTION__, msg_obj);
|
||||
|
||||
if( p_msg_q->unblocked )
|
||||
{
|
||||
LOC_LOGE("%s: Message queue has been unblocked.\n", __FUNCTION__);
|
||||
pthread_mutex_unlock(&p_msg_q->list_mutex);
|
||||
return eMSG_Q_UNAVAILABLE_RESOURCE;
|
||||
}
|
||||
|
||||
rv = convert_linked_list_err_type(linked_list_add(p_msg_q->msg_list, msg_obj, dealloc));
|
||||
|
||||
/* Show data is in the message queue. */
|
||||
pthread_cond_signal(&p_msg_q->list_cond);
|
||||
|
||||
pthread_mutex_unlock(&p_msg_q->list_mutex);
|
||||
|
||||
LOC_LOGD("%s: Finished Sending message with handle = 0x%08X\n", __FUNCTION__, msg_obj);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
/*===========================================================================
|
||||
|
||||
FUNCTION: msg_q_rcv
|
||||
|
||||
===========================================================================*/
|
||||
msq_q_err_type msg_q_rcv(void* msg_q_data, void** msg_obj)
|
||||
{
|
||||
msq_q_err_type rv;
|
||||
if( msg_q_data == NULL )
|
||||
{
|
||||
LOC_LOGE("%s: Invalid msg_q_data parameter!\n", __FUNCTION__);
|
||||
return eMSG_Q_INVALID_HANDLE;
|
||||
}
|
||||
|
||||
if( msg_obj == NULL )
|
||||
{
|
||||
LOC_LOGE("%s: Invalid msg_obj parameter!\n", __FUNCTION__);
|
||||
return eMSG_Q_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
msg_q* p_msg_q = (msg_q*)msg_q_data;
|
||||
|
||||
LOC_LOGD("%s: Waiting on message\n", __FUNCTION__);
|
||||
|
||||
pthread_mutex_lock(&p_msg_q->list_mutex);
|
||||
|
||||
if( p_msg_q->unblocked )
|
||||
{
|
||||
LOC_LOGE("%s: Message queue has been unblocked.\n", __FUNCTION__);
|
||||
pthread_mutex_unlock(&p_msg_q->list_mutex);
|
||||
return eMSG_Q_UNAVAILABLE_RESOURCE;
|
||||
}
|
||||
|
||||
/* Wait for data in the message queue */
|
||||
while( linked_list_empty(p_msg_q->msg_list) && !p_msg_q->unblocked )
|
||||
{
|
||||
pthread_cond_wait(&p_msg_q->list_cond, &p_msg_q->list_mutex);
|
||||
}
|
||||
|
||||
rv = convert_linked_list_err_type(linked_list_remove(p_msg_q->msg_list, msg_obj));
|
||||
|
||||
pthread_mutex_unlock(&p_msg_q->list_mutex);
|
||||
|
||||
LOC_LOGD("%s: Received message 0x%08X rv = %d\n", __FUNCTION__, *msg_obj, rv);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
/*===========================================================================
|
||||
|
||||
FUNCTION: msg_q_flush
|
||||
|
||||
===========================================================================*/
|
||||
msq_q_err_type msg_q_flush(void* msg_q_data)
|
||||
{
|
||||
msq_q_err_type rv;
|
||||
if ( msg_q_data == NULL )
|
||||
{
|
||||
LOC_LOGE("%s: Invalid msg_q_data parameter!\n", __FUNCTION__);
|
||||
return eMSG_Q_INVALID_HANDLE;
|
||||
}
|
||||
|
||||
msg_q* p_msg_q = (msg_q*)msg_q_data;
|
||||
|
||||
LOC_LOGD("%s: Flushing Message Queue\n", __FUNCTION__);
|
||||
|
||||
pthread_mutex_lock(&p_msg_q->list_mutex);
|
||||
|
||||
/* Remove all elements from the list */
|
||||
rv = convert_linked_list_err_type(linked_list_flush(p_msg_q->msg_list));
|
||||
|
||||
pthread_mutex_unlock(&p_msg_q->list_mutex);
|
||||
|
||||
LOC_LOGD("%s: Message Queue flushed\n", __FUNCTION__);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
/*===========================================================================
|
||||
|
||||
FUNCTION: msg_q_unblock
|
||||
|
||||
===========================================================================*/
|
||||
msq_q_err_type msg_q_unblock(void* msg_q_data)
|
||||
{
|
||||
if ( msg_q_data == NULL )
|
||||
{
|
||||
LOC_LOGE("%s: Invalid msg_q_data parameter!\n", __FUNCTION__);
|
||||
return eMSG_Q_INVALID_HANDLE;
|
||||
}
|
||||
|
||||
msg_q* p_msg_q = (msg_q*)msg_q_data;
|
||||
pthread_mutex_lock(&p_msg_q->list_mutex);
|
||||
|
||||
if( p_msg_q->unblocked )
|
||||
{
|
||||
LOC_LOGE("%s: Message queue has been unblocked.\n", __FUNCTION__);
|
||||
pthread_mutex_unlock(&p_msg_q->list_mutex);
|
||||
return eMSG_Q_UNAVAILABLE_RESOURCE;
|
||||
}
|
||||
|
||||
LOC_LOGD("%s: Unblocking Message Queue\n", __FUNCTION__);
|
||||
/* Unblocking message queue */
|
||||
p_msg_q->unblocked = 1;
|
||||
|
||||
/* Allow all the waiters to wake up */
|
||||
pthread_cond_broadcast(&p_msg_q->list_cond);
|
||||
|
||||
pthread_mutex_unlock(&p_msg_q->list_mutex);
|
||||
|
||||
LOC_LOGD("%s: Message Queue unblocked\n", __FUNCTION__);
|
||||
|
||||
return eMSG_Q_SUCCESS;
|
||||
}
|
207
android/hardware/qcom/gps/utils/msg_q.h
Normal file
207
android/hardware/qcom/gps/utils/msg_q.h
Normal file
|
@ -0,0 +1,207 @@
|
|||
/* Copyright (c) 2011, The Linux Foundation. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are
|
||||
* met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following
|
||||
* disclaimer in the documentation and/or other materials provided
|
||||
* with the distribution.
|
||||
* * Neither the name of The Linux Foundation nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
|
||||
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
|
||||
* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
|
||||
* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef __MSG_Q_H__
|
||||
#define __MSG_Q_H__
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif /* __cplusplus */
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
/** Linked List Return Codes */
|
||||
typedef enum
|
||||
{
|
||||
eMSG_Q_SUCCESS = 0,
|
||||
/**< Request was successful. */
|
||||
eMSG_Q_FAILURE_GENERAL = -1,
|
||||
/**< Failed because of a general failure. */
|
||||
eMSG_Q_INVALID_PARAMETER = -2,
|
||||
/**< Failed because the request contained invalid parameters. */
|
||||
eMSG_Q_INVALID_HANDLE = -3,
|
||||
/**< Failed because an invalid handle was specified. */
|
||||
eMSG_Q_UNAVAILABLE_RESOURCE = -4,
|
||||
/**< Failed because an there were not enough resources. */
|
||||
eMSG_Q_INSUFFICIENT_BUFFER = -5,
|
||||
/**< Failed because an the supplied buffer was too small. */
|
||||
}msq_q_err_type;
|
||||
|
||||
/*===========================================================================
|
||||
FUNCTION msg_q_init
|
||||
|
||||
DESCRIPTION
|
||||
Initializes internal structures for message queue.
|
||||
|
||||
msg_q_data: pointer to an opaque Q handle to be returned; NULL if fails
|
||||
|
||||
DEPENDENCIES
|
||||
N/A
|
||||
|
||||
RETURN VALUE
|
||||
Look at error codes above.
|
||||
|
||||
SIDE EFFECTS
|
||||
N/A
|
||||
|
||||
===========================================================================*/
|
||||
msq_q_err_type msg_q_init(void** msg_q_data);
|
||||
|
||||
/*===========================================================================
|
||||
FUNCTION msg_q_init2
|
||||
|
||||
DESCRIPTION
|
||||
Initializes internal structures for message queue.
|
||||
|
||||
DEPENDENCIES
|
||||
N/A
|
||||
|
||||
RETURN VALUE
|
||||
opaque handle to the Q created; NULL if create fails
|
||||
|
||||
SIDE EFFECTS
|
||||
N/A
|
||||
|
||||
===========================================================================*/
|
||||
const void* msg_q_init2();
|
||||
|
||||
/*===========================================================================
|
||||
FUNCTION msg_q_destroy
|
||||
|
||||
DESCRIPTION
|
||||
Releases internal structures for message queue.
|
||||
|
||||
msg_q_data: State of message queue to be released.
|
||||
|
||||
DEPENDENCIES
|
||||
N/A
|
||||
|
||||
RETURN VALUE
|
||||
Look at error codes above.
|
||||
|
||||
SIDE EFFECTS
|
||||
N/A
|
||||
|
||||
===========================================================================*/
|
||||
msq_q_err_type msg_q_destroy(void** msg_q_data);
|
||||
|
||||
/*===========================================================================
|
||||
FUNCTION msg_q_snd
|
||||
|
||||
DESCRIPTION
|
||||
Sends data to the message queue. The passed in data pointer
|
||||
is not modified or freed. Passed in msg_obj is expected to live throughout
|
||||
the use of the msg_q (i.e. data is not allocated internally)
|
||||
|
||||
msg_q_data: Message Queue to add the element to.
|
||||
msgp: Pointer to data to add into message queue.
|
||||
dealloc: Function used to deallocate memory for this element. Pass NULL
|
||||
if you do not want data deallocated during a flush operation
|
||||
|
||||
DEPENDENCIES
|
||||
N/A
|
||||
|
||||
RETURN VALUE
|
||||
Look at error codes above.
|
||||
|
||||
SIDE EFFECTS
|
||||
N/A
|
||||
|
||||
===========================================================================*/
|
||||
msq_q_err_type msg_q_snd(void* msg_q_data, void* msg_obj, void (*dealloc)(void*));
|
||||
|
||||
/*===========================================================================
|
||||
FUNCTION msg_q_rcv
|
||||
|
||||
DESCRIPTION
|
||||
Retrieves data from the message queue. msg_obj is the oldest message received
|
||||
and pointer is simply removed from message queue.
|
||||
|
||||
msg_q_data: Message Queue to copy data from into msgp.
|
||||
msg_obj: Pointer to space to copy msg_q contents to.
|
||||
|
||||
DEPENDENCIES
|
||||
N/A
|
||||
|
||||
RETURN VALUE
|
||||
Look at error codes above.
|
||||
|
||||
SIDE EFFECTS
|
||||
N/A
|
||||
|
||||
===========================================================================*/
|
||||
msq_q_err_type msg_q_rcv(void* msg_q_data, void** msg_obj);
|
||||
|
||||
/*===========================================================================
|
||||
FUNCTION msg_q_flush
|
||||
|
||||
DESCRIPTION
|
||||
Function removes all elements from the message queue.
|
||||
|
||||
msg_q_data: Message Queue to remove elements from.
|
||||
|
||||
DEPENDENCIES
|
||||
N/A
|
||||
|
||||
RETURN VALUE
|
||||
Look at error codes above.
|
||||
|
||||
SIDE EFFECTS
|
||||
N/A
|
||||
|
||||
===========================================================================*/
|
||||
msq_q_err_type msg_q_flush(void* msg_q_data);
|
||||
|
||||
/*===========================================================================
|
||||
FUNCTION msg_q_unblock
|
||||
|
||||
DESCRIPTION
|
||||
This function will stop use of the message queue. All waiters will wake up
|
||||
and likely receive nothing from the queue resulting in a negative return
|
||||
value. The message queue can no longer be used until it is destroyed
|
||||
and initialized again after calling this function.
|
||||
|
||||
msg_q_data: Message queue to unblock.
|
||||
|
||||
DEPENDENCIES
|
||||
N/A
|
||||
|
||||
RETURN VALUE
|
||||
Look at error codes above.
|
||||
|
||||
SIDE EFFECTS
|
||||
N/A
|
||||
|
||||
===========================================================================*/
|
||||
msq_q_err_type msg_q_unblock(void* msg_q_data);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif /* __cplusplus */
|
||||
|
||||
#endif /* __MSG_Q_H__ */
|
Loading…
Add table
Add a link
Reference in a new issue