Init
This commit is contained in:
commit
bf2e0c8c76
29
Android.mk
Executable file
29
Android.mk
Executable file
@ -0,0 +1,29 @@
|
|||||||
|
#
|
||||||
|
# Copyright (C) 2012 The Android Open-Source Project
|
||||||
|
#
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
# you may not use this file except in compliance with the License.
|
||||||
|
# You may obtain a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
# See the License for the specific language governing permissions and
|
||||||
|
# limitations under the License.
|
||||||
|
#
|
||||||
|
|
||||||
|
# WARNING: Everything listed here will be built on ALL platforms,
|
||||||
|
# including x86, the emulator, and the SDK. Modules must be uniquely
|
||||||
|
# named (liblights.tuna), and must build everywhere, or limit themselves
|
||||||
|
# to only building on ARM if they include assembly. Individual makefiles
|
||||||
|
# are responsible for having their own logic, for fine-grained control.
|
||||||
|
|
||||||
|
LOCAL_PATH := $(call my-dir)
|
||||||
|
|
||||||
|
ifeq ($(TARGET_DEVICE),viennalte)
|
||||||
|
|
||||||
|
include $(call all-subdir-makefiles,$(LOCAL_PATH))
|
||||||
|
|
||||||
|
endif
|
2
AndroidProducts.mk
Executable file
2
AndroidProducts.mk
Executable file
@ -0,0 +1,2 @@
|
|||||||
|
PRODUCT_MAKEFILES := \
|
||||||
|
$(LOCAL_DIR)/full_viennalte.mk
|
143
BoardConfig.mk
Executable file
143
BoardConfig.mk
Executable file
@ -0,0 +1,143 @@
|
|||||||
|
# Copyright (C) 2009 The CyanogenMod Project
|
||||||
|
#
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
# you may not use this file except in compliance with the License.
|
||||||
|
# You may obtain a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
# See the License for the specific language governing permissions and
|
||||||
|
# limitations under the License.
|
||||||
|
|
||||||
|
#
|
||||||
|
# This file sets variables that control the way modules are built
|
||||||
|
# thorughout the system. It should not be used to conditionally
|
||||||
|
# disable makefiles (the proper mechanism to control what gets
|
||||||
|
# included in a build is to use PRODUCT_PACKAGES in a product
|
||||||
|
# definition file).
|
||||||
|
#
|
||||||
|
|
||||||
|
# inherit from common msm8974
|
||||||
|
-include device/samsung/msm8974-common/BoardConfigCommon.mk
|
||||||
|
|
||||||
|
TARGET_SPECIFIC_HEADER_PATH := device/samsung/viennalte/include
|
||||||
|
|
||||||
|
TARGET_OTA_ASSERT_DEVICE := viennalte,viennaltexx
|
||||||
|
|
||||||
|
# Bootloader
|
||||||
|
TARGET_BOOTLOADER_BOARD_NAME := MSM8974
|
||||||
|
|
||||||
|
# Kernel
|
||||||
|
BOARD_KERNEL_BASE := 0x00000000
|
||||||
|
BOARD_KERNEL_CMDLINE := console=null androidboot.hardware=qcom user_debug=31 msm_rtb.filter=0x37 ehci-hcd.park=3
|
||||||
|
BOARD_KERNEL_PAGESIZE := 2048
|
||||||
|
BOARD_KERNEL_SEPARATED_DT := true
|
||||||
|
BOARD_MKBOOTIMG_ARGS := --ramdisk_offset 0x02000000 --tags_offset 0x01E00000
|
||||||
|
BOARD_CUSTOM_BOOTIMG_MK := device/samsung/viennalte/mkbootimg.mk
|
||||||
|
TARGET_KERNEL_SOURCE := kernel/samsung/viennalte
|
||||||
|
TARGET_KERNEL_CONFIG := msm8974_sec_defconfig
|
||||||
|
TARGET_KERNEL_VARIANT_CONFIG := msm8974_sec_viennalteeur_my_defconfig
|
||||||
|
|
||||||
|
# Audio
|
||||||
|
BOARD_HAVE_NEW_QCOM_CSDCLIENT := true
|
||||||
|
BOARD_HAVE_SAMSUNG_AUDIO := true
|
||||||
|
BOARD_USES_FLUENCE_INCALL := true
|
||||||
|
BOARD_USES_FLUENCE_FOR_VOIP := true
|
||||||
|
BOARD_USES_SEPERATED_AUDIO_INPUT := true
|
||||||
|
AUDIO_FEATURE_DISABLED_MULTI_VOICE_SESSIONS := true
|
||||||
|
AUDIO_FEATURE_DISABLED_FM := true
|
||||||
|
AUDIO_FEATURE_DISABLED_ANC_HEADSET := true
|
||||||
|
|
||||||
|
# Camera
|
||||||
|
TARGET_PROVIDES_CAMERA_HAL := true
|
||||||
|
USE_DEVICE_SPECIFIC_CAMERA := true
|
||||||
|
|
||||||
|
# Charger
|
||||||
|
BOARD_CHARGER_SHOW_PERCENTAGE := true
|
||||||
|
|
||||||
|
# GPS
|
||||||
|
TARGET_NO_RPC := true
|
||||||
|
TARGET_GPS_HAL_PATH := device/samsung/viennalte/gps
|
||||||
|
|
||||||
|
# Graphics
|
||||||
|
TARGET_HAVE_NEW_GRALLOC := true
|
||||||
|
BOARD_USES_LEGACY_MMAP := true
|
||||||
|
|
||||||
|
# Hardware
|
||||||
|
BOARD_HARDWARE_CLASS += device/samsung/viennalte/cmhw
|
||||||
|
|
||||||
|
# Lights
|
||||||
|
TARGET_PROVIDES_LIBLIGHT := true
|
||||||
|
|
||||||
|
# Bluetooth
|
||||||
|
BOARD_BLUETOOTH_BDROID_BUILDCFG_INCLUDE_DIR := device/samsung/viennalte/bluetooth
|
||||||
|
BOARD_BLUEDROID_VENDOR_CONF := device/samsung/viennalte/bluetooth/vnd_viennalte.txt
|
||||||
|
BOARD_BLUETOOTH_USES_HCIATTACH_PROPERTY := false
|
||||||
|
BOARD_HAVE_BLUETOOTH_BCM := true
|
||||||
|
|
||||||
|
# Partitions
|
||||||
|
BOARD_BOOTIMAGE_PARTITION_SIZE := 10485760
|
||||||
|
BOARD_RECOVERYIMAGE_PARTITION_SIZE := 13631488
|
||||||
|
BOARD_SYSTEMIMAGE_PARTITION_SIZE := 2810183680
|
||||||
|
BOARD_USERDATAIMAGE_PARTITION_SIZE := 27847015936
|
||||||
|
BOARD_FLASH_BLOCK_SIZE := 131072
|
||||||
|
TARGET_USERIMAGES_USE_EXT4 := true
|
||||||
|
TARGET_USERIMAGES_USE_F2FS := true
|
||||||
|
|
||||||
|
# PowerHAL
|
||||||
|
TARGET_POWERHAL_VARIANT := qcom
|
||||||
|
TARGET_POWERHAL_SET_INTERACTIVE_EXT := device/samsung/viennalte/power/power_ext.c
|
||||||
|
|
||||||
|
# Recovery
|
||||||
|
COMMON_GLOBAL_CFLAGS += -DNO_SECURE_DISCARD
|
||||||
|
BOARD_HAS_LARGE_FILESYSTEM := true
|
||||||
|
BOARD_HAS_NO_MISC_PARTITION := true
|
||||||
|
BOARD_HAS_NO_SELECT_BUTTON := true
|
||||||
|
BOARD_RECOVERY_SWIPE := true
|
||||||
|
BOARD_USE_CUSTOM_RECOVERY_FONT := \"roboto_23x41.h\"
|
||||||
|
BOARD_USES_MMCUTILS := true
|
||||||
|
TARGET_RECOVERY_FSTAB := device/samsung/viennalte/rootdir/etc/fstab.qcom
|
||||||
|
|
||||||
|
# RIL
|
||||||
|
BOARD_RIL_CLASS := ../../../device/samsung/viennalte/ril
|
||||||
|
BOARD_PROVIDES_LIBRIL := true
|
||||||
|
|
||||||
|
# SELinux
|
||||||
|
include device/qcom/sepolicy/sepolicy.mk
|
||||||
|
BOARD_SEPOLICY_DIRS += device/samsung/viennalte/sepolicy
|
||||||
|
|
||||||
|
BOARD_SEPOLICY_UNION += \
|
||||||
|
file_contexts \
|
||||||
|
file.te \
|
||||||
|
init.te \
|
||||||
|
keystore.te \
|
||||||
|
mediaserver.te \
|
||||||
|
mm-pp-daemon.te \
|
||||||
|
mm-qcamerad.te \
|
||||||
|
mpdecision.te \
|
||||||
|
rild.te \
|
||||||
|
rmt_storage.te \
|
||||||
|
system_app.te \
|
||||||
|
system_server.te \
|
||||||
|
tee.te \
|
||||||
|
thermal-engine.te \
|
||||||
|
time_daemon.te \
|
||||||
|
ueventd.te \
|
||||||
|
vold.te \
|
||||||
|
wcnss-service.te \
|
||||||
|
|
||||||
|
# WiFi
|
||||||
|
BOARD_HAVE_SAMSUNG_WIFI := true
|
||||||
|
BOARD_HOSTAPD_DRIVER := NL80211
|
||||||
|
BOARD_WPA_SUPPLICANT_DRIVER := NL80211
|
||||||
|
WPA_SUPPLICANT_VERSION := VER_0_8_X
|
||||||
|
WIFI_BAND := 802_11_ABG
|
||||||
|
BOARD_WLAN_DEVICE := bcmdhd
|
||||||
|
BOARD_HOSTAPD_PRIVATE_LIB := lib_driver_cmd_$(BOARD_WLAN_DEVICE)
|
||||||
|
BOARD_WPA_SUPPLICANT_PRIVATE_LIB := lib_driver_cmd_$(BOARD_WLAN_DEVICE)
|
||||||
|
WIFI_DRIVER_FW_PATH_AP := "/system/etc/wifi/bcmdhd_apsta.bin"
|
||||||
|
WIFI_DRIVER_FW_PATH_PARAM := "/sys/module/dhd/parameters/firmware_path"
|
||||||
|
WIFI_DRIVER_FW_PATH_STA := "/system/etc/wifi/bcmdhd_sta.bin"
|
3
README.md
Executable file
3
README.md
Executable file
@ -0,0 +1,3 @@
|
|||||||
|
Copyright 2014 - The CyanogenMod Project
|
||||||
|
|
||||||
|
Device configuration for Samsung Note Pro 12.2 (LTE)
|
280
audio/audio_effects.conf
Executable file
280
audio/audio_effects.conf
Executable file
@ -0,0 +1,280 @@
|
|||||||
|
# List of effect libraries to load. Each library element must contain a "path" element
|
||||||
|
# giving the full path of the library .so file.
|
||||||
|
# libraries {
|
||||||
|
# <lib name> {
|
||||||
|
# path <lib path>
|
||||||
|
# }
|
||||||
|
# }
|
||||||
|
libraries {
|
||||||
|
bundle {
|
||||||
|
path /system/lib/soundfx/libbundlewrapper.so
|
||||||
|
}
|
||||||
|
reverb {
|
||||||
|
path /system/lib/soundfx/libreverbwrapper.so
|
||||||
|
}
|
||||||
|
qcbassboost {
|
||||||
|
path /vendor/lib/soundfx/libqcbassboost.so
|
||||||
|
}
|
||||||
|
qcvirt {
|
||||||
|
path /vendor/lib/soundfx/libqcvirt.so
|
||||||
|
}
|
||||||
|
qcreverb {
|
||||||
|
path /vendor/lib/soundfx/libqcreverb.so
|
||||||
|
}
|
||||||
|
visualizer_sw {
|
||||||
|
path /system/lib/soundfx/libvisualizer.so
|
||||||
|
}
|
||||||
|
visualizer_hw {
|
||||||
|
path /system/lib/soundfx/libqcomvisualizer.so
|
||||||
|
}
|
||||||
|
downmix {
|
||||||
|
path /system/lib/soundfx/libdownmix.so
|
||||||
|
}
|
||||||
|
loudness_enhancer {
|
||||||
|
path /system/lib/soundfx/libldnhncr.so
|
||||||
|
}
|
||||||
|
proxy {
|
||||||
|
path /system/lib/soundfx/libeffectproxy.so
|
||||||
|
}
|
||||||
|
offload_bundle {
|
||||||
|
path /system/lib/soundfx/libqcompostprocbundle.so
|
||||||
|
}
|
||||||
|
audio_pre_processing {
|
||||||
|
path /system/lib/soundfx/libqcomvoiceprocessing.so
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Default pre-processing library. Add to audio_effect.conf "libraries" section if
|
||||||
|
# audio HAL implements support for default software audio pre-processing effects
|
||||||
|
#
|
||||||
|
# pre_processing {
|
||||||
|
# path /system/lib/soundfx/libaudiopreprocessing.so
|
||||||
|
# }
|
||||||
|
|
||||||
|
# list of effects to load. Each effect element must contain a "library" and a "uuid" element.
|
||||||
|
# The value of the "library" element must correspond to the name of one library element in the
|
||||||
|
# "libraries" element.
|
||||||
|
# The name of the effect element is indicative, only the value of the "uuid" element
|
||||||
|
# designates the effect.
|
||||||
|
# The uuid is the implementation specific UUID as specified by the effect vendor. This is not the
|
||||||
|
# generic effect type UUID.
|
||||||
|
# effects {
|
||||||
|
# <fx name> {
|
||||||
|
# library <lib name>
|
||||||
|
# uuid <effect uuid>
|
||||||
|
# }
|
||||||
|
# ...
|
||||||
|
# }
|
||||||
|
|
||||||
|
effects {
|
||||||
|
|
||||||
|
# additions for the proxy implementation
|
||||||
|
# Proxy implementation
|
||||||
|
#effectname {
|
||||||
|
#library proxy
|
||||||
|
#uuid xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
|
||||||
|
|
||||||
|
# SW implemetation of the effect. Added as a node under the proxy to
|
||||||
|
# indicate this as a sub effect.
|
||||||
|
#libsw {
|
||||||
|
#library libSW
|
||||||
|
#uuid yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy
|
||||||
|
#} End of SW effect
|
||||||
|
|
||||||
|
# HW implementation of the effect. Added as a node under the proxy to
|
||||||
|
# indicate this as a sub effect.
|
||||||
|
#libhw {
|
||||||
|
#library libHW
|
||||||
|
#uuid zzzzzzzz-zzzz-zzzz-zzzz-zzzzzzzzzzzz
|
||||||
|
#}End of HW effect
|
||||||
|
#} End of effect proxy
|
||||||
|
|
||||||
|
bassboost {
|
||||||
|
library proxy
|
||||||
|
uuid 14804144-a5ee-4d24-aa88-0002a5d5c51b
|
||||||
|
|
||||||
|
libsw {
|
||||||
|
library qcbassboost
|
||||||
|
uuid 23aca180-44bd-11e2-bcfd-0800200c9a66
|
||||||
|
}
|
||||||
|
|
||||||
|
libhw {
|
||||||
|
library offload_bundle
|
||||||
|
uuid 2c4a8c24-1581-487f-94f6-0002a5d5c51b
|
||||||
|
}
|
||||||
|
}
|
||||||
|
virtualizer {
|
||||||
|
library proxy
|
||||||
|
uuid d3467faa-acc7-4d34-acaf-0002a5d5c51b
|
||||||
|
|
||||||
|
libsw {
|
||||||
|
library qcvirt
|
||||||
|
uuid e6c98a16-22a3-11e2-b87b-f23c91aec05e
|
||||||
|
}
|
||||||
|
|
||||||
|
libhw {
|
||||||
|
library offload_bundle
|
||||||
|
uuid 509a4498-561a-4bea-b3b1-0002a5d5c51b
|
||||||
|
}
|
||||||
|
}
|
||||||
|
equalizer {
|
||||||
|
library proxy
|
||||||
|
uuid c8e70ecd-48ca-456e-8a4f-0002a5d5c51b
|
||||||
|
|
||||||
|
libsw {
|
||||||
|
library bundle
|
||||||
|
uuid ce772f20-847d-11df-bb17-0002a5d5c51b
|
||||||
|
}
|
||||||
|
|
||||||
|
libhw {
|
||||||
|
library offload_bundle
|
||||||
|
uuid a0dac280-401c-11e3-9379-0002a5d5c51b
|
||||||
|
}
|
||||||
|
}
|
||||||
|
volume {
|
||||||
|
library bundle
|
||||||
|
uuid 119341a0-8469-11df-81f9-0002a5d5c51b
|
||||||
|
}
|
||||||
|
reverb_env_aux {
|
||||||
|
library proxy
|
||||||
|
uuid 48404ac9-d202-4ccc-bf84-0002a5d5c51b
|
||||||
|
|
||||||
|
libsw {
|
||||||
|
library qcreverb
|
||||||
|
uuid a8c1e5f3-293d-43cd-95ec-d5e26c02e217
|
||||||
|
}
|
||||||
|
|
||||||
|
libhw {
|
||||||
|
library offload_bundle
|
||||||
|
uuid 79a18026-18fd-4185-8233-0002a5d5c51b
|
||||||
|
}
|
||||||
|
}
|
||||||
|
reverb_env_ins {
|
||||||
|
library proxy
|
||||||
|
uuid b707403a-a1c1-4291-9573-0002a5d5c51b
|
||||||
|
|
||||||
|
libsw {
|
||||||
|
library qcreverb
|
||||||
|
uuid 791fff8b-8129-4655-83a4-59bc61034c3a
|
||||||
|
}
|
||||||
|
|
||||||
|
libhw {
|
||||||
|
library offload_bundle
|
||||||
|
uuid eb64ea04-973b-43d2-8f5e-0002a5d5c51b
|
||||||
|
}
|
||||||
|
}
|
||||||
|
reverb_pre_aux {
|
||||||
|
library proxy
|
||||||
|
uuid 1b78f587-6d1c-422e-8b84-0002a5d5c51b
|
||||||
|
|
||||||
|
libsw {
|
||||||
|
library qcreverb
|
||||||
|
uuid 53ef1db5-c0c0-445b-b060-e34d20ebb70a
|
||||||
|
}
|
||||||
|
|
||||||
|
libhw {
|
||||||
|
library offload_bundle
|
||||||
|
uuid 6987be09-b142-4b41-9056-0002a5d5c51b
|
||||||
|
}
|
||||||
|
}
|
||||||
|
reverb_pre_ins {
|
||||||
|
library proxy
|
||||||
|
uuid f3e178d2-ebcb-408e-8357-0002a5d5c51b
|
||||||
|
|
||||||
|
libsw {
|
||||||
|
library qcreverb
|
||||||
|
uuid b08a0e38-22a5-11e2-b87b-f23c91aec05e
|
||||||
|
}
|
||||||
|
|
||||||
|
libhw {
|
||||||
|
library offload_bundle
|
||||||
|
uuid aa2bebf6-47cf-4613-9bca-0002a5d5c51b
|
||||||
|
}
|
||||||
|
}
|
||||||
|
visualizer {
|
||||||
|
library proxy
|
||||||
|
uuid 1d0a1a53-7d5d-48f2-8e71-27fbd10d842c
|
||||||
|
|
||||||
|
libsw {
|
||||||
|
library visualizer_sw
|
||||||
|
uuid d069d9e0-8329-11df-9168-0002a5d5c51b
|
||||||
|
}
|
||||||
|
|
||||||
|
libhw {
|
||||||
|
library visualizer_hw
|
||||||
|
uuid 7a8044a0-1a71-11e3-a184-0002a5d5c51b
|
||||||
|
}
|
||||||
|
}
|
||||||
|
downmix {
|
||||||
|
library downmix
|
||||||
|
uuid 93f04452-e4fe-41cc-91f9-e475b6d1d69f
|
||||||
|
}
|
||||||
|
loudness_enhancer {
|
||||||
|
library loudness_enhancer
|
||||||
|
uuid fa415329-2034-4bea-b5dc-5b381c8d1e2c
|
||||||
|
}
|
||||||
|
# aec {
|
||||||
|
# library audio_pre_processing
|
||||||
|
# uuid 0f8d0d2a-59e5-45fe-b6e4-248c8a799109
|
||||||
|
# }
|
||||||
|
# ns {
|
||||||
|
# library audio_pre_processing
|
||||||
|
# uuid 1d97bb0b-9e2f-4403-9ae3-58c2554306f8
|
||||||
|
# }
|
||||||
|
}
|
||||||
|
|
||||||
|
# Default pre-processing effects. Add to audio_effect.conf "effects" section if
|
||||||
|
# audio HAL implements support for them.
|
||||||
|
#
|
||||||
|
# agc {
|
||||||
|
# library pre_processing
|
||||||
|
# uuid aa8130e0-66fc-11e0-bad0-0002a5d5c51b
|
||||||
|
# }
|
||||||
|
# aec {
|
||||||
|
# library pre_processing
|
||||||
|
# uuid bb392ec0-8d4d-11e0-a896-0002a5d5c51b
|
||||||
|
# }
|
||||||
|
# ns {
|
||||||
|
# library pre_processing
|
||||||
|
# uuid c06c8400-8e06-11e0-9cb6-0002a5d5c51b
|
||||||
|
# }
|
||||||
|
|
||||||
|
# Audio preprocessor configurations.
|
||||||
|
# The pre processor configuration consists in a list of elements each describing
|
||||||
|
# pre processor settings for a given input source. Valid input source names are:
|
||||||
|
# "mic", "camcorder", "voice_recognition", "voice_communication"
|
||||||
|
# Each input source element contains a list of effects elements. The name of the effect
|
||||||
|
# element must be the name of one of the effects in the "effects" list of the file.
|
||||||
|
# Each effect element may optionally contain a list of parameters and their
|
||||||
|
# default value to apply when the pre processor effect is created.
|
||||||
|
# A parameter is defined by a "param" element and a "value" element. Each of these elements
|
||||||
|
# consists in one or more elements specifying a type followed by a value.
|
||||||
|
# The types defined are: "int", "short", "float", "bool" and "string"
|
||||||
|
# When both "param" and "value" are a single int, a simple form is allowed where just
|
||||||
|
# the param and value pair is present in the parameter description
|
||||||
|
# pre_processing {
|
||||||
|
# <input source name> {
|
||||||
|
# <fx name> {
|
||||||
|
# <param 1 name> {
|
||||||
|
# param {
|
||||||
|
# int|short|float|bool|string <value>
|
||||||
|
# [ int|short|float|bool|string <value> ]
|
||||||
|
# ...
|
||||||
|
# }
|
||||||
|
# value {
|
||||||
|
# int|short|float|bool|string <value>
|
||||||
|
# [ int|short|float|bool|string <value> ]
|
||||||
|
# ...
|
||||||
|
# }
|
||||||
|
# }
|
||||||
|
# <param 2 name > {<param> <value>}
|
||||||
|
# ...
|
||||||
|
# }
|
||||||
|
# ...
|
||||||
|
# }
|
||||||
|
# ...
|
||||||
|
# }
|
||||||
|
|
||||||
|
#
|
||||||
|
# TODO: add default audio pre processor configurations after debug and tuning phase
|
||||||
|
#
|
96
audio/audio_platform_info.xml
Executable file
96
audio/audio_platform_info.xml
Executable file
@ -0,0 +1,96 @@
|
|||||||
|
<?xml version="1.0" encoding="ISO-8859-1"?>
|
||||||
|
<!-- 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, -->
|
||||||
|
<!-- OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN -->
|
||||||
|
<!-- IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -->
|
||||||
|
<audio_platform_info>
|
||||||
|
<acdb_ids>
|
||||||
|
<!-- Output devices -->
|
||||||
|
<device name="SND_DEVICE_OUT_SPEAKER" acdb_id="15" />
|
||||||
|
<device name="SND_DEVICE_OUT_SPEAKER_REVERSE" acdb_id="15" />
|
||||||
|
<device name="SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES" acdb_id="15" />
|
||||||
|
<device name="SND_DEVICE_OUT_VOICE_SPEAKER" acdb_id="15" />
|
||||||
|
<device name="SND_DEVICE_OUT_BT_SCO" acdb_id="50" />
|
||||||
|
<device name="SND_DEVICE_OUT_BT_SCO_WB" acdb_id="50" />
|
||||||
|
<device name="SND_DEVICE_OUT_USB_HEADSET" acdb_id="98" />
|
||||||
|
|
||||||
|
<!-- Input devices -->
|
||||||
|
<device name="SND_DEVICE_IN_HANDSET_DMIC" acdb_id="4" />
|
||||||
|
<device name="SND_DEVICE_IN_SPEAKER_DMIC" acdb_id="11" />
|
||||||
|
<device name="SND_DEVICE_IN_BT_SCO_MIC" acdb_id="51" />
|
||||||
|
<device name="SND_DEVICE_IN_BT_SCO_MIC_WB" acdb_id="51" />
|
||||||
|
<device name="SND_DEVICE_IN_CAMCORDER_MIC" acdb_id="56" />
|
||||||
|
<device name="SND_DEVICE_IN_VOICE_DMIC" acdb_id="4" />
|
||||||
|
<device name="SND_DEVICE_IN_VOICE_SPEAKER_DMIC" acdb_id="11" />
|
||||||
|
<device name="SND_DEVICE_IN_VOICE_REC_MIC" acdb_id="53" />
|
||||||
|
</acdb_ids>
|
||||||
|
|
||||||
|
<backend_names>
|
||||||
|
<!-- empty -->
|
||||||
|
</backend_names>
|
||||||
|
|
||||||
|
<pcm_ids>
|
||||||
|
<!-- empty -->
|
||||||
|
</pcm_ids>
|
||||||
|
|
||||||
|
<device_names>
|
||||||
|
<!-- Output devices -->
|
||||||
|
<device name="SND_DEVICE_OUT_HANDSET" alias="voice-call-handset" />
|
||||||
|
<device name="SND_DEVICE_OUT_HEADPHONES" alias="headset" />
|
||||||
|
<device name="SND_DEVICE_OUT_VOICE_HANDSET" alias="voice-call-handset" />
|
||||||
|
<device name="SND_DEVICE_OUT_VOICE_SPEAKER" alias="voice-call-speaker" />
|
||||||
|
<device name="SND_DEVICE_OUT_VOICE_HEADPHONES" alias="voice-call-headset" />
|
||||||
|
<device name="SND_DEVICE_OUT_VOICE_TTY_FULL_HEADPHONES" alias="TTY-full" />
|
||||||
|
<device name="SND_DEVICE_OUT_VOICE_TTY_VCO_HEADPHONES" alias="TTY-headset" />
|
||||||
|
<device name="SND_DEVICE_OUT_VOICE_TTY_HCO_HANDSET" alias="TTY-handset" />
|
||||||
|
|
||||||
|
<!-- Input devices -->
|
||||||
|
<device name="SND_DEVICE_IN_HANDSET_MIC" alias="voice-call-main-mic" />
|
||||||
|
<device name="SND_DEVICE_IN_HANDSET_DMIC" alias="voice-call-main-mic" />
|
||||||
|
<device name="SND_DEVICE_IN_HANDSET_DMIC_NS" alias="voice-call-NS-mic-handset" />
|
||||||
|
<device name="SND_DEVICE_IN_HANDSET_DMIC_AEC" alias="voice-call-main-mic" />
|
||||||
|
<device name="SND_DEVICE_IN_HANDSET_DMIC_AEC_NS" alias="voice-call-main-mic" />
|
||||||
|
<device name="SND_DEVICE_IN_SPEAKER_MIC" alias="voice-call-sub-mic" />
|
||||||
|
<device name="SND_DEVICE_IN_SPEAKER_DMIC" alias="voice-call-sub-mic" />
|
||||||
|
<device name="SND_DEVICE_IN_SPEAKER_DMIC_NS" alias="voice-call-NS-mic-speaker" />
|
||||||
|
<device name="SND_DEVICE_IN_SPEAKER_DMIC_AEC" alias="voice-call-sub-mic" />
|
||||||
|
<device name="SND_DEVICE_IN_SPEAKER_DMIC_AEC_NS" alias="voice-call-sub-mic" />
|
||||||
|
<device name="SND_DEVICE_IN_HEADSET_MIC" alias="rec-headset-mic" />
|
||||||
|
<device name="SND_DEVICE_IN_HEADSET_MIC_FLUENCE" alias="rec-main-mic" />
|
||||||
|
<device name="SND_DEVICE_IN_VOICE_SPEAKER_MIC" alias="voice-call-sub-mic" />
|
||||||
|
<device name="SND_DEVICE_IN_VOICE_HEADSET_MIC" alias="voice-call-headset-mic" />
|
||||||
|
<device name="SND_DEVICE_IN_CAMCORDER_MIC" alias="rec-high-gain-stereo-mic" />
|
||||||
|
<device name="SND_DEVICE_IN_VOICE_DMIC" alias="voice-call-sub-mic" />
|
||||||
|
<device name="SND_DEVICE_IN_VOICE_SPEAKER_DMIC" alias="voice-call-main-mic" />
|
||||||
|
<device name="SND_DEVICE_IN_VOICE_TTY_FULL_HEADSET_MIC" alias="TTY-full-mic" />
|
||||||
|
<device name="SND_DEVICE_IN_VOICE_TTY_VCO_HANDSET_MIC" alias="TTY-vco-mic" />
|
||||||
|
<device name="SND_DEVICE_IN_VOICE_TTY_HCO_HEADSET_MIC" alias="TTY-headset-mic" />
|
||||||
|
<device name="SND_DEVICE_IN_VOICE_REC_MIC" alias="vr-main-mic" />
|
||||||
|
<device name="SND_DEVICE_IN_VOICE_REC_HEADSET_MIC" alias="vr-headset-mic" />
|
||||||
|
<device name="SND_DEVICE_IN_VOICE_REC_MIC_NS" alias="svoice-NS-mic" />
|
||||||
|
<device name="SND_DEVICE_IN_VOICE_REC_DMIC_STEREO" alias="vr-sub-mic" />
|
||||||
|
<device name="SND_DEVICE_IN_HANDSET_STEREO_DMIC" alias="rec-stereo-mic" />
|
||||||
|
<device name="SND_DEVICE_IN_SPEAKER_STEREO_DMIC" alias="rec-stereo-mic" />
|
||||||
|
</device_names>
|
||||||
|
</audio_platform_info>
|
134
audio/audio_policy.conf
Executable file
134
audio/audio_policy.conf
Executable file
@ -0,0 +1,134 @@
|
|||||||
|
# Global configuration section: lists input and output devices always present on the device
|
||||||
|
# as well as the output device selected by default.
|
||||||
|
# Devices are designated by a string that corresponds to the enum in audio.h
|
||||||
|
|
||||||
|
global_configuration {
|
||||||
|
attached_output_devices AUDIO_DEVICE_OUT_SPEAKER
|
||||||
|
default_output_device AUDIO_DEVICE_OUT_SPEAKER
|
||||||
|
attached_input_devices AUDIO_DEVICE_IN_BUILTIN_MIC|AUDIO_DEVICE_IN_REMOTE_SUBMIX|AUDIO_DEVICE_IN_VOICE_CALL
|
||||||
|
}
|
||||||
|
|
||||||
|
# audio hardware module section: contains descriptors for all audio hw modules present on the
|
||||||
|
# device. Each hw module node is named after the corresponding hw module library base name.
|
||||||
|
# For instance, "primary" corresponds to audio.primary.<device>.so.
|
||||||
|
# The "primary" module is mandatory and must include at least one output with
|
||||||
|
# AUDIO_OUTPUT_FLAG_PRIMARY flag.
|
||||||
|
# Each module descriptor contains one or more output profile descriptors and zero or more
|
||||||
|
# input profile descriptors. Each profile lists all the parameters supported by a given output
|
||||||
|
# or input stream category.
|
||||||
|
# The "channel_masks", "formats", "devices" and "flags" are specified using strings corresponding
|
||||||
|
# to enums in audio.h and audio_policy.h. They are concatenated by use of "|" without space or "\n".
|
||||||
|
|
||||||
|
audio_hw_modules {
|
||||||
|
primary {
|
||||||
|
outputs {
|
||||||
|
primary {
|
||||||
|
sampling_rates 44100|48000
|
||||||
|
channel_masks AUDIO_CHANNEL_OUT_STEREO
|
||||||
|
formats AUDIO_FORMAT_PCM_16_BIT
|
||||||
|
devices AUDIO_DEVICE_OUT_SPEAKER|AUDIO_DEVICE_OUT_WIRED_HEADSET|AUDIO_DEVICE_OUT_WIRED_HEADPHONE|AUDIO_DEVICE_OUT_ALL_SCO|AUDIO_DEVICE_OUT_EXTERNAL_WIFI|AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET
|
||||||
|
flags AUDIO_OUTPUT_FLAG_PRIMARY|AUDIO_OUTPUT_FLAG_DEEP_BUFFER
|
||||||
|
}
|
||||||
|
hdmi {
|
||||||
|
sampling_rates 48000
|
||||||
|
channel_masks dynamic
|
||||||
|
formats AUDIO_FORMAT_PCM_16_BIT
|
||||||
|
devices AUDIO_DEVICE_OUT_AUX_DIGITAL
|
||||||
|
flags AUDIO_OUTPUT_FLAG_MULTI_CH
|
||||||
|
}
|
||||||
|
compress_offload {
|
||||||
|
sampling_rates 11025|16000|22050|32000|44100|48000
|
||||||
|
channel_masks AUDIO_CHANNEL_OUT_MONO|AUDIO_CHANNEL_OUT_STEREO|AUDIO_CHANNEL_OUT_2POINT1|AUDIO_CHANNEL_OUT_QUAD|AUDIO_CHANNEL_OUT_PENTA|AUDIO_CHANNEL_OUT_5POINT1|AUDIO_CHANNEL_OUT_6POINT1|AUDIO_CHANNEL_OUT_7POINT1
|
||||||
|
formats AUDIO_FORMAT_MP3|AUDIO_FORMAT_AAC_LC|AUDIO_FORMAT_AAC_HE_V1|AUDIO_FORMAT_AAC_HE_V2|AUDIO_FORMAT_AC3|AUDIO_FORMAT_E_AC3
|
||||||
|
devices AUDIO_DEVICE_OUT_SPEAKER|AUDIO_DEVICE_OUT_WIRED_HEADSET|AUDIO_DEVICE_OUT_WIRED_HEADPHONE|AUDIO_DEVICE_OUT_ALL_SCO|AUDIO_DEVICE_OUT_EXTERNAL_WIFI|AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET
|
||||||
|
flags AUDIO_OUTPUT_FLAG_DIRECT|AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD|AUDIO_OUTPUT_FLAG_NON_BLOCKING
|
||||||
|
}
|
||||||
|
}
|
||||||
|
inputs {
|
||||||
|
primary {
|
||||||
|
sampling_rates 8000|11025|12000|16000|22050|24000|32000|44100|48000
|
||||||
|
channel_masks AUDIO_CHANNEL_IN_MONO|AUDIO_CHANNEL_IN_STEREO|AUDIO_CHANNEL_IN_FRONT_BACK|AUDIO_CHANNEL_IN_VOICE_UPLINK|AUDIO_CHANNEL_IN_VOICE_DNLINK
|
||||||
|
formats AUDIO_FORMAT_PCM_16_BIT
|
||||||
|
devices AUDIO_DEVICE_IN_BUILTIN_MIC|AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET|AUDIO_DEVICE_IN_WIRED_HEADSET|AUDIO_DEVICE_IN_WIRED_HEADPHONE|AUDIO_DEVICE_IN_AUX_DIGITAL|AUDIO_DEVICE_IN_VOICE_CALL
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
a2dp {
|
||||||
|
outputs {
|
||||||
|
a2dp {
|
||||||
|
sampling_rates 44100
|
||||||
|
channel_masks AUDIO_CHANNEL_OUT_STEREO
|
||||||
|
formats AUDIO_FORMAT_PCM_16_BIT
|
||||||
|
devices AUDIO_DEVICE_OUT_ALL_A2DP
|
||||||
|
}
|
||||||
|
}
|
||||||
|
inputs {
|
||||||
|
a2dp {
|
||||||
|
sampling_rates 44100|48000
|
||||||
|
channel_masks AUDIO_CHANNEL_IN_MONO|AUDIO_CHANNEL_IN_STEREO
|
||||||
|
formats AUDIO_FORMAT_PCM_16_BIT
|
||||||
|
devices AUDIO_DEVICE_IN_BLUETOOTH_A2DP
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
usb {
|
||||||
|
outputs {
|
||||||
|
usb_accessory {
|
||||||
|
sampling_rates 44100
|
||||||
|
channel_masks AUDIO_CHANNEL_OUT_STEREO
|
||||||
|
formats AUDIO_FORMAT_PCM_16_BIT
|
||||||
|
devices AUDIO_DEVICE_OUT_USB_ACCESSORY
|
||||||
|
}
|
||||||
|
usb_device {
|
||||||
|
sampling_rates 44100|48000
|
||||||
|
channel_masks dynamic
|
||||||
|
formats AUDIO_FORMAT_PCM_16_BIT
|
||||||
|
devices AUDIO_DEVICE_OUT_USB_DEVICE|AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET
|
||||||
|
}
|
||||||
|
}
|
||||||
|
inputs {
|
||||||
|
usb_device {
|
||||||
|
sampling_rates dynamic
|
||||||
|
channel_masks AUDIO_CHANNEL_IN_STEREO
|
||||||
|
formats AUDIO_FORMAT_PCM_16_BIT
|
||||||
|
devices AUDIO_DEVICE_IN_USB_DEVICE
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
tms {
|
||||||
|
outputs {
|
||||||
|
tms {
|
||||||
|
sampling_rates 44100
|
||||||
|
channel_masks AUDIO_CHANNEL_OUT_STEREO
|
||||||
|
formats AUDIO_FORMAT_PCM_16_BIT
|
||||||
|
devices AUDIO_DEVICE_OUT_EXTERNAL_TMS
|
||||||
|
}
|
||||||
|
}
|
||||||
|
inputs {
|
||||||
|
tms {
|
||||||
|
sampling_rates 44100
|
||||||
|
channel_masks AUDIO_CHANNEL_IN_MONO|AUDIO_CHANNEL_IN_STEREO
|
||||||
|
formats AUDIO_FORMAT_PCM_16_BIT
|
||||||
|
devices AUDIO_DEVICE_IN_EXTERNAL_TMS
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
r_submix {
|
||||||
|
outputs {
|
||||||
|
submix {
|
||||||
|
sampling_rates 48000
|
||||||
|
channel_masks AUDIO_CHANNEL_OUT_STEREO
|
||||||
|
formats AUDIO_FORMAT_PCM_16_BIT
|
||||||
|
devices AUDIO_DEVICE_OUT_REMOTE_SUBMIX
|
||||||
|
}
|
||||||
|
}
|
||||||
|
inputs {
|
||||||
|
submix {
|
||||||
|
sampling_rates 48000
|
||||||
|
channel_masks AUDIO_CHANNEL_IN_STEREO
|
||||||
|
formats AUDIO_FORMAT_PCM_16_BIT
|
||||||
|
devices AUDIO_DEVICE_IN_REMOTE_SUBMIX
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
1108
audio/mixer_paths.xml
Executable file
1108
audio/mixer_paths.xml
Executable file
File diff suppressed because it is too large
Load Diff
23
bluetooth/bdroid_buildcfg.h
Executable file
23
bluetooth/bdroid_buildcfg.h
Executable file
@ -0,0 +1,23 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2012 The Android Open Source Project
|
||||||
|
* Copyright (C) 2012 The CyanogenMod Project <http://www.cyanogenmod.org>
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _BDROID_BUILDCFG_H
|
||||||
|
#define _BDROID_BUILDCFG_H
|
||||||
|
|
||||||
|
#define BTM_DEF_LOCAL_NAME "Samsung Galaxy Note Pro 12.2"
|
||||||
|
|
||||||
|
#endif
|
13
bluetooth/vnd_viennalte.txt
Executable file
13
bluetooth/vnd_viennalte.txt
Executable file
@ -0,0 +1,13 @@
|
|||||||
|
BLUETOOTH_UART_DEVICE_PORT = "/dev/ttyHS0"
|
||||||
|
FW_PATCHFILE_LOCATION = "/vendor/firmware"
|
||||||
|
BT_WAKE_VIA_PROC = TRUE
|
||||||
|
LPM_IDLE_TIMEOUT_MULTIPLE = 5
|
||||||
|
BTVND_DBG = FALSE
|
||||||
|
BTHW_DBG = TRUE
|
||||||
|
VNDUSERIAL_DBG = FALSE
|
||||||
|
UPIO_DBG = FALSE
|
||||||
|
UART_TARGET_BAUD_RATE = 3000000
|
||||||
|
FW_PATCH_SETTLEMENT_DELAY_MS = 100
|
||||||
|
USE_AXI_BRIDGE_LOCK = TRUE
|
||||||
|
UART_FORCE_TWO_STOPBITS = TRUE
|
||||||
|
LPM_COMBINE_SLEEP_MODE_AND_LPM = 0
|
21
camera/Android.mk
Executable file
21
camera/Android.mk
Executable file
@ -0,0 +1,21 @@
|
|||||||
|
ifeq ($(TARGET_PROVIDES_CAMERA_HAL),true)
|
||||||
|
|
||||||
|
LOCAL_PATH := $(call my-dir)
|
||||||
|
include $(CLEAR_VARS)
|
||||||
|
|
||||||
|
LOCAL_SRC_FILES := \
|
||||||
|
CameraWrapper.cpp
|
||||||
|
|
||||||
|
LOCAL_SHARED_LIBRARIES := \
|
||||||
|
libhardware liblog libcamera_client libutils
|
||||||
|
|
||||||
|
LOCAL_C_INCLUDES := \
|
||||||
|
system/media/camera/include
|
||||||
|
|
||||||
|
LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/hw
|
||||||
|
LOCAL_MODULE := camera.$(TARGET_BOARD_PLATFORM)
|
||||||
|
LOCAL_MODULE_TAGS := optional
|
||||||
|
|
||||||
|
include $(BUILD_SHARED_LIBRARY)
|
||||||
|
|
||||||
|
endif
|
618
camera/CameraWrapper.cpp
Executable file
618
camera/CameraWrapper.cpp
Executable file
@ -0,0 +1,618 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2012, The CyanogenMod Project
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file CameraWrapper.cpp
|
||||||
|
*
|
||||||
|
* This file wraps a vendor camera module.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
// #define LOG_NDEBUG 0
|
||||||
|
#define LOG_PARAMETERS
|
||||||
|
|
||||||
|
#define LOG_TAG "CameraWrapper"
|
||||||
|
#include <cutils/log.h>
|
||||||
|
|
||||||
|
#include <utils/threads.h>
|
||||||
|
#include <utils/String8.h>
|
||||||
|
#include <hardware/hardware.h>
|
||||||
|
#include <hardware/camera.h>
|
||||||
|
#include <camera/Camera.h>
|
||||||
|
#include <camera/CameraParameters.h>
|
||||||
|
|
||||||
|
static android::Mutex gCameraWrapperLock;
|
||||||
|
static camera_module_t *gVendorModule = 0;
|
||||||
|
|
||||||
|
static char **fixed_set_params = NULL;
|
||||||
|
|
||||||
|
static int camera_device_open(const hw_module_t* module, const char* name,
|
||||||
|
hw_device_t** device);
|
||||||
|
static int camera_device_close(hw_device_t* device);
|
||||||
|
static int camera_get_number_of_cameras(void);
|
||||||
|
static int camera_get_camera_info(int camera_id, struct camera_info *info);
|
||||||
|
static int camera_send_command(struct camera_device * device, int32_t cmd,
|
||||||
|
int32_t arg1, int32_t arg2);
|
||||||
|
|
||||||
|
static struct hw_module_methods_t camera_module_methods = {
|
||||||
|
.open = camera_device_open
|
||||||
|
};
|
||||||
|
|
||||||
|
camera_module_t HAL_MODULE_INFO_SYM = {
|
||||||
|
.common = {
|
||||||
|
tag: HARDWARE_MODULE_TAG,
|
||||||
|
.module_api_version = CAMERA_MODULE_API_VERSION_1_0,
|
||||||
|
.hal_api_version = HARDWARE_HAL_API_VERSION,
|
||||||
|
.id = CAMERA_HARDWARE_MODULE_ID,
|
||||||
|
.name = "MSM8974 Camera Wrapper",
|
||||||
|
.author = "The CyanogenMod Project",
|
||||||
|
.methods = &camera_module_methods,
|
||||||
|
.dso = NULL, /* remove compilation warnings */
|
||||||
|
.reserved = {0}, /* remove compilation warnings */
|
||||||
|
},
|
||||||
|
.get_number_of_cameras = camera_get_number_of_cameras,
|
||||||
|
.get_camera_info = camera_get_camera_info,
|
||||||
|
.set_callbacks = NULL, /* remove compilation warnings */
|
||||||
|
.get_vendor_tag_ops = NULL, /* remove compilation warnings */
|
||||||
|
.open_legacy = NULL, /* remove compilation warnings */
|
||||||
|
.reserved = {0}, /* remove compilation warnings */
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct wrapper_camera_device {
|
||||||
|
camera_device_t base;
|
||||||
|
int id;
|
||||||
|
camera_device_t *vendor;
|
||||||
|
} wrapper_camera_device_t;
|
||||||
|
|
||||||
|
#define VENDOR_CALL(device, func, ...) ({ \
|
||||||
|
wrapper_camera_device_t *__wrapper_dev = (wrapper_camera_device_t*) device; \
|
||||||
|
__wrapper_dev->vendor->ops->func(__wrapper_dev->vendor, ##__VA_ARGS__); \
|
||||||
|
})
|
||||||
|
|
||||||
|
#define CAMERA_ID(device) (((wrapper_camera_device_t *)(device))->id)
|
||||||
|
|
||||||
|
static int check_vendor_module()
|
||||||
|
{
|
||||||
|
int rv = 0;
|
||||||
|
ALOGI("%s", __FUNCTION__);
|
||||||
|
|
||||||
|
if(gVendorModule)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
rv = hw_get_module_by_class("camera", "vendor",
|
||||||
|
(const hw_module_t **)&gVendorModule);
|
||||||
|
|
||||||
|
if (rv)
|
||||||
|
ALOGE("failed to open vendor camera module");
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define KEY_VIDEO_HFR_VALUES "video-hfr-values"
|
||||||
|
|
||||||
|
static char *camera_fixup_getparams(int __attribute__((unused)) id,
|
||||||
|
const char *settings)
|
||||||
|
{
|
||||||
|
android::CameraParameters params;
|
||||||
|
params.unflatten(android::String8(settings));
|
||||||
|
|
||||||
|
#ifdef LOG_PARAMETERS
|
||||||
|
ALOGV("%s: original parameters:", __FUNCTION__);
|
||||||
|
params.dump();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* If the vendor has HFR values but doesn't also expose that
|
||||||
|
* this can be turned off, fixup the params to tell the Camera
|
||||||
|
* that it really is okay to turn it off.
|
||||||
|
*/
|
||||||
|
|
||||||
|
const char* hfrValues = params.get(KEY_VIDEO_HFR_VALUES);
|
||||||
|
if (hfrValues && *hfrValues && ! strstr(hfrValues, "off")) {
|
||||||
|
char tmp[strlen(hfrValues) + 4 + 1];
|
||||||
|
sprintf(tmp, "%s,off", hfrValues);
|
||||||
|
params.set(KEY_VIDEO_HFR_VALUES, tmp);
|
||||||
|
}
|
||||||
|
|
||||||
|
android::String8 strParams = params.flatten();
|
||||||
|
char *ret = strdup(strParams.string());
|
||||||
|
|
||||||
|
#ifdef LOG_PARAMETERS
|
||||||
|
ALOGV("%s: fixed parameters:", __FUNCTION__);
|
||||||
|
params.dump();
|
||||||
|
#endif
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
char * camera_fixup_setparams(struct camera_device * device, const char * settings)
|
||||||
|
{
|
||||||
|
int id = CAMERA_ID(device);
|
||||||
|
android::CameraParameters params;
|
||||||
|
params.unflatten(android::String8(settings));
|
||||||
|
|
||||||
|
#ifdef LOG_PARAMETERS
|
||||||
|
ALOGV("%s: original parameters:", __FUNCTION__);
|
||||||
|
params.dump();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
const char* recordingHint = params.get(android::CameraParameters::KEY_RECORDING_HINT);
|
||||||
|
bool isVideo = recordingHint && !strcmp(recordingHint, "true");
|
||||||
|
|
||||||
|
if (isVideo) {
|
||||||
|
params.set(android::CameraParameters::KEY_DIS, android::CameraParameters::DIS_DISABLE);
|
||||||
|
params.set(android::CameraParameters::KEY_ZSL, android::CameraParameters::ZSL_OFF);
|
||||||
|
} else {
|
||||||
|
params.set(android::CameraParameters::KEY_ZSL, android::CameraParameters::ZSL_ON);
|
||||||
|
}
|
||||||
|
|
||||||
|
android::String8 strParams = params.flatten();
|
||||||
|
|
||||||
|
if (fixed_set_params[id])
|
||||||
|
free(fixed_set_params[id]);
|
||||||
|
fixed_set_params[id] = strdup(strParams.string());
|
||||||
|
char *ret = fixed_set_params[id];
|
||||||
|
|
||||||
|
#ifdef LOG_PARAMETERS
|
||||||
|
ALOGV("%s: fixed parameters:", __FUNCTION__);
|
||||||
|
params.dump();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*******************************************************************
|
||||||
|
* implementation of camera_device_ops functions
|
||||||
|
*******************************************************************/
|
||||||
|
|
||||||
|
int camera_set_preview_window(struct camera_device * device,
|
||||||
|
struct preview_stream_ops *window)
|
||||||
|
{
|
||||||
|
ALOGI("%s->%08X->%08X", __FUNCTION__, (uintptr_t)device, (uintptr_t)(((wrapper_camera_device_t*)device)->vendor));
|
||||||
|
|
||||||
|
if(!device)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
return VENDOR_CALL(device, set_preview_window, window);
|
||||||
|
}
|
||||||
|
|
||||||
|
void camera_set_callbacks(struct camera_device * device,
|
||||||
|
camera_notify_callback notify_cb,
|
||||||
|
camera_data_callback data_cb,
|
||||||
|
camera_data_timestamp_callback data_cb_timestamp,
|
||||||
|
camera_request_memory get_memory,
|
||||||
|
void *user)
|
||||||
|
{
|
||||||
|
ALOGI("%s->%08X->%08X", __FUNCTION__, (uintptr_t)device, (uintptr_t)(((wrapper_camera_device_t*)device)->vendor));
|
||||||
|
ALOGI("%s", __FUNCTION__);
|
||||||
|
|
||||||
|
if(!device)
|
||||||
|
return;
|
||||||
|
|
||||||
|
VENDOR_CALL(device, set_callbacks, notify_cb, data_cb, data_cb_timestamp, get_memory, user);
|
||||||
|
}
|
||||||
|
|
||||||
|
void camera_enable_msg_type(struct camera_device * device, int32_t msg_type)
|
||||||
|
{
|
||||||
|
ALOGI("%s->%08X->%08X", __FUNCTION__, (uintptr_t)device, (uintptr_t)(((wrapper_camera_device_t*)device)->vendor));
|
||||||
|
ALOGI("%s", __FUNCTION__);
|
||||||
|
|
||||||
|
if(!device)
|
||||||
|
return;
|
||||||
|
|
||||||
|
VENDOR_CALL(device, enable_msg_type, msg_type);
|
||||||
|
}
|
||||||
|
|
||||||
|
void camera_disable_msg_type(struct camera_device * device, int32_t msg_type)
|
||||||
|
{
|
||||||
|
ALOGI("%s->%08X->%08X", __FUNCTION__, (uintptr_t)device, (uintptr_t)(((wrapper_camera_device_t*)device)->vendor));
|
||||||
|
ALOGI("%s", __FUNCTION__);
|
||||||
|
|
||||||
|
if(!device)
|
||||||
|
return;
|
||||||
|
|
||||||
|
VENDOR_CALL(device, disable_msg_type, msg_type);
|
||||||
|
}
|
||||||
|
|
||||||
|
int camera_msg_type_enabled(struct camera_device * device, int32_t msg_type)
|
||||||
|
{
|
||||||
|
ALOGI("%s", __FUNCTION__);
|
||||||
|
ALOGI("%s->%08X->%08X", __FUNCTION__, (uintptr_t)device, (uintptr_t)(((wrapper_camera_device_t*)device)->vendor));
|
||||||
|
|
||||||
|
if(!device)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
return VENDOR_CALL(device, msg_type_enabled, msg_type);
|
||||||
|
}
|
||||||
|
|
||||||
|
int camera_start_preview(struct camera_device * device)
|
||||||
|
{
|
||||||
|
ALOGI("%s", __FUNCTION__);
|
||||||
|
ALOGI("%s->%08X->%08X", __FUNCTION__, (uintptr_t)device, (uintptr_t)(((wrapper_camera_device_t*)device)->vendor));
|
||||||
|
|
||||||
|
if(!device)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
return VENDOR_CALL(device, start_preview);
|
||||||
|
}
|
||||||
|
|
||||||
|
void camera_stop_preview(struct camera_device * device)
|
||||||
|
{
|
||||||
|
ALOGI("%s", __FUNCTION__);
|
||||||
|
ALOGI("%s->%08X->%08X", __FUNCTION__, (uintptr_t)device, (uintptr_t)(((wrapper_camera_device_t*)device)->vendor));
|
||||||
|
|
||||||
|
if(!device)
|
||||||
|
return;
|
||||||
|
|
||||||
|
VENDOR_CALL(device, stop_preview);
|
||||||
|
}
|
||||||
|
|
||||||
|
int camera_preview_enabled(struct camera_device * device)
|
||||||
|
{
|
||||||
|
ALOGI("%s", __FUNCTION__);
|
||||||
|
ALOGI("%s->%08X->%08X", __FUNCTION__, (uintptr_t)device, (uintptr_t)(((wrapper_camera_device_t*)device)->vendor));
|
||||||
|
|
||||||
|
if(!device)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
return VENDOR_CALL(device, preview_enabled);
|
||||||
|
}
|
||||||
|
|
||||||
|
int camera_store_meta_data_in_buffers(struct camera_device * device, int enable)
|
||||||
|
{
|
||||||
|
ALOGI("%s", __FUNCTION__);
|
||||||
|
ALOGI("%s->%08X->%08X", __FUNCTION__, (uintptr_t)device, (uintptr_t)(((wrapper_camera_device_t*)device)->vendor));
|
||||||
|
|
||||||
|
if(!device)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
return VENDOR_CALL(device, store_meta_data_in_buffers, enable);
|
||||||
|
}
|
||||||
|
|
||||||
|
int camera_start_recording(struct camera_device * device)
|
||||||
|
{
|
||||||
|
ALOGI("%s", __FUNCTION__);
|
||||||
|
ALOGI("%s->%08X->%08X", __FUNCTION__, (uintptr_t)device, (uintptr_t)(((wrapper_camera_device_t*)device)->vendor));
|
||||||
|
|
||||||
|
if(!device)
|
||||||
|
return EINVAL;
|
||||||
|
|
||||||
|
return VENDOR_CALL(device, start_recording);
|
||||||
|
}
|
||||||
|
|
||||||
|
void camera_stop_recording(struct camera_device * device)
|
||||||
|
{
|
||||||
|
ALOGI("%s", __FUNCTION__);
|
||||||
|
ALOGI("%s->%08X->%08X", __FUNCTION__, (uintptr_t)device, (uintptr_t)(((wrapper_camera_device_t*)device)->vendor));
|
||||||
|
|
||||||
|
if(!device)
|
||||||
|
return;
|
||||||
|
|
||||||
|
|
||||||
|
VENDOR_CALL(device, stop_recording);
|
||||||
|
}
|
||||||
|
|
||||||
|
int camera_recording_enabled(struct camera_device * device)
|
||||||
|
{
|
||||||
|
ALOGI("%s", __FUNCTION__);
|
||||||
|
ALOGI("%s->%08X->%08X", __FUNCTION__, (uintptr_t)device, (uintptr_t)(((wrapper_camera_device_t*)device)->vendor));
|
||||||
|
|
||||||
|
if(!device)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
return VENDOR_CALL(device, recording_enabled);
|
||||||
|
}
|
||||||
|
|
||||||
|
void camera_release_recording_frame(struct camera_device * device,
|
||||||
|
const void *opaque)
|
||||||
|
{
|
||||||
|
ALOGI("%s", __FUNCTION__);
|
||||||
|
ALOGI("%s->%08X->%08X", __FUNCTION__, (uintptr_t)device, (uintptr_t)(((wrapper_camera_device_t*)device)->vendor));
|
||||||
|
|
||||||
|
if(!device)
|
||||||
|
return;
|
||||||
|
|
||||||
|
VENDOR_CALL(device, release_recording_frame, opaque);
|
||||||
|
}
|
||||||
|
|
||||||
|
int camera_auto_focus(struct camera_device * device)
|
||||||
|
{
|
||||||
|
ALOGI("%s", __FUNCTION__);
|
||||||
|
ALOGI("%s->%08X->%08X", __FUNCTION__, (uintptr_t)device, (uintptr_t)(((wrapper_camera_device_t*)device)->vendor));
|
||||||
|
|
||||||
|
if(!device)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
|
||||||
|
return VENDOR_CALL(device, auto_focus);
|
||||||
|
}
|
||||||
|
|
||||||
|
int camera_cancel_auto_focus(struct camera_device * device)
|
||||||
|
{
|
||||||
|
ALOGI("%s", __FUNCTION__);
|
||||||
|
ALOGI("%s->%08X->%08X", __FUNCTION__, (uintptr_t)device, (uintptr_t)(((wrapper_camera_device_t*)device)->vendor));
|
||||||
|
|
||||||
|
if(!device)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
return VENDOR_CALL(device, cancel_auto_focus);
|
||||||
|
}
|
||||||
|
|
||||||
|
int camera_take_picture(struct camera_device * device)
|
||||||
|
{
|
||||||
|
ALOGI("%s", __FUNCTION__);
|
||||||
|
ALOGI("%s->%08X->%08X", __FUNCTION__, (uintptr_t)device, (uintptr_t)(((wrapper_camera_device_t*)device)->vendor));
|
||||||
|
|
||||||
|
if(!device)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
return VENDOR_CALL(device, take_picture);
|
||||||
|
}
|
||||||
|
|
||||||
|
int camera_cancel_picture(struct camera_device * device)
|
||||||
|
{
|
||||||
|
ALOGI("%s", __FUNCTION__);
|
||||||
|
ALOGI("%s->%08X->%08X", __FUNCTION__, (uintptr_t)device, (uintptr_t)(((wrapper_camera_device_t*)device)->vendor));
|
||||||
|
|
||||||
|
if(!device)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
return VENDOR_CALL(device, cancel_picture);
|
||||||
|
}
|
||||||
|
|
||||||
|
int camera_set_parameters(struct camera_device * device, const char *params)
|
||||||
|
{
|
||||||
|
ALOGI("%s", __FUNCTION__);
|
||||||
|
ALOGI("%s->%08X->%08X", __FUNCTION__, (uintptr_t)device, (uintptr_t)(((wrapper_camera_device_t*)device)->vendor));
|
||||||
|
|
||||||
|
if(!device)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
char *tmp = NULL;
|
||||||
|
tmp = camera_fixup_setparams(device, params);
|
||||||
|
|
||||||
|
int ret = VENDOR_CALL(device, set_parameters, tmp);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
char* camera_get_parameters(struct camera_device * device)
|
||||||
|
{
|
||||||
|
ALOGI("%s", __FUNCTION__);
|
||||||
|
ALOGI("%s->%08X->%08X", __FUNCTION__, (uintptr_t)device, (uintptr_t)(((wrapper_camera_device_t*)device)->vendor));
|
||||||
|
|
||||||
|
if(!device)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
char* params = VENDOR_CALL(device, get_parameters);
|
||||||
|
|
||||||
|
char * tmp = camera_fixup_getparams(CAMERA_ID(device), params);
|
||||||
|
VENDOR_CALL(device, put_parameters, params);
|
||||||
|
params = tmp;
|
||||||
|
|
||||||
|
return params;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void camera_put_parameters(struct camera_device *device, char *params)
|
||||||
|
{
|
||||||
|
ALOGI("%s", __FUNCTION__);
|
||||||
|
ALOGI("%s->%08X->%08X", __FUNCTION__, (uintptr_t)device, (uintptr_t)(((wrapper_camera_device_t*)device)->vendor));
|
||||||
|
|
||||||
|
if(params)
|
||||||
|
free(params);
|
||||||
|
}
|
||||||
|
|
||||||
|
int camera_send_command(struct camera_device * device,
|
||||||
|
int32_t cmd, int32_t arg1, int32_t arg2)
|
||||||
|
{
|
||||||
|
ALOGI("%s", __FUNCTION__);
|
||||||
|
ALOGI("%s->%08X->%08X", __FUNCTION__, (uintptr_t)device, (uintptr_t)(((wrapper_camera_device_t*)device)->vendor));
|
||||||
|
|
||||||
|
if(!device)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
return VENDOR_CALL(device, send_command, cmd, arg1, arg2);
|
||||||
|
}
|
||||||
|
|
||||||
|
void camera_release(struct camera_device * device)
|
||||||
|
{
|
||||||
|
ALOGI("%s", __FUNCTION__);
|
||||||
|
ALOGI("%s->%08X->%08X", __FUNCTION__, (uintptr_t)device, (uintptr_t)(((wrapper_camera_device_t*)device)->vendor));
|
||||||
|
|
||||||
|
if(!device)
|
||||||
|
return;
|
||||||
|
|
||||||
|
VENDOR_CALL(device, release);
|
||||||
|
}
|
||||||
|
|
||||||
|
int camera_dump(struct camera_device * device, int fd)
|
||||||
|
{
|
||||||
|
if(!device)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
return VENDOR_CALL(device, dump, fd);
|
||||||
|
}
|
||||||
|
|
||||||
|
extern "C" void heaptracker_free_leaked_memory(void);
|
||||||
|
|
||||||
|
int camera_device_close(hw_device_t* device)
|
||||||
|
{
|
||||||
|
int ret = 0;
|
||||||
|
wrapper_camera_device_t *wrapper_dev = NULL;
|
||||||
|
|
||||||
|
ALOGI("%s", __FUNCTION__);
|
||||||
|
|
||||||
|
android::Mutex::Autolock lock(gCameraWrapperLock);
|
||||||
|
|
||||||
|
if (!device) {
|
||||||
|
ret = -EINVAL;
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < camera_get_number_of_cameras(); i++) {
|
||||||
|
if (fixed_set_params[i])
|
||||||
|
free(fixed_set_params[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
wrapper_dev = (wrapper_camera_device_t*) device;
|
||||||
|
|
||||||
|
wrapper_dev->vendor->common.close((hw_device_t*)wrapper_dev->vendor);
|
||||||
|
if (wrapper_dev->base.ops)
|
||||||
|
free(wrapper_dev->base.ops);
|
||||||
|
free(wrapper_dev);
|
||||||
|
done:
|
||||||
|
#ifdef HEAPTRACKER
|
||||||
|
heaptracker_free_leaked_memory();
|
||||||
|
#endif
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*******************************************************************
|
||||||
|
* implementation of camera_module functions
|
||||||
|
*******************************************************************/
|
||||||
|
|
||||||
|
/* open device handle to one of the cameras
|
||||||
|
*
|
||||||
|
* assume camera service will keep singleton of each camera
|
||||||
|
* so this function will always only be called once per camera instance
|
||||||
|
*/
|
||||||
|
|
||||||
|
int camera_device_open(const hw_module_t* module, const char* name,
|
||||||
|
hw_device_t** device)
|
||||||
|
{
|
||||||
|
int rv = 0;
|
||||||
|
int num_cameras = 0;
|
||||||
|
int cameraid;
|
||||||
|
wrapper_camera_device_t* camera_device = NULL;
|
||||||
|
camera_device_ops_t* camera_ops = NULL;
|
||||||
|
|
||||||
|
android::Mutex::Autolock lock(gCameraWrapperLock);
|
||||||
|
|
||||||
|
ALOGI("camera_device open");
|
||||||
|
|
||||||
|
if (name != NULL) {
|
||||||
|
if (check_vendor_module())
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
cameraid = atoi(name);
|
||||||
|
num_cameras = gVendorModule->get_number_of_cameras();
|
||||||
|
|
||||||
|
fixed_set_params = (char **) malloc(sizeof(char *) * num_cameras);
|
||||||
|
if (!fixed_set_params) {
|
||||||
|
ALOGE("parameter memory allocation fail");
|
||||||
|
rv = -ENOMEM;
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
memset(fixed_set_params, 0, sizeof(char *) * num_cameras);
|
||||||
|
|
||||||
|
if(cameraid > num_cameras)
|
||||||
|
{
|
||||||
|
ALOGE("camera service provided cameraid out of bounds, "
|
||||||
|
"cameraid = %d, num supported = %d",
|
||||||
|
cameraid, num_cameras);
|
||||||
|
rv = -EINVAL;
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
|
||||||
|
camera_device = (wrapper_camera_device_t*)malloc(sizeof(*camera_device));
|
||||||
|
if(!camera_device)
|
||||||
|
{
|
||||||
|
ALOGE("camera_device allocation fail");
|
||||||
|
rv = -ENOMEM;
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
memset(camera_device, 0, sizeof(*camera_device));
|
||||||
|
camera_device->id = cameraid;
|
||||||
|
|
||||||
|
rv = gVendorModule->common.methods->open(
|
||||||
|
(const hw_module_t*)gVendorModule, name,
|
||||||
|
(hw_device_t**)&(camera_device->vendor));
|
||||||
|
if (rv) {
|
||||||
|
ALOGE("vendor camera open fail");
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
ALOGI("%s: got vendor camera device 0x%08X",
|
||||||
|
__FUNCTION__, (uintptr_t)(camera_device->vendor));
|
||||||
|
|
||||||
|
camera_ops = (camera_device_ops_t*)malloc(sizeof(*camera_ops));
|
||||||
|
if(!camera_ops)
|
||||||
|
{
|
||||||
|
ALOGE("camera_ops allocation fail");
|
||||||
|
rv = -ENOMEM;
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
|
||||||
|
memset(camera_ops, 0, sizeof(*camera_ops));
|
||||||
|
|
||||||
|
camera_device->base.common.tag = HARDWARE_DEVICE_TAG;
|
||||||
|
camera_device->base.common.version = CAMERA_DEVICE_API_VERSION_1_0;
|
||||||
|
camera_device->base.common.module = (hw_module_t *)(module);
|
||||||
|
camera_device->base.common.close = camera_device_close;
|
||||||
|
camera_device->base.ops = camera_ops;
|
||||||
|
|
||||||
|
camera_ops->set_preview_window = camera_set_preview_window;
|
||||||
|
camera_ops->set_callbacks = camera_set_callbacks;
|
||||||
|
camera_ops->enable_msg_type = camera_enable_msg_type;
|
||||||
|
camera_ops->disable_msg_type = camera_disable_msg_type;
|
||||||
|
camera_ops->msg_type_enabled = camera_msg_type_enabled;
|
||||||
|
camera_ops->start_preview = camera_start_preview;
|
||||||
|
camera_ops->stop_preview = camera_stop_preview;
|
||||||
|
camera_ops->preview_enabled = camera_preview_enabled;
|
||||||
|
camera_ops->store_meta_data_in_buffers = camera_store_meta_data_in_buffers;
|
||||||
|
camera_ops->start_recording = camera_start_recording;
|
||||||
|
camera_ops->stop_recording = camera_stop_recording;
|
||||||
|
camera_ops->recording_enabled = camera_recording_enabled;
|
||||||
|
camera_ops->release_recording_frame = camera_release_recording_frame;
|
||||||
|
camera_ops->auto_focus = camera_auto_focus;
|
||||||
|
camera_ops->cancel_auto_focus = camera_cancel_auto_focus;
|
||||||
|
camera_ops->take_picture = camera_take_picture;
|
||||||
|
camera_ops->cancel_picture = camera_cancel_picture;
|
||||||
|
camera_ops->set_parameters = camera_set_parameters;
|
||||||
|
camera_ops->get_parameters = camera_get_parameters;
|
||||||
|
camera_ops->put_parameters = camera_put_parameters;
|
||||||
|
camera_ops->send_command = camera_send_command;
|
||||||
|
camera_ops->release = camera_release;
|
||||||
|
camera_ops->dump = camera_dump;
|
||||||
|
|
||||||
|
*device = &camera_device->base.common;
|
||||||
|
}
|
||||||
|
|
||||||
|
return rv;
|
||||||
|
|
||||||
|
fail:
|
||||||
|
if(camera_device) {
|
||||||
|
free(camera_device);
|
||||||
|
camera_device = NULL;
|
||||||
|
}
|
||||||
|
if(camera_ops) {
|
||||||
|
free(camera_ops);
|
||||||
|
camera_ops = NULL;
|
||||||
|
}
|
||||||
|
*device = NULL;
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
int camera_get_number_of_cameras(void)
|
||||||
|
{
|
||||||
|
ALOGI("%s", __FUNCTION__);
|
||||||
|
if (check_vendor_module())
|
||||||
|
return 0;
|
||||||
|
return gVendorModule->get_number_of_cameras();
|
||||||
|
}
|
||||||
|
|
||||||
|
int camera_get_camera_info(int camera_id, struct camera_info *info)
|
||||||
|
{
|
||||||
|
ALOGI("%s", __FUNCTION__);
|
||||||
|
if (check_vendor_module())
|
||||||
|
return 0;
|
||||||
|
return gVendorModule->get_camera_info(camera_id, info);
|
||||||
|
}
|
6
cm.dependencies
Executable file
6
cm.dependencies
Executable file
@ -0,0 +1,6 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"repository": "android_device_samsung_msm8974-common",
|
||||||
|
"target_path": "device/samsung/msm8974-common"
|
||||||
|
},
|
||||||
|
]
|
7
cm.mk
Executable file
7
cm.mk
Executable file
@ -0,0 +1,7 @@
|
|||||||
|
$(call inherit-product, device/samsung/viennalte/full_viennalte.mk)
|
||||||
|
|
||||||
|
# Inherit some common CM stuff.
|
||||||
|
$(call inherit-product, vendor/cm/config/common_full_phone.mk)
|
||||||
|
|
||||||
|
PRODUCT_DEVICE := viennalte
|
||||||
|
PRODUCT_NAME := cm_viennalte
|
50
cmhw/org/cyanogenmod/hardware/DisplayColorCalibration.java
Executable file
50
cmhw/org/cyanogenmod/hardware/DisplayColorCalibration.java
Executable file
@ -0,0 +1,50 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2014 The CyanogenMod Project
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.cyanogenmod.hardware;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.util.Scanner;
|
||||||
|
import org.cyanogenmod.hardware.util.FileUtils;
|
||||||
|
|
||||||
|
public class DisplayColorCalibration {
|
||||||
|
private static final String COLOR_FILE = "/sys/class/graphics/fb0/rgb";
|
||||||
|
|
||||||
|
public static boolean isSupported() {
|
||||||
|
File f = new File(COLOR_FILE);
|
||||||
|
return f.exists();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int getMaxValue() {
|
||||||
|
return 32768;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int getMinValue() {
|
||||||
|
return 255;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int getDefValue() {
|
||||||
|
return getMaxValue();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String getCurColors() {
|
||||||
|
return FileUtils.readOneLine(COLOR_FILE);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean setColors(String colors) {
|
||||||
|
return FileUtils.writeLine(COLOR_FILE, colors);
|
||||||
|
}
|
||||||
|
}
|
44
cmhw/org/cyanogenmod/hardware/KeyDisabler.java
Executable file
44
cmhw/org/cyanogenmod/hardware/KeyDisabler.java
Executable file
@ -0,0 +1,44 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2014 The CyanogenMod Project
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.cyanogenmod.hardware;
|
||||||
|
|
||||||
|
import org.cyanogenmod.hardware.util.FileUtils;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Disable capacitive keys
|
||||||
|
*
|
||||||
|
* This is intended for use on devices in which the capacitive keys
|
||||||
|
* can be fully disabled for replacement with a soft navbar. You
|
||||||
|
* really should not be using this on a device with mechanical or
|
||||||
|
* otherwise visible-when-inactive keys
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class KeyDisabler {
|
||||||
|
|
||||||
|
private static String CONTROL_PATH = "/sys/class/sec/sec_touchkey/tsp_keys_enabled";
|
||||||
|
|
||||||
|
public static boolean isSupported() { return true; }
|
||||||
|
|
||||||
|
public static boolean isActive() {
|
||||||
|
return (FileUtils.readOneLine(CONTROL_PATH).equals("0"));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean setActive(boolean state) {
|
||||||
|
return FileUtils.writeLine(CONTROL_PATH, (state ? "0" : "1"));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
631
configs/media_profiles.xml
Executable file
631
configs/media_profiles.xml
Executable file
@ -0,0 +1,631 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Copyright (C) 2010 The Android Open Source Project
|
||||||
|
Copyright (C) 2012-2013 The Linux Foundation. All rights reserved.
|
||||||
|
Not a contribution.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
-->
|
||||||
|
<!DOCTYPE MediaSettings [
|
||||||
|
<!ELEMENT MediaSettings (CamcorderProfiles,
|
||||||
|
EncoderOutputFileFormat+,
|
||||||
|
VideoEncoderCap+,
|
||||||
|
AudioEncoderCap+,
|
||||||
|
VideoDecoderCap,
|
||||||
|
AudioDecoderCap)>
|
||||||
|
<!ELEMENT CamcorderProfiles (EncoderProfile+, ImageEncoding+, ImageDecoding, Camera)>
|
||||||
|
<!ELEMENT EncoderProfile (Video, Audio)>
|
||||||
|
<!ATTLIST EncoderProfile quality (low|high|qcif|qvga|720p|1080p|timelapselow|timelapsehigh|timelapseqcif|timelapseqvga|timelapse720p|timelapse1080p) #REQUIRED>
|
||||||
|
<!ATTLIST EncoderProfile fileFormat (mp4|3gp) #REQUIRED>
|
||||||
|
<!ATTLIST EncoderProfile duration (30|60) #REQUIRED>
|
||||||
|
<!ATTLIST EncoderProfile cameraId (0|1) #REQUIRED>
|
||||||
|
<!ELEMENT Video EMPTY>
|
||||||
|
<!ATTLIST Video codec (h264|h263|m4v) #REQUIRED>
|
||||||
|
<!ATTLIST Video bitRate CDATA #REQUIRED>
|
||||||
|
<!ATTLIST Video width CDATA #REQUIRED>
|
||||||
|
<!ATTLIST Video height CDATA #REQUIRED>
|
||||||
|
<!ATTLIST Video frameRate CDATA #REQUIRED>
|
||||||
|
<!ELEMENT Audio EMPTY>
|
||||||
|
<!ATTLIST Audio codec (amrnb|amrwb|aac|lpcm) #REQUIRED>
|
||||||
|
<!ATTLIST Audio bitRate CDATA #REQUIRED>
|
||||||
|
<!ATTLIST Audio sampleRate CDATA #REQUIRED>
|
||||||
|
<!ATTLIST Audio channels (1|2|6) #REQUIRED>
|
||||||
|
<!ELEMENT ImageEncoding EMPTY>
|
||||||
|
<!ATTLIST ImageEncoding quality (90|80|70|60|50|40) #REQUIRED>
|
||||||
|
<!ELEMENT ImageDecoding EMPTY>
|
||||||
|
<!ATTLIST ImageDecoding memCap CDATA #REQUIRED>
|
||||||
|
<!ELEMENT Camera EMPTY>
|
||||||
|
<!ELEMENT EncoderOutputFileFormat EMPTY>
|
||||||
|
<!ATTLIST EncoderOutputFileFormat name (mp4|3gp) #REQUIRED>
|
||||||
|
<!ELEMENT VideoEncoderCap EMPTY>
|
||||||
|
<!ATTLIST VideoEncoderCap name (h264|h263|m4v|wmv) #REQUIRED>
|
||||||
|
<!ATTLIST VideoEncoderCap enabled (true|false) #REQUIRED>
|
||||||
|
<!ATTLIST VideoEncoderCap minBitRate CDATA #REQUIRED>
|
||||||
|
<!ATTLIST VideoEncoderCap maxBitRate CDATA #REQUIRED>
|
||||||
|
<!ATTLIST VideoEncoderCap minFrameWidth CDATA #REQUIRED>
|
||||||
|
<!ATTLIST VideoEncoderCap maxFrameWidth CDATA #REQUIRED>
|
||||||
|
<!ATTLIST VideoEncoderCap minFrameHeight CDATA #REQUIRED>
|
||||||
|
<!ATTLIST VideoEncoderCap maxFrameHeight CDATA #REQUIRED>
|
||||||
|
<!ATTLIST VideoEncoderCap minFrameRate CDATA #REQUIRED>
|
||||||
|
<!ATTLIST VideoEncoderCap maxFrameRate CDATA #REQUIRED>
|
||||||
|
<!ELEMENT AudioEncoderCap EMPTY>
|
||||||
|
<!ATTLIST AudioEncoderCap name (amrnb|amrwb|aac|wma|lpcm) #REQUIRED>
|
||||||
|
<!ATTLIST AudioEncoderCap enabled (true|false) #REQUIRED>
|
||||||
|
<!ATTLIST AudioEncoderCap minBitRate CDATA #REQUIRED>
|
||||||
|
<!ATTLIST AudioEncoderCap maxBitRate CDATA #REQUIRED>
|
||||||
|
<!ATTLIST AudioEncoderCap minSampleRate CDATA #REQUIRED>
|
||||||
|
<!ATTLIST AudioEncoderCap maxSampleRate CDATA #REQUIRED>
|
||||||
|
<!ATTLIST AudioEncoderCap minChannels (1|2|6) #REQUIRED>
|
||||||
|
<!ATTLIST AudioEncoderCap maxChannels (1|2|6) #REQUIRED>
|
||||||
|
<!ELEMENT VideoDecoderCap EMPTY>
|
||||||
|
<!ATTLIST VideoDecoderCap name (wmv) #REQUIRED>
|
||||||
|
<!ATTLIST VideoDecoderCap enabled (true|false) #REQUIRED>
|
||||||
|
<!ELEMENT AudioDecoderCap EMPTY>
|
||||||
|
<!ATTLIST AudioDecoderCap name (wma) #REQUIRED>
|
||||||
|
<!ATTLIST AudioDecoderCap enabled (true|false) #REQUIRED>
|
||||||
|
<!ELEMENT VideoEditorCap EMPTY>
|
||||||
|
<!ATTLIST VideoEditorCap maxInputFrameWidth CDATA #REQUIRED>
|
||||||
|
<!ATTLIST VideoEditorCap maxInputFrameHeight CDATA #REQUIRED>
|
||||||
|
<!ATTLIST VideoEditorCap maxOutputFrameWidth CDATA #REQUIRED>
|
||||||
|
<!ATTLIST VideoEditorCap maxOutputFrameHeight CDATA #REQUIRED>
|
||||||
|
<!ATTLIST VideoEditorCap maxPrefetchYUVFrames CDATA #REQUIRED>
|
||||||
|
<!ELEMENT ExportVideoProfile EMPTY>
|
||||||
|
<!ATTLIST ExportVideoProfile name (h264|h263|m4v) #REQUIRED>
|
||||||
|
<!ATTLIST ExportVideoProfile profile CDATA #REQUIRED>
|
||||||
|
<!ATTLIST ExportVideoProfile level CDATA #REQUIRED>
|
||||||
|
]>
|
||||||
|
<!--
|
||||||
|
This file is used to declare the multimedia profiles and capabilities
|
||||||
|
on an android-powered device.
|
||||||
|
-->
|
||||||
|
<MediaSettings>
|
||||||
|
<!-- Each camcorder profile defines a set of predefined configuration parameters -->
|
||||||
|
<!-- Back Camera -->
|
||||||
|
<CamcorderProfiles cameraId="0" startOffsetMs="700">
|
||||||
|
|
||||||
|
<EncoderProfile quality="low" fileFormat="mp4" duration="30">
|
||||||
|
<Video codec="h264"
|
||||||
|
bitRate="384000"
|
||||||
|
width="176"
|
||||||
|
height="144"
|
||||||
|
frameRate="30" />
|
||||||
|
|
||||||
|
<Audio codec="aac"
|
||||||
|
bitRate="128000"
|
||||||
|
sampleRate="48000"
|
||||||
|
channels="2" />
|
||||||
|
</EncoderProfile>
|
||||||
|
|
||||||
|
<EncoderProfile quality="high" fileFormat="mp4" duration="30">
|
||||||
|
<Video codec="h264"
|
||||||
|
bitRate="17000000"
|
||||||
|
width="1920"
|
||||||
|
height="1080"
|
||||||
|
frameRate="30" />
|
||||||
|
|
||||||
|
<Audio codec="aac"
|
||||||
|
bitRate="128000"
|
||||||
|
sampleRate="48000"
|
||||||
|
channels="2" />
|
||||||
|
</EncoderProfile>
|
||||||
|
|
||||||
|
<EncoderProfile quality="qcif" fileFormat="mp4" duration="30">
|
||||||
|
<Video codec="h264"
|
||||||
|
bitRate="384000"
|
||||||
|
width="176"
|
||||||
|
height="144"
|
||||||
|
frameRate="30" />
|
||||||
|
|
||||||
|
<Audio codec="aac"
|
||||||
|
bitRate="128000"
|
||||||
|
sampleRate="48000"
|
||||||
|
channels="2" />
|
||||||
|
</EncoderProfile>
|
||||||
|
|
||||||
|
<EncoderProfile quality="qvga" fileFormat="mp4" duration="30">
|
||||||
|
<Video codec="h264"
|
||||||
|
bitRate="767000"
|
||||||
|
width="320"
|
||||||
|
height="240"
|
||||||
|
frameRate="30" />
|
||||||
|
|
||||||
|
<Audio codec="aac"
|
||||||
|
bitRate="128000"
|
||||||
|
sampleRate="48000"
|
||||||
|
channels="2" />
|
||||||
|
</EncoderProfile>
|
||||||
|
|
||||||
|
<EncoderProfile quality="480p" fileFormat="mp4" duration="30">
|
||||||
|
<Video codec="h264"
|
||||||
|
bitRate="3449000"
|
||||||
|
width="720"
|
||||||
|
height="480"
|
||||||
|
frameRate="30" />
|
||||||
|
|
||||||
|
<Audio codec="aac"
|
||||||
|
bitRate="128000"
|
||||||
|
sampleRate="48000"
|
||||||
|
channels="2" />
|
||||||
|
</EncoderProfile>
|
||||||
|
|
||||||
|
<EncoderProfile quality="720p" fileFormat="mp4" duration="30">
|
||||||
|
<Video codec="h264"
|
||||||
|
bitRate="12000000"
|
||||||
|
width="1280"
|
||||||
|
height="720"
|
||||||
|
frameRate="30" />
|
||||||
|
|
||||||
|
<Audio codec="aac"
|
||||||
|
bitRate="128000"
|
||||||
|
sampleRate="48000"
|
||||||
|
channels="2" />
|
||||||
|
</EncoderProfile>
|
||||||
|
|
||||||
|
<EncoderProfile quality="1080p" fileFormat="mp4" duration="30">
|
||||||
|
<Video codec="h264"
|
||||||
|
bitRate="17000000"
|
||||||
|
width="1920"
|
||||||
|
height="1080"
|
||||||
|
frameRate="30" />
|
||||||
|
|
||||||
|
<Audio codec="aac"
|
||||||
|
bitRate="128000"
|
||||||
|
sampleRate="48000"
|
||||||
|
channels="2" />
|
||||||
|
</EncoderProfile>
|
||||||
|
|
||||||
|
<EncoderProfile quality="timelapselow" fileFormat="mp4" duration="30">
|
||||||
|
<Video codec="h264"
|
||||||
|
bitRate="384000"
|
||||||
|
width="176"
|
||||||
|
height="144"
|
||||||
|
frameRate="30" />
|
||||||
|
|
||||||
|
<!--
|
||||||
|
The Audio part of the profile will not be used since time lapse mode
|
||||||
|
does not capture audio
|
||||||
|
-->
|
||||||
|
<Audio codec="aac"
|
||||||
|
bitRate="128000"
|
||||||
|
sampleRate="48000"
|
||||||
|
channels="2" />
|
||||||
|
</EncoderProfile>
|
||||||
|
|
||||||
|
<EncoderProfile quality="timelapsehigh" fileFormat="mp4" duration="30">
|
||||||
|
<Video codec="h264"
|
||||||
|
bitRate="17000000"
|
||||||
|
width="1920"
|
||||||
|
height="1080"
|
||||||
|
frameRate="30" />
|
||||||
|
|
||||||
|
<!--
|
||||||
|
The Audio part of the profile will not be used since time lapse mode
|
||||||
|
does not capture audio
|
||||||
|
-->
|
||||||
|
<Audio codec="aac"
|
||||||
|
bitRate="128000"
|
||||||
|
sampleRate="48000"
|
||||||
|
channels="2" />
|
||||||
|
</EncoderProfile>
|
||||||
|
|
||||||
|
<EncoderProfile quality="timelapseqcif" fileFormat="mp4" duration="30">
|
||||||
|
<Video codec="h264"
|
||||||
|
bitRate="384000"
|
||||||
|
width="176"
|
||||||
|
height="144"
|
||||||
|
frameRate="30" />
|
||||||
|
|
||||||
|
<!--
|
||||||
|
The Audio part of the profile will not be used since time lapse mode
|
||||||
|
does not capture audio
|
||||||
|
-->
|
||||||
|
<Audio codec="aac"
|
||||||
|
bitRate="128000"
|
||||||
|
sampleRate="48000"
|
||||||
|
channels="2" />
|
||||||
|
</EncoderProfile>
|
||||||
|
|
||||||
|
<EncoderProfile quality="timelapseqvga" fileFormat="mp4" duration="30">
|
||||||
|
<Video codec="h264"
|
||||||
|
bitRate="767000"
|
||||||
|
width="320"
|
||||||
|
height="240"
|
||||||
|
frameRate="30" />
|
||||||
|
|
||||||
|
<!--
|
||||||
|
The Audio part of the profile will not be used since time lapse mode
|
||||||
|
does not capture audio
|
||||||
|
-->
|
||||||
|
<Audio codec="aac"
|
||||||
|
bitRate="128000"
|
||||||
|
sampleRate="48000"
|
||||||
|
channels="2" />
|
||||||
|
</EncoderProfile>
|
||||||
|
|
||||||
|
<EncoderProfile quality="timelapse480p" fileFormat="mp4" duration="30">
|
||||||
|
<Video codec="h264"
|
||||||
|
bitRate="3449000"
|
||||||
|
width="720"
|
||||||
|
height="480"
|
||||||
|
frameRate="30" />
|
||||||
|
|
||||||
|
<!--
|
||||||
|
The Audio part of the profile will not be used since time lapse mode
|
||||||
|
does not capture audio
|
||||||
|
-->
|
||||||
|
<Audio codec="aac"
|
||||||
|
bitRate="128000"
|
||||||
|
sampleRate="48000"
|
||||||
|
channels="2" />
|
||||||
|
</EncoderProfile>
|
||||||
|
|
||||||
|
<EncoderProfile quality="timelapse720p" fileFormat="mp4" duration="30">
|
||||||
|
<Video codec="h264"
|
||||||
|
bitRate="12000000"
|
||||||
|
width="1280"
|
||||||
|
height="720"
|
||||||
|
frameRate="30" />
|
||||||
|
|
||||||
|
<!--
|
||||||
|
The Audio part of the profile will not be used since time lapse mode
|
||||||
|
does not capture audio
|
||||||
|
-->
|
||||||
|
<Audio codec="aac"
|
||||||
|
bitRate="128000"
|
||||||
|
sampleRate="48000"
|
||||||
|
channels="2" />
|
||||||
|
</EncoderProfile>
|
||||||
|
|
||||||
|
<EncoderProfile quality="timelapse1080p" fileFormat="mp4" duration="30">
|
||||||
|
<Video codec="h264"
|
||||||
|
bitRate="17000000"
|
||||||
|
width="1920"
|
||||||
|
height="1080"
|
||||||
|
frameRate="30" />
|
||||||
|
|
||||||
|
<!--
|
||||||
|
The Audio part of the profile will not be used since time lapse mode
|
||||||
|
does not capture audio
|
||||||
|
-->
|
||||||
|
<Audio codec="aac"
|
||||||
|
bitRate="128000"
|
||||||
|
sampleRate="48000"
|
||||||
|
channels="2" />
|
||||||
|
</EncoderProfile>
|
||||||
|
|
||||||
|
<ImageEncoding quality="95" />
|
||||||
|
<ImageEncoding quality="80" />
|
||||||
|
<ImageEncoding quality="70" />
|
||||||
|
<ImageDecoding memCap="20000000" />
|
||||||
|
|
||||||
|
</CamcorderProfiles>
|
||||||
|
|
||||||
|
<!-- Front Camera -->
|
||||||
|
<CamcorderProfiles cameraId="1" startOffsetMs="700">
|
||||||
|
|
||||||
|
<EncoderProfile quality="low" fileFormat="mp4" duration="30">
|
||||||
|
<Video codec="h264"
|
||||||
|
bitRate="384000"
|
||||||
|
width="176"
|
||||||
|
height="144"
|
||||||
|
frameRate="30" />
|
||||||
|
|
||||||
|
<Audio codec="aac"
|
||||||
|
bitRate="128000"
|
||||||
|
sampleRate="48000"
|
||||||
|
channels="2" />
|
||||||
|
</EncoderProfile>
|
||||||
|
|
||||||
|
<EncoderProfile quality="high" fileFormat="mp4" duration="30">
|
||||||
|
<Video codec="h264"
|
||||||
|
bitRate="17000000"
|
||||||
|
width="1920"
|
||||||
|
height="1080"
|
||||||
|
frameRate="30" />
|
||||||
|
|
||||||
|
<Audio codec="aac"
|
||||||
|
bitRate="128000"
|
||||||
|
sampleRate="48000"
|
||||||
|
channels="2" />
|
||||||
|
</EncoderProfile>
|
||||||
|
|
||||||
|
<EncoderProfile quality="qcif" fileFormat="mp4" duration="30">
|
||||||
|
<Video codec="h264"
|
||||||
|
bitRate="384000"
|
||||||
|
width="176"
|
||||||
|
height="144"
|
||||||
|
frameRate="30" />
|
||||||
|
|
||||||
|
<Audio codec="aac"
|
||||||
|
bitRate="128000"
|
||||||
|
sampleRate="48000"
|
||||||
|
channels="2" />
|
||||||
|
</EncoderProfile>
|
||||||
|
|
||||||
|
<EncoderProfile quality="qvga" fileFormat="mp4" duration="30">
|
||||||
|
<Video codec="h264"
|
||||||
|
bitRate="767000"
|
||||||
|
width="320"
|
||||||
|
height="240"
|
||||||
|
frameRate="30" />
|
||||||
|
|
||||||
|
<Audio codec="aac"
|
||||||
|
bitRate="128000"
|
||||||
|
sampleRate="48000"
|
||||||
|
channels="2" />
|
||||||
|
</EncoderProfile>
|
||||||
|
|
||||||
|
<EncoderProfile quality="480p" fileFormat="mp4" duration="30">
|
||||||
|
<Video codec="h264"
|
||||||
|
bitRate="3449000"
|
||||||
|
width="720"
|
||||||
|
height="480"
|
||||||
|
frameRate="30" />
|
||||||
|
|
||||||
|
<Audio codec="aac"
|
||||||
|
bitRate="128000"
|
||||||
|
sampleRate="48000"
|
||||||
|
channels="2" />
|
||||||
|
</EncoderProfile>
|
||||||
|
|
||||||
|
<EncoderProfile quality="720p" fileFormat="mp4" duration="30">
|
||||||
|
<Video codec="h264"
|
||||||
|
bitRate="12000000"
|
||||||
|
width="1280"
|
||||||
|
height="720"
|
||||||
|
frameRate="30" />
|
||||||
|
|
||||||
|
<Audio codec="aac"
|
||||||
|
bitRate="128000"
|
||||||
|
sampleRate="48000"
|
||||||
|
channels="2" />
|
||||||
|
</EncoderProfile>
|
||||||
|
|
||||||
|
<EncoderProfile quality="1080p" fileFormat="mp4" duration="30">
|
||||||
|
<Video codec="h264"
|
||||||
|
bitRate="17000000"
|
||||||
|
width="1920"
|
||||||
|
height="1080"
|
||||||
|
frameRate="30" />
|
||||||
|
|
||||||
|
<Audio codec="aac"
|
||||||
|
bitRate="128000"
|
||||||
|
sampleRate="48000"
|
||||||
|
channels="2" />
|
||||||
|
</EncoderProfile>
|
||||||
|
|
||||||
|
<EncoderProfile quality="timelapselow" fileFormat="mp4" duration="30">
|
||||||
|
<Video codec="h264"
|
||||||
|
bitRate="384000"
|
||||||
|
width="176"
|
||||||
|
height="144"
|
||||||
|
frameRate="30" />
|
||||||
|
|
||||||
|
<!--
|
||||||
|
The Audio part of the profile will not be used since time lapse mode
|
||||||
|
does not capture audio
|
||||||
|
-->
|
||||||
|
<Audio codec="aac"
|
||||||
|
bitRate="128000"
|
||||||
|
sampleRate="48000"
|
||||||
|
channels="2" />
|
||||||
|
</EncoderProfile>
|
||||||
|
|
||||||
|
<EncoderProfile quality="timelapsehigh" fileFormat="mp4" duration="30">
|
||||||
|
<Video codec="h264"
|
||||||
|
bitRate="17000000"
|
||||||
|
width="1920"
|
||||||
|
height="1080"
|
||||||
|
frameRate="30" />
|
||||||
|
|
||||||
|
<!--
|
||||||
|
The Audio part of the profile will not be used since time lapse mode
|
||||||
|
does not capture audio
|
||||||
|
-->
|
||||||
|
<Audio codec="aac"
|
||||||
|
bitRate="128000"
|
||||||
|
sampleRate="48000"
|
||||||
|
channels="2" />
|
||||||
|
</EncoderProfile>
|
||||||
|
|
||||||
|
<EncoderProfile quality="timelapseqcif" fileFormat="mp4" duration="30">
|
||||||
|
<Video codec="h264"
|
||||||
|
bitRate="384000"
|
||||||
|
width="176"
|
||||||
|
height="144"
|
||||||
|
frameRate="30" />
|
||||||
|
|
||||||
|
<!--
|
||||||
|
The Audio part of the profile will not be used since time lapse mode
|
||||||
|
does not capture audio
|
||||||
|
-->
|
||||||
|
<Audio codec="aac"
|
||||||
|
bitRate="128000"
|
||||||
|
sampleRate="48000"
|
||||||
|
channels="2" />
|
||||||
|
</EncoderProfile>
|
||||||
|
|
||||||
|
<EncoderProfile quality="timelapseqvga" fileFormat="mp4" duration="30">
|
||||||
|
<Video codec="h264"
|
||||||
|
bitRate="767000"
|
||||||
|
width="320"
|
||||||
|
height="240"
|
||||||
|
frameRate="30" />
|
||||||
|
|
||||||
|
<!--
|
||||||
|
The Audio part of the profile will not be used since time lapse mode
|
||||||
|
does not capture audio
|
||||||
|
-->
|
||||||
|
<Audio codec="aac"
|
||||||
|
bitRate="128000"
|
||||||
|
sampleRate="48000"
|
||||||
|
channels="2" />
|
||||||
|
</EncoderProfile>
|
||||||
|
|
||||||
|
<EncoderProfile quality="timelapse480p" fileFormat="mp4" duration="30">
|
||||||
|
<Video codec="h264"
|
||||||
|
bitRate="3449000"
|
||||||
|
width="720"
|
||||||
|
height="480"
|
||||||
|
frameRate="30" />
|
||||||
|
|
||||||
|
<!--
|
||||||
|
The Audio part of the profile will not be used since time lapse mode
|
||||||
|
does not capture audio
|
||||||
|
-->
|
||||||
|
<Audio codec="aac"
|
||||||
|
bitRate="128000"
|
||||||
|
sampleRate="48000"
|
||||||
|
channels="2" />
|
||||||
|
</EncoderProfile>
|
||||||
|
|
||||||
|
<EncoderProfile quality="timelapse720p" fileFormat="mp4" duration="30">
|
||||||
|
<Video codec="h264"
|
||||||
|
bitRate="12000000"
|
||||||
|
width="1280"
|
||||||
|
height="720"
|
||||||
|
frameRate="30" />
|
||||||
|
|
||||||
|
<!--
|
||||||
|
The Audio part of the profile will not be used since time lapse mode
|
||||||
|
does not capture audio
|
||||||
|
-->
|
||||||
|
<Audio codec="aac"
|
||||||
|
bitRate="128000"
|
||||||
|
sampleRate="48000"
|
||||||
|
channels="2" />
|
||||||
|
</EncoderProfile>
|
||||||
|
|
||||||
|
<EncoderProfile quality="timelapse1080p" fileFormat="mp4" duration="30">
|
||||||
|
<Video codec="h264"
|
||||||
|
bitRate="17000000"
|
||||||
|
width="1920"
|
||||||
|
height="1080"
|
||||||
|
frameRate="30" />
|
||||||
|
|
||||||
|
<!--
|
||||||
|
The Audio part of the profile will not be used since time lapse mode
|
||||||
|
does not capture audio
|
||||||
|
-->
|
||||||
|
<Audio codec="aac"
|
||||||
|
bitRate="128000"
|
||||||
|
sampleRate="48000"
|
||||||
|
channels="2" />
|
||||||
|
</EncoderProfile>
|
||||||
|
|
||||||
|
<ImageEncoding quality="95" />
|
||||||
|
<ImageEncoding quality="80" />
|
||||||
|
<ImageEncoding quality="70" />
|
||||||
|
<ImageDecoding memCap="20000000" />
|
||||||
|
|
||||||
|
</CamcorderProfiles>
|
||||||
|
|
||||||
|
<EncoderOutputFileFormat name="3gp" />
|
||||||
|
<EncoderOutputFileFormat name="mp4" />
|
||||||
|
|
||||||
|
<!--
|
||||||
|
If a codec is not enabled, it is invisible to the applications
|
||||||
|
In other words, the applications won't be able to use the codec
|
||||||
|
or query the capabilities of the codec at all if it is disabled
|
||||||
|
-->
|
||||||
|
<VideoEncoderCap name="h264" enabled="true"
|
||||||
|
minBitRate="64000" maxBitRate="50000000"
|
||||||
|
minFrameWidth="176" maxFrameWidth="3840"
|
||||||
|
minFrameHeight="144" maxFrameHeight="2160"
|
||||||
|
minFrameRate="1" maxFrameRate="30" />
|
||||||
|
|
||||||
|
<VideoEncoderCap name="h263" enabled="true"
|
||||||
|
minBitRate="64000" maxBitRate="1000000"
|
||||||
|
minFrameWidth="176" maxFrameWidth="800"
|
||||||
|
minFrameHeight="144" maxFrameHeight="480"
|
||||||
|
minFrameRate="1" maxFrameRate="30" />
|
||||||
|
|
||||||
|
<VideoEncoderCap name="m4v" enabled="true"
|
||||||
|
minBitRate="64000" maxBitRate="20000000"
|
||||||
|
minFrameWidth="176" maxFrameWidth="1920"
|
||||||
|
minFrameHeight="144" maxFrameHeight="1080"
|
||||||
|
minFrameRate="1" maxFrameRate="30" />
|
||||||
|
|
||||||
|
<AudioEncoderCap name="aac" enabled="true"
|
||||||
|
minBitRate="8192" maxBitRate="256000"
|
||||||
|
minSampleRate="8000" maxSampleRate="48000"
|
||||||
|
minChannels="1" maxChannels="2" />
|
||||||
|
|
||||||
|
<AudioEncoderCap name="heaac" enabled="true"
|
||||||
|
minBitRate="8000" maxBitRate="64000"
|
||||||
|
minSampleRate="16000" maxSampleRate="48000"
|
||||||
|
minChannels="1" maxChannels="1" />
|
||||||
|
|
||||||
|
<AudioEncoderCap name="aaceld" enabled="true"
|
||||||
|
minBitRate="16000" maxBitRate="192000"
|
||||||
|
minSampleRate="16000" maxSampleRate="48000"
|
||||||
|
minChannels="1" maxChannels="1" />
|
||||||
|
|
||||||
|
<AudioEncoderCap name="amrwb" enabled="true"
|
||||||
|
minBitRate="6600" maxBitRate="23850"
|
||||||
|
minSampleRate="16000" maxSampleRate="16000"
|
||||||
|
minChannels="1" maxChannels="1" />
|
||||||
|
|
||||||
|
<AudioEncoderCap name="amrnb" enabled="true"
|
||||||
|
minBitRate="5525" maxBitRate="12200"
|
||||||
|
minSampleRate="8000" maxSampleRate="8000"
|
||||||
|
minChannels="1" maxChannels="1" />
|
||||||
|
|
||||||
|
<AudioEncoderCap name="lpcm" enabled="true"
|
||||||
|
minBitRate="768000" maxBitRate="4608000"
|
||||||
|
minSampleRate="48000" maxSampleRate="48000"
|
||||||
|
minChannels="1" maxChannels="6" />
|
||||||
|
|
||||||
|
<!--
|
||||||
|
FIXME:
|
||||||
|
We do not check decoder capabilities at present
|
||||||
|
At present, we only check whether windows media is visible
|
||||||
|
for TEST applications. For other applications, we do
|
||||||
|
not perform any checks at all.
|
||||||
|
-->
|
||||||
|
<VideoDecoderCap name="wmv" enabled="true"/>
|
||||||
|
<AudioDecoderCap name="wma" enabled="true"/>
|
||||||
|
<!--
|
||||||
|
The VideoEditor Capability configuration:
|
||||||
|
- maxInputFrameWidth: maximum video width of imported video clip.
|
||||||
|
- maxInputFrameHeight: maximum video height of imported video clip.
|
||||||
|
- maxOutputFrameWidth: maximum video width of exported video clip.
|
||||||
|
- maxOutputFrameHeight: maximum video height of exported video clip.
|
||||||
|
- maxPrefetchYUVFrames: maximum prefetch YUV frames for encoder,
|
||||||
|
used to limit the amount of memory for prefetched YUV frames.
|
||||||
|
For this platform, it allows maximum 30MB(3MB per 1080p frame x 10
|
||||||
|
frames) memory.
|
||||||
|
-->
|
||||||
|
<VideoEditorCap maxInputFrameWidth="1920"
|
||||||
|
maxInputFrameHeight="1088" maxOutputFrameWidth="1920"
|
||||||
|
maxOutputFrameHeight="1080" maxPrefetchYUVFrames="10"/>
|
||||||
|
<!--
|
||||||
|
The VideoEditor Export codec profile and level values
|
||||||
|
correspond to the values in OMX_Video.h.
|
||||||
|
E.g. for h264, profile value 1 means OMX_VIDEO_AVCProfileBaseline
|
||||||
|
and level 4096 means OMX_VIDEO_AVCLevel41.
|
||||||
|
Please note that the values are in decimal.
|
||||||
|
These values are for video encoder.
|
||||||
|
-->
|
||||||
|
<!--
|
||||||
|
Codec = h.264, Baseline profile, level 4.0
|
||||||
|
-->
|
||||||
|
<ExportVideoProfile name="h264" profile= "1" level="2048"/>
|
||||||
|
<!--
|
||||||
|
Codec = h.263, Baseline profile, level 70
|
||||||
|
-->
|
||||||
|
<ExportVideoProfile name="h263" profile= "1" level="128"/>
|
||||||
|
<!--
|
||||||
|
Codec = mpeg4, Simple profile, level 5
|
||||||
|
-->
|
||||||
|
<ExportVideoProfile name="m4v" profile= "1" level="128"/>
|
||||||
|
</MediaSettings>
|
1
configs/p2p_supplicant_overlay.conf
Executable file
1
configs/p2p_supplicant_overlay.conf
Executable file
@ -0,0 +1 @@
|
|||||||
|
disable_scan_offload=1
|
108
configs/thermal-engine-8974.conf
Executable file
108
configs/thermal-engine-8974.conf
Executable file
@ -0,0 +1,108 @@
|
|||||||
|
sampling 5000
|
||||||
|
|
||||||
|
[CPU0_MONITOR]
|
||||||
|
algo_type monitor
|
||||||
|
sensor cpu0
|
||||||
|
sampling 65
|
||||||
|
thresholds 120000
|
||||||
|
thresholds_clr 115000
|
||||||
|
actions shutdown
|
||||||
|
action_info 70
|
||||||
|
|
||||||
|
[CPU1_MONITOR]
|
||||||
|
algo_type monitor
|
||||||
|
sensor cpu1
|
||||||
|
sampling 65
|
||||||
|
thresholds 120000
|
||||||
|
thresholds_clr 115000
|
||||||
|
actions shutdown
|
||||||
|
action_info 70
|
||||||
|
|
||||||
|
[CPU2_MONITOR]
|
||||||
|
algo_type monitor
|
||||||
|
sensor cpu2
|
||||||
|
sampling 65
|
||||||
|
thresholds 120000
|
||||||
|
thresholds_clr 115000
|
||||||
|
actions shutdown
|
||||||
|
action_info 70
|
||||||
|
|
||||||
|
[CPU3_MONITOR]
|
||||||
|
algo_type monitor
|
||||||
|
sensor cpu3
|
||||||
|
sampling 65
|
||||||
|
thresholds 120000
|
||||||
|
thresholds_clr 115000
|
||||||
|
actions shutdown
|
||||||
|
action_info 70
|
||||||
|
|
||||||
|
[HOTPLUG-CPU1]
|
||||||
|
sampling 65
|
||||||
|
thresholds 110000
|
||||||
|
thresholds_clr 95000
|
||||||
|
|
||||||
|
[HOTPLUG-CPU2]
|
||||||
|
sampling 65
|
||||||
|
thresholds 110000
|
||||||
|
thresholds_clr 95000
|
||||||
|
|
||||||
|
[HOTPLUG-CPU3]
|
||||||
|
sampling 65
|
||||||
|
thresholds 110000
|
||||||
|
thresholds_clr 95000
|
||||||
|
|
||||||
|
[PID-CPU0]
|
||||||
|
disable 1
|
||||||
|
|
||||||
|
[PID-CPU1]
|
||||||
|
disable 1
|
||||||
|
|
||||||
|
[PID-CPU2]
|
||||||
|
disable 1
|
||||||
|
|
||||||
|
[PID-CPU3]
|
||||||
|
disable 1
|
||||||
|
|
||||||
|
[PID-POPMEM]
|
||||||
|
disable 1
|
||||||
|
|
||||||
|
[SS-CPU0]
|
||||||
|
algo_type ss
|
||||||
|
sampling 65
|
||||||
|
sensor cpu0
|
||||||
|
device cpu
|
||||||
|
set_point 95000
|
||||||
|
set_point_clr 55000
|
||||||
|
|
||||||
|
[SS-CPU1]
|
||||||
|
algo_type ss
|
||||||
|
sampling 65
|
||||||
|
sensor cpu1
|
||||||
|
device cpu
|
||||||
|
set_point 95000
|
||||||
|
set_point_clr 55000
|
||||||
|
|
||||||
|
[SS-CPU2]
|
||||||
|
algo_type ss
|
||||||
|
sampling 65
|
||||||
|
sensor cpu2
|
||||||
|
device cpu
|
||||||
|
set_point 95000
|
||||||
|
set_point_clr 55000
|
||||||
|
|
||||||
|
[SS-CPU3]
|
||||||
|
algo_type ss
|
||||||
|
sampling 65
|
||||||
|
sensor cpu3
|
||||||
|
device cpu
|
||||||
|
set_point 95000
|
||||||
|
set_point_clr 55000
|
||||||
|
|
||||||
|
[SS-GPU]
|
||||||
|
algo_type ss
|
||||||
|
sampling 65
|
||||||
|
sensor tsens_tz_sensor10
|
||||||
|
device gpu
|
||||||
|
override 20000
|
||||||
|
set_point 95000
|
||||||
|
set_point_clr 75000
|
80
configs/thermald-8974.conf
Executable file
80
configs/thermald-8974.conf
Executable file
@ -0,0 +1,80 @@
|
|||||||
|
debug
|
||||||
|
sampling 5000
|
||||||
|
|
||||||
|
[tsens_tz_sensor0]
|
||||||
|
sampling 1000
|
||||||
|
thresholds 60 90 95 100 105 110 115 120
|
||||||
|
thresholds_clr 57 85 90 95 100 105 110 115
|
||||||
|
actions cpu cpu cpu cpu cpu cpu cpu shutdown
|
||||||
|
action_info 1512000 1188000 918000 756000 648000 540000 486000 5000
|
||||||
|
|
||||||
|
[tsens_tz_sensor1]
|
||||||
|
sampling 1000
|
||||||
|
thresholds 60 90 95 100 105 110 115 120
|
||||||
|
thresholds_clr 57 85 90 95 100 105 110 115
|
||||||
|
actions cpu cpu cpu cpu cpu cpu cpu shutdown
|
||||||
|
action_info 1512000 1188000 918000 756000 648000 540000 486000 5000
|
||||||
|
|
||||||
|
[tsens_tz_sensor2]
|
||||||
|
sampling 1000
|
||||||
|
thresholds 60 90 95 100 105 110 115 120
|
||||||
|
thresholds_clr 57 85 90 95 100 105 110 115
|
||||||
|
actions cpu cpu cpu cpu cpu cpu cpu shutdown
|
||||||
|
action_info 1512000 1188000 918000 756000 648000 540000 486000 5000
|
||||||
|
|
||||||
|
[tsens_tz_sensor3]
|
||||||
|
sampling 1000
|
||||||
|
thresholds 60 90 95 100 105 110 115 120
|
||||||
|
thresholds_clr 57 85 90 95 100 105 110 115
|
||||||
|
actions cpu cpu cpu cpu cpu cpu cpu shutdown
|
||||||
|
action_info 1512000 1188000 918000 756000 648000 540000 486000 5000
|
||||||
|
|
||||||
|
[tsens_tz_sensor4]
|
||||||
|
sampling 1000
|
||||||
|
thresholds 60 90 95 100 105 110 115 120
|
||||||
|
thresholds_clr 57 85 90 95 100 105 110 115
|
||||||
|
actions cpu cpu cpu cpu cpu cpu cpu shutdown
|
||||||
|
action_info 1512000 1188000 918000 756000 648000 540000 486000 5000
|
||||||
|
|
||||||
|
[tsens_tz_sensor5]
|
||||||
|
sampling 1000
|
||||||
|
thresholds 60 90 95 100 105 110 115 120
|
||||||
|
thresholds_clr 57 85 90 95 100 105 110 115
|
||||||
|
actions cpu cpu cpu cpu cpu cpu cpu shutdown
|
||||||
|
action_info 1512000 1188000 918000 756000 648000 540000 486000 5000
|
||||||
|
|
||||||
|
[tsens_tz_sensor6]
|
||||||
|
sampling 1000
|
||||||
|
thresholds 60 90 95 100 105 110 115 120
|
||||||
|
thresholds_clr 57 85 90 95 100 105 110 115
|
||||||
|
actions cpu cpu cpu cpu cpu cpu cpu shutdown
|
||||||
|
action_info 1512000 1188000 918000 756000 648000 540000 486000 5000
|
||||||
|
|
||||||
|
[tsens_tz_sensor7]
|
||||||
|
sampling 1000
|
||||||
|
thresholds 60 90 95 100 105 110 115 120
|
||||||
|
thresholds_clr 57 85 90 95 100 105 110 115
|
||||||
|
actions cpu cpu cpu cpu cpu cpu cpu shutdown
|
||||||
|
action_info 1512000 1188000 918000 756000 648000 540000 486000 5000
|
||||||
|
|
||||||
|
[tsens_tz_sensor8]
|
||||||
|
sampling 1000
|
||||||
|
thresholds 60 90 95 100 105 110 115 120
|
||||||
|
thresholds_clr 57 85 90 95 100 105 110 115
|
||||||
|
actions cpu cpu cpu cpu cpu cpu cpu shutdown
|
||||||
|
action_info 1512000 1188000 918000 756000 648000 540000 486000 5000
|
||||||
|
|
||||||
|
[tsens_tz_sensor9]
|
||||||
|
sampling 1000
|
||||||
|
thresholds 60 90 95 100 105 110 115 120
|
||||||
|
thresholds_clr 57 85 90 95 100 105 110 115
|
||||||
|
actions cpu cpu cpu cpu cpu cpu cpu shutdown
|
||||||
|
action_info 1512000 1188000 918000 756000 648000 540000 486000 5000
|
||||||
|
|
||||||
|
[tsens_tz_sensor10]
|
||||||
|
sampling 1000
|
||||||
|
thresholds 60 90 95 100 105 110 115 120
|
||||||
|
thresholds_clr 57 85 90 95 100 105 110 115
|
||||||
|
actions cpu cpu cpu cpu cpu cpu cpu shutdown
|
||||||
|
action_info 1512000 1188000 918000 756000 648000 540000 486000 5000
|
||||||
|
|
5
configs/wpa_supplicant.conf
Executable file
5
configs/wpa_supplicant.conf
Executable file
@ -0,0 +1,5 @@
|
|||||||
|
update_config=1
|
||||||
|
ctrl_interface=wlan0
|
||||||
|
eapol_version=1
|
||||||
|
ap_scan=1
|
||||||
|
fast_reauth=1
|
1
configs/wpa_supplicant_overlay.conf
Executable file
1
configs/wpa_supplicant_overlay.conf
Executable file
@ -0,0 +1 @@
|
|||||||
|
p2p_disabled=1
|
147
device.mk
Executable file
147
device.mk
Executable file
@ -0,0 +1,147 @@
|
|||||||
|
#
|
||||||
|
# Copyright (C) 2011 The CyanogenMod Project
|
||||||
|
#
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
# you may not use this file except in compliance with the License.
|
||||||
|
# You may obtain a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
# See the License for the specific language governing permissions and
|
||||||
|
# limitations under the License.
|
||||||
|
#
|
||||||
|
|
||||||
|
$(call inherit-product, $(SRC_TARGET_DIR)/product/languages_full.mk)
|
||||||
|
|
||||||
|
## Get non-open-source specific aspects
|
||||||
|
$(call inherit-product-if-exists, vendor/samsung/viennalte/viennalte-vendor.mk)
|
||||||
|
|
||||||
|
## We are a tablet, not a phone
|
||||||
|
PRODUCT_CHARACTERISTICS := tablet
|
||||||
|
|
||||||
|
## overlays
|
||||||
|
DEVICE_PACKAGE_OVERLAYS += $(LOCAL_PATH)/overlay
|
||||||
|
|
||||||
|
# Device uses high-density artwork where available
|
||||||
|
PRODUCT_AAPT_CONFIG := normal
|
||||||
|
PRODUCT_AAPT_PREF_CONFIG := xxhdpi
|
||||||
|
|
||||||
|
$(call inherit-product, frameworks/native/build/tablet-7in-xhdpi-2048-dalvik-heap.mk)
|
||||||
|
|
||||||
|
$(call inherit-product-if-exists, frameworks/native/build/phone-xxhdpi-2048-hwui-memory.mk)
|
||||||
|
|
||||||
|
# Permissions
|
||||||
|
PRODUCT_COPY_FILES += \
|
||||||
|
frameworks/native/data/etc/tablet_core_hardware.xml:system/etc/permissions/tablet_core_hardware.xml
|
||||||
|
|
||||||
|
# Audio
|
||||||
|
PRODUCT_COPY_FILES += \
|
||||||
|
$(LOCAL_PATH)/audio/audio_effects.conf:system/vendor/etc/audio_effects.conf \
|
||||||
|
$(LOCAL_PATH)/audio/audio_platform_info.xml:system/etc/audio_platform_info.xml \
|
||||||
|
$(LOCAL_PATH)/audio/audio_policy.conf:system/etc/audio_policy.conf \
|
||||||
|
$(LOCAL_PATH)/audio/mixer_paths.xml:system/etc/mixer_paths.xml \
|
||||||
|
$(LOCAL_PATH)/audio/mixer_paths.xml:system/etc/mixer_paths.xml \
|
||||||
|
$(LOCAL_PATH)/audio/audio_policy.conf:system/etc/audio_policy.conf
|
||||||
|
|
||||||
|
# Camera
|
||||||
|
PRODUCT_PACKAGES += \
|
||||||
|
camera.msm8974 \
|
||||||
|
libxml2
|
||||||
|
|
||||||
|
# GPS
|
||||||
|
PRODUCT_PACKAGES += \
|
||||||
|
gps.msm8974
|
||||||
|
|
||||||
|
PRODUCT_COPY_FILES += \
|
||||||
|
$(LOCAL_PATH)/gps/etc/gps.conf:/system/etc/gps.conf \
|
||||||
|
$(LOCAL_PATH)/gps/etc/sap.conf:/system/etc/sap.conf
|
||||||
|
|
||||||
|
# Input device
|
||||||
|
PRODUCT_COPY_FILES += \
|
||||||
|
$(LOCAL_PATH)/idc/sec_e-pen.idc:system/usr/idc/sec_e-pen.idc
|
||||||
|
|
||||||
|
# Keylayouts
|
||||||
|
PRODUCT_COPY_FILES += \
|
||||||
|
$(LOCAL_PATH)/keylayout/atmel_mxt_ts.kl:system/usr/keylayout/atmel_mxt_ts.kl \
|
||||||
|
$(LOCAL_PATH)/keylayout/Button_Jack.kl:system/usr/keylayout/Button_Jack.kl \
|
||||||
|
$(LOCAL_PATH)/keylayout/gpio-keys.kl:system/usr/keylayout/gpio-keys.kl \
|
||||||
|
$(LOCAL_PATH)/keylayout/philips_remote_ir.kl:system/usr/keylayout/philips_remote_ir.kl \
|
||||||
|
$(LOCAL_PATH)/keylayout/samsung_remote_ir.kl:system/usr/keylayout/samsung_remote_ir.kl \
|
||||||
|
$(LOCAL_PATH)/keylayout/sec_touchscreen.kl:system/usr/keylayout/sec_touchscreen.kl \
|
||||||
|
$(LOCAL_PATH)/keylayout/ue_rf4ce_remote.kl:system/usr/keylayout/ue_rf4ce_remote.kl
|
||||||
|
|
||||||
|
# Keystore
|
||||||
|
PRODUCT_PACKAGES += \
|
||||||
|
keystore.msm8974
|
||||||
|
|
||||||
|
# Lights
|
||||||
|
PRODUCT_PACKAGES += \
|
||||||
|
lights.msm8974
|
||||||
|
|
||||||
|
# Media
|
||||||
|
PRODUCT_COPY_FILES += \
|
||||||
|
$(LOCAL_PATH)/configs/media_profiles.xml:system/etc/media_profiles.xml
|
||||||
|
|
||||||
|
PRODUCT_PROPERTY_OVERRIDES += \
|
||||||
|
av.offload.enable=false
|
||||||
|
|
||||||
|
# Ramdisk
|
||||||
|
PRODUCT_PACKAGES += \
|
||||||
|
fstab.qcom \
|
||||||
|
init.carrier.rc \
|
||||||
|
init.crda.sh \
|
||||||
|
init.input.sh \
|
||||||
|
init.qcom.rc \
|
||||||
|
init.qcom.usb.rc \
|
||||||
|
init.target.rc \
|
||||||
|
ueventd.qcom.rc
|
||||||
|
|
||||||
|
# Thermal
|
||||||
|
PRODUCT_COPY_FILES += \
|
||||||
|
$(LOCAL_PATH)/configs/thermal-engine-8974.conf:system/etc/thermal-engine-8974.conf \
|
||||||
|
$(LOCAL_PATH)/configs/thermald-8974.conf:system/etc/thermald-8974.conf
|
||||||
|
|
||||||
|
# Torch
|
||||||
|
PRODUCT_PACKAGES += \
|
||||||
|
Torch
|
||||||
|
|
||||||
|
# Wifi
|
||||||
|
PRODUCT_PACKAGES += \
|
||||||
|
dhcpcd.conf \
|
||||||
|
hostapd \
|
||||||
|
hostapd_default.conf \
|
||||||
|
libwcnss_qmi \
|
||||||
|
libwpa_client \
|
||||||
|
macloader \
|
||||||
|
wcnss_service \
|
||||||
|
wpa_supplicant
|
||||||
|
|
||||||
|
#PRODUCT_COPY_FILES += \
|
||||||
|
# $(LOCAL_PATH)/configs/wpa_supplicant.conf:system/etc/wifi/wpa_supplicant.conf \
|
||||||
|
# $(LOCAL_PATH)/configs/wpa_supplicant_overlay.conf:system/etc/wifi/wpa_supplicant_overlay.conf \
|
||||||
|
# $(LOCAL_PATH)/configs/p2p_supplicant_overlay.conf:system/etc/wifi/p2p_supplicant_overlay.conf
|
||||||
|
|
||||||
|
# Boot animation
|
||||||
|
TARGET_SCREEN_WIDTH := 2560
|
||||||
|
TARGET_SCREEN_HEIGHT := 1440
|
||||||
|
|
||||||
|
# NFC doesn't exist
|
||||||
|
|
||||||
|
PRODUCT_COPY_FILES_OVERRIDES += \
|
||||||
|
system/etc/permissions/com.android.nfc_extras.xml \
|
||||||
|
system/etc/permissions/android.hardware.nfc.xml \
|
||||||
|
system/etc/permissions/android.hardware.nfc.hce.xml
|
||||||
|
|
||||||
|
# Telephony
|
||||||
|
PRODUCT_COPY_FILES += \
|
||||||
|
frameworks/native/data/etc/android.hardware.telephony.gsm.xml:system/etc/permissions/android.hardware.telephony.gsm.xml
|
||||||
|
|
||||||
|
# Wifi
|
||||||
|
PRODUCT_PACKAGES += \
|
||||||
|
libnetcmdiface
|
||||||
|
|
||||||
|
# Common msm8974
|
||||||
|
$(call inherit-product, device/samsung/msm8974-common/msm8974.mk)
|
5
extract-files.sh
Executable file
5
extract-files.sh
Executable file
@ -0,0 +1,5 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
. ../../samsung/viennalte/extract-function.sh
|
68
extract-function.sh
Executable file
68
extract-function.sh
Executable file
@ -0,0 +1,68 @@
|
|||||||
|
if [ $# -eq 0 ]; then
|
||||||
|
SRC=adb
|
||||||
|
else
|
||||||
|
if [ $# -eq 1 ]; then
|
||||||
|
SRC=$1
|
||||||
|
else
|
||||||
|
echo "$0: bad number of arguments"
|
||||||
|
echo ""
|
||||||
|
echo "usage: $0 [PATH_TO_EXPANDED_ROM]"
|
||||||
|
echo ""
|
||||||
|
echo "If PATH_TO_EXPANDED_ROM is not specified, blobs will be extracted from"
|
||||||
|
echo "the device using adb pull."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
FP=$(cd ${0%/*} && pwd -P)
|
||||||
|
export VENDOR=$(basename $(dirname $FP))
|
||||||
|
export DEVICE=$(basename $FP)
|
||||||
|
|
||||||
|
function extract() {
|
||||||
|
for FILE in `egrep -v '(^#|^$)' $1`; do
|
||||||
|
echo "Extracting /system/$FILE ..."
|
||||||
|
OLDIFS=$IFS IFS=":" PARSING_ARRAY=($FILE) IFS=$OLDIFS
|
||||||
|
FILE=`echo ${PARSING_ARRAY[0]} | sed -e "s/^-//g"`
|
||||||
|
DEST=${PARSING_ARRAY[1]}
|
||||||
|
if [ -z $DEST ]
|
||||||
|
then
|
||||||
|
DEST=$FILE
|
||||||
|
fi
|
||||||
|
DIR=`dirname $FILE`
|
||||||
|
if [ ! -d $2/$DIR ]; then
|
||||||
|
mkdir -p $2/$DIR
|
||||||
|
fi
|
||||||
|
if [ "$SRC" = "adb" ]; then
|
||||||
|
adb pull /system/$FILE $2/$DEST
|
||||||
|
# if file dot not exist try destination
|
||||||
|
if [ "$?" != "0" ]
|
||||||
|
then
|
||||||
|
adb pull /system/$DEST $2/$DEST
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
cp $SRC/system/$FILE $2/$DEST
|
||||||
|
# if file dot not exist try destination
|
||||||
|
if [ "$?" != "0" ]
|
||||||
|
then
|
||||||
|
cp $SRC/system/$DEST $2/$DEST
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
BASE_PROP=../../samsung/viennalte/proprietary-files.txt
|
||||||
|
BASE=vendor/samsung/viennalte
|
||||||
|
BASE_DIR=$BASE/proprietary
|
||||||
|
rm -rf ../../../$BASE/*
|
||||||
|
|
||||||
|
DEV_PROP=../../$VENDOR/$DEVICE/device-proprietary-files.txt
|
||||||
|
DEV_BASE=vendor/$VENDOR/$DEVICE
|
||||||
|
DEV_DIR=$DEV_BASE/proprietary
|
||||||
|
rm -rf ../../../$DEV_BASE/*
|
||||||
|
|
||||||
|
extract $BASE_PROP ../../../$BASE_DIR
|
||||||
|
extract $DEV_PROP ../../../$DEV_DIR
|
||||||
|
|
||||||
|
./../../samsung/viennalte/setup-makefiles.sh $BASE_PROP ../../../$BASE $BASE_DIR viennalte
|
||||||
|
./../../samsung/viennalte/setup-makefiles.sh $DEV_PROP ../../../$DEV_BASE $DEV_DIR $DEVICE
|
||||||
|
|
36
full_viennalte.mk
Executable file
36
full_viennalte.mk
Executable file
@ -0,0 +1,36 @@
|
|||||||
|
# Copyright (C) 2011 The Android Open Source Project
|
||||||
|
#
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
# you may not use this file except in compliance with the License.
|
||||||
|
# You may obtain a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
# See the License for the specific language governing permissions and
|
||||||
|
# limitations under the License.
|
||||||
|
|
||||||
|
#
|
||||||
|
# This file is the build configuration for a full Android
|
||||||
|
# build for viennalte hardware. This cleanly combines a set of
|
||||||
|
# device-specific aspects (drivers) with a device-agnostic
|
||||||
|
# product configuration (apps). Except for a few implementation
|
||||||
|
# details, it only fundamentally contains two inherit-product
|
||||||
|
# lines, full and viennalte, hence its name.
|
||||||
|
#
|
||||||
|
|
||||||
|
|
||||||
|
# Inherit from those products. Most specific first.
|
||||||
|
$(call inherit-product, $(SRC_TARGET_DIR)/product/full_base_telephony.mk)
|
||||||
|
|
||||||
|
# Set those variables here to overwrite the inherited values.
|
||||||
|
PRODUCT_NAME := viennalte
|
||||||
|
PRODUCT_DEVICE := viennalte
|
||||||
|
PRODUCT_BRAND := samsung
|
||||||
|
PRODUCT_MANUFACTURER := samsung
|
||||||
|
PRODUCT_MODEL := SM-P905
|
||||||
|
|
||||||
|
$(call inherit-product, device/samsung/viennalte/device.mk)
|
||||||
|
$(call inherit-product-if-exists, vendor/samsung/viennalte/viennalte-vendor.mk)
|
29
gps/Android.mk
Executable file
29
gps/Android.mk
Executable file
@ -0,0 +1,29 @@
|
|||||||
|
#
|
||||||
|
# Copyright (C) 2012 The Android Open-Source Project
|
||||||
|
#
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
# you may not use this file except in compliance with the License.
|
||||||
|
# You may obtain a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
# See the License for the specific language governing permissions and
|
||||||
|
# limitations under the License.
|
||||||
|
#
|
||||||
|
|
||||||
|
# WARNING: Everything listed here will be built on ALL platforms,
|
||||||
|
# including x86, the emulator, and the SDK. Modules must be uniquely
|
||||||
|
# named (liblights.tuna), and must build everywhere, or limit themselves
|
||||||
|
# to only building on ARM if they include assembly. Individual makefiles
|
||||||
|
# are responsible for having their own logic, for fine-grained control.
|
||||||
|
|
||||||
|
LOCAL_PATH := $(call my-dir)
|
||||||
|
|
||||||
|
ifeq ($(BOARD_VENDOR),samsung)
|
||||||
|
ifeq ($(TARGET_BOARD_PLATFORM),msm8974)
|
||||||
|
include $(call all-subdir-makefiles,$(LOCAL_PATH))
|
||||||
|
endif
|
||||||
|
endif
|
50
gps/CleanSpec.mk
Executable file
50
gps/CleanSpec.mk
Executable file
@ -0,0 +1,50 @@
|
|||||||
|
# Copyright (C) 2007 The Android Open Source Project
|
||||||
|
#
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
# you may not use this file except in compliance with the License.
|
||||||
|
# You may obtain a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
# See the License for the specific language governing permissions and
|
||||||
|
# limitations under the License.
|
||||||
|
#
|
||||||
|
|
||||||
|
# If you don't need to do a full clean build but would like to touch
|
||||||
|
# a file or delete some intermediate files, add a clean step to the end
|
||||||
|
# of the list. These steps will only be run once, if they haven't been
|
||||||
|
# run before.
|
||||||
|
#
|
||||||
|
# E.g.:
|
||||||
|
# $(call add-clean-step, touch -c external/sqlite/sqlite3.h)
|
||||||
|
# $(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/STATIC_LIBRARIES/libz_intermediates)
|
||||||
|
#
|
||||||
|
# Always use "touch -c" and "rm -f" or "rm -rf" to gracefully deal with
|
||||||
|
# files that are missing or have been moved.
|
||||||
|
#
|
||||||
|
# Use $(PRODUCT_OUT) to get to the "out/target/product/blah/" directory.
|
||||||
|
# Use $(OUT_DIR) to refer to the "out" directory.
|
||||||
|
#
|
||||||
|
# If you need to re-do something that's already mentioned, just copy
|
||||||
|
# the command and add it to the bottom of the list. E.g., if a change
|
||||||
|
# that you made last week required touching a file and a change you
|
||||||
|
# made today requires touching the same file, just copy the old
|
||||||
|
# touch step and add it to the end of the list.
|
||||||
|
#
|
||||||
|
# ************************************************
|
||||||
|
# NEWER CLEAN STEPS MUST BE AT THE END OF THE LIST
|
||||||
|
# ************************************************
|
||||||
|
|
||||||
|
# For example:
|
||||||
|
#$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/APPS/AndroidTests_intermediates)
|
||||||
|
#$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/core_intermediates)
|
||||||
|
#$(call add-clean-step, find $(OUT_DIR) -type f -name "IGTalkSession*" -print0 | xargs -0 rm -f)
|
||||||
|
#$(call add-clean-step, rm -rf $(PRODUCT_OUT)/data/*)
|
||||||
|
|
||||||
|
# ************************************************
|
||||||
|
# NEWER CLEAN STEPS MUST BE AT THE END OF THE LIST
|
||||||
|
# ************************************************
|
||||||
|
$(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/SHARED_LIBRARIES/libloc_api*)
|
50
gps/core/Android.mk
Executable file
50
gps/core/Android.mk
Executable file
@ -0,0 +1,50 @@
|
|||||||
|
ifneq ($(BUILD_TINY_ANDROID),true)
|
||||||
|
|
||||||
|
LOCAL_PATH := $(call my-dir)
|
||||||
|
|
||||||
|
include $(CLEAR_VARS)
|
||||||
|
|
||||||
|
LOCAL_MODULE := libloc_core
|
||||||
|
LOCAL_MODULE_OWNER := qcom
|
||||||
|
|
||||||
|
LOCAL_MODULE_TAGS := optional
|
||||||
|
|
||||||
|
LOCAL_SHARED_LIBRARIES := \
|
||||||
|
libutils \
|
||||||
|
libcutils \
|
||||||
|
libgps.utils \
|
||||||
|
libdl
|
||||||
|
|
||||||
|
LOCAL_SRC_FILES += \
|
||||||
|
MsgTask.cpp \
|
||||||
|
LocApiBase.cpp \
|
||||||
|
LocAdapterBase.cpp \
|
||||||
|
ContextBase.cpp \
|
||||||
|
LocDualContext.cpp \
|
||||||
|
loc_core_log.cpp
|
||||||
|
|
||||||
|
LOCAL_CFLAGS += \
|
||||||
|
-fno-short-enums \
|
||||||
|
-D_ANDROID_
|
||||||
|
|
||||||
|
LOCAL_C_INCLUDES:= \
|
||||||
|
$(TARGET_OUT_HEADERS)/gps.utils
|
||||||
|
|
||||||
|
LOCAL_COPY_HEADERS_TO:= libloc_core/
|
||||||
|
LOCAL_COPY_HEADERS:= \
|
||||||
|
MsgTask.h \
|
||||||
|
LocApiBase.h \
|
||||||
|
LocAdapterBase.h \
|
||||||
|
ContextBase.h \
|
||||||
|
LocDualContext.h \
|
||||||
|
LBSProxyBase.h \
|
||||||
|
UlpProxyBase.h \
|
||||||
|
gps_extended_c.h \
|
||||||
|
gps_extended.h \
|
||||||
|
loc_core_log.h
|
||||||
|
|
||||||
|
LOCAL_PRELINK_MODULE := false
|
||||||
|
|
||||||
|
include $(BUILD_SHARED_LIBRARY)
|
||||||
|
|
||||||
|
endif # not BUILD_TINY_ANDROID
|
99
gps/core/ContextBase.cpp
Executable file
99
gps/core/ContextBase.cpp
Executable file
@ -0,0 +1,99 @@
|
|||||||
|
/* Copyright (c) 2011-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.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#define LOG_NDDEBUG 0
|
||||||
|
#define LOG_TAG "LocSvc_CtxBase"
|
||||||
|
|
||||||
|
#include <dlfcn.h>
|
||||||
|
#include <cutils/sched_policy.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <ContextBase.h>
|
||||||
|
#include <msg_q.h>
|
||||||
|
#include <loc_target.h>
|
||||||
|
#include <log_util.h>
|
||||||
|
#include <loc_log.h>
|
||||||
|
|
||||||
|
namespace loc_core {
|
||||||
|
|
||||||
|
LBSProxyBase* ContextBase::getLBSProxy(const char* libName)
|
||||||
|
{
|
||||||
|
LBSProxyBase* proxy = NULL;
|
||||||
|
LOC_LOGD("%s:%d]: getLBSProxy libname: %s\n", __func__, __LINE__, libName);
|
||||||
|
void* lib = dlopen(libName, RTLD_NOW);
|
||||||
|
|
||||||
|
if ((void*)NULL != lib) {
|
||||||
|
getLBSProxy_t* getter = (getLBSProxy_t*)dlsym(lib, "getLBSProxy");
|
||||||
|
if (NULL != getter) {
|
||||||
|
proxy = (*getter)();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (NULL == proxy) {
|
||||||
|
proxy = new LBSProxyBase();
|
||||||
|
}
|
||||||
|
LOC_LOGD("%s:%d]: Exiting\n", __func__, __LINE__);
|
||||||
|
return proxy;
|
||||||
|
}
|
||||||
|
|
||||||
|
LocApiBase* ContextBase::createLocApi(LOC_API_ADAPTER_EVENT_MASK_T exMask)
|
||||||
|
{
|
||||||
|
LocApiBase* locApi = NULL;
|
||||||
|
|
||||||
|
// first if can not be MPQ
|
||||||
|
if (TARGET_MPQ != loc_get_target()) {
|
||||||
|
if (NULL == (locApi = mLBSProxy->getLocApi(mMsgTask, exMask))) {
|
||||||
|
// only RPC is the option now
|
||||||
|
void* handle = dlopen("libloc_api-rpc-qc.so", RTLD_NOW);
|
||||||
|
if (NULL != handle) {
|
||||||
|
getLocApi_t* getter = (getLocApi_t*)dlsym(handle, "getLocApi");
|
||||||
|
if (NULL != getter) {
|
||||||
|
locApi = (*getter)(mMsgTask, exMask);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// locApi could still be NULL at this time
|
||||||
|
// we would then create a dummy one
|
||||||
|
if (NULL == locApi) {
|
||||||
|
locApi = new LocApiBase(mMsgTask, exMask);
|
||||||
|
}
|
||||||
|
|
||||||
|
return locApi;
|
||||||
|
}
|
||||||
|
|
||||||
|
ContextBase::ContextBase(const MsgTask* msgTask,
|
||||||
|
LOC_API_ADAPTER_EVENT_MASK_T exMask,
|
||||||
|
const char* libName) :
|
||||||
|
mLBSProxy(getLBSProxy(libName)),
|
||||||
|
mMsgTask(msgTask),
|
||||||
|
mLocApi(createLocApi(exMask)),
|
||||||
|
mLocApiProxy(mLocApi->getLocApiProxy())
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
69
gps/core/ContextBase.h
Executable file
69
gps/core/ContextBase.h
Executable file
@ -0,0 +1,69 @@
|
|||||||
|
/* Copyright (c) 2011-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_CONTEXT_BASE__
|
||||||
|
#define __LOC_CONTEXT_BASE__
|
||||||
|
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <MsgTask.h>
|
||||||
|
#include <LocApiBase.h>
|
||||||
|
#include <LBSProxyBase.h>
|
||||||
|
|
||||||
|
namespace loc_core {
|
||||||
|
|
||||||
|
class LocAdapterBase;
|
||||||
|
|
||||||
|
class ContextBase {
|
||||||
|
static LBSProxyBase* getLBSProxy(const char* libName);
|
||||||
|
LocApiBase* createLocApi(LOC_API_ADAPTER_EVENT_MASK_T excludedMask);
|
||||||
|
protected:
|
||||||
|
const LBSProxyBase* mLBSProxy;
|
||||||
|
const MsgTask* mMsgTask;
|
||||||
|
LocApiBase* mLocApi;
|
||||||
|
LocApiProxyBase *mLocApiProxy;
|
||||||
|
public:
|
||||||
|
ContextBase(const MsgTask* msgTask,
|
||||||
|
LOC_API_ADAPTER_EVENT_MASK_T exMask,
|
||||||
|
const char* libName);
|
||||||
|
inline virtual ~ContextBase() { delete mLocApi; delete mLBSProxy; }
|
||||||
|
|
||||||
|
inline const MsgTask* getMsgTask() { return mMsgTask; }
|
||||||
|
inline LocApiBase* getLocApi() { return mLocApi; }
|
||||||
|
inline LocApiProxyBase* getLocApiProxy() { return mLocApiProxy; }
|
||||||
|
inline bool hasAgpsExt() { return mLBSProxy->hasAgpsExt(); }
|
||||||
|
inline bool hasCPIExt() { return mLBSProxy->hasCPIExt(); }
|
||||||
|
inline void requestUlp(LocAdapterBase* adapter,
|
||||||
|
unsigned long capabilities) {
|
||||||
|
mLBSProxy->requestUlp(adapter, capabilities);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace loc_core
|
||||||
|
|
||||||
|
#endif //__LOC_CONTEXT_BASE__
|
60
gps/core/LBSProxyBase.h
Executable file
60
gps/core/LBSProxyBase.h
Executable file
@ -0,0 +1,60 @@
|
|||||||
|
/* 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 IZAT_PROXY_BASE_H
|
||||||
|
#define IZAT_PROXY_BASE_H
|
||||||
|
#include <gps_extended.h>
|
||||||
|
#include <MsgTask.h>
|
||||||
|
|
||||||
|
namespace loc_core {
|
||||||
|
|
||||||
|
class LocApiBase;
|
||||||
|
class LocAdapterBase;
|
||||||
|
|
||||||
|
class LBSProxyBase {
|
||||||
|
friend class ContextBase;
|
||||||
|
inline virtual LocApiBase*
|
||||||
|
getLocApi(const MsgTask* msgTask,
|
||||||
|
LOC_API_ADAPTER_EVENT_MASK_T exMask) const {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
protected:
|
||||||
|
inline LBSProxyBase() {}
|
||||||
|
public:
|
||||||
|
inline virtual ~LBSProxyBase() {}
|
||||||
|
inline virtual void requestUlp(LocAdapterBase* adapter,
|
||||||
|
unsigned long capabilities) const {}
|
||||||
|
inline virtual bool hasAgpsExt() const { return false; }
|
||||||
|
inline virtual bool hasCPIExt() const { return false; }
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef LBSProxyBase* (getLBSProxy_t)();
|
||||||
|
|
||||||
|
} // namespace loc_core
|
||||||
|
|
||||||
|
#endif // IZAT_PROXY_BASE_H
|
119
gps/core/LocAdapterBase.cpp
Executable file
119
gps/core/LocAdapterBase.cpp
Executable file
@ -0,0 +1,119 @@
|
|||||||
|
/* Copyright (c) 2011-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.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#define LOG_NDDEBUG 0
|
||||||
|
#define LOG_TAG "LocSvc_LocAdapterBase"
|
||||||
|
|
||||||
|
#include <dlfcn.h>
|
||||||
|
#include <LocAdapterBase.h>
|
||||||
|
#include <loc_target.h>
|
||||||
|
#include <log_util.h>
|
||||||
|
|
||||||
|
namespace loc_core {
|
||||||
|
|
||||||
|
// This is the top level class, so the constructor will
|
||||||
|
// always gets called. Here we prepare for the default.
|
||||||
|
// But if getLocApi(targetEnumType target) is overriden,
|
||||||
|
// the right locApi should get created.
|
||||||
|
LocAdapterBase::LocAdapterBase(const LOC_API_ADAPTER_EVENT_MASK_T mask,
|
||||||
|
ContextBase* context) :
|
||||||
|
mEvtMask(mask), mContext(context),
|
||||||
|
mLocApi(context->getLocApi()), mMsgTask(context->getMsgTask())
|
||||||
|
{
|
||||||
|
mLocApi->addAdapter(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
void LocAdapterBase::
|
||||||
|
handleEngineDownEvent()
|
||||||
|
DEFAULT_IMPL()
|
||||||
|
|
||||||
|
void LocAdapterBase::
|
||||||
|
reportPosition(UlpLocation &location,
|
||||||
|
GpsLocationExtended &locationExtended,
|
||||||
|
void* locationExt,
|
||||||
|
enum loc_sess_status status,
|
||||||
|
LocPosTechMask loc_technology_mask)
|
||||||
|
DEFAULT_IMPL()
|
||||||
|
|
||||||
|
void LocAdapterBase::
|
||||||
|
reportSv(GpsSvStatus &svStatus,
|
||||||
|
GpsLocationExtended &locationExtended,
|
||||||
|
void* svExt)
|
||||||
|
DEFAULT_IMPL()
|
||||||
|
|
||||||
|
|
||||||
|
void LocAdapterBase::
|
||||||
|
reportStatus(GpsStatusValue status)
|
||||||
|
DEFAULT_IMPL()
|
||||||
|
|
||||||
|
|
||||||
|
void LocAdapterBase::
|
||||||
|
reportNmea(const char* nmea, int length)
|
||||||
|
DEFAULT_IMPL()
|
||||||
|
|
||||||
|
bool LocAdapterBase::
|
||||||
|
reportXtraServer(const char* url1, const char* url2,
|
||||||
|
const char* url3, const int maxlength)
|
||||||
|
DEFAULT_IMPL(false)
|
||||||
|
|
||||||
|
bool LocAdapterBase::
|
||||||
|
requestXtraData()
|
||||||
|
DEFAULT_IMPL(false)
|
||||||
|
|
||||||
|
bool LocAdapterBase::
|
||||||
|
requestTime()
|
||||||
|
DEFAULT_IMPL(false)
|
||||||
|
|
||||||
|
bool LocAdapterBase::
|
||||||
|
requestLocation()
|
||||||
|
DEFAULT_IMPL(false)
|
||||||
|
|
||||||
|
bool LocAdapterBase::
|
||||||
|
requestATL(int connHandle, AGpsType agps_type)
|
||||||
|
DEFAULT_IMPL(false)
|
||||||
|
|
||||||
|
bool LocAdapterBase::
|
||||||
|
releaseATL(int connHandle)
|
||||||
|
DEFAULT_IMPL(false)
|
||||||
|
|
||||||
|
bool LocAdapterBase::
|
||||||
|
requestSuplES(int connHandle)
|
||||||
|
DEFAULT_IMPL(false)
|
||||||
|
|
||||||
|
bool LocAdapterBase::
|
||||||
|
reportDataCallOpened()
|
||||||
|
DEFAULT_IMPL(false)
|
||||||
|
|
||||||
|
bool LocAdapterBase::
|
||||||
|
reportDataCallClosed()
|
||||||
|
DEFAULT_IMPL(false)
|
||||||
|
|
||||||
|
bool LocAdapterBase::
|
||||||
|
requestNiNotify(GpsNiNotification ¬ify, const void* data)
|
||||||
|
DEFAULT_IMPL(false)
|
||||||
|
} // namespace loc_core
|
104
gps/core/LocAdapterBase.h
Executable file
104
gps/core/LocAdapterBase.h
Executable file
@ -0,0 +1,104 @@
|
|||||||
|
/* Copyright (c) 2011-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_API_ADAPTER_BASE_H
|
||||||
|
#define LOC_API_ADAPTER_BASE_H
|
||||||
|
|
||||||
|
#include <gps_extended.h>
|
||||||
|
#include <UlpProxyBase.h>
|
||||||
|
#include <ContextBase.h>
|
||||||
|
|
||||||
|
namespace loc_core {
|
||||||
|
|
||||||
|
class LocAdapterBase {
|
||||||
|
protected:
|
||||||
|
const LOC_API_ADAPTER_EVENT_MASK_T mEvtMask;
|
||||||
|
ContextBase* mContext;
|
||||||
|
LocApiBase* mLocApi;
|
||||||
|
const MsgTask* mMsgTask;
|
||||||
|
|
||||||
|
inline LocAdapterBase(const MsgTask* msgTask) :
|
||||||
|
mEvtMask(0), mContext(NULL), mLocApi(NULL), mMsgTask(msgTask) {}
|
||||||
|
public:
|
||||||
|
inline virtual ~LocAdapterBase() { mLocApi->removeAdapter(this); }
|
||||||
|
LocAdapterBase(const LOC_API_ADAPTER_EVENT_MASK_T mask,
|
||||||
|
ContextBase* context);
|
||||||
|
inline LOC_API_ADAPTER_EVENT_MASK_T
|
||||||
|
checkMask(LOC_API_ADAPTER_EVENT_MASK_T mask) const {
|
||||||
|
return mEvtMask & mask;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline LOC_API_ADAPTER_EVENT_MASK_T getEvtMask() const {
|
||||||
|
return mEvtMask;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void sendMsg(const LocMsg* msg) const {
|
||||||
|
mMsgTask->sendMsg(msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void sendMsg(const LocMsg* msg) {
|
||||||
|
mMsgTask->sendMsg(msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
// This will be overridden by the individual adapters
|
||||||
|
// if necessary.
|
||||||
|
inline virtual void setUlpProxy(UlpProxyBase* ulp) {}
|
||||||
|
inline virtual void handleEngineUpEvent() {}
|
||||||
|
virtual void handleEngineDownEvent();
|
||||||
|
inline virtual void setPositionModeInt(LocPosMode& posMode) {}
|
||||||
|
virtual void startFixInt() {}
|
||||||
|
virtual void stopFixInt() {}
|
||||||
|
virtual void getZppInt() {}
|
||||||
|
virtual void reportPosition(UlpLocation &location,
|
||||||
|
GpsLocationExtended &locationExtended,
|
||||||
|
void* locationExt,
|
||||||
|
enum loc_sess_status status,
|
||||||
|
LocPosTechMask loc_technology_mask);
|
||||||
|
virtual void reportSv(GpsSvStatus &svStatus,
|
||||||
|
GpsLocationExtended &locationExtended,
|
||||||
|
void* svExt);
|
||||||
|
virtual void reportStatus(GpsStatusValue status);
|
||||||
|
virtual void reportNmea(const char* nmea, int length);
|
||||||
|
virtual bool reportXtraServer(const char* url1, const char* url2,
|
||||||
|
const char* url3, const int maxlength);
|
||||||
|
virtual bool requestXtraData();
|
||||||
|
virtual bool requestTime();
|
||||||
|
virtual bool requestLocation();
|
||||||
|
virtual bool requestATL(int connHandle, AGpsType agps_type);
|
||||||
|
virtual bool releaseATL(int connHandle);
|
||||||
|
virtual bool requestSuplES(int connHandle);
|
||||||
|
virtual bool reportDataCallOpened();
|
||||||
|
virtual bool reportDataCallClosed();
|
||||||
|
virtual bool requestNiNotify(GpsNiNotification ¬ify,
|
||||||
|
const void* data);
|
||||||
|
inline virtual bool isInSession() { return false; }
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace loc_core
|
||||||
|
|
||||||
|
#endif //LOC_API_ADAPTER_BASE_H
|
475
gps/core/LocApiBase.cpp
Executable file
475
gps/core/LocApiBase.cpp
Executable file
@ -0,0 +1,475 @@
|
|||||||
|
/* Copyright (c) 2011-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.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#define LOG_NDDEBUG 0
|
||||||
|
#define LOG_TAG "LocSvc_LocApiBase"
|
||||||
|
|
||||||
|
#include <dlfcn.h>
|
||||||
|
#include <LocApiBase.h>
|
||||||
|
#include <LocAdapterBase.h>
|
||||||
|
#include <log_util.h>
|
||||||
|
|
||||||
|
namespace loc_core {
|
||||||
|
|
||||||
|
#define TO_ALL_LOCADAPTERS(call) TO_ALL_ADAPTERS(mLocAdapters, (call))
|
||||||
|
#define TO_1ST_HANDLING_LOCADAPTERS(call) TO_1ST_HANDLING_ADAPTER(mLocAdapters, (call))
|
||||||
|
|
||||||
|
int hexcode(char *hexstring, int string_size,
|
||||||
|
const char *data, int data_size)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < data_size; i++)
|
||||||
|
{
|
||||||
|
char ch = data[i];
|
||||||
|
if (i*2 + 3 <= string_size)
|
||||||
|
{
|
||||||
|
snprintf(&hexstring[i*2], 3, "%02X", ch);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
int decodeAddress(char *addr_string, int string_size,
|
||||||
|
const char *data, int data_size)
|
||||||
|
{
|
||||||
|
const char addr_prefix = 0x91;
|
||||||
|
int i, idxOutput = 0;
|
||||||
|
|
||||||
|
if (!data || !addr_string) { return 0; }
|
||||||
|
|
||||||
|
if (data[0] != addr_prefix)
|
||||||
|
{
|
||||||
|
LOC_LOGW("decodeAddress: address prefix is not 0x%x but 0x%x", addr_prefix, data[0]);
|
||||||
|
addr_string[0] = '\0';
|
||||||
|
return 0; // prefix not correct
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 1; i < data_size; i++)
|
||||||
|
{
|
||||||
|
unsigned char ch = data[i], low = ch & 0x0F, hi = ch >> 4;
|
||||||
|
if (low <= 9 && idxOutput < string_size - 1) { addr_string[idxOutput++] = low + '0'; }
|
||||||
|
if (hi <= 9 && idxOutput < string_size - 1) { addr_string[idxOutput++] = hi + '0'; }
|
||||||
|
}
|
||||||
|
|
||||||
|
addr_string[idxOutput] = '\0'; // Terminates the string
|
||||||
|
|
||||||
|
return idxOutput;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct LocSsrMsg : public LocMsg {
|
||||||
|
LocApiBase* mLocApi;
|
||||||
|
inline LocSsrMsg(LocApiBase* locApi) :
|
||||||
|
LocMsg(), mLocApi(locApi)
|
||||||
|
{
|
||||||
|
locallog();
|
||||||
|
}
|
||||||
|
inline virtual void proc() const {
|
||||||
|
mLocApi->close();
|
||||||
|
mLocApi->open(mLocApi->getEvtMask());
|
||||||
|
}
|
||||||
|
inline void locallog() {
|
||||||
|
LOC_LOGV("LocSsrMsg");
|
||||||
|
}
|
||||||
|
inline virtual void log() {
|
||||||
|
locallog();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
struct LocOpenMsg : public LocMsg {
|
||||||
|
LocApiBase* mLocApi;
|
||||||
|
LOC_API_ADAPTER_EVENT_MASK_T mMask;
|
||||||
|
inline LocOpenMsg(LocApiBase* locApi,
|
||||||
|
LOC_API_ADAPTER_EVENT_MASK_T mask) :
|
||||||
|
LocMsg(), mLocApi(locApi), mMask(mask)
|
||||||
|
{
|
||||||
|
locallog();
|
||||||
|
}
|
||||||
|
inline virtual void proc() const {
|
||||||
|
mLocApi->open(mMask);
|
||||||
|
}
|
||||||
|
inline void locallog() {
|
||||||
|
LOC_LOGV("%s:%d]: LocOpen Mask: %x\n",
|
||||||
|
__func__, __LINE__, mMask);
|
||||||
|
}
|
||||||
|
inline virtual void log() {
|
||||||
|
locallog();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
LocApiBase::LocApiBase(const MsgTask* msgTask,
|
||||||
|
LOC_API_ADAPTER_EVENT_MASK_T excludedMask) :
|
||||||
|
mExcludedMask(excludedMask), mMsgTask(msgTask), mMask(0)
|
||||||
|
{
|
||||||
|
memset(mLocAdapters, 0, sizeof(mLocAdapters));
|
||||||
|
}
|
||||||
|
|
||||||
|
LOC_API_ADAPTER_EVENT_MASK_T LocApiBase::getEvtMask()
|
||||||
|
{
|
||||||
|
LOC_API_ADAPTER_EVENT_MASK_T mask = 0;
|
||||||
|
|
||||||
|
TO_ALL_LOCADAPTERS(mask |= mLocAdapters[i]->getEvtMask());
|
||||||
|
|
||||||
|
return mask & ~mExcludedMask;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool LocApiBase::isInSession()
|
||||||
|
{
|
||||||
|
bool inSession = false;
|
||||||
|
|
||||||
|
for (int i = 0;
|
||||||
|
!inSession && i < MAX_ADAPTERS && NULL != mLocAdapters[i];
|
||||||
|
i++) {
|
||||||
|
inSession = mLocAdapters[i]->isInSession();
|
||||||
|
}
|
||||||
|
|
||||||
|
return inSession;
|
||||||
|
}
|
||||||
|
|
||||||
|
void LocApiBase::addAdapter(LocAdapterBase* adapter)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < MAX_ADAPTERS && mLocAdapters[i] != adapter; i++) {
|
||||||
|
if (mLocAdapters[i] == NULL) {
|
||||||
|
mLocAdapters[i] = adapter;
|
||||||
|
mMsgTask->sendMsg(new LocOpenMsg(this,
|
||||||
|
(adapter->getEvtMask())));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void LocApiBase::removeAdapter(LocAdapterBase* adapter)
|
||||||
|
{
|
||||||
|
for (int i = 0;
|
||||||
|
i < MAX_ADAPTERS && NULL != mLocAdapters[i];
|
||||||
|
i++) {
|
||||||
|
if (mLocAdapters[i] == adapter) {
|
||||||
|
mLocAdapters[i] = NULL;
|
||||||
|
|
||||||
|
// shift the rest of the adapters up so that the pointers
|
||||||
|
// in the array do not have holes. This should be more
|
||||||
|
// performant, because the array maintenance is much much
|
||||||
|
// less frequent than event handlings, which need to linear
|
||||||
|
// search all the adapters
|
||||||
|
int j = i;
|
||||||
|
while (++i < MAX_ADAPTERS && mLocAdapters[i] != NULL);
|
||||||
|
|
||||||
|
// i would be MAX_ADAPTERS or point to a NULL
|
||||||
|
i--;
|
||||||
|
// i now should point to a none NULL adapter within valid
|
||||||
|
// range although i could be equal to j, but it won't hurt.
|
||||||
|
// No need to check it, as it gains nothing.
|
||||||
|
mLocAdapters[j] = mLocAdapters[i];
|
||||||
|
// this makes sure that we exit the for loop
|
||||||
|
mLocAdapters[i] = NULL;
|
||||||
|
|
||||||
|
// if we have an empty list of adapters
|
||||||
|
if (0 == i) {
|
||||||
|
close();
|
||||||
|
} else {
|
||||||
|
// else we need to remove the bit
|
||||||
|
mMsgTask->sendMsg(new LocOpenMsg(this, getEvtMask()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void LocApiBase::handleEngineUpEvent()
|
||||||
|
{
|
||||||
|
// This will take care of renegotiating the loc handle
|
||||||
|
mMsgTask->sendMsg(new LocSsrMsg(this));
|
||||||
|
|
||||||
|
// loop through adapters, and deliver to all adapters.
|
||||||
|
TO_ALL_LOCADAPTERS(mLocAdapters[i]->handleEngineUpEvent());
|
||||||
|
}
|
||||||
|
|
||||||
|
void LocApiBase::handleEngineDownEvent()
|
||||||
|
{
|
||||||
|
// loop through adapters, and deliver to all adapters.
|
||||||
|
TO_ALL_LOCADAPTERS(mLocAdapters[i]->handleEngineDownEvent());
|
||||||
|
}
|
||||||
|
|
||||||
|
void LocApiBase::reportPosition(UlpLocation &location,
|
||||||
|
GpsLocationExtended &locationExtended,
|
||||||
|
void* locationExt,
|
||||||
|
enum loc_sess_status status,
|
||||||
|
LocPosTechMask loc_technology_mask)
|
||||||
|
{
|
||||||
|
// loop through adapters, and deliver to all adapters.
|
||||||
|
TO_ALL_LOCADAPTERS(
|
||||||
|
mLocAdapters[i]->reportPosition(location,
|
||||||
|
locationExtended,
|
||||||
|
locationExt,
|
||||||
|
status,
|
||||||
|
loc_technology_mask)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
void LocApiBase::reportSv(GpsSvStatus &svStatus,
|
||||||
|
GpsLocationExtended &locationExtended,
|
||||||
|
void* svExt)
|
||||||
|
{
|
||||||
|
// loop through adapters, and deliver to all adapters.
|
||||||
|
TO_ALL_LOCADAPTERS(
|
||||||
|
mLocAdapters[i]->reportSv(svStatus,
|
||||||
|
locationExtended,
|
||||||
|
svExt)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
void LocApiBase::reportStatus(GpsStatusValue status)
|
||||||
|
{
|
||||||
|
// loop through adapters, and deliver to all adapters.
|
||||||
|
TO_ALL_LOCADAPTERS(mLocAdapters[i]->reportStatus(status));
|
||||||
|
}
|
||||||
|
|
||||||
|
void LocApiBase::reportNmea(const char* nmea, int length)
|
||||||
|
{
|
||||||
|
// loop through adapters, and deliver to all adapters.
|
||||||
|
TO_ALL_LOCADAPTERS(mLocAdapters[i]->reportNmea(nmea, length));
|
||||||
|
}
|
||||||
|
|
||||||
|
void LocApiBase::reportXtraServer(const char* url1, const char* url2,
|
||||||
|
const char* url3, const int maxlength)
|
||||||
|
{
|
||||||
|
// loop through adapters, and deliver to the first handling adapter.
|
||||||
|
TO_1ST_HANDLING_LOCADAPTERS(mLocAdapters[i]->reportXtraServer(url1, url2, url3, maxlength));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void LocApiBase::requestXtraData()
|
||||||
|
{
|
||||||
|
// loop through adapters, and deliver to the first handling adapter.
|
||||||
|
TO_1ST_HANDLING_LOCADAPTERS(mLocAdapters[i]->requestXtraData());
|
||||||
|
}
|
||||||
|
|
||||||
|
void LocApiBase::requestTime()
|
||||||
|
{
|
||||||
|
// loop through adapters, and deliver to the first handling adapter.
|
||||||
|
TO_1ST_HANDLING_LOCADAPTERS(mLocAdapters[i]->requestTime());
|
||||||
|
}
|
||||||
|
|
||||||
|
void LocApiBase::requestLocation()
|
||||||
|
{
|
||||||
|
// loop through adapters, and deliver to the first handling adapter.
|
||||||
|
TO_1ST_HANDLING_LOCADAPTERS(mLocAdapters[i]->requestLocation());
|
||||||
|
}
|
||||||
|
|
||||||
|
void LocApiBase::requestATL(int connHandle, AGpsType agps_type)
|
||||||
|
{
|
||||||
|
// loop through adapters, and deliver to the first handling adapter.
|
||||||
|
TO_1ST_HANDLING_LOCADAPTERS(mLocAdapters[i]->requestATL(connHandle, agps_type));
|
||||||
|
}
|
||||||
|
|
||||||
|
void LocApiBase::releaseATL(int connHandle)
|
||||||
|
{
|
||||||
|
// loop through adapters, and deliver to the first handling adapter.
|
||||||
|
TO_1ST_HANDLING_LOCADAPTERS(mLocAdapters[i]->releaseATL(connHandle));
|
||||||
|
}
|
||||||
|
|
||||||
|
void LocApiBase::requestSuplES(int connHandle)
|
||||||
|
{
|
||||||
|
// loop through adapters, and deliver to the first handling adapter.
|
||||||
|
TO_1ST_HANDLING_LOCADAPTERS(mLocAdapters[i]->requestSuplES(connHandle));
|
||||||
|
}
|
||||||
|
|
||||||
|
void LocApiBase::reportDataCallOpened()
|
||||||
|
{
|
||||||
|
// loop through adapters, and deliver to the first handling adapter.
|
||||||
|
TO_1ST_HANDLING_LOCADAPTERS(mLocAdapters[i]->reportDataCallOpened());
|
||||||
|
}
|
||||||
|
|
||||||
|
void LocApiBase::reportDataCallClosed()
|
||||||
|
{
|
||||||
|
// loop through adapters, and deliver to the first handling adapter.
|
||||||
|
TO_1ST_HANDLING_LOCADAPTERS(mLocAdapters[i]->reportDataCallClosed());
|
||||||
|
}
|
||||||
|
|
||||||
|
void LocApiBase::requestNiNotify(GpsNiNotification ¬ify, const void* data)
|
||||||
|
{
|
||||||
|
// loop through adapters, and deliver to the first handling adapter.
|
||||||
|
TO_1ST_HANDLING_LOCADAPTERS(mLocAdapters[i]->requestNiNotify(notify, data));
|
||||||
|
}
|
||||||
|
|
||||||
|
void* LocApiBase :: getSibling()
|
||||||
|
DEFAULT_IMPL(NULL)
|
||||||
|
|
||||||
|
LocApiProxyBase* LocApiBase :: getLocApiProxy()
|
||||||
|
DEFAULT_IMPL(NULL)
|
||||||
|
|
||||||
|
enum loc_api_adapter_err LocApiBase::
|
||||||
|
open(LOC_API_ADAPTER_EVENT_MASK_T mask)
|
||||||
|
DEFAULT_IMPL(LOC_API_ADAPTER_ERR_SUCCESS)
|
||||||
|
|
||||||
|
enum loc_api_adapter_err LocApiBase::
|
||||||
|
close()
|
||||||
|
DEFAULT_IMPL(LOC_API_ADAPTER_ERR_SUCCESS)
|
||||||
|
|
||||||
|
enum loc_api_adapter_err LocApiBase::
|
||||||
|
startFix(const LocPosMode& posMode)
|
||||||
|
DEFAULT_IMPL(LOC_API_ADAPTER_ERR_SUCCESS)
|
||||||
|
|
||||||
|
enum loc_api_adapter_err LocApiBase::
|
||||||
|
stopFix()
|
||||||
|
DEFAULT_IMPL(LOC_API_ADAPTER_ERR_SUCCESS)
|
||||||
|
|
||||||
|
enum loc_api_adapter_err LocApiBase::
|
||||||
|
deleteAidingData(GpsAidingData f)
|
||||||
|
DEFAULT_IMPL(LOC_API_ADAPTER_ERR_SUCCESS)
|
||||||
|
|
||||||
|
enum loc_api_adapter_err LocApiBase::
|
||||||
|
enableData(int enable)
|
||||||
|
DEFAULT_IMPL(LOC_API_ADAPTER_ERR_SUCCESS)
|
||||||
|
|
||||||
|
enum loc_api_adapter_err LocApiBase::
|
||||||
|
setAPN(char* apn, int len)
|
||||||
|
DEFAULT_IMPL(LOC_API_ADAPTER_ERR_SUCCESS)
|
||||||
|
|
||||||
|
enum loc_api_adapter_err LocApiBase::
|
||||||
|
injectPosition(double latitude, double longitude, float accuracy)
|
||||||
|
DEFAULT_IMPL(LOC_API_ADAPTER_ERR_SUCCESS)
|
||||||
|
|
||||||
|
enum loc_api_adapter_err LocApiBase::
|
||||||
|
setTime(GpsUtcTime time, int64_t timeReference, int uncertainty)
|
||||||
|
DEFAULT_IMPL(LOC_API_ADAPTER_ERR_SUCCESS)
|
||||||
|
|
||||||
|
enum loc_api_adapter_err LocApiBase::
|
||||||
|
setXtraData(char* data, int length)
|
||||||
|
DEFAULT_IMPL(LOC_API_ADAPTER_ERR_SUCCESS)
|
||||||
|
|
||||||
|
enum loc_api_adapter_err LocApiBase::
|
||||||
|
requestXtraServer()
|
||||||
|
DEFAULT_IMPL(LOC_API_ADAPTER_ERR_SUCCESS)
|
||||||
|
|
||||||
|
enum loc_api_adapter_err LocApiBase::
|
||||||
|
atlOpenStatus(int handle, int is_succ, char* apn,
|
||||||
|
ApnIpType bear, AGpsType agpsType)
|
||||||
|
DEFAULT_IMPL(LOC_API_ADAPTER_ERR_SUCCESS)
|
||||||
|
|
||||||
|
enum loc_api_adapter_err LocApiBase::
|
||||||
|
atlCloseStatus(int handle, int is_succ)
|
||||||
|
DEFAULT_IMPL(LOC_API_ADAPTER_ERR_SUCCESS)
|
||||||
|
|
||||||
|
enum loc_api_adapter_err LocApiBase::
|
||||||
|
setPositionMode(const LocPosMode& posMode)
|
||||||
|
DEFAULT_IMPL(LOC_API_ADAPTER_ERR_SUCCESS)
|
||||||
|
|
||||||
|
enum loc_api_adapter_err LocApiBase::
|
||||||
|
setServer(const char* url, int len)
|
||||||
|
DEFAULT_IMPL(LOC_API_ADAPTER_ERR_SUCCESS)
|
||||||
|
|
||||||
|
enum loc_api_adapter_err LocApiBase::
|
||||||
|
setServer(unsigned int ip, int port,
|
||||||
|
LocServerType type)
|
||||||
|
DEFAULT_IMPL(LOC_API_ADAPTER_ERR_SUCCESS)
|
||||||
|
|
||||||
|
enum loc_api_adapter_err LocApiBase::
|
||||||
|
informNiResponse(GpsUserResponseType userResponse,
|
||||||
|
const void* passThroughData)
|
||||||
|
DEFAULT_IMPL(LOC_API_ADAPTER_ERR_SUCCESS)
|
||||||
|
|
||||||
|
enum loc_api_adapter_err LocApiBase::
|
||||||
|
setSUPLVersion(uint32_t version)
|
||||||
|
DEFAULT_IMPL(LOC_API_ADAPTER_ERR_SUCCESS)
|
||||||
|
|
||||||
|
enum loc_api_adapter_err LocApiBase::
|
||||||
|
setLPPConfig(uint32_t profile)
|
||||||
|
DEFAULT_IMPL(LOC_API_ADAPTER_ERR_SUCCESS)
|
||||||
|
|
||||||
|
enum loc_api_adapter_err LocApiBase::
|
||||||
|
setSensorControlConfig(int sensorUsage)
|
||||||
|
DEFAULT_IMPL(LOC_API_ADAPTER_ERR_SUCCESS)
|
||||||
|
|
||||||
|
enum loc_api_adapter_err LocApiBase::
|
||||||
|
setSensorProperties(bool gyroBiasVarianceRandomWalk_valid,
|
||||||
|
float gyroBiasVarianceRandomWalk,
|
||||||
|
bool accelBiasVarianceRandomWalk_valid,
|
||||||
|
float accelBiasVarianceRandomWalk,
|
||||||
|
bool angleBiasVarianceRandomWalk_valid,
|
||||||
|
float angleBiasVarianceRandomWalk,
|
||||||
|
bool rateBiasVarianceRandomWalk_valid,
|
||||||
|
float rateBiasVarianceRandomWalk,
|
||||||
|
bool velocityBiasVarianceRandomWalk_valid,
|
||||||
|
float velocityBiasVarianceRandomWalk)
|
||||||
|
DEFAULT_IMPL(LOC_API_ADAPTER_ERR_SUCCESS)
|
||||||
|
|
||||||
|
enum loc_api_adapter_err LocApiBase::
|
||||||
|
setSensorPerfControlConfig(int controlMode,
|
||||||
|
int accelSamplesPerBatch,
|
||||||
|
int accelBatchesPerSec,
|
||||||
|
int gyroSamplesPerBatch,
|
||||||
|
int gyroBatchesPerSec,
|
||||||
|
int accelSamplesPerBatchHigh,
|
||||||
|
int accelBatchesPerSecHigh,
|
||||||
|
int gyroSamplesPerBatchHigh,
|
||||||
|
int gyroBatchesPerSecHigh,
|
||||||
|
int algorithmConfig)
|
||||||
|
DEFAULT_IMPL(LOC_API_ADAPTER_ERR_SUCCESS)
|
||||||
|
|
||||||
|
enum loc_api_adapter_err LocApiBase::
|
||||||
|
setExtPowerConfig(int isBatteryCharging)
|
||||||
|
DEFAULT_IMPL(LOC_API_ADAPTER_ERR_SUCCESS)
|
||||||
|
|
||||||
|
enum loc_api_adapter_err LocApiBase::
|
||||||
|
setAGLONASSProtocol(unsigned long aGlonassProtocol)
|
||||||
|
DEFAULT_IMPL(LOC_API_ADAPTER_ERR_SUCCESS)
|
||||||
|
|
||||||
|
enum loc_api_adapter_err LocApiBase::
|
||||||
|
getZppFix(GpsLocation & zppLoc)
|
||||||
|
DEFAULT_IMPL(LOC_API_ADAPTER_ERR_SUCCESS)
|
||||||
|
|
||||||
|
enum loc_api_adapter_err LocApiBase::
|
||||||
|
getZppFix(GpsLocation & zppLoc, LocPosTechMask & tech_mask)
|
||||||
|
DEFAULT_IMPL(LOC_API_ADAPTER_ERR_SUCCESS)
|
||||||
|
|
||||||
|
int LocApiBase::
|
||||||
|
initDataServiceClient()
|
||||||
|
DEFAULT_IMPL(-1)
|
||||||
|
|
||||||
|
int LocApiBase::
|
||||||
|
openAndStartDataCall()
|
||||||
|
DEFAULT_IMPL(-1)
|
||||||
|
|
||||||
|
void LocApiBase::
|
||||||
|
stopDataCall()
|
||||||
|
DEFAULT_IMPL()
|
||||||
|
|
||||||
|
void LocApiBase::
|
||||||
|
closeDataCall()
|
||||||
|
DEFAULT_IMPL()
|
||||||
|
|
||||||
|
int LocApiBase::
|
||||||
|
setGpsLock(unsigned int lock)
|
||||||
|
DEFAULT_IMPL(-1)
|
||||||
|
|
||||||
|
int LocApiBase::
|
||||||
|
getGpsLock()
|
||||||
|
DEFAULT_IMPL(-1)
|
||||||
|
} // namespace loc_core
|
219
gps/core/LocApiBase.h
Executable file
219
gps/core/LocApiBase.h
Executable file
@ -0,0 +1,219 @@
|
|||||||
|
/* Copyright (c) 2011-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_API_BASE_H
|
||||||
|
#define LOC_API_BASE_H
|
||||||
|
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <gps_extended.h>
|
||||||
|
#include <MsgTask.h>
|
||||||
|
#include <log_util.h>
|
||||||
|
|
||||||
|
namespace loc_core {
|
||||||
|
|
||||||
|
int hexcode(char *hexstring, int string_size,
|
||||||
|
const char *data, int data_size);
|
||||||
|
int decodeAddress(char *addr_string, int string_size,
|
||||||
|
const char *data, int data_size);
|
||||||
|
|
||||||
|
#define MAX_ADAPTERS 10
|
||||||
|
|
||||||
|
#define TO_ALL_ADAPTERS(adapters, call) \
|
||||||
|
for (int i = 0; i < MAX_ADAPTERS && NULL != (adapters)[i]; i++) { \
|
||||||
|
call; \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define TO_1ST_HANDLING_ADAPTER(adapters, call) \
|
||||||
|
for (int i = 0; i <MAX_ADAPTERS && NULL != (adapters)[i] && !(call); i++);
|
||||||
|
|
||||||
|
class LocAdapterBase;
|
||||||
|
struct LocSsrMsg;
|
||||||
|
struct LocOpenMsg;
|
||||||
|
|
||||||
|
class LocApiProxyBase {
|
||||||
|
public:
|
||||||
|
inline LocApiProxyBase() {}
|
||||||
|
inline virtual ~LocApiProxyBase() {}
|
||||||
|
inline virtual void* getSibling2() { return NULL; }
|
||||||
|
};
|
||||||
|
|
||||||
|
class LocApiBase {
|
||||||
|
friend struct LocSsrMsg;
|
||||||
|
//LocOpenMsg calls open() which makes it necessary to declare
|
||||||
|
//it as a friend
|
||||||
|
friend struct LocOpenMsg;
|
||||||
|
friend class ContextBase;
|
||||||
|
const MsgTask* mMsgTask;
|
||||||
|
|
||||||
|
LocAdapterBase* mLocAdapters[MAX_ADAPTERS];
|
||||||
|
|
||||||
|
protected:
|
||||||
|
virtual enum loc_api_adapter_err
|
||||||
|
open(LOC_API_ADAPTER_EVENT_MASK_T mask);
|
||||||
|
virtual enum loc_api_adapter_err
|
||||||
|
close();
|
||||||
|
LOC_API_ADAPTER_EVENT_MASK_T getEvtMask();
|
||||||
|
LOC_API_ADAPTER_EVENT_MASK_T mMask;
|
||||||
|
LocApiBase(const MsgTask* msgTask,
|
||||||
|
LOC_API_ADAPTER_EVENT_MASK_T excludedMask);
|
||||||
|
inline virtual ~LocApiBase() { close(); }
|
||||||
|
bool isInSession();
|
||||||
|
const LOC_API_ADAPTER_EVENT_MASK_T mExcludedMask;
|
||||||
|
|
||||||
|
public:
|
||||||
|
void addAdapter(LocAdapterBase* adapter);
|
||||||
|
void removeAdapter(LocAdapterBase* adapter);
|
||||||
|
|
||||||
|
// upward calls
|
||||||
|
void handleEngineUpEvent();
|
||||||
|
void handleEngineDownEvent();
|
||||||
|
void reportPosition(UlpLocation &location,
|
||||||
|
GpsLocationExtended &locationExtended,
|
||||||
|
void* locationExt,
|
||||||
|
enum loc_sess_status status,
|
||||||
|
LocPosTechMask loc_technology_mask =
|
||||||
|
LOC_POS_TECH_MASK_DEFAULT);
|
||||||
|
void reportSv(GpsSvStatus &svStatus,
|
||||||
|
GpsLocationExtended &locationExtended,
|
||||||
|
void* svExt);
|
||||||
|
void reportStatus(GpsStatusValue status);
|
||||||
|
void reportNmea(const char* nmea, int length);
|
||||||
|
void reportXtraServer(const char* url1, const char* url2,
|
||||||
|
const char* url3, const int maxlength);
|
||||||
|
void requestXtraData();
|
||||||
|
void requestTime();
|
||||||
|
void requestLocation();
|
||||||
|
void requestATL(int connHandle, AGpsType agps_type);
|
||||||
|
void releaseATL(int connHandle);
|
||||||
|
void requestSuplES(int connHandle);
|
||||||
|
void reportDataCallOpened();
|
||||||
|
void reportDataCallClosed();
|
||||||
|
void requestNiNotify(GpsNiNotification ¬ify, const void* data);
|
||||||
|
|
||||||
|
// downward calls
|
||||||
|
// All below functions are to be defined by adapter specific modules:
|
||||||
|
// RPC, QMI, etc. The default implementation is empty.
|
||||||
|
|
||||||
|
virtual void* getSibling();
|
||||||
|
virtual LocApiProxyBase* getLocApiProxy();
|
||||||
|
virtual enum loc_api_adapter_err
|
||||||
|
startFix(const LocPosMode& posMode);
|
||||||
|
virtual enum loc_api_adapter_err
|
||||||
|
stopFix();
|
||||||
|
virtual enum loc_api_adapter_err
|
||||||
|
deleteAidingData(GpsAidingData f);
|
||||||
|
virtual enum loc_api_adapter_err
|
||||||
|
enableData(int enable);
|
||||||
|
virtual enum loc_api_adapter_err
|
||||||
|
setAPN(char* apn, int len);
|
||||||
|
virtual enum loc_api_adapter_err
|
||||||
|
injectPosition(double latitude, double longitude, float accuracy);
|
||||||
|
virtual enum loc_api_adapter_err
|
||||||
|
setTime(GpsUtcTime time, int64_t timeReference, int uncertainty);
|
||||||
|
virtual enum loc_api_adapter_err
|
||||||
|
setXtraData(char* data, int length);
|
||||||
|
virtual enum loc_api_adapter_err
|
||||||
|
requestXtraServer();
|
||||||
|
virtual enum loc_api_adapter_err
|
||||||
|
atlOpenStatus(int handle, int is_succ, char* apn, ApnIpType bear, AGpsType agpsType);
|
||||||
|
virtual enum loc_api_adapter_err
|
||||||
|
atlCloseStatus(int handle, int is_succ);
|
||||||
|
virtual enum loc_api_adapter_err
|
||||||
|
setPositionMode(const LocPosMode& posMode);
|
||||||
|
virtual enum loc_api_adapter_err
|
||||||
|
setServer(const char* url, int len);
|
||||||
|
virtual enum loc_api_adapter_err
|
||||||
|
setServer(unsigned int ip, int port,
|
||||||
|
LocServerType type);
|
||||||
|
virtual enum loc_api_adapter_err
|
||||||
|
informNiResponse(GpsUserResponseType userResponse, const void* passThroughData);
|
||||||
|
virtual enum loc_api_adapter_err
|
||||||
|
setSUPLVersion(uint32_t version);
|
||||||
|
virtual enum loc_api_adapter_err
|
||||||
|
setLPPConfig(uint32_t profile);
|
||||||
|
virtual enum loc_api_adapter_err
|
||||||
|
setSensorControlConfig(int sensorUsage);
|
||||||
|
virtual enum loc_api_adapter_err
|
||||||
|
setSensorProperties(bool gyroBiasVarianceRandomWalk_valid,
|
||||||
|
float gyroBiasVarianceRandomWalk,
|
||||||
|
bool accelBiasVarianceRandomWalk_valid,
|
||||||
|
float accelBiasVarianceRandomWalk,
|
||||||
|
bool angleBiasVarianceRandomWalk_valid,
|
||||||
|
float angleBiasVarianceRandomWalk,
|
||||||
|
bool rateBiasVarianceRandomWalk_valid,
|
||||||
|
float rateBiasVarianceRandomWalk,
|
||||||
|
bool velocityBiasVarianceRandomWalk_valid,
|
||||||
|
float velocityBiasVarianceRandomWalk);
|
||||||
|
virtual enum loc_api_adapter_err
|
||||||
|
setSensorPerfControlConfig(int controlMode,
|
||||||
|
int accelSamplesPerBatch,
|
||||||
|
int accelBatchesPerSec,
|
||||||
|
int gyroSamplesPerBatch,
|
||||||
|
int gyroBatchesPerSec,
|
||||||
|
int accelSamplesPerBatchHigh,
|
||||||
|
int accelBatchesPerSecHigh,
|
||||||
|
int gyroSamplesPerBatchHigh,
|
||||||
|
int gyroBatchesPerSecHigh,
|
||||||
|
int algorithmConfig);
|
||||||
|
virtual enum loc_api_adapter_err
|
||||||
|
setExtPowerConfig(int isBatteryCharging);
|
||||||
|
virtual enum loc_api_adapter_err
|
||||||
|
setAGLONASSProtocol(unsigned long aGlonassProtocol);
|
||||||
|
virtual enum loc_api_adapter_err
|
||||||
|
getZppFix(GpsLocation & zppLoc);
|
||||||
|
virtual enum loc_api_adapter_err
|
||||||
|
getZppFix(GpsLocation & zppLoc, LocPosTechMask & tech_mask);
|
||||||
|
virtual int initDataServiceClient();
|
||||||
|
virtual int openAndStartDataCall();
|
||||||
|
virtual void stopDataCall();
|
||||||
|
virtual void closeDataCall();
|
||||||
|
|
||||||
|
inline virtual void setInSession(bool inSession) {}
|
||||||
|
|
||||||
|
/*Values for lock
|
||||||
|
1 = Do not lock any position sessions
|
||||||
|
2 = Lock MI position sessions
|
||||||
|
3 = Lock MT position sessions
|
||||||
|
4 = Lock all position sessions
|
||||||
|
*/
|
||||||
|
virtual int setGpsLock(unsigned int lock);
|
||||||
|
/*
|
||||||
|
Returns
|
||||||
|
Current value of GPS Lock on success
|
||||||
|
-1 on failure
|
||||||
|
*/
|
||||||
|
virtual int getGpsLock(void);
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef LocApiBase* (getLocApi_t)(const MsgTask* msgTask,
|
||||||
|
LOC_API_ADAPTER_EVENT_MASK_T exMask);
|
||||||
|
|
||||||
|
} // namespace loc_core
|
||||||
|
|
||||||
|
#endif //LOC_API_BASE_H
|
132
gps/core/LocDualContext.cpp
Executable file
132
gps/core/LocDualContext.cpp
Executable file
@ -0,0 +1,132 @@
|
|||||||
|
/* Copyright (c) 2011-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.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#define LOG_NDDEBUG 0
|
||||||
|
#define LOG_TAG "LocSvc_DualCtx"
|
||||||
|
|
||||||
|
#include <cutils/sched_policy.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <LocDualContext.h>
|
||||||
|
#include <msg_q.h>
|
||||||
|
#include <log_util.h>
|
||||||
|
#include <loc_log.h>
|
||||||
|
|
||||||
|
namespace loc_core {
|
||||||
|
|
||||||
|
// nothing exclude for foreground
|
||||||
|
const LOC_API_ADAPTER_EVENT_MASK_T
|
||||||
|
LocDualContext::mFgExclMask = 0;
|
||||||
|
// excluded events for background clients
|
||||||
|
const LOC_API_ADAPTER_EVENT_MASK_T
|
||||||
|
LocDualContext::mBgExclMask =
|
||||||
|
(LOC_API_ADAPTER_BIT_PARSED_POSITION_REPORT |
|
||||||
|
LOC_API_ADAPTER_BIT_SATELLITE_REPORT |
|
||||||
|
LOC_API_ADAPTER_BIT_NMEA_1HZ_REPORT |
|
||||||
|
LOC_API_ADAPTER_BIT_NMEA_POSITION_REPORT |
|
||||||
|
LOC_API_ADAPTER_BIT_IOCTL_REPORT |
|
||||||
|
LOC_API_ADAPTER_BIT_STATUS_REPORT |
|
||||||
|
LOC_API_ADAPTER_BIT_GEOFENCE_GEN_ALERT);
|
||||||
|
|
||||||
|
const MsgTask* LocDualContext::mMsgTask = NULL;
|
||||||
|
ContextBase* LocDualContext::mFgContext = NULL;
|
||||||
|
ContextBase* LocDualContext::mBgContext = NULL;
|
||||||
|
|
||||||
|
// the name must be shorter than 15 chars
|
||||||
|
const char* LocDualContext::mLocationHalName = "Loc_hal_worker";
|
||||||
|
const char* LocDualContext::mIzatLibName = "liblbs_core.so";
|
||||||
|
|
||||||
|
const MsgTask* LocDualContext::getMsgTask(MsgTask::tCreate tCreator,
|
||||||
|
const char* name)
|
||||||
|
{
|
||||||
|
if (NULL == mMsgTask) {
|
||||||
|
mMsgTask = new MsgTask(tCreator, name);
|
||||||
|
}
|
||||||
|
return mMsgTask;
|
||||||
|
}
|
||||||
|
|
||||||
|
const MsgTask* LocDualContext::getMsgTask(MsgTask::tAssociate tAssociate,
|
||||||
|
const char* name)
|
||||||
|
{
|
||||||
|
if (NULL == mMsgTask) {
|
||||||
|
mMsgTask = new MsgTask(tAssociate, name);
|
||||||
|
}
|
||||||
|
return mMsgTask;
|
||||||
|
}
|
||||||
|
|
||||||
|
ContextBase* LocDualContext::getLocFgContext(MsgTask::tCreate tCreator,
|
||||||
|
const char* name)
|
||||||
|
{
|
||||||
|
if (NULL == mFgContext) {
|
||||||
|
const MsgTask* msgTask = getMsgTask(tCreator, name);
|
||||||
|
mFgContext = new LocDualContext(msgTask,
|
||||||
|
mFgExclMask);
|
||||||
|
}
|
||||||
|
return mFgContext;
|
||||||
|
}
|
||||||
|
|
||||||
|
ContextBase* LocDualContext::getLocFgContext(MsgTask::tAssociate tAssociate,
|
||||||
|
const char* name)
|
||||||
|
{
|
||||||
|
if (NULL == mFgContext) {
|
||||||
|
const MsgTask* msgTask = getMsgTask(tAssociate, name);
|
||||||
|
mFgContext = new LocDualContext(msgTask,
|
||||||
|
mFgExclMask);
|
||||||
|
}
|
||||||
|
return mFgContext;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
ContextBase* LocDualContext::getLocBgContext(MsgTask::tCreate tCreator,
|
||||||
|
const char* name)
|
||||||
|
{
|
||||||
|
if (NULL == mBgContext) {
|
||||||
|
const MsgTask* msgTask = getMsgTask(tCreator, name);
|
||||||
|
mBgContext = new LocDualContext(msgTask,
|
||||||
|
mBgExclMask);
|
||||||
|
}
|
||||||
|
return mBgContext;
|
||||||
|
}
|
||||||
|
|
||||||
|
ContextBase* LocDualContext::getLocBgContext(MsgTask::tAssociate tAssociate,
|
||||||
|
const char* name)
|
||||||
|
{
|
||||||
|
if (NULL == mBgContext) {
|
||||||
|
const MsgTask* msgTask = getMsgTask(tAssociate, name);
|
||||||
|
mBgContext = new LocDualContext(msgTask,
|
||||||
|
mBgExclMask);
|
||||||
|
}
|
||||||
|
return mBgContext;
|
||||||
|
}
|
||||||
|
|
||||||
|
LocDualContext::LocDualContext(const MsgTask* msgTask,
|
||||||
|
LOC_API_ADAPTER_EVENT_MASK_T exMask) :
|
||||||
|
ContextBase(msgTask, exMask, mIzatLibName)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
72
gps/core/LocDualContext.h
Executable file
72
gps/core/LocDualContext.h
Executable file
@ -0,0 +1,72 @@
|
|||||||
|
/* Copyright (c) 2011-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_ENG_CONTEXT__
|
||||||
|
#define __LOC_ENG_CONTEXT__
|
||||||
|
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <dlfcn.h>
|
||||||
|
#include <ContextBase.h>
|
||||||
|
|
||||||
|
namespace loc_core {
|
||||||
|
|
||||||
|
class LocDualContext : public ContextBase {
|
||||||
|
static const MsgTask* mMsgTask;
|
||||||
|
static ContextBase* mFgContext;
|
||||||
|
static ContextBase* mBgContext;
|
||||||
|
|
||||||
|
static const MsgTask* getMsgTask(MsgTask::tCreate tCreator,
|
||||||
|
const char* name);
|
||||||
|
static const MsgTask* getMsgTask(MsgTask::tAssociate tAssociate,
|
||||||
|
const char* name);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
LocDualContext(const MsgTask* msgTask,
|
||||||
|
LOC_API_ADAPTER_EVENT_MASK_T exMask);
|
||||||
|
inline virtual ~LocDualContext() {}
|
||||||
|
|
||||||
|
public:
|
||||||
|
static const char* mIzatLibName;
|
||||||
|
static const LOC_API_ADAPTER_EVENT_MASK_T mFgExclMask;
|
||||||
|
static const LOC_API_ADAPTER_EVENT_MASK_T mBgExclMask;
|
||||||
|
static const char* mLocationHalName;
|
||||||
|
|
||||||
|
static ContextBase* getLocFgContext(MsgTask::tCreate tCreator,
|
||||||
|
const char* name);
|
||||||
|
static ContextBase* getLocFgContext(MsgTask::tAssociate tAssociate,
|
||||||
|
const char* name);
|
||||||
|
static ContextBase* getLocBgContext(MsgTask::tCreate tCreator,
|
||||||
|
const char* name);
|
||||||
|
static ContextBase* getLocBgContext(MsgTask::tAssociate tAssociate,
|
||||||
|
const char* name);
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif //__LOC_ENG_CONTEXT__
|
133
gps/core/MsgTask.cpp
Executable file
133
gps/core/MsgTask.cpp
Executable file
@ -0,0 +1,133 @@
|
|||||||
|
/* Copyright (c) 2011-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.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#define LOG_NDDEBUG 0
|
||||||
|
#define LOG_TAG "LocSvc_MsgTask"
|
||||||
|
|
||||||
|
#include <cutils/sched_policy.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <MsgTask.h>
|
||||||
|
#include <msg_q.h>
|
||||||
|
#include <log_util.h>
|
||||||
|
#include <loc_log.h>
|
||||||
|
#include <android_runtime/AndroidRuntime.h>
|
||||||
|
|
||||||
|
namespace loc_core {
|
||||||
|
|
||||||
|
#define MAX_TASK_COMM_LEN 15
|
||||||
|
|
||||||
|
static void LocMsgDestroy(void* msg) {
|
||||||
|
delete (LocMsg*)msg;
|
||||||
|
}
|
||||||
|
|
||||||
|
MsgTask::MsgTask(tCreate tCreator, const char* threadName) :
|
||||||
|
mQ(msg_q_init2()), mAssociator(NULL){
|
||||||
|
if (tCreator) {
|
||||||
|
tCreator(threadName, loopMain,
|
||||||
|
(void*)new MsgTask(mQ, mAssociator));
|
||||||
|
} else {
|
||||||
|
createPThread(threadName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
MsgTask::MsgTask(tAssociate tAssociator, const char* threadName) :
|
||||||
|
mQ(msg_q_init2()), mAssociator(tAssociator){
|
||||||
|
createPThread(threadName);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline
|
||||||
|
MsgTask::MsgTask(const void* q, tAssociate associator) :
|
||||||
|
mQ(q), mAssociator(associator){
|
||||||
|
}
|
||||||
|
|
||||||
|
MsgTask::~MsgTask() {
|
||||||
|
msg_q_unblock((void*)mQ);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MsgTask::createPThread(const char* threadName) {
|
||||||
|
pthread_attr_t attr;
|
||||||
|
pthread_attr_init(&attr);
|
||||||
|
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
|
||||||
|
|
||||||
|
pthread_t tid;
|
||||||
|
// create the thread here, then if successful
|
||||||
|
// and a name is given, we set the thread name
|
||||||
|
if (!pthread_create(&tid, &attr, loopMain,
|
||||||
|
(void*)new MsgTask(mQ, mAssociator)) &&
|
||||||
|
NULL != threadName) {
|
||||||
|
char lname[MAX_TASK_COMM_LEN+1];
|
||||||
|
memcpy(lname, threadName, MAX_TASK_COMM_LEN);
|
||||||
|
lname[MAX_TASK_COMM_LEN] = 0;
|
||||||
|
pthread_setname_np(tid, lname);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void MsgTask::sendMsg(const LocMsg* msg) const {
|
||||||
|
msg_q_snd((void*)mQ, (void*)msg, LocMsgDestroy);
|
||||||
|
}
|
||||||
|
|
||||||
|
void* MsgTask::loopMain(void* arg) {
|
||||||
|
MsgTask* copy = (MsgTask*)arg;
|
||||||
|
|
||||||
|
// make sure we do not run in background scheduling group
|
||||||
|
set_sched_policy(gettid(), SP_FOREGROUND);
|
||||||
|
|
||||||
|
if (NULL != copy->mAssociator) {
|
||||||
|
copy->mAssociator();
|
||||||
|
}
|
||||||
|
|
||||||
|
LocMsg* msg;
|
||||||
|
int cnt = 0;
|
||||||
|
|
||||||
|
while (1) {
|
||||||
|
LOC_LOGD("MsgTask::loop() %d listening ...\n", cnt++);
|
||||||
|
|
||||||
|
msq_q_err_type result = msg_q_rcv((void*)copy->mQ, (void **)&msg);
|
||||||
|
|
||||||
|
if (eMSG_Q_SUCCESS != result) {
|
||||||
|
LOC_LOGE("%s:%d] fail receiving msg: %s\n", __func__, __LINE__,
|
||||||
|
loc_get_msg_q_status(result));
|
||||||
|
// destroy the Q and exit
|
||||||
|
msg_q_destroy((void**)&(copy->mQ));
|
||||||
|
delete copy;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
msg->log();
|
||||||
|
// there is where each individual msg handling is invoked
|
||||||
|
msg->proc();
|
||||||
|
|
||||||
|
delete msg;
|
||||||
|
}
|
||||||
|
|
||||||
|
delete copy;
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
66
gps/core/MsgTask.h
Executable file
66
gps/core/MsgTask.h
Executable file
@ -0,0 +1,66 @@
|
|||||||
|
/* Copyright (c) 2011-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 __MSG_TASK__
|
||||||
|
#define __MSG_TASK__
|
||||||
|
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <pthread.h>
|
||||||
|
|
||||||
|
namespace loc_core {
|
||||||
|
|
||||||
|
struct LocMsg {
|
||||||
|
inline LocMsg() {}
|
||||||
|
inline virtual ~LocMsg() {}
|
||||||
|
virtual void proc() const = 0;
|
||||||
|
inline virtual void log() const {}
|
||||||
|
};
|
||||||
|
|
||||||
|
class MsgTask {
|
||||||
|
public:
|
||||||
|
typedef void* (*tStart)(void*);
|
||||||
|
typedef pthread_t (*tCreate)(const char* name, tStart start, void* arg);
|
||||||
|
typedef int (*tAssociate)();
|
||||||
|
MsgTask(tCreate tCreator, const char* threadName);
|
||||||
|
MsgTask(tAssociate tAssociator, const char* threadName);
|
||||||
|
~MsgTask();
|
||||||
|
void sendMsg(const LocMsg* msg) const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
const void* mQ;
|
||||||
|
tAssociate mAssociator;
|
||||||
|
MsgTask(const void* q, tAssociate associator);
|
||||||
|
static void* loopMain(void* copy);
|
||||||
|
void createPThread(const char* name);
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace loc_core
|
||||||
|
|
||||||
|
#endif //__MSG_TASK__
|
66
gps/core/UlpProxyBase.h
Executable file
66
gps/core/UlpProxyBase.h
Executable file
@ -0,0 +1,66 @@
|
|||||||
|
/* 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 ULP_PROXY_BASE_H
|
||||||
|
#define ULP_PROXY_BASE_H
|
||||||
|
|
||||||
|
#include <gps_extended.h>
|
||||||
|
|
||||||
|
namespace loc_core {
|
||||||
|
|
||||||
|
class LocAdapterBase;
|
||||||
|
|
||||||
|
class UlpProxyBase {
|
||||||
|
public:
|
||||||
|
inline UlpProxyBase() {}
|
||||||
|
inline virtual ~UlpProxyBase() {}
|
||||||
|
inline virtual bool sendStartFix() { return false;}
|
||||||
|
inline virtual bool sendStopFix() { return false;}
|
||||||
|
inline virtual bool sendFixMode(LocPosMode ¶ms) { return false;}
|
||||||
|
inline virtual bool reportPosition(UlpLocation &location,
|
||||||
|
GpsLocationExtended &locationExtended,
|
||||||
|
void* locationExt,
|
||||||
|
enum loc_sess_status status,
|
||||||
|
LocPosTechMask loc_technology_mask) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
inline virtual bool reportSv(GpsSvStatus &svStatus,
|
||||||
|
GpsLocationExtended &locationExtended,
|
||||||
|
void* svExt) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
inline virtual bool reportStatus(GpsStatusValue status) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
inline virtual void setAdapter(LocAdapterBase* adapter) {}
|
||||||
|
inline virtual void setCapabilities(unsigned long capabilities) {}
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace loc_core
|
||||||
|
|
||||||
|
#endif // ULP_PROXY_BASE_H
|
92
gps/core/gps_extended.h
Executable file
92
gps/core/gps_extended.h
Executable file
@ -0,0 +1,92 @@
|
|||||||
|
/* 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 GPS_EXTENDED_H
|
||||||
|
#define GPS_EXTENDED_H
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif /* __cplusplus */
|
||||||
|
|
||||||
|
#include <gps_extended_c.h>
|
||||||
|
|
||||||
|
struct LocPosMode
|
||||||
|
{
|
||||||
|
LocPositionMode mode;
|
||||||
|
GpsPositionRecurrence recurrence;
|
||||||
|
uint32_t min_interval;
|
||||||
|
uint32_t preferred_accuracy;
|
||||||
|
uint32_t preferred_time;
|
||||||
|
char credentials[14];
|
||||||
|
char provider[8];
|
||||||
|
LocPosMode(LocPositionMode m, GpsPositionRecurrence recr,
|
||||||
|
uint32_t gap, uint32_t accu, uint32_t time,
|
||||||
|
const char* cred, const char* prov) :
|
||||||
|
mode(m), recurrence(recr),
|
||||||
|
min_interval(gap < MIN_POSSIBLE_FIX_INTERVAL ? MIN_POSSIBLE_FIX_INTERVAL : gap),
|
||||||
|
preferred_accuracy(accu), preferred_time(time) {
|
||||||
|
memset(credentials, 0, sizeof(credentials));
|
||||||
|
memset(provider, 0, sizeof(provider));
|
||||||
|
if (NULL != cred) {
|
||||||
|
memcpy(credentials, cred, sizeof(credentials)-1);
|
||||||
|
}
|
||||||
|
if (NULL != prov) {
|
||||||
|
memcpy(provider, prov, sizeof(provider)-1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
inline LocPosMode() :
|
||||||
|
mode(LOC_POSITION_MODE_MS_BASED),
|
||||||
|
recurrence(GPS_POSITION_RECURRENCE_PERIODIC),
|
||||||
|
min_interval(MIN_POSSIBLE_FIX_INTERVAL),
|
||||||
|
preferred_accuracy(50), preferred_time(120000) {
|
||||||
|
memset(credentials, 0, sizeof(credentials));
|
||||||
|
memset(provider, 0, sizeof(provider));
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool equals(const LocPosMode &anotherMode) const
|
||||||
|
{
|
||||||
|
return anotherMode.mode == mode &&
|
||||||
|
anotherMode.recurrence == recurrence &&
|
||||||
|
anotherMode.min_interval == min_interval &&
|
||||||
|
anotherMode.preferred_accuracy == preferred_accuracy &&
|
||||||
|
anotherMode.preferred_time == preferred_time &&
|
||||||
|
!strncmp(anotherMode.credentials, credentials, sizeof(credentials)-1) &&
|
||||||
|
!strncmp(anotherMode.provider, provider, sizeof(provider)-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void logv() const;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif /* __cplusplus */
|
||||||
|
|
||||||
|
#endif /* GPS_EXTENDED_H */
|
||||||
|
|
342
gps/core/gps_extended_c.h
Executable file
342
gps/core/gps_extended_c.h
Executable file
@ -0,0 +1,342 @@
|
|||||||
|
/* 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 GPS_EXTENDED_C_H
|
||||||
|
#define GPS_EXTENDED_C_H
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif /* __cplusplus */
|
||||||
|
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include "hardware/gps.h"
|
||||||
|
|
||||||
|
/** Location has valid source information. */
|
||||||
|
#define LOCATION_HAS_SOURCE_INFO 0x0020
|
||||||
|
/** GpsLocation has valid "is indoor?" flag */
|
||||||
|
#define GPS_LOCATION_HAS_IS_INDOOR 0x0040
|
||||||
|
/** GpsLocation has valid floor number */
|
||||||
|
#define GPS_LOCATION_HAS_FLOOR_NUMBER 0x0080
|
||||||
|
/** GpsLocation has valid map URL*/
|
||||||
|
#define GPS_LOCATION_HAS_MAP_URL 0x0100
|
||||||
|
/** GpsLocation has valid map index */
|
||||||
|
#define GPS_LOCATION_HAS_MAP_INDEX 0x0200
|
||||||
|
|
||||||
|
/** Sizes for indoor fields */
|
||||||
|
#define GPS_LOCATION_MAP_URL_SIZE 400
|
||||||
|
#define GPS_LOCATION_MAP_INDEX_SIZE 16
|
||||||
|
|
||||||
|
/** Position source is ULP */
|
||||||
|
#define ULP_LOCATION_IS_FROM_HYBRID 0x0001
|
||||||
|
/** Position source is GNSS only */
|
||||||
|
#define ULP_LOCATION_IS_FROM_GNSS 0x0002
|
||||||
|
/** Position source is ZPP only */
|
||||||
|
#define ULP_LOCATION_IS_FROM_ZPP 0x0004
|
||||||
|
|
||||||
|
#define ULP_MIN_INTERVAL_INVALID 0xffffffff
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
/** set to sizeof(UlpLocation) */
|
||||||
|
size_t size;
|
||||||
|
GpsLocation gpsLocation;
|
||||||
|
/* Provider indicator for HYBRID or GPS */
|
||||||
|
uint16_t position_source;
|
||||||
|
/*allows HAL to pass additional information related to the location */
|
||||||
|
int rawDataSize; /* in # of bytes */
|
||||||
|
void * rawData;
|
||||||
|
bool is_indoor;
|
||||||
|
float floor_number;
|
||||||
|
char map_url[GPS_LOCATION_MAP_URL_SIZE];
|
||||||
|
unsigned char map_index[GPS_LOCATION_MAP_INDEX_SIZE];
|
||||||
|
} UlpLocation;
|
||||||
|
|
||||||
|
/** AGPS type */
|
||||||
|
typedef int16_t AGpsExtType;
|
||||||
|
#define AGPS_TYPE_INVALID -1
|
||||||
|
#define AGPS_TYPE_ANY 0
|
||||||
|
#define AGPS_TYPE_SUPL 1
|
||||||
|
#define AGPS_TYPE_C2K 2
|
||||||
|
#define AGPS_TYPE_WWAN_ANY 3
|
||||||
|
#define AGPS_TYPE_WIFI 4
|
||||||
|
#define AGPS_TYPE_SUPL_ES 5
|
||||||
|
|
||||||
|
/** SSID length */
|
||||||
|
#define SSID_BUF_SIZE (32+1)
|
||||||
|
|
||||||
|
#define AGPS_APN_BEARER_INVALID -1
|
||||||
|
#define AGPS_APN_BEARER_IPV4 0
|
||||||
|
#define AGPS_APN_BEARER_IPV6 1
|
||||||
|
#define AGPS_APN_BEARER_IPV4V6 2
|
||||||
|
|
||||||
|
/** GPS extended callback structure. */
|
||||||
|
typedef struct {
|
||||||
|
/** set to sizeof(GpsCallbacks) */
|
||||||
|
size_t size;
|
||||||
|
gps_set_capabilities set_capabilities_cb;
|
||||||
|
gps_acquire_wakelock acquire_wakelock_cb;
|
||||||
|
gps_release_wakelock release_wakelock_cb;
|
||||||
|
gps_create_thread create_thread_cb;
|
||||||
|
gps_request_utc_time request_utc_time_cb;
|
||||||
|
} GpsExtCallbacks;
|
||||||
|
|
||||||
|
/** Callback to report the xtra server url to the client.
|
||||||
|
* The client should use this url when downloading xtra unless overwritten
|
||||||
|
* in the gps.conf file
|
||||||
|
*/
|
||||||
|
typedef void (* report_xtra_server)(const char*, const char*, const char*);
|
||||||
|
|
||||||
|
/** Callback structure for the XTRA interface. */
|
||||||
|
typedef struct {
|
||||||
|
gps_xtra_download_request download_request_cb;
|
||||||
|
gps_create_thread create_thread_cb;
|
||||||
|
report_xtra_server report_xtra_server_cb;
|
||||||
|
} GpsXtraExtCallbacks;
|
||||||
|
|
||||||
|
/** Represents the status of AGPS. */
|
||||||
|
typedef struct {
|
||||||
|
/** set to sizeof(AGpsExtStatus) */
|
||||||
|
size_t size;
|
||||||
|
|
||||||
|
AGpsExtType type;
|
||||||
|
AGpsStatusValue status;
|
||||||
|
uint32_t ipv4_addr;
|
||||||
|
char ipv6_addr[16];
|
||||||
|
char ssid[SSID_BUF_SIZE];
|
||||||
|
char password[SSID_BUF_SIZE];
|
||||||
|
} AGpsExtStatus;
|
||||||
|
|
||||||
|
/** Callback with AGPS status information.
|
||||||
|
* Can only be called from a thread created by create_thread_cb.
|
||||||
|
*/
|
||||||
|
typedef void (* agps_status_extended)(AGpsExtStatus* status);
|
||||||
|
|
||||||
|
/** Callback structure for the AGPS interface. */
|
||||||
|
typedef struct {
|
||||||
|
agps_status_extended status_cb;
|
||||||
|
gps_create_thread create_thread_cb;
|
||||||
|
} AGpsExtCallbacks;
|
||||||
|
|
||||||
|
|
||||||
|
/** GPS NI callback structure. */
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Sends the notification request from HAL to GPSLocationProvider.
|
||||||
|
*/
|
||||||
|
gps_ni_notify_callback notify_cb;
|
||||||
|
gps_create_thread create_thread_cb;
|
||||||
|
} GpsNiExtCallbacks;
|
||||||
|
|
||||||
|
typedef enum loc_server_type {
|
||||||
|
LOC_AGPS_CDMA_PDE_SERVER,
|
||||||
|
LOC_AGPS_CUSTOM_PDE_SERVER,
|
||||||
|
LOC_AGPS_MPC_SERVER,
|
||||||
|
LOC_AGPS_SUPL_SERVER
|
||||||
|
} LocServerType;
|
||||||
|
|
||||||
|
typedef enum loc_position_mode_type {
|
||||||
|
LOC_POSITION_MODE_INVALID = -1,
|
||||||
|
LOC_POSITION_MODE_STANDALONE = 0,
|
||||||
|
LOC_POSITION_MODE_MS_BASED,
|
||||||
|
LOC_POSITION_MODE_MS_ASSISTED,
|
||||||
|
LOC_POSITION_MODE_RESERVED_1,
|
||||||
|
LOC_POSITION_MODE_RESERVED_2,
|
||||||
|
LOC_POSITION_MODE_RESERVED_3,
|
||||||
|
LOC_POSITION_MODE_RESERVED_4,
|
||||||
|
LOC_POSITION_MODE_RESERVED_5
|
||||||
|
|
||||||
|
} LocPositionMode;
|
||||||
|
|
||||||
|
#define MIN_POSSIBLE_FIX_INTERVAL 1000 /* msec */
|
||||||
|
|
||||||
|
/** GpsLocationExtended has valid latitude and longitude. */
|
||||||
|
#define GPS_LOCATION_EXTENDED_HAS_LAT_LONG (1U<<0)
|
||||||
|
/** GpsLocationExtended has valid altitude. */
|
||||||
|
#define GPS_LOCATION_EXTENDED_HAS_ALTITUDE (1U<<1)
|
||||||
|
/** GpsLocationExtended has valid speed. */
|
||||||
|
#define GPS_LOCATION_EXTENDED_HAS_SPEED (1U<<2)
|
||||||
|
/** GpsLocationExtended has valid bearing. */
|
||||||
|
#define GPS_LOCATION_EXTENDED_HAS_BEARING (1U<<4)
|
||||||
|
/** GpsLocationExtended has valid accuracy. */
|
||||||
|
#define GPS_LOCATION_EXTENDED_HAS_ACCURACY (1U<<8)
|
||||||
|
|
||||||
|
/** GPS extended supports geofencing */
|
||||||
|
#define GPS_EXTENDED_CAPABILITY_GEOFENCE 0x0000001
|
||||||
|
/** GPS extended supports batching */
|
||||||
|
#define GPS_EXTENDED_CAPABILITY_BATCHING 0x0000002
|
||||||
|
|
||||||
|
/** Flags to indicate which values are valid in a GpsLocationExtended. */
|
||||||
|
typedef uint16_t GpsLocationExtendedFlags;
|
||||||
|
/** GpsLocationExtended has valid pdop, hdop, vdop. */
|
||||||
|
#define GPS_LOCATION_EXTENDED_HAS_DOP 0x0001
|
||||||
|
/** GpsLocationExtended has valid altitude mean sea level. */
|
||||||
|
#define GPS_LOCATION_EXTENDED_HAS_ALTITUDE_MEAN_SEA_LEVEL 0x0002
|
||||||
|
/** UlpLocation has valid magnetic deviation. */
|
||||||
|
#define GPS_LOCATION_EXTENDED_HAS_MAG_DEV 0x0004
|
||||||
|
/** UlpLocation has valid mode indicator. */
|
||||||
|
#define GPS_LOCATION_EXTENDED_HAS_MODE_IND 0x0008
|
||||||
|
/** GpsLocationExtended has valid vertical uncertainty */
|
||||||
|
#define GPS_LOCATION_EXTENDED_HAS_VERT_UNC 0x0010
|
||||||
|
/** GpsLocationExtended has valid speed uncertainty */
|
||||||
|
#define GPS_LOCATION_EXTENDED_HAS_SPEED_UNC 0x0020
|
||||||
|
|
||||||
|
/** Represents gps location extended. */
|
||||||
|
typedef struct {
|
||||||
|
/** set to sizeof(GpsLocationExtended) */
|
||||||
|
size_t size;
|
||||||
|
/** Contains GpsLocationExtendedFlags bits. */
|
||||||
|
uint16_t flags;
|
||||||
|
/** Contains the Altitude wrt mean sea level */
|
||||||
|
float altitudeMeanSeaLevel;
|
||||||
|
/** Contains Position Dilusion of Precision. */
|
||||||
|
float pdop;
|
||||||
|
/** Contains Horizontal Dilusion of Precision. */
|
||||||
|
float hdop;
|
||||||
|
/** Contains Vertical Dilusion of Precision. */
|
||||||
|
float vdop;
|
||||||
|
/** Contains Magnetic Deviation. */
|
||||||
|
float magneticDeviation;
|
||||||
|
/** vertical uncertainty in meters */
|
||||||
|
float vert_unc;
|
||||||
|
/** speed uncertainty in m/s */
|
||||||
|
float speed_unc;
|
||||||
|
} GpsLocationExtended;
|
||||||
|
|
||||||
|
enum loc_sess_status {
|
||||||
|
LOC_SESS_SUCCESS,
|
||||||
|
LOC_SESS_INTERMEDIATE,
|
||||||
|
LOC_SESS_FAILURE
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef uint32_t LocPosTechMask;
|
||||||
|
#define LOC_POS_TECH_MASK_DEFAULT ((LocPosTechMask)0x00000000)
|
||||||
|
#define LOC_POS_TECH_MASK_SATELLITE ((LocPosTechMask)0x00000001)
|
||||||
|
#define LOC_POS_TECH_MASK_CELLID ((LocPosTechMask)0x00000002)
|
||||||
|
#define LOC_POS_TECH_MASK_WIFI ((LocPosTechMask)0x00000004)
|
||||||
|
#define LOC_POS_TECH_MASK_SENSORS ((LocPosTechMask)0x00000008)
|
||||||
|
#define LOC_POS_TECH_MASK_REFERENCE_LOCATION ((LocPosTechMask)0x00000010)
|
||||||
|
#define LOC_POS_TECH_MASK_INJECTED_COARSE_POSITION ((LocPosTechMask)0x00000020)
|
||||||
|
#define LOC_POS_TECH_MASK_AFLT ((LocPosTechMask)0x00000040)
|
||||||
|
#define LOC_POS_TECH_MASK_HYBRID ((LocPosTechMask)0x00000080)
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
LOC_ENG_IF_REQUEST_SENDER_ID_QUIPC = 0,
|
||||||
|
LOC_ENG_IF_REQUEST_SENDER_ID_MSAPM,
|
||||||
|
LOC_ENG_IF_REQUEST_SENDER_ID_MSAPU,
|
||||||
|
LOC_ENG_IF_REQUEST_SENDER_ID_GPSONE_DAEMON,
|
||||||
|
LOC_ENG_IF_REQUEST_SENDER_ID_MODEM,
|
||||||
|
LOC_ENG_IF_REQUEST_SENDER_ID_UNKNOWN
|
||||||
|
} loc_if_req_sender_id_e_type;
|
||||||
|
|
||||||
|
|
||||||
|
#define smaller_of(a, b) (((a) > (b)) ? (b) : (a))
|
||||||
|
#define MAX_APN_LEN 100
|
||||||
|
|
||||||
|
// This will be overridden by the individual adapters
|
||||||
|
// if necessary.
|
||||||
|
#define DEFAULT_IMPL(rtv) \
|
||||||
|
{ \
|
||||||
|
LOC_LOGD("%s: default implementation invoked", __func__); \
|
||||||
|
return rtv; \
|
||||||
|
}
|
||||||
|
|
||||||
|
enum loc_api_adapter_err {
|
||||||
|
LOC_API_ADAPTER_ERR_SUCCESS = 0,
|
||||||
|
LOC_API_ADAPTER_ERR_GENERAL_FAILURE = 1,
|
||||||
|
LOC_API_ADAPTER_ERR_UNSUPPORTED = 2,
|
||||||
|
LOC_API_ADAPTER_ERR_INVALID_HANDLE = 4,
|
||||||
|
LOC_API_ADAPTER_ERR_INVALID_PARAMETER = 5,
|
||||||
|
LOC_API_ADAPTER_ERR_ENGINE_BUSY = 6,
|
||||||
|
LOC_API_ADAPTER_ERR_PHONE_OFFLINE = 7,
|
||||||
|
LOC_API_ADAPTER_ERR_TIMEOUT = 8,
|
||||||
|
LOC_API_ADAPTER_ERR_SERVICE_NOT_PRESENT = 9,
|
||||||
|
|
||||||
|
LOC_API_ADAPTER_ERR_ENGINE_DOWN = 100,
|
||||||
|
LOC_API_ADAPTER_ERR_FAILURE,
|
||||||
|
LOC_API_ADAPTER_ERR_UNKNOWN
|
||||||
|
};
|
||||||
|
|
||||||
|
enum loc_api_adapter_event_index {
|
||||||
|
LOC_API_ADAPTER_REPORT_POSITION = 0, // Position report comes in loc_parsed_position_s_type
|
||||||
|
LOC_API_ADAPTER_REPORT_SATELLITE, // Satellite in view report
|
||||||
|
LOC_API_ADAPTER_REPORT_NMEA_1HZ, // NMEA report at 1HZ rate
|
||||||
|
LOC_API_ADAPTER_REPORT_NMEA_POSITION, // NMEA report at position report rate
|
||||||
|
LOC_API_ADAPTER_REQUEST_NI_NOTIFY_VERIFY, // NI notification/verification request
|
||||||
|
LOC_API_ADAPTER_REQUEST_ASSISTANCE_DATA, // Assistance data, eg: time, predicted orbits request
|
||||||
|
LOC_API_ADAPTER_REQUEST_LOCATION_SERVER, // Request for location server
|
||||||
|
LOC_API_ADAPTER_REPORT_IOCTL, // Callback report for loc_ioctl
|
||||||
|
LOC_API_ADAPTER_REPORT_STATUS, // Misc status report: eg, engine state
|
||||||
|
LOC_API_ADAPTER_REQUEST_WIFI, //
|
||||||
|
LOC_API_ADAPTER_SENSOR_STATUS, //
|
||||||
|
LOC_API_ADAPTER_REQUEST_TIME_SYNC, //
|
||||||
|
LOC_API_ADAPTER_REPORT_SPI, //
|
||||||
|
LOC_API_ADAPTER_REPORT_NI_GEOFENCE, //
|
||||||
|
LOC_API_ADAPTER_GEOFENCE_GEN_ALERT, //
|
||||||
|
LOC_API_ADAPTER_REPORT_GENFENCE_BREACH, //
|
||||||
|
LOC_API_ADAPTER_PEDOMETER_CTRL, //
|
||||||
|
LOC_API_ADAPTER_MOTION_CTRL, //
|
||||||
|
LOC_API_ADAPTER_REQUEST_WIFI_AP_DATA, // Wifi ap data
|
||||||
|
LOC_API_ADAPTER_BATCH_FULL, // Batching on full
|
||||||
|
LOC_API_ADAPTER_BATCHED_POSITION_REPORT, // Batching on fix
|
||||||
|
|
||||||
|
LOC_API_ADAPTER_EVENT_MAX
|
||||||
|
};
|
||||||
|
|
||||||
|
#define LOC_API_ADAPTER_BIT_PARSED_POSITION_REPORT (1<<LOC_API_ADAPTER_REPORT_POSITION)
|
||||||
|
#define LOC_API_ADAPTER_BIT_SATELLITE_REPORT (1<<LOC_API_ADAPTER_REPORT_SATELLITE)
|
||||||
|
#define LOC_API_ADAPTER_BIT_NMEA_1HZ_REPORT (1<<LOC_API_ADAPTER_REPORT_NMEA_1HZ)
|
||||||
|
#define LOC_API_ADAPTER_BIT_NMEA_POSITION_REPORT (1<<LOC_API_ADAPTER_REPORT_NMEA_POSITION)
|
||||||
|
#define LOC_API_ADAPTER_BIT_NI_NOTIFY_VERIFY_REQUEST (1<<LOC_API_ADAPTER_REQUEST_NI_NOTIFY_VERIFY)
|
||||||
|
#define LOC_API_ADAPTER_BIT_ASSISTANCE_DATA_REQUEST (1<<LOC_API_ADAPTER_REQUEST_ASSISTANCE_DATA)
|
||||||
|
#define LOC_API_ADAPTER_BIT_LOCATION_SERVER_REQUEST (1<<LOC_API_ADAPTER_REQUEST_LOCATION_SERVER)
|
||||||
|
#define LOC_API_ADAPTER_BIT_IOCTL_REPORT (1<<LOC_API_ADAPTER_REPORT_IOCTL)
|
||||||
|
#define LOC_API_ADAPTER_BIT_STATUS_REPORT (1<<LOC_API_ADAPTER_REPORT_STATUS)
|
||||||
|
#define LOC_API_ADAPTER_BIT_REQUEST_WIFI (1<<LOC_API_ADAPTER_REQUEST_WIFI)
|
||||||
|
#define LOC_API_ADAPTER_BIT_SENSOR_STATUS (1<<LOC_API_ADAPTER_SENSOR_STATUS)
|
||||||
|
#define LOC_API_ADAPTER_BIT_REQUEST_TIME_SYNC (1<<LOC_API_ADAPTER_REQUEST_TIME_SYNC)
|
||||||
|
#define LOC_API_ADAPTER_BIT_REPORT_SPI (1<<LOC_API_ADAPTER_REPORT_SPI)
|
||||||
|
#define LOC_API_ADAPTER_BIT_REPORT_NI_GEOFENCE (1<<LOC_API_ADAPTER_REPORT_NI_GEOFENCE)
|
||||||
|
#define LOC_API_ADAPTER_BIT_GEOFENCE_GEN_ALERT (1<<LOC_API_ADAPTER_GEOFENCE_GEN_ALERT)
|
||||||
|
#define LOC_API_ADAPTER_BIT_REPORT_GENFENCE_BREACH (1<<LOC_API_ADAPTER_REPORT_GENFENCE_BREACH)
|
||||||
|
#define LOC_API_ADAPTER_BIT_PEDOMETER_CTRL (1<<LOC_API_ADAPTER_PEDOMETER_CTRL)
|
||||||
|
#define LOC_API_ADAPTER_BIT_MOTION_CTRL (1<<LOC_API_ADAPTER_MOTION_CTRL)
|
||||||
|
#define LOC_API_ADAPTER_BIT_REQUEST_WIFI_AP_DATA (1<<LOC_API_ADAPTER_REQUEST_WIFI_AP_DATA)
|
||||||
|
#define LOC_API_ADAPTER_BIT_BATCH_FULL (1<<LOC_API_ADAPTER_BATCH_FULL)
|
||||||
|
#define LOC_API_ADAPTER_BIT_BATCHED_POSITION_REPORT (1<<LOC_API_ADAPTER_BATCHED_POSITION_REPORT)
|
||||||
|
|
||||||
|
typedef unsigned int LOC_API_ADAPTER_EVENT_MASK_T;
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif /* __cplusplus */
|
||||||
|
|
||||||
|
#endif /* GPS_EXTENDED_C_H */
|
||||||
|
|
257
gps/core/loc_core_log.cpp
Executable file
257
gps/core/loc_core_log.cpp
Executable file
@ -0,0 +1,257 @@
|
|||||||
|
/* Copyright (c) 2011-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.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define LOG_NDDEBUG 0
|
||||||
|
#define LOG_TAG "LocSvc_core_log"
|
||||||
|
|
||||||
|
#include <loc_log.h>
|
||||||
|
#include <log_util.h>
|
||||||
|
#include <loc_core_log.h>
|
||||||
|
|
||||||
|
void LocPosMode::logv() const
|
||||||
|
{
|
||||||
|
LOC_LOGV ("Position mode: %s\n Position recurrence: %s\n "
|
||||||
|
"min interval: %d\n preferred accuracy: %d\n "
|
||||||
|
"preferred time: %d\n credentials: %s provider: %s",
|
||||||
|
loc_get_position_mode_name(mode),
|
||||||
|
loc_get_position_recurrence_name(recurrence),
|
||||||
|
min_interval,
|
||||||
|
preferred_accuracy,
|
||||||
|
preferred_time,
|
||||||
|
credentials,
|
||||||
|
provider);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* GPS status names */
|
||||||
|
static loc_name_val_s_type gps_status_name[] =
|
||||||
|
{
|
||||||
|
NAME_VAL( GPS_STATUS_NONE ),
|
||||||
|
NAME_VAL( GPS_STATUS_SESSION_BEGIN ),
|
||||||
|
NAME_VAL( GPS_STATUS_SESSION_END ),
|
||||||
|
NAME_VAL( GPS_STATUS_ENGINE_ON ),
|
||||||
|
NAME_VAL( GPS_STATUS_ENGINE_OFF ),
|
||||||
|
};
|
||||||
|
static int gps_status_num = sizeof(gps_status_name) / sizeof(loc_name_val_s_type);
|
||||||
|
|
||||||
|
/* Find Android GPS status name */
|
||||||
|
const char* loc_get_gps_status_name(GpsStatusValue gps_status)
|
||||||
|
{
|
||||||
|
return loc_get_name_from_val(gps_status_name, gps_status_num,
|
||||||
|
(long) gps_status);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static loc_name_val_s_type loc_eng_position_modes[] =
|
||||||
|
{
|
||||||
|
NAME_VAL( LOC_POSITION_MODE_STANDALONE ),
|
||||||
|
NAME_VAL( LOC_POSITION_MODE_MS_BASED ),
|
||||||
|
NAME_VAL( LOC_POSITION_MODE_MS_ASSISTED ),
|
||||||
|
NAME_VAL( LOC_POSITION_MODE_RESERVED_1 ),
|
||||||
|
NAME_VAL( LOC_POSITION_MODE_RESERVED_2 ),
|
||||||
|
NAME_VAL( LOC_POSITION_MODE_RESERVED_3 ),
|
||||||
|
NAME_VAL( LOC_POSITION_MODE_RESERVED_4 ),
|
||||||
|
NAME_VAL( LOC_POSITION_MODE_RESERVED_5 )
|
||||||
|
};
|
||||||
|
static int loc_eng_position_mode_num = sizeof(loc_eng_position_modes) / sizeof(loc_name_val_s_type);
|
||||||
|
|
||||||
|
const char* loc_get_position_mode_name(GpsPositionMode mode)
|
||||||
|
{
|
||||||
|
return loc_get_name_from_val(loc_eng_position_modes, loc_eng_position_mode_num, (long) mode);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static loc_name_val_s_type loc_eng_position_recurrences[] =
|
||||||
|
{
|
||||||
|
NAME_VAL( GPS_POSITION_RECURRENCE_PERIODIC ),
|
||||||
|
NAME_VAL( GPS_POSITION_RECURRENCE_SINGLE )
|
||||||
|
};
|
||||||
|
static int loc_eng_position_recurrence_num = sizeof(loc_eng_position_recurrences) / sizeof(loc_name_val_s_type);
|
||||||
|
|
||||||
|
const char* loc_get_position_recurrence_name(GpsPositionRecurrence recur)
|
||||||
|
{
|
||||||
|
return loc_get_name_from_val(loc_eng_position_recurrences, loc_eng_position_recurrence_num, (long) recur);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static loc_name_val_s_type loc_eng_aiding_data_bits[] =
|
||||||
|
{
|
||||||
|
NAME_VAL( GPS_DELETE_EPHEMERIS ),
|
||||||
|
NAME_VAL( GPS_DELETE_ALMANAC ),
|
||||||
|
NAME_VAL( GPS_DELETE_POSITION ),
|
||||||
|
NAME_VAL( GPS_DELETE_TIME ),
|
||||||
|
NAME_VAL( GPS_DELETE_IONO ),
|
||||||
|
NAME_VAL( GPS_DELETE_UTC ),
|
||||||
|
NAME_VAL( GPS_DELETE_HEALTH ),
|
||||||
|
NAME_VAL( GPS_DELETE_SVDIR ),
|
||||||
|
NAME_VAL( GPS_DELETE_SVSTEER ),
|
||||||
|
NAME_VAL( GPS_DELETE_SADATA ),
|
||||||
|
NAME_VAL( GPS_DELETE_RTI ),
|
||||||
|
NAME_VAL( GPS_DELETE_CELLDB_INFO ),
|
||||||
|
NAME_VAL( GPS_DELETE_ALMANAC_CORR ),
|
||||||
|
NAME_VAL( GPS_DELETE_FREQ_BIAS_EST ),
|
||||||
|
NAME_VAL( GLO_DELETE_EPHEMERIS ),
|
||||||
|
NAME_VAL( GLO_DELETE_ALMANAC ),
|
||||||
|
NAME_VAL( GLO_DELETE_SVDIR ),
|
||||||
|
NAME_VAL( GLO_DELETE_SVSTEER ),
|
||||||
|
NAME_VAL( GLO_DELETE_ALMANAC_CORR ),
|
||||||
|
NAME_VAL( GPS_DELETE_TIME_GPS ),
|
||||||
|
NAME_VAL( GLO_DELETE_TIME ),
|
||||||
|
NAME_VAL( BDS_DELETE_SVDIR ),
|
||||||
|
NAME_VAL( BDS_DELETE_SVSTEER ),
|
||||||
|
NAME_VAL( BDS_DELETE_TIME ),
|
||||||
|
NAME_VAL( BDS_DELETE_ALMANAC_CORR ),
|
||||||
|
NAME_VAL( BDS_DELETE_EPHEMERIS ),
|
||||||
|
NAME_VAL( BDS_DELETE_ALMANAC ),
|
||||||
|
NAME_VAL( GPS_DELETE_ALL)
|
||||||
|
};
|
||||||
|
static int loc_eng_aiding_data_bit_num = sizeof(loc_eng_aiding_data_bits) / sizeof(loc_name_val_s_type);
|
||||||
|
|
||||||
|
const char* loc_get_aiding_data_mask_names(GpsAidingData data)
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static loc_name_val_s_type loc_eng_agps_types[] =
|
||||||
|
{
|
||||||
|
NAME_VAL( AGPS_TYPE_INVALID ),
|
||||||
|
NAME_VAL( AGPS_TYPE_ANY ),
|
||||||
|
NAME_VAL( AGPS_TYPE_SUPL ),
|
||||||
|
NAME_VAL( AGPS_TYPE_C2K ),
|
||||||
|
NAME_VAL( AGPS_TYPE_WWAN_ANY )
|
||||||
|
};
|
||||||
|
static int loc_eng_agps_type_num = sizeof(loc_eng_agps_types) / sizeof(loc_name_val_s_type);
|
||||||
|
|
||||||
|
const char* loc_get_agps_type_name(AGpsType type)
|
||||||
|
{
|
||||||
|
return loc_get_name_from_val(loc_eng_agps_types, loc_eng_agps_type_num, (long) type);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static loc_name_val_s_type loc_eng_ni_types[] =
|
||||||
|
{
|
||||||
|
NAME_VAL( GPS_NI_TYPE_VOICE ),
|
||||||
|
NAME_VAL( GPS_NI_TYPE_UMTS_SUPL ),
|
||||||
|
NAME_VAL( GPS_NI_TYPE_UMTS_CTRL_PLANE )
|
||||||
|
};
|
||||||
|
static int loc_eng_ni_type_num = sizeof(loc_eng_ni_types) / sizeof(loc_name_val_s_type);
|
||||||
|
|
||||||
|
const char* loc_get_ni_type_name(GpsNiType type)
|
||||||
|
{
|
||||||
|
return loc_get_name_from_val(loc_eng_ni_types, loc_eng_ni_type_num, (long) type);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static loc_name_val_s_type loc_eng_ni_responses[] =
|
||||||
|
{
|
||||||
|
NAME_VAL( GPS_NI_RESPONSE_ACCEPT ),
|
||||||
|
NAME_VAL( GPS_NI_RESPONSE_DENY ),
|
||||||
|
NAME_VAL( GPS_NI_RESPONSE_DENY )
|
||||||
|
};
|
||||||
|
static int loc_eng_ni_reponse_num = sizeof(loc_eng_ni_responses) / sizeof(loc_name_val_s_type);
|
||||||
|
|
||||||
|
const char* loc_get_ni_response_name(GpsUserResponseType response)
|
||||||
|
{
|
||||||
|
return loc_get_name_from_val(loc_eng_ni_responses, loc_eng_ni_reponse_num, (long) response);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static loc_name_val_s_type loc_eng_ni_encodings[] =
|
||||||
|
{
|
||||||
|
NAME_VAL( GPS_ENC_NONE ),
|
||||||
|
NAME_VAL( GPS_ENC_SUPL_GSM_DEFAULT ),
|
||||||
|
NAME_VAL( GPS_ENC_SUPL_UTF8 ),
|
||||||
|
NAME_VAL( GPS_ENC_SUPL_UCS2 ),
|
||||||
|
NAME_VAL( GPS_ENC_UNKNOWN )
|
||||||
|
};
|
||||||
|
static int loc_eng_ni_encoding_num = sizeof(loc_eng_ni_encodings) / sizeof(loc_name_val_s_type);
|
||||||
|
|
||||||
|
const char* loc_get_ni_encoding_name(GpsNiEncodingType encoding)
|
||||||
|
{
|
||||||
|
return loc_get_name_from_val(loc_eng_ni_encodings, loc_eng_ni_encoding_num, (long) encoding);
|
||||||
|
}
|
||||||
|
|
||||||
|
static loc_name_val_s_type loc_eng_agps_bears[] =
|
||||||
|
{
|
||||||
|
NAME_VAL( AGPS_APN_BEARER_INVALID ),
|
||||||
|
NAME_VAL( AGPS_APN_BEARER_IPV4 ),
|
||||||
|
NAME_VAL( AGPS_APN_BEARER_IPV4 ),
|
||||||
|
NAME_VAL( AGPS_APN_BEARER_IPV4V6 )
|
||||||
|
};
|
||||||
|
static int loc_eng_agps_bears_num = sizeof(loc_eng_agps_bears) / sizeof(loc_name_val_s_type);
|
||||||
|
|
||||||
|
const char* loc_get_agps_bear_name(ApnIpType bearer)
|
||||||
|
{
|
||||||
|
return loc_get_name_from_val(loc_eng_agps_bears, loc_eng_agps_bears_num, (long) bearer);
|
||||||
|
}
|
||||||
|
|
||||||
|
static loc_name_val_s_type loc_eng_server_types[] =
|
||||||
|
{
|
||||||
|
NAME_VAL( LOC_AGPS_CDMA_PDE_SERVER ),
|
||||||
|
NAME_VAL( LOC_AGPS_CUSTOM_PDE_SERVER ),
|
||||||
|
NAME_VAL( LOC_AGPS_MPC_SERVER ),
|
||||||
|
NAME_VAL( LOC_AGPS_SUPL_SERVER )
|
||||||
|
};
|
||||||
|
static int loc_eng_server_types_num = sizeof(loc_eng_server_types) / sizeof(loc_name_val_s_type);
|
||||||
|
|
||||||
|
const char* loc_get_server_type_name(LocServerType type)
|
||||||
|
{
|
||||||
|
return loc_get_name_from_val(loc_eng_server_types, loc_eng_server_types_num, (long) type);
|
||||||
|
}
|
||||||
|
|
||||||
|
static loc_name_val_s_type loc_eng_position_sess_status_types[] =
|
||||||
|
{
|
||||||
|
NAME_VAL( LOC_SESS_SUCCESS ),
|
||||||
|
NAME_VAL( LOC_SESS_INTERMEDIATE ),
|
||||||
|
NAME_VAL( LOC_SESS_FAILURE )
|
||||||
|
};
|
||||||
|
static int loc_eng_position_sess_status_num = sizeof(loc_eng_position_sess_status_types) / sizeof(loc_name_val_s_type);
|
||||||
|
|
||||||
|
const char* loc_get_position_sess_status_name(enum loc_sess_status status)
|
||||||
|
{
|
||||||
|
return loc_get_name_from_val(loc_eng_position_sess_status_types, loc_eng_position_sess_status_num, (long) status);
|
||||||
|
}
|
||||||
|
|
||||||
|
static loc_name_val_s_type loc_eng_agps_status_names[] =
|
||||||
|
{
|
||||||
|
NAME_VAL( GPS_REQUEST_AGPS_DATA_CONN ),
|
||||||
|
NAME_VAL( GPS_RELEASE_AGPS_DATA_CONN ),
|
||||||
|
NAME_VAL( GPS_AGPS_DATA_CONNECTED ),
|
||||||
|
NAME_VAL( GPS_AGPS_DATA_CONN_DONE ),
|
||||||
|
NAME_VAL( GPS_AGPS_DATA_CONN_FAILED )
|
||||||
|
};
|
||||||
|
static int loc_eng_agps_status_num = sizeof(loc_eng_agps_status_names) / sizeof(loc_name_val_s_type);
|
||||||
|
|
||||||
|
const char* loc_get_agps_status_name(AGpsStatusValue status)
|
||||||
|
{
|
||||||
|
return loc_get_name_from_val(loc_eng_agps_status_names, loc_eng_agps_status_num, (long) status);
|
||||||
|
}
|
58
gps/core/loc_core_log.h
Executable file
58
gps/core/loc_core_log.h
Executable file
@ -0,0 +1,58 @@
|
|||||||
|
/* Copyright (c) 2011-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_CORE_LOG_H
|
||||||
|
#define LOC_CORE_LOG_H
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C"
|
||||||
|
{
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <gps_extended.h>
|
||||||
|
|
||||||
|
const char* loc_get_gps_status_name(GpsStatusValue gps_status);
|
||||||
|
const char* loc_get_position_mode_name(GpsPositionMode mode);
|
||||||
|
const char* loc_get_position_recurrence_name(GpsPositionRecurrence recur);
|
||||||
|
const char* loc_get_aiding_data_mask_names(GpsAidingData data);
|
||||||
|
const char* loc_get_agps_type_name(AGpsType type);
|
||||||
|
const char* loc_get_ni_type_name(GpsNiType type);
|
||||||
|
const char* loc_get_ni_response_name(GpsUserResponseType response);
|
||||||
|
const char* loc_get_ni_encoding_name(GpsNiEncodingType encoding);
|
||||||
|
const char* loc_get_agps_bear_name(ApnIpType bear);
|
||||||
|
const char* loc_get_server_type_name(LocServerType type);
|
||||||
|
const char* loc_get_position_sess_status_name(enum loc_sess_status status);
|
||||||
|
const char* loc_get_agps_status_name(AGpsStatusValue status);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* LOC_CORE_LOG_H */
|
101
gps/etc/gps.conf
Executable file
101
gps/etc/gps.conf
Executable file
@ -0,0 +1,101 @@
|
|||||||
|
#Uncommenting these urls would only enable
|
||||||
|
#the power up auto injection and force injection(test case).
|
||||||
|
#XTRA_SERVER_1=http://xtra1.gpsonextra.net/xtra.bin
|
||||||
|
#XTRA_SERVER_2=http://xtra2.gpsonextra.net/xtra.bin
|
||||||
|
#XTRA_SERVER_3=http://xtra3.gpsonextra.net/xtra.bin
|
||||||
|
|
||||||
|
# Error Estimate
|
||||||
|
# _SET = 1
|
||||||
|
# _CLEAR = 0
|
||||||
|
ERR_ESTIMATE=0
|
||||||
|
|
||||||
|
#Test
|
||||||
|
NTP_SERVER=time.gpsonextra.net
|
||||||
|
#Asia
|
||||||
|
# NTP_SERVER=asia.pool.ntp.org
|
||||||
|
#Europe
|
||||||
|
# NTP_SERVER=europe.pool.ntp.org
|
||||||
|
#North America
|
||||||
|
# NTP_SERVER=north-america.pool.ntp.org
|
||||||
|
|
||||||
|
# DEBUG LEVELS: 0 - none, 1 - Error, 2 - Warning, 3 - Info
|
||||||
|
# 4 - Debug, 5 - Verbose
|
||||||
|
# If DEBUG_LEVEL is commented, Android's logging levels will be used
|
||||||
|
DEBUG_LEVEL = 4
|
||||||
|
|
||||||
|
# Intermediate position report, 1=enable, 0=disable
|
||||||
|
INTERMEDIATE_POS=0
|
||||||
|
|
||||||
|
# Below bit mask configures how GPS functionalities
|
||||||
|
# should be locked when user turns off GPS on Settings
|
||||||
|
# Set bit 0x1 if MO GPS functionalities are to be locked
|
||||||
|
# Set bit 0x2 if NI GPS functionalities are to be locked
|
||||||
|
# default - non is locked for backward compatibility
|
||||||
|
#GPS_LOCK = 0
|
||||||
|
|
||||||
|
# supl version 1.0
|
||||||
|
SUPL_VER=0x10000
|
||||||
|
|
||||||
|
# Emergency SUPL, 1=enable, 0=disable
|
||||||
|
SUPL_ES=1
|
||||||
|
|
||||||
|
# GPS Capabilities bit mask
|
||||||
|
# SCHEDULING = 0x01
|
||||||
|
# MSB = 0x02
|
||||||
|
# MSA = 0x04
|
||||||
|
# ON_DEMAND_TIME = 0x10
|
||||||
|
# GEOFENCE = 0x20
|
||||||
|
# default = ON_DEMAND_TIME | MSA | MSB | SCHEDULING | GEOFENCE
|
||||||
|
CAPABILITIES=0x37
|
||||||
|
|
||||||
|
# Accuracy threshold for intermediate positions
|
||||||
|
# less accurate positions are ignored, 0 for passing all positions
|
||||||
|
# ACCURACY_THRES=5000
|
||||||
|
|
||||||
|
################################
|
||||||
|
##### AGPS server settings #####
|
||||||
|
################################
|
||||||
|
|
||||||
|
# FOR SUPL SUPPORT, set the following
|
||||||
|
# SUPL_HOST=supl.host.com or IP
|
||||||
|
# SUPL_PORT=1234
|
||||||
|
SUPL_HOST=supl.google.com
|
||||||
|
SUPL_PORT=7276
|
||||||
|
|
||||||
|
# FOR C2K PDE SUPPORT, set the following
|
||||||
|
# C2K_HOST=c2k.pde.com or IP
|
||||||
|
# C2K_PORT=1234
|
||||||
|
|
||||||
|
# Bitmask of slots that are available
|
||||||
|
# for write/install to, where 1s indicate writable,
|
||||||
|
# and the default value is 0 where no slots
|
||||||
|
# are writable. For example, AGPS_CERT_WRITABLE_MASK
|
||||||
|
# of b1000001010 makes 3 slots available
|
||||||
|
# for installation (slots 2, 4, and 10)
|
||||||
|
# and the remaining 7 slots unwritable.
|
||||||
|
#AGPS_CERT_WRITABLE_MASK=0
|
||||||
|
|
||||||
|
####################################
|
||||||
|
# LTE Positioning Profile Settings
|
||||||
|
####################################
|
||||||
|
# 0: Enable RRLP on LTE(Default)
|
||||||
|
# 1: Enable LPP_User_Plane on LTE
|
||||||
|
# 2: Enable LPP_Control_Plane
|
||||||
|
# 3: Enable both LPP_User_Plane and LPP_Control_Plane
|
||||||
|
LPP_PROFILE = 0
|
||||||
|
|
||||||
|
################################
|
||||||
|
# EXTRA SETTINGS
|
||||||
|
################################
|
||||||
|
# NMEA provider (1=Modem Processor, 0=Application Processor)
|
||||||
|
NMEA_PROVIDER=0
|
||||||
|
# Mark if it is a SGLTE target (1=SGLTE, 0=nonSGLTE)
|
||||||
|
SGLTE_TARGET=0
|
||||||
|
|
||||||
|
##################################################
|
||||||
|
# Select Positioning Protocol on A-GLONASS system
|
||||||
|
##################################################
|
||||||
|
# 0x1: RRC CPlane
|
||||||
|
# 0x2: RRLP UPlane
|
||||||
|
# 0x4: LLP Uplane
|
||||||
|
A_GLONASS_POS_PROTOCOL_SELECT = 0
|
42
gps/etc/sap.conf
Executable file
42
gps/etc/sap.conf
Executable file
@ -0,0 +1,42 @@
|
|||||||
|
################################
|
||||||
|
# Sensor Settings
|
||||||
|
################################
|
||||||
|
|
||||||
|
# Needs to be set explicitly based on sensor
|
||||||
|
# There is no default value.
|
||||||
|
# used in loc_eng_reinit
|
||||||
|
#GYRO_BIAS_RANDOM_WALK=
|
||||||
|
#ACCEL_RANDOM_WALK_SPECTRAL_DENSITY=
|
||||||
|
#ANGLE_RANDOM_WALK_SPECTRAL_DENSITY=
|
||||||
|
#RATE_RANDOM_WALK_SPECTRAL_DENSITY=
|
||||||
|
#VELOCITY_RANDOM_WALK_SPECTRAL_DENSITY=
|
||||||
|
|
||||||
|
# Sensor Sampling Rate Parameters for Low-Data Rate Filter (should be greater than 0)
|
||||||
|
# used in loc_eng_reinit
|
||||||
|
SENSOR_ACCEL_BATCHES_PER_SEC=3
|
||||||
|
SENSOR_ACCEL_SAMPLES_PER_BATCH=5
|
||||||
|
SENSOR_GYRO_BATCHES_PER_SEC=3
|
||||||
|
SENSOR_GYRO_SAMPLES_PER_BATCH=5
|
||||||
|
# Sensor Sampling Rate Parameters for High-Data Rate Filter (should be greater than 0)
|
||||||
|
SENSOR_ACCEL_BATCHES_PER_SEC_HIGH=4
|
||||||
|
SENSOR_ACCEL_SAMPLES_PER_BATCH_HIGH=25
|
||||||
|
SENSOR_GYRO_BATCHES_PER_SEC_HIGH=4
|
||||||
|
SENSOR_GYRO_SAMPLES_PER_BATCH_HIGH=25
|
||||||
|
|
||||||
|
# Sensor Control Mode (0=AUTO, 1=FORCE_ON)
|
||||||
|
# used in loc_eng_reinit
|
||||||
|
SENSOR_CONTROL_MODE=0
|
||||||
|
|
||||||
|
# Enable or Disable Sensors for GPS use (0=Enable, 1=Disable)
|
||||||
|
# used in loc_eng_reinit
|
||||||
|
SENSOR_USAGE=0
|
||||||
|
|
||||||
|
# Choose GSIFF sensor provider (1=Snapdragon Sensors Core, 2=Android NDK)
|
||||||
|
SENSOR_PROVIDER=2
|
||||||
|
|
||||||
|
# Bit mask used to define which sensor algorithms are used.
|
||||||
|
# Setting each bit has the following definition:
|
||||||
|
# 0x1 - DISABLE_INS_POSITIONING_FILTER
|
||||||
|
# 0x0 - ENABLE_INS_POSITIONING_FILTER
|
||||||
|
SENSOR_ALGORITHM_CONFIG_MASK=0x1
|
||||||
|
|
13
gps/loc_api/Android.mk
Executable file
13
gps/loc_api/Android.mk
Executable file
@ -0,0 +1,13 @@
|
|||||||
|
LOCAL_PATH := $(call my-dir)
|
||||||
|
|
||||||
|
# add RPC dirs if RPC is available
|
||||||
|
ifneq ($(TARGET_NO_RPC),true)
|
||||||
|
|
||||||
|
GPS_DIR_LIST += $(LOCAL_PATH)/libloc_api-rpc-50001/
|
||||||
|
|
||||||
|
endif #TARGET_NO_RPC
|
||||||
|
|
||||||
|
GPS_DIR_LIST += $(LOCAL_PATH)/libloc_api_50001/
|
||||||
|
|
||||||
|
#call the subfolders
|
||||||
|
include $(addsuffix Android.mk, $(GPS_DIR_LIST))
|
13
gps/loc_api/NOTICE
Executable file
13
gps/loc_api/NOTICE
Executable file
@ -0,0 +1,13 @@
|
|||||||
|
Copyright (c) 2009, QUALCOMM USA, INC.
|
||||||
|
|
||||||
|
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 QUALCOMM USA, INC. 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 BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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.
|
102
gps/loc_api/libloc_api_50001/Android.mk
Executable file
102
gps/loc_api/libloc_api_50001/Android.mk
Executable file
@ -0,0 +1,102 @@
|
|||||||
|
ifneq ($(BUILD_TINY_ANDROID),true)
|
||||||
|
#Compile this library only for builds with the latest modem image
|
||||||
|
|
||||||
|
LOCAL_PATH := $(call my-dir)
|
||||||
|
|
||||||
|
include $(CLEAR_VARS)
|
||||||
|
|
||||||
|
LOCAL_MODULE := libloc_eng
|
||||||
|
LOCAL_MODULE_OWNER := qcom
|
||||||
|
|
||||||
|
LOCAL_MODULE_TAGS := optional
|
||||||
|
|
||||||
|
LOCAL_SHARED_LIBRARIES := \
|
||||||
|
libutils \
|
||||||
|
libcutils \
|
||||||
|
libdl \
|
||||||
|
liblog \
|
||||||
|
libloc_core \
|
||||||
|
libgps.utils
|
||||||
|
|
||||||
|
LOCAL_SRC_FILES += \
|
||||||
|
loc_eng.cpp \
|
||||||
|
loc_eng_agps.cpp \
|
||||||
|
loc_eng_xtra.cpp \
|
||||||
|
loc_eng_ni.cpp \
|
||||||
|
loc_eng_log.cpp \
|
||||||
|
loc_eng_nmea.cpp \
|
||||||
|
LocEngAdapter.cpp
|
||||||
|
|
||||||
|
LOCAL_SRC_FILES += \
|
||||||
|
loc_eng_dmn_conn.cpp \
|
||||||
|
loc_eng_dmn_conn_handler.cpp \
|
||||||
|
loc_eng_dmn_conn_thread_helper.c \
|
||||||
|
loc_eng_dmn_conn_glue_msg.c \
|
||||||
|
loc_eng_dmn_conn_glue_pipe.c
|
||||||
|
|
||||||
|
LOCAL_CFLAGS += \
|
||||||
|
-fno-short-enums \
|
||||||
|
-D_ANDROID_
|
||||||
|
|
||||||
|
LOCAL_C_INCLUDES:= \
|
||||||
|
$(TARGET_OUT_HEADERS)/gps.utils \
|
||||||
|
$(TARGET_OUT_HEADERS)/libloc_core \
|
||||||
|
device/samsung/viennalte/gps/loc_api/libloc_api_50001
|
||||||
|
|
||||||
|
LOCAL_COPY_HEADERS_TO:= libloc_eng/
|
||||||
|
LOCAL_COPY_HEADERS:= \
|
||||||
|
LocEngAdapter.h \
|
||||||
|
loc.h \
|
||||||
|
loc_eng.h \
|
||||||
|
loc_eng_xtra.h \
|
||||||
|
loc_eng_ni.h \
|
||||||
|
loc_eng_agps.h \
|
||||||
|
loc_eng_msg.h \
|
||||||
|
loc_eng_log.h
|
||||||
|
|
||||||
|
LOCAL_PRELINK_MODULE := false
|
||||||
|
|
||||||
|
include $(BUILD_SHARED_LIBRARY)
|
||||||
|
|
||||||
|
include $(CLEAR_VARS)
|
||||||
|
|
||||||
|
LOCAL_MODULE := gps.msm8974
|
||||||
|
LOCAL_MODULE_OWNER := qcom
|
||||||
|
|
||||||
|
LOCAL_MODULE_TAGS := optional
|
||||||
|
|
||||||
|
## Libs
|
||||||
|
|
||||||
|
LOCAL_SHARED_LIBRARIES := \
|
||||||
|
libutils \
|
||||||
|
libcutils \
|
||||||
|
liblog \
|
||||||
|
libloc_eng \
|
||||||
|
libloc_core \
|
||||||
|
libgps.utils \
|
||||||
|
libdl \
|
||||||
|
libandroid_runtime
|
||||||
|
|
||||||
|
LOCAL_SRC_FILES += \
|
||||||
|
loc.cpp \
|
||||||
|
gps.c
|
||||||
|
|
||||||
|
LOCAL_CFLAGS += \
|
||||||
|
-fno-short-enums \
|
||||||
|
-D_ANDROID_ \
|
||||||
|
|
||||||
|
ifeq ($(TARGET_USES_QCOM_BSP), true)
|
||||||
|
LOCAL_CFLAGS += -DTARGET_USES_QCOM_BSP
|
||||||
|
endif
|
||||||
|
|
||||||
|
## Includes
|
||||||
|
LOCAL_C_INCLUDES:= \
|
||||||
|
$(TARGET_OUT_HEADERS)/gps.utils \
|
||||||
|
$(TARGET_OUT_HEADERS)/libloc_core
|
||||||
|
|
||||||
|
LOCAL_PRELINK_MODULE := false
|
||||||
|
LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/hw
|
||||||
|
|
||||||
|
include $(BUILD_SHARED_LIBRARY)
|
||||||
|
|
||||||
|
endif # not BUILD_TINY_ANDROID
|
297
gps/loc_api/libloc_api_50001/LocEngAdapter.cpp
Executable file
297
gps/loc_api/libloc_api_50001/LocEngAdapter.cpp
Executable file
@ -0,0 +1,297 @@
|
|||||||
|
/* Copyright (c) 2011-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.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#define LOG_NDDEBUG 0
|
||||||
|
#define LOG_TAG "LocSvc_EngAdapter"
|
||||||
|
|
||||||
|
#include <LocEngAdapter.h>
|
||||||
|
#include "loc_eng_msg.h"
|
||||||
|
#include "loc_log.h"
|
||||||
|
|
||||||
|
using namespace loc_core;
|
||||||
|
|
||||||
|
LocInternalAdapter::LocInternalAdapter(LocEngAdapter* adapter) :
|
||||||
|
LocAdapterBase(adapter->getMsgTask()),
|
||||||
|
mLocEngAdapter(adapter)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
void LocInternalAdapter::setPositionModeInt(LocPosMode& posMode) {
|
||||||
|
sendMsg(new LocEngPositionMode(mLocEngAdapter, posMode));
|
||||||
|
}
|
||||||
|
void LocInternalAdapter::startFixInt() {
|
||||||
|
sendMsg(new LocEngStartFix(mLocEngAdapter));
|
||||||
|
}
|
||||||
|
void LocInternalAdapter::stopFixInt() {
|
||||||
|
sendMsg(new LocEngStopFix(mLocEngAdapter));
|
||||||
|
}
|
||||||
|
void LocInternalAdapter::getZppInt() {
|
||||||
|
sendMsg(new LocEngGetZpp(mLocEngAdapter));
|
||||||
|
}
|
||||||
|
void LocInternalAdapter::setUlpProxy(UlpProxyBase* ulp) {
|
||||||
|
struct LocSetUlpProxy : public LocMsg {
|
||||||
|
LocAdapterBase* mAdapter;
|
||||||
|
UlpProxyBase* mUlp;
|
||||||
|
inline LocSetUlpProxy(LocAdapterBase* adapter, UlpProxyBase* ulp) :
|
||||||
|
LocMsg(), mAdapter(adapter), mUlp(ulp) {
|
||||||
|
}
|
||||||
|
virtual void proc() const {
|
||||||
|
LOC_LOGV("%s] ulp %p adapter %p", __func__,
|
||||||
|
mUlp, mAdapter);
|
||||||
|
mAdapter->setUlpProxy(mUlp);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
sendMsg(new LocSetUlpProxy(mLocEngAdapter, ulp));
|
||||||
|
}
|
||||||
|
|
||||||
|
LocEngAdapter::LocEngAdapter(LOC_API_ADAPTER_EVENT_MASK_T mask,
|
||||||
|
void* owner, ContextBase* context,
|
||||||
|
MsgTask::tCreate tCreator) :
|
||||||
|
LocAdapterBase(mask,
|
||||||
|
//Get the AFW context if VzW context has not already been intialized in
|
||||||
|
//loc_ext
|
||||||
|
context == NULL?
|
||||||
|
LocDualContext::getLocFgContext(tCreator,
|
||||||
|
LocDualContext::mLocationHalName)
|
||||||
|
:context),
|
||||||
|
mOwner(owner), mInternalAdapter(new LocInternalAdapter(this)),
|
||||||
|
mUlp(new UlpProxyBase()), mNavigating(false),
|
||||||
|
mAgpsEnabled(false), mCPIEnabled(false)
|
||||||
|
{
|
||||||
|
memset(&mFixCriteria, 0, sizeof(mFixCriteria));
|
||||||
|
mFixCriteria.mode = LOC_POSITION_MODE_INVALID;
|
||||||
|
LOC_LOGD("LocEngAdapter created");
|
||||||
|
}
|
||||||
|
|
||||||
|
inline
|
||||||
|
LocEngAdapter::~LocEngAdapter()
|
||||||
|
{
|
||||||
|
delete mInternalAdapter;
|
||||||
|
LOC_LOGV("LocEngAdapter deleted");
|
||||||
|
}
|
||||||
|
|
||||||
|
void LocEngAdapter::setUlpProxy(UlpProxyBase* ulp)
|
||||||
|
{
|
||||||
|
if (ulp == mUlp) {
|
||||||
|
//This takes care of the case when double initalization happens
|
||||||
|
//and we get the same object back for UlpProxyBase . Do nothing
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
delete mUlp;
|
||||||
|
LOC_LOGV("%s] %p", __func__, ulp);
|
||||||
|
if (NULL == ulp) {
|
||||||
|
ulp = new UlpProxyBase();
|
||||||
|
}
|
||||||
|
mUlp = ulp;
|
||||||
|
|
||||||
|
if (LOC_POSITION_MODE_INVALID != mFixCriteria.mode) {
|
||||||
|
// need to send this mode and start msg to ULP
|
||||||
|
mUlp->sendFixMode(mFixCriteria);
|
||||||
|
mUlp->sendStartFix();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void LocInternalAdapter::reportPosition(UlpLocation &location,
|
||||||
|
GpsLocationExtended &locationExtended,
|
||||||
|
void* locationExt,
|
||||||
|
enum loc_sess_status status,
|
||||||
|
LocPosTechMask loc_technology_mask)
|
||||||
|
{
|
||||||
|
sendMsg(new LocEngReportPosition(mLocEngAdapter,
|
||||||
|
location,
|
||||||
|
locationExtended,
|
||||||
|
locationExt,
|
||||||
|
status,
|
||||||
|
loc_technology_mask));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void LocEngAdapter::reportPosition(UlpLocation &location,
|
||||||
|
GpsLocationExtended &locationExtended,
|
||||||
|
void* locationExt,
|
||||||
|
enum loc_sess_status status,
|
||||||
|
LocPosTechMask loc_technology_mask)
|
||||||
|
{
|
||||||
|
if (! mUlp->reportPosition(location,
|
||||||
|
locationExtended,
|
||||||
|
locationExt,
|
||||||
|
status,
|
||||||
|
loc_technology_mask )) {
|
||||||
|
mInternalAdapter->reportPosition(location,
|
||||||
|
locationExtended,
|
||||||
|
locationExt,
|
||||||
|
status,
|
||||||
|
loc_technology_mask);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void LocInternalAdapter::reportSv(GpsSvStatus &svStatus,
|
||||||
|
GpsLocationExtended &locationExtended,
|
||||||
|
void* svExt){
|
||||||
|
sendMsg(new LocEngReportSv(mLocEngAdapter, svStatus,
|
||||||
|
locationExtended, svExt));
|
||||||
|
}
|
||||||
|
|
||||||
|
void LocEngAdapter::reportSv(GpsSvStatus &svStatus,
|
||||||
|
GpsLocationExtended &locationExtended,
|
||||||
|
void* svExt)
|
||||||
|
{
|
||||||
|
|
||||||
|
// We want to send SV info to ULP to help it in determining GNSS
|
||||||
|
// signal strength ULP will forward the SV reports to HAL without
|
||||||
|
// any modifications
|
||||||
|
if (! mUlp->reportSv(svStatus, locationExtended, svExt)) {
|
||||||
|
mInternalAdapter->reportSv(svStatus, locationExtended, svExt);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void LocEngAdapter::setInSession(bool inSession)
|
||||||
|
{
|
||||||
|
mNavigating = inSession;
|
||||||
|
mLocApi->setInSession(inSession);
|
||||||
|
if (!mNavigating) {
|
||||||
|
mFixCriteria.mode = LOC_POSITION_MODE_INVALID;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void LocInternalAdapter::reportStatus(GpsStatusValue status)
|
||||||
|
{
|
||||||
|
sendMsg(new LocEngReportStatus(mLocEngAdapter, status));
|
||||||
|
}
|
||||||
|
|
||||||
|
void LocEngAdapter::reportStatus(GpsStatusValue status)
|
||||||
|
{
|
||||||
|
if (!mUlp->reportStatus(status)) {
|
||||||
|
mInternalAdapter->reportStatus(status);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
inline
|
||||||
|
void LocEngAdapter::reportNmea(const char* nmea, int length)
|
||||||
|
{
|
||||||
|
sendMsg(new LocEngReportNmea(mOwner, nmea, length));
|
||||||
|
}
|
||||||
|
|
||||||
|
inline
|
||||||
|
bool LocEngAdapter::reportXtraServer(const char* url1,
|
||||||
|
const char* url2,
|
||||||
|
const char* url3,
|
||||||
|
const int maxlength)
|
||||||
|
{
|
||||||
|
if (mAgpsEnabled) {
|
||||||
|
sendMsg(new LocEngReportXtraServer(mOwner, url1,
|
||||||
|
url2, url3, maxlength));
|
||||||
|
}
|
||||||
|
return mAgpsEnabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline
|
||||||
|
bool LocEngAdapter::requestATL(int connHandle, AGpsType agps_type)
|
||||||
|
{
|
||||||
|
if (mAgpsEnabled) {
|
||||||
|
sendMsg(new LocEngRequestATL(mOwner,
|
||||||
|
connHandle, agps_type));
|
||||||
|
}
|
||||||
|
return mAgpsEnabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline
|
||||||
|
bool LocEngAdapter::releaseATL(int connHandle)
|
||||||
|
{
|
||||||
|
if (mAgpsEnabled) {
|
||||||
|
sendMsg(new LocEngReleaseATL(mOwner, connHandle));
|
||||||
|
}
|
||||||
|
return mAgpsEnabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline
|
||||||
|
bool LocEngAdapter::requestXtraData()
|
||||||
|
{
|
||||||
|
if (mAgpsEnabled) {
|
||||||
|
sendMsg(new LocEngRequestXtra(mOwner));
|
||||||
|
}
|
||||||
|
return mAgpsEnabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline
|
||||||
|
bool LocEngAdapter::requestTime()
|
||||||
|
{
|
||||||
|
if (mAgpsEnabled) {
|
||||||
|
sendMsg(new LocEngRequestTime(mOwner));
|
||||||
|
}
|
||||||
|
return mAgpsEnabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline
|
||||||
|
bool LocEngAdapter::requestNiNotify(GpsNiNotification ¬if, const void* data)
|
||||||
|
{
|
||||||
|
if (mAgpsEnabled) {
|
||||||
|
notif.size = sizeof(notif);
|
||||||
|
notif.timeout = LOC_NI_NO_RESPONSE_TIME;
|
||||||
|
|
||||||
|
sendMsg(new LocEngRequestNi(mOwner, notif, data));
|
||||||
|
}
|
||||||
|
return mAgpsEnabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline
|
||||||
|
bool LocEngAdapter::requestSuplES(int connHandle)
|
||||||
|
{
|
||||||
|
if (mAgpsEnabled)
|
||||||
|
sendMsg(new LocEngRequestSuplEs(mOwner, connHandle));
|
||||||
|
return mAgpsEnabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline
|
||||||
|
bool LocEngAdapter::reportDataCallOpened()
|
||||||
|
{
|
||||||
|
if(mAgpsEnabled)
|
||||||
|
sendMsg(new LocEngSuplEsOpened(mOwner));
|
||||||
|
return mAgpsEnabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline
|
||||||
|
bool LocEngAdapter::reportDataCallClosed()
|
||||||
|
{
|
||||||
|
if(mAgpsEnabled)
|
||||||
|
sendMsg(new LocEngSuplEsClosed(mOwner));
|
||||||
|
return mAgpsEnabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline
|
||||||
|
void LocEngAdapter::handleEngineDownEvent()
|
||||||
|
{
|
||||||
|
sendMsg(new LocEngDown(mOwner));
|
||||||
|
}
|
||||||
|
|
||||||
|
inline
|
||||||
|
void LocEngAdapter::handleEngineUpEvent()
|
||||||
|
{
|
||||||
|
sendMsg(new LocEngUp(mOwner));
|
||||||
|
}
|
||||||
|
|
299
gps/loc_api/libloc_api_50001/LocEngAdapter.h
Executable file
299
gps/loc_api/libloc_api_50001/LocEngAdapter.h
Executable file
@ -0,0 +1,299 @@
|
|||||||
|
/* Copyright (c) 2011-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_API_ENG_ADAPTER_H
|
||||||
|
#define LOC_API_ENG_ADAPTER_H
|
||||||
|
|
||||||
|
#include <ctype.h>
|
||||||
|
#include "hardware/gps.h"
|
||||||
|
#include <loc.h>
|
||||||
|
#include <loc_eng_log.h>
|
||||||
|
#include <log_util.h>
|
||||||
|
#include <LocAdapterBase.h>
|
||||||
|
#include <LocDualContext.h>
|
||||||
|
#include <UlpProxyBase.h>
|
||||||
|
#include <platform_lib_includes.h>
|
||||||
|
|
||||||
|
#define MAX_URL_LEN 256
|
||||||
|
|
||||||
|
using namespace loc_core;
|
||||||
|
|
||||||
|
class LocEngAdapter;
|
||||||
|
|
||||||
|
class LocInternalAdapter : public LocAdapterBase {
|
||||||
|
LocEngAdapter* mLocEngAdapter;
|
||||||
|
public:
|
||||||
|
LocInternalAdapter(LocEngAdapter* adapter);
|
||||||
|
|
||||||
|
virtual void reportPosition(UlpLocation &location,
|
||||||
|
GpsLocationExtended &locationExtended,
|
||||||
|
void* locationExt,
|
||||||
|
enum loc_sess_status status,
|
||||||
|
LocPosTechMask loc_technology_mask);
|
||||||
|
virtual void reportSv(GpsSvStatus &svStatus,
|
||||||
|
GpsLocationExtended &locationExtended,
|
||||||
|
void* svExt);
|
||||||
|
virtual void reportStatus(GpsStatusValue status);
|
||||||
|
virtual void setPositionModeInt(LocPosMode& posMode);
|
||||||
|
virtual void startFixInt();
|
||||||
|
virtual void stopFixInt();
|
||||||
|
virtual void getZppInt();
|
||||||
|
virtual void setUlpProxy(UlpProxyBase* ulp);
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef void (*loc_msg_sender)(void* loc_eng_data_p, void* msgp);
|
||||||
|
|
||||||
|
class LocEngAdapter : public LocAdapterBase {
|
||||||
|
void* mOwner;
|
||||||
|
LocInternalAdapter* mInternalAdapter;
|
||||||
|
UlpProxyBase* mUlp;
|
||||||
|
LocPosMode mFixCriteria;
|
||||||
|
bool mNavigating;
|
||||||
|
|
||||||
|
public:
|
||||||
|
bool mAgpsEnabled;
|
||||||
|
bool mCPIEnabled;
|
||||||
|
|
||||||
|
LocEngAdapter(LOC_API_ADAPTER_EVENT_MASK_T mask,
|
||||||
|
void* owner,ContextBase* context,
|
||||||
|
MsgTask::tCreate tCreator);
|
||||||
|
virtual ~LocEngAdapter();
|
||||||
|
|
||||||
|
virtual void setUlpProxy(UlpProxyBase* ulp);
|
||||||
|
inline void requestUlp(unsigned long capabilities) {
|
||||||
|
mContext->requestUlp(mInternalAdapter, capabilities);
|
||||||
|
}
|
||||||
|
inline LocInternalAdapter* getInternalAdapter() { return mInternalAdapter; }
|
||||||
|
inline UlpProxyBase* getUlpProxy() { return mUlp; }
|
||||||
|
inline void* getOwner() { return mOwner; }
|
||||||
|
inline bool hasAgpsExt() { return mContext->hasAgpsExt(); }
|
||||||
|
inline bool hasCPIExt() { return mContext->hasCPIExt(); }
|
||||||
|
inline const MsgTask* getMsgTask() { return mMsgTask; }
|
||||||
|
|
||||||
|
inline enum loc_api_adapter_err
|
||||||
|
startFix()
|
||||||
|
{
|
||||||
|
return mLocApi->startFix(mFixCriteria);
|
||||||
|
}
|
||||||
|
inline enum loc_api_adapter_err
|
||||||
|
stopFix()
|
||||||
|
{
|
||||||
|
return mLocApi->stopFix();
|
||||||
|
}
|
||||||
|
inline enum loc_api_adapter_err
|
||||||
|
deleteAidingData(GpsAidingData f)
|
||||||
|
{
|
||||||
|
return mLocApi->deleteAidingData(f);
|
||||||
|
}
|
||||||
|
inline enum loc_api_adapter_err
|
||||||
|
enableData(int enable)
|
||||||
|
{
|
||||||
|
return mLocApi->enableData(enable);
|
||||||
|
}
|
||||||
|
inline enum loc_api_adapter_err
|
||||||
|
setAPN(char* apn, int len)
|
||||||
|
{
|
||||||
|
return mLocApi->setAPN(apn, len);
|
||||||
|
}
|
||||||
|
inline enum loc_api_adapter_err
|
||||||
|
injectPosition(double latitude, double longitude, float accuracy)
|
||||||
|
{
|
||||||
|
return mLocApi->injectPosition(latitude, longitude, accuracy);
|
||||||
|
}
|
||||||
|
inline enum loc_api_adapter_err
|
||||||
|
setTime(GpsUtcTime time, int64_t timeReference, int uncertainty)
|
||||||
|
{
|
||||||
|
return mLocApi->setTime(time, timeReference, uncertainty);
|
||||||
|
}
|
||||||
|
inline enum loc_api_adapter_err
|
||||||
|
setXtraData(char* data, int length)
|
||||||
|
{
|
||||||
|
return mLocApi->setXtraData(data, length);
|
||||||
|
}
|
||||||
|
inline enum loc_api_adapter_err
|
||||||
|
requestXtraServer()
|
||||||
|
{
|
||||||
|
return mLocApi->requestXtraServer();
|
||||||
|
}
|
||||||
|
inline enum loc_api_adapter_err
|
||||||
|
atlOpenStatus(int handle, int is_succ, char* apn, ApnIpType bearer, AGpsType agpsType)
|
||||||
|
{
|
||||||
|
return mLocApi->atlOpenStatus(handle, is_succ, apn, bearer, agpsType);
|
||||||
|
}
|
||||||
|
inline enum loc_api_adapter_err
|
||||||
|
atlCloseStatus(int handle, int is_succ)
|
||||||
|
{
|
||||||
|
return mLocApi->atlCloseStatus(handle, is_succ);
|
||||||
|
}
|
||||||
|
inline enum loc_api_adapter_err
|
||||||
|
setPositionMode(const LocPosMode *posMode)
|
||||||
|
{
|
||||||
|
if (NULL != posMode) {
|
||||||
|
mFixCriteria = *posMode;
|
||||||
|
}
|
||||||
|
return mLocApi->setPositionMode(mFixCriteria);
|
||||||
|
}
|
||||||
|
inline enum loc_api_adapter_err
|
||||||
|
setServer(const char* url, int len)
|
||||||
|
{
|
||||||
|
return mLocApi->setServer(url, len);
|
||||||
|
}
|
||||||
|
inline enum loc_api_adapter_err
|
||||||
|
setServer(unsigned int ip, int port,
|
||||||
|
LocServerType type)
|
||||||
|
{
|
||||||
|
return mLocApi->setServer(ip, port, type);
|
||||||
|
}
|
||||||
|
inline enum loc_api_adapter_err
|
||||||
|
informNiResponse(GpsUserResponseType userResponse, const void* passThroughData)
|
||||||
|
{
|
||||||
|
return mLocApi->informNiResponse(userResponse, passThroughData);
|
||||||
|
}
|
||||||
|
inline enum loc_api_adapter_err
|
||||||
|
setSUPLVersion(uint32_t version)
|
||||||
|
{
|
||||||
|
return mLocApi->setSUPLVersion(version);
|
||||||
|
}
|
||||||
|
inline enum loc_api_adapter_err
|
||||||
|
setLPPConfig(uint32_t profile)
|
||||||
|
{
|
||||||
|
return mLocApi->setLPPConfig(profile);
|
||||||
|
}
|
||||||
|
inline enum loc_api_adapter_err
|
||||||
|
setSensorControlConfig(int sensorUsage)
|
||||||
|
{
|
||||||
|
return mLocApi->setSensorControlConfig(sensorUsage);
|
||||||
|
}
|
||||||
|
inline enum loc_api_adapter_err
|
||||||
|
setSensorProperties(bool gyroBiasVarianceRandomWalk_valid, float gyroBiasVarianceRandomWalk,
|
||||||
|
bool accelBiasVarianceRandomWalk_valid, float accelBiasVarianceRandomWalk,
|
||||||
|
bool angleBiasVarianceRandomWalk_valid, float angleBiasVarianceRandomWalk,
|
||||||
|
bool rateBiasVarianceRandomWalk_valid, float rateBiasVarianceRandomWalk,
|
||||||
|
bool velocityBiasVarianceRandomWalk_valid, float velocityBiasVarianceRandomWalk)
|
||||||
|
{
|
||||||
|
return mLocApi->setSensorProperties(gyroBiasVarianceRandomWalk_valid, gyroBiasVarianceRandomWalk,
|
||||||
|
accelBiasVarianceRandomWalk_valid, accelBiasVarianceRandomWalk,
|
||||||
|
angleBiasVarianceRandomWalk_valid, angleBiasVarianceRandomWalk,
|
||||||
|
rateBiasVarianceRandomWalk_valid, rateBiasVarianceRandomWalk,
|
||||||
|
velocityBiasVarianceRandomWalk_valid, velocityBiasVarianceRandomWalk);
|
||||||
|
}
|
||||||
|
inline virtual enum loc_api_adapter_err
|
||||||
|
setSensorPerfControlConfig(int controlMode, int accelSamplesPerBatch, int accelBatchesPerSec,
|
||||||
|
int gyroSamplesPerBatch, int gyroBatchesPerSec,
|
||||||
|
int accelSamplesPerBatchHigh, int accelBatchesPerSecHigh,
|
||||||
|
int gyroSamplesPerBatchHigh, int gyroBatchesPerSecHigh, int algorithmConfig)
|
||||||
|
{
|
||||||
|
return mLocApi->setSensorPerfControlConfig(controlMode, accelSamplesPerBatch, accelBatchesPerSec,
|
||||||
|
gyroSamplesPerBatch, gyroBatchesPerSec,
|
||||||
|
accelSamplesPerBatchHigh, accelBatchesPerSecHigh,
|
||||||
|
gyroSamplesPerBatchHigh, gyroBatchesPerSecHigh,
|
||||||
|
algorithmConfig);
|
||||||
|
}
|
||||||
|
inline virtual enum loc_api_adapter_err
|
||||||
|
setExtPowerConfig(int isBatteryCharging)
|
||||||
|
{
|
||||||
|
return mLocApi->setExtPowerConfig(isBatteryCharging);
|
||||||
|
}
|
||||||
|
inline virtual enum loc_api_adapter_err
|
||||||
|
setAGLONASSProtocol(unsigned long aGlonassProtocol)
|
||||||
|
{
|
||||||
|
return mLocApi->setAGLONASSProtocol(aGlonassProtocol);
|
||||||
|
}
|
||||||
|
inline virtual int initDataServiceClient()
|
||||||
|
{
|
||||||
|
return mLocApi->initDataServiceClient();
|
||||||
|
}
|
||||||
|
inline virtual int openAndStartDataCall()
|
||||||
|
{
|
||||||
|
return mLocApi->openAndStartDataCall();
|
||||||
|
}
|
||||||
|
inline virtual void stopDataCall()
|
||||||
|
{
|
||||||
|
mLocApi->stopDataCall();
|
||||||
|
}
|
||||||
|
inline virtual void closeDataCall()
|
||||||
|
{
|
||||||
|
mLocApi->closeDataCall();
|
||||||
|
}
|
||||||
|
inline enum loc_api_adapter_err
|
||||||
|
getZpp(GpsLocation &zppLoc, LocPosTechMask &tech_mask)
|
||||||
|
{
|
||||||
|
return mLocApi->getZppFix(zppLoc, tech_mask);
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void handleEngineDownEvent();
|
||||||
|
virtual void handleEngineUpEvent();
|
||||||
|
virtual void reportPosition(UlpLocation &location,
|
||||||
|
GpsLocationExtended &locationExtended,
|
||||||
|
void* locationExt,
|
||||||
|
enum loc_sess_status status,
|
||||||
|
LocPosTechMask loc_technology_mask);
|
||||||
|
virtual void reportSv(GpsSvStatus &svStatus,
|
||||||
|
GpsLocationExtended &locationExtended,
|
||||||
|
void* svExt);
|
||||||
|
virtual void reportStatus(GpsStatusValue status);
|
||||||
|
virtual void reportNmea(const char* nmea, int length);
|
||||||
|
virtual bool reportXtraServer(const char* url1, const char* url2,
|
||||||
|
const char* url3, const int maxlength);
|
||||||
|
virtual bool requestXtraData();
|
||||||
|
virtual bool requestTime();
|
||||||
|
virtual bool requestATL(int connHandle, AGpsType agps_type);
|
||||||
|
virtual bool releaseATL(int connHandle);
|
||||||
|
virtual bool requestNiNotify(GpsNiNotification ¬ify, const void* data);
|
||||||
|
virtual bool requestSuplES(int connHandle);
|
||||||
|
virtual bool reportDataCallOpened();
|
||||||
|
virtual bool reportDataCallClosed();
|
||||||
|
|
||||||
|
inline const LocPosMode& getPositionMode() const
|
||||||
|
{return mFixCriteria;}
|
||||||
|
inline virtual bool isInSession()
|
||||||
|
{ return mNavigating; }
|
||||||
|
void setInSession(bool inSession);
|
||||||
|
|
||||||
|
/*Values for lock
|
||||||
|
1 = Do not lock any position sessions
|
||||||
|
2 = Lock MI position sessions
|
||||||
|
3 = Lock MT position sessions
|
||||||
|
4 = Lock all position sessions
|
||||||
|
*/
|
||||||
|
inline int setGpsLock(unsigned int lock)
|
||||||
|
{
|
||||||
|
return mLocApi->setGpsLock(lock);
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
Returns
|
||||||
|
Current value of GPS lock on success
|
||||||
|
-1 on failure
|
||||||
|
*/
|
||||||
|
inline int getGpsLock()
|
||||||
|
{
|
||||||
|
return mLocApi->getGpsLock();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif //LOC_API_ENG_ADAPTER_H
|
76
gps/loc_api/libloc_api_50001/Makefile.am
Executable file
76
gps/loc_api/libloc_api_50001/Makefile.am
Executable file
@ -0,0 +1,76 @@
|
|||||||
|
AM_CFLAGS = \
|
||||||
|
-I../../utils \
|
||||||
|
-I../../platform_lib_abstractions \
|
||||||
|
-fno-short-enums \
|
||||||
|
-DFEATURE_GNSS_BIT_API
|
||||||
|
|
||||||
|
libloc_adapter_so_la_SOURCES = loc_eng_log.cpp LocEngAdapter.cpp
|
||||||
|
|
||||||
|
if USE_GLIB
|
||||||
|
libloc_adapter_so_la_CFLAGS = -DUSE_GLIB $(AM_CFLAGS) @GLIB_CFLAGS@
|
||||||
|
libloc_adapter_so_la_LDFLAGS = -lstdc++ -lpthread @GLIB_LIBS@ -shared -version-info 1:0:0
|
||||||
|
libloc_adapter_so_la_CPPFLAGS = -DUSE_GLIB $(AM_CFLAGS) $(AM_CPPFLAGS) @GLIB_CFLAGS@
|
||||||
|
else
|
||||||
|
libloc_adapter_so_la_CFLAGS = $(AM_CFLAGS)
|
||||||
|
libloc_adapter_so_la_LDFLAGS = -lpthread -shared -version-info 1:0:0
|
||||||
|
libloc_adapter_so_la_CPPFLAGS = $(AM_CFLAGS) $(AM_CPPFLAGS)
|
||||||
|
endif
|
||||||
|
libloc_adapter_so_la_LIBADD = -lstdc++ -lcutils ../../utils/libgps_utils_so.la
|
||||||
|
|
||||||
|
|
||||||
|
libloc_eng_so_la_SOURCES = \
|
||||||
|
loc_eng.cpp \
|
||||||
|
loc_eng_agps.cpp \
|
||||||
|
loc_eng_xtra.cpp \
|
||||||
|
loc_eng_ni.cpp \
|
||||||
|
loc_eng_log.cpp \
|
||||||
|
loc_eng_dmn_conn.cpp \
|
||||||
|
loc_eng_dmn_conn_handler.cpp \
|
||||||
|
loc_eng_dmn_conn_thread_helper.c \
|
||||||
|
loc_eng_dmn_conn_glue_msg.c \
|
||||||
|
loc_eng_dmn_conn_glue_pipe.c
|
||||||
|
|
||||||
|
|
||||||
|
if USE_GLIB
|
||||||
|
libloc_eng_so_la_CFLAGS = -DUSE_GLIB $(AM_CFLAGS) @GLIB_CFLAGS@
|
||||||
|
libloc_eng_so_la_LDFLAGS = -lstdc++ -lpthread @GLIB_LIBS@ -shared -version-info 1:0:0
|
||||||
|
libloc_eng_so_la_CPPFLAGS = -DUSE_GLIB $(AM_CFLAGS) $(AM_CPPFLAGS) @GLIB_CFLAGS@
|
||||||
|
else
|
||||||
|
libloc_eng_so_la_CFLAGS = $(AM_CFLAGS)
|
||||||
|
libloc_eng_so_la_LDFLAGS = -lpthread -shared -version-info 1:0:0
|
||||||
|
libloc_eng_so_la_CPPFLAGS = $(AM_CFLAGS) $(AM_CPPFLAGS)
|
||||||
|
endif
|
||||||
|
|
||||||
|
libloc_eng_so_la_LIBADD = -lstdc++ -lcutils -ldl ../../utils/libgps_utils_so.la libloc_adapter_so.la
|
||||||
|
|
||||||
|
|
||||||
|
libgps_default_so_la_SOURCES = \
|
||||||
|
loc.cpp \
|
||||||
|
gps.c
|
||||||
|
|
||||||
|
if USE_GLIB
|
||||||
|
libgps_default_so_la_CFLAGS = -DUSE_GLIB $(AM_CFLAGS) @GLIB_CFLAGS@
|
||||||
|
libgps_default_so_la_LDFLAGS = -lstdc++ -lpthread @GLIB_LIBS@ -shared -version-info 1:0:0
|
||||||
|
libgps_default_so_la_CPPFLAGS = -DUSE_GLIB $(AM_CFLAGS) $(AM_CPPFLAGS) @GLIB_CFLAGS@
|
||||||
|
else
|
||||||
|
libgps_default_so_la_CFLAGS = $(AM_CFLAGS)
|
||||||
|
libgps_default_so_la_LDFLAGS = -lpthread -shared -version-info 1:0:0
|
||||||
|
libgps_default_so_la_CPPFLAGS = $(AM_CFLAGS) $(AM_CPPFLAGS)
|
||||||
|
endif
|
||||||
|
|
||||||
|
libgps_default_so_la_LIBADD = -lstdc++ -lcutils ../../utils/libgps_utils_so.la -ldl libloc_eng_so.la
|
||||||
|
|
||||||
|
library_include_HEADERS = \
|
||||||
|
LocEngAdapter.h \
|
||||||
|
loc.h \
|
||||||
|
loc_eng.h \
|
||||||
|
loc_eng_xtra.h \
|
||||||
|
loc_eng_ni.h \
|
||||||
|
loc_eng_agps.h \
|
||||||
|
loc_eng_msg.h \
|
||||||
|
loc_eng_log.h
|
||||||
|
|
||||||
|
library_includedir = $(pkgincludedir)/libloc_api_50001
|
||||||
|
|
||||||
|
#Create and Install libraries
|
||||||
|
lib_LTLIBRARIES = libloc_adapter_so.la libloc_eng_so.la libgps_default_so.la
|
72
gps/loc_api/libloc_api_50001/gps.c
Executable file
72
gps/loc_api/libloc_api_50001/gps.c
Executable file
@ -0,0 +1,72 @@
|
|||||||
|
/* 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 "hardware/gps.h"
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
extern const GpsInterface* get_gps_interface();
|
||||||
|
|
||||||
|
const GpsInterface* gps__get_gps_interface(struct gps_device_t* dev)
|
||||||
|
{
|
||||||
|
return get_gps_interface();
|
||||||
|
}
|
||||||
|
|
||||||
|
static int open_gps(const struct hw_module_t* module, char const* name,
|
||||||
|
struct hw_device_t** device)
|
||||||
|
{
|
||||||
|
struct gps_device_t *dev = (struct gps_device_t *) malloc(sizeof(struct gps_device_t));
|
||||||
|
|
||||||
|
if(dev == NULL)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
memset(dev, 0, sizeof(*dev));
|
||||||
|
|
||||||
|
dev->common.tag = HARDWARE_DEVICE_TAG;
|
||||||
|
dev->common.version = 0;
|
||||||
|
dev->common.module = (struct hw_module_t*)module;
|
||||||
|
dev->get_gps_interface = gps__get_gps_interface;
|
||||||
|
|
||||||
|
*device = (struct hw_device_t*)dev;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct hw_module_methods_t gps_module_methods = {
|
||||||
|
.open = open_gps
|
||||||
|
};
|
||||||
|
|
||||||
|
struct hw_module_t HAL_MODULE_INFO_SYM = {
|
||||||
|
.tag = HARDWARE_MODULE_TAG,
|
||||||
|
.module_api_version = 1,
|
||||||
|
.hal_api_version = 0,
|
||||||
|
.id = GPS_HARDWARE_MODULE_ID,
|
||||||
|
.name = "loc_api GPS Module",
|
||||||
|
.author = "Qualcomm USA, Inc.",
|
||||||
|
.methods = &gps_module_methods,
|
||||||
|
};
|
907
gps/loc_api/libloc_api_50001/loc.cpp
Executable file
907
gps/loc_api/libloc_api_50001/loc.cpp
Executable file
@ -0,0 +1,907 @@
|
|||||||
|
/* Copyright (c) 2011-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.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define LOG_NDDEBUG 0
|
||||||
|
#define LOG_TAG "LocSvc_afw"
|
||||||
|
|
||||||
|
#include "hardware/gps.h"
|
||||||
|
#include <gps_extended.h>
|
||||||
|
#include <loc_eng.h>
|
||||||
|
#include <loc_target.h>
|
||||||
|
#include <loc_log.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <dlfcn.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <LocDualContext.h>
|
||||||
|
#include <cutils/properties.h>
|
||||||
|
|
||||||
|
using namespace loc_core;
|
||||||
|
|
||||||
|
//Globals defns
|
||||||
|
static gps_location_callback gps_loc_cb = NULL;
|
||||||
|
static gps_sv_status_callback gps_sv_cb = NULL;
|
||||||
|
|
||||||
|
static void local_loc_cb(UlpLocation* location, void* locExt);
|
||||||
|
static void local_sv_cb(GpsSvStatus* sv_status, void* svExt);
|
||||||
|
|
||||||
|
static const GpsGeofencingInterface* get_geofence_interface(void);
|
||||||
|
|
||||||
|
// Function declarations for sLocEngInterface
|
||||||
|
static int loc_init(GpsCallbacks* callbacks);
|
||||||
|
static int loc_start();
|
||||||
|
static int loc_stop();
|
||||||
|
static void loc_cleanup();
|
||||||
|
static int loc_inject_time(GpsUtcTime time, int64_t timeReference, int uncertainty);
|
||||||
|
static int loc_inject_location(double latitude, double longitude, float accuracy);
|
||||||
|
static void loc_delete_aiding_data(GpsAidingData f);
|
||||||
|
static int loc_set_position_mode(GpsPositionMode mode, GpsPositionRecurrence recurrence,
|
||||||
|
uint32_t min_interval, uint32_t preferred_accuracy,
|
||||||
|
uint32_t preferred_time);
|
||||||
|
static const void* loc_get_extension(const char* name);
|
||||||
|
|
||||||
|
// Defines the GpsInterface in gps.h
|
||||||
|
static const GpsInterface sLocEngInterface =
|
||||||
|
{
|
||||||
|
sizeof(GpsInterface),
|
||||||
|
loc_init,
|
||||||
|
loc_start,
|
||||||
|
loc_stop,
|
||||||
|
loc_cleanup,
|
||||||
|
loc_inject_time,
|
||||||
|
loc_inject_location,
|
||||||
|
loc_delete_aiding_data,
|
||||||
|
loc_set_position_mode,
|
||||||
|
loc_get_extension
|
||||||
|
};
|
||||||
|
|
||||||
|
// Function declarations for sLocEngAGpsInterface
|
||||||
|
static void loc_agps_init(AGpsCallbacks* callbacks);
|
||||||
|
static int loc_agps_open(const char* apn);
|
||||||
|
static int loc_agps_closed();
|
||||||
|
static int loc_agps_open_failed();
|
||||||
|
static int loc_agps_set_server(AGpsType type, const char *hostname, int port);
|
||||||
|
|
||||||
|
static const AGpsInterface sLocEngAGpsInterface =
|
||||||
|
{
|
||||||
|
sizeof(AGpsInterface),
|
||||||
|
loc_agps_init,
|
||||||
|
loc_agps_open,
|
||||||
|
loc_agps_closed,
|
||||||
|
loc_agps_open_failed,
|
||||||
|
loc_agps_set_server
|
||||||
|
};
|
||||||
|
|
||||||
|
static int loc_xtra_init(GpsXtraCallbacks* callbacks);
|
||||||
|
static int loc_xtra_inject_data(char* data, int length);
|
||||||
|
|
||||||
|
static const GpsXtraInterface sLocEngXTRAInterface =
|
||||||
|
{
|
||||||
|
sizeof(GpsXtraInterface),
|
||||||
|
loc_xtra_init,
|
||||||
|
loc_xtra_inject_data
|
||||||
|
};
|
||||||
|
|
||||||
|
static void loc_ni_init(GpsNiCallbacks *callbacks);
|
||||||
|
static void loc_ni_respond(int notif_id, GpsUserResponseType user_response);
|
||||||
|
|
||||||
|
const GpsNiInterface sLocEngNiInterface =
|
||||||
|
{
|
||||||
|
sizeof(GpsNiInterface),
|
||||||
|
loc_ni_init,
|
||||||
|
loc_ni_respond,
|
||||||
|
};
|
||||||
|
|
||||||
|
static void loc_agps_ril_init( AGpsRilCallbacks* callbacks );
|
||||||
|
static void loc_agps_ril_set_ref_location(const AGpsRefLocation *agps_reflocation, size_t sz_struct);
|
||||||
|
static void loc_agps_ril_set_set_id(AGpsSetIDType type, const char* setid);
|
||||||
|
static void loc_agps_ril_ni_message(uint8_t *msg, size_t len);
|
||||||
|
static void loc_agps_ril_update_network_state(int connected, int type, int roaming, const char* extra_info);
|
||||||
|
static void loc_agps_ril_update_network_availability(int avaiable, const char* apn);
|
||||||
|
|
||||||
|
static const AGpsRilInterface sLocEngAGpsRilInterface =
|
||||||
|
{
|
||||||
|
sizeof(AGpsRilInterface),
|
||||||
|
loc_agps_ril_init,
|
||||||
|
loc_agps_ril_set_ref_location,
|
||||||
|
loc_agps_ril_set_set_id,
|
||||||
|
loc_agps_ril_ni_message,
|
||||||
|
loc_agps_ril_update_network_state,
|
||||||
|
loc_agps_ril_update_network_availability
|
||||||
|
};
|
||||||
|
|
||||||
|
static loc_eng_data_s_type loc_afw_data;
|
||||||
|
static int gss_fd = -1;
|
||||||
|
|
||||||
|
/*===========================================================================
|
||||||
|
FUNCTION gps_get_hardware_interface
|
||||||
|
|
||||||
|
DESCRIPTION
|
||||||
|
Returns the GPS hardware interaface based on LOC API
|
||||||
|
if GPS is enabled.
|
||||||
|
|
||||||
|
DEPENDENCIES
|
||||||
|
None
|
||||||
|
|
||||||
|
RETURN VALUE
|
||||||
|
0: success
|
||||||
|
|
||||||
|
SIDE EFFECTS
|
||||||
|
N/A
|
||||||
|
|
||||||
|
===========================================================================*/
|
||||||
|
const GpsInterface* gps_get_hardware_interface ()
|
||||||
|
{
|
||||||
|
ENTRY_LOG_CALLFLOW();
|
||||||
|
const GpsInterface* ret_val;
|
||||||
|
|
||||||
|
char propBuf[PROPERTY_VALUE_MAX];
|
||||||
|
|
||||||
|
loc_eng_read_config();
|
||||||
|
|
||||||
|
// check to see if GPS should be disabled
|
||||||
|
property_get("gps.disable", propBuf, "");
|
||||||
|
if (propBuf[0] == '1')
|
||||||
|
{
|
||||||
|
LOC_LOGD("gps_get_interface returning NULL because gps.disable=1\n");
|
||||||
|
ret_val = NULL;
|
||||||
|
} else {
|
||||||
|
ret_val = &sLocEngInterface;
|
||||||
|
}
|
||||||
|
|
||||||
|
loc_eng_read_config();
|
||||||
|
|
||||||
|
EXIT_LOG(%p, ret_val);
|
||||||
|
return ret_val;
|
||||||
|
}
|
||||||
|
|
||||||
|
// for gps.c
|
||||||
|
extern "C" const GpsInterface* get_gps_interface()
|
||||||
|
{
|
||||||
|
unsigned int target = TARGET_DEFAULT;
|
||||||
|
loc_eng_read_config();
|
||||||
|
|
||||||
|
target = loc_get_target();
|
||||||
|
LOC_LOGD("Target name check returned %s", loc_get_target_name(target));
|
||||||
|
|
||||||
|
int gnssType = getTargetGnssType(target);
|
||||||
|
switch (gnssType)
|
||||||
|
{
|
||||||
|
case GNSS_GSS:
|
||||||
|
//APQ8064
|
||||||
|
gps_conf.CAPABILITIES &= ~(GPS_CAPABILITY_MSA | GPS_CAPABILITY_MSB);
|
||||||
|
gss_fd = open("/dev/gss", O_RDONLY);
|
||||||
|
if (gss_fd < 0) {
|
||||||
|
LOC_LOGE("GSS open failed: %s\n", strerror(errno));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
LOC_LOGD("GSS open success! CAPABILITIES %0lx\n",
|
||||||
|
gps_conf.CAPABILITIES);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case GNSS_NONE:
|
||||||
|
//MPQ8064
|
||||||
|
LOC_LOGE("No GPS HW on this target. Not returning interface.");
|
||||||
|
return NULL;
|
||||||
|
case GNSS_QCA1530:
|
||||||
|
// qca1530 chip is present
|
||||||
|
gps_conf.CAPABILITIES &= ~(GPS_CAPABILITY_MSA | GPS_CAPABILITY_MSB);
|
||||||
|
LOC_LOGD("qca1530 present: CAPABILITIES %0lx\n", gps_conf.CAPABILITIES);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return &sLocEngInterface;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*===========================================================================
|
||||||
|
FUNCTION loc_init
|
||||||
|
|
||||||
|
DESCRIPTION
|
||||||
|
Initialize the location engine, this include setting up global datas
|
||||||
|
and registers location engien with loc api service.
|
||||||
|
|
||||||
|
DEPENDENCIES
|
||||||
|
None
|
||||||
|
|
||||||
|
RETURN VALUE
|
||||||
|
0: success
|
||||||
|
|
||||||
|
SIDE EFFECTS
|
||||||
|
N/Ax
|
||||||
|
|
||||||
|
===========================================================================*/
|
||||||
|
static int loc_init(GpsCallbacks* callbacks)
|
||||||
|
{
|
||||||
|
int retVal = -1;
|
||||||
|
ENTRY_LOG();
|
||||||
|
LOC_API_ADAPTER_EVENT_MASK_T event;
|
||||||
|
|
||||||
|
if (NULL == callbacks) {
|
||||||
|
LOC_LOGE("loc_init failed. cb = NULL\n");
|
||||||
|
EXIT_LOG(%d, retVal);
|
||||||
|
return retVal;
|
||||||
|
}
|
||||||
|
|
||||||
|
event = LOC_API_ADAPTER_BIT_PARSED_POSITION_REPORT |
|
||||||
|
LOC_API_ADAPTER_BIT_SATELLITE_REPORT |
|
||||||
|
LOC_API_ADAPTER_BIT_LOCATION_SERVER_REQUEST |
|
||||||
|
LOC_API_ADAPTER_BIT_ASSISTANCE_DATA_REQUEST |
|
||||||
|
LOC_API_ADAPTER_BIT_IOCTL_REPORT |
|
||||||
|
LOC_API_ADAPTER_BIT_STATUS_REPORT |
|
||||||
|
LOC_API_ADAPTER_BIT_NMEA_1HZ_REPORT |
|
||||||
|
LOC_API_ADAPTER_BIT_NI_NOTIFY_VERIFY_REQUEST;
|
||||||
|
|
||||||
|
LocCallbacks clientCallbacks = {local_loc_cb, /* location_cb */
|
||||||
|
callbacks->status_cb, /* status_cb */
|
||||||
|
local_sv_cb, /* sv_status_cb */
|
||||||
|
callbacks->nmea_cb, /* nmea_cb */
|
||||||
|
callbacks->set_capabilities_cb, /* set_capabilities_cb */
|
||||||
|
callbacks->acquire_wakelock_cb, /* acquire_wakelock_cb */
|
||||||
|
callbacks->release_wakelock_cb, /* release_wakelock_cb */
|
||||||
|
callbacks->create_thread_cb, /* create_thread_cb */
|
||||||
|
NULL, /* location_ext_parser */
|
||||||
|
NULL, /* sv_ext_parser */
|
||||||
|
callbacks->request_utc_time_cb /* request_utc_time_cb */};
|
||||||
|
|
||||||
|
gps_loc_cb = callbacks->location_cb;
|
||||||
|
gps_sv_cb = callbacks->sv_status_cb;
|
||||||
|
|
||||||
|
retVal = loc_eng_init(loc_afw_data, &clientCallbacks, event, NULL);
|
||||||
|
loc_afw_data.adapter->requestUlp(gps_conf.CAPABILITIES);
|
||||||
|
loc_afw_data.adapter->mAgpsEnabled = !loc_afw_data.adapter->hasAgpsExt();
|
||||||
|
loc_afw_data.adapter->mCPIEnabled = !loc_afw_data.adapter->hasCPIExt();
|
||||||
|
|
||||||
|
EXIT_LOG(%d, retVal);
|
||||||
|
return retVal;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*===========================================================================
|
||||||
|
FUNCTION loc_cleanup
|
||||||
|
|
||||||
|
DESCRIPTION
|
||||||
|
Cleans location engine. The location client handle will be released.
|
||||||
|
|
||||||
|
DEPENDENCIES
|
||||||
|
None
|
||||||
|
|
||||||
|
RETURN VALUE
|
||||||
|
None
|
||||||
|
|
||||||
|
SIDE EFFECTS
|
||||||
|
N/A
|
||||||
|
|
||||||
|
===========================================================================*/
|
||||||
|
static void loc_cleanup()
|
||||||
|
{
|
||||||
|
ENTRY_LOG();
|
||||||
|
loc_eng_cleanup(loc_afw_data);
|
||||||
|
gps_loc_cb = NULL;
|
||||||
|
gps_sv_cb = NULL;
|
||||||
|
|
||||||
|
/*
|
||||||
|
if (gss_fd >= 0)
|
||||||
|
{
|
||||||
|
close(gss_fd);
|
||||||
|
gss_fd = -1;
|
||||||
|
LOC_LOGD("GSS shutdown.\n");
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
EXIT_LOG(%s, VOID_RET);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*===========================================================================
|
||||||
|
FUNCTION loc_start
|
||||||
|
|
||||||
|
DESCRIPTION
|
||||||
|
Starts the tracking session
|
||||||
|
|
||||||
|
DEPENDENCIES
|
||||||
|
None
|
||||||
|
|
||||||
|
RETURN VALUE
|
||||||
|
0: success
|
||||||
|
|
||||||
|
SIDE EFFECTS
|
||||||
|
N/A
|
||||||
|
|
||||||
|
===========================================================================*/
|
||||||
|
static int loc_start()
|
||||||
|
{
|
||||||
|
ENTRY_LOG();
|
||||||
|
int ret_val = loc_eng_start(loc_afw_data);
|
||||||
|
|
||||||
|
EXIT_LOG(%d, ret_val);
|
||||||
|
return ret_val;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*===========================================================================
|
||||||
|
FUNCTION loc_stop
|
||||||
|
|
||||||
|
DESCRIPTION
|
||||||
|
Stops the tracking session
|
||||||
|
|
||||||
|
DEPENDENCIES
|
||||||
|
None
|
||||||
|
|
||||||
|
RETURN VALUE
|
||||||
|
0: success
|
||||||
|
|
||||||
|
SIDE EFFECTS
|
||||||
|
N/A
|
||||||
|
|
||||||
|
===========================================================================*/
|
||||||
|
static int loc_stop()
|
||||||
|
{
|
||||||
|
ENTRY_LOG();
|
||||||
|
int ret_val = -1;
|
||||||
|
ret_val = loc_eng_stop(loc_afw_data);
|
||||||
|
|
||||||
|
EXIT_LOG(%d, ret_val);
|
||||||
|
return ret_val;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*===========================================================================
|
||||||
|
FUNCTION loc_set_position_mode
|
||||||
|
|
||||||
|
DESCRIPTION
|
||||||
|
Sets the mode and fix frequency for the tracking session.
|
||||||
|
|
||||||
|
DEPENDENCIES
|
||||||
|
None
|
||||||
|
|
||||||
|
RETURN VALUE
|
||||||
|
0: success
|
||||||
|
|
||||||
|
SIDE EFFECTS
|
||||||
|
N/A
|
||||||
|
|
||||||
|
===========================================================================*/
|
||||||
|
static int loc_set_position_mode(GpsPositionMode mode,
|
||||||
|
GpsPositionRecurrence recurrence,
|
||||||
|
uint32_t min_interval,
|
||||||
|
uint32_t preferred_accuracy,
|
||||||
|
uint32_t preferred_time)
|
||||||
|
{
|
||||||
|
ENTRY_LOG();
|
||||||
|
int ret_val = -1;
|
||||||
|
LocPositionMode locMode;
|
||||||
|
switch (mode) {
|
||||||
|
case GPS_POSITION_MODE_MS_BASED:
|
||||||
|
locMode = LOC_POSITION_MODE_MS_BASED;
|
||||||
|
break;
|
||||||
|
case GPS_POSITION_MODE_MS_ASSISTED:
|
||||||
|
locMode = LOC_POSITION_MODE_MS_ASSISTED;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
locMode = LOC_POSITION_MODE_STANDALONE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
LocPosMode params(locMode, recurrence, min_interval,
|
||||||
|
preferred_accuracy, preferred_time, NULL, NULL);
|
||||||
|
ret_val = loc_eng_set_position_mode(loc_afw_data, params);
|
||||||
|
|
||||||
|
EXIT_LOG(%d, ret_val);
|
||||||
|
return ret_val;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*===========================================================================
|
||||||
|
FUNCTION loc_inject_time
|
||||||
|
|
||||||
|
DESCRIPTION
|
||||||
|
This is used by Java native function to do time injection.
|
||||||
|
|
||||||
|
DEPENDENCIES
|
||||||
|
None
|
||||||
|
|
||||||
|
RETURN VALUE
|
||||||
|
0
|
||||||
|
|
||||||
|
SIDE EFFECTS
|
||||||
|
N/A
|
||||||
|
|
||||||
|
===========================================================================*/
|
||||||
|
static int loc_inject_time(GpsUtcTime time, int64_t timeReference, int uncertainty)
|
||||||
|
{
|
||||||
|
ENTRY_LOG();
|
||||||
|
int ret_val = 0;
|
||||||
|
|
||||||
|
ret_val = loc_eng_inject_time(loc_afw_data, time,
|
||||||
|
timeReference, uncertainty);
|
||||||
|
|
||||||
|
EXIT_LOG(%d, ret_val);
|
||||||
|
return ret_val;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*===========================================================================
|
||||||
|
FUNCTION loc_inject_location
|
||||||
|
|
||||||
|
DESCRIPTION
|
||||||
|
This is used by Java native function to do location injection.
|
||||||
|
|
||||||
|
DEPENDENCIES
|
||||||
|
None
|
||||||
|
|
||||||
|
RETURN VALUE
|
||||||
|
0 : Successful
|
||||||
|
error code : Failure
|
||||||
|
|
||||||
|
SIDE EFFECTS
|
||||||
|
N/A
|
||||||
|
===========================================================================*/
|
||||||
|
static int loc_inject_location(double latitude, double longitude, float accuracy)
|
||||||
|
{
|
||||||
|
static bool initialized = false;
|
||||||
|
static bool enable_cpi = true;
|
||||||
|
accuracy = 1000;
|
||||||
|
ENTRY_LOG();
|
||||||
|
|
||||||
|
if(!initialized)
|
||||||
|
{
|
||||||
|
char value[PROPERTY_VALUE_MAX];
|
||||||
|
memset(value, 0, sizeof(value));
|
||||||
|
(void)property_get("persist.gps.qc_nlp_in_use", value, "0");
|
||||||
|
if(0 == strcmp(value, "1"))
|
||||||
|
{
|
||||||
|
enable_cpi = false;
|
||||||
|
LOC_LOGI("GPS HAL coarse position injection disabled");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
LOC_LOGI("GPS HAL coarse position injection enabled");
|
||||||
|
}
|
||||||
|
initialized = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
int ret_val = 0;
|
||||||
|
if(enable_cpi)
|
||||||
|
{
|
||||||
|
ret_val = loc_eng_inject_location(loc_afw_data, latitude, longitude, accuracy);
|
||||||
|
}
|
||||||
|
EXIT_LOG(%d, ret_val);
|
||||||
|
return ret_val;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*===========================================================================
|
||||||
|
FUNCTION loc_delete_aiding_data
|
||||||
|
|
||||||
|
DESCRIPTION
|
||||||
|
This is used by Java native function to delete the aiding data. The function
|
||||||
|
updates the global variable for the aiding data to be deleted. If the GPS
|
||||||
|
engine is off, the aiding data will be deleted. Otherwise, the actual action
|
||||||
|
will happen when gps engine is turned off.
|
||||||
|
|
||||||
|
DEPENDENCIES
|
||||||
|
Assumes the aiding data type specified in GpsAidingData matches with
|
||||||
|
LOC API specification.
|
||||||
|
|
||||||
|
RETURN VALUE
|
||||||
|
None
|
||||||
|
|
||||||
|
SIDE EFFECTS
|
||||||
|
N/A
|
||||||
|
|
||||||
|
===========================================================================*/
|
||||||
|
static void loc_delete_aiding_data(GpsAidingData f)
|
||||||
|
{
|
||||||
|
ENTRY_LOG();
|
||||||
|
loc_eng_delete_aiding_data(loc_afw_data, f);
|
||||||
|
|
||||||
|
EXIT_LOG(%s, VOID_RET);
|
||||||
|
}
|
||||||
|
|
||||||
|
const GpsGeofencingInterface* get_geofence_interface(void)
|
||||||
|
{
|
||||||
|
ENTRY_LOG();
|
||||||
|
void *handle;
|
||||||
|
const char *error;
|
||||||
|
typedef const GpsGeofencingInterface* (*get_gps_geofence_interface_function) (void);
|
||||||
|
get_gps_geofence_interface_function get_gps_geofence_interface;
|
||||||
|
static const GpsGeofencingInterface* geofence_interface = NULL;
|
||||||
|
|
||||||
|
dlerror(); /* Clear any existing error */
|
||||||
|
|
||||||
|
handle = dlopen ("libgeofence.so", RTLD_NOW);
|
||||||
|
|
||||||
|
if (!handle)
|
||||||
|
{
|
||||||
|
if ((error = dlerror()) != NULL) {
|
||||||
|
LOC_LOGE ("%s, dlopen for libgeofence.so failed, error = %s\n", __func__, error);
|
||||||
|
}
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
dlerror(); /* Clear any existing error */
|
||||||
|
get_gps_geofence_interface = (get_gps_geofence_interface_function)dlsym(handle, "gps_geofence_get_interface");
|
||||||
|
if ((error = dlerror()) != NULL) {
|
||||||
|
LOC_LOGE ("%s, dlsym for get_gps_geofence_interface failed, error = %s\n", __func__, error);
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
geofence_interface = get_gps_geofence_interface();
|
||||||
|
|
||||||
|
exit:
|
||||||
|
EXIT_LOG(%d, geofence_interface == NULL);
|
||||||
|
return geofence_interface;
|
||||||
|
}
|
||||||
|
/*===========================================================================
|
||||||
|
FUNCTION loc_get_extension
|
||||||
|
|
||||||
|
DESCRIPTION
|
||||||
|
Get the gps extension to support XTRA.
|
||||||
|
|
||||||
|
DEPENDENCIES
|
||||||
|
N/A
|
||||||
|
|
||||||
|
RETURN VALUE
|
||||||
|
The GPS extension interface.
|
||||||
|
|
||||||
|
SIDE EFFECTS
|
||||||
|
N/A
|
||||||
|
|
||||||
|
===========================================================================*/
|
||||||
|
const void* loc_get_extension(const char* name)
|
||||||
|
{
|
||||||
|
ENTRY_LOG();
|
||||||
|
const void* ret_val = NULL;
|
||||||
|
|
||||||
|
LOC_LOGD("%s:%d] For Interface = %s\n",__func__, __LINE__, name);
|
||||||
|
if (strcmp(name, GPS_XTRA_INTERFACE) == 0)
|
||||||
|
{
|
||||||
|
ret_val = &sLocEngXTRAInterface;
|
||||||
|
}
|
||||||
|
else if (strcmp(name, AGPS_INTERFACE) == 0)
|
||||||
|
{
|
||||||
|
ret_val = &sLocEngAGpsInterface;
|
||||||
|
}
|
||||||
|
else if (strcmp(name, GPS_NI_INTERFACE) == 0)
|
||||||
|
{
|
||||||
|
ret_val = &sLocEngNiInterface;
|
||||||
|
}
|
||||||
|
else if (strcmp(name, AGPS_RIL_INTERFACE) == 0)
|
||||||
|
{
|
||||||
|
char baseband[PROPERTY_VALUE_MAX];
|
||||||
|
property_get("ro.baseband", baseband, "msm");
|
||||||
|
if (strcmp(baseband, "csfb") == 0)
|
||||||
|
{
|
||||||
|
ret_val = &sLocEngAGpsRilInterface;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (strcmp(name, GPS_GEOFENCING_INTERFACE) == 0)
|
||||||
|
{
|
||||||
|
if ((gps_conf.CAPABILITIES | GPS_CAPABILITY_GEOFENCING) == gps_conf.CAPABILITIES ){
|
||||||
|
ret_val = get_geofence_interface();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
LOC_LOGE ("get_extension: Invalid interface passed in\n");
|
||||||
|
}
|
||||||
|
EXIT_LOG(%p, ret_val);
|
||||||
|
return ret_val;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*===========================================================================
|
||||||
|
FUNCTION loc_agps_init
|
||||||
|
|
||||||
|
DESCRIPTION
|
||||||
|
Initialize the AGps interface.
|
||||||
|
|
||||||
|
DEPENDENCIES
|
||||||
|
NONE
|
||||||
|
|
||||||
|
RETURN VALUE
|
||||||
|
0
|
||||||
|
|
||||||
|
SIDE EFFECTS
|
||||||
|
N/A
|
||||||
|
|
||||||
|
===========================================================================*/
|
||||||
|
static void loc_agps_init(AGpsCallbacks* callbacks)
|
||||||
|
{
|
||||||
|
ENTRY_LOG();
|
||||||
|
loc_eng_agps_init(loc_afw_data, (AGpsExtCallbacks*)callbacks);
|
||||||
|
EXIT_LOG(%s, VOID_RET);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*===========================================================================
|
||||||
|
FUNCTION loc_agps_open
|
||||||
|
|
||||||
|
DESCRIPTION
|
||||||
|
This function is called when on-demand data connection opening is successful.
|
||||||
|
It should inform ARM 9 about the data open result.
|
||||||
|
|
||||||
|
DEPENDENCIES
|
||||||
|
NONE
|
||||||
|
|
||||||
|
RETURN VALUE
|
||||||
|
0
|
||||||
|
|
||||||
|
SIDE EFFECTS
|
||||||
|
N/A
|
||||||
|
|
||||||
|
===========================================================================*/
|
||||||
|
static int loc_agps_open(const char* apn)
|
||||||
|
{
|
||||||
|
ENTRY_LOG();
|
||||||
|
AGpsType agpsType = AGPS_TYPE_SUPL;
|
||||||
|
ApnIpType bearerType = AGPS_APN_BEARER_IPV4;
|
||||||
|
int ret_val = loc_eng_agps_open(loc_afw_data, agpsType, apn, bearerType);
|
||||||
|
|
||||||
|
EXIT_LOG(%d, ret_val);
|
||||||
|
return ret_val;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*===========================================================================
|
||||||
|
FUNCTION loc_agps_closed
|
||||||
|
|
||||||
|
DESCRIPTION
|
||||||
|
This function is called when on-demand data connection closing is done.
|
||||||
|
It should inform ARM 9 about the data close result.
|
||||||
|
|
||||||
|
DEPENDENCIES
|
||||||
|
NONE
|
||||||
|
|
||||||
|
RETURN VALUE
|
||||||
|
0
|
||||||
|
|
||||||
|
SIDE EFFECTS
|
||||||
|
N/A
|
||||||
|
|
||||||
|
===========================================================================*/
|
||||||
|
static int loc_agps_closed()
|
||||||
|
{
|
||||||
|
ENTRY_LOG();
|
||||||
|
AGpsType agpsType = AGPS_TYPE_SUPL;
|
||||||
|
int ret_val = loc_eng_agps_closed(loc_afw_data, agpsType);
|
||||||
|
|
||||||
|
EXIT_LOG(%d, ret_val);
|
||||||
|
return ret_val;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*===========================================================================
|
||||||
|
FUNCTION loc_agps_open_failed
|
||||||
|
|
||||||
|
DESCRIPTION
|
||||||
|
This function is called when on-demand data connection opening has failed.
|
||||||
|
It should inform ARM 9 about the data open result.
|
||||||
|
|
||||||
|
DEPENDENCIES
|
||||||
|
NONE
|
||||||
|
|
||||||
|
RETURN VALUE
|
||||||
|
0
|
||||||
|
|
||||||
|
SIDE EFFECTS
|
||||||
|
N/A
|
||||||
|
|
||||||
|
===========================================================================*/
|
||||||
|
int loc_agps_open_failed()
|
||||||
|
{
|
||||||
|
ENTRY_LOG();
|
||||||
|
AGpsType agpsType = AGPS_TYPE_SUPL;
|
||||||
|
int ret_val = loc_eng_agps_open_failed(loc_afw_data, agpsType);
|
||||||
|
|
||||||
|
EXIT_LOG(%d, ret_val);
|
||||||
|
return ret_val;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*===========================================================================
|
||||||
|
FUNCTION loc_agps_set_server
|
||||||
|
|
||||||
|
DESCRIPTION
|
||||||
|
If loc_eng_set_server is called before loc_eng_init, it doesn't work. This
|
||||||
|
proxy buffers server settings and calls loc_eng_set_server when the client is
|
||||||
|
open.
|
||||||
|
|
||||||
|
DEPENDENCIES
|
||||||
|
NONE
|
||||||
|
|
||||||
|
RETURN VALUE
|
||||||
|
0
|
||||||
|
|
||||||
|
SIDE EFFECTS
|
||||||
|
N/A
|
||||||
|
|
||||||
|
===========================================================================*/
|
||||||
|
static int loc_agps_set_server(AGpsType type, const char* hostname, int port)
|
||||||
|
{
|
||||||
|
ENTRY_LOG();
|
||||||
|
LocServerType serverType;
|
||||||
|
switch (type) {
|
||||||
|
case AGPS_TYPE_SUPL:
|
||||||
|
serverType = LOC_AGPS_SUPL_SERVER;
|
||||||
|
break;
|
||||||
|
case AGPS_TYPE_C2K:
|
||||||
|
serverType = LOC_AGPS_CDMA_PDE_SERVER;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
serverType = LOC_AGPS_SUPL_SERVER;
|
||||||
|
}
|
||||||
|
int ret_val = loc_eng_set_server_proxy(loc_afw_data, serverType, hostname, port);
|
||||||
|
|
||||||
|
EXIT_LOG(%d, ret_val);
|
||||||
|
return ret_val;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*===========================================================================
|
||||||
|
FUNCTIONf571
|
||||||
|
loc_xtra_init
|
||||||
|
|
||||||
|
DESCRIPTION
|
||||||
|
Initialize XTRA module.
|
||||||
|
|
||||||
|
DEPENDENCIES
|
||||||
|
None
|
||||||
|
|
||||||
|
RETURN VALUE
|
||||||
|
0: success
|
||||||
|
|
||||||
|
SIDE EFFECTS
|
||||||
|
N/A
|
||||||
|
|
||||||
|
===========================================================================*/
|
||||||
|
static int loc_xtra_init(GpsXtraCallbacks* callbacks)
|
||||||
|
{
|
||||||
|
ENTRY_LOG();
|
||||||
|
int ret_val = loc_eng_xtra_init(loc_afw_data, (GpsXtraExtCallbacks*)callbacks);
|
||||||
|
|
||||||
|
EXIT_LOG(%d, ret_val);
|
||||||
|
return ret_val;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*===========================================================================
|
||||||
|
FUNCTION loc_xtra_inject_data
|
||||||
|
|
||||||
|
DESCRIPTION
|
||||||
|
Initialize XTRA module.
|
||||||
|
|
||||||
|
DEPENDENCIES
|
||||||
|
None
|
||||||
|
|
||||||
|
RETURN VALUE
|
||||||
|
0: success
|
||||||
|
|
||||||
|
SIDE EFFECTS
|
||||||
|
N/A
|
||||||
|
|
||||||
|
===========================================================================*/
|
||||||
|
static int loc_xtra_inject_data(char* data, int length)
|
||||||
|
{
|
||||||
|
ENTRY_LOG();
|
||||||
|
int ret_val = loc_eng_xtra_inject_data(loc_afw_data, data, length);
|
||||||
|
|
||||||
|
EXIT_LOG(%d, ret_val);
|
||||||
|
return ret_val;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*===========================================================================
|
||||||
|
FUNCTION loc_ni_init
|
||||||
|
|
||||||
|
DESCRIPTION
|
||||||
|
This function initializes the NI interface
|
||||||
|
|
||||||
|
DEPENDENCIES
|
||||||
|
NONE
|
||||||
|
|
||||||
|
RETURN VALUE
|
||||||
|
None
|
||||||
|
|
||||||
|
SIDE EFFECTS
|
||||||
|
N/A
|
||||||
|
|
||||||
|
===========================================================================*/
|
||||||
|
void loc_ni_init(GpsNiCallbacks *callbacks)
|
||||||
|
{
|
||||||
|
ENTRY_LOG();
|
||||||
|
loc_eng_ni_init(loc_afw_data,(GpsNiExtCallbacks*) callbacks);
|
||||||
|
EXIT_LOG(%s, VOID_RET);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*===========================================================================
|
||||||
|
FUNCTION loc_ni_respond
|
||||||
|
|
||||||
|
DESCRIPTION
|
||||||
|
This function sends an NI respond to the modem processor
|
||||||
|
|
||||||
|
DEPENDENCIES
|
||||||
|
NONE
|
||||||
|
|
||||||
|
RETURN VALUE
|
||||||
|
None
|
||||||
|
|
||||||
|
SIDE EFFECTS
|
||||||
|
N/A
|
||||||
|
|
||||||
|
===========================================================================*/
|
||||||
|
void loc_ni_respond(int notif_id, GpsUserResponseType user_response)
|
||||||
|
{
|
||||||
|
ENTRY_LOG();
|
||||||
|
loc_eng_ni_respond(loc_afw_data, notif_id, user_response);
|
||||||
|
EXIT_LOG(%s, VOID_RET);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Below stub functions are members of sLocEngAGpsRilInterface
|
||||||
|
static void loc_agps_ril_init( AGpsRilCallbacks* callbacks ) {}
|
||||||
|
static void loc_agps_ril_set_ref_location(const AGpsRefLocation *agps_reflocation, size_t sz_struct) {}
|
||||||
|
static void loc_agps_ril_set_set_id(AGpsSetIDType type, const char* setid) {}
|
||||||
|
static void loc_agps_ril_ni_message(uint8_t *msg, size_t len) {}
|
||||||
|
static void loc_agps_ril_update_network_state(int connected, int type, int roaming, const char* extra_info) {}
|
||||||
|
|
||||||
|
/*===========================================================================
|
||||||
|
FUNCTION loc_agps_ril_update_network_availability
|
||||||
|
|
||||||
|
DESCRIPTION
|
||||||
|
Sets data call allow vs disallow flag to modem
|
||||||
|
This is the only member of sLocEngAGpsRilInterface implemented.
|
||||||
|
|
||||||
|
DEPENDENCIES
|
||||||
|
None
|
||||||
|
|
||||||
|
RETURN VALUE
|
||||||
|
0: success
|
||||||
|
|
||||||
|
SIDE EFFECTS
|
||||||
|
N/A
|
||||||
|
|
||||||
|
===========================================================================*/
|
||||||
|
static void loc_agps_ril_update_network_availability(int available, const char* apn)
|
||||||
|
{
|
||||||
|
ENTRY_LOG();
|
||||||
|
loc_eng_agps_ril_update_network_availability(loc_afw_data, available, apn);
|
||||||
|
EXIT_LOG(%s, VOID_RET);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void local_loc_cb(UlpLocation* location, void* locExt)
|
||||||
|
{
|
||||||
|
ENTRY_LOG();
|
||||||
|
if (NULL != location) {
|
||||||
|
CALLBACK_LOG_CALLFLOW("location_cb - from", %d, location->position_source);
|
||||||
|
|
||||||
|
if (NULL != gps_loc_cb) {
|
||||||
|
gps_loc_cb(&location->gpsLocation);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
EXIT_LOG(%s, VOID_RET);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void local_sv_cb(GpsSvStatus* sv_status, void* svExt)
|
||||||
|
{
|
||||||
|
ENTRY_LOG();
|
||||||
|
if (NULL != gps_sv_cb) {
|
||||||
|
CALLBACK_LOG_CALLFLOW("sv_status_cb -", %d, sv_status->num_svs);
|
||||||
|
gps_sv_cb(sv_status);
|
||||||
|
}
|
||||||
|
EXIT_LOG(%s, VOID_RET);
|
||||||
|
}
|
64
gps/loc_api/libloc_api_50001/loc.h
Executable file
64
gps/loc_api/libloc_api_50001/loc.h
Executable file
@ -0,0 +1,64 @@
|
|||||||
|
/* Copyright (c) 2011-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_H__
|
||||||
|
#define __LOC_H__
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif /* __cplusplus */
|
||||||
|
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <cutils/properties.h>
|
||||||
|
#include "hardware/gps.h"
|
||||||
|
#include <gps_extended.h>
|
||||||
|
|
||||||
|
typedef void (*loc_location_cb_ext) (UlpLocation* location, void* locExt);
|
||||||
|
typedef void (*loc_sv_status_cb_ext) (GpsSvStatus* sv_status, void* svExt);
|
||||||
|
typedef void* (*loc_ext_parser)(void* data);
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
loc_location_cb_ext location_cb;
|
||||||
|
gps_status_callback status_cb;
|
||||||
|
loc_sv_status_cb_ext sv_status_cb;
|
||||||
|
gps_nmea_callback nmea_cb;
|
||||||
|
gps_set_capabilities set_capabilities_cb;
|
||||||
|
gps_acquire_wakelock acquire_wakelock_cb;
|
||||||
|
gps_release_wakelock release_wakelock_cb;
|
||||||
|
gps_create_thread create_thread_cb;
|
||||||
|
loc_ext_parser location_ext_parser;
|
||||||
|
loc_ext_parser sv_ext_parser;
|
||||||
|
gps_request_utc_time request_utc_time_cb;
|
||||||
|
} LocCallbacks;
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif /* __cplusplus */
|
||||||
|
|
||||||
|
#endif //__LOC_H__
|
2599
gps/loc_api/libloc_api_50001/loc_eng.cpp
Executable file
2599
gps/loc_api/libloc_api_50001/loc_eng.cpp
Executable file
File diff suppressed because it is too large
Load Diff
241
gps/loc_api/libloc_api_50001/loc_eng.h
Executable file
241
gps/loc_api/libloc_api_50001/loc_eng.h
Executable file
@ -0,0 +1,241 @@
|
|||||||
|
/* Copyright (c) 2009-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_ENG_H
|
||||||
|
#define LOC_ENG_H
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif /* __cplusplus */
|
||||||
|
|
||||||
|
// Uncomment to keep all LOG messages (LOGD, LOGI, LOGV, etc.)
|
||||||
|
#define MAX_NUM_ATL_CONNECTIONS 2
|
||||||
|
|
||||||
|
// Define boolean type to be used by libgps on loc api module
|
||||||
|
typedef unsigned char boolean;
|
||||||
|
|
||||||
|
#ifndef TRUE
|
||||||
|
#define TRUE 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef FALSE
|
||||||
|
#define FALSE 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <loc.h>
|
||||||
|
#include <loc_eng_xtra.h>
|
||||||
|
#include <loc_eng_ni.h>
|
||||||
|
#include <loc_eng_agps.h>
|
||||||
|
#include <loc_cfg.h>
|
||||||
|
#include <loc_log.h>
|
||||||
|
#include <log_util.h>
|
||||||
|
#include <loc_eng_agps.h>
|
||||||
|
#include <LocEngAdapter.h>
|
||||||
|
|
||||||
|
// The data connection minimal open time
|
||||||
|
#define DATA_OPEN_MIN_TIME 1 /* sec */
|
||||||
|
|
||||||
|
// The system sees GPS engine turns off after inactive for this period of time
|
||||||
|
#define GPS_AUTO_OFF_TIME 2 /* secs */
|
||||||
|
#define SUCCESS TRUE
|
||||||
|
#define FAILURE FALSE
|
||||||
|
#define INVALID_ATL_CONNECTION_HANDLE -1
|
||||||
|
|
||||||
|
enum loc_nmea_provider_e_type {
|
||||||
|
NMEA_PROVIDER_AP = 0, // Application Processor Provider of NMEA
|
||||||
|
NMEA_PROVIDER_MP // Modem Processor Provider of NMEA
|
||||||
|
};
|
||||||
|
|
||||||
|
enum loc_mute_session_e_type {
|
||||||
|
LOC_MUTE_SESS_NONE = 0,
|
||||||
|
LOC_MUTE_SESS_WAIT,
|
||||||
|
LOC_MUTE_SESS_IN_SESSION
|
||||||
|
};
|
||||||
|
|
||||||
|
// Module data
|
||||||
|
typedef struct loc_eng_data_s
|
||||||
|
{
|
||||||
|
LocEngAdapter *adapter;
|
||||||
|
loc_location_cb_ext location_cb;
|
||||||
|
gps_status_callback status_cb;
|
||||||
|
loc_sv_status_cb_ext sv_status_cb;
|
||||||
|
agps_status_extended agps_status_cb;
|
||||||
|
gps_nmea_callback nmea_cb;
|
||||||
|
gps_ni_notify_callback ni_notify_cb;
|
||||||
|
gps_acquire_wakelock acquire_wakelock_cb;
|
||||||
|
gps_release_wakelock release_wakelock_cb;
|
||||||
|
gps_request_utc_time request_utc_time_cb;
|
||||||
|
boolean intermediateFix;
|
||||||
|
AGpsStatusValue agps_status;
|
||||||
|
loc_eng_xtra_data_s_type xtra_module_data;
|
||||||
|
loc_eng_ni_data_s_type loc_eng_ni_data;
|
||||||
|
|
||||||
|
// AGPS state machines
|
||||||
|
AgpsStateMachine* agnss_nif;
|
||||||
|
AgpsStateMachine* internet_nif;
|
||||||
|
AgpsStateMachine* wifi_nif;
|
||||||
|
//State machine for Data Services
|
||||||
|
AgpsStateMachine* ds_nif;
|
||||||
|
|
||||||
|
// GPS engine status
|
||||||
|
GpsStatusValue engine_status;
|
||||||
|
GpsStatusValue fix_session_status;
|
||||||
|
|
||||||
|
// Aiding data information to be deleted, aiding data can only be deleted when GPS engine is off
|
||||||
|
GpsAidingData aiding_data_for_deletion;
|
||||||
|
|
||||||
|
// For muting session broadcast
|
||||||
|
loc_mute_session_e_type mute_session_state;
|
||||||
|
|
||||||
|
// For nmea generation
|
||||||
|
boolean generateNmea;
|
||||||
|
uint32_t sv_used_mask;
|
||||||
|
float hdop;
|
||||||
|
float pdop;
|
||||||
|
float vdop;
|
||||||
|
|
||||||
|
// Address buffers, for addressing setting before init
|
||||||
|
int supl_host_set;
|
||||||
|
char supl_host_buf[101];
|
||||||
|
int supl_port_buf;
|
||||||
|
int c2k_host_set;
|
||||||
|
char c2k_host_buf[101];
|
||||||
|
int c2k_port_buf;
|
||||||
|
int mpc_host_set;
|
||||||
|
char mpc_host_buf[101];
|
||||||
|
int mpc_port_buf;
|
||||||
|
|
||||||
|
loc_ext_parser location_ext_parser;
|
||||||
|
loc_ext_parser sv_ext_parser;
|
||||||
|
} loc_eng_data_s_type;
|
||||||
|
|
||||||
|
/* GPS.conf support */
|
||||||
|
typedef struct loc_gps_cfg_s
|
||||||
|
{
|
||||||
|
unsigned long INTERMEDIATE_POS;
|
||||||
|
unsigned long ACCURACY_THRES;
|
||||||
|
unsigned long SUPL_VER;
|
||||||
|
unsigned long CAPABILITIES;
|
||||||
|
unsigned long QUIPC_ENABLED;
|
||||||
|
unsigned long LPP_PROFILE;
|
||||||
|
uint8_t NMEA_PROVIDER;
|
||||||
|
unsigned long A_GLONASS_POS_PROTOCOL_SELECT;
|
||||||
|
} loc_gps_cfg_s_type;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint8_t GYRO_BIAS_RANDOM_WALK_VALID;
|
||||||
|
double GYRO_BIAS_RANDOM_WALK;
|
||||||
|
unsigned long SENSOR_ACCEL_BATCHES_PER_SEC;
|
||||||
|
unsigned long SENSOR_ACCEL_SAMPLES_PER_BATCH;
|
||||||
|
unsigned long SENSOR_GYRO_BATCHES_PER_SEC;
|
||||||
|
unsigned long SENSOR_GYRO_SAMPLES_PER_BATCH;
|
||||||
|
unsigned long SENSOR_ACCEL_BATCHES_PER_SEC_HIGH;
|
||||||
|
unsigned long SENSOR_ACCEL_SAMPLES_PER_BATCH_HIGH;
|
||||||
|
unsigned long SENSOR_GYRO_BATCHES_PER_SEC_HIGH;
|
||||||
|
unsigned long SENSOR_GYRO_SAMPLES_PER_BATCH_HIGH;
|
||||||
|
unsigned long SENSOR_CONTROL_MODE;
|
||||||
|
unsigned long SENSOR_USAGE;
|
||||||
|
unsigned long SENSOR_ALGORITHM_CONFIG_MASK;
|
||||||
|
uint8_t ACCEL_RANDOM_WALK_SPECTRAL_DENSITY_VALID;
|
||||||
|
double ACCEL_RANDOM_WALK_SPECTRAL_DENSITY;
|
||||||
|
uint8_t ANGLE_RANDOM_WALK_SPECTRAL_DENSITY_VALID;
|
||||||
|
double ANGLE_RANDOM_WALK_SPECTRAL_DENSITY;
|
||||||
|
uint8_t RATE_RANDOM_WALK_SPECTRAL_DENSITY_VALID;
|
||||||
|
double RATE_RANDOM_WALK_SPECTRAL_DENSITY;
|
||||||
|
uint8_t VELOCITY_RANDOM_WALK_SPECTRAL_DENSITY_VALID;
|
||||||
|
double VELOCITY_RANDOM_WALK_SPECTRAL_DENSITY;
|
||||||
|
} loc_sap_cfg_s_type;
|
||||||
|
|
||||||
|
extern loc_gps_cfg_s_type gps_conf;
|
||||||
|
extern loc_sap_cfg_s_type sap_conf;
|
||||||
|
|
||||||
|
int loc_eng_init(loc_eng_data_s_type &loc_eng_data,
|
||||||
|
LocCallbacks* callbacks,
|
||||||
|
LOC_API_ADAPTER_EVENT_MASK_T event,
|
||||||
|
ContextBase* context);
|
||||||
|
int loc_eng_start(loc_eng_data_s_type &loc_eng_data);
|
||||||
|
int loc_eng_stop(loc_eng_data_s_type &loc_eng_data);
|
||||||
|
void loc_eng_cleanup(loc_eng_data_s_type &loc_eng_data);
|
||||||
|
int loc_eng_inject_time(loc_eng_data_s_type &loc_eng_data,
|
||||||
|
GpsUtcTime time, int64_t timeReference,
|
||||||
|
int uncertainty);
|
||||||
|
int loc_eng_inject_location(loc_eng_data_s_type &loc_eng_data,
|
||||||
|
double latitude, double longitude,
|
||||||
|
float accuracy);
|
||||||
|
void loc_eng_delete_aiding_data(loc_eng_data_s_type &loc_eng_data,
|
||||||
|
GpsAidingData f);
|
||||||
|
int loc_eng_set_position_mode(loc_eng_data_s_type &loc_eng_data,
|
||||||
|
LocPosMode ¶ms);
|
||||||
|
const void* loc_eng_get_extension(loc_eng_data_s_type &loc_eng_data,
|
||||||
|
const char* name);
|
||||||
|
void loc_eng_agps_init(loc_eng_data_s_type &loc_eng_data,
|
||||||
|
AGpsExtCallbacks* callbacks);
|
||||||
|
int loc_eng_agps_open(loc_eng_data_s_type &loc_eng_data, AGpsExtType agpsType,
|
||||||
|
const char* apn, ApnIpType bearerType);
|
||||||
|
int loc_eng_agps_closed(loc_eng_data_s_type &loc_eng_data, AGpsExtType agpsType);
|
||||||
|
int loc_eng_agps_open_failed(loc_eng_data_s_type &loc_eng_data, AGpsExtType agpsType);
|
||||||
|
|
||||||
|
int loc_eng_set_server_proxy(loc_eng_data_s_type &loc_eng_data,
|
||||||
|
LocServerType type, const char *hostname, int port);
|
||||||
|
|
||||||
|
|
||||||
|
void loc_eng_agps_ril_update_network_availability(loc_eng_data_s_type &loc_eng_data,
|
||||||
|
int avaiable, const char* apn);
|
||||||
|
|
||||||
|
|
||||||
|
bool loc_eng_inject_raw_command(loc_eng_data_s_type &loc_eng_data,
|
||||||
|
char* command, int length);
|
||||||
|
|
||||||
|
|
||||||
|
void loc_eng_mute_one_session(loc_eng_data_s_type &loc_eng_data);
|
||||||
|
|
||||||
|
int loc_eng_xtra_init (loc_eng_data_s_type &loc_eng_data,
|
||||||
|
GpsXtraExtCallbacks* callbacks);
|
||||||
|
|
||||||
|
int loc_eng_xtra_inject_data(loc_eng_data_s_type &loc_eng_data,
|
||||||
|
char* data, int length);
|
||||||
|
|
||||||
|
int loc_eng_xtra_request_server(loc_eng_data_s_type &loc_eng_data);
|
||||||
|
|
||||||
|
extern void loc_eng_ni_init(loc_eng_data_s_type &loc_eng_data,
|
||||||
|
GpsNiExtCallbacks *callbacks);
|
||||||
|
extern void loc_eng_ni_respond(loc_eng_data_s_type &loc_eng_data,
|
||||||
|
int notif_id, GpsUserResponseType user_response);
|
||||||
|
extern void loc_eng_ni_request_handler(loc_eng_data_s_type &loc_eng_data,
|
||||||
|
const GpsNiNotification *notif,
|
||||||
|
const void* passThrough);
|
||||||
|
extern void loc_eng_ni_reset_on_engine_restart(loc_eng_data_s_type &loc_eng_data);
|
||||||
|
int loc_eng_read_config(void);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif /* __cplusplus */
|
||||||
|
|
||||||
|
#endif // LOC_ENG_H
|
970
gps/loc_api/libloc_api_50001/loc_eng_agps.cpp
Executable file
970
gps/loc_api/libloc_api_50001/loc_eng_agps.cpp
Executable file
@ -0,0 +1,970 @@
|
|||||||
|
/* Copyright (c) 2011-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.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define LOG_NDDEBUG 0
|
||||||
|
#define LOG_TAG "LocSvc_eng"
|
||||||
|
|
||||||
|
#include <loc_eng_agps.h>
|
||||||
|
#include <loc_eng_log.h>
|
||||||
|
#include <log_util.h>
|
||||||
|
#include <platform_lib_includes.h>
|
||||||
|
#include <loc_eng_dmn_conn_handler.h>
|
||||||
|
#include <loc_eng_dmn_conn.h>
|
||||||
|
#include <sys/time.h>
|
||||||
|
|
||||||
|
//======================================================================
|
||||||
|
// C callbacks
|
||||||
|
//======================================================================
|
||||||
|
|
||||||
|
// This is given to linked_list_add as the dealloc callback
|
||||||
|
// data -- an instance of Subscriber
|
||||||
|
static void deleteObj(void* data)
|
||||||
|
{
|
||||||
|
delete (Subscriber*)data;
|
||||||
|
}
|
||||||
|
|
||||||
|
// This is given to linked_list_search() as the comparison callback
|
||||||
|
// when the state manchine needs to process for particular subscriber
|
||||||
|
// fromCaller -- caller provides this obj
|
||||||
|
// fromList -- linked_list_search() function take this one from list
|
||||||
|
static bool hasSubscriber(void* fromCaller, void* fromList)
|
||||||
|
{
|
||||||
|
Notification* notification = (Notification*)fromCaller;
|
||||||
|
Subscriber* s1 = (Subscriber*)fromList;
|
||||||
|
|
||||||
|
return s1->forMe(*notification);
|
||||||
|
}
|
||||||
|
|
||||||
|
// This is gvien to linked_list_search() to notify subscriber objs
|
||||||
|
// when the state machine needs to inform all subscribers of resource
|
||||||
|
// status changes, e.g. when resource is GRANTED.
|
||||||
|
// fromCaller -- caller provides this ptr to a Notification obj.
|
||||||
|
// fromList -- linked_list_search() function take this one from list
|
||||||
|
static bool notifySubscriber(void* fromCaller, void* fromList)
|
||||||
|
{
|
||||||
|
Notification* notification = (Notification*)fromCaller;
|
||||||
|
Subscriber* s1 = (Subscriber*)fromList;
|
||||||
|
|
||||||
|
// we notify every subscriber indiscriminatively
|
||||||
|
// each subscriber decides if this notification is interesting.
|
||||||
|
return s1->notifyRsrcStatus(*notification) &&
|
||||||
|
// if we do not want to delete the subscriber from the
|
||||||
|
// the list, we must set this to false so this function
|
||||||
|
// returns false
|
||||||
|
notification->postNotifyDelete;
|
||||||
|
}
|
||||||
|
|
||||||
|
//======================================================================
|
||||||
|
// Notification
|
||||||
|
//======================================================================
|
||||||
|
const int Notification::BROADCAST_ALL = 0x80000000;
|
||||||
|
const int Notification::BROADCAST_ACTIVE = 0x80000001;
|
||||||
|
const int Notification::BROADCAST_INACTIVE = 0x80000002;
|
||||||
|
const unsigned char DSStateMachine::MAX_START_DATA_CALL_RETRIES = 4;
|
||||||
|
const unsigned int DSStateMachine::DATA_CALL_RETRY_DELAY_MSEC = 500;
|
||||||
|
//======================================================================
|
||||||
|
// Subscriber: BITSubscriber / ATLSubscriber / WIFISubscriber
|
||||||
|
//======================================================================
|
||||||
|
bool Subscriber::forMe(Notification ¬ification)
|
||||||
|
{
|
||||||
|
if (NULL != notification.rcver) {
|
||||||
|
return equals(notification.rcver);
|
||||||
|
} else {
|
||||||
|
return Notification::BROADCAST_ALL == notification.groupID ||
|
||||||
|
(Notification::BROADCAST_ACTIVE == notification.groupID &&
|
||||||
|
!isInactive()) ||
|
||||||
|
(Notification::BROADCAST_INACTIVE == notification.groupID &&
|
||||||
|
isInactive());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
bool BITSubscriber::equals(const Subscriber *s) const
|
||||||
|
{
|
||||||
|
BITSubscriber* bitS = (BITSubscriber*)s;
|
||||||
|
|
||||||
|
return (ID == bitS->ID &&
|
||||||
|
(INADDR_NONE != (unsigned int)ID ||
|
||||||
|
0 == strncmp(mIPv6Addr, bitS->mIPv6Addr, sizeof(mIPv6Addr))));
|
||||||
|
}
|
||||||
|
|
||||||
|
bool BITSubscriber::notifyRsrcStatus(Notification ¬ification)
|
||||||
|
{
|
||||||
|
bool notify = forMe(notification);
|
||||||
|
|
||||||
|
if (notify) {
|
||||||
|
switch(notification.rsrcStatus)
|
||||||
|
{
|
||||||
|
case RSRC_UNSUBSCRIBE:
|
||||||
|
case RSRC_RELEASED:
|
||||||
|
loc_eng_dmn_conn_loc_api_server_data_conn(
|
||||||
|
LOC_ENG_IF_REQUEST_SENDER_ID_GPSONE_DAEMON,
|
||||||
|
GPSONE_LOC_API_IF_RELEASE_SUCCESS);
|
||||||
|
break;
|
||||||
|
case RSRC_DENIED:
|
||||||
|
loc_eng_dmn_conn_loc_api_server_data_conn(
|
||||||
|
LOC_ENG_IF_REQUEST_SENDER_ID_GPSONE_DAEMON,
|
||||||
|
GPSONE_LOC_API_IF_FAILURE);
|
||||||
|
break;
|
||||||
|
case RSRC_GRANTED:
|
||||||
|
loc_eng_dmn_conn_loc_api_server_data_conn(
|
||||||
|
LOC_ENG_IF_REQUEST_SENDER_ID_GPSONE_DAEMON,
|
||||||
|
GPSONE_LOC_API_IF_REQUEST_SUCCESS);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
notify = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return notify;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ATLSubscriber::notifyRsrcStatus(Notification ¬ification)
|
||||||
|
{
|
||||||
|
bool notify = forMe(notification);
|
||||||
|
|
||||||
|
if (notify) {
|
||||||
|
switch(notification.rsrcStatus)
|
||||||
|
{
|
||||||
|
case RSRC_UNSUBSCRIBE:
|
||||||
|
case RSRC_RELEASED:
|
||||||
|
((LocEngAdapter*)mLocAdapter)->atlCloseStatus(ID, 1);
|
||||||
|
break;
|
||||||
|
case RSRC_DENIED:
|
||||||
|
{
|
||||||
|
AGpsExtType type = mBackwardCompatibleMode ?
|
||||||
|
AGPS_TYPE_INVALID : mStateMachine->getType();
|
||||||
|
((LocEngAdapter*)mLocAdapter)->atlOpenStatus(ID, 0,
|
||||||
|
(char*)mStateMachine->getAPN(),
|
||||||
|
mStateMachine->getBearer(),
|
||||||
|
type);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case RSRC_GRANTED:
|
||||||
|
{
|
||||||
|
AGpsExtType type = mBackwardCompatibleMode ?
|
||||||
|
AGPS_TYPE_INVALID : mStateMachine->getType();
|
||||||
|
((LocEngAdapter*)mLocAdapter)->atlOpenStatus(ID, 1,
|
||||||
|
(char*)mStateMachine->getAPN(),
|
||||||
|
mStateMachine->getBearer(),
|
||||||
|
type);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
notify = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return notify;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool WIFISubscriber::notifyRsrcStatus(Notification ¬ification)
|
||||||
|
{
|
||||||
|
bool notify = forMe(notification);
|
||||||
|
|
||||||
|
if (notify) {
|
||||||
|
switch(notification.rsrcStatus)
|
||||||
|
{
|
||||||
|
case RSRC_UNSUBSCRIBE:
|
||||||
|
break;
|
||||||
|
case RSRC_RELEASED:
|
||||||
|
loc_eng_dmn_conn_loc_api_server_data_conn(
|
||||||
|
senderId,
|
||||||
|
GPSONE_LOC_API_IF_RELEASE_SUCCESS);
|
||||||
|
break;
|
||||||
|
case RSRC_DENIED:
|
||||||
|
loc_eng_dmn_conn_loc_api_server_data_conn(
|
||||||
|
senderId,
|
||||||
|
GPSONE_LOC_API_IF_FAILURE);
|
||||||
|
break;
|
||||||
|
case RSRC_GRANTED:
|
||||||
|
loc_eng_dmn_conn_loc_api_server_data_conn(
|
||||||
|
senderId,
|
||||||
|
GPSONE_LOC_API_IF_REQUEST_SUCCESS);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
notify = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return notify;
|
||||||
|
}
|
||||||
|
bool DSSubscriber::notifyRsrcStatus(Notification ¬ification)
|
||||||
|
{
|
||||||
|
bool notify = forMe(notification);
|
||||||
|
LOC_LOGD("DSSubscriber::notifyRsrcStatus. notify:%d \n",(int)(notify));
|
||||||
|
if(notify) {
|
||||||
|
switch(notification.rsrcStatus) {
|
||||||
|
case RSRC_UNSUBSCRIBE:
|
||||||
|
case RSRC_RELEASED:
|
||||||
|
case RSRC_DENIED:
|
||||||
|
case RSRC_GRANTED:
|
||||||
|
((DSStateMachine *)mStateMachine)->informStatus(notification.rsrcStatus, ID);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
notify = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return notify;
|
||||||
|
}
|
||||||
|
void DSSubscriber :: setInactive()
|
||||||
|
{
|
||||||
|
mIsInactive = true;
|
||||||
|
((DSStateMachine *)mStateMachine)->informStatus(RSRC_UNSUBSCRIBE, ID);
|
||||||
|
}
|
||||||
|
//======================================================================
|
||||||
|
// AgpsState: AgpsReleasedState / AgpsPendingState / AgpsAcquiredState
|
||||||
|
//======================================================================
|
||||||
|
|
||||||
|
// AgpsReleasedState
|
||||||
|
class AgpsReleasedState : public AgpsState
|
||||||
|
{
|
||||||
|
friend class AgpsStateMachine;
|
||||||
|
|
||||||
|
inline AgpsReleasedState(AgpsStateMachine* stateMachine) :
|
||||||
|
AgpsState(stateMachine)
|
||||||
|
{ mReleasedState = this; }
|
||||||
|
|
||||||
|
inline ~AgpsReleasedState() {}
|
||||||
|
public:
|
||||||
|
virtual AgpsState* onRsrcEvent(AgpsRsrcStatus event, void* data);
|
||||||
|
inline virtual char* whoami() {return (char*)"AgpsReleasedState";}
|
||||||
|
};
|
||||||
|
|
||||||
|
AgpsState* AgpsReleasedState::onRsrcEvent(AgpsRsrcStatus event, void* data)
|
||||||
|
{
|
||||||
|
LOC_LOGD("AgpsReleasedState::onRsrcEvent; event:%d\n", (int)event);
|
||||||
|
if (mStateMachine->hasSubscribers()) {
|
||||||
|
LOC_LOGE("Error: %s subscriber list not empty!!!", whoami());
|
||||||
|
// I don't know how to recover from it. I am adding this rather
|
||||||
|
// for debugging purpose.
|
||||||
|
}
|
||||||
|
|
||||||
|
AgpsState* nextState = this;
|
||||||
|
switch (event)
|
||||||
|
{
|
||||||
|
case RSRC_SUBSCRIBE:
|
||||||
|
{
|
||||||
|
// no notification until we get RSRC_GRANTED
|
||||||
|
// but we need to add subscriber to the list
|
||||||
|
mStateMachine->addSubscriber((Subscriber*)data);
|
||||||
|
// request from connecivity service for NIF
|
||||||
|
//The if condition is added so that if the data call setup fails
|
||||||
|
//for DS State Machine, we want to retry in released state.
|
||||||
|
//for AGps State Machine, sendRsrcRequest() will always return success
|
||||||
|
if(!mStateMachine->sendRsrcRequest(GPS_REQUEST_AGPS_DATA_CONN)) {
|
||||||
|
// move the state to PENDING
|
||||||
|
nextState = mPendingState;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case RSRC_UNSUBSCRIBE:
|
||||||
|
{
|
||||||
|
// the list should really be empty, nothing to remove.
|
||||||
|
// but we might as well just tell the client it is
|
||||||
|
// unsubscribed. False tolerance, right?
|
||||||
|
Subscriber* subscriber = (Subscriber*) data;
|
||||||
|
Notification notification(subscriber, event, false);
|
||||||
|
subscriber->notifyRsrcStatus(notification);
|
||||||
|
}
|
||||||
|
// break;
|
||||||
|
case RSRC_GRANTED:
|
||||||
|
case RSRC_RELEASED:
|
||||||
|
case RSRC_DENIED:
|
||||||
|
default:
|
||||||
|
LOC_LOGW("%s: unrecognized event %d", whoami(), event);
|
||||||
|
// no state change.
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
LOC_LOGD("onRsrcEvent, old state %s, new state %s, event %d",
|
||||||
|
whoami(), nextState->whoami(), event);
|
||||||
|
return nextState;
|
||||||
|
}
|
||||||
|
|
||||||
|
// AgpsPendingState
|
||||||
|
class AgpsPendingState : public AgpsState
|
||||||
|
{
|
||||||
|
friend class AgpsStateMachine;
|
||||||
|
|
||||||
|
inline AgpsPendingState(AgpsStateMachine* stateMachine) :
|
||||||
|
AgpsState(stateMachine)
|
||||||
|
{ mPendingState = this; }
|
||||||
|
|
||||||
|
inline ~AgpsPendingState() {}
|
||||||
|
public:
|
||||||
|
virtual AgpsState* onRsrcEvent(AgpsRsrcStatus event, void* data);
|
||||||
|
inline virtual char* whoami() {return (char*)"AgpsPendingState";}
|
||||||
|
};
|
||||||
|
|
||||||
|
AgpsState* AgpsPendingState::onRsrcEvent(AgpsRsrcStatus event, void* data)
|
||||||
|
{
|
||||||
|
AgpsState* nextState = this;;
|
||||||
|
LOC_LOGD("AgpsPendingState::onRsrcEvent; event:%d\n", (int)event);
|
||||||
|
switch (event)
|
||||||
|
{
|
||||||
|
case RSRC_SUBSCRIBE:
|
||||||
|
{
|
||||||
|
// already requested for NIF resource,
|
||||||
|
// do nothing until we get RSRC_GRANTED indication
|
||||||
|
// but we need to add subscriber to the list
|
||||||
|
mStateMachine->addSubscriber((Subscriber*)data);
|
||||||
|
// no state change.
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case RSRC_UNSUBSCRIBE:
|
||||||
|
{
|
||||||
|
Subscriber* subscriber = (Subscriber*) data;
|
||||||
|
if (subscriber->waitForCloseComplete()) {
|
||||||
|
subscriber->setInactive();
|
||||||
|
} else {
|
||||||
|
// auto notify this subscriber of the unsubscribe
|
||||||
|
Notification notification(subscriber, event, true);
|
||||||
|
mStateMachine->notifySubscribers(notification);
|
||||||
|
}
|
||||||
|
|
||||||
|
// now check if there is any subscribers left
|
||||||
|
if (!mStateMachine->hasSubscribers()) {
|
||||||
|
// no more subscribers, move to RELEASED state
|
||||||
|
nextState = mReleasedState;
|
||||||
|
|
||||||
|
// tell connecivity service we can release NIF
|
||||||
|
mStateMachine->sendRsrcRequest(GPS_RELEASE_AGPS_DATA_CONN);
|
||||||
|
} else if (!mStateMachine->hasActiveSubscribers()) {
|
||||||
|
// only inactive subscribers, move to RELEASING state
|
||||||
|
nextState = mReleasingState;
|
||||||
|
|
||||||
|
// tell connecivity service we can release NIF
|
||||||
|
mStateMachine->sendRsrcRequest(GPS_RELEASE_AGPS_DATA_CONN);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case RSRC_GRANTED:
|
||||||
|
{
|
||||||
|
nextState = mAcquiredState;
|
||||||
|
Notification notification(Notification::BROADCAST_ACTIVE, event, false);
|
||||||
|
// notify all subscribers NIF resource GRANTED
|
||||||
|
// by setting false, we keep subscribers on the linked list
|
||||||
|
mStateMachine->notifySubscribers(notification);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case RSRC_RELEASED:
|
||||||
|
// no state change.
|
||||||
|
// we are expecting either GRANTED or DENIED. Handling RELEASED
|
||||||
|
// may like break our state machine in race conditions.
|
||||||
|
break;
|
||||||
|
|
||||||
|
case RSRC_DENIED:
|
||||||
|
{
|
||||||
|
nextState = mReleasedState;
|
||||||
|
Notification notification(Notification::BROADCAST_ALL, event, true);
|
||||||
|
// notify all subscribers NIF resource RELEASED or DENIED
|
||||||
|
// by setting true, we remove subscribers from the linked list
|
||||||
|
mStateMachine->notifySubscribers(notification);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
LOC_LOGE("%s: unrecognized event %d", whoami(), event);
|
||||||
|
// no state change.
|
||||||
|
}
|
||||||
|
|
||||||
|
LOC_LOGD("onRsrcEvent, old state %s, new state %s, event %d",
|
||||||
|
whoami(), nextState->whoami(), event);
|
||||||
|
return nextState;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class AgpsAcquiredState : public AgpsState
|
||||||
|
{
|
||||||
|
friend class AgpsStateMachine;
|
||||||
|
|
||||||
|
inline AgpsAcquiredState(AgpsStateMachine* stateMachine) :
|
||||||
|
AgpsState(stateMachine)
|
||||||
|
{ mAcquiredState = this; }
|
||||||
|
|
||||||
|
inline ~AgpsAcquiredState() {}
|
||||||
|
public:
|
||||||
|
virtual AgpsState* onRsrcEvent(AgpsRsrcStatus event, void* data);
|
||||||
|
inline virtual char* whoami() { return (char*)"AgpsAcquiredState"; }
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
AgpsState* AgpsAcquiredState::onRsrcEvent(AgpsRsrcStatus event, void* data)
|
||||||
|
{
|
||||||
|
AgpsState* nextState = this;
|
||||||
|
LOC_LOGD("AgpsAcquiredState::onRsrcEvent; event:%d\n", (int)event);
|
||||||
|
switch (event)
|
||||||
|
{
|
||||||
|
case RSRC_SUBSCRIBE:
|
||||||
|
{
|
||||||
|
// we already have the NIF resource, simply notify subscriber
|
||||||
|
Subscriber* subscriber = (Subscriber*) data;
|
||||||
|
// we have rsrc in hand, so grant it right away
|
||||||
|
Notification notification(subscriber, RSRC_GRANTED, false);
|
||||||
|
subscriber->notifyRsrcStatus(notification);
|
||||||
|
// add subscriber to the list
|
||||||
|
mStateMachine->addSubscriber(subscriber);
|
||||||
|
// no state change.
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case RSRC_UNSUBSCRIBE:
|
||||||
|
{
|
||||||
|
Subscriber* subscriber = (Subscriber*) data;
|
||||||
|
if (subscriber->waitForCloseComplete()) {
|
||||||
|
subscriber->setInactive();
|
||||||
|
} else {
|
||||||
|
// auto notify this subscriber of the unsubscribe
|
||||||
|
Notification notification(subscriber, event, true);
|
||||||
|
mStateMachine->notifySubscribers(notification);
|
||||||
|
}
|
||||||
|
|
||||||
|
// now check if there is any subscribers left
|
||||||
|
if (!mStateMachine->hasSubscribers()) {
|
||||||
|
// no more subscribers, move to RELEASED state
|
||||||
|
nextState = mReleasedState;
|
||||||
|
|
||||||
|
// tell connecivity service we can release NIF
|
||||||
|
mStateMachine->sendRsrcRequest(GPS_RELEASE_AGPS_DATA_CONN);
|
||||||
|
} else if (!mStateMachine->hasActiveSubscribers()) {
|
||||||
|
// only inactive subscribers, move to RELEASING state
|
||||||
|
nextState = mReleasingState;
|
||||||
|
|
||||||
|
// tell connecivity service we can release NIF
|
||||||
|
mStateMachine->sendRsrcRequest(GPS_RELEASE_AGPS_DATA_CONN);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case RSRC_GRANTED:
|
||||||
|
LOC_LOGW("%s: %d, RSRC_GRANTED already received", whoami(), event);
|
||||||
|
// no state change.
|
||||||
|
break;
|
||||||
|
|
||||||
|
case RSRC_RELEASED:
|
||||||
|
{
|
||||||
|
LOC_LOGW("%s: %d, a force rsrc release", whoami(), event);
|
||||||
|
nextState = mReleasedState;
|
||||||
|
Notification notification(Notification::BROADCAST_ALL, event, true);
|
||||||
|
// by setting true, we remove subscribers from the linked list
|
||||||
|
mStateMachine->notifySubscribers(notification);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case RSRC_DENIED:
|
||||||
|
// no state change.
|
||||||
|
// we are expecting RELEASED. Handling DENIED
|
||||||
|
// may like break our state machine in race conditions.
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
LOC_LOGE("%s: unrecognized event %d", whoami(), event);
|
||||||
|
// no state change.
|
||||||
|
}
|
||||||
|
|
||||||
|
LOC_LOGD("onRsrcEvent, old state %s, new state %s, event %d",
|
||||||
|
whoami(), nextState->whoami(), event);
|
||||||
|
return nextState;
|
||||||
|
}
|
||||||
|
|
||||||
|
// AgpsPendingState
|
||||||
|
class AgpsReleasingState : public AgpsState
|
||||||
|
{
|
||||||
|
friend class AgpsStateMachine;
|
||||||
|
|
||||||
|
inline AgpsReleasingState(AgpsStateMachine* stateMachine) :
|
||||||
|
AgpsState(stateMachine)
|
||||||
|
{ mReleasingState = this; }
|
||||||
|
|
||||||
|
inline ~AgpsReleasingState() {}
|
||||||
|
public:
|
||||||
|
virtual AgpsState* onRsrcEvent(AgpsRsrcStatus event, void* data);
|
||||||
|
inline virtual char* whoami() {return (char*)"AgpsReleasingState";}
|
||||||
|
};
|
||||||
|
|
||||||
|
AgpsState* AgpsReleasingState::onRsrcEvent(AgpsRsrcStatus event, void* data)
|
||||||
|
{
|
||||||
|
AgpsState* nextState = this;;
|
||||||
|
LOC_LOGD("AgpsReleasingState::onRsrcEvent; event:%d\n", (int)event);
|
||||||
|
|
||||||
|
switch (event)
|
||||||
|
{
|
||||||
|
case RSRC_SUBSCRIBE:
|
||||||
|
{
|
||||||
|
// already requested for NIF resource,
|
||||||
|
// do nothing until we get RSRC_GRANTED indication
|
||||||
|
// but we need to add subscriber to the list
|
||||||
|
mStateMachine->addSubscriber((Subscriber*)data);
|
||||||
|
// no state change.
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case RSRC_UNSUBSCRIBE:
|
||||||
|
{
|
||||||
|
Subscriber* subscriber = (Subscriber*) data;
|
||||||
|
if (subscriber->waitForCloseComplete()) {
|
||||||
|
subscriber->setInactive();
|
||||||
|
} else {
|
||||||
|
// auto notify this subscriber of the unsubscribe
|
||||||
|
Notification notification(subscriber, event, true);
|
||||||
|
mStateMachine->notifySubscribers(notification);
|
||||||
|
}
|
||||||
|
|
||||||
|
// now check if there is any subscribers left
|
||||||
|
if (!mStateMachine->hasSubscribers()) {
|
||||||
|
// no more subscribers, move to RELEASED state
|
||||||
|
nextState = mReleasedState;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case RSRC_DENIED:
|
||||||
|
// A race condition subscriber unsubscribes before AFW denies resource.
|
||||||
|
case RSRC_RELEASED:
|
||||||
|
{
|
||||||
|
nextState = mAcquiredState;
|
||||||
|
Notification notification(Notification::BROADCAST_INACTIVE, event, true);
|
||||||
|
// notify all subscribers that are active NIF resource RELEASE
|
||||||
|
// by setting false, we keep subscribers on the linked list
|
||||||
|
mStateMachine->notifySubscribers(notification);
|
||||||
|
|
||||||
|
if (mStateMachine->hasActiveSubscribers()) {
|
||||||
|
nextState = mPendingState;
|
||||||
|
// request from connecivity service for NIF
|
||||||
|
mStateMachine->sendRsrcRequest(GPS_REQUEST_AGPS_DATA_CONN);
|
||||||
|
} else {
|
||||||
|
nextState = mReleasedState;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case RSRC_GRANTED:
|
||||||
|
default:
|
||||||
|
LOC_LOGE("%s: unrecognized event %d", whoami(), event);
|
||||||
|
// no state change.
|
||||||
|
}
|
||||||
|
|
||||||
|
LOC_LOGD("onRsrcEvent, old state %s, new state %s, event %d",
|
||||||
|
whoami(), nextState->whoami(), event);
|
||||||
|
return nextState;
|
||||||
|
}
|
||||||
|
//======================================================================
|
||||||
|
//Servicer
|
||||||
|
//======================================================================
|
||||||
|
Servicer* Servicer :: getServicer(servicerType type, void *cb_func)
|
||||||
|
{
|
||||||
|
LOC_LOGD(" Enter getServicer type:%d\n", (int)type);
|
||||||
|
switch(type) {
|
||||||
|
case servicerTypeNoCbParam:
|
||||||
|
return (new Servicer(cb_func));
|
||||||
|
case servicerTypeExt:
|
||||||
|
return (new ExtServicer(cb_func));
|
||||||
|
case servicerTypeAgps:
|
||||||
|
return (new AGpsServicer(cb_func));
|
||||||
|
default:
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int Servicer :: requestRsrc(void *cb_data)
|
||||||
|
{
|
||||||
|
callback();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int ExtServicer :: requestRsrc(void *cb_data)
|
||||||
|
{
|
||||||
|
int ret=-1;
|
||||||
|
LOC_LOGD("Enter ExtServicer :: requestRsrc\n");
|
||||||
|
ret = callbackExt(cb_data);
|
||||||
|
LOC_LOGD("Exit ExtServicer :: requestRsrc\n");
|
||||||
|
return(ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
int AGpsServicer :: requestRsrc(void *cb_data)
|
||||||
|
{
|
||||||
|
callbackAGps((AGpsStatus *)cb_data);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
//======================================================================
|
||||||
|
// AgpsStateMachine
|
||||||
|
//======================================================================
|
||||||
|
|
||||||
|
AgpsStateMachine::AgpsStateMachine(servicerType servType,
|
||||||
|
void *cb_func,
|
||||||
|
AGpsExtType type,
|
||||||
|
bool enforceSingleSubscriber) :
|
||||||
|
mStatePtr(new AgpsReleasedState(this)),mType(type),
|
||||||
|
mAPN(NULL),
|
||||||
|
mAPNLen(0),
|
||||||
|
mBearer(AGPS_APN_BEARER_INVALID),
|
||||||
|
mEnforceSingleSubscriber(enforceSingleSubscriber),
|
||||||
|
mServicer(Servicer :: getServicer(servType, (void *)cb_func))
|
||||||
|
{
|
||||||
|
linked_list_init(&mSubscribers);
|
||||||
|
|
||||||
|
// setting up mReleasedState
|
||||||
|
mStatePtr->mPendingState = new AgpsPendingState(this);
|
||||||
|
mStatePtr->mAcquiredState = new AgpsAcquiredState(this);
|
||||||
|
mStatePtr->mReleasingState = new AgpsReleasingState(this);
|
||||||
|
|
||||||
|
// setting up mAcquiredState
|
||||||
|
mStatePtr->mAcquiredState->mReleasedState = mStatePtr;
|
||||||
|
mStatePtr->mAcquiredState->mPendingState = mStatePtr->mPendingState;
|
||||||
|
mStatePtr->mAcquiredState->mReleasingState = mStatePtr->mReleasingState;
|
||||||
|
|
||||||
|
// setting up mPendingState
|
||||||
|
mStatePtr->mPendingState->mAcquiredState = mStatePtr->mAcquiredState;
|
||||||
|
mStatePtr->mPendingState->mReleasedState = mStatePtr;
|
||||||
|
mStatePtr->mPendingState->mReleasingState = mStatePtr->mReleasingState;
|
||||||
|
|
||||||
|
// setting up mReleasingState
|
||||||
|
mStatePtr->mReleasingState->mReleasedState = mStatePtr;
|
||||||
|
mStatePtr->mReleasingState->mPendingState = mStatePtr->mPendingState;
|
||||||
|
mStatePtr->mReleasingState->mAcquiredState = mStatePtr->mAcquiredState;
|
||||||
|
}
|
||||||
|
|
||||||
|
AgpsStateMachine::~AgpsStateMachine()
|
||||||
|
{
|
||||||
|
dropAllSubscribers();
|
||||||
|
|
||||||
|
// free the 3 states. We must read out all 3 pointers first.
|
||||||
|
// Otherwise we run the risk of getting pointers from already
|
||||||
|
// freed memory.
|
||||||
|
AgpsState* acquiredState = mStatePtr->mAcquiredState;
|
||||||
|
AgpsState* releasedState = mStatePtr->mReleasedState;
|
||||||
|
AgpsState* pendindState = mStatePtr->mPendingState;
|
||||||
|
AgpsState* releasingState = mStatePtr->mReleasingState;
|
||||||
|
|
||||||
|
delete acquiredState;
|
||||||
|
delete releasedState;
|
||||||
|
delete pendindState;
|
||||||
|
delete releasingState;
|
||||||
|
delete mServicer;
|
||||||
|
linked_list_destroy(&mSubscribers);
|
||||||
|
|
||||||
|
if (NULL != mAPN) {
|
||||||
|
delete[] mAPN;
|
||||||
|
mAPN = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void AgpsStateMachine::setAPN(const char* apn, unsigned int len)
|
||||||
|
{
|
||||||
|
if (NULL != mAPN) {
|
||||||
|
delete mAPN;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (NULL != apn) {
|
||||||
|
mAPN = new char[len+1];
|
||||||
|
memcpy(mAPN, apn, len);
|
||||||
|
mAPN[len] = NULL;
|
||||||
|
|
||||||
|
mAPNLen = len;
|
||||||
|
} else {
|
||||||
|
mAPN = NULL;
|
||||||
|
mAPNLen = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void AgpsStateMachine::onRsrcEvent(AgpsRsrcStatus event)
|
||||||
|
{
|
||||||
|
switch (event)
|
||||||
|
{
|
||||||
|
case RSRC_GRANTED:
|
||||||
|
case RSRC_RELEASED:
|
||||||
|
case RSRC_DENIED:
|
||||||
|
mStatePtr = mStatePtr->onRsrcEvent(event, NULL);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
LOC_LOGW("AgpsStateMachine: unrecognized event %d", event);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void AgpsStateMachine::notifySubscribers(Notification& notification) const
|
||||||
|
{
|
||||||
|
if (notification.postNotifyDelete) {
|
||||||
|
// just any non NULL value to get started
|
||||||
|
Subscriber* s = (Subscriber*)~0;
|
||||||
|
while (NULL != s) {
|
||||||
|
s = NULL;
|
||||||
|
// if the last param sets to true, _search will delete
|
||||||
|
// the node from the list for us. But the problem is
|
||||||
|
// once that is done, _search returns, leaving the
|
||||||
|
// rest of the list unprocessed. So we need a loop.
|
||||||
|
linked_list_search(mSubscribers, (void**)&s, notifySubscriber,
|
||||||
|
(void*)¬ification, true);
|
||||||
|
delete s;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// no loop needed if it the last param sets to false, which
|
||||||
|
// mean nothing gets deleted from the list.
|
||||||
|
linked_list_search(mSubscribers, NULL, notifySubscriber,
|
||||||
|
(void*)¬ification, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void AgpsStateMachine::addSubscriber(Subscriber* subscriber) const
|
||||||
|
{
|
||||||
|
Subscriber* s = NULL;
|
||||||
|
Notification notification((const Subscriber*)subscriber);
|
||||||
|
linked_list_search(mSubscribers, (void**)&s,
|
||||||
|
hasSubscriber, (void*)¬ification, false);
|
||||||
|
|
||||||
|
if (NULL == s) {
|
||||||
|
linked_list_add(mSubscribers, subscriber->clone(), deleteObj);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int AgpsStateMachine::sendRsrcRequest(AGpsStatusValue action) const
|
||||||
|
{
|
||||||
|
Subscriber* s = NULL;
|
||||||
|
Notification notification(Notification::BROADCAST_ACTIVE);
|
||||||
|
linked_list_search(mSubscribers, (void**)&s, hasSubscriber,
|
||||||
|
(void*)¬ification, false);
|
||||||
|
|
||||||
|
if ((NULL == s) == (GPS_RELEASE_AGPS_DATA_CONN == action)) {
|
||||||
|
AGpsExtStatus nifRequest;
|
||||||
|
nifRequest.size = sizeof(nifRequest);
|
||||||
|
nifRequest.type = mType;
|
||||||
|
nifRequest.status = action;
|
||||||
|
|
||||||
|
if (s == NULL) {
|
||||||
|
nifRequest.ipv4_addr = INADDR_NONE;
|
||||||
|
nifRequest.ipv6_addr[0] = 0;
|
||||||
|
nifRequest.ssid[0] = '\0';
|
||||||
|
nifRequest.password[0] = '\0';
|
||||||
|
} else {
|
||||||
|
s->setIPAddresses(nifRequest.ipv4_addr, (char*)nifRequest.ipv6_addr);
|
||||||
|
s->setWifiInfo(nifRequest.ssid, nifRequest.password);
|
||||||
|
}
|
||||||
|
|
||||||
|
CALLBACK_LOG_CALLFLOW("agps_cb", %s, loc_get_agps_status_name(action));
|
||||||
|
mServicer->requestRsrc((void *)&nifRequest);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void AgpsStateMachine::subscribeRsrc(Subscriber *subscriber)
|
||||||
|
{
|
||||||
|
if (mEnforceSingleSubscriber && hasSubscribers()) {
|
||||||
|
Notification notification(Notification::BROADCAST_ALL, RSRC_DENIED, true);
|
||||||
|
notifySubscriber(¬ification, subscriber);
|
||||||
|
} else {
|
||||||
|
mStatePtr = mStatePtr->onRsrcEvent(RSRC_SUBSCRIBE, (void*)subscriber);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool AgpsStateMachine::unsubscribeRsrc(Subscriber *subscriber)
|
||||||
|
{
|
||||||
|
Subscriber* s = NULL;
|
||||||
|
Notification notification((const Subscriber*)subscriber);
|
||||||
|
linked_list_search(mSubscribers, (void**)&s,
|
||||||
|
hasSubscriber, (void*)¬ification, false);
|
||||||
|
|
||||||
|
if (NULL != s) {
|
||||||
|
mStatePtr = mStatePtr->onRsrcEvent(RSRC_UNSUBSCRIBE, (void*)s);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool AgpsStateMachine::hasActiveSubscribers() const
|
||||||
|
{
|
||||||
|
Subscriber* s = NULL;
|
||||||
|
Notification notification(Notification::BROADCAST_ACTIVE);
|
||||||
|
linked_list_search(mSubscribers, (void**)&s,
|
||||||
|
hasSubscriber, (void*)¬ification, false);
|
||||||
|
return NULL != s;
|
||||||
|
}
|
||||||
|
|
||||||
|
//======================================================================
|
||||||
|
// DSStateMachine
|
||||||
|
//======================================================================
|
||||||
|
void delay_callback(void *callbackData, int result)
|
||||||
|
{
|
||||||
|
if(callbackData) {
|
||||||
|
DSStateMachine *DSSMInstance = (DSStateMachine *)callbackData;
|
||||||
|
DSSMInstance->retryCallback();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
LOC_LOGE(" NULL argument received. Failing.\n");
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
err:
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
DSStateMachine :: DSStateMachine(servicerType type, void *cb_func,
|
||||||
|
LocEngAdapter* adapterHandle):
|
||||||
|
AgpsStateMachine(type, cb_func, AGPS_TYPE_INVALID,false),
|
||||||
|
mLocAdapter(adapterHandle)
|
||||||
|
{
|
||||||
|
LOC_LOGD("%s:%d]: New DSStateMachine\n", __func__, __LINE__);
|
||||||
|
mRetries = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void DSStateMachine :: retryCallback(void)
|
||||||
|
{
|
||||||
|
DSSubscriber *subscriber = NULL;
|
||||||
|
Notification notification(Notification::BROADCAST_ACTIVE);
|
||||||
|
linked_list_search(mSubscribers, (void**)&subscriber, hasSubscriber,
|
||||||
|
(void*)¬ification, false);
|
||||||
|
if(subscriber)
|
||||||
|
mLocAdapter->requestSuplES(subscriber->ID);
|
||||||
|
else
|
||||||
|
LOC_LOGE("DSStateMachine :: retryCallback: No subscriber found." \
|
||||||
|
"Cannot retry data call\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
int DSStateMachine :: sendRsrcRequest(AGpsStatusValue action) const
|
||||||
|
{
|
||||||
|
DSSubscriber* s = NULL;
|
||||||
|
dsCbData cbData;
|
||||||
|
int ret=-1;
|
||||||
|
int connHandle=-1;
|
||||||
|
LOC_LOGD("Enter DSStateMachine :: sendRsrcRequest\n");
|
||||||
|
Notification notification(Notification::BROADCAST_ACTIVE);
|
||||||
|
linked_list_search(mSubscribers, (void**)&s, hasSubscriber,
|
||||||
|
(void*)¬ification, false);
|
||||||
|
if(s) {
|
||||||
|
connHandle = s->ID;
|
||||||
|
LOC_LOGD("DSStateMachine :: sendRsrcRequest - subscriber found\n");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
LOC_LOGD("DSStateMachine :: sendRsrcRequest - No subscriber found\n");
|
||||||
|
|
||||||
|
cbData.action = action;
|
||||||
|
cbData.mAdapter = mLocAdapter;
|
||||||
|
ret = mServicer->requestRsrc((void *)&cbData);
|
||||||
|
//Only the request to start data call returns a success/failure
|
||||||
|
//The request to stop data call will always succeed
|
||||||
|
//Hence, the below block will only be executed when the
|
||||||
|
//request to start the data call fails
|
||||||
|
switch(ret) {
|
||||||
|
case LOC_API_ADAPTER_ERR_ENGINE_BUSY:
|
||||||
|
LOC_LOGD("DSStateMachine :: sendRsrcRequest - Failure returned: %d\n",ret);
|
||||||
|
((DSStateMachine *)this)->incRetries();
|
||||||
|
if(mRetries > MAX_START_DATA_CALL_RETRIES) {
|
||||||
|
LOC_LOGE(" Failed to start Data call. Fallback to normal ATL SUPL\n");
|
||||||
|
informStatus(RSRC_DENIED, connHandle);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if(loc_timer_start(DATA_CALL_RETRY_DELAY_MSEC, delay_callback, (void *)this)) {
|
||||||
|
LOC_LOGE("Error: Could not start delay thread\n");
|
||||||
|
ret = -1;
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case LOC_API_ADAPTER_ERR_UNSUPPORTED:
|
||||||
|
LOC_LOGE("No profile found for emergency call. Fallback to normal SUPL ATL\n");
|
||||||
|
informStatus(RSRC_DENIED, connHandle);
|
||||||
|
break;
|
||||||
|
case LOC_API_ADAPTER_ERR_SUCCESS:
|
||||||
|
LOC_LOGD("%s:%d]: Request to start data call sent\n", __func__, __LINE__);
|
||||||
|
break;
|
||||||
|
case -1:
|
||||||
|
//One of the ways this case can be encountered is if the callback function
|
||||||
|
//receives a null argument, it just exits with -1 error
|
||||||
|
LOC_LOGE("Error: Something went wrong somewhere. Falling back to normal SUPL ATL\n");
|
||||||
|
informStatus(RSRC_DENIED, connHandle);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
LOC_LOGE("%s:%d]: Unrecognized return value\n", __func__, __LINE__);
|
||||||
|
}
|
||||||
|
err:
|
||||||
|
LOC_LOGD("EXIT DSStateMachine :: sendRsrcRequest; ret = %d\n", ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
void DSStateMachine :: onRsrcEvent(AgpsRsrcStatus event)
|
||||||
|
{
|
||||||
|
void* currState = (void *)mStatePtr;
|
||||||
|
LOC_LOGD("Enter DSStateMachine :: onRsrcEvent. event = %d\n", (int)event);
|
||||||
|
switch (event)
|
||||||
|
{
|
||||||
|
case RSRC_GRANTED:
|
||||||
|
LOC_LOGD("DSStateMachine :: onRsrcEvent RSRC_GRANTED\n");
|
||||||
|
mStatePtr = mStatePtr->onRsrcEvent(event, NULL);
|
||||||
|
break;
|
||||||
|
case RSRC_RELEASED:
|
||||||
|
LOC_LOGD("DSStateMachine :: onRsrcEvent RSRC_RELEASED\n");
|
||||||
|
mStatePtr = mStatePtr->onRsrcEvent(event, NULL);
|
||||||
|
//To handle the case where we get a RSRC_RELEASED in
|
||||||
|
//pending state, we translate that to a RSRC_DENIED state
|
||||||
|
//since the callback from DSI is either RSRC_GRANTED or RSRC_RELEASED
|
||||||
|
//for when the call is connected or disconnected respectively.
|
||||||
|
if((void *)mStatePtr != currState)
|
||||||
|
break;
|
||||||
|
else {
|
||||||
|
event = RSRC_DENIED;
|
||||||
|
LOC_LOGE(" Switching event to RSRC_DENIED\n");
|
||||||
|
}
|
||||||
|
case RSRC_DENIED:
|
||||||
|
mStatePtr = mStatePtr->onRsrcEvent(event, NULL);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
LOC_LOGW("AgpsStateMachine: unrecognized event %d", event);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
LOC_LOGD("Exit DSStateMachine :: onRsrcEvent. event = %d\n", (int)event);
|
||||||
|
}
|
||||||
|
|
||||||
|
void DSStateMachine :: informStatus(AgpsRsrcStatus status, int ID) const
|
||||||
|
{
|
||||||
|
LOC_LOGD("DSStateMachine :: informStatus. Status=%d\n",(int)status);
|
||||||
|
switch(status) {
|
||||||
|
case RSRC_UNSUBSCRIBE:
|
||||||
|
mLocAdapter->atlCloseStatus(ID, 1);
|
||||||
|
break;
|
||||||
|
case RSRC_RELEASED:
|
||||||
|
mLocAdapter->closeDataCall();
|
||||||
|
break;
|
||||||
|
case RSRC_DENIED:
|
||||||
|
((DSStateMachine *)this)->mRetries = 0;
|
||||||
|
mLocAdapter->requestATL(ID, AGPS_TYPE_SUPL);
|
||||||
|
break;
|
||||||
|
case RSRC_GRANTED:
|
||||||
|
mLocAdapter->atlOpenStatus(ID, 1,
|
||||||
|
NULL,
|
||||||
|
AGPS_APN_BEARER_INVALID,
|
||||||
|
AGPS_TYPE_INVALID);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
LOC_LOGW("DSStateMachine :: informStatus - unknown status");
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
419
gps/loc_api/libloc_api_50001/loc_eng_agps.h
Executable file
419
gps/loc_api/libloc_api_50001/loc_eng_agps.h
Executable file
@ -0,0 +1,419 @@
|
|||||||
|
/* Copyright (c) 2011-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_ENG_AGPS_H__
|
||||||
|
#define __LOC_ENG_AGPS_H__
|
||||||
|
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <arpa/inet.h>
|
||||||
|
#include "hardware/gps.h"
|
||||||
|
#include <gps_extended.h>
|
||||||
|
#include <loc_core_log.h>
|
||||||
|
#include <linked_list.h>
|
||||||
|
#include <loc_timer.h>
|
||||||
|
#include <LocEngAdapter.h>
|
||||||
|
|
||||||
|
// forward declaration
|
||||||
|
class AgpsStateMachine;
|
||||||
|
class Subscriber;
|
||||||
|
|
||||||
|
// NIF resource events
|
||||||
|
typedef enum {
|
||||||
|
RSRC_SUBSCRIBE,
|
||||||
|
RSRC_UNSUBSCRIBE,
|
||||||
|
RSRC_GRANTED,
|
||||||
|
RSRC_RELEASED,
|
||||||
|
RSRC_DENIED,
|
||||||
|
RSRC_STATUS_MAX
|
||||||
|
} AgpsRsrcStatus;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
servicerTypeNoCbParam,
|
||||||
|
servicerTypeAgps,
|
||||||
|
servicerTypeExt
|
||||||
|
}servicerType;
|
||||||
|
|
||||||
|
//DS Callback struct
|
||||||
|
typedef struct {
|
||||||
|
LocEngAdapter *mAdapter;
|
||||||
|
AGpsStatusValue action;
|
||||||
|
}dsCbData;
|
||||||
|
|
||||||
|
// information bundle for subscribers
|
||||||
|
struct Notification {
|
||||||
|
// goes to every subscriber
|
||||||
|
static const int BROADCAST_ALL;
|
||||||
|
// goes to every ACTIVE subscriber
|
||||||
|
static const int BROADCAST_ACTIVE;
|
||||||
|
// goes to every INACTIVE subscriber
|
||||||
|
static const int BROADCAST_INACTIVE;
|
||||||
|
|
||||||
|
// go to a specific subscriber
|
||||||
|
const Subscriber* rcver;
|
||||||
|
// broadcast
|
||||||
|
const int groupID;
|
||||||
|
// the new resource status event
|
||||||
|
const AgpsRsrcStatus rsrcStatus;
|
||||||
|
// should the subscriber be deleted after the notification
|
||||||
|
const bool postNotifyDelete;
|
||||||
|
|
||||||
|
// convenient constructor
|
||||||
|
inline Notification(const int broadcast,
|
||||||
|
const AgpsRsrcStatus status,
|
||||||
|
const bool deleteAfterwards) :
|
||||||
|
rcver(NULL), groupID(broadcast), rsrcStatus(status),
|
||||||
|
postNotifyDelete(deleteAfterwards) {}
|
||||||
|
|
||||||
|
// convenient constructor
|
||||||
|
inline Notification(const Subscriber* subscriber,
|
||||||
|
const AgpsRsrcStatus status,
|
||||||
|
const bool deleteAfterwards) :
|
||||||
|
rcver(subscriber), groupID(-1), rsrcStatus(status),
|
||||||
|
postNotifyDelete(deleteAfterwards) {}
|
||||||
|
|
||||||
|
// convenient constructor
|
||||||
|
inline Notification(const int broadcast) :
|
||||||
|
rcver(NULL), groupID(broadcast), rsrcStatus(RSRC_STATUS_MAX),
|
||||||
|
postNotifyDelete(false) {}
|
||||||
|
|
||||||
|
// convenient constructor
|
||||||
|
inline Notification(const Subscriber* subscriber) :
|
||||||
|
rcver(subscriber), groupID(-1), rsrcStatus(RSRC_STATUS_MAX),
|
||||||
|
postNotifyDelete(false) {}
|
||||||
|
};
|
||||||
|
|
||||||
|
class AgpsState {
|
||||||
|
// allows AgpsStateMachine to access private data
|
||||||
|
// no class members are public. We don't want
|
||||||
|
// anyone but state machine to use state.
|
||||||
|
friend class AgpsStateMachine;
|
||||||
|
friend class DSStateMachine;
|
||||||
|
// state transitions are done here.
|
||||||
|
// Each state implements its own transitions (of course).
|
||||||
|
inline virtual AgpsState* onRsrcEvent(AgpsRsrcStatus event, void* data) = 0;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
// handle back to state machine
|
||||||
|
const AgpsStateMachine* mStateMachine;
|
||||||
|
// each state has pointers to all 3 states
|
||||||
|
// one of which is to itself.
|
||||||
|
AgpsState* mReleasedState;
|
||||||
|
AgpsState* mAcquiredState;
|
||||||
|
AgpsState* mPendingState;
|
||||||
|
AgpsState* mReleasingState;
|
||||||
|
|
||||||
|
inline AgpsState(const AgpsStateMachine *stateMachine) :
|
||||||
|
mStateMachine(stateMachine),
|
||||||
|
mReleasedState(NULL),
|
||||||
|
mAcquiredState(NULL),
|
||||||
|
mPendingState(NULL),
|
||||||
|
mReleasingState(NULL) {}
|
||||||
|
virtual ~AgpsState() {}
|
||||||
|
|
||||||
|
public:
|
||||||
|
// for logging purpose
|
||||||
|
inline virtual char* whoami() = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
class Servicer {
|
||||||
|
void (*callback)(void);
|
||||||
|
public:
|
||||||
|
static Servicer* getServicer(servicerType type, void *cb_func);
|
||||||
|
virtual int requestRsrc(void *cb_data);
|
||||||
|
Servicer() {}
|
||||||
|
Servicer(void *cb_func)
|
||||||
|
{ callback = (void(*)(void))(cb_func); }
|
||||||
|
virtual ~Servicer(){}
|
||||||
|
inline virtual char *whoami() {return (char*)"Servicer";}
|
||||||
|
};
|
||||||
|
|
||||||
|
class ExtServicer : public Servicer {
|
||||||
|
int (*callbackExt)(void *cb_data);
|
||||||
|
public:
|
||||||
|
int requestRsrc(void *cb_data);
|
||||||
|
ExtServicer() {}
|
||||||
|
ExtServicer(void *cb_func)
|
||||||
|
{ callbackExt = (int(*)(void *))(cb_func); }
|
||||||
|
virtual ~ExtServicer(){}
|
||||||
|
inline virtual char *whoami() {return (char*)"ExtServicer";}
|
||||||
|
};
|
||||||
|
|
||||||
|
class AGpsServicer : public Servicer {
|
||||||
|
void (*callbackAGps)(AGpsStatus* status);
|
||||||
|
public:
|
||||||
|
int requestRsrc(void *cb_data);
|
||||||
|
AGpsServicer() {}
|
||||||
|
AGpsServicer(void *cb_func)
|
||||||
|
{ callbackAGps = (void(*)(AGpsStatus *))(cb_func); }
|
||||||
|
virtual ~AGpsServicer(){}
|
||||||
|
inline virtual char *whoami() {return (char*)"AGpsServicer";}
|
||||||
|
};
|
||||||
|
|
||||||
|
class AgpsStateMachine {
|
||||||
|
protected:
|
||||||
|
// a linked list of subscribers.
|
||||||
|
void* mSubscribers;
|
||||||
|
//handle to whoever provides the service
|
||||||
|
Servicer *mServicer;
|
||||||
|
// allows AgpsState to access private data
|
||||||
|
// each state is really internal data to the
|
||||||
|
// state machine, so it should be able to
|
||||||
|
// access anything within the state machine.
|
||||||
|
friend class AgpsState;
|
||||||
|
// pointer to the current state.
|
||||||
|
AgpsState* mStatePtr;
|
||||||
|
private:
|
||||||
|
// NIF type: AGNSS or INTERNET.
|
||||||
|
const AGpsExtType mType;
|
||||||
|
// apn to the NIF. Each state machine tracks
|
||||||
|
// resource state of a particular NIF. For each
|
||||||
|
// NIF, there is also an active APN.
|
||||||
|
char* mAPN;
|
||||||
|
// for convenience, we don't do strlen each time.
|
||||||
|
unsigned int mAPNLen;
|
||||||
|
// bear
|
||||||
|
ApnIpType mBearer;
|
||||||
|
// ipv4 address for routing
|
||||||
|
bool mEnforceSingleSubscriber;
|
||||||
|
|
||||||
|
public:
|
||||||
|
AgpsStateMachine(servicerType servType, void *cb_func,
|
||||||
|
AGpsExtType type, bool enforceSingleSubscriber);
|
||||||
|
virtual ~AgpsStateMachine();
|
||||||
|
|
||||||
|
// self explanatory methods below
|
||||||
|
void setAPN(const char* apn, unsigned int len);
|
||||||
|
inline const char* getAPN() const { return (const char*)mAPN; }
|
||||||
|
inline void setBearer(ApnIpType bearer) { mBearer = bearer; }
|
||||||
|
inline ApnIpType getBearer() const { return mBearer; }
|
||||||
|
inline AGpsExtType getType() const { return (AGpsExtType)mType; }
|
||||||
|
|
||||||
|
// someone, a ATL client or BIT, is asking for NIF
|
||||||
|
void subscribeRsrc(Subscriber *subscriber);
|
||||||
|
|
||||||
|
// someone, a ATL client or BIT, is done with NIF
|
||||||
|
bool unsubscribeRsrc(Subscriber *subscriber);
|
||||||
|
|
||||||
|
// add a subscriber in the linked list, if not already there.
|
||||||
|
void addSubscriber(Subscriber* subscriber) const;
|
||||||
|
|
||||||
|
virtual void onRsrcEvent(AgpsRsrcStatus event);
|
||||||
|
|
||||||
|
// put the data together and send the FW
|
||||||
|
virtual int sendRsrcRequest(AGpsStatusValue action) const;
|
||||||
|
|
||||||
|
//if list is empty, linked_list_empty returns 1
|
||||||
|
//else if list is not empty, returns 0
|
||||||
|
//so hasSubscribers() returns 1 if list is not empty
|
||||||
|
//and returns 0 if list is empty
|
||||||
|
inline bool hasSubscribers() const
|
||||||
|
{ return !linked_list_empty(mSubscribers); }
|
||||||
|
|
||||||
|
bool hasActiveSubscribers() const;
|
||||||
|
|
||||||
|
inline void dropAllSubscribers() const
|
||||||
|
{ linked_list_flush(mSubscribers); }
|
||||||
|
|
||||||
|
// private. Only a state gets to call this.
|
||||||
|
void notifySubscribers(Notification& notification) const;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
class DSStateMachine : public AgpsStateMachine {
|
||||||
|
static const unsigned char MAX_START_DATA_CALL_RETRIES;
|
||||||
|
static const unsigned int DATA_CALL_RETRY_DELAY_MSEC;
|
||||||
|
LocEngAdapter* mLocAdapter;
|
||||||
|
unsigned char mRetries;
|
||||||
|
public:
|
||||||
|
DSStateMachine(servicerType type,
|
||||||
|
void *cb_func,
|
||||||
|
LocEngAdapter* adapterHandle);
|
||||||
|
int sendRsrcRequest(AGpsStatusValue action) const;
|
||||||
|
void onRsrcEvent(AgpsRsrcStatus event);
|
||||||
|
void retryCallback();
|
||||||
|
void informStatus(AgpsRsrcStatus status, int ID) const;
|
||||||
|
inline void incRetries() {mRetries++;}
|
||||||
|
inline virtual char *whoami() {return (char*)"DSStateMachine";}
|
||||||
|
};
|
||||||
|
|
||||||
|
// each subscriber is a AGPS client. In the case of ATL, there could be
|
||||||
|
// multiple clients from modem. In the case of BIT, there is only one
|
||||||
|
// cilent from BIT daemon.
|
||||||
|
struct Subscriber {
|
||||||
|
const uint32_t ID;
|
||||||
|
const AgpsStateMachine* mStateMachine;
|
||||||
|
inline Subscriber(const int id,
|
||||||
|
const AgpsStateMachine* stateMachine) :
|
||||||
|
ID(id), mStateMachine(stateMachine) {}
|
||||||
|
inline virtual ~Subscriber() {}
|
||||||
|
|
||||||
|
virtual void setIPAddresses(uint32_t &v4, char* v6) = 0;
|
||||||
|
inline virtual void setWifiInfo(char* ssid, char* password)
|
||||||
|
{ ssid[0] = 0; password[0] = 0; }
|
||||||
|
|
||||||
|
inline virtual bool equals(const Subscriber *s) const
|
||||||
|
{ return ID == s->ID; }
|
||||||
|
|
||||||
|
// notifies a subscriber a new NIF resource status, usually
|
||||||
|
// either GRANTE, DENIED, or RELEASED
|
||||||
|
virtual bool notifyRsrcStatus(Notification ¬ification) = 0;
|
||||||
|
|
||||||
|
virtual bool waitForCloseComplete() { return false; }
|
||||||
|
virtual void setInactive() {}
|
||||||
|
virtual bool isInactive() { return false; }
|
||||||
|
|
||||||
|
virtual Subscriber* clone() = 0;
|
||||||
|
// checks if this notification is for me, i.e.
|
||||||
|
// either has my id, or has a broadcast id.
|
||||||
|
bool forMe(Notification ¬ification);
|
||||||
|
};
|
||||||
|
|
||||||
|
// BITSubscriber, created with requests from BIT daemon
|
||||||
|
struct BITSubscriber : public Subscriber {
|
||||||
|
char mIPv6Addr[16];
|
||||||
|
|
||||||
|
inline BITSubscriber(const AgpsStateMachine* stateMachine,
|
||||||
|
unsigned int ipv4, char* ipv6) :
|
||||||
|
Subscriber(ipv4, stateMachine)
|
||||||
|
{
|
||||||
|
if (NULL == ipv6) {
|
||||||
|
mIPv6Addr[0] = 0;
|
||||||
|
} else {
|
||||||
|
memcpy(mIPv6Addr, ipv6, sizeof(mIPv6Addr));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual bool notifyRsrcStatus(Notification ¬ification);
|
||||||
|
|
||||||
|
inline virtual void setIPAddresses(uint32_t &v4, char* v6)
|
||||||
|
{ v4 = ID; memcpy(v6, mIPv6Addr, sizeof(mIPv6Addr)); }
|
||||||
|
|
||||||
|
virtual Subscriber* clone()
|
||||||
|
{
|
||||||
|
return new BITSubscriber(mStateMachine, ID, mIPv6Addr);
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual bool equals(const Subscriber *s) const;
|
||||||
|
inline virtual ~BITSubscriber(){}
|
||||||
|
};
|
||||||
|
|
||||||
|
// ATLSubscriber, created with requests from ATL
|
||||||
|
struct ATLSubscriber : public Subscriber {
|
||||||
|
const LocEngAdapter* mLocAdapter;
|
||||||
|
const bool mBackwardCompatibleMode;
|
||||||
|
inline ATLSubscriber(const int id,
|
||||||
|
const AgpsStateMachine* stateMachine,
|
||||||
|
const LocEngAdapter* adapter,
|
||||||
|
const bool compatibleMode) :
|
||||||
|
Subscriber(id, stateMachine), mLocAdapter(adapter),
|
||||||
|
mBackwardCompatibleMode(compatibleMode){}
|
||||||
|
virtual bool notifyRsrcStatus(Notification ¬ification);
|
||||||
|
|
||||||
|
inline virtual void setIPAddresses(uint32_t &v4, char* v6)
|
||||||
|
{ v4 = INADDR_NONE; v6[0] = 0; }
|
||||||
|
|
||||||
|
inline virtual Subscriber* clone()
|
||||||
|
{
|
||||||
|
return new ATLSubscriber(ID, mStateMachine, mLocAdapter,
|
||||||
|
mBackwardCompatibleMode);
|
||||||
|
}
|
||||||
|
inline virtual ~ATLSubscriber(){}
|
||||||
|
};
|
||||||
|
|
||||||
|
// WIFISubscriber, created with requests from MSAPM or QuIPC
|
||||||
|
struct WIFISubscriber : public Subscriber {
|
||||||
|
char * mSSID;
|
||||||
|
char * mPassword;
|
||||||
|
loc_if_req_sender_id_e_type senderId;
|
||||||
|
bool mIsInactive;
|
||||||
|
inline WIFISubscriber(const AgpsStateMachine* stateMachine,
|
||||||
|
char * ssid, char * password, loc_if_req_sender_id_e_type sender_id) :
|
||||||
|
Subscriber(sender_id, stateMachine),
|
||||||
|
mSSID(NULL == ssid ? NULL : new char[SSID_BUF_SIZE]),
|
||||||
|
mPassword(NULL == password ? NULL : new char[SSID_BUF_SIZE]),
|
||||||
|
senderId(sender_id)
|
||||||
|
{
|
||||||
|
if (NULL != mSSID)
|
||||||
|
strlcpy(mSSID, ssid, SSID_BUF_SIZE);
|
||||||
|
if (NULL != mPassword)
|
||||||
|
strlcpy(mPassword, password, SSID_BUF_SIZE);
|
||||||
|
mIsInactive = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual bool notifyRsrcStatus(Notification ¬ification);
|
||||||
|
|
||||||
|
inline virtual void setIPAddresses(uint32_t &v4, char* v6) {}
|
||||||
|
|
||||||
|
inline virtual void setWifiInfo(char* ssid, char* password)
|
||||||
|
{
|
||||||
|
if (NULL != mSSID)
|
||||||
|
strlcpy(ssid, mSSID, SSID_BUF_SIZE);
|
||||||
|
else
|
||||||
|
ssid[0] = '\0';
|
||||||
|
if (NULL != mPassword)
|
||||||
|
strlcpy(password, mPassword, SSID_BUF_SIZE);
|
||||||
|
else
|
||||||
|
password[0] = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
inline virtual bool waitForCloseComplete() { return true; }
|
||||||
|
|
||||||
|
inline virtual void setInactive() { mIsInactive = true; }
|
||||||
|
inline virtual bool isInactive() { return mIsInactive; }
|
||||||
|
|
||||||
|
virtual Subscriber* clone()
|
||||||
|
{
|
||||||
|
return new WIFISubscriber(mStateMachine, mSSID, mPassword, senderId);
|
||||||
|
}
|
||||||
|
inline virtual ~WIFISubscriber(){}
|
||||||
|
};
|
||||||
|
|
||||||
|
struct DSSubscriber : public Subscriber {
|
||||||
|
bool mIsInactive;
|
||||||
|
inline DSSubscriber(const AgpsStateMachine *stateMachine,
|
||||||
|
const int id) :
|
||||||
|
Subscriber(id, stateMachine)
|
||||||
|
{
|
||||||
|
mIsInactive = false;
|
||||||
|
}
|
||||||
|
inline virtual void setIPAddresses(uint32_t &v4, char* v6) {}
|
||||||
|
virtual Subscriber* clone()
|
||||||
|
{return new DSSubscriber(mStateMachine, ID);}
|
||||||
|
virtual bool notifyRsrcStatus(Notification ¬ification);
|
||||||
|
inline virtual bool waitForCloseComplete() { return true; }
|
||||||
|
virtual void setInactive();
|
||||||
|
inline virtual bool isInactive()
|
||||||
|
{ return mIsInactive; }
|
||||||
|
inline virtual ~DSSubscriber(){}
|
||||||
|
inline virtual char *whoami() {return (char*)"DSSubscriber";}
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif //__LOC_ENG_AGPS_H__
|
270
gps/loc_api/libloc_api_50001/loc_eng_dmn_conn.cpp
Executable file
270
gps/loc_api/libloc_api_50001/loc_eng_dmn_conn.cpp
Executable file
@ -0,0 +1,270 @@
|
|||||||
|
/* 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 <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <linux/stat.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <linux/types.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <grp.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
|
||||||
|
#include "log_util.h"
|
||||||
|
#include "platform_lib_includes.h"
|
||||||
|
#include "loc_eng_dmn_conn_glue_msg.h"
|
||||||
|
#include "loc_eng_dmn_conn_handler.h"
|
||||||
|
#include "loc_eng_dmn_conn.h"
|
||||||
|
#include "loc_eng_msg.h"
|
||||||
|
|
||||||
|
static int loc_api_server_msgqid;
|
||||||
|
static int loc_api_resp_msgqid;
|
||||||
|
static int quipc_msgqid;
|
||||||
|
static int msapm_msgqid;
|
||||||
|
static int msapu_msgqid;
|
||||||
|
|
||||||
|
static const char * global_loc_api_q_path = GPSONE_LOC_API_Q_PATH;
|
||||||
|
static const char * global_loc_api_resp_q_path = GPSONE_LOC_API_RESP_Q_PATH;
|
||||||
|
static const char * global_quipc_ctrl_q_path = QUIPC_CTRL_Q_PATH;
|
||||||
|
static const char * global_msapm_ctrl_q_path = MSAPM_CTRL_Q_PATH;
|
||||||
|
static const char * global_msapu_ctrl_q_path = MSAPU_CTRL_Q_PATH;
|
||||||
|
|
||||||
|
static int loc_api_server_proc_init(void *context)
|
||||||
|
{
|
||||||
|
loc_api_server_msgqid = loc_eng_dmn_conn_glue_msgget(global_loc_api_q_path, O_RDWR);
|
||||||
|
//change mode/group for the global_loc_api_q_path pipe
|
||||||
|
int result = chmod (global_loc_api_q_path, 0660);
|
||||||
|
if (result != 0)
|
||||||
|
{
|
||||||
|
LOC_LOGE("failed to change mode for %s, error = %s\n", global_loc_api_q_path, strerror(errno));
|
||||||
|
}
|
||||||
|
|
||||||
|
struct group * gps_group = getgrnam("gps");
|
||||||
|
if (gps_group != NULL)
|
||||||
|
{
|
||||||
|
result = chown (global_loc_api_q_path, -1, gps_group->gr_gid);
|
||||||
|
if (result != 0)
|
||||||
|
{
|
||||||
|
LOC_LOGE("chown for pipe failed, pipe %s, gid = %d, result = %d, error = %s\n",
|
||||||
|
global_loc_api_q_path, gps_group->gr_gid, result, strerror(errno));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
LOC_LOGE("getgrnam for gps failed, error code = %d\n", errno);
|
||||||
|
}
|
||||||
|
|
||||||
|
loc_api_resp_msgqid = loc_eng_dmn_conn_glue_msgget(global_loc_api_resp_q_path, O_RDWR);
|
||||||
|
|
||||||
|
//change mode/group for the global_loc_api_resp_q_path pipe
|
||||||
|
result = chmod (global_loc_api_resp_q_path, 0660);
|
||||||
|
if (result != 0)
|
||||||
|
{
|
||||||
|
LOC_LOGE("failed to change mode for %s, error = %s\n", global_loc_api_resp_q_path, strerror(errno));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (gps_group != NULL)
|
||||||
|
{
|
||||||
|
result = chown (global_loc_api_resp_q_path, -1, gps_group->gr_gid);
|
||||||
|
if (result != 0)
|
||||||
|
{
|
||||||
|
LOC_LOGE("chown for pipe failed, pipe %s, gid = %d, result = %d, error = %s\n",
|
||||||
|
global_loc_api_resp_q_path,
|
||||||
|
gps_group->gr_gid, result, strerror(errno));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
quipc_msgqid = loc_eng_dmn_conn_glue_msgget(global_quipc_ctrl_q_path, O_RDWR);
|
||||||
|
msapm_msgqid = loc_eng_dmn_conn_glue_msgget(global_msapm_ctrl_q_path , O_RDWR);
|
||||||
|
msapu_msgqid = loc_eng_dmn_conn_glue_msgget(global_msapu_ctrl_q_path , O_RDWR);
|
||||||
|
|
||||||
|
LOC_LOGD("%s:%d] loc_api_server_msgqid = %d\n", __func__, __LINE__, loc_api_server_msgqid);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int loc_api_server_proc_pre(void *context)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int loc_api_server_proc(void *context)
|
||||||
|
{
|
||||||
|
int length, sz;
|
||||||
|
int result = 0;
|
||||||
|
static int cnt = 0;
|
||||||
|
struct ctrl_msgbuf * p_cmsgbuf;
|
||||||
|
struct ctrl_msgbuf cmsg_resp;
|
||||||
|
|
||||||
|
sz = sizeof(struct ctrl_msgbuf) + 256;
|
||||||
|
p_cmsgbuf = (struct ctrl_msgbuf *) malloc(sz);
|
||||||
|
|
||||||
|
if (!p_cmsgbuf) {
|
||||||
|
LOC_LOGE("%s:%d] Out of memory\n", __func__, __LINE__);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
cnt ++;
|
||||||
|
LOC_LOGD("%s:%d] %d listening on %s...\n", __func__, __LINE__, cnt, (char *) context);
|
||||||
|
length = loc_eng_dmn_conn_glue_msgrcv(loc_api_server_msgqid, p_cmsgbuf, sz);
|
||||||
|
if (length <= 0) {
|
||||||
|
free(p_cmsgbuf);
|
||||||
|
LOC_LOGE("%s:%d] fail receiving msg from gpsone_daemon, retry later\n", __func__, __LINE__);
|
||||||
|
usleep(1000);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
LOC_LOGD("%s:%d] received ctrl_type = %d\n", __func__, __LINE__, p_cmsgbuf->ctrl_type);
|
||||||
|
switch(p_cmsgbuf->ctrl_type) {
|
||||||
|
case GPSONE_LOC_API_IF_REQUEST:
|
||||||
|
result = loc_eng_dmn_conn_loc_api_server_if_request_handler(p_cmsgbuf, length);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case GPSONE_LOC_API_IF_RELEASE:
|
||||||
|
result = loc_eng_dmn_conn_loc_api_server_if_release_handler(p_cmsgbuf, length);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case GPSONE_UNBLOCK:
|
||||||
|
LOC_LOGD("%s:%d] GPSONE_UNBLOCK\n", __func__, __LINE__);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
LOC_LOGE("%s:%d] unsupported ctrl_type = %d\n",
|
||||||
|
__func__, __LINE__, p_cmsgbuf->ctrl_type);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
free(p_cmsgbuf);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int loc_api_server_proc_post(void *context)
|
||||||
|
{
|
||||||
|
LOC_LOGD("%s:%d]\n", __func__, __LINE__);
|
||||||
|
loc_eng_dmn_conn_glue_msgremove( global_loc_api_q_path, loc_api_server_msgqid);
|
||||||
|
loc_eng_dmn_conn_glue_msgremove( global_loc_api_resp_q_path, loc_api_resp_msgqid);
|
||||||
|
loc_eng_dmn_conn_glue_msgremove( global_quipc_ctrl_q_path, quipc_msgqid);
|
||||||
|
loc_eng_dmn_conn_glue_msgremove( global_msapm_ctrl_q_path, msapm_msgqid);
|
||||||
|
loc_eng_dmn_conn_glue_msgremove( global_msapu_ctrl_q_path, msapu_msgqid);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int loc_eng_dmn_conn_unblock_proc(void)
|
||||||
|
{
|
||||||
|
struct ctrl_msgbuf cmsgbuf;
|
||||||
|
cmsgbuf.ctrl_type = GPSONE_UNBLOCK;
|
||||||
|
LOC_LOGD("%s:%d]\n", __func__, __LINE__);
|
||||||
|
loc_eng_dmn_conn_glue_msgsnd(loc_api_server_msgqid, & cmsgbuf, sizeof(cmsgbuf));
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct loc_eng_dmn_conn_thelper thelper;
|
||||||
|
|
||||||
|
int loc_eng_dmn_conn_loc_api_server_launch(thelper_create_thread create_thread_cb,
|
||||||
|
const char * loc_api_q_path, const char * resp_q_path, void *agps_handle)
|
||||||
|
{
|
||||||
|
int result;
|
||||||
|
|
||||||
|
loc_api_handle = agps_handle;
|
||||||
|
|
||||||
|
if (loc_api_q_path) global_loc_api_q_path = loc_api_q_path;
|
||||||
|
if (resp_q_path) global_loc_api_resp_q_path = resp_q_path;
|
||||||
|
|
||||||
|
result = loc_eng_dmn_conn_launch_thelper( &thelper,
|
||||||
|
loc_api_server_proc_init,
|
||||||
|
loc_api_server_proc_pre,
|
||||||
|
loc_api_server_proc,
|
||||||
|
loc_api_server_proc_post,
|
||||||
|
create_thread_cb,
|
||||||
|
(char *) global_loc_api_q_path);
|
||||||
|
if (result != 0) {
|
||||||
|
LOC_LOGE("%s:%d]\n", __func__, __LINE__);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int loc_eng_dmn_conn_loc_api_server_unblock(void)
|
||||||
|
{
|
||||||
|
loc_eng_dmn_conn_unblock_thelper(&thelper);
|
||||||
|
loc_eng_dmn_conn_unblock_proc();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int loc_eng_dmn_conn_loc_api_server_join(void)
|
||||||
|
{
|
||||||
|
loc_eng_dmn_conn_join_thelper(&thelper);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int loc_eng_dmn_conn_loc_api_server_data_conn(int sender_id, int status) {
|
||||||
|
struct ctrl_msgbuf cmsgbuf;
|
||||||
|
LOC_LOGD("%s:%d] quipc_msgqid = %d\n", __func__, __LINE__, quipc_msgqid);
|
||||||
|
cmsgbuf.ctrl_type = GPSONE_LOC_API_RESPONSE;
|
||||||
|
cmsgbuf.cmsg.cmsg_response.result = status;
|
||||||
|
switch (sender_id) {
|
||||||
|
case LOC_ENG_IF_REQUEST_SENDER_ID_QUIPC: {
|
||||||
|
LOC_LOGD("%s:%d] sender_id = LOC_ENG_IF_REQUEST_SENDER_ID_QUIPC", __func__, __LINE__);
|
||||||
|
if (loc_eng_dmn_conn_glue_msgsnd(quipc_msgqid, & cmsgbuf, sizeof(struct ctrl_msgbuf)) < 0) {
|
||||||
|
LOC_LOGD("%s:%d] error! conn_glue_msgsnd failed\n", __func__, __LINE__);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case LOC_ENG_IF_REQUEST_SENDER_ID_MSAPM: {
|
||||||
|
LOC_LOGD("%s:%d] sender_id = LOC_ENG_IF_REQUEST_SENDER_ID_MSAPM", __func__, __LINE__);
|
||||||
|
if (loc_eng_dmn_conn_glue_msgsnd(msapm_msgqid, & cmsgbuf, sizeof(struct ctrl_msgbuf)) < 0) {
|
||||||
|
LOC_LOGD("%s:%d] error! conn_glue_msgsnd failed\n", __func__, __LINE__);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case LOC_ENG_IF_REQUEST_SENDER_ID_MSAPU: {
|
||||||
|
LOC_LOGD("%s:%d] sender_id = LOC_ENG_IF_REQUEST_SENDER_ID_MSAPU", __func__, __LINE__);
|
||||||
|
if (loc_eng_dmn_conn_glue_msgsnd(msapu_msgqid, & cmsgbuf, sizeof(struct ctrl_msgbuf)) < 0) {
|
||||||
|
LOC_LOGD("%s:%d] error! conn_glue_msgsnd failed\n", __func__, __LINE__);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case LOC_ENG_IF_REQUEST_SENDER_ID_GPSONE_DAEMON: {
|
||||||
|
LOC_LOGD("%s:%d] sender_id = LOC_ENG_IF_REQUEST_SENDER_ID_GPSONE_DAEMON", __func__, __LINE__);
|
||||||
|
if (loc_eng_dmn_conn_glue_msgsnd(loc_api_resp_msgqid, & cmsgbuf, sizeof(struct ctrl_msgbuf)) < 0) {
|
||||||
|
LOC_LOGD("%s:%d] error! conn_glue_msgsnd failed\n", __func__, __LINE__);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default: {
|
||||||
|
LOC_LOGD("%s:%d] invalid sender ID!", __func__, __LINE__);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
59
gps/loc_api/libloc_api_50001/loc_eng_dmn_conn.h
Executable file
59
gps/loc_api/libloc_api_50001/loc_eng_dmn_conn.h
Executable file
@ -0,0 +1,59 @@
|
|||||||
|
/* 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_ENG_DATA_SERVER_H
|
||||||
|
#define LOC_ENG_DATA_SERVER_H
|
||||||
|
|
||||||
|
#include "loc_eng_dmn_conn_thread_helper.h"
|
||||||
|
|
||||||
|
#ifdef _ANDROID_
|
||||||
|
|
||||||
|
#define GPSONE_LOC_API_Q_PATH "/data/misc/gpsone_d/gpsone_loc_api_q"
|
||||||
|
#define GPSONE_LOC_API_RESP_Q_PATH "/data/misc/gpsone_d/gpsone_loc_api_resp_q"
|
||||||
|
#define QUIPC_CTRL_Q_PATH "/data/misc/gpsone_d/quipc_ctrl_q"
|
||||||
|
#define MSAPM_CTRL_Q_PATH "/data/misc/gpsone_d/msapm_ctrl_q"
|
||||||
|
#define MSAPU_CTRL_Q_PATH "/data/misc/gpsone_d/msapu_ctrl_q"
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
#define GPSONE_LOC_API_Q_PATH "/tmp/gpsone_loc_api_q"
|
||||||
|
#define GPSONE_LOC_API_RESP_Q_PATH "/tmp/gpsone_loc_api_resp_q"
|
||||||
|
#define QUIPC_CTRL_Q_PATH "/tmp/quipc_ctrl_q"
|
||||||
|
#define MSAPM_CTRL_Q_PATH "/tmp/msapm_ctrl_q"
|
||||||
|
#define MSAPU_CTRL_Q_PATH "/tmp/msapu_ctrl_q"
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int loc_eng_dmn_conn_loc_api_server_launch(thelper_create_thread create_thread_cb,
|
||||||
|
const char * loc_api_q_path, const char * ctrl_q_path, void *agps_handle);
|
||||||
|
int loc_eng_dmn_conn_loc_api_server_unblock(void);
|
||||||
|
int loc_eng_dmn_conn_loc_api_server_join(void);
|
||||||
|
int loc_eng_dmn_conn_loc_api_server_data_conn(int, int);
|
||||||
|
|
||||||
|
#endif /* LOC_ENG_DATA_SERVER_H */
|
||||||
|
|
223
gps/loc_api/libloc_api_50001/loc_eng_dmn_conn_glue_msg.c
Executable file
223
gps/loc_api/libloc_api_50001/loc_eng_dmn_conn_glue_msg.c
Executable file
@ -0,0 +1,223 @@
|
|||||||
|
/* 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 <linux/stat.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
|
||||||
|
#include <linux/types.h>
|
||||||
|
|
||||||
|
#include "log_util.h"
|
||||||
|
#include "platform_lib_includes.h"
|
||||||
|
#include "loc_eng_dmn_conn_glue_msg.h"
|
||||||
|
#include "loc_eng_dmn_conn_handler.h"
|
||||||
|
|
||||||
|
/*===========================================================================
|
||||||
|
FUNCTION loc_eng_dmn_conn_glue_msgget
|
||||||
|
|
||||||
|
DESCRIPTION
|
||||||
|
This function get a message queue
|
||||||
|
|
||||||
|
q_path - name path of the message queue
|
||||||
|
mode -
|
||||||
|
|
||||||
|
DEPENDENCIES
|
||||||
|
None
|
||||||
|
|
||||||
|
RETURN VALUE
|
||||||
|
message queue id
|
||||||
|
|
||||||
|
SIDE EFFECTS
|
||||||
|
N/A
|
||||||
|
|
||||||
|
===========================================================================*/
|
||||||
|
int loc_eng_dmn_conn_glue_msgget(const char * q_path, int mode)
|
||||||
|
{
|
||||||
|
int msgqid;
|
||||||
|
msgqid = loc_eng_dmn_conn_glue_pipeget(q_path, mode);
|
||||||
|
return msgqid;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*===========================================================================
|
||||||
|
FUNCTION loc_eng_dmn_conn_glue_msgremove
|
||||||
|
|
||||||
|
DESCRIPTION
|
||||||
|
remove a message queue
|
||||||
|
|
||||||
|
q_path - name path of the message queue
|
||||||
|
msgqid - message queue id
|
||||||
|
|
||||||
|
DEPENDENCIES
|
||||||
|
None
|
||||||
|
|
||||||
|
RETURN VALUE
|
||||||
|
0: success or negative value for failure
|
||||||
|
|
||||||
|
SIDE EFFECTS
|
||||||
|
N/A
|
||||||
|
|
||||||
|
===========================================================================*/
|
||||||
|
int loc_eng_dmn_conn_glue_msgremove(const char * q_path, int msgqid)
|
||||||
|
{
|
||||||
|
int result;
|
||||||
|
result = loc_eng_dmn_conn_glue_piperemove(q_path, msgqid);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*===========================================================================
|
||||||
|
FUNCTION loc_eng_dmn_conn_glue_msgsnd
|
||||||
|
|
||||||
|
DESCRIPTION
|
||||||
|
Send a message
|
||||||
|
|
||||||
|
msgqid - message queue id
|
||||||
|
msgp - pointer to the message to be sent
|
||||||
|
msgsz - size of the message
|
||||||
|
|
||||||
|
DEPENDENCIES
|
||||||
|
None
|
||||||
|
|
||||||
|
RETURN VALUE
|
||||||
|
number of bytes sent out or negative value for failure
|
||||||
|
|
||||||
|
SIDE EFFECTS
|
||||||
|
N/A
|
||||||
|
|
||||||
|
===========================================================================*/
|
||||||
|
int loc_eng_dmn_conn_glue_msgsnd(int msgqid, const void * msgp, size_t msgsz)
|
||||||
|
{
|
||||||
|
int result;
|
||||||
|
struct ctrl_msgbuf *pmsg = (struct ctrl_msgbuf *) msgp;
|
||||||
|
pmsg->msgsz = msgsz;
|
||||||
|
|
||||||
|
result = loc_eng_dmn_conn_glue_pipewrite(msgqid, msgp, msgsz);
|
||||||
|
if (result != (int) msgsz) {
|
||||||
|
LOC_LOGE("%s:%d] pipe broken %d, msgsz = %d\n", __func__, __LINE__, result, (int) msgsz);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*===========================================================================
|
||||||
|
FUNCTION loc_eng_dmn_conn_glue_msgrcv
|
||||||
|
|
||||||
|
DESCRIPTION
|
||||||
|
receive a message
|
||||||
|
|
||||||
|
msgqid - message queue id
|
||||||
|
msgp - pointer to the buffer to hold the message
|
||||||
|
msgsz - size of the buffer
|
||||||
|
|
||||||
|
DEPENDENCIES
|
||||||
|
None
|
||||||
|
|
||||||
|
RETURN VALUE
|
||||||
|
number of bytes received or negative value for failure
|
||||||
|
|
||||||
|
SIDE EFFECTS
|
||||||
|
N/A
|
||||||
|
|
||||||
|
===========================================================================*/
|
||||||
|
int loc_eng_dmn_conn_glue_msgrcv(int msgqid, void *msgp, size_t msgbufsz)
|
||||||
|
{
|
||||||
|
int result;
|
||||||
|
struct ctrl_msgbuf *pmsg = (struct ctrl_msgbuf *) msgp;
|
||||||
|
|
||||||
|
result = loc_eng_dmn_conn_glue_piperead(msgqid, &(pmsg->msgsz), sizeof(pmsg->msgsz));
|
||||||
|
if (result != sizeof(pmsg->msgsz)) {
|
||||||
|
LOC_LOGE("%s:%d] pipe broken %d\n", __func__, __LINE__, result);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (msgbufsz < pmsg->msgsz) {
|
||||||
|
LOC_LOGE("%s:%d] msgbuf is too small %d < %d\n", __func__, __LINE__, (int) msgbufsz, (int) pmsg->msgsz);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
result = loc_eng_dmn_conn_glue_piperead(msgqid, (uint8_t *) msgp + sizeof(pmsg->msgsz), pmsg->msgsz - sizeof(pmsg->msgsz));
|
||||||
|
if (result != (int) (pmsg->msgsz - sizeof(pmsg->msgsz))) {
|
||||||
|
LOC_LOGE("%s:%d] pipe broken %d, msgsz = %d\n", __func__, __LINE__, result, (int) pmsg->msgsz);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return pmsg->msgsz;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*===========================================================================
|
||||||
|
FUNCTION loc_eng_dmn_conn_glue_msgunblock
|
||||||
|
|
||||||
|
DESCRIPTION
|
||||||
|
unblock a message queue
|
||||||
|
|
||||||
|
msgqid - message queue id
|
||||||
|
|
||||||
|
DEPENDENCIES
|
||||||
|
None
|
||||||
|
|
||||||
|
RETURN VALUE
|
||||||
|
0: success
|
||||||
|
|
||||||
|
SIDE EFFECTS
|
||||||
|
N/A
|
||||||
|
|
||||||
|
===========================================================================*/
|
||||||
|
int loc_eng_dmn_conn_glue_msgunblock(int msgqid)
|
||||||
|
{
|
||||||
|
return loc_eng_dmn_conn_glue_pipeunblock(msgqid);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*===========================================================================
|
||||||
|
FUNCTION loc_eng_dmn_conn_glue_msgflush
|
||||||
|
|
||||||
|
DESCRIPTION
|
||||||
|
flush out the message in a queue
|
||||||
|
|
||||||
|
msgqid - message queue id
|
||||||
|
|
||||||
|
DEPENDENCIES
|
||||||
|
None
|
||||||
|
|
||||||
|
RETURN VALUE
|
||||||
|
number of bytes that are flushed out.
|
||||||
|
|
||||||
|
SIDE EFFECTS
|
||||||
|
N/A
|
||||||
|
|
||||||
|
===========================================================================*/
|
||||||
|
int loc_eng_dmn_conn_glue_msgflush(int msgqid)
|
||||||
|
{
|
||||||
|
int length;
|
||||||
|
char buf[128];
|
||||||
|
|
||||||
|
do {
|
||||||
|
length = loc_eng_dmn_conn_glue_piperead(msgqid, buf, 128);
|
||||||
|
LOC_LOGD("%s:%d] %s\n", __func__, __LINE__, buf);
|
||||||
|
} while(length);
|
||||||
|
return length;
|
||||||
|
}
|
||||||
|
|
51
gps/loc_api/libloc_api_50001/loc_eng_dmn_conn_glue_msg.h
Executable file
51
gps/loc_api/libloc_api_50001/loc_eng_dmn_conn_glue_msg.h
Executable file
@ -0,0 +1,51 @@
|
|||||||
|
/* 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 LOC_ENG_DMN_CONN_GLUE_MSG_H
|
||||||
|
#define LOC_ENG_DMN_CONN_GLUE_MSG_H
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif /* __cplusplus */
|
||||||
|
|
||||||
|
|
||||||
|
#include <linux/types.h>
|
||||||
|
#include "loc_eng_dmn_conn_glue_pipe.h"
|
||||||
|
|
||||||
|
int loc_eng_dmn_conn_glue_msgget(const char * q_path, int mode);
|
||||||
|
int loc_eng_dmn_conn_glue_msgremove(const char * q_path, int msgqid);
|
||||||
|
int loc_eng_dmn_conn_glue_msgsnd(int msgqid, const void * msgp, size_t msgsz);
|
||||||
|
int loc_eng_dmn_conn_glue_msgrcv(int msgqid, void *msgp, size_t msgsz);
|
||||||
|
int loc_eng_dmn_conn_glue_msgflush(int msgqid);
|
||||||
|
int loc_eng_dmn_conn_glue_msgunblock(int msgqid);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif /* __cplusplus */
|
||||||
|
|
||||||
|
#endif /* LOC_ENG_DMN_CONN_GLUE_MSG_H */
|
214
gps/loc_api/libloc_api_50001/loc_eng_dmn_conn_glue_pipe.c
Executable file
214
gps/loc_api/libloc_api_50001/loc_eng_dmn_conn_glue_pipe.c
Executable file
@ -0,0 +1,214 @@
|
|||||||
|
/* 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 <string.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
|
// #include <linux/stat.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
// #include <linux/types.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
|
||||||
|
#include "loc_eng_dmn_conn_glue_pipe.h"
|
||||||
|
#include "log_util.h"
|
||||||
|
#include "platform_lib_includes.h"
|
||||||
|
/*===========================================================================
|
||||||
|
FUNCTION loc_eng_dmn_conn_glue_pipeget
|
||||||
|
|
||||||
|
DESCRIPTION
|
||||||
|
create a named pipe.
|
||||||
|
|
||||||
|
pipe_name - pipe name path
|
||||||
|
mode - mode
|
||||||
|
|
||||||
|
DEPENDENCIES
|
||||||
|
None
|
||||||
|
|
||||||
|
RETURN VALUE
|
||||||
|
0: success or negative value for failure
|
||||||
|
|
||||||
|
SIDE EFFECTS
|
||||||
|
N/A
|
||||||
|
|
||||||
|
===========================================================================*/
|
||||||
|
int loc_eng_dmn_conn_glue_pipeget(const char * pipe_name, int mode)
|
||||||
|
{
|
||||||
|
int fd;
|
||||||
|
int result;
|
||||||
|
|
||||||
|
LOC_LOGD("%s, mode = %d\n", pipe_name, mode);
|
||||||
|
result = mkfifo(pipe_name, 0660);
|
||||||
|
|
||||||
|
if ((result == -1) && (errno != EEXIST)) {
|
||||||
|
LOC_LOGE("failed: %s\n", strerror(errno));
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
// The mode in mkfifo is not honoured and does not provide the
|
||||||
|
// group permissions. Doing chmod to add group permissions.
|
||||||
|
result = chmod (pipe_name, 0660);
|
||||||
|
if (result != 0){
|
||||||
|
LOC_LOGE ("%s failed to change mode for %s, error = %s\n", __func__,
|
||||||
|
pipe_name, strerror(errno));
|
||||||
|
}
|
||||||
|
|
||||||
|
fd = open(pipe_name, mode);
|
||||||
|
if (fd <= 0)
|
||||||
|
{
|
||||||
|
LOC_LOGE("failed: %s\n", strerror(errno));
|
||||||
|
}
|
||||||
|
LOC_LOGD("fd = %d, %s\n", fd, pipe_name);
|
||||||
|
return fd;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*===========================================================================
|
||||||
|
FUNCTION loc_eng_dmn_conn_glue_piperemove
|
||||||
|
|
||||||
|
DESCRIPTION
|
||||||
|
remove a pipe
|
||||||
|
|
||||||
|
pipe_name - pipe name path
|
||||||
|
fd - fd for the pipe
|
||||||
|
|
||||||
|
DEPENDENCIES
|
||||||
|
None
|
||||||
|
|
||||||
|
RETURN VALUE
|
||||||
|
0: success
|
||||||
|
|
||||||
|
SIDE EFFECTS
|
||||||
|
N/A
|
||||||
|
|
||||||
|
===========================================================================*/
|
||||||
|
int loc_eng_dmn_conn_glue_piperemove(const char * pipe_name, int fd)
|
||||||
|
{
|
||||||
|
close(fd);
|
||||||
|
if (pipe_name) unlink(pipe_name);
|
||||||
|
LOC_LOGD("fd = %d, %s\n", fd, pipe_name);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*===========================================================================
|
||||||
|
FUNCTION loc_eng_dmn_conn_glue_pipewrite
|
||||||
|
|
||||||
|
DESCRIPTION
|
||||||
|
write to a pipe
|
||||||
|
|
||||||
|
fd - fd of a pipe
|
||||||
|
buf - buffer for the data to write
|
||||||
|
sz - size of the data in buffer
|
||||||
|
|
||||||
|
DEPENDENCIES
|
||||||
|
None
|
||||||
|
|
||||||
|
RETURN VALUE
|
||||||
|
number of bytes written or negative value for failure
|
||||||
|
|
||||||
|
SIDE EFFECTS
|
||||||
|
N/A
|
||||||
|
|
||||||
|
===========================================================================*/
|
||||||
|
int loc_eng_dmn_conn_glue_pipewrite(int fd, const void * buf, size_t sz)
|
||||||
|
{
|
||||||
|
int result;
|
||||||
|
|
||||||
|
result = write(fd, buf, sz);
|
||||||
|
|
||||||
|
/* @todo check for non EINTR & EAGAIN, shall not do select again, select_tut Law 7) */
|
||||||
|
|
||||||
|
/* LOC_LOGD("fd = %d, buf = 0x%lx, size = %d, result = %d\n", fd, (long) buf, (int) sz, (int) result); */
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*===========================================================================
|
||||||
|
FUNCTION loc_eng_dmn_conn_glue_piperead
|
||||||
|
|
||||||
|
DESCRIPTION
|
||||||
|
read from a pipe
|
||||||
|
|
||||||
|
fd - fd for the pipe
|
||||||
|
buf - buffer to hold the data read from pipe
|
||||||
|
sz - size of the buffer
|
||||||
|
|
||||||
|
DEPENDENCIES
|
||||||
|
None
|
||||||
|
|
||||||
|
RETURN VALUE
|
||||||
|
number of bytes read from pipe or negative value for failure
|
||||||
|
|
||||||
|
SIDE EFFECTS
|
||||||
|
N/A
|
||||||
|
|
||||||
|
===========================================================================*/
|
||||||
|
int loc_eng_dmn_conn_glue_piperead(int fd, void * buf, size_t sz)
|
||||||
|
{
|
||||||
|
int len;
|
||||||
|
|
||||||
|
len = read(fd, buf, sz);
|
||||||
|
|
||||||
|
/* @todo check for non EINTR & EAGAIN, shall not do select again, select_tut Law 7) */
|
||||||
|
|
||||||
|
/* LOC_LOGD("fd = %d, buf = 0x%lx, size = %d, len = %d\n", fd, (long) buf, (int) sz, len); */
|
||||||
|
return len;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*===========================================================================
|
||||||
|
FUNCTION loc_eng_dmn_conn_glue_pipeunblock
|
||||||
|
|
||||||
|
DESCRIPTION
|
||||||
|
unblock a pipe
|
||||||
|
|
||||||
|
fd - fd for the pipe
|
||||||
|
|
||||||
|
DEPENDENCIES
|
||||||
|
None
|
||||||
|
|
||||||
|
RETURN VALUE
|
||||||
|
0 for success or negative value for failure
|
||||||
|
|
||||||
|
SIDE EFFECTS
|
||||||
|
N/A
|
||||||
|
|
||||||
|
===========================================================================*/
|
||||||
|
int loc_eng_dmn_conn_glue_pipeunblock(int fd)
|
||||||
|
{
|
||||||
|
int result;
|
||||||
|
struct flock flock_v;
|
||||||
|
LOC_LOGD("\n");
|
||||||
|
// result = fcntl(fd, F_SETFL, fcntl(fd, F_GETFL, 0) | O_NDELAY);
|
||||||
|
flock_v.l_type = F_UNLCK;
|
||||||
|
flock_v.l_len = 32;
|
||||||
|
result = fcntl(fd, F_SETLK, &flock_v);
|
||||||
|
if (result < 0) {
|
||||||
|
LOC_LOGE("fcntl failure, %s\n", strerror(errno));
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
50
gps/loc_api/libloc_api_50001/loc_eng_dmn_conn_glue_pipe.h
Executable file
50
gps/loc_api/libloc_api_50001/loc_eng_dmn_conn_glue_pipe.h
Executable file
@ -0,0 +1,50 @@
|
|||||||
|
/* 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 LOC_ENG_DMN_CONN_GLUE_PIPE_H
|
||||||
|
#define LOC_ENG_DMN_CONN_GLUE_PIPE_H
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif /* __cplusplus */
|
||||||
|
|
||||||
|
#include <linux/types.h>
|
||||||
|
|
||||||
|
int loc_eng_dmn_conn_glue_pipeget(const char * pipe_name, int mode);
|
||||||
|
int loc_eng_dmn_conn_glue_piperemove(const char * pipe_name, int fd);
|
||||||
|
int loc_eng_dmn_conn_glue_pipewrite(int fd, const void * buf, size_t sz);
|
||||||
|
int loc_eng_dmn_conn_glue_piperead(int fd, void * buf, size_t sz);
|
||||||
|
|
||||||
|
int loc_eng_dmn_conn_glue_pipeflush(int fd);
|
||||||
|
int loc_eng_dmn_conn_glue_pipeunblock(int fd);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif /* __cplusplus */
|
||||||
|
|
||||||
|
#endif /* LOC_ENG_DMN_CONN_GLUE_PIPE_H */
|
237
gps/loc_api/libloc_api_50001/loc_eng_dmn_conn_handler.cpp
Executable file
237
gps/loc_api/libloc_api_50001/loc_eng_dmn_conn_handler.cpp
Executable file
@ -0,0 +1,237 @@
|
|||||||
|
/* 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 <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#include "log_util.h"
|
||||||
|
#include "platform_lib_includes.h"
|
||||||
|
#include "loc_eng_msg.h"
|
||||||
|
#include "loc_eng_dmn_conn.h"
|
||||||
|
#include "loc_eng_dmn_conn_handler.h"
|
||||||
|
|
||||||
|
void* loc_api_handle = NULL;
|
||||||
|
|
||||||
|
int loc_eng_dmn_conn_loc_api_server_if_request_handler(struct ctrl_msgbuf *pmsg, int len)
|
||||||
|
{
|
||||||
|
LOC_LOGD("%s:%d]\n", __func__, __LINE__);
|
||||||
|
#ifndef DEBUG_DMN_LOC_API
|
||||||
|
if (NULL == loc_api_handle) {
|
||||||
|
LOC_LOGE("%s:%d] NO agps data handle\n", __func__, __LINE__);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (NULL != loc_api_handle) {
|
||||||
|
AGpsExtType type;
|
||||||
|
switch (pmsg->cmsg.cmsg_if_request.type) {
|
||||||
|
case IF_REQUEST_TYPE_SUPL:
|
||||||
|
{
|
||||||
|
LOC_LOGD("IF_REQUEST_TYPE_SUPL");
|
||||||
|
type = AGPS_TYPE_SUPL;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case IF_REQUEST_TYPE_WIFI:
|
||||||
|
{
|
||||||
|
LOC_LOGD("IF_REQUEST_TYPE_WIFI");
|
||||||
|
type = AGPS_TYPE_WIFI;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case IF_REQUEST_TYPE_ANY:
|
||||||
|
{
|
||||||
|
LOC_LOGD("IF_REQUEST_TYPE_ANY");
|
||||||
|
type = AGPS_TYPE_ANY;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
LOC_LOGD("invalid IF_REQUEST_TYPE!");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
switch (pmsg->cmsg.cmsg_if_request.sender_id) {
|
||||||
|
case IF_REQUEST_SENDER_ID_QUIPC:
|
||||||
|
{
|
||||||
|
LOC_LOGD("IF_REQUEST_SENDER_ID_QUIPC");
|
||||||
|
LocEngReqRelWifi* msg =
|
||||||
|
new LocEngReqRelWifi(loc_api_handle,
|
||||||
|
type,
|
||||||
|
LOC_ENG_IF_REQUEST_SENDER_ID_QUIPC,
|
||||||
|
(char*)pmsg->cmsg.cmsg_if_request.ssid,
|
||||||
|
(char*)pmsg->cmsg.cmsg_if_request.password,
|
||||||
|
true);
|
||||||
|
msg->send();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case IF_REQUEST_SENDER_ID_MSAPM:
|
||||||
|
{
|
||||||
|
LOC_LOGD("IF_REQUEST_SENDER_ID_MSAPM");
|
||||||
|
LocEngReqRelWifi* msg =
|
||||||
|
new LocEngReqRelWifi(loc_api_handle,
|
||||||
|
type,
|
||||||
|
LOC_ENG_IF_REQUEST_SENDER_ID_MSAPM,
|
||||||
|
(char*)pmsg->cmsg.cmsg_if_request.ssid,
|
||||||
|
(char*)pmsg->cmsg.cmsg_if_request.password,
|
||||||
|
true);
|
||||||
|
msg->send();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case IF_REQUEST_SENDER_ID_MSAPU:
|
||||||
|
{
|
||||||
|
LOC_LOGD("IF_REQUEST_SENDER_ID_MSAPU");
|
||||||
|
LocEngReqRelWifi* msg =
|
||||||
|
new LocEngReqRelWifi(loc_api_handle,
|
||||||
|
type,
|
||||||
|
LOC_ENG_IF_REQUEST_SENDER_ID_MSAPU,
|
||||||
|
(char*)pmsg->cmsg.cmsg_if_request.ssid,
|
||||||
|
(char*)pmsg->cmsg.cmsg_if_request.password,
|
||||||
|
true);
|
||||||
|
msg->send();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case IF_REQUEST_SENDER_ID_GPSONE_DAEMON:
|
||||||
|
{
|
||||||
|
LOC_LOGD("IF_REQUEST_SENDER_ID_GPSONE_DAEMON");
|
||||||
|
LocEngReqRelBIT* msg =
|
||||||
|
new LocEngReqRelBIT(loc_api_handle,
|
||||||
|
type,
|
||||||
|
pmsg->cmsg.cmsg_if_request.ipv4_addr,
|
||||||
|
(char*)pmsg->cmsg.cmsg_if_request.ipv6_addr,
|
||||||
|
true);
|
||||||
|
msg->send();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
LOC_LOGD("invalid IF_REQUEST_SENDER_ID!");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
loc_eng_dmn_conn_loc_api_server_data_conn(LOC_ENG_IF_REQUEST_SENDER_ID_GPSONE_DAEMON, GPSONE_LOC_API_IF_REQUEST_SUCCESS);
|
||||||
|
#endif
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int loc_eng_dmn_conn_loc_api_server_if_release_handler(struct ctrl_msgbuf *pmsg, int len)
|
||||||
|
{
|
||||||
|
LOC_LOGD("%s:%d]\n", __func__, __LINE__);
|
||||||
|
#ifndef DEBUG_DMN_LOC_API
|
||||||
|
AGpsExtType type;
|
||||||
|
switch (pmsg->cmsg.cmsg_if_request.type) {
|
||||||
|
case IF_REQUEST_TYPE_SUPL:
|
||||||
|
{
|
||||||
|
LOC_LOGD("IF_REQUEST_TYPE_SUPL");
|
||||||
|
type = AGPS_TYPE_SUPL;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case IF_REQUEST_TYPE_WIFI:
|
||||||
|
{
|
||||||
|
LOC_LOGD("IF_REQUEST_TYPE_WIFI");
|
||||||
|
type = AGPS_TYPE_WIFI;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case IF_REQUEST_TYPE_ANY:
|
||||||
|
{
|
||||||
|
LOC_LOGD("IF_REQUEST_TYPE_ANY");
|
||||||
|
type = AGPS_TYPE_ANY;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
LOC_LOGD("invalid IF_REQUEST_TYPE!");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
switch (pmsg->cmsg.cmsg_if_request.sender_id) {
|
||||||
|
case IF_REQUEST_SENDER_ID_QUIPC:
|
||||||
|
{
|
||||||
|
LOC_LOGD("IF_REQUEST_SENDER_ID_QUIPC");
|
||||||
|
LocEngReqRelWifi* msg =
|
||||||
|
new LocEngReqRelWifi(loc_api_handle,
|
||||||
|
type,
|
||||||
|
LOC_ENG_IF_REQUEST_SENDER_ID_QUIPC,
|
||||||
|
(char*)pmsg->cmsg.cmsg_if_request.ssid,
|
||||||
|
(char*)pmsg->cmsg.cmsg_if_request.password,
|
||||||
|
false);
|
||||||
|
msg->send();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case IF_REQUEST_SENDER_ID_MSAPM:
|
||||||
|
{
|
||||||
|
LOC_LOGD("IF_REQUEST_SENDER_ID_MSAPM");
|
||||||
|
LocEngReqRelWifi* msg =
|
||||||
|
new LocEngReqRelWifi(loc_api_handle,
|
||||||
|
type,
|
||||||
|
LOC_ENG_IF_REQUEST_SENDER_ID_MSAPM,
|
||||||
|
(char*)pmsg->cmsg.cmsg_if_request.ssid,
|
||||||
|
(char*)pmsg->cmsg.cmsg_if_request.password,
|
||||||
|
false);
|
||||||
|
msg->send();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case IF_REQUEST_SENDER_ID_MSAPU:
|
||||||
|
{
|
||||||
|
LOC_LOGD("IF_REQUEST_SENDER_ID_MSAPU");
|
||||||
|
LocEngReqRelWifi* msg =
|
||||||
|
new LocEngReqRelWifi(loc_api_handle,
|
||||||
|
type,
|
||||||
|
LOC_ENG_IF_REQUEST_SENDER_ID_MSAPU,
|
||||||
|
(char*)pmsg->cmsg.cmsg_if_request.ssid,
|
||||||
|
(char*)pmsg->cmsg.cmsg_if_request.password,
|
||||||
|
false);
|
||||||
|
msg->send();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case IF_REQUEST_SENDER_ID_GPSONE_DAEMON:
|
||||||
|
{
|
||||||
|
LOC_LOGD("IF_REQUEST_SENDER_ID_GPSONE_DAEMON");
|
||||||
|
LocEngReqRelBIT* msg =
|
||||||
|
new LocEngReqRelBIT(loc_api_handle,
|
||||||
|
type,
|
||||||
|
pmsg->cmsg.cmsg_if_request.ipv4_addr,
|
||||||
|
(char*)pmsg->cmsg.cmsg_if_request.ipv6_addr,
|
||||||
|
false);
|
||||||
|
msg->send();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
LOC_LOGD("invalid IF_REQUEST_SENDER_ID!");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
loc_eng_dmn_conn_loc_api_server_data_conn(LOC_ENG_IF_REQUEST_SENDER_ID_GPSONE_DAEMON, GPSONE_LOC_API_IF_RELEASE_SUCCESS);
|
||||||
|
#endif
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
106
gps/loc_api/libloc_api_50001/loc_eng_dmn_conn_handler.h
Executable file
106
gps/loc_api/libloc_api_50001/loc_eng_dmn_conn_handler.h
Executable file
@ -0,0 +1,106 @@
|
|||||||
|
/* 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_ENG_DATA_SERVER_HANDLER
|
||||||
|
#define LOC_ENG_DATA_SERVER_HANDLER
|
||||||
|
|
||||||
|
#include <linux/types.h>
|
||||||
|
#include <arpa/inet.h>
|
||||||
|
|
||||||
|
//for SSID_BUF_SIZE
|
||||||
|
#include "hardware/gps.h"
|
||||||
|
|
||||||
|
#ifndef SSID_BUF_SIZE
|
||||||
|
#define SSID_BUF_SIZE (32+1)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
enum {
|
||||||
|
/* 0x0 - 0xEF is reserved for daemon internal */
|
||||||
|
GPSONE_LOC_API_IF_REQUEST = 0xF0,
|
||||||
|
GPSONE_LOC_API_IF_RELEASE,
|
||||||
|
GPSONE_LOC_API_RESPONSE,
|
||||||
|
GPSONE_UNBLOCK,
|
||||||
|
};
|
||||||
|
|
||||||
|
enum {
|
||||||
|
GPSONE_LOC_API_IF_REQUEST_SUCCESS = 0xF0,
|
||||||
|
GPSONE_LOC_API_IF_RELEASE_SUCCESS,
|
||||||
|
GPSONE_LOC_API_IF_FAILURE,
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
struct ctrl_msg_response {
|
||||||
|
int result;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct ctrl_msg_unblock {
|
||||||
|
int reserved;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
IF_REQUEST_TYPE_SUPL = 0,
|
||||||
|
IF_REQUEST_TYPE_WIFI,
|
||||||
|
IF_REQUEST_TYPE_ANY
|
||||||
|
} ctrl_if_req_type_e_type;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
IF_REQUEST_SENDER_ID_QUIPC = 0,
|
||||||
|
IF_REQUEST_SENDER_ID_MSAPM,
|
||||||
|
IF_REQUEST_SENDER_ID_MSAPU,
|
||||||
|
IF_REQUEST_SENDER_ID_GPSONE_DAEMON,
|
||||||
|
IF_REQUEST_SENDER_ID_MODEM
|
||||||
|
} ctrl_if_req_sender_id_e_type;
|
||||||
|
|
||||||
|
struct ctrl_msg_if_request {
|
||||||
|
ctrl_if_req_type_e_type type;
|
||||||
|
ctrl_if_req_sender_id_e_type sender_id;
|
||||||
|
unsigned long ipv4_addr;
|
||||||
|
unsigned char ipv6_addr[16];
|
||||||
|
char ssid[SSID_BUF_SIZE];
|
||||||
|
char password[SSID_BUF_SIZE];
|
||||||
|
};
|
||||||
|
|
||||||
|
/* do not change this structure */
|
||||||
|
struct ctrl_msgbuf {
|
||||||
|
size_t msgsz;
|
||||||
|
uint16_t reserved1;
|
||||||
|
uint32_t reserved2;
|
||||||
|
uint8_t ctrl_type;
|
||||||
|
union {
|
||||||
|
struct ctrl_msg_response cmsg_response;
|
||||||
|
struct ctrl_msg_unblock cmsg_unblock;
|
||||||
|
struct ctrl_msg_if_request cmsg_if_request;
|
||||||
|
} cmsg;
|
||||||
|
};
|
||||||
|
|
||||||
|
extern void* loc_api_handle;
|
||||||
|
|
||||||
|
int loc_eng_dmn_conn_loc_api_server_if_request_handler(struct ctrl_msgbuf *pmsg, int len);
|
||||||
|
int loc_eng_dmn_conn_loc_api_server_if_release_handler(struct ctrl_msgbuf *pmsg, int len);
|
||||||
|
|
||||||
|
#endif /* LOC_ENG_DATA_SERVER_HANDLER */
|
399
gps/loc_api/libloc_api_50001/loc_eng_dmn_conn_thread_helper.c
Executable file
399
gps/loc_api/libloc_api_50001/loc_eng_dmn_conn_thread_helper.c
Executable file
@ -0,0 +1,399 @@
|
|||||||
|
/* 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 <stdio.h>
|
||||||
|
|
||||||
|
#include "log_util.h"
|
||||||
|
#include "platform_lib_includes.h"
|
||||||
|
#include "loc_eng_dmn_conn_thread_helper.h"
|
||||||
|
|
||||||
|
/*===========================================================================
|
||||||
|
FUNCTION thelper_signal_init
|
||||||
|
|
||||||
|
DESCRIPTION
|
||||||
|
This function will initialize the conditional variable resources.
|
||||||
|
|
||||||
|
thelper - thelper instance
|
||||||
|
|
||||||
|
DEPENDENCIES
|
||||||
|
None
|
||||||
|
|
||||||
|
RETURN VALUE
|
||||||
|
0: success or negative value for failure
|
||||||
|
|
||||||
|
SIDE EFFECTS
|
||||||
|
N/A
|
||||||
|
|
||||||
|
===========================================================================*/
|
||||||
|
int thelper_signal_init(struct loc_eng_dmn_conn_thelper * thelper)
|
||||||
|
{
|
||||||
|
int result;
|
||||||
|
thelper->thread_exit = 0;
|
||||||
|
thelper->thread_ready = 0;
|
||||||
|
result = pthread_cond_init( &thelper->thread_cond, NULL);
|
||||||
|
if (result) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
result = pthread_mutex_init(&thelper->thread_mutex, NULL);
|
||||||
|
if (result) {
|
||||||
|
pthread_cond_destroy(&thelper->thread_cond);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*===========================================================================
|
||||||
|
FUNCTION
|
||||||
|
|
||||||
|
DESCRIPTION
|
||||||
|
This function will destroy the conditional variable resources
|
||||||
|
|
||||||
|
thelper - pointer to thelper instance
|
||||||
|
|
||||||
|
DEPENDENCIES
|
||||||
|
None
|
||||||
|
|
||||||
|
RETURN VALUE
|
||||||
|
0: success or negative value for failure
|
||||||
|
|
||||||
|
SIDE EFFECTS
|
||||||
|
N/A
|
||||||
|
|
||||||
|
===========================================================================*/
|
||||||
|
int thelper_signal_destroy(struct loc_eng_dmn_conn_thelper * thelper)
|
||||||
|
{
|
||||||
|
int result, ret_result = 0;
|
||||||
|
result = pthread_cond_destroy( &thelper->thread_cond);
|
||||||
|
if (result) {
|
||||||
|
ret_result = result;
|
||||||
|
}
|
||||||
|
|
||||||
|
result = pthread_mutex_destroy(&thelper->thread_mutex);
|
||||||
|
if (result) {
|
||||||
|
ret_result = result;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret_result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*===========================================================================
|
||||||
|
FUNCTION thelper_signal_wait
|
||||||
|
|
||||||
|
DESCRIPTION
|
||||||
|
This function will be blocked on the conditional variable until thelper_signal_ready
|
||||||
|
is called
|
||||||
|
|
||||||
|
thelper - pointer to thelper instance
|
||||||
|
|
||||||
|
DEPENDENCIES
|
||||||
|
None
|
||||||
|
|
||||||
|
RETURN VALUE
|
||||||
|
0: success or negative value for failure
|
||||||
|
|
||||||
|
SIDE EFFECTS
|
||||||
|
N/A
|
||||||
|
|
||||||
|
===========================================================================*/
|
||||||
|
int thelper_signal_wait(struct loc_eng_dmn_conn_thelper * thelper)
|
||||||
|
{
|
||||||
|
int result = 0;
|
||||||
|
|
||||||
|
pthread_mutex_lock(&thelper->thread_mutex);
|
||||||
|
if (!thelper->thread_ready && !thelper->thread_exit) {
|
||||||
|
result = pthread_cond_wait(&thelper->thread_cond, &thelper->thread_mutex);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (thelper->thread_exit) {
|
||||||
|
result = -1;
|
||||||
|
}
|
||||||
|
pthread_mutex_unlock(&thelper->thread_mutex);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*===========================================================================
|
||||||
|
FUNCTION thelper_signal_ready
|
||||||
|
|
||||||
|
DESCRIPTION
|
||||||
|
This function will wake up the conditional variable
|
||||||
|
|
||||||
|
thelper - pointer to thelper instance
|
||||||
|
|
||||||
|
DEPENDENCIES
|
||||||
|
None
|
||||||
|
|
||||||
|
RETURN VALUE
|
||||||
|
0: success or negative value for failure
|
||||||
|
|
||||||
|
SIDE EFFECTS
|
||||||
|
N/A
|
||||||
|
|
||||||
|
===========================================================================*/
|
||||||
|
int thelper_signal_ready(struct loc_eng_dmn_conn_thelper * thelper)
|
||||||
|
{
|
||||||
|
int result;
|
||||||
|
|
||||||
|
LOC_LOGD("%s:%d] 0x%lx\n", __func__, __LINE__, (long) thelper);
|
||||||
|
|
||||||
|
pthread_mutex_lock(&thelper->thread_mutex);
|
||||||
|
thelper->thread_ready = 1;
|
||||||
|
result = pthread_cond_signal(&thelper->thread_cond);
|
||||||
|
pthread_mutex_unlock(&thelper->thread_mutex);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*===========================================================================
|
||||||
|
FUNCTION thelper_signal_block
|
||||||
|
|
||||||
|
DESCRIPTION
|
||||||
|
This function will set the thread ready to 0 to block the thelper_signal_wait
|
||||||
|
|
||||||
|
thelper - pointer to thelper instance
|
||||||
|
|
||||||
|
DEPENDENCIES
|
||||||
|
None
|
||||||
|
|
||||||
|
RETURN VALUE
|
||||||
|
if thread_ready is set
|
||||||
|
|
||||||
|
SIDE EFFECTS
|
||||||
|
N/A
|
||||||
|
|
||||||
|
===========================================================================*/
|
||||||
|
int thelper_signal_block(struct loc_eng_dmn_conn_thelper * thelper)
|
||||||
|
{
|
||||||
|
int result = thelper->thread_ready;
|
||||||
|
|
||||||
|
LOC_LOGD("%s:%d] 0x%lx\n", __func__, __LINE__, (long) thelper);
|
||||||
|
|
||||||
|
pthread_mutex_lock(&thelper->thread_mutex);
|
||||||
|
thelper->thread_ready = 0;
|
||||||
|
pthread_mutex_unlock(&thelper->thread_mutex);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*===========================================================================
|
||||||
|
FUNCTION thelper_main
|
||||||
|
|
||||||
|
DESCRIPTION
|
||||||
|
This function is the main thread. It will be launched as a child thread
|
||||||
|
|
||||||
|
data - pointer to the instance
|
||||||
|
|
||||||
|
DEPENDENCIES
|
||||||
|
None
|
||||||
|
|
||||||
|
RETURN VALUE
|
||||||
|
NULL
|
||||||
|
|
||||||
|
SIDE EFFECTS
|
||||||
|
N/A
|
||||||
|
|
||||||
|
===========================================================================*/
|
||||||
|
static void * thelper_main(void *data)
|
||||||
|
{
|
||||||
|
int result = 0;
|
||||||
|
struct loc_eng_dmn_conn_thelper * thelper = (struct loc_eng_dmn_conn_thelper *) data;
|
||||||
|
|
||||||
|
if (thelper->thread_proc_init) {
|
||||||
|
result = thelper->thread_proc_init(thelper->thread_context);
|
||||||
|
if (result < 0) {
|
||||||
|
thelper->thread_exit = 1;
|
||||||
|
thelper_signal_ready(thelper);
|
||||||
|
LOC_LOGE("%s:%d] error: 0x%lx\n", __func__, __LINE__, (long) thelper);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
thelper_signal_ready(thelper);
|
||||||
|
|
||||||
|
if (thelper->thread_proc_pre) {
|
||||||
|
result = thelper->thread_proc_pre(thelper->thread_context);
|
||||||
|
if (result < 0) {
|
||||||
|
thelper->thread_exit = 1;
|
||||||
|
LOC_LOGE("%s:%d] error: 0x%lx\n", __func__, __LINE__, (long) thelper);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
do {
|
||||||
|
if (thelper->thread_proc) {
|
||||||
|
result = thelper->thread_proc(thelper->thread_context);
|
||||||
|
if (result < 0) {
|
||||||
|
thelper->thread_exit = 1;
|
||||||
|
LOC_LOGE("%s:%d] error: 0x%lx\n", __func__, __LINE__, (long) thelper);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} while (thelper->thread_exit == 0);
|
||||||
|
|
||||||
|
if (thelper->thread_proc_post) {
|
||||||
|
result = thelper->thread_proc_post(thelper->thread_context);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (result != 0) {
|
||||||
|
LOC_LOGE("%s:%d] error: 0x%lx\n", __func__, __LINE__, (long) thelper);
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void thelper_main_2(void *data)
|
||||||
|
{
|
||||||
|
thelper_main(data);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*===========================================================================
|
||||||
|
FUNCTION loc_eng_dmn_conn_launch_thelper
|
||||||
|
|
||||||
|
DESCRIPTION
|
||||||
|
This function will initialize the thread context and launch the thelper_main
|
||||||
|
|
||||||
|
thelper - pointer to thelper instance
|
||||||
|
thread_proc_init - The initialization function pointer
|
||||||
|
thread_proc_pre - The function to call before task loop and after initialization
|
||||||
|
thread_proc - The task loop
|
||||||
|
thread_proc_post - The function to call after the task loop
|
||||||
|
context - the context for the above four functions
|
||||||
|
|
||||||
|
DEPENDENCIES
|
||||||
|
None
|
||||||
|
|
||||||
|
RETURN VALUE
|
||||||
|
0: success or negative value for failure
|
||||||
|
|
||||||
|
SIDE EFFECTS
|
||||||
|
N/A
|
||||||
|
|
||||||
|
===========================================================================*/
|
||||||
|
int loc_eng_dmn_conn_launch_thelper(struct loc_eng_dmn_conn_thelper * thelper,
|
||||||
|
int (*thread_proc_init) (void * context),
|
||||||
|
int (*thread_proc_pre) (void * context),
|
||||||
|
int (*thread_proc) (void * context),
|
||||||
|
int (*thread_proc_post) (void * context),
|
||||||
|
thelper_create_thread create_thread_cb,
|
||||||
|
void * context)
|
||||||
|
{
|
||||||
|
int result;
|
||||||
|
|
||||||
|
thelper_signal_init(thelper);
|
||||||
|
|
||||||
|
if (context) {
|
||||||
|
thelper->thread_context = context;
|
||||||
|
}
|
||||||
|
|
||||||
|
thelper->thread_proc_init = thread_proc_init;
|
||||||
|
thelper->thread_proc_pre = thread_proc_pre;
|
||||||
|
thelper->thread_proc = thread_proc;
|
||||||
|
thelper->thread_proc_post = thread_proc_post;
|
||||||
|
|
||||||
|
LOC_LOGD("%s:%d] 0x%lx call pthread_create\n", __func__, __LINE__, (long) thelper);
|
||||||
|
if (create_thread_cb) {
|
||||||
|
result = 0;
|
||||||
|
thelper->thread_id = create_thread_cb("loc_eng_dmn_conn",
|
||||||
|
thelper_main_2, (void *)thelper);
|
||||||
|
} else {
|
||||||
|
result = pthread_create(&thelper->thread_id, NULL,
|
||||||
|
thelper_main, (void *)thelper);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (result != 0) {
|
||||||
|
LOC_LOGE("%s:%d] 0x%lx\n", __func__, __LINE__, (long) thelper);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
LOC_LOGD("%s:%d] 0x%lx pthread_create done\n", __func__, __LINE__, (long) thelper);
|
||||||
|
|
||||||
|
thelper_signal_wait(thelper);
|
||||||
|
|
||||||
|
LOC_LOGD("%s:%d] 0x%lx pthread ready\n", __func__, __LINE__, (long) thelper);
|
||||||
|
return thelper->thread_exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*===========================================================================
|
||||||
|
FUNCTION loc_eng_dmn_conn_unblock_thelper
|
||||||
|
|
||||||
|
DESCRIPTION
|
||||||
|
This function unblocks thelper_main to release the thread
|
||||||
|
|
||||||
|
thelper - pointer to thelper instance
|
||||||
|
|
||||||
|
DEPENDENCIES
|
||||||
|
None
|
||||||
|
|
||||||
|
RETURN VALUE
|
||||||
|
0: success
|
||||||
|
|
||||||
|
SIDE EFFECTS
|
||||||
|
N/A
|
||||||
|
|
||||||
|
===========================================================================*/
|
||||||
|
int loc_eng_dmn_conn_unblock_thelper(struct loc_eng_dmn_conn_thelper * thelper)
|
||||||
|
{
|
||||||
|
LOC_LOGD("%s:%d] 0x%lx\n", __func__, __LINE__, (long) thelper);
|
||||||
|
thelper->thread_exit = 1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*===========================================================================
|
||||||
|
FUNCTION loc_eng_dmn_conn_join_thelper
|
||||||
|
|
||||||
|
thelper - pointer to thelper instance
|
||||||
|
|
||||||
|
DESCRIPTION
|
||||||
|
This function will wait for the thread of thelper_main to finish
|
||||||
|
|
||||||
|
DEPENDENCIES
|
||||||
|
None
|
||||||
|
|
||||||
|
RETURN VALUE
|
||||||
|
0: success or negative value for failure
|
||||||
|
|
||||||
|
SIDE EFFECTS
|
||||||
|
N/A
|
||||||
|
|
||||||
|
===========================================================================*/
|
||||||
|
int loc_eng_dmn_conn_join_thelper(struct loc_eng_dmn_conn_thelper * thelper)
|
||||||
|
{
|
||||||
|
int result;
|
||||||
|
|
||||||
|
LOC_LOGD("%s:%d] 0x%lx\n", __func__, __LINE__, (long) thelper);
|
||||||
|
result = pthread_join(thelper->thread_id, NULL);
|
||||||
|
if (result != 0) {
|
||||||
|
LOC_LOGE("%s:%d] 0x%lx\n", __func__, __LINE__, (long) thelper);
|
||||||
|
}
|
||||||
|
LOC_LOGD("%s:%d] 0x%lx\n", __func__, __LINE__, (long) thelper);
|
||||||
|
|
||||||
|
thelper_signal_destroy(thelper);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
74
gps/loc_api/libloc_api_50001/loc_eng_dmn_conn_thread_helper.h
Executable file
74
gps/loc_api/libloc_api_50001/loc_eng_dmn_conn_thread_helper.h
Executable file
@ -0,0 +1,74 @@
|
|||||||
|
/* 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 __LOC_ENG_DMN_CONN_THREAD_HELPER_H__
|
||||||
|
#define __LOC_ENG_DMN_CONN_THREAD_HELPER_H__
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif /* __cplusplus */
|
||||||
|
|
||||||
|
#include <pthread.h>
|
||||||
|
|
||||||
|
struct loc_eng_dmn_conn_thelper {
|
||||||
|
unsigned char thread_exit;
|
||||||
|
unsigned char thread_ready;
|
||||||
|
pthread_cond_t thread_cond;
|
||||||
|
pthread_mutex_t thread_mutex;
|
||||||
|
pthread_t thread_id;
|
||||||
|
void * thread_context;
|
||||||
|
int (*thread_proc_init) (void * context);
|
||||||
|
int (*thread_proc_pre) (void * context);
|
||||||
|
int (*thread_proc) (void * context);
|
||||||
|
int (*thread_proc_post) (void * context);
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef pthread_t (* thelper_create_thread)(const char* name, void (*start)(void *), void* arg);
|
||||||
|
int loc_eng_dmn_conn_launch_thelper(struct loc_eng_dmn_conn_thelper * thelper,
|
||||||
|
int (*thread_proc_init) (void * context),
|
||||||
|
int (*thread_proc_pre) (void * context),
|
||||||
|
int (*thread_proc) (void * context),
|
||||||
|
int (*thread_proc_post) (void * context),
|
||||||
|
thelper_create_thread create_thread_cb,
|
||||||
|
void * context);
|
||||||
|
|
||||||
|
int loc_eng_dmn_conn_unblock_thelper(struct loc_eng_dmn_conn_thelper * thelper);
|
||||||
|
int loc_eng_dmn_conn_join_thelper(struct loc_eng_dmn_conn_thelper * thelper);
|
||||||
|
|
||||||
|
/* if only need to use signal */
|
||||||
|
int thelper_signal_init(struct loc_eng_dmn_conn_thelper * thelper);
|
||||||
|
int thelper_signal_destroy(struct loc_eng_dmn_conn_thelper * thelper);
|
||||||
|
int thelper_signal_wait(struct loc_eng_dmn_conn_thelper * thelper);
|
||||||
|
int thelper_signal_ready(struct loc_eng_dmn_conn_thelper * thelper);
|
||||||
|
int thelper_signal_block(struct loc_eng_dmn_conn_thelper * thelper);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif /* __cplusplus */
|
||||||
|
|
||||||
|
#endif /* __LOC_ENG_DMN_CONN_THREAD_HELPER_H__ */
|
35
gps/loc_api/libloc_api_50001/loc_eng_log.cpp
Executable file
35
gps/loc_api/libloc_api_50001/loc_eng_log.cpp
Executable file
@ -0,0 +1,35 @@
|
|||||||
|
/* Copyright (c) 2011-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.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define LOG_NDDEBUG 0
|
||||||
|
#define LOG_TAG "LocSvc_eng"
|
||||||
|
|
||||||
|
#include "loc_log.h"
|
||||||
|
#include "loc_eng_log.h"
|
||||||
|
|
44
gps/loc_api/libloc_api_50001/loc_eng_log.h
Executable file
44
gps/loc_api/libloc_api_50001/loc_eng_log.h
Executable file
@ -0,0 +1,44 @@
|
|||||||
|
/* Copyright (c) 2011-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_ENG_LOG_H
|
||||||
|
#define LOC_ENG_LOG_H
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C"
|
||||||
|
{
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <ctype.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* LOC_ENG_LOG_H */
|
296
gps/loc_api/libloc_api_50001/loc_eng_msg.h
Executable file
296
gps/loc_api/libloc_api_50001/loc_eng_msg.h
Executable file
@ -0,0 +1,296 @@
|
|||||||
|
/* Copyright (c) 2011-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_ENG_MSG_H
|
||||||
|
#define LOC_ENG_MSG_H
|
||||||
|
|
||||||
|
|
||||||
|
#include "hardware/gps.h"
|
||||||
|
#include <gps_extended.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <log_util.h>
|
||||||
|
#include <loc_eng_log.h>
|
||||||
|
#include <loc_eng.h>
|
||||||
|
#include <MsgTask.h>
|
||||||
|
#include <LocEngAdapter.h>
|
||||||
|
|
||||||
|
#ifndef SSID_BUF_SIZE
|
||||||
|
#define SSID_BUF_SIZE (32+1)
|
||||||
|
#endif
|
||||||
|
#ifdef USE_GLIB
|
||||||
|
|
||||||
|
#include <glib.h>
|
||||||
|
|
||||||
|
#endif /* USE_GLIB */
|
||||||
|
#include "platform_lib_includes.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif /* __cplusplus */
|
||||||
|
|
||||||
|
using namespace loc_core;
|
||||||
|
|
||||||
|
struct LocEngPositionMode : public LocMsg {
|
||||||
|
LocEngAdapter* mAdapter;
|
||||||
|
const LocPosMode mPosMode;
|
||||||
|
LocEngPositionMode(LocEngAdapter* adapter, LocPosMode &mode);
|
||||||
|
virtual void proc() const;
|
||||||
|
virtual void log() const;
|
||||||
|
void send() const;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
struct LocEngStartFix : public LocMsg {
|
||||||
|
LocEngAdapter* mAdapter;
|
||||||
|
LocEngStartFix(LocEngAdapter* adapter);
|
||||||
|
virtual void proc() const;
|
||||||
|
void locallog() const;
|
||||||
|
virtual void log() const;
|
||||||
|
void send() const;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct LocEngStopFix : public LocMsg {
|
||||||
|
LocEngAdapter* mAdapter;
|
||||||
|
LocEngStopFix(LocEngAdapter* adapter);
|
||||||
|
virtual void proc() const;
|
||||||
|
void locallog() const;
|
||||||
|
virtual void log() const;
|
||||||
|
void send() const;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct LocEngReportPosition : public LocMsg {
|
||||||
|
LocAdapterBase* mAdapter;
|
||||||
|
const UlpLocation mLocation;
|
||||||
|
const GpsLocationExtended mLocationExtended;
|
||||||
|
const void* mLocationExt;
|
||||||
|
const enum loc_sess_status mStatus;
|
||||||
|
const LocPosTechMask mTechMask;
|
||||||
|
LocEngReportPosition(LocAdapterBase* adapter,
|
||||||
|
UlpLocation &loc,
|
||||||
|
GpsLocationExtended &locExtended,
|
||||||
|
void* locExt,
|
||||||
|
enum loc_sess_status st,
|
||||||
|
LocPosTechMask technology);
|
||||||
|
virtual void proc() const;
|
||||||
|
void locallog() const;
|
||||||
|
virtual void log() const;
|
||||||
|
void send() const;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct LocEngReportSv : public LocMsg {
|
||||||
|
LocAdapterBase* mAdapter;
|
||||||
|
const GpsSvStatus mSvStatus;
|
||||||
|
const GpsLocationExtended mLocationExtended;
|
||||||
|
const void* mSvExt;
|
||||||
|
LocEngReportSv(LocAdapterBase* adapter,
|
||||||
|
GpsSvStatus &sv,
|
||||||
|
GpsLocationExtended &locExtended,
|
||||||
|
void* svExtended);
|
||||||
|
virtual void proc() const;
|
||||||
|
void locallog() const;
|
||||||
|
virtual void log() const;
|
||||||
|
void send() const;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct LocEngReportStatus : public LocMsg {
|
||||||
|
LocAdapterBase* mAdapter;
|
||||||
|
const GpsStatusValue mStatus;
|
||||||
|
LocEngReportStatus(LocAdapterBase* adapter,
|
||||||
|
GpsStatusValue engineStatus);
|
||||||
|
virtual void proc() const;
|
||||||
|
void locallog() const;
|
||||||
|
virtual void log() const;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct LocEngReportNmea : public LocMsg {
|
||||||
|
void* mLocEng;
|
||||||
|
char* const mNmea;
|
||||||
|
const int mLen;
|
||||||
|
LocEngReportNmea(void* locEng,
|
||||||
|
const char* data, int len);
|
||||||
|
inline virtual ~LocEngReportNmea()
|
||||||
|
{
|
||||||
|
delete[] mNmea;
|
||||||
|
}
|
||||||
|
virtual void proc() const;
|
||||||
|
void locallog() const;
|
||||||
|
virtual void log() const;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct LocEngReportXtraServer : public LocMsg {
|
||||||
|
void* mLocEng;
|
||||||
|
int mMaxLen;
|
||||||
|
char *mServers;
|
||||||
|
LocEngReportXtraServer(void* locEng,
|
||||||
|
const char *url1, const char *url2,
|
||||||
|
const char *url3, const int maxlength);
|
||||||
|
inline virtual ~LocEngReportXtraServer()
|
||||||
|
{
|
||||||
|
delete[] mServers;
|
||||||
|
}
|
||||||
|
virtual void proc() const;
|
||||||
|
void locallog() const;
|
||||||
|
virtual void log() const;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct LocEngSuplEsOpened : public LocMsg {
|
||||||
|
void* mLocEng;
|
||||||
|
LocEngSuplEsOpened(void* locEng);
|
||||||
|
virtual void proc() const;
|
||||||
|
void locallog() const;
|
||||||
|
virtual void log() const;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct LocEngSuplEsClosed : public LocMsg {
|
||||||
|
void* mLocEng;
|
||||||
|
LocEngSuplEsClosed(void* locEng);
|
||||||
|
virtual void proc() const;
|
||||||
|
void locallog() const;
|
||||||
|
virtual void log() const;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct LocEngRequestSuplEs : public LocMsg {
|
||||||
|
void* mLocEng;
|
||||||
|
const int mID;
|
||||||
|
LocEngRequestSuplEs(void* locEng, int id);
|
||||||
|
virtual void proc() const;
|
||||||
|
void locallog() const;
|
||||||
|
virtual void log() const;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct LocEngRequestATL : public LocMsg {
|
||||||
|
void* mLocEng;
|
||||||
|
const int mID;
|
||||||
|
const AGpsExtType mType;
|
||||||
|
LocEngRequestATL(void* locEng, int id,
|
||||||
|
AGpsExtType agps_type);
|
||||||
|
virtual void proc() const;
|
||||||
|
void locallog() const;
|
||||||
|
virtual void log() const;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct LocEngReleaseATL : public LocMsg {
|
||||||
|
void* mLocEng;
|
||||||
|
const int mID;
|
||||||
|
LocEngReleaseATL(void* locEng, int id);
|
||||||
|
virtual void proc() const;
|
||||||
|
void locallog() const;
|
||||||
|
virtual void log() const;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct LocEngReqRelBIT : public LocMsg {
|
||||||
|
void* mLocEng;
|
||||||
|
const AGpsExtType mType;
|
||||||
|
const int mIPv4Addr;
|
||||||
|
char* const mIPv6Addr;
|
||||||
|
const bool mIsReq;
|
||||||
|
LocEngReqRelBIT(void* instance, AGpsExtType type,
|
||||||
|
int ipv4, char* ipv6, bool isReq);
|
||||||
|
virtual ~LocEngReqRelBIT();
|
||||||
|
virtual void proc() const;
|
||||||
|
void locallog() const;
|
||||||
|
virtual void log() const;
|
||||||
|
void send() const;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct LocEngReqRelWifi : public LocMsg {
|
||||||
|
void* mLocEng;
|
||||||
|
const AGpsExtType mType;
|
||||||
|
const loc_if_req_sender_id_e_type mSenderId;
|
||||||
|
char* const mSSID;
|
||||||
|
char* const mPassword;
|
||||||
|
const bool mIsReq;
|
||||||
|
LocEngReqRelWifi(void* locEng, AGpsExtType type,
|
||||||
|
loc_if_req_sender_id_e_type sender_id,
|
||||||
|
char* s, char* p, bool isReq);
|
||||||
|
virtual ~LocEngReqRelWifi();
|
||||||
|
virtual void proc() const;
|
||||||
|
void locallog() const;
|
||||||
|
virtual void log() const;
|
||||||
|
void send() const;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct LocEngRequestXtra : public LocMsg {
|
||||||
|
void* mLocEng;
|
||||||
|
LocEngRequestXtra(void* locEng);
|
||||||
|
virtual void proc() const;
|
||||||
|
void locallog() const;
|
||||||
|
virtual void log() const;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct LocEngRequestTime : public LocMsg {
|
||||||
|
void* mLocEng;
|
||||||
|
LocEngRequestTime(void* locEng);
|
||||||
|
virtual void proc() const;
|
||||||
|
void locallog() const;
|
||||||
|
virtual void log() const;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct LocEngRequestNi : public LocMsg {
|
||||||
|
void* mLocEng;
|
||||||
|
const GpsNiNotification mNotify;
|
||||||
|
const void *mPayload;
|
||||||
|
LocEngRequestNi(void* locEng,
|
||||||
|
GpsNiNotification ¬if,
|
||||||
|
const void* data);
|
||||||
|
virtual void proc() const;
|
||||||
|
void locallog() const;
|
||||||
|
virtual void log() const;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct LocEngDown : public LocMsg {
|
||||||
|
void* mLocEng;
|
||||||
|
LocEngDown(void* locEng);
|
||||||
|
virtual void proc() const;
|
||||||
|
void locallog() const;
|
||||||
|
virtual void log() const;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct LocEngUp : public LocMsg {
|
||||||
|
void* mLocEng;
|
||||||
|
LocEngUp(void* locEng);
|
||||||
|
virtual void proc() const;
|
||||||
|
void locallog() const;
|
||||||
|
virtual void log() const;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct LocEngGetZpp : public LocMsg {
|
||||||
|
LocEngAdapter* mAdapter;
|
||||||
|
LocEngGetZpp(LocEngAdapter* adapter);
|
||||||
|
virtual void proc() const;
|
||||||
|
void locallog() const;
|
||||||
|
virtual void log() const;
|
||||||
|
void send() const;
|
||||||
|
};
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif /* __cplusplus */
|
||||||
|
|
||||||
|
#endif /* LOC_ENG_MSG_H */
|
355
gps/loc_api/libloc_api_50001/loc_eng_ni.cpp
Executable file
355
gps/loc_api/libloc_api_50001/loc_eng_ni.cpp
Executable file
@ -0,0 +1,355 @@
|
|||||||
|
/* Copyright (c) 2009-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.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define LOG_NDDEBUG 0
|
||||||
|
#define LOG_TAG "LocSvc_eng"
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <sys/time.h>
|
||||||
|
#include <pthread.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include <MsgTask.h>
|
||||||
|
|
||||||
|
#include <loc_eng.h>
|
||||||
|
|
||||||
|
#include "log_util.h"
|
||||||
|
#include "platform_lib_includes.h"
|
||||||
|
|
||||||
|
using namespace loc_core;
|
||||||
|
|
||||||
|
/*=============================================================================
|
||||||
|
*
|
||||||
|
* DATA DECLARATION
|
||||||
|
*
|
||||||
|
*============================================================================*/
|
||||||
|
|
||||||
|
/*=============================================================================
|
||||||
|
*
|
||||||
|
* FUNCTION DECLARATIONS
|
||||||
|
*
|
||||||
|
*============================================================================*/
|
||||||
|
static void* ni_thread_proc(void *args);
|
||||||
|
|
||||||
|
struct LocEngInformNiResponse : public LocMsg {
|
||||||
|
LocEngAdapter* mAdapter;
|
||||||
|
const GpsUserResponseType mResponse;
|
||||||
|
const void *mPayload;
|
||||||
|
inline LocEngInformNiResponse(LocEngAdapter* adapter,
|
||||||
|
GpsUserResponseType resp,
|
||||||
|
const void* data) :
|
||||||
|
LocMsg(), mAdapter(adapter),
|
||||||
|
mResponse(resp), mPayload(data)
|
||||||
|
{
|
||||||
|
locallog();
|
||||||
|
}
|
||||||
|
inline ~LocEngInformNiResponse()
|
||||||
|
{
|
||||||
|
// this is a bit weird since mPayload is not
|
||||||
|
// allocated by this class. But there is no better way.
|
||||||
|
// mPayload actually won't be NULL here.
|
||||||
|
free((void*)mPayload);
|
||||||
|
}
|
||||||
|
inline virtual void proc() const
|
||||||
|
{
|
||||||
|
mAdapter->informNiResponse(mResponse, mPayload);
|
||||||
|
}
|
||||||
|
inline void locallog() const
|
||||||
|
{
|
||||||
|
LOC_LOGV("LocEngInformNiResponse - "
|
||||||
|
"response: %s\n mPayload: %p",
|
||||||
|
loc_get_ni_response_name(mResponse),
|
||||||
|
mPayload);
|
||||||
|
}
|
||||||
|
inline virtual void log() const
|
||||||
|
{
|
||||||
|
locallog();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/*===========================================================================
|
||||||
|
|
||||||
|
FUNCTION loc_eng_ni_request_handler
|
||||||
|
|
||||||
|
DESCRIPTION
|
||||||
|
Displays the NI request and awaits user input. If a previous request is
|
||||||
|
in session, it is ignored.
|
||||||
|
|
||||||
|
RETURN VALUE
|
||||||
|
none
|
||||||
|
|
||||||
|
===========================================================================*/
|
||||||
|
void loc_eng_ni_request_handler(loc_eng_data_s_type &loc_eng_data,
|
||||||
|
const GpsNiNotification *notif,
|
||||||
|
const void* passThrough)
|
||||||
|
{
|
||||||
|
ENTRY_LOG();
|
||||||
|
char lcs_addr[32]; // Decoded LCS address for UMTS CP NI
|
||||||
|
loc_eng_ni_data_s_type* loc_eng_ni_data_p = &loc_eng_data.loc_eng_ni_data;
|
||||||
|
|
||||||
|
if (NULL == loc_eng_data.ni_notify_cb) {
|
||||||
|
EXIT_LOG(%s, "loc_eng_ni_init hasn't happened yet.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If busy, use default or deny */
|
||||||
|
if (NULL != loc_eng_ni_data_p->rawRequest)
|
||||||
|
{
|
||||||
|
/* XXX Consider sending a NO RESPONSE reply or queue the request */
|
||||||
|
LOC_LOGW("loc_eng_ni_request_handler, notification in progress, new NI request ignored, type: %d",
|
||||||
|
notif->ni_type);
|
||||||
|
if (NULL != passThrough) {
|
||||||
|
free((void*)passThrough);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
/* Save request */
|
||||||
|
loc_eng_ni_data_p->rawRequest = (void*)passThrough;
|
||||||
|
|
||||||
|
/* Fill in notification */
|
||||||
|
((GpsNiNotification*)notif)->notification_id = loc_eng_ni_data_p->reqID;
|
||||||
|
|
||||||
|
if (notif->notify_flags == GPS_NI_PRIVACY_OVERRIDE)
|
||||||
|
{
|
||||||
|
loc_eng_mute_one_session(loc_eng_data);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Log requestor ID and text for debugging */
|
||||||
|
LOC_LOGI("Notification: notif_type: %d, timeout: %d, default_resp: %d", notif->ni_type, notif->timeout, notif->default_response);
|
||||||
|
LOC_LOGI(" requestor_id: %s (encoding: %d)", notif->requestor_id, notif->requestor_id_encoding);
|
||||||
|
LOC_LOGI(" text: %s text (encoding: %d)", notif->text, notif->text_encoding);
|
||||||
|
if (notif->extras[0])
|
||||||
|
{
|
||||||
|
LOC_LOGI(" extras: %s", notif->extras);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* For robustness, spawn a thread at this point to timeout to clear up the notification status, even though
|
||||||
|
* the OEM layer in java does not do so.
|
||||||
|
**/
|
||||||
|
loc_eng_ni_data_p->respTimeLeft = 5 + (notif->timeout != 0 ? notif->timeout : LOC_NI_NO_RESPONSE_TIME);
|
||||||
|
LOC_LOGI("Automatically sends 'no response' in %d seconds (to clear status)\n", loc_eng_ni_data_p->respTimeLeft);
|
||||||
|
|
||||||
|
int rc = 0;
|
||||||
|
rc = pthread_create(&loc_eng_ni_data_p->thread, NULL, ni_thread_proc, &loc_eng_data);
|
||||||
|
if (rc)
|
||||||
|
{
|
||||||
|
LOC_LOGE("Loc NI thread is not created.\n");
|
||||||
|
}
|
||||||
|
rc = pthread_detach(loc_eng_ni_data_p->thread);
|
||||||
|
if (rc)
|
||||||
|
{
|
||||||
|
LOC_LOGE("Loc NI thread is not detached.\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
CALLBACK_LOG_CALLFLOW("ni_notify_cb - id", %d, notif->notification_id);
|
||||||
|
loc_eng_data.ni_notify_cb((GpsNiNotification*)notif);
|
||||||
|
}
|
||||||
|
EXIT_LOG(%s, VOID_RET);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*===========================================================================
|
||||||
|
|
||||||
|
FUNCTION ni_thread_proc
|
||||||
|
|
||||||
|
===========================================================================*/
|
||||||
|
static void* ni_thread_proc(void *args)
|
||||||
|
{
|
||||||
|
ENTRY_LOG();
|
||||||
|
|
||||||
|
loc_eng_data_s_type* loc_eng_data_p = (loc_eng_data_s_type*)args;
|
||||||
|
loc_eng_ni_data_s_type* loc_eng_ni_data_p = &loc_eng_data_p->loc_eng_ni_data;
|
||||||
|
int rc = 0; /* return code from pthread calls */
|
||||||
|
|
||||||
|
struct timeval present_time;
|
||||||
|
struct timespec expire_time;
|
||||||
|
|
||||||
|
LOC_LOGD("Starting Loc NI thread...\n");
|
||||||
|
pthread_mutex_lock(&loc_eng_ni_data_p->tLock);
|
||||||
|
/* Calculate absolute expire time */
|
||||||
|
gettimeofday(&present_time, NULL);
|
||||||
|
expire_time.tv_sec = present_time.tv_sec + loc_eng_ni_data_p->respTimeLeft;
|
||||||
|
expire_time.tv_nsec = present_time.tv_usec * 1000;
|
||||||
|
LOC_LOGD("ni_thread_proc-Time out set for abs time %ld with delay %d sec\n",
|
||||||
|
(long) expire_time.tv_sec, loc_eng_ni_data_p->respTimeLeft );
|
||||||
|
|
||||||
|
while (!loc_eng_ni_data_p->respRecvd)
|
||||||
|
{
|
||||||
|
rc = pthread_cond_timedwait(&loc_eng_ni_data_p->tCond,
|
||||||
|
&loc_eng_ni_data_p->tLock,
|
||||||
|
&expire_time);
|
||||||
|
if (rc == ETIMEDOUT)
|
||||||
|
{
|
||||||
|
loc_eng_ni_data_p->resp = GPS_NI_RESPONSE_NORESP;
|
||||||
|
LOC_LOGD("ni_thread_proc-Thread time out after valting for specified time. Ret Val %d\n",rc );
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
LOC_LOGD("ni_thread_proc-Java layer has sent us a user response and return value from "
|
||||||
|
"pthread_cond_timedwait = %d\n",rc );
|
||||||
|
loc_eng_ni_data_p->respRecvd = FALSE; /* Reset the user response flag for the next session*/
|
||||||
|
|
||||||
|
// adding this check to support modem restart, in which case, we need the thread
|
||||||
|
// to exit without calling sending data. We made sure that rawRequest is NULL in
|
||||||
|
// loc_eng_ni_reset_on_engine_restart()
|
||||||
|
LocEngAdapter* adapter = loc_eng_data_p->adapter;
|
||||||
|
LocEngInformNiResponse *msg = NULL;
|
||||||
|
|
||||||
|
if (NULL != loc_eng_ni_data_p->rawRequest) {
|
||||||
|
msg = new LocEngInformNiResponse(adapter,
|
||||||
|
loc_eng_ni_data_p->resp,
|
||||||
|
loc_eng_ni_data_p->rawRequest);
|
||||||
|
loc_eng_ni_data_p->rawRequest = NULL;
|
||||||
|
}
|
||||||
|
pthread_mutex_unlock(&loc_eng_ni_data_p->tLock);
|
||||||
|
|
||||||
|
loc_eng_ni_data_p->respTimeLeft = 0;
|
||||||
|
loc_eng_ni_data_p->reqID++;
|
||||||
|
|
||||||
|
if (NULL != msg) {
|
||||||
|
adapter->sendMsg(msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
EXIT_LOG(%s, VOID_RET);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
void loc_eng_ni_reset_on_engine_restart(loc_eng_data_s_type &loc_eng_data)
|
||||||
|
{
|
||||||
|
ENTRY_LOG();
|
||||||
|
loc_eng_ni_data_s_type* loc_eng_ni_data_p = &loc_eng_data.loc_eng_ni_data;
|
||||||
|
|
||||||
|
if (NULL == loc_eng_data.ni_notify_cb) {
|
||||||
|
EXIT_LOG(%s, "loc_eng_ni_init hasn't happened yet.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// only if modem has requested but then died.
|
||||||
|
if (NULL != loc_eng_ni_data_p->rawRequest) {
|
||||||
|
free(loc_eng_ni_data_p->rawRequest);
|
||||||
|
loc_eng_ni_data_p->rawRequest = NULL;
|
||||||
|
|
||||||
|
pthread_mutex_lock(&loc_eng_ni_data_p->tLock);
|
||||||
|
// the goal is to wake up ni_thread_proc
|
||||||
|
// and let it exit.
|
||||||
|
loc_eng_ni_data_p->respRecvd = TRUE;
|
||||||
|
pthread_cond_signal(&loc_eng_ni_data_p->tCond);
|
||||||
|
pthread_mutex_unlock(&loc_eng_ni_data_p->tLock);
|
||||||
|
}
|
||||||
|
|
||||||
|
EXIT_LOG(%s, VOID_RET);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*===========================================================================
|
||||||
|
FUNCTION loc_eng_ni_init
|
||||||
|
|
||||||
|
DESCRIPTION
|
||||||
|
This function initializes the NI interface
|
||||||
|
|
||||||
|
DEPENDENCIES
|
||||||
|
NONE
|
||||||
|
|
||||||
|
RETURN VALUE
|
||||||
|
None
|
||||||
|
|
||||||
|
SIDE EFFECTS
|
||||||
|
N/A
|
||||||
|
|
||||||
|
===========================================================================*/
|
||||||
|
void loc_eng_ni_init(loc_eng_data_s_type &loc_eng_data, GpsNiExtCallbacks *callbacks)
|
||||||
|
{
|
||||||
|
ENTRY_LOG_CALLFLOW();
|
||||||
|
|
||||||
|
if(callbacks == NULL)
|
||||||
|
EXIT_LOG(%s, "loc_eng_ni_init: failed, cb is NULL");
|
||||||
|
else if (NULL == callbacks->notify_cb) {
|
||||||
|
EXIT_LOG(%s, "loc_eng_ni_init: failed, no cb.");
|
||||||
|
} else if (NULL != loc_eng_data.ni_notify_cb) {
|
||||||
|
EXIT_LOG(%s, "loc_eng_ni_init: already inited.");
|
||||||
|
} else {
|
||||||
|
loc_eng_ni_data_s_type* loc_eng_ni_data_p = &loc_eng_data.loc_eng_ni_data;
|
||||||
|
loc_eng_ni_data_p->respTimeLeft = 0;
|
||||||
|
loc_eng_ni_data_p->respRecvd = FALSE;
|
||||||
|
loc_eng_ni_data_p->rawRequest = NULL;
|
||||||
|
loc_eng_ni_data_p->reqID = 0;
|
||||||
|
pthread_cond_init(&loc_eng_ni_data_p->tCond, NULL);
|
||||||
|
pthread_mutex_init(&loc_eng_ni_data_p->tLock, NULL);
|
||||||
|
|
||||||
|
loc_eng_data.ni_notify_cb = callbacks->notify_cb;
|
||||||
|
EXIT_LOG(%s, VOID_RET);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*===========================================================================
|
||||||
|
FUNCTION loc_eng_ni_respond
|
||||||
|
|
||||||
|
DESCRIPTION
|
||||||
|
This function receives user response from upper layer framework
|
||||||
|
|
||||||
|
DEPENDENCIES
|
||||||
|
NONE
|
||||||
|
|
||||||
|
RETURN VALUE
|
||||||
|
None
|
||||||
|
|
||||||
|
SIDE EFFECTS
|
||||||
|
N/A
|
||||||
|
|
||||||
|
===========================================================================*/
|
||||||
|
void loc_eng_ni_respond(loc_eng_data_s_type &loc_eng_data,
|
||||||
|
int notif_id, GpsUserResponseType user_response)
|
||||||
|
{
|
||||||
|
ENTRY_LOG_CALLFLOW();
|
||||||
|
loc_eng_ni_data_s_type* loc_eng_ni_data_p = &loc_eng_data.loc_eng_ni_data;
|
||||||
|
|
||||||
|
if (NULL == loc_eng_data.ni_notify_cb) {
|
||||||
|
EXIT_LOG(%s, "loc_eng_ni_init hasn't happened yet.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (notif_id == loc_eng_ni_data_p->reqID &&
|
||||||
|
NULL != loc_eng_ni_data_p->rawRequest)
|
||||||
|
{
|
||||||
|
LOC_LOGI("loc_eng_ni_respond: send user response %d for notif %d", user_response, notif_id);
|
||||||
|
pthread_mutex_lock(&loc_eng_ni_data_p->tLock);
|
||||||
|
loc_eng_ni_data_p->resp = user_response;
|
||||||
|
loc_eng_ni_data_p->respRecvd = TRUE;
|
||||||
|
pthread_cond_signal(&loc_eng_ni_data_p->tCond);
|
||||||
|
pthread_mutex_unlock(&loc_eng_ni_data_p->tLock);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
LOC_LOGE("loc_eng_ni_respond: reqID %d and notif_id %d mismatch or rawRequest %p, response: %d",
|
||||||
|
loc_eng_ni_data_p->reqID, notif_id, loc_eng_ni_data_p->rawRequest, user_response);
|
||||||
|
}
|
||||||
|
|
||||||
|
EXIT_LOG(%s, VOID_RET);
|
||||||
|
}
|
50
gps/loc_api/libloc_api_50001/loc_eng_ni.h
Executable file
50
gps/loc_api/libloc_api_50001/loc_eng_ni.h
Executable file
@ -0,0 +1,50 @@
|
|||||||
|
/* Copyright (c) 2009,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 LOC_ENG_NI_H
|
||||||
|
#define LOC_ENG_NI_H
|
||||||
|
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
|
#define LOC_NI_NO_RESPONSE_TIME 20 /* secs */
|
||||||
|
#define LOC_NI_NOTIF_KEY_ADDRESS "Address"
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
pthread_t thread; /* NI thread */
|
||||||
|
int respTimeLeft; /* examine time for NI response */
|
||||||
|
bool respRecvd; /* NI User reponse received or not from Java layer*/
|
||||||
|
void* rawRequest;
|
||||||
|
int reqID; /* ID to check against response */
|
||||||
|
GpsUserResponseType resp;
|
||||||
|
pthread_cond_t tCond;
|
||||||
|
pthread_mutex_t tLock;
|
||||||
|
} loc_eng_ni_data_s_type;
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* LOC_ENG_NI_H */
|
833
gps/loc_api/libloc_api_50001/loc_eng_nmea.cpp
Executable file
833
gps/loc_api/libloc_api_50001/loc_eng_nmea.cpp
Executable file
@ -0,0 +1,833 @@
|
|||||||
|
/* Copyright (c) 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
|
||||||
|
#define LOG_TAG "LocSvc_eng_nmea"
|
||||||
|
#define GPS_PRN_START 1
|
||||||
|
#define GPS_PRN_END 32
|
||||||
|
#define GLONASS_PRN_START 65
|
||||||
|
#define GLONASS_PRN_END 96
|
||||||
|
#include <loc_eng.h>
|
||||||
|
#include <loc_eng_nmea.h>
|
||||||
|
#include <math.h>
|
||||||
|
#include "log_util.h"
|
||||||
|
|
||||||
|
/*===========================================================================
|
||||||
|
FUNCTION loc_eng_nmea_send
|
||||||
|
|
||||||
|
DESCRIPTION
|
||||||
|
send out NMEA sentence
|
||||||
|
|
||||||
|
DEPENDENCIES
|
||||||
|
NONE
|
||||||
|
|
||||||
|
RETURN VALUE
|
||||||
|
Total length of the nmea sentence
|
||||||
|
|
||||||
|
SIDE EFFECTS
|
||||||
|
N/A
|
||||||
|
|
||||||
|
===========================================================================*/
|
||||||
|
void loc_eng_nmea_send(char *pNmea, int length, loc_eng_data_s_type *loc_eng_data_p)
|
||||||
|
{
|
||||||
|
struct timeval tv;
|
||||||
|
gettimeofday(&tv, (struct timezone *) NULL);
|
||||||
|
int64_t now = tv.tv_sec * 1000LL + tv.tv_usec / 1000;
|
||||||
|
CALLBACK_LOG_CALLFLOW("nmea_cb", %p, pNmea);
|
||||||
|
if (loc_eng_data_p->nmea_cb != NULL)
|
||||||
|
loc_eng_data_p->nmea_cb(now, pNmea, length);
|
||||||
|
LOC_LOGD("NMEA <%s", pNmea);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*===========================================================================
|
||||||
|
FUNCTION loc_eng_nmea_put_checksum
|
||||||
|
|
||||||
|
DESCRIPTION
|
||||||
|
Generate NMEA sentences generated based on position report
|
||||||
|
|
||||||
|
DEPENDENCIES
|
||||||
|
NONE
|
||||||
|
|
||||||
|
RETURN VALUE
|
||||||
|
Total length of the nmea sentence
|
||||||
|
|
||||||
|
SIDE EFFECTS
|
||||||
|
N/A
|
||||||
|
|
||||||
|
===========================================================================*/
|
||||||
|
int loc_eng_nmea_put_checksum(char *pNmea, int maxSize)
|
||||||
|
{
|
||||||
|
uint8_t checksum = 0;
|
||||||
|
int length = 0;
|
||||||
|
|
||||||
|
pNmea++; //skip the $
|
||||||
|
while (*pNmea != '\0')
|
||||||
|
{
|
||||||
|
checksum ^= *pNmea++;
|
||||||
|
length++;
|
||||||
|
}
|
||||||
|
|
||||||
|
int checksumLength = snprintf(pNmea,(maxSize-length-1),"*%02X\r\n", checksum);
|
||||||
|
return (length + checksumLength);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*===========================================================================
|
||||||
|
FUNCTION loc_eng_nmea_generate_pos
|
||||||
|
|
||||||
|
DESCRIPTION
|
||||||
|
Generate NMEA sentences generated based on position report
|
||||||
|
|
||||||
|
DEPENDENCIES
|
||||||
|
NONE
|
||||||
|
|
||||||
|
RETURN VALUE
|
||||||
|
0
|
||||||
|
|
||||||
|
SIDE EFFECTS
|
||||||
|
N/A
|
||||||
|
|
||||||
|
===========================================================================*/
|
||||||
|
void loc_eng_nmea_generate_pos(loc_eng_data_s_type *loc_eng_data_p,
|
||||||
|
const UlpLocation &location,
|
||||||
|
const GpsLocationExtended &locationExtended,
|
||||||
|
unsigned char generate_nmea)
|
||||||
|
{
|
||||||
|
ENTRY_LOG();
|
||||||
|
|
||||||
|
char sentence[NMEA_SENTENCE_MAX_LENGTH] = {0};
|
||||||
|
char* pMarker = sentence;
|
||||||
|
int lengthRemaining = sizeof(sentence);
|
||||||
|
int length = 0;
|
||||||
|
|
||||||
|
time_t utcTime(location.gpsLocation.timestamp/1000);
|
||||||
|
tm * pTm = gmtime(&utcTime);
|
||||||
|
int utcYear = pTm->tm_year % 100; // 2 digit year
|
||||||
|
int utcMonth = pTm->tm_mon + 1; // tm_mon starts at zero
|
||||||
|
int utcDay = pTm->tm_mday;
|
||||||
|
int utcHours = pTm->tm_hour;
|
||||||
|
int utcMinutes = pTm->tm_min;
|
||||||
|
int utcSeconds = pTm->tm_sec;
|
||||||
|
|
||||||
|
if (generate_nmea) {
|
||||||
|
// ------------------
|
||||||
|
// ------$GPGSA------
|
||||||
|
// ------------------
|
||||||
|
|
||||||
|
uint32_t svUsedCount = 0;
|
||||||
|
uint32_t svUsedList[32] = {0};
|
||||||
|
uint32_t mask = loc_eng_data_p->sv_used_mask;
|
||||||
|
for (uint8_t i = 1; mask > 0 && svUsedCount < 32; i++)
|
||||||
|
{
|
||||||
|
if (mask & 1)
|
||||||
|
svUsedList[svUsedCount++] = i;
|
||||||
|
mask = mask >> 1;
|
||||||
|
}
|
||||||
|
// clear the cache so they can't be used again
|
||||||
|
loc_eng_data_p->sv_used_mask = 0;
|
||||||
|
|
||||||
|
char fixType;
|
||||||
|
if (svUsedCount == 0)
|
||||||
|
fixType = '1'; // no fix
|
||||||
|
else if (svUsedCount <= 3)
|
||||||
|
fixType = '2'; // 2D fix
|
||||||
|
else
|
||||||
|
fixType = '3'; // 3D fix
|
||||||
|
|
||||||
|
length = snprintf(pMarker, lengthRemaining, "$GPGSA,A,%c,", fixType);
|
||||||
|
|
||||||
|
if (length < 0 || length >= lengthRemaining)
|
||||||
|
{
|
||||||
|
LOC_LOGE("NMEA Error in string formatting");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
pMarker += length;
|
||||||
|
lengthRemaining -= length;
|
||||||
|
|
||||||
|
for (uint8_t i = 0; i < 12; i++) // only the first 12 sv go in sentence
|
||||||
|
{
|
||||||
|
if (i < svUsedCount)
|
||||||
|
length = snprintf(pMarker, lengthRemaining, "%02d,", svUsedList[i]);
|
||||||
|
else
|
||||||
|
length = snprintf(pMarker, lengthRemaining, ",");
|
||||||
|
|
||||||
|
if (length < 0 || length >= lengthRemaining)
|
||||||
|
{
|
||||||
|
LOC_LOGE("NMEA Error in string formatting");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
pMarker += length;
|
||||||
|
lengthRemaining -= length;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (locationExtended.flags & GPS_LOCATION_EXTENDED_HAS_DOP)
|
||||||
|
{ // dop is in locationExtended, (QMI)
|
||||||
|
length = snprintf(pMarker, lengthRemaining, "%.1f,%.1f,%.1f",
|
||||||
|
locationExtended.pdop,
|
||||||
|
locationExtended.hdop,
|
||||||
|
locationExtended.vdop);
|
||||||
|
}
|
||||||
|
else if (loc_eng_data_p->pdop > 0 && loc_eng_data_p->hdop > 0 && loc_eng_data_p->vdop > 0)
|
||||||
|
{ // dop was cached from sv report (RPC)
|
||||||
|
length = snprintf(pMarker, lengthRemaining, "%.1f,%.1f,%.1f",
|
||||||
|
loc_eng_data_p->pdop,
|
||||||
|
loc_eng_data_p->hdop,
|
||||||
|
loc_eng_data_p->vdop);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{ // no dop
|
||||||
|
length = snprintf(pMarker, lengthRemaining, ",,");
|
||||||
|
}
|
||||||
|
|
||||||
|
length = loc_eng_nmea_put_checksum(sentence, sizeof(sentence));
|
||||||
|
loc_eng_nmea_send(sentence, length, loc_eng_data_p);
|
||||||
|
|
||||||
|
// ------------------
|
||||||
|
// ------$GPVTG------
|
||||||
|
// ------------------
|
||||||
|
|
||||||
|
pMarker = sentence;
|
||||||
|
lengthRemaining = sizeof(sentence);
|
||||||
|
|
||||||
|
if (location.gpsLocation.flags & GPS_LOCATION_HAS_BEARING)
|
||||||
|
{
|
||||||
|
float magTrack = location.gpsLocation.bearing;
|
||||||
|
if (locationExtended.flags & GPS_LOCATION_EXTENDED_HAS_MAG_DEV)
|
||||||
|
{
|
||||||
|
float magTrack = location.gpsLocation.bearing - locationExtended.magneticDeviation;
|
||||||
|
if (magTrack < 0.0)
|
||||||
|
magTrack += 360.0;
|
||||||
|
else if (magTrack > 360.0)
|
||||||
|
magTrack -= 360.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
length = snprintf(pMarker, lengthRemaining, "$GPVTG,%.1lf,T,%.1lf,M,", location.gpsLocation.bearing, magTrack);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
length = snprintf(pMarker, lengthRemaining, "$GPVTG,,T,,M,");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (length < 0 || length >= lengthRemaining)
|
||||||
|
{
|
||||||
|
LOC_LOGE("NMEA Error in string formatting");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
pMarker += length;
|
||||||
|
lengthRemaining -= length;
|
||||||
|
|
||||||
|
if (location.gpsLocation.flags & GPS_LOCATION_HAS_SPEED)
|
||||||
|
{
|
||||||
|
float speedKnots = location.gpsLocation.speed * (3600.0/1852.0);
|
||||||
|
float speedKmPerHour = location.gpsLocation.speed * 3.6;
|
||||||
|
|
||||||
|
length = snprintf(pMarker, lengthRemaining, "%.1lf,N,%.1lf,K,", speedKnots, speedKmPerHour);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
length = snprintf(pMarker, lengthRemaining, ",N,,K,");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (length < 0 || length >= lengthRemaining)
|
||||||
|
{
|
||||||
|
LOC_LOGE("NMEA Error in string formatting");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
pMarker += length;
|
||||||
|
lengthRemaining -= length;
|
||||||
|
|
||||||
|
if (!(location.gpsLocation.flags & GPS_LOCATION_HAS_LAT_LONG))
|
||||||
|
length = snprintf(pMarker, lengthRemaining, "%c", 'N'); // N means no fix
|
||||||
|
else if (LOC_POSITION_MODE_STANDALONE == loc_eng_data_p->adapter->getPositionMode().mode)
|
||||||
|
length = snprintf(pMarker, lengthRemaining, "%c", 'A'); // A means autonomous
|
||||||
|
else
|
||||||
|
length = snprintf(pMarker, lengthRemaining, "%c", 'D'); // D means differential
|
||||||
|
|
||||||
|
length = loc_eng_nmea_put_checksum(sentence, sizeof(sentence));
|
||||||
|
loc_eng_nmea_send(sentence, length, loc_eng_data_p);
|
||||||
|
|
||||||
|
// ------------------
|
||||||
|
// ------$GPRMC------
|
||||||
|
// ------------------
|
||||||
|
|
||||||
|
pMarker = sentence;
|
||||||
|
lengthRemaining = sizeof(sentence);
|
||||||
|
|
||||||
|
length = snprintf(pMarker, lengthRemaining, "$GPRMC,%02d%02d%02d,A," ,
|
||||||
|
utcHours, utcMinutes, utcSeconds);
|
||||||
|
|
||||||
|
if (length < 0 || length >= lengthRemaining)
|
||||||
|
{
|
||||||
|
LOC_LOGE("NMEA Error in string formatting");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
pMarker += length;
|
||||||
|
lengthRemaining -= length;
|
||||||
|
|
||||||
|
if (location.gpsLocation.flags & GPS_LOCATION_HAS_LAT_LONG)
|
||||||
|
{
|
||||||
|
double latitude = location.gpsLocation.latitude;
|
||||||
|
double longitude = location.gpsLocation.longitude;
|
||||||
|
char latHemisphere;
|
||||||
|
char lonHemisphere;
|
||||||
|
double latMinutes;
|
||||||
|
double lonMinutes;
|
||||||
|
|
||||||
|
if (latitude > 0)
|
||||||
|
{
|
||||||
|
latHemisphere = 'N';
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
latHemisphere = 'S';
|
||||||
|
latitude *= -1.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (longitude < 0)
|
||||||
|
{
|
||||||
|
lonHemisphere = 'W';
|
||||||
|
longitude *= -1.0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
lonHemisphere = 'E';
|
||||||
|
}
|
||||||
|
|
||||||
|
latMinutes = fmod(latitude * 60.0 , 60.0);
|
||||||
|
lonMinutes = fmod(longitude * 60.0 , 60.0);
|
||||||
|
|
||||||
|
length = snprintf(pMarker, lengthRemaining, "%02d%09.6lf,%c,%03d%09.6lf,%c,",
|
||||||
|
(uint8_t)floor(latitude), latMinutes, latHemisphere,
|
||||||
|
(uint8_t)floor(longitude),lonMinutes, lonHemisphere);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
length = snprintf(pMarker, lengthRemaining,",,,,");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (length < 0 || length >= lengthRemaining)
|
||||||
|
{
|
||||||
|
LOC_LOGE("NMEA Error in string formatting");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
pMarker += length;
|
||||||
|
lengthRemaining -= length;
|
||||||
|
|
||||||
|
if (location.gpsLocation.flags & GPS_LOCATION_HAS_SPEED)
|
||||||
|
{
|
||||||
|
float speedKnots = location.gpsLocation.speed * (3600.0/1852.0);
|
||||||
|
length = snprintf(pMarker, lengthRemaining, "%.1lf,", speedKnots);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
length = snprintf(pMarker, lengthRemaining, ",");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (length < 0 || length >= lengthRemaining)
|
||||||
|
{
|
||||||
|
LOC_LOGE("NMEA Error in string formatting");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
pMarker += length;
|
||||||
|
lengthRemaining -= length;
|
||||||
|
|
||||||
|
if (location.gpsLocation.flags & GPS_LOCATION_HAS_BEARING)
|
||||||
|
{
|
||||||
|
length = snprintf(pMarker, lengthRemaining, "%.1lf,", location.gpsLocation.bearing);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
length = snprintf(pMarker, lengthRemaining, ",");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (length < 0 || length >= lengthRemaining)
|
||||||
|
{
|
||||||
|
LOC_LOGE("NMEA Error in string formatting");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
pMarker += length;
|
||||||
|
lengthRemaining -= length;
|
||||||
|
|
||||||
|
length = snprintf(pMarker, lengthRemaining, "%2.2d%2.2d%2.2d,",
|
||||||
|
utcDay, utcMonth, utcYear);
|
||||||
|
|
||||||
|
if (length < 0 || length >= lengthRemaining)
|
||||||
|
{
|
||||||
|
LOC_LOGE("NMEA Error in string formatting");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
pMarker += length;
|
||||||
|
lengthRemaining -= length;
|
||||||
|
|
||||||
|
if (locationExtended.flags & GPS_LOCATION_EXTENDED_HAS_MAG_DEV)
|
||||||
|
{
|
||||||
|
float magneticVariation = locationExtended.magneticDeviation;
|
||||||
|
char direction;
|
||||||
|
if (magneticVariation < 0.0)
|
||||||
|
{
|
||||||
|
direction = 'W';
|
||||||
|
magneticVariation *= -1.0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
direction = 'E';
|
||||||
|
}
|
||||||
|
|
||||||
|
length = snprintf(pMarker, lengthRemaining, "%.1lf,%c,",
|
||||||
|
magneticVariation, direction);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
length = snprintf(pMarker, lengthRemaining, ",,");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (length < 0 || length >= lengthRemaining)
|
||||||
|
{
|
||||||
|
LOC_LOGE("NMEA Error in string formatting");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
pMarker += length;
|
||||||
|
lengthRemaining -= length;
|
||||||
|
|
||||||
|
if (!(location.gpsLocation.flags & GPS_LOCATION_HAS_LAT_LONG))
|
||||||
|
length = snprintf(pMarker, lengthRemaining, "%c", 'N'); // N means no fix
|
||||||
|
else if (LOC_POSITION_MODE_STANDALONE == loc_eng_data_p->adapter->getPositionMode().mode)
|
||||||
|
length = snprintf(pMarker, lengthRemaining, "%c", 'A'); // A means autonomous
|
||||||
|
else
|
||||||
|
length = snprintf(pMarker, lengthRemaining, "%c", 'D'); // D means differential
|
||||||
|
|
||||||
|
length = loc_eng_nmea_put_checksum(sentence, sizeof(sentence));
|
||||||
|
loc_eng_nmea_send(sentence, length, loc_eng_data_p);
|
||||||
|
|
||||||
|
// ------------------
|
||||||
|
// ------$GPGGA------
|
||||||
|
// ------------------
|
||||||
|
|
||||||
|
pMarker = sentence;
|
||||||
|
lengthRemaining = sizeof(sentence);
|
||||||
|
|
||||||
|
length = snprintf(pMarker, lengthRemaining, "$GPGGA,%02d%02d%02d," ,
|
||||||
|
utcHours, utcMinutes, utcSeconds);
|
||||||
|
|
||||||
|
if (length < 0 || length >= lengthRemaining)
|
||||||
|
{
|
||||||
|
LOC_LOGE("NMEA Error in string formatting");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
pMarker += length;
|
||||||
|
lengthRemaining -= length;
|
||||||
|
|
||||||
|
if (location.gpsLocation.flags & GPS_LOCATION_HAS_LAT_LONG)
|
||||||
|
{
|
||||||
|
double latitude = location.gpsLocation.latitude;
|
||||||
|
double longitude = location.gpsLocation.longitude;
|
||||||
|
char latHemisphere;
|
||||||
|
char lonHemisphere;
|
||||||
|
double latMinutes;
|
||||||
|
double lonMinutes;
|
||||||
|
|
||||||
|
if (latitude > 0)
|
||||||
|
{
|
||||||
|
latHemisphere = 'N';
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
latHemisphere = 'S';
|
||||||
|
latitude *= -1.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (longitude < 0)
|
||||||
|
{
|
||||||
|
lonHemisphere = 'W';
|
||||||
|
longitude *= -1.0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
lonHemisphere = 'E';
|
||||||
|
}
|
||||||
|
|
||||||
|
latMinutes = fmod(latitude * 60.0 , 60.0);
|
||||||
|
lonMinutes = fmod(longitude * 60.0 , 60.0);
|
||||||
|
|
||||||
|
length = snprintf(pMarker, lengthRemaining, "%02d%09.6lf,%c,%03d%09.6lf,%c,",
|
||||||
|
(uint8_t)floor(latitude), latMinutes, latHemisphere,
|
||||||
|
(uint8_t)floor(longitude),lonMinutes, lonHemisphere);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
length = snprintf(pMarker, lengthRemaining,",,,,");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (length < 0 || length >= lengthRemaining)
|
||||||
|
{
|
||||||
|
LOC_LOGE("NMEA Error in string formatting");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
pMarker += length;
|
||||||
|
lengthRemaining -= length;
|
||||||
|
|
||||||
|
char gpsQuality;
|
||||||
|
if (!(location.gpsLocation.flags & GPS_LOCATION_HAS_LAT_LONG))
|
||||||
|
gpsQuality = '0'; // 0 means no fix
|
||||||
|
else if (LOC_POSITION_MODE_STANDALONE == loc_eng_data_p->adapter->getPositionMode().mode)
|
||||||
|
gpsQuality = '1'; // 1 means GPS fix
|
||||||
|
else
|
||||||
|
gpsQuality = '2'; // 2 means DGPS fix
|
||||||
|
|
||||||
|
if (locationExtended.flags & GPS_LOCATION_EXTENDED_HAS_DOP)
|
||||||
|
{ // dop is in locationExtended, (QMI)
|
||||||
|
length = snprintf(pMarker, lengthRemaining, "%c,%02d,%.1f,",
|
||||||
|
gpsQuality, svUsedCount, locationExtended.hdop);
|
||||||
|
}
|
||||||
|
else if (loc_eng_data_p->pdop > 0 && loc_eng_data_p->hdop > 0 && loc_eng_data_p->vdop > 0)
|
||||||
|
{ // dop was cached from sv report (RPC)
|
||||||
|
length = snprintf(pMarker, lengthRemaining, "%c,%02d,%.1f,",
|
||||||
|
gpsQuality, svUsedCount, loc_eng_data_p->hdop);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{ // no hdop
|
||||||
|
length = snprintf(pMarker, lengthRemaining, "%c,%02d,,",
|
||||||
|
gpsQuality, svUsedCount);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (length < 0 || length >= lengthRemaining)
|
||||||
|
{
|
||||||
|
LOC_LOGE("NMEA Error in string formatting");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
pMarker += length;
|
||||||
|
lengthRemaining -= length;
|
||||||
|
|
||||||
|
if (locationExtended.flags & GPS_LOCATION_EXTENDED_HAS_ALTITUDE_MEAN_SEA_LEVEL)
|
||||||
|
{
|
||||||
|
length = snprintf(pMarker, lengthRemaining, "%.1lf,M,",
|
||||||
|
locationExtended.altitudeMeanSeaLevel);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
length = snprintf(pMarker, lengthRemaining,",,");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (length < 0 || length >= lengthRemaining)
|
||||||
|
{
|
||||||
|
LOC_LOGE("NMEA Error in string formatting");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
pMarker += length;
|
||||||
|
lengthRemaining -= length;
|
||||||
|
|
||||||
|
if ((location.gpsLocation.flags & GPS_LOCATION_HAS_ALTITUDE) &&
|
||||||
|
(locationExtended.flags & GPS_LOCATION_EXTENDED_HAS_ALTITUDE_MEAN_SEA_LEVEL))
|
||||||
|
{
|
||||||
|
length = snprintf(pMarker, lengthRemaining, "%.1lf,M,,",
|
||||||
|
location.gpsLocation.altitude - locationExtended.altitudeMeanSeaLevel);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
length = snprintf(pMarker, lengthRemaining,",,,");
|
||||||
|
}
|
||||||
|
|
||||||
|
length = loc_eng_nmea_put_checksum(sentence, sizeof(sentence));
|
||||||
|
loc_eng_nmea_send(sentence, length, loc_eng_data_p);
|
||||||
|
|
||||||
|
}
|
||||||
|
//Send blank NMEA reports for non-final fixes
|
||||||
|
else {
|
||||||
|
strlcpy(sentence, "$GPGSA,A,1,,,,,,,,,,,,,,,", sizeof(sentence));
|
||||||
|
length = loc_eng_nmea_put_checksum(sentence, sizeof(sentence));
|
||||||
|
loc_eng_nmea_send(sentence, length, loc_eng_data_p);
|
||||||
|
|
||||||
|
strlcpy(sentence, "$GPVTG,,T,,M,,N,,K,N", sizeof(sentence));
|
||||||
|
length = loc_eng_nmea_put_checksum(sentence, sizeof(sentence));
|
||||||
|
loc_eng_nmea_send(sentence, length, loc_eng_data_p);
|
||||||
|
|
||||||
|
strlcpy(sentence, "$GPRMC,,V,,,,,,,,,,N", sizeof(sentence));
|
||||||
|
length = loc_eng_nmea_put_checksum(sentence, sizeof(sentence));
|
||||||
|
loc_eng_nmea_send(sentence, length, loc_eng_data_p);
|
||||||
|
|
||||||
|
strlcpy(sentence, "$GPGGA,,,,,,0,,,,,,,,", sizeof(sentence));
|
||||||
|
length = loc_eng_nmea_put_checksum(sentence, sizeof(sentence));
|
||||||
|
loc_eng_nmea_send(sentence, length, loc_eng_data_p);
|
||||||
|
}
|
||||||
|
// clear the dop cache so they can't be used again
|
||||||
|
loc_eng_data_p->pdop = 0;
|
||||||
|
loc_eng_data_p->hdop = 0;
|
||||||
|
loc_eng_data_p->vdop = 0;
|
||||||
|
|
||||||
|
EXIT_LOG(%d, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*===========================================================================
|
||||||
|
FUNCTION loc_eng_nmea_generate_sv
|
||||||
|
|
||||||
|
DESCRIPTION
|
||||||
|
Generate NMEA sentences generated based on sv report
|
||||||
|
|
||||||
|
DEPENDENCIES
|
||||||
|
NONE
|
||||||
|
|
||||||
|
RETURN VALUE
|
||||||
|
0
|
||||||
|
|
||||||
|
SIDE EFFECTS
|
||||||
|
N/A
|
||||||
|
|
||||||
|
===========================================================================*/
|
||||||
|
void loc_eng_nmea_generate_sv(loc_eng_data_s_type *loc_eng_data_p,
|
||||||
|
const GpsSvStatus &svStatus, const GpsLocationExtended &locationExtended)
|
||||||
|
{
|
||||||
|
ENTRY_LOG();
|
||||||
|
|
||||||
|
char sentence[NMEA_SENTENCE_MAX_LENGTH] = {0};
|
||||||
|
char* pMarker = sentence;
|
||||||
|
int lengthRemaining = sizeof(sentence);
|
||||||
|
int length = 0;
|
||||||
|
int svCount = svStatus.num_svs;
|
||||||
|
int sentenceCount = 0;
|
||||||
|
int sentenceNumber = 1;
|
||||||
|
int svNumber = 1;
|
||||||
|
int gpsCount = 0;
|
||||||
|
int glnCount = 0;
|
||||||
|
|
||||||
|
//Count GPS SVs for saparating GPS from GLONASS and throw others
|
||||||
|
|
||||||
|
for(svNumber=1; svNumber <= svCount; svNumber++) {
|
||||||
|
if( (svStatus.sv_list[svNumber-1].prn >= GPS_PRN_START)&&
|
||||||
|
(svStatus.sv_list[svNumber-1].prn <= GPS_PRN_END) )
|
||||||
|
{
|
||||||
|
gpsCount++;
|
||||||
|
}
|
||||||
|
else if( (svStatus.sv_list[svNumber-1].prn >= GLONASS_PRN_START) &&
|
||||||
|
(svStatus.sv_list[svNumber-1].prn <= GLONASS_PRN_END) )
|
||||||
|
{
|
||||||
|
glnCount++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------------------
|
||||||
|
// ------$GPGSV------
|
||||||
|
// ------------------
|
||||||
|
|
||||||
|
if (gpsCount <= 0)
|
||||||
|
{
|
||||||
|
// no svs in view, so just send a blank $GPGSV sentence
|
||||||
|
strlcpy(sentence, "$GPGSV,1,1,0,", sizeof(sentence));
|
||||||
|
length = loc_eng_nmea_put_checksum(sentence, sizeof(sentence));
|
||||||
|
loc_eng_nmea_send(sentence, length, loc_eng_data_p);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
svNumber = 1;
|
||||||
|
sentenceNumber = 1;
|
||||||
|
sentenceCount = gpsCount/4 + (gpsCount % 4 != 0);
|
||||||
|
|
||||||
|
while (sentenceNumber <= sentenceCount)
|
||||||
|
{
|
||||||
|
pMarker = sentence;
|
||||||
|
lengthRemaining = sizeof(sentence);
|
||||||
|
|
||||||
|
length = snprintf(pMarker, lengthRemaining, "$GPGSV,%d,%d,%02d",
|
||||||
|
sentenceCount, sentenceNumber, gpsCount);
|
||||||
|
|
||||||
|
if (length < 0 || length >= lengthRemaining)
|
||||||
|
{
|
||||||
|
LOC_LOGE("NMEA Error in string formatting");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
pMarker += length;
|
||||||
|
lengthRemaining -= length;
|
||||||
|
|
||||||
|
for (int i=0; (svNumber <= svCount) && (i < 4); svNumber++)
|
||||||
|
{
|
||||||
|
if( (svStatus.sv_list[svNumber-1].prn >= GPS_PRN_START) &&
|
||||||
|
(svStatus.sv_list[svNumber-1].prn <= GPS_PRN_END) )
|
||||||
|
{
|
||||||
|
length = snprintf(pMarker, lengthRemaining,",%02d,%02d,%03d,",
|
||||||
|
svStatus.sv_list[svNumber-1].prn,
|
||||||
|
(int)(0.5 + svStatus.sv_list[svNumber-1].elevation), //float to int
|
||||||
|
(int)(0.5 + svStatus.sv_list[svNumber-1].azimuth)); //float to int
|
||||||
|
|
||||||
|
if (length < 0 || length >= lengthRemaining)
|
||||||
|
{
|
||||||
|
LOC_LOGE("NMEA Error in string formatting");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
pMarker += length;
|
||||||
|
lengthRemaining -= length;
|
||||||
|
|
||||||
|
if (svStatus.sv_list[svNumber-1].snr > 0)
|
||||||
|
{
|
||||||
|
length = snprintf(pMarker, lengthRemaining,"%02d",
|
||||||
|
(int)(0.5 + svStatus.sv_list[svNumber-1].snr)); //float to int
|
||||||
|
|
||||||
|
if (length < 0 || length >= lengthRemaining)
|
||||||
|
{
|
||||||
|
LOC_LOGE("NMEA Error in string formatting");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
pMarker += length;
|
||||||
|
lengthRemaining -= length;
|
||||||
|
}
|
||||||
|
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
length = loc_eng_nmea_put_checksum(sentence, sizeof(sentence));
|
||||||
|
loc_eng_nmea_send(sentence, length, loc_eng_data_p);
|
||||||
|
sentenceNumber++;
|
||||||
|
|
||||||
|
} //while
|
||||||
|
|
||||||
|
} //if
|
||||||
|
|
||||||
|
// ------------------
|
||||||
|
// ------$GLGSV------
|
||||||
|
// ------------------
|
||||||
|
|
||||||
|
if (glnCount <= 0)
|
||||||
|
{
|
||||||
|
// no svs in view, so just send a blank $GLGSV sentence
|
||||||
|
strlcpy(sentence, "$GLGSV,1,1,0,", sizeof(sentence));
|
||||||
|
length = loc_eng_nmea_put_checksum(sentence, sizeof(sentence));
|
||||||
|
loc_eng_nmea_send(sentence, length, loc_eng_data_p);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
svNumber = 1;
|
||||||
|
sentenceNumber = 1;
|
||||||
|
sentenceCount = glnCount/4 + (glnCount % 4 != 0);
|
||||||
|
|
||||||
|
while (sentenceNumber <= sentenceCount)
|
||||||
|
{
|
||||||
|
pMarker = sentence;
|
||||||
|
lengthRemaining = sizeof(sentence);
|
||||||
|
|
||||||
|
length = snprintf(pMarker, lengthRemaining, "$GLGSV,%d,%d,%02d",
|
||||||
|
sentenceCount, sentenceNumber, glnCount);
|
||||||
|
|
||||||
|
if (length < 0 || length >= lengthRemaining)
|
||||||
|
{
|
||||||
|
LOC_LOGE("NMEA Error in string formatting");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
pMarker += length;
|
||||||
|
lengthRemaining -= length;
|
||||||
|
|
||||||
|
for (int i=0; (svNumber <= svCount) && (i < 4); svNumber++)
|
||||||
|
{
|
||||||
|
if( (svStatus.sv_list[svNumber-1].prn >= GLONASS_PRN_START) &&
|
||||||
|
(svStatus.sv_list[svNumber-1].prn <= GLONASS_PRN_END) ) {
|
||||||
|
|
||||||
|
length = snprintf(pMarker, lengthRemaining,",%02d,%02d,%03d,",
|
||||||
|
svStatus.sv_list[svNumber-1].prn,
|
||||||
|
(int)(0.5 + svStatus.sv_list[svNumber-1].elevation), //float to int
|
||||||
|
(int)(0.5 + svStatus.sv_list[svNumber-1].azimuth)); //float to int
|
||||||
|
|
||||||
|
if (length < 0 || length >= lengthRemaining)
|
||||||
|
{
|
||||||
|
LOC_LOGE("NMEA Error in string formatting");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
pMarker += length;
|
||||||
|
lengthRemaining -= length;
|
||||||
|
|
||||||
|
if (svStatus.sv_list[svNumber-1].snr > 0)
|
||||||
|
{
|
||||||
|
length = snprintf(pMarker, lengthRemaining,"%02d",
|
||||||
|
(int)(0.5 + svStatus.sv_list[svNumber-1].snr)); //float to int
|
||||||
|
|
||||||
|
if (length < 0 || length >= lengthRemaining)
|
||||||
|
{
|
||||||
|
LOC_LOGE("NMEA Error in string formatting");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
pMarker += length;
|
||||||
|
lengthRemaining -= length;
|
||||||
|
}
|
||||||
|
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
length = loc_eng_nmea_put_checksum(sentence, sizeof(sentence));
|
||||||
|
loc_eng_nmea_send(sentence, length, loc_eng_data_p);
|
||||||
|
sentenceNumber++;
|
||||||
|
|
||||||
|
} //while
|
||||||
|
|
||||||
|
}//if
|
||||||
|
|
||||||
|
if (svStatus.used_in_fix_mask == 0)
|
||||||
|
{ // No sv used, so there will be no position report, so send
|
||||||
|
// blank NMEA sentences
|
||||||
|
strlcpy(sentence, "$GPGSA,A,1,,,,,,,,,,,,,,,", sizeof(sentence));
|
||||||
|
length = loc_eng_nmea_put_checksum(sentence, sizeof(sentence));
|
||||||
|
loc_eng_nmea_send(sentence, length, loc_eng_data_p);
|
||||||
|
|
||||||
|
strlcpy(sentence, "$GPVTG,,T,,M,,N,,K,N", sizeof(sentence));
|
||||||
|
length = loc_eng_nmea_put_checksum(sentence, sizeof(sentence));
|
||||||
|
loc_eng_nmea_send(sentence, length, loc_eng_data_p);
|
||||||
|
|
||||||
|
strlcpy(sentence, "$GPRMC,,V,,,,,,,,,,N", sizeof(sentence));
|
||||||
|
length = loc_eng_nmea_put_checksum(sentence, sizeof(sentence));
|
||||||
|
loc_eng_nmea_send(sentence, length, loc_eng_data_p);
|
||||||
|
|
||||||
|
strlcpy(sentence, "$GPGGA,,,,,,0,,,,,,,,", sizeof(sentence));
|
||||||
|
length = loc_eng_nmea_put_checksum(sentence, sizeof(sentence));
|
||||||
|
loc_eng_nmea_send(sentence, length, loc_eng_data_p);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{ // cache the used in fix mask, as it will be needed to send $GPGSA
|
||||||
|
// during the position report
|
||||||
|
loc_eng_data_p->sv_used_mask = svStatus.used_in_fix_mask;
|
||||||
|
|
||||||
|
// For RPC, the DOP are sent during sv report, so cache them
|
||||||
|
// now to be sent during position report.
|
||||||
|
// For QMI, the DOP will be in position report.
|
||||||
|
if (locationExtended.flags & GPS_LOCATION_EXTENDED_HAS_DOP)
|
||||||
|
{
|
||||||
|
loc_eng_data_p->pdop = locationExtended.pdop;
|
||||||
|
loc_eng_data_p->hdop = locationExtended.hdop;
|
||||||
|
loc_eng_data_p->vdop = locationExtended.vdop;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
loc_eng_data_p->pdop = 0;
|
||||||
|
loc_eng_data_p->hdop = 0;
|
||||||
|
loc_eng_data_p->vdop = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
EXIT_LOG(%d, 0);
|
||||||
|
}
|
42
gps/loc_api/libloc_api_50001/loc_eng_nmea.h
Executable file
42
gps/loc_api/libloc_api_50001/loc_eng_nmea.h
Executable file
@ -0,0 +1,42 @@
|
|||||||
|
/* Copyright (c) 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_ENG_NMEA_H
|
||||||
|
#define LOC_ENG_NMEA_H
|
||||||
|
|
||||||
|
#include "hardware/gps.h"
|
||||||
|
|
||||||
|
#define NMEA_SENTENCE_MAX_LENGTH 200
|
||||||
|
|
||||||
|
void loc_eng_nmea_send(char *pNmea, int length, loc_eng_data_s_type *loc_eng_data_p);
|
||||||
|
int loc_eng_nmea_put_checksum(char *pNmea, int maxSize);
|
||||||
|
void loc_eng_nmea_generate_sv(loc_eng_data_s_type *loc_eng_data_p, const GpsSvStatus &svStatus, const GpsLocationExtended &locationExtended);
|
||||||
|
void loc_eng_nmea_generate_pos(loc_eng_data_s_type *loc_eng_data_p, const UlpLocation &location, const GpsLocationExtended &locationExtended, unsigned char generate_nmea);
|
||||||
|
|
||||||
|
#endif // LOC_ENG_NMEA_H
|
167
gps/loc_api/libloc_api_50001/loc_eng_xtra.cpp
Executable file
167
gps/loc_api/libloc_api_50001/loc_eng_xtra.cpp
Executable file
@ -0,0 +1,167 @@
|
|||||||
|
/* Copyright (c) 2009-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.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define LOG_NDDEBUG 0
|
||||||
|
#define LOG_TAG "LocSvc_eng"
|
||||||
|
|
||||||
|
#include <loc_eng.h>
|
||||||
|
#include <MsgTask.h>
|
||||||
|
#include "log_util.h"
|
||||||
|
#include "platform_lib_includes.h"
|
||||||
|
|
||||||
|
using namespace loc_core;
|
||||||
|
|
||||||
|
struct LocEngRequestXtraServer : public LocMsg {
|
||||||
|
LocEngAdapter* mAdapter;
|
||||||
|
inline LocEngRequestXtraServer(LocEngAdapter* adapter) :
|
||||||
|
LocMsg(), mAdapter(adapter)
|
||||||
|
{
|
||||||
|
locallog();
|
||||||
|
}
|
||||||
|
inline virtual void proc() const {
|
||||||
|
mAdapter->requestXtraServer();
|
||||||
|
}
|
||||||
|
inline void locallog() const {
|
||||||
|
LOC_LOGV("LocEngRequestXtraServer");
|
||||||
|
}
|
||||||
|
inline virtual void log() const {
|
||||||
|
locallog();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
struct LocEngInjectXtraData : public LocMsg {
|
||||||
|
LocEngAdapter* mAdapter;
|
||||||
|
char* mData;
|
||||||
|
const int mLen;
|
||||||
|
inline LocEngInjectXtraData(LocEngAdapter* adapter,
|
||||||
|
char* data, int len):
|
||||||
|
LocMsg(), mAdapter(adapter),
|
||||||
|
mData(new char[len]), mLen(len)
|
||||||
|
{
|
||||||
|
memcpy((void*)mData, (void*)data, len);
|
||||||
|
locallog();
|
||||||
|
}
|
||||||
|
inline ~LocEngInjectXtraData()
|
||||||
|
{
|
||||||
|
delete[] mData;
|
||||||
|
}
|
||||||
|
inline virtual void proc() const {
|
||||||
|
mAdapter->setXtraData(mData, mLen);
|
||||||
|
}
|
||||||
|
inline void locallog() const {
|
||||||
|
LOC_LOGV("length: %d\n data: %p", mLen, mData);
|
||||||
|
}
|
||||||
|
inline virtual void log() const {
|
||||||
|
locallog();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/*===========================================================================
|
||||||
|
FUNCTION loc_eng_xtra_init
|
||||||
|
|
||||||
|
DESCRIPTION
|
||||||
|
Initialize XTRA module.
|
||||||
|
|
||||||
|
DEPENDENCIES
|
||||||
|
N/A
|
||||||
|
|
||||||
|
RETURN VALUE
|
||||||
|
0: success
|
||||||
|
|
||||||
|
SIDE EFFECTS
|
||||||
|
N/A
|
||||||
|
|
||||||
|
===========================================================================*/
|
||||||
|
int loc_eng_xtra_init (loc_eng_data_s_type &loc_eng_data,
|
||||||
|
GpsXtraExtCallbacks* callbacks)
|
||||||
|
{
|
||||||
|
int ret_val = -1;
|
||||||
|
loc_eng_xtra_data_s_type *xtra_module_data_ptr;
|
||||||
|
|
||||||
|
if(callbacks == NULL) {
|
||||||
|
LOC_LOGE("loc_eng_xtra_init: failed, cb is NULL");
|
||||||
|
} else {
|
||||||
|
xtra_module_data_ptr = &loc_eng_data.xtra_module_data;
|
||||||
|
xtra_module_data_ptr->download_request_cb = callbacks->download_request_cb;
|
||||||
|
xtra_module_data_ptr->report_xtra_server_cb = callbacks->report_xtra_server_cb;
|
||||||
|
|
||||||
|
ret_val = 0;
|
||||||
|
}
|
||||||
|
return ret_val;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*===========================================================================
|
||||||
|
FUNCTION loc_eng_xtra_inject_data
|
||||||
|
|
||||||
|
DESCRIPTION
|
||||||
|
Injects XTRA file into the engine but buffers the data if engine is busy.
|
||||||
|
|
||||||
|
DEPENDENCIES
|
||||||
|
N/A
|
||||||
|
|
||||||
|
RETURN VALUE
|
||||||
|
0: success
|
||||||
|
>0: failure
|
||||||
|
|
||||||
|
SIDE EFFECTS
|
||||||
|
N/A
|
||||||
|
|
||||||
|
===========================================================================*/
|
||||||
|
int loc_eng_xtra_inject_data(loc_eng_data_s_type &loc_eng_data,
|
||||||
|
char* data, int length)
|
||||||
|
{
|
||||||
|
LocEngAdapter* adapter = loc_eng_data.adapter;
|
||||||
|
adapter->sendMsg(new LocEngInjectXtraData(adapter, data, length));
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
/*===========================================================================
|
||||||
|
FUNCTION loc_eng_xtra_request_server
|
||||||
|
|
||||||
|
DESCRIPTION
|
||||||
|
Request the Xtra server url from the modem
|
||||||
|
|
||||||
|
DEPENDENCIES
|
||||||
|
N/A
|
||||||
|
|
||||||
|
RETURN VALUE
|
||||||
|
length of server string
|
||||||
|
|
||||||
|
SIDE EFFECTS
|
||||||
|
N/A
|
||||||
|
|
||||||
|
===========================================================================*/
|
||||||
|
int loc_eng_xtra_request_server(loc_eng_data_s_type &loc_eng_data)
|
||||||
|
{
|
||||||
|
LocEngAdapter* adapter = loc_eng_data.adapter;
|
||||||
|
adapter->sendMsg(new LocEngRequestXtraServer(adapter));
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
}
|
47
gps/loc_api/libloc_api_50001/loc_eng_xtra.h
Executable file
47
gps/loc_api/libloc_api_50001/loc_eng_xtra.h
Executable file
@ -0,0 +1,47 @@
|
|||||||
|
/* Copyright (c) 2009,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 LOC_ENG_XTRA_H
|
||||||
|
#define LOC_ENG_XTRA_H
|
||||||
|
|
||||||
|
#include "hardware/gps.h"
|
||||||
|
|
||||||
|
// Module data
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
// loc_eng_ioctl_cb_data_s_type ioctl_cb_data;
|
||||||
|
gps_xtra_download_request download_request_cb;
|
||||||
|
report_xtra_server report_xtra_server_cb;
|
||||||
|
|
||||||
|
// XTRA data buffer
|
||||||
|
char *xtra_data_for_injection; // NULL if no pending data
|
||||||
|
int xtra_data_len;
|
||||||
|
} loc_eng_xtra_data_s_type;
|
||||||
|
|
||||||
|
#endif // LOC_ENG_XTRA_H
|
46
gps/platform_lib_abstractions/elapsed_millis_since_boot.cpp
Executable file
46
gps/platform_lib_abstractions/elapsed_millis_since_boot.cpp
Executable file
@ -0,0 +1,46 @@
|
|||||||
|
/* 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 <stdlib.h>
|
||||||
|
#include <sys/time.h>
|
||||||
|
#include "platform_lib_time.h"
|
||||||
|
|
||||||
|
int64_t systemTime(int clock)
|
||||||
|
{
|
||||||
|
struct timeval t;
|
||||||
|
t.tv_sec = t.tv_usec = 0;
|
||||||
|
gettimeofday(&t, NULL);
|
||||||
|
return t.tv_sec*1000000LL + t.tv_usec;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int64_t elapsedMillisSinceBoot()
|
||||||
|
{
|
||||||
|
int64_t t_us = systemTime(0);
|
||||||
|
return (int64_t) t_us / 1000LL;
|
||||||
|
}
|
35
gps/platform_lib_abstractions/platform_lib_includes.h
Executable file
35
gps/platform_lib_abstractions/platform_lib_includes.h
Executable file
@ -0,0 +1,35 @@
|
|||||||
|
/* 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 _PLATFORM_LIB_INCLUDES_H_
|
||||||
|
#define _PLATFORM_LIB_INCLUDES_H_
|
||||||
|
|
||||||
|
#include "platform_lib_time.h"
|
||||||
|
#include "platform_lib_macros.h"
|
||||||
|
|
||||||
|
#endif
|
81
gps/platform_lib_abstractions/platform_lib_macros.h
Executable file
81
gps/platform_lib_abstractions/platform_lib_macros.h
Executable file
@ -0,0 +1,81 @@
|
|||||||
|
/* 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 __PLATFORM_LIB_MACROS_H__
|
||||||
|
#define __PLATFORM_LIB_MACROS_H__
|
||||||
|
|
||||||
|
#include <sys/time.h>
|
||||||
|
|
||||||
|
#define TS_PRINTF(format, x...) \
|
||||||
|
{ \
|
||||||
|
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; \
|
||||||
|
fprintf(stdout,"%02d:%02d:%02d.%06ld]" format "\n", hh, mm, ss, tv.tv_usec,##x); \
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef USE_GLIB
|
||||||
|
|
||||||
|
#define strlcat g_strlcat
|
||||||
|
#define strlcpy g_strlcpy
|
||||||
|
|
||||||
|
#define ALOGE(format, x...) TS_PRINTF("E/%s (%d): " format , LOG_TAG, getpid(), ##x)
|
||||||
|
#define ALOGW(format, x...) TS_PRINTF("W/%s (%d): " format , LOG_TAG, getpid(), ##x)
|
||||||
|
#define ALOGI(format, x...) TS_PRINTF("I/%s (%d): " format , LOG_TAG, getpid(), ##x)
|
||||||
|
#define ALOGD(format, x...) TS_PRINTF("D/%s (%d): " format , LOG_TAG, getpid(), ##x)
|
||||||
|
#define ALOGV(format, x...) TS_PRINTF("V/%s (%d): " format , LOG_TAG, getpid(), ##x)
|
||||||
|
|
||||||
|
#define GETTID_PLATFORM_LIB_ABSTRACTION (syscall(SYS_gettid))
|
||||||
|
|
||||||
|
#define LOC_EXT_CREATE_THREAD_CB_PLATFORM_LIB_ABSTRACTION createPthread
|
||||||
|
#define ELAPSED_MILLIS_SINCE_BOOT_PLATFORM_LIB_ABSTRACTION (elapsedMillisSinceBoot())
|
||||||
|
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
pid_t gettid(void);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define GETTID_PLATFORM_LIB_ABSTRACTION (gettid())
|
||||||
|
#define LOC_EXT_CREATE_THREAD_CB_PLATFORM_LIB_ABSTRACTION android::AndroidRuntime::createJavaThread
|
||||||
|
#define ELAPSED_MILLIS_SINCE_BOOT_PLATFORM_LIB_ABSTRACTION (android::elapsedRealtime())
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
35
gps/platform_lib_abstractions/platform_lib_time.h
Executable file
35
gps/platform_lib_abstractions/platform_lib_time.h
Executable file
@ -0,0 +1,35 @@
|
|||||||
|
/* 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 _PLATFORM_LIB_TIME_H_
|
||||||
|
#define _PLATFORM_LIB_TIME_H_
|
||||||
|
|
||||||
|
int64_t systemTime(int clock);
|
||||||
|
int64_t elapsedMillisSinceBoot();
|
||||||
|
|
||||||
|
#endif
|
56
gps/utils/Android.mk
Executable file
56
gps/utils/Android.mk
Executable file
@ -0,0 +1,56 @@
|
|||||||
|
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
|
||||||
|
|
||||||
|
|
||||||
|
LOCAL_CFLAGS += \
|
||||||
|
-fno-short-enums \
|
||||||
|
-D_ANDROID_
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
|
||||||
|
LOCAL_MODULE := libgps.utils
|
||||||
|
|
||||||
|
LOCAL_MODULE_TAGS := optional
|
||||||
|
|
||||||
|
LOCAL_PRELINK_MODULE := false
|
||||||
|
|
||||||
|
LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)
|
||||||
|
include $(BUILD_SHARED_LIBRARY)
|
||||||
|
endif # not BUILD_TINY_ANDROID
|
44
gps/utils/Makefile.am
Executable file
44
gps/utils/Makefile.am
Executable 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
gps/utils/linked_list.c
Executable file
328
gps/utils/linked_list.c
Executable 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
gps/utils/linked_list.h
Executable file
217
gps/utils/linked_list.h
Executable 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__ */
|
286
gps/utils/loc_cfg.cpp
Executable file
286
gps/utils/loc_cfg.cpp
Executable file
@ -0,0 +1,286 @@
|
|||||||
|
/* Copyright (c) 2011-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.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#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>
|
||||||
|
#ifdef USE_GLIB
|
||||||
|
#include <glib.h>
|
||||||
|
#endif
|
||||||
|
#include "platform_lib_includes.h"
|
||||||
|
|
||||||
|
/*=============================================================================
|
||||||
|
*
|
||||||
|
* GLOBAL DATA DECLARATION
|
||||||
|
*
|
||||||
|
*============================================================================*/
|
||||||
|
|
||||||
|
/* Parameter data */
|
||||||
|
static uint8_t DEBUG_LEVEL = 0xff;
|
||||||
|
static uint8_t TIMESTAMP = 0;
|
||||||
|
|
||||||
|
/* Parameter spec table */
|
||||||
|
static loc_param_s_type loc_parameter_table[] =
|
||||||
|
{
|
||||||
|
{"DEBUG_LEVEL", &DEBUG_LEVEL, NULL, 'n'},
|
||||||
|
{"TIMESTAMP", &TIMESTAMP, NULL, 'n'},
|
||||||
|
};
|
||||||
|
int loc_param_num = sizeof(loc_parameter_table) / sizeof(loc_param_s_type);
|
||||||
|
|
||||||
|
/*===========================================================================
|
||||||
|
FUNCTION trim_space
|
||||||
|
|
||||||
|
DESCRIPTION
|
||||||
|
Removes leading and trailing spaces of the string
|
||||||
|
|
||||||
|
DEPENDENCIES
|
||||||
|
N/A
|
||||||
|
|
||||||
|
RETURN VALUE
|
||||||
|
None
|
||||||
|
|
||||||
|
SIDE EFFECTS
|
||||||
|
N/A
|
||||||
|
===========================================================================*/
|
||||||
|
void trim_space(char *org_string)
|
||||||
|
{
|
||||||
|
char *scan_ptr, *write_ptr;
|
||||||
|
char *first_nonspace = NULL, *last_nonspace = NULL;
|
||||||
|
|
||||||
|
scan_ptr = write_ptr = org_string;
|
||||||
|
|
||||||
|
while (*scan_ptr)
|
||||||
|
{
|
||||||
|
if ( !isspace(*scan_ptr) && first_nonspace == NULL)
|
||||||
|
{
|
||||||
|
first_nonspace = scan_ptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (first_nonspace != NULL)
|
||||||
|
{
|
||||||
|
*(write_ptr++) = *scan_ptr;
|
||||||
|
if ( !isspace(*scan_ptr))
|
||||||
|
{
|
||||||
|
last_nonspace = write_ptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
scan_ptr++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (last_nonspace) { *last_nonspace = '\0'; }
|
||||||
|
}
|
||||||
|
|
||||||
|
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
|
||||||
|
===========================================================================*/
|
||||||
|
void loc_set_config_entry(loc_param_s_type* config_entry, loc_param_v_type* config_value)
|
||||||
|
{
|
||||||
|
if(NULL == config_entry || NULL == config_value)
|
||||||
|
{
|
||||||
|
LOC_LOGE("%s: INVALID config entry or parameter", __FUNCTION__);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
LOC_LOGE("%s: PARAM %s parameter type must be n, f, or s", __FUNCTION__, config_entry->param_name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*===========================================================================
|
||||||
|
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 *gps_conf_fp = NULL;
|
||||||
|
char input_buf[LOC_MAX_PARAM_LINE]; /* declare a char array */
|
||||||
|
char *lasts;
|
||||||
|
loc_param_v_type config_value;
|
||||||
|
uint32_t i;
|
||||||
|
|
||||||
|
if((gps_conf_fp = fopen(conf_file_name, "r")) != NULL)
|
||||||
|
{
|
||||||
|
LOC_LOGD("%s: using %s", __FUNCTION__, conf_file_name);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
LOC_LOGW("%s: no %s file found", __FUNCTION__, conf_file_name);
|
||||||
|
loc_logger_init(DEBUG_LEVEL, TIMESTAMP);
|
||||||
|
return; /* no parameter file */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Clear all validity bits */
|
||||||
|
for(i = 0; NULL != config_table && i < table_length; i++)
|
||||||
|
{
|
||||||
|
if(NULL != config_table[i].param_set)
|
||||||
|
{
|
||||||
|
*(config_table[i].param_set) = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
while(fgets(input_buf, LOC_MAX_PARAM_LINE, gps_conf_fp) != NULL)
|
||||||
|
{
|
||||||
|
memset(&config_value, 0, sizeof(config_value));
|
||||||
|
|
||||||
|
/* Separate variable and value */
|
||||||
|
config_value.param_name = strtok_r(input_buf, "=", &lasts);
|
||||||
|
if (config_value.param_name == NULL) continue; /* skip lines that do not contain "=" */
|
||||||
|
config_value.param_str_value = strtok_r(NULL, "=", &lasts);
|
||||||
|
if (config_value.param_str_value == NULL) continue; /* skip lines that do not contain two operands */
|
||||||
|
|
||||||
|
/* Trim leading and trailing spaces */
|
||||||
|
trim_space(config_value.param_name);
|
||||||
|
trim_space(config_value.param_str_value);
|
||||||
|
|
||||||
|
/* Parse numerical value */
|
||||||
|
if (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(i = 0; NULL != config_table && i < table_length; i++)
|
||||||
|
{
|
||||||
|
loc_set_config_entry(&config_table[i], &config_value);
|
||||||
|
}
|
||||||
|
|
||||||
|
for(i = 0; i < loc_param_num; i++)
|
||||||
|
{
|
||||||
|
loc_set_config_entry(&loc_parameter_table[i], &config_value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fclose(gps_conf_fp);
|
||||||
|
|
||||||
|
/* Initialize logging mechanism with parsed data */
|
||||||
|
loc_logger_init(DEBUG_LEVEL, TIMESTAMP);
|
||||||
|
}
|
83
gps/utils/loc_cfg.h
Executable file
83
gps/utils/loc_cfg.h
Executable file
@ -0,0 +1,83 @@
|
|||||||
|
/* Copyright (c) 2011-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_CFG_H
|
||||||
|
#define LOC_CFG_H
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#define LOC_MAX_PARAM_NAME 48
|
||||||
|
#define LOC_MAX_PARAM_STRING 80
|
||||||
|
#define LOC_MAX_PARAM_LINE 80
|
||||||
|
|
||||||
|
#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
|
||||||
|
*
|
||||||
|
*============================================================================*/
|
||||||
|
extern void loc_read_conf(const char* conf_file_name,
|
||||||
|
loc_param_s_type* config_table,
|
||||||
|
uint32_t table_length);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* LOC_CFG_H */
|
234
gps/utils/loc_log.cpp
Executable file
234
gps/utils/loc_log.cpp
Executable file
@ -0,0 +1,234 @@
|
|||||||
|
/* 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 "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_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;
|
||||||
|
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
gps/utils/loc_log.h
Executable file
68
gps/utils/loc_log.h
Executable 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 */
|
208
gps/utils/loc_target.cpp
Executable file
208
gps/utils/loc_target.cpp
Executable file
@ -0,0 +1,208 @@
|
|||||||
|
/* Copyright (c) 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 <stdio.h>
|
||||||
|
#include <stdlib.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 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
|
||||||
|
#define QCA1530_DETECT_TIMEOUT 30
|
||||||
|
#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[] = "persist.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;
|
||||||
|
}
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
property_get("ro.baseband", 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_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;
|
||||||
|
}
|
68
gps/utils/loc_target.h
Executable file
68
gps/utils/loc_target.h
Executable file
@ -0,0 +1,68 @@
|
|||||||
|
/* Copyright (c) 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_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_UNKNOWN TARGET_SET(GNSS_UNKNOWN, NO_SSC)
|
||||||
|
#define getTargetGnssType(target) (target>>1)
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C"
|
||||||
|
{
|
||||||
|
#endif
|
||||||
|
|
||||||
|
unsigned int loc_get_target(void);
|
||||||
|
|
||||||
|
/* 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_UNKNOWN
|
||||||
|
}GNSS_TARGET;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
NO_SSC = 0,
|
||||||
|
HAS_SSC
|
||||||
|
}SSC_TYPE;
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /*LOC_TARGET_H*/
|
186
gps/utils/loc_timer.c
Executable file
186
gps/utils/loc_timer.c
Executable file
@ -0,0 +1,186 @@
|
|||||||
|
/* 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
pthread_mutex_destroy(&t->timer_mutex);
|
||||||
|
pthread_cond_destroy(&t->timer_cond);
|
||||||
|
|
||||||
|
if(ETIMEDOUT == ret)
|
||||||
|
t->callback_func(t->user_data, ret);
|
||||||
|
|
||||||
|
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));
|
||||||
|
if (READY == t->state || WAITING == t->state) {
|
||||||
|
pthread_cond_signal(&t->timer_cond);
|
||||||
|
t->state = ABORT;
|
||||||
|
}
|
||||||
|
pthread_mutex_unlock(&(t->timer_mutex));
|
||||||
|
}
|
||||||
|
}
|
63
gps/utils/loc_timer.h
Executable file
63
gps/utils/loc_timer.h
Executable 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__
|
173
gps/utils/log_util.h
Executable file
173
gps/utils/log_util.h
Executable file
@ -0,0 +1,173 @@
|
|||||||
|
/* 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 __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);
|
||||||
|
|
||||||
|
#define DEBUG_DMN_LOC_API 1
|
||||||
|
|
||||||
|
#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 LOC_LOGE(...) \
|
||||||
|
if ((loc_logger.DEBUG_LEVEL >= 1) && (loc_logger.DEBUG_LEVEL <= 5)) { ALOGE("W/"__VA_ARGS__); } \
|
||||||
|
else if (loc_logger.DEBUG_LEVEL == 0xff) { ALOGE("W/"__VA_ARGS__); }
|
||||||
|
|
||||||
|
#define LOC_LOGW(...) \
|
||||||
|
if ((loc_logger.DEBUG_LEVEL >= 2) && (loc_logger.DEBUG_LEVEL <= 5)) { ALOGE("W/"__VA_ARGS__); } \
|
||||||
|
else if (loc_logger.DEBUG_LEVEL == 0xff) { ALOGW("W/"__VA_ARGS__); }
|
||||||
|
|
||||||
|
#define LOC_LOGI(...) \
|
||||||
|
if ((loc_logger.DEBUG_LEVEL >= 3) && (loc_logger.DEBUG_LEVEL <= 5)) { ALOGE("I/"__VA_ARGS__); } \
|
||||||
|
else if (loc_logger.DEBUG_LEVEL == 0xff) { ALOGI("I/"__VA_ARGS__); }
|
||||||
|
|
||||||
|
#define LOC_LOGD(...) \
|
||||||
|
if ((loc_logger.DEBUG_LEVEL >= 4) && (loc_logger.DEBUG_LEVEL <= 5)) { ALOGE("D/"__VA_ARGS__); } \
|
||||||
|
else if (loc_logger.DEBUG_LEVEL == 0xff) { ALOGD("D/"__VA_ARGS__); }
|
||||||
|
|
||||||
|
#define LOC_LOGV(...) \
|
||||||
|
if ((loc_logger.DEBUG_LEVEL >= 5) && (loc_logger.DEBUG_LEVEL <= 5)) { ALOGE("V/"__VA_ARGS__); } \
|
||||||
|
else if (loc_logger.DEBUG_LEVEL == 0xff) { ALOGV("V/"__VA_ARGS__); }
|
||||||
|
|
||||||
|
#else /* DEBUG_DMN_LOC_API */
|
||||||
|
|
||||||
|
#define LOC_LOGE(...) ALOGE("E/"__VA_ARGS__)
|
||||||
|
|
||||||
|
#define LOC_LOGW(...) ALOGW("W/"__VA_ARGS__)
|
||||||
|
|
||||||
|
#define LOC_LOGI(...) ALOGI("I/"__VA_ARGS__)
|
||||||
|
|
||||||
|
#define LOC_LOGD(...) ALOGD("D/"__VA_ARGS__)
|
||||||
|
|
||||||
|
#define LOC_LOGV(...) ALOGV("V/"__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, __func__, %s, "")
|
||||||
|
// Used for logging callflow to Modem
|
||||||
|
#define EXIT_LOG_CALLFLOW(SPEC, VAL) LOG_I(TO_MODEM, __func__, SPEC, VAL)
|
||||||
|
// Used for logging callflow from Modem(TO_MODEM, __func__, %s, "")
|
||||||
|
#define MODEM_LOG_CALLFLOW(SPEC, VAL) LOG_I(FROM_MODEM, __func__, 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
gps/utils/msg_q.c
Executable file
336
gps/utils/msg_q.c
Executable 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
gps/utils/msg_q.h
Executable file
207
gps/utils/msg_q.h
Executable 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__ */
|
3
idc/sec_e-pen.idc
Executable file
3
idc/sec_e-pen.idc
Executable file
@ -0,0 +1,3 @@
|
|||||||
|
touch.deviceType = pointer
|
||||||
|
touch.orientationAware = 1
|
||||||
|
cursor.mode = navigation
|
43
include/camera/CameraParametersExtra.h
Executable file
43
include/camera/CameraParametersExtra.h
Executable file
@ -0,0 +1,43 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2014 The CyanogenMod Project
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define CAMERA_PARAMETERS_EXTRA_C \
|
||||||
|
const char CameraParameters::KEY_DIS[] = "dis"; \
|
||||||
|
const char CameraParameters::DIS_DISABLE[] = "disable"; \
|
||||||
|
\
|
||||||
|
const char CameraParameters::KEY_ZSL[] = "zsl"; \
|
||||||
|
const char CameraParameters::ZSL_ON[] = "on"; \
|
||||||
|
const char CameraParameters::ZSL_OFF[] = "off"; \
|
||||||
|
\
|
||||||
|
int CameraParameters::getInt64(const char *key) const { return -1; } \
|
||||||
|
\
|
||||||
|
/* LAST_LINE OF CAMERA_PARAMETERS_EXTRA_C, every line before this one *MUST* have
|
||||||
|
* a backslash \ at the end of the line or else everything will break.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define CAMERA_PARAMETERS_EXTRA_H \
|
||||||
|
static const char KEY_DIS[]; \
|
||||||
|
static const char DIS_DISABLE[]; \
|
||||||
|
\
|
||||||
|
static const char KEY_ZSL[]; \
|
||||||
|
static const char ZSL_ON[]; \
|
||||||
|
static const char ZSL_OFF[]; \
|
||||||
|
\
|
||||||
|
int getInt64(const char *key) const; \
|
||||||
|
\
|
||||||
|
/* LAST_LINE OF CAMERA_PARAMETERS_EXTRA_H, every line before this one *MUST* have
|
||||||
|
* a backslash \ at the end of the line or else everything will break.
|
||||||
|
*/
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user