init 16.0

This commit is contained in:
Valera1978 2019-02-11 23:56:38 +03:00
parent 4695aca525
commit 5bb919d197
284 changed files with 4994 additions and 4807 deletions

0
Android.mk Normal file → Executable file
View file

2
AndroidProducts.mk Normal file → Executable file
View file

@ -14,4 +14,4 @@
# limitations under the License. # limitations under the License.
PRODUCT_MAKEFILES := \ PRODUCT_MAKEFILES := \
$(LOCAL_DIR)/full_gts3llte.mk $(LOCAL_DIR)/lineage_gts3llte.mk

View file

@ -1,5 +1,6 @@
# #
# Copyright (C) 2016 The CyanogenMod Project # Copyright (C) 2016 The CyanogenMod Project
# Copyright (C) 2017-2018 The LineageOS Project
# #
# Licensed under the Apache License, Version 2.0 (the "License"); # Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License. # you may not use this file except in compliance with the License.
@ -12,6 +13,7 @@
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and # See the License for the specific language governing permissions and
# limitations under the License. # limitations under the License.
#
BOARD_VENDOR := samsung BOARD_VENDOR := samsung
@ -22,6 +24,9 @@ TARGET_SPECIFIC_HEADER_PATH := $(DEVICE_PATH)/include
# Assert # Assert
TARGET_OTA_ASSERT_DEVICE := gts3llte TARGET_OTA_ASSERT_DEVICE := gts3llte
# ADB Legacy Interface
TARGET_USES_LEGACY_ADB_INTERFACE := true
# Architecture # Architecture
TARGET_ARCH := arm64 TARGET_ARCH := arm64
TARGET_ARCH_VARIANT := armv8-a TARGET_ARCH_VARIANT := armv8-a
@ -30,7 +35,7 @@ TARGET_CPU_ABI2 :=
TARGET_CPU_VARIANT := kryo TARGET_CPU_VARIANT := kryo
TARGET_2ND_ARCH := arm TARGET_2ND_ARCH := arm
TARGET_2ND_ARCH_VARIANT := armv7-a-neon TARGET_2ND_ARCH_VARIANT := armv8-a
TARGET_2ND_CPU_ABI := armeabi-v7a TARGET_2ND_CPU_ABI := armeabi-v7a
TARGET_2ND_CPU_ABI2 := armeabi TARGET_2ND_CPU_ABI2 := armeabi
TARGET_2ND_CPU_VARIANT := kryo TARGET_2ND_CPU_VARIANT := kryo
@ -43,23 +48,29 @@ TARGET_NO_BOOTLOADER := true
# Kernel # Kernel
BOARD_KERNEL_BASE := 0x80000000 BOARD_KERNEL_BASE := 0x80000000
BOARD_KERNEL_CMDLINE := console=null androidboot.hardware=qcom msm_rtb.filter=0x237 ehci-hcd.park=3 androidboot.bootdevice=7464900.sdhci lpm_levels.sleep_disabled=1 rcupdate.rcu_expedited=1 cma=32M@0-0xffffffff BOARD_KERNEL_CMDLINE := androidboot.hardware=qcom msm_rtb.filter=0x237 ehci-hcd.park=3 androidboot.bootdevice=7464900.sdhci lpm_levels.sleep_disabled=1 rcupdate.rcu_expedited=1 cma=32M@0-0xffffffff
BOARD_KERNEL_IMAGE_NAME := Image.gz BOARD_KERNEL_IMAGE_NAME := Image.gz
BOARD_KERNEL_PAGESIZE := 4096 BOARD_KERNEL_PAGESIZE := 4096
BOARD_KERNEL_SEPARATED_DT := true BOARD_KERNEL_SEPARATED_DT := true
BOARD_MKBOOTIMG_ARGS := --kernel_offset 0x00008000 --ramdisk_offset 0x02200000 --tags_offset 0x02000000 --board SRPPK08B000KU BOARD_MKBOOTIMG_ARGS := --kernel_offset 0x00008000 --ramdisk_offset 0x02200000 --tags_offset 0x02000000
TARGET_KERNEL_SOURCE := kernel/samsung/msm8996 TARGET_KERNEL_SOURCE := kernel/samsung/msm8996
BOARD_CUSTOM_BOOTIMG := true BOARD_CUSTOM_BOOTIMG := true
BOARD_CUSTOM_BOOTIMG_MK := hardware/samsung/mkbootimg.mk BOARD_CUSTOM_BOOTIMG_MK := hardware/samsung/mkbootimg.mk
TARGET_KERNEL_CROSS_COMPILE_PREFIX := aarch64-linux-android- TARGET_KERNEL_CROSS_COMPILE_PREFIX := aarch64-linux-android-
TARGET_KERNEL_CONFIG := lineage_gts3llte_defconfig TARGET_KERNEL_CONFIG := lineage_gts3llte_defconfig
TARGET_COMPILE_WITH_MSM_KERNEL := true
#SELINUX_IGNORE_NEVERALLOWS := true
# Platform # Platform
TARGET_BOARD_PLATFORM := msm8996 TARGET_BOARD_PLATFORM := msm8996
TARGET_BOARD_PLATFORM_GPU := qcom-adreno530 TARGET_BOARD_PLATFORM_GPU := qcom-adreno530
# Properties
#BOARD_PROPERTY_OVERRIDES_SPLIT_ENABLED := true
# ANT+ # ANT+
BOARD_ANT_WIRELESS_DEVICE := "qualcomm-uart" BOARD_ANT_WIRELESS_DEVICE := "qualcomm-hidl"
# Audio # Audio
#AUDIO_FEATURE_ENABLED_AAC_ADTS_OFFLOAD := true #AUDIO_FEATURE_ENABLED_AAC_ADTS_OFFLOAD := true
@ -84,10 +95,11 @@ AUDIO_FEATURE_ENABLED_PCM_OFFLOAD_24 := true
#AUDIO_FEATURE_ENABLED_WMA_OFFLOAD := true #AUDIO_FEATURE_ENABLED_WMA_OFFLOAD := true
AUDIO_USE_LL_AS_PRIMARY_OUTPUT := true AUDIO_USE_LL_AS_PRIMARY_OUTPUT := true
#BOARD_SUPPORTS_SOUND_TRIGGER := true #BOARD_SUPPORTS_SOUND_TRIGGER := true
BOARD_USES_ALSA_AUDIO := true #BOARD_USES_ALSA_AUDIO := true
#USE_CUSTOM_AUDIO_POLICY := 1 #USE_CUSTOM_AUDIO_POLICY := 1
#AUDIO_FEATURE_ENABLED_DS2_DOLBY_DAP := true # Bionic
TARGET_NEEDS_LEGACY_MUTEX_HANDLE := true
# Bluetooth # Bluetooth
BOARD_BLUETOOTH_BDROID_BUILDCFG_INCLUDE_DIR := $(DEVICE_PATH)/bluetooth BOARD_BLUETOOTH_BDROID_BUILDCFG_INCLUDE_DIR := $(DEVICE_PATH)/bluetooth
@ -97,44 +109,66 @@ BOARD_HAVE_BLUETOOTH_QCOM := true
QCOM_BT_USE_BTNV := true QCOM_BT_USE_BTNV := true
BOARD_BLUETOOTH_BDROID_HCILP_INCLUDED := false BOARD_BLUETOOTH_BDROID_HCILP_INCLUDED := false
# CAF HALs
TARGET_QCOM_MEDIA_VARIANT := caf-msm8996
TARGET_QCOM_DISPLAY_VARIANT := caf-msm8996
PRODUCT_SOONG_NAMESPACES += \
hardware/qcom/display-$(TARGET_QCOM_DISPLAY_VARIANT) \
hardware/qcom/media-$(TARGET_QCOM_MEDIA_VARIANT)
# Camera # Camera
USE_CAMERA_STUB := true USE_CAMERA_STUB := true
USE_DEVICE_SPECIFIC_CAMERA := true USE_DEVICE_SPECIFIC_CAMERA := true
TARGET_USES_MEDIA_EXTENSIONS := true TARGET_USES_MEDIA_EXTENSIONS := true
# Charger # Charger
#BOARD_CHARGER_ENABLE_SUSPEND := true BOARD_CHARGER_ENABLE_SUSPEND := true
# Dex
ifeq ($(HOST_OS),linux)
ifneq ($(TARGET_BUILD_VARIANT),eng)
WITH_DEXPREOPT ?= true
endif
endif
WITH_DEXPREOPT_BOOT_IMG_AND_SYSTEM_SERVER_ONLY ?= true
# Display # Display
BOARD_USES_ADRENO := true
MAX_VIRTUAL_DISPLAY_DIMENSION := 4096 MAX_VIRTUAL_DISPLAY_DIMENSION := 4096
TARGET_FORCE_HWC_FOR_VIRTUAL_DISPLAYS := true TARGET_FORCE_HWC_FOR_VIRTUAL_DISPLAYS := true
TARGET_USES_C2D_COMPOSITION := true
TARGET_USES_ION := true
TARGET_USES_NEW_ION_API :=true
TARGET_USES_GRALLOC1 := true TARGET_USES_GRALLOC1 := true
TARGET_USES_HWC2 := true TARGET_USES_HWC2 := true
TARGET_USES_ION := true
TARGET_USES_OVERLAY := true TARGET_USES_OVERLAY := true
USE_OPENGL_RENDERER := true
MAX_EGL_CACHE_KEY_SIZE := 12*1024 MAX_EGL_CACHE_KEY_SIZE := 12*1024
MAX_EGL_CACHE_SIZE := 2048*1024 MAX_EGL_CACHE_SIZE := 2048*1024
OVERRIDE_RS_DRIVER := libRSDriver_adreno.so NUM_FRAMEBUFFER_SURFACE_BUFFERS := 3
VSYNC_EVENT_PHASE_OFFSET_NS := 2000000
SF_VSYNC_EVENT_PHASE_OFFSET_NS := 6000000 SF_VSYNC_EVENT_PHASE_OFFSET_NS := 6000000
VSYNC_EVENT_PHASE_OFFSET_NS := 2000000
OVERRIDE_RS_DRIVER:= libRSDriver_adreno.so
USE_OPENGL_RENDERER := true
# surfaceflinger orientation
SF_PRIMARY_DISPLAY_ORIENTATION := 270
# DRM
TARGET_ENABLE_MEDIADRM_64 := true
# Encryption # Encryption
TARGET_HW_DISK_ENCRYPTION := true TARGET_HW_DISK_ENCRYPTION := true
# Filesystem # Filesystem
TARGET_FS_CONFIG_GEN := $(DEVICE_PATH)/config.fs
# HIDL
DEVICE_FRAMEWORK_COMPATIBILITY_MATRIX_FILE := $(DEVICE_PATH)/configs/vendor_framework_compatibility_matrix.xml
#DEVICE_FRAMEWORK_MANIFEST_FILE := $(DEVICE_PATH)/configs/framework_manifest.xml
DEVICE_MANIFEST_FILE := $(DEVICE_PATH)/configs/manifest.xml
DEVICE_MATRIX_FILE := $(DEVICE_PATH)/configs/compatibility_matrix.xml
# Lineage Hardware
JAVA_SOURCE_OVERLAYS := org.lineageos.hardware|$(DEVICE_PATH)/lineagehw|**/*.java
# Partitions
BOARD_BOOTIMAGE_PARTITION_SIZE := 79691776 BOARD_BOOTIMAGE_PARTITION_SIZE := 79691776
BOARD_CACHEIMAGE_PARTITION_SIZE := 209715200 BOARD_CACHEIMAGE_PARTITION_SIZE := 209715200
BOARD_CACHEIMAGE_FILE_SYSTEM_TYPE := f2fs BOARD_CACHEIMAGE_FILE_SYSTEM_TYPE := f2fs
@ -144,24 +178,17 @@ BOARD_SYSTEMIMAGE_PARTITION_SIZE := 3072000000
#BOARD_SYSTEMIMAGE_PARTITION_SIZE := 4194304000 #BOARD_SYSTEMIMAGE_PARTITION_SIZE := 4194304000
BOARD_USERDATAIMAGE_PARTITION_SIZE := 26226982912 BOARD_USERDATAIMAGE_PARTITION_SIZE := 26226982912
BOARD_FLASH_BLOCK_SIZE := 131072 BOARD_FLASH_BLOCK_SIZE := 131072
TARGET_USES_MKE2FS := true
# Filesystem
TARGET_FS_CONFIG_GEN := $(DEVICE_PATH)/config.fs
TARGET_EXFAT_DRIVER := exfat
# Fingerprint # Fingerprint
TARGET_SEC_FP_HAL_VARIANT := bauth TARGET_SEC_FP_HAL_VARIANT := bauth
# HIDL
DEVICE_MANIFEST_FILE := $(DEVICE_PATH)/configs/manifest.xml
DEVICE_MATRIX_FILE := $(DEVICE_PATH)/configs/compatibility_matrix.xml
TARGET_LD_SHIM_LIBS := \ TARGET_LD_SHIM_LIBS := \
/system/vendor/lib/libbauthserver.so|/vendor/lib/libbauthtzcommon_shim.so \ /system/vendor/lib/libbauthserver.so|/vendor/lib/libbauthtzcommon_shim.so \
/system/vendor/lib64/libbauthserver.so|/vendor/lib64/libbauthtzcommon_shim.so /system/vendor/lib64/libbauthserver.so|/vendor/lib64/libbauthtzcommon_shim.so
TARGET_LD_SHIM_LIBS += \ TARGET_LD_SHIM_LIBS += \
/system/vendor/lib/hw/camera.msm8996.so|/system/vendor/lib/libshims_cameraclient.so \ /system/vendor/lib/hw/camera.msm8996.so|/system/vendor/lib/libshims_cameraclient.so
# Init # Init
TARGET_PLATFORM_DEVICE_BASE := /devices/soc/ TARGET_PLATFORM_DEVICE_BASE := /devices/soc/
@ -169,17 +196,13 @@ TARGET_PLATFORM_DEVICE_BASE := /devices/soc/
# Keymaster # Keymaster
TARGET_PROVIDES_KEYMASTER := true TARGET_PROVIDES_KEYMASTER := true
# Lineage Hardware
BOARD_HARDWARE_CLASS += \
$(DEVICE_PATH)/lineagehw
# Power # Power
#TARGET_HAS_NO_WIFI_STATS := true TARGET_HAS_NO_WLAN_STATS := true
TARGET_POWERHAL_VARIANT := qcom TARGET_USES_INTERACTION_BOOST := true
# QCOM # QCOM
BOARD_USES_QCOM_HARDWARE := true BOARD_USES_QCOM_HARDWARE := true
TARGET_USE_SDCLANG := true #TARGET_USE_SDCLANG := true
# Ramdisk # Ramdisk
BOARD_ROOT_EXTRA_FOLDERS := dsp efs firmware firmware-modem persist BOARD_ROOT_EXTRA_FOLDERS := dsp efs firmware firmware-modem persist
@ -194,12 +217,15 @@ TARGET_USERIMAGES_USE_F2FS := true
# Treble # Treble
#PRODUCT_FULL_TREBLE_OVERRIDE := true #PRODUCT_FULL_TREBLE_OVERRIDE := true
PRODUCT_VENDOR_MOVE_ENABLED := true #PRODUCT_VENDOR_MOVE_ENABLED := true
# RIL # RIL
PROTOBUF_SUPPORTED := true PROTOBUF_SUPPORTED := true
TARGET_RIL_VARIANT := caf TARGET_RIL_VARIANT := caf
# Security patch level - T825XXU2BRL2
VENDOR_SECURITY_PATCH := 2018-12-01
# SELinux # SELinux
include device/qcom/sepolicy/sepolicy.mk include device/qcom/sepolicy/sepolicy.mk
BOARD_SEPOLICY_DIRS += $(DEVICE_PATH)/sepolicy BOARD_SEPOLICY_DIRS += $(DEVICE_PATH)/sepolicy

76
config.fs Normal file → Executable file
View file

@ -1,14 +1,20 @@
[AID_QCOM_DIAG] [AID_VENDOR_QCOM_DIAG]
value:2950 value:2950
[AID_QTI_DIAG] [AID_VENDOR_QTI_DIAG]
value:2901 value:2901
[AID_RFS] [AID_VENDOR_QDSS]
value:2951 value:2902
[AID_RFS_SHARED] [AID_VENDOR_RFS]
value:2952 value:2903
[AID_VENDOR_RFS_SHARED]
value:2904
[AID_VENDOR_ADPL_ODL]
value:2905
[vendor/bin/wcnss_filter] [vendor/bin/wcnss_filter]
mode: 0755 mode: 0755
@ -16,25 +22,19 @@ user: AID_BLUETOOTH
group: AID_BLUETOOTH group: AID_BLUETOOTH
caps: BLOCK_SUSPEND caps: BLOCK_SUSPEND
[system/vendor/bin/wcnss_filter]
mode: 0755
user: AID_BLUETOOTH
group: AID_BLUETOOTH
caps: BLOCK_SUSPEND
[vendor/bin/hw/android.hardware.bluetooth@1.0-service-qti] [vendor/bin/hw/android.hardware.bluetooth@1.0-service-qti]
mode: 0755 mode: 0755
user: AID_BLUETOOTH user: AID_BLUETOOTH
group: AID_BLUETOOTH group: AID_BLUETOOTH
caps: BLOCK_SUSPEND NET_ADMIN caps: BLOCK_SUSPEND NET_ADMIN
[system/vendor/bin/hw/android.hardware.bluetooth@1.0-service-qti] [vendor/bin/hw/android.hardware.bluetooth@1.0-service-qti]
mode: 0755 mode: 0755
user: AID_SYSTEM user: AID_SYSTEM
group: AID_SYSTEM group: AID_SYSTEM
caps: BLOCK_SUSPEND NET_ADMIN caps: BLOCK_SUSPEND NET_ADMIN
[system/bin/cnss-daemon] [vendor/bin/cnss-daemon]
mode: 0755 mode: 0755
user: AID_BLUETOOTH user: AID_BLUETOOTH
group: AID_BLUETOOTH group: AID_BLUETOOTH
@ -46,48 +46,18 @@ user: AID_SYSTEM
group: AID_SYSTEM group: AID_SYSTEM
caps: NET_BIND_SERVICE caps: NET_BIND_SERVICE
[system/vendor/bin/pm-service]
mode: 0755
user: AID_SYSTEM
group: AID_SYSTEM
caps: NET_BIND_SERVICE
[system/bin/pm-service]
mode: 0755
user: AID_SYSTEM
group: AID_SYSTEM
caps: NET_BIND_SERVICE
[vendor/bin/pd-mapper] [vendor/bin/pd-mapper]
mode: 0755 mode: 0755
user: AID_SYSTEM user: AID_SYSTEM
group: AID_SYSTEM group: AID_SYSTEM
caps: NET_BIND_SERVICE caps: NET_BIND_SERVICE
[system/vendor/bin/pd-mapper]
mode: 0755
user: AID_SYSTEM
group: AID_SYSTEM
caps: NET_BIND_SERVICE
[system/bin/pd-mapper]
mode: 0755
user: AID_SYSTEM
group: AID_SYSTEM
caps: NET_BIND_SERVICE
[vendor/bin/imsdatadaemon] [vendor/bin/imsdatadaemon]
mode: 0755 mode: 0755
user: AID_SYSTEM user: AID_SYSTEM
group: AID_SYSTEM group: AID_SYSTEM
caps: NET_BIND_SERVICE caps: NET_BIND_SERVICE
[system/vendor/bin/imsdatadaemon]
mode: 0755
user: AID_SYSTEM
group: AID_SYSTEM
caps: NET_BIND_SERVICE
[vendor/bin/ims_rtp_daemon] [vendor/bin/ims_rtp_daemon]
mode: 0755 mode: 0755
user: AID_SYSTEM user: AID_SYSTEM
@ -104,13 +74,7 @@ caps: NET_BIND_SERVICE
mode: 0755 mode: 0755
user: AID_SYSTEM user: AID_SYSTEM
group: AID_RADIO group: AID_RADIO
caps: WAKE_ALARM caps: NET_BIND_SERVICE BLOCK_SUSPEND WAKE_ALARM
[system/vendor/bin/imsrcsd]
mode: 0755
user: AID_SYSTEM
group: AID_RADIO
caps: WAKE_ALARM
[vendor/bin/cnd] [vendor/bin/cnd]
mode: 0755 mode: 0755
@ -118,23 +82,17 @@ user: AID_SYSTEM
group: AID_SYSTEM group: AID_SYSTEM
caps: NET_BIND_SERVICE BLOCK_SUSPEND NET_ADMIN caps: NET_BIND_SERVICE BLOCK_SUSPEND NET_ADMIN
[system/vendor/bin/cnd]
mode: 0755
user: AID_SYSTEM
group: AID_SYSTEM
caps: NET_BIND_SERVICE BLOCK_SUSPEND NET_ADMIN
[vendor/bin/slim_daemon] [vendor/bin/slim_daemon]
mode: 0755 mode: 0755
user: AID_GPS user: AID_GPS
group: AID_GPS group: AID_GPS
caps: NET_BIND_SERVICE caps: NET_BIND_SERVICE
[system/vendor/bin/slim_daemon] [vendor/bin/loc_launcher]
mode: 0755 mode: 0755
user: AID_GPS user: AID_GPS
group: AID_GPS group: AID_GPS
caps: NET_BIND_SERVICE caps: SETUID SETGID
[vendor/bin/xtwifi-client] [vendor/bin/xtwifi-client]
mode: 0755 mode: 0755

0
configs/audio/audio_platform_info.xml Normal file → Executable file
View file

0
configs/audio/mixer_paths_tasha.xml Normal file → Executable file
View file

View file

@ -7,14 +7,14 @@
<instance>default</instance> <instance>default</instance>
</interface> </interface>
</hal> </hal>
<!-- <hal format="hidl" optional="false"> <hal format="hidl" optional="false">
<name>android.frameworks.sensorservice</name> <name>android.frameworks.sensorservice</name>
<version>1.0</version> <version>1.0</version>
<interface> <interface>
<name>ISensorManager</name> <name>ISensorManager</name>
<instance>default</instance> <instance>default</instance>
</interface> </interface>
</hal> --> </hal>
<hal format="hidl" optional="false"> <hal format="hidl" optional="false">
<name>android.hidl.allocator</name> <name>android.hidl.allocator</name>
<version>1.0</version> <version>1.0</version>
@ -55,4 +55,5 @@
<instance>default</instance> <instance>default</instance>
</interface> </interface>
</hal> </hal>
</compatibility-matrix> </compatibility-matrix>

0
configs/data/dsi_config.xml Normal file → Executable file
View file

0
configs/data/netmgr_config.xml Normal file → Executable file
View file

0
configs/data/qmi_config.xml Normal file → Executable file
View file

159
configs/manifest.xml Normal file → Executable file
View file

@ -1,3 +1,30 @@
<!-- Copyright (c) 2017, 2018 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.
-->
<manifest version="1.0" type="device"> <manifest version="1.0" type="device">
<hal format="hidl"> <hal format="hidl">
<name>android.hardware.biometrics.fingerprint</name> <name>android.hardware.biometrics.fingerprint</name>
@ -19,7 +46,7 @@
</hal> </hal>
<hal format="hidl"> <hal format="hidl">
<name>android.hardware.audio</name> <name>android.hardware.audio</name>
<transport>hwbinder</transport> <transport arch="32">passthrough</transport>
<version>2.0</version> <version>2.0</version>
<interface> <interface>
<name>IDevicesFactory</name> <name>IDevicesFactory</name>
@ -28,14 +55,14 @@
</hal> </hal>
<hal format="hidl"> <hal format="hidl">
<name>android.hardware.audio.effect</name> <name>android.hardware.audio.effect</name>
<transport>hwbinder</transport> <transport arch="32">passthrough</transport>
<version>2.0</version> <version>2.0</version>
<interface> <interface>
<name>IEffectsFactory</name> <name>IEffectsFactory</name>
<instance>default</instance> <instance>default</instance>
</interface> </interface>
</hal> </hal>
<!-- <hal format="hidl"> <hal format="hidl">
<name>android.hardware.bluetooth</name> <name>android.hardware.bluetooth</name>
<transport>hwbinder</transport> <transport>hwbinder</transport>
<version>1.0</version> <version>1.0</version>
@ -43,8 +70,8 @@
<name>IBluetoothHci</name> <name>IBluetoothHci</name>
<instance>default</instance> <instance>default</instance>
</interface> </interface>
</hal> --> </hal>
<!-- <hal format="hidl"> <hal format="hidl">
<name>android.hardware.camera.provider</name> <name>android.hardware.camera.provider</name>
<transport arch="32">passthrough</transport> <transport arch="32">passthrough</transport>
<version>2.4</version> <version>2.4</version>
@ -52,11 +79,20 @@
<name>ICameraProvider</name> <name>ICameraProvider</name>
<instance>legacy/0</instance> <instance>legacy/0</instance>
</interface> </interface>
</hal> --> </hal>
<hal format="hidl"> <hal format="hidl">
<name>android.hardware.configstore</name> <name>android.hardware.cas</name>
<transport>hwbinder</transport> <transport>hwbinder</transport>
<version>1.0</version> <version>1.0</version>
<interface>
<name>IMediaCasService</name>
<instance>default</instance>
</interface>
</hal>
<hal format="hidl">
<name>android.hardware.configstore</name>
<transport>hwbinder</transport>
<version>1.1</version>
<interface> <interface>
<name>ISurfaceFlingerConfigs</name> <name>ISurfaceFlingerConfigs</name>
<instance>default</instance> <instance>default</instance>
@ -69,17 +105,19 @@
<interface> <interface>
<name>ICryptoFactory</name> <name>ICryptoFactory</name>
<instance>default</instance> <instance>default</instance>
<instance>widevine</instance>
</interface> </interface>
<interface> <interface>
<name>IDrmFactory</name> <name>IDrmFactory</name>
<instance>default</instance> <instance>default</instance>
<instance>widevine</instance>
</interface> </interface>
<fqname>@1.1::ICryptoFactory/clearkey</fqname>
<fqname>@1.1::IDrmFactory/clearkey</fqname>
<fqname>@1.1::ICryptoFactory/widevine</fqname>
<fqname>@1.1::IDrmFactory/widevine</fqname>
</hal> </hal>
<hal format="hidl"> <hal format="hidl">
<name>android.hardware.gatekeeper</name> <name>android.hardware.gatekeeper</name>
<transport>hwbinder</transport> <transport arch="32+64">passthrough</transport>
<version>1.0</version> <version>1.0</version>
<interface> <interface>
<name>IGatekeeper</name> <name>IGatekeeper</name>
@ -93,8 +131,9 @@
<interface> <interface>
<name>IGnss</name> <name>IGnss</name>
<instance>default</instance> <instance>default</instance>
<instance>gnss_vendor</instance>
</interface> </interface>
<fqname>@1.0::IGnss/default</fqname>
<fqname>@1.0::IGnss/gnss_vendor</fqname>
</hal> </hal>
<hal format="hidl"> <hal format="hidl">
<name>android.hardware.graphics.allocator</name> <name>android.hardware.graphics.allocator</name>
@ -126,7 +165,7 @@
<hal format="hidl"> <hal format="hidl">
<name>android.hardware.health</name> <name>android.hardware.health</name>
<transport>hwbinder</transport> <transport>hwbinder</transport>
<version>1.0</version> <version>2.0</version>
<interface> <interface>
<name>IHealth</name> <name>IHealth</name>
<instance>default</instance> <instance>default</instance>
@ -141,6 +180,15 @@
<instance>default</instance> <instance>default</instance>
</interface> </interface>
</hal> </hal>
<hal format="hidl">
<name>android.hardware.light</name>
<transport arch="32+64">passthrough</transport>
<version>2.0</version>
<interface>
<name>ILight</name>
<instance>default</instance>
</interface>
</hal>
<hal format="hidl"> <hal format="hidl">
<name>android.hardware.media.omx</name> <name>android.hardware.media.omx</name>
<transport>hwbinder</transport> <transport>hwbinder</transport>
@ -166,7 +214,7 @@
<hal format="hidl"> <hal format="hidl">
<name>android.hardware.power</name> <name>android.hardware.power</name>
<transport>hwbinder</transport> <transport>hwbinder</transport>
<version>1.0</version> <version>1.1</version>
<interface> <interface>
<name>IPower</name> <name>IPower</name>
<instance>default</instance> <instance>default</instance>
@ -179,10 +227,12 @@
<interface> <interface>
<name>IRadio</name> <name>IRadio</name>
<instance>slot1</instance> <instance>slot1</instance>
<instance>slot2</instance>
</interface> </interface>
<interface> <interface>
<name>ISap</name> <name>ISap</name>
<instance>slot1</instance> <instance>slot1</instance>
<instance>slot2</instance>
</interface> </interface>
</hal> </hal>
<hal format="hidl"> <hal format="hidl">
@ -192,6 +242,7 @@
<interface> <interface>
<name>IOemHook</name> <name>IOemHook</name>
<instance>slot1</instance> <instance>slot1</instance>
<instance>slot2</instance>
</interface> </interface>
</hal> </hal>
<hal format="hidl"> <hal format="hidl">
@ -214,8 +265,8 @@
</hal> </hal>
<hal format="hidl"> <hal format="hidl">
<name>android.hardware.soundtrigger</name> <name>android.hardware.soundtrigger</name>
<transport>hwbinder</transport> <transport arch="32">passthrough</transport>
<version>2.0</version> <version>2.1</version>
<interface> <interface>
<name>ISoundTriggerHw</name> <name>ISoundTriggerHw</name>
<instance>default</instance> <instance>default</instance>
@ -239,6 +290,15 @@
<instance>default</instance> <instance>default</instance>
</interface> </interface>
</hal> </hal>
<hal format="hidl">
<name>android.hardware.usb</name>
<transport>hwbinder</transport>
<version>1.0</version>
<interface>
<name>IUsb</name>
<instance>default</instance>
</interface>
</hal>
<hal format="hidl"> <hal format="hidl">
<name>android.hardware.vibrator</name> <name>android.hardware.vibrator</name>
<transport>hwbinder</transport> <transport>hwbinder</transport>
@ -251,7 +311,7 @@
<hal format="hidl"> <hal format="hidl">
<name>android.hardware.wifi</name> <name>android.hardware.wifi</name>
<transport>hwbinder</transport> <transport>hwbinder</transport>
<version>1.1</version> <version>1.2</version>
<interface> <interface>
<name>IWifi</name> <name>IWifi</name>
<instance>default</instance> <instance>default</instance>
@ -260,12 +320,21 @@
<hal format="hidl"> <hal format="hidl">
<name>android.hardware.wifi.supplicant</name> <name>android.hardware.wifi.supplicant</name>
<transport>hwbinder</transport> <transport>hwbinder</transport>
<version>1.0</version> <version>1.1</version>
<interface> <interface>
<name>ISupplicant</name> <name>ISupplicant</name>
<instance>default</instance> <instance>default</instance>
</interface> </interface>
</hal> </hal>
<hal format="hidl">
<name>com.qualcomm.qti.ant</name>
<transport>hwbinder</transport>
<version>1.0</version>
<interface>
<name>IAntHci</name>
<instance>default</instance>
</interface>
</hal>
<hal format="hidl"> <hal format="hidl">
<name>com.qualcomm.qti.dpm.api</name> <name>com.qualcomm.qti.dpm.api</name>
<transport>hwbinder</transport> <transport>hwbinder</transport>
@ -296,7 +365,7 @@
<hal format="hidl"> <hal format="hidl">
<name>com.quicinc.cne.api</name> <name>com.quicinc.cne.api</name>
<transport>hwbinder</transport> <transport>hwbinder</transport>
<version>1.0</version> <version>1.1</version>
<interface> <interface>
<name>IApiService</name> <name>IApiService</name>
<instance>cnd</instance> <instance>cnd</instance>
@ -305,7 +374,7 @@
<hal format="hidl"> <hal format="hidl">
<name>com.quicinc.cne.server</name> <name>com.quicinc.cne.server</name>
<transport>hwbinder</transport> <transport>hwbinder</transport>
<version>2.0</version> <version>2.2</version>
<interface> <interface>
<name>IServer</name> <name>IServer</name>
<instance>cnd</instance> <instance>cnd</instance>
@ -340,10 +409,14 @@
</hal> </hal>
<hal format="hidl"> <hal format="hidl">
<name>vendor.lineage.livedisplay</name> <name>vendor.lineage.livedisplay</name>
<transport>hwbinder</transport> <transport arch="32+64">passthrough</transport>
<version>1.0</version> <version>2.0</version>
<interface> <interface>
<name>IColor</name> <name>IDisplayModes</name>
<instance>default</instance>
</interface>
<interface>
<name>IPictureAdjustment</name>
<instance>default</instance> <instance>default</instance>
</interface> </interface>
</hal> </hal>
@ -357,13 +430,51 @@
</interface> </interface>
</hal> </hal>
<hal format="hidl"> <hal format="hidl">
<name>vendor.qti.gnss</name> <name>vendor.lineage.trust</name>
<transport>hwbinder</transport> <transport>hwbinder</transport>
<version>1.0</version> <version>1.0</version>
<interface>
<name>IUsbRestrict</name>
<instance>default</instance>
</interface>
</hal>
<hal format="hidl">
<name>vendor.qti.gnss</name>
<transport>hwbinder</transport>
<version>1.2</version>
<interface> <interface>
<name>ILocHidlGnss</name> <name>ILocHidlGnss</name>
<instance>gnss_vendor</instance> <instance>gnss_vendor</instance>
</interface> </interface>
<fqname>@1.2::ILocHidlGnss/gnss_vendor</fqname>
</hal>
<hal format="hidl">
<name>vendor.qti.gnss</name>
<transport>hwbinder</transport>
<version>2.0</version>
<interface>
<name>ILocHidlGnss</name>
<instance>gnss_vendor</instance>
</interface>
<fqname>@2.0::ILocHidlGnss/gnss_vendor</fqname>
</hal>
<hal format="hidl">
<name>vendor.qti.hardware.alarm</name>
<transport>hwbinder</transport>
<version>1.0</version>
<interface>
<name>IAlarm</name>
<instance>default</instance>
</interface>
</hal>
<hal format="hidl">
<name>vendor.qti.hardware.data.latency</name>
<transport>hwbinder</transport>
<version>1.0</version>
<interface>
<name>ILinkLatency</name>
<instance>default</instance>
</interface>
</hal> </hal>
<hal format="hidl"> <hal format="hidl">
<name>vendor.qti.hardware.iop</name> <name>vendor.qti.hardware.iop</name>

View file

@ -270,6 +270,10 @@
511:4294967295:1000:1006:1013:1021:1047 511:4294967295:1000:1006:1013:1021:1047
/* Allow RCS service to aquire net_raw permission */ /* Allow RCS service to aquire net_raw permission */
18:4294967295:1001:3004 18:4294967295:1001:3004
/* Allow RCS service to communicate to IMS QMI Priv Svc*/
77:4294967295:1001:3003
/* Allow cnd to accquire netbind */
18:4294967295:1000:3003
/* Allow QMID service to aquire net_raw permission */ /* Allow QMID service to aquire net_raw permission */
3:4294967295:1001:1021:3004 3:4294967295:1001:1021:3004
2:4294967295:1000:1001:3004 2:4294967295:1000:1001:3004
@ -320,5 +324,3 @@
69:4294967295:1000 69:4294967295:1000
/* <WLPS QMI Service ID - 0x39>:<WLFW QMI Instance ID - all instances>:<Client Group ID> */ /* <WLPS QMI Service ID - 0x39>:<WLFW QMI Instance ID - all instances>:<Client Group ID> */
57:4294967295:1000 57:4294967295:1000
/* VSS GPS */
232:4294967295:1001:3004:1021

View file

@ -1,6 +0,0 @@
/* Allow communication to some OEM - QMI services with radio privilages */
/* Format is <Service id>:<all instances>:<radio>:<net_raw> */
/* VSS */
227:4294967295:1001:3004
/*COEX*/
34:4294967295:1001

0
configs/sensors/hals.conf Normal file → Executable file
View file

View file

@ -1,150 +0,0 @@
[SS-CLUSTER1-SP0]
algo_type ss
sampling 250
sensor xo_therm_buf
device cluster1
set_point 43000
set_point_clr 41000
time_constant 0
device_perf_floor 1478400
[SS-CLUSTER1-SP1]
algo_type ss
sampling 250
sensor xo_therm_buf
device cluster1
set_point 45000
set_point_clr 43000
time_constant 0
device_perf_floor 1113600
[SS-CLUSTER1-SP2]
algo_type ss
sampling 250
sensor xo_therm_buf
device cluster1
set_point 48000
set_point_clr 45000
time_constant 0
device_perf_floor 940800
[SS-CLUSTER0-SP0]
algo_type ss
sampling 250
sensor xo_therm_buf
device cluster0
set_point 43000
set_point_clr 41000
time_constant 0
device_perf_floor 1128800
[SS-CLUSTER0-SP1]
algo_type ss
sampling 250
sensor xo_therm_buf
device cluster0
set_point 45000
set_point_clr 43000
time_constant 0
device_perf_floor 960000
[SS-CLUSTER0-SP2]
algo_type ss
sampling 250
sensor xo_therm_buf
device cluster0
set_point 48000
set_point_clr 45000
time_constant 0
device_perf_floor 844800
[SKIN-SS-CPUS-ALL-1]
algo_type ss
sampling 250
sensor xo_therm_buf
device cpu_voltage
set_point 50000
set_point_clr 48000
time_constant 0
[SS-GPU]
#algo_type ss
sampling 250
sensor xo_therm_buf
device gpu
set_point 47000
set_point_clr 43000
time_constant 0
[GPU_management]
algo_type monitor
sensor xo_therm_buf
sampling 1000
thresholds 41000 43000
thresholds_clr 38000 41000
actions gpu gpu
action_info 510000000 401800000
[SKIN-BATTERY-MONITOR]
algo_type monitor
sampling 1000
sensor xo_therm_buf
thresholds 43000 45000 48000 60000
thresholds_clr 41000 43000 45000 48000
actions battery battery battery battery
action_info 0 1 2 3
[CAMERA-CAMCORDER-MONITOR]
algo_type monitor
sampling 1000
sensor xo_therm_buf
thresholds 42000 45000 50000
thresholds_clr 40000 42000 45000
actions camera+camcorder camera+camcorder camera+camcorder
action_info 1 2 3
[HISTORY-XO]
algo_type history
sampling 1000
sensor xo_therm_buf
thresholds 31000 41000 46000 51000 56000 61000
thresholds_clr 30000 40000 45000 50000 55000 60000
actions history_log history_log history_log history_log history_log history_log
action_info 0 1 2 3 4 5
[HISTORY-CPU0]
algo_type history
sampling 1000
sensor tsens_tz_sensor3
thresholds 61000 76000 91000
thresholds_clr 60000 75000 90000
actions history_log history_log history_log
action_info 0 1 2
[HISTORY-CPU4]
algo_type history
sampling 1000
sensor tsens_tz_sensor8
thresholds 61000 76000 91000
thresholds_clr 60000 75000 90000
actions history_log history_log history_log
action_info 0 1 2
[HISTORY-MODEM-PA0]
algo_type history
sampling 1000
sensor pa_therm0
thresholds 31000 36000 41000 46000 51000 56000 61000
thresholds_clr 30000 35000 40000 45000 50000 55000 60000
actions history_log history_log history_log history_log history_log history_log history_log
action_info 0 1 2 3 4 5 6
[HISTORY-MODEM-PA1]
algo_type history
sampling 1000
sensor pa_therm1
thresholds 31000 36000 41000 46000 51000 56000 61000
thresholds_clr 30000 35000 40000 45000 50000 55000 60000
actions history_log history_log history_log history_log history_log history_log history_log
action_info 0 1 2 3 4 5 6

View file

@ -0,0 +1,262 @@
<!-- Copyright (c) 2018, 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.
-->
<compatibility-matrix version="1.0" type="framework">
<hal format="hidl" optional="true">
<name>vendor.qti.hardware.perf</name>
<version>1.0</version>
<interface>
<name>IPerf</name>
<instance>default</instance>
</interface>
</hal>
<hal format="hidl" optional="true">
<name>vendor.display.color</name>
<version>1.0-2</version>
<interface>
<name>IDisplayColor</name>
<instance>default</instance>
</interface>
</hal>
<hal format="hidl" optional="true">
<name>vendor.display.postproc</name>
<version>1.0</version>
<interface>
<name>IDisplayPostproc</name>
<instance>default</instance>
</interface>
</hal>
<hal format="hidl" optional="true">
<name>vendor.display.config</name>
<version>1.0-4</version>
<interface>
<name>IDisplayConfig</name>
<instance>default</instance>
</interface>
</hal>
<hal format="hidl" optional="true">
<name>vendor.qti.hardware.qteeconnector</name>
<version>1.0</version>
<interface>
<name>IAppConnector</name>
<instance>default</instance>
</interface>
<interface>
<name>IGPAppConnector</name>
<instance>default</instance>
</interface>
</hal>
<hal format="hidl" optional="true">
<name>vendor.qti.hardware.factory</name>
<version>1.0</version>
<interface>
<name>IFactory</name>
<instance>default</instance>
</interface>
</hal>
<hal format="hidl" optional="true">
<name>com.qualcomm.qti.ant</name>
<version>1.0</version>
<interface>
<name>IAntHci</name>
<instance>default</instance>
</interface>
</hal>
<hal format="hidl" optional="true">
<name>com.qualcomm.qti.bluetooth_audio</name>
<version>1.0</version>
<interface>
<name>IBluetoothAudio</name>
<instance>default</instance>
</interface>
</hal>
<hal format="hidl" optional="true">
<name>com.qualcomm.qti.wifidisplayhal</name>
<version>1.0</version>
<interface>
<name>IHDCPSession</name>
<instance>wifidisplayhdcphal</instance>
</interface>
<interface>
<name>IDSManager</name>
<instance>wifidisplaydshal</instance>
</interface>
</hal>
<hal format="hidl" optional="true">
<name>android.hardware.gnss</name>
<version>1.0-1</version>
<interface>
<name>IGnss</name>
<instance>default</instance>
</interface>
</hal>
<hal format="hidl" optional="true">
<name>vendor.qti.hardware.alarm</name>
<version>1.0</version>
<interface>
<name>IAlarm</name>
<instance>default</instance>
</interface>
</hal>
<hal format="hidl" optional="true">
<name>vendor.qti.hardware.fm</name>
<version>1.0</version>
<interface>
<name>IFmHci</name>
<instance>default</instance>
</interface>
</hal>
<hal format="hidl" optional="true">
<name>vendor.qti.hardware.iop</name>
<version>2.0</version>
<interface>
<name>IIop</name>
<instance>default</instance>
</interface>
</hal>
<hal format="hidl" optional="true">
<name>vendor.qti.hardware.qdutils_disp</name>
<version>1.0</version>
<interface>
<name>IQdutilsDisp</name>
<instance>default</instance>
</interface>
</hal>
<hal format="hidl" optional="true">
<name>vendor.qti.hardware.sensorscalibrate</name>
<version>1.0</version>
<interface>
<name>ISensorsCalibrate</name>
<instance>default</instance>
</interface>
</hal>
<hal format="hidl" optional="true">
<name>vendor.qti.hardware.soter</name>
<version>1.0</version>
<interface>
<name>ISoter</name>
<instance>default</instance>
</interface>
</hal>
<hal format="hidl" optional="true">
<name>vendor.qti.hardware.tui_comm</name>
<version>1.0</version>
<interface>
<name>ITuiComm</name>
<instance>default</instance>
</interface>
</hal>
<hal format="hidl" optional="true">
<name>vendor.qti.hardware.vpp</name>
<version>1.0-1</version>
<interface>
<name>IHidlVppService</name>
<instance>vppService</instance>
</interface>
</hal>
<hal format="hidl" optional="true">
<name>android.hardware.wifi.supplicant</name>
<version>1.0</version>
<interface>
<name>ISupplicant</name>
<instance>default</instance>
</interface>
</hal>
<hal format="hidl" optional="true">
<name>vendor.qti.hardware.wigig.netperftuner</name>
<version>1.0</version>
<interface>
<name>INetPerfTuner</name>
<instance>default</instance>
</interface>
</hal>
<hal format="hidl" optional="true">
<name>vendor.qti.hardware.wigig.supptunnel</name>
<version>1.0</version>
<interface>
<name>ISuppTunnelProvider</name>
<instance>default</instance>
</interface>
</hal>
<hal format="hidl" optional="true">
<name>vendor.qti.imsrtpservice</name>
<version>1.0</version>
<interface>
<name>IRTPService</name>
<instance>imsrtpservice</instance>
</interface>
</hal>
<hal format="hidl" optional="true">
<name>vendor.qti.voiceprint</name>
<version>1.0</version>
<interface>
<name>IQtiVoicePrintService</name>
<instance>default</instance>
</interface>
</hal>
<hal format="hidl" optional="true">
<name>android.hardware.gnss</name>
<version>1.0</version>
<interface>
<name>IGnss</name>
<instance>gnss_vendor</instance>
</interface>
</hal>
<hal format="hidl" optional="true">
<name>vendor.qti.gnss</name>
<version>1.0-2</version>
<version>2.0</version>
<interface>
<name>ILocHidlGnss</name>
<instance>gnss_vendor</instance>
</interface>
</hal>
<hal format="hidl" optional="true">
<name>vendor.qti.hardware.wifi.supplicant</name>
<version>2.0</version>
<interface>
<name>ISupplicantVendor</name>
<instance>default</instance>
</interface>
</hal>
<hal format="hidl" optional="true">
<name>vendor.qti.hardware.wifi.hostapd</name>
<version>1.0</version>
<interface>
<name>IHostapdVendor</name>
<instance>default</instance>
</interface>
</hal>
<hal format="hidl" optional="true">
<name>vendor.qti.data.factory</name>
<version>1.0</version>
<interface>
<name>IFactory</name>
<instance>default</instance>
</interface>
</hal>
</compatibility-matrix>

162
device.mk Normal file → Executable file
View file

@ -1,6 +1,6 @@
# #
# Copyright (C) 2016 The CyanogenMod Project # Copyright (C) 2016 The CyanogenMod Project
# Copyright (C) 2017 The LineageOS Project # Copyright (C) 2017-2019 The LineageOS Project
# #
# Licensed under the Apache License, Version 2.0 (the "License"); # Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License. # you may not use this file except in compliance with the License.
@ -20,31 +20,36 @@ $(call inherit-product-if-exists, vendor/samsung/gts3llte/gts3llte-vendor.mk)
LOCAL_PATH := device/samsung/gts3llte LOCAL_PATH := device/samsung/gts3llte
# Overlay # Overlays
DEVICE_PACKAGE_OVERLAYS += $(LOCAL_PATH)/overlay DEVICE_PACKAGE_OVERLAYS += $(LOCAL_PATH)/overlay
# Screen density # Screen density
PRODUCT_AAPT_CONFIG := normal PRODUCT_AAPT_CONFIG := normal
PRODUCT_AAPT_PREF_CONFIG := xxhdpi PRODUCT_AAPT_PREF_CONFIG := xxxhdpi
# Boot animation # Boot animation
TARGET_SCREEN_HEIGHT := 2048 TARGET_SCREEN_HEIGHT := 2048
TARGET_SCREEN_WIDTH := 1536 TARGET_SCREEN_WIDTH := 1536
#TARGET_BOOTANIMATION_HALF_RES := true TARGET_BOOTANIMATION_HALF_RES := true
# Device characteristics # Device characteristics
PRODUCT_CHARACTERISTICS := tablet PRODUCT_CHARACTERISTICS := tablet
$(call inherit-product, frameworks/native/build/phone-xxhdpi-3072-dalvik-heap.mk) # Dalvik
PRODUCT_PROPERTY_OVERRIDES += \
$(call inherit-product-if-exists, frameworks/native/build/phone-xxhdpi-3072-hwui-memory.mk) dalvik.vm.heapstartsize=16m \
dalvik.vm.heapgrowthlimit=256m \
dalvik.vm.heapsize=512m \
dalvik.vm.heaptargetutilization=0.75 \
dalvik.vm.heapminfree=4m \
dalvik.vm.heapmaxfree=16m
# Permissions # Permissions
PRODUCT_COPY_FILES += \ PRODUCT_COPY_FILES += \
frameworks/native/data/etc/android.hardware.audio.low_latency.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.audio.low_latency.xml \ frameworks/native/data/etc/android.hardware.audio.low_latency.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.audio.low_latency.xml \
frameworks/native/data/etc/android.hardware.audio.pro.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.audio.pro.xml \ frameworks/native/data/etc/android.hardware.audio.pro.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.audio.pro.xml \
frameworks/native/data/etc/android.hardware.bluetooth_le.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.bluetooth_le.xml \
frameworks/native/data/etc/android.hardware.bluetooth.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.bluetooth.xml \ frameworks/native/data/etc/android.hardware.bluetooth.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.bluetooth.xml \
frameworks/native/data/etc/android.hardware.bluetooth_le.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.bluetooth_le.xml \
frameworks/native/data/etc/android.hardware.camera.flash-autofocus.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.camera.flash-autofocus.xml \ frameworks/native/data/etc/android.hardware.camera.flash-autofocus.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.camera.flash-autofocus.xml \
frameworks/native/data/etc/android.hardware.camera.front.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.camera.front.xml \ frameworks/native/data/etc/android.hardware.camera.front.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.camera.front.xml \
frameworks/native/data/etc/android.hardware.camera.full.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.camera.full.xml \ frameworks/native/data/etc/android.hardware.camera.full.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.camera.full.xml \
@ -57,20 +62,19 @@ PRODUCT_COPY_FILES += \
frameworks/native/data/etc/android.hardware.sensor.light.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.sensor.light.xml \ frameworks/native/data/etc/android.hardware.sensor.light.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.sensor.light.xml \
frameworks/native/data/etc/android.hardware.sensor.stepcounter.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.sensor.stepcounter.xml \ frameworks/native/data/etc/android.hardware.sensor.stepcounter.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.sensor.stepcounter.xml \
frameworks/native/data/etc/android.hardware.sensor.stepdetector.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.sensor.stepdetector.xml \ frameworks/native/data/etc/android.hardware.sensor.stepdetector.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.sensor.stepdetector.xml \
frameworks/native/data/etc/android.hardware.telephony.cdma.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.telephony.cdma.xml \
frameworks/native/data/etc/android.hardware.telephony.gsm.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.telephony.gsm.xml \
frameworks/native/data/etc/android.hardware.touchscreen.multitouch.jazzhand.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.touchscreen.multitouch.jazzhand.xml \ frameworks/native/data/etc/android.hardware.touchscreen.multitouch.jazzhand.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.touchscreen.multitouch.jazzhand.xml \
frameworks/native/data/etc/android.hardware.usb.accessory.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.usb.accessory.xml \ frameworks/native/data/etc/android.hardware.usb.accessory.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.usb.accessory.xml \
frameworks/native/data/etc/android.hardware.usb.host.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.usb.host.xml \ frameworks/native/data/etc/android.hardware.usb.host.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.usb.host.xml \
frameworks/native/data/etc/android.hardware.vulkan.compute-0.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.vulkan.compute.xml \ frameworks/native/data/etc/android.hardware.vulkan.compute-0.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.vulkan.compute.xml \
frameworks/native/data/etc/android.hardware.vulkan.level-0.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.vulkan.level.xml \ frameworks/native/data/etc/android.hardware.vulkan.level-0.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.vulkan.level.xml \
frameworks/native/data/etc/android.hardware.vulkan.version-1_0_3.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.vulkan.version.xml \ frameworks/native/data/etc/android.hardware.vulkan.version-1_1.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.vulkan.version.xml \
frameworks/native/data/etc/android.hardware.wifi.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.wifi.xml \ frameworks/native/data/etc/android.hardware.wifi.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.wifi.xml \
frameworks/native/data/etc/android.hardware.wifi.direct.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.wifi.direct.xml \ frameworks/native/data/etc/android.hardware.wifi.direct.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.wifi.direct.xml \
frameworks/native/data/etc/android.software.freeform_window_management.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.software.freeform_window_management.xml \
frameworks/native/data/etc/android.software.midi.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.software.midi.xml \ frameworks/native/data/etc/android.software.midi.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.software.midi.xml \
frameworks/native/data/etc/android.software.sip.voip.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.software.sip.voip.xml \ frameworks/native/data/etc/android.software.sip.voip.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.software.sip.voip.xml \
frameworks/native/data/etc/tablet_core_hardware.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/tablet_core_hardware.xml \ frameworks/native/data/etc/tablet_core_hardware.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/tablet_core_hardware.xml \
frameworks/native/data/etc/android.hardware.telephony.cdma.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.telephony.cdma.xml \
frameworks/native/data/etc/android.hardware.telephony.gsm.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.telephony.gsm.xml
# QMI # QMI
PRODUCT_COPY_FILES += \ PRODUCT_COPY_FILES += \
@ -81,17 +85,14 @@ PRODUCT_COPY_FILES += \
# ANT+ # ANT+
PRODUCT_PACKAGES += \ PRODUCT_PACKAGES += \
AntHalService \ AntHalService \
com.dsi.ant.antradio_library \ com.dsi.ant.antradio_library
libantradio
# Audio # Audio
PRODUCT_PACKAGES += \ PRODUCT_PACKAGES += \
android.hardware.audio@2.0-impl \ android.hardware.audio@2.0-impl \
android.hardware.audio@2.0-service \ android.hardware.audio@2.0-service \
android.hardware.audio.effect@2.0-impl \ android.hardware.audio.effect@2.0-impl \
android.hardware.soundtrigger@2.0-impl \
audio.a2dp.default \ audio.a2dp.default \
audio.primary.msm8996 \
audio.r_submix.default \ audio.r_submix.default \
audio.usb.default \ audio.usb.default \
libaudio-resampler \ libaudio-resampler \
@ -102,33 +103,30 @@ PRODUCT_PACKAGES += \
libvolumelistener \ libvolumelistener \
tinymix tinymix
PRODUCT_COPY_FILES += \ # audio.primary.msm8996 \
$(LOCAL_PATH)/configs/audio/audio_effects.conf:system/etc/audio_effects.conf \ # android.hardware.soundtrigger@2.0-impl \
$(LOCAL_PATH)/configs/audio/listen_platform_info.xml:system/etc/listen_platform_info.xml \
$(LOCAL_PATH)/configs/audio/audio_output_policy.conf:$(TARGET_COPY_OUT_VENDOR)/etc/audio_output_policy.conf \
$(LOCAL_PATH)/configs/audio/audio_platform_info.xml:$(TARGET_COPY_OUT_VENDOR)/etc/audio_platform_info.xml \
$(LOCAL_PATH)/configs/audio/audio_policy.conf:$(TARGET_COPY_OUT_VENDOR)/etc/audio_policy.conf \
$(LOCAL_PATH)/configs/audio/mixer_paths_tasha.xml:$(TARGET_COPY_OUT_VENDOR)/etc/mixer_paths_tasha.xml
# Bluetooth #PRODUCT_COPY_FILES += \
#PRODUCT_PACKAGES += \ # $(LOCAL_PATH)/configs/audio/audio_effects.conf:system/etc/audio_effects.conf \
# android.hardware.bluetooth@1.0-impl \ # $(LOCAL_PATH)/configs/audio/listen_platform_info.xml:system/etc/listen_platform_info.xml \
# android.hardware.bluetooth@1.0-service # $(LOCAL_PATH)/configs/audio/audio_output_policy.conf:$(TARGET_COPY_OUT_VENDOR)/etc/audio_output_policy.conf \
# $(LOCAL_PATH)/configs/audio/audio_platform_info.xml:$(TARGET_COPY_OUT_VENDOR)/etc/audio_platform_info.xml \
# $(LOCAL_PATH)/configs/audio/audio_policy.conf:$(TARGET_COPY_OUT_VENDOR)/etc/audio_policy.conf \
# $(LOCAL_PATH)/configs/audio/mixer_paths_tasha.xml:$(TARGET_COPY_OUT_VENDOR)/etc/mixer_paths_tasha.xml
# Camera # Camera
PRODUCT_PACKAGES += \ PRODUCT_PACKAGES += \
android.hardware.camera.provider@2.4-impl \ android.hardware.camera.provider@2.4-impl \
camera.device@3.2-impl \
libshims_cameraclient
PRODUCT_PACKAGES += \
vendor.qti.hardware.camera.device@1.0 \ vendor.qti.hardware.camera.device@1.0 \
vendor.qti.hardware.camera.device@1.0_vendor vendor.qti.hardware.camera.device@1.0_vendor
PRODUCT_PACKAGES += \
libshims_cameraclient
PRODUCT_PACKAGES += \ PRODUCT_PACKAGES += \
Snap Snap
# CNE # Connectivity Engine support (CNE)
PRODUCT_PACKAGES += \ PRODUCT_PACKAGES += \
libcnefeatureconfig libcnefeatureconfig
@ -139,6 +137,7 @@ PRODUCT_PACKAGES += \
android.hardware.graphics.composer@2.1-impl \ android.hardware.graphics.composer@2.1-impl \
android.hardware.graphics.composer@2.1-service \ android.hardware.graphics.composer@2.1-service \
android.hardware.graphics.mapper@2.0-impl \ android.hardware.graphics.mapper@2.0-impl \
android.hardware.configstore@1.1-service \
android.hardware.memtrack@1.0-impl \ android.hardware.memtrack@1.0-impl \
android.hardware.memtrack@1.0-service \ android.hardware.memtrack@1.0-service \
copybit.msm8996 \ copybit.msm8996 \
@ -146,9 +145,12 @@ PRODUCT_PACKAGES += \
hwcomposer.msm8996 \ hwcomposer.msm8996 \
memtrack.msm8996 \ memtrack.msm8996 \
libdisplayconfig \ libdisplayconfig \
libhwc2on1adapter \
libgenlock \
liboverlay \ liboverlay \
libqdMetaData.system \ libtinyxml \
libtinyxml libqdMetaData \
libqdMetaData.system
# Display # Display
PRODUCT_COPY_FILES += \ PRODUCT_COPY_FILES += \
@ -162,12 +164,12 @@ PRODUCT_PACKAGES += \
# DRM # DRM
PRODUCT_PACKAGES += \ PRODUCT_PACKAGES += \
android.hardware.drm@1.0-impl \ android.hardware.drm@1.0-impl \
android.hardware.drm@1.0-service android.hardware.drm@1.0-service \
android.hardware.drm@1.1-service.clearkey
# Fingerprint # Fingerprint
PRODUCT_PACKAGES += \ PRODUCT_PACKAGES += \
android.hardware.biometrics.fingerprint@2.1-service \ android.hardware.biometrics.fingerprint@2.1-service \
fingerprint.msm8996 \
libbauthtzcommon_shim libbauthtzcommon_shim
# For config.fs # For config.fs
@ -184,7 +186,8 @@ PRODUCT_PACKAGES += \
android.hardware.gnss@1.0-impl-qti \ android.hardware.gnss@1.0-impl-qti \
libcurl \ libcurl \
libgnss \ libgnss \
libgnsspps libgnsspps \
libsensorndkbridge
PRODUCT_COPY_FILES += \ PRODUCT_COPY_FILES += \
$(LOCAL_PATH)/gps/etc/flp.conf:$(TARGET_COPY_OUT_VENDOR)/etc/flp.conf \ $(LOCAL_PATH)/gps/etc/flp.conf:$(TARGET_COPY_OUT_VENDOR)/etc/flp.conf \
@ -196,22 +199,29 @@ PRODUCT_COPY_FILES += \
# Healthd # Healthd
PRODUCT_PACKAGES += \ PRODUCT_PACKAGES += \
android.hardware.health@1.0-impl \ android.hardware.health@2.0-impl \
android.hardware.health@1.0-service android.hardware.health@2.0-service \
charger_res_images
# HIDL # HIDL
PRODUCT_PACKAGES += \ PRODUCT_PACKAGES += \
android.hidl.base@1.0 \ android.hidl.base@1.0 \
android.hidl.manager@1.0 android.hidl.base@1.0_system \
android.hidl.manager@1.0 \
android.hidl.manager@1.0_system
# IMS # IMS
PRODUCT_PACKAGES += \ PRODUCT_PACKAGES += \
ims-ext-common ims-ext-common
# IPA Manager
PRODUCT_PACKAGES += \
ipacm \
IPACM_cfg.xml
# IPC router config # IPC router config
PRODUCT_COPY_FILES += \ PRODUCT_COPY_FILES += \
$(LOCAL_PATH)/configs/sec_config:$(TARGET_COPY_OUT_VENDOR)/etc/sec_config \ $(LOCAL_PATH)/configs/sec_config:$(TARGET_COPY_OUT_VENDOR)/etc/sec_config
$(LOCAL_PATH)/configs/sec_config_oem:$(TARGET_COPY_OUT_VENDOR)/etc/sec_config_oem
# IPv6 # IPv6
PRODUCT_PACKAGES += \ PRODUCT_PACKAGES += \
@ -246,9 +256,9 @@ PRODUCT_PACKAGES += \
android.hardware.light@2.0-impl \ android.hardware.light@2.0-impl \
lights.MSM8996 lights.MSM8996
# LiveDisplay native # LiveDisplay
PRODUCT_PACKAGES += \ PRODUCT_PACKAGES += \
vendor.lineage.livedisplay@1.0-service-sdm vendor.lineage.livedisplay@2.0-service-sdm
# Media # Media
PRODUCT_COPY_FILES += \ PRODUCT_COPY_FILES += \
@ -270,24 +280,15 @@ PRODUCT_PACKAGES += \
# OMX # OMX
PRODUCT_PACKAGES += \ PRODUCT_PACKAGES += \
libc2dcolorconvert \ libc2dcolorconvert \
libdashplayer \
libdivxdrmdecrypt \
libhypv_intercept \
libmm-omxcore \
libextmedia_jni \ libextmedia_jni \
libOmxAacEnc \ libOmxAacEnc \
libOmxAmrEnc \ libOmxAmrEnc \
libOmxCore \ libOmxCore \
libOmxEvrcEnc \ libOmxEvrcEnc \
libOmxQcelp13Enc \ libOmxQcelp13Enc \
libOmxSwVencMpeg4 \
libOmxSwVencHevc \
libOmxVdec \ libOmxVdec \
libOmxVdecHevc \
libOmxVenc \ libOmxVenc \
libOmxVidcCommon \ libstagefrighthw
libstagefrighthw \
libstagefright_soft_flacdec
# Power # Power
PRODUCT_PACKAGES += \ PRODUCT_PACKAGES += \
@ -296,6 +297,10 @@ PRODUCT_PACKAGES += \
PRODUCT_COPY_FILES += \ PRODUCT_COPY_FILES += \
$(LOCAL_PATH)/configs/powerhint.xml:$(TARGET_COPY_OUT_VENDOR)/etc/powerhint.xml $(LOCAL_PATH)/configs/powerhint.xml:$(TARGET_COPY_OUT_VENDOR)/etc/powerhint.xml
# QMI
PRODUCT_PACKAGES += \
libjson
# RCS # RCS
PRODUCT_PACKAGES += \ PRODUCT_PACKAGES += \
rcs_service_aidl \ rcs_service_aidl \
@ -310,7 +315,6 @@ PRODUCT_PACKAGES += \
init.qcom.power.rc \ init.qcom.power.rc \
init.qcom.usb.rc \ init.qcom.usb.rc \
init.samsung.rc \ init.samsung.rc \
init.target.rc \
ueventd.qcom.rc \ ueventd.qcom.rc \
init.qcom.sh init.qcom.sh
@ -320,6 +324,8 @@ PRODUCT_PACKAGES += \
# RIL # RIL
PRODUCT_PACKAGES += \ PRODUCT_PACKAGES += \
android.hardware.radio@1.2 \
android.hardware.radio.config@1.0 \
libprotobuf-cpp-full \ libprotobuf-cpp-full \
librmnetctl \ librmnetctl \
libxml2 libxml2
@ -331,7 +337,8 @@ PRODUCT_COPY_FILES += \
# Sensors # Sensors
PRODUCT_PACKAGES += \ PRODUCT_PACKAGES += \
android.hardware.sensors@1.0-impl android.hardware.sensors@1.0-impl \
android.hardware.sensors@1.0-service
# Sensors # Sensors
PRODUCT_COPY_FILES += \ PRODUCT_COPY_FILES += \
@ -340,18 +347,8 @@ PRODUCT_COPY_FILES += \
# Thermal engine # Thermal engine
PRODUCT_COPY_FILES += \ PRODUCT_COPY_FILES += \
$(LOCAL_PATH)/configs/thermal-engine-8996-lite.conf:$(TARGET_COPY_OUT_VENDOR)/etc/thermal-engine-8996-lite.conf \
$(LOCAL_PATH)/configs/thermal-engine-8996.conf:$(TARGET_COPY_OUT_VENDOR)/etc/thermal-engine-8996.conf $(LOCAL_PATH)/configs/thermal-engine-8996.conf:$(TARGET_COPY_OUT_VENDOR)/etc/thermal-engine-8996.conf
# USB
PRODUCT_PACKAGES += \
android.hardware.usb@1.0-service
# Vibrator
PRODUCT_PACKAGES += \
android.hardware.vibrator@1.0-impl \
android.hardware.vibrator@1.0-service
# Telephony # Telephony
PRODUCT_PACKAGES += \ PRODUCT_PACKAGES += \
telephony-ext telephony-ext
@ -361,19 +358,30 @@ PRODUCT_BOOT_JARS += \
# TextClassifier # TextClassifier
PRODUCT_PACKAGES += \ PRODUCT_PACKAGES += \
textclassifier.smartselection.bundle1 textclassifier.bundle1
# Trust HAL
PRODUCT_PACKAGES += \
vendor.lineage.trust@1.0-service
# USB
PRODUCT_PACKAGES += \
android.hardware.usb@1.0-service.basic
# VNDK # VNDK
PRODUCT_PACKAGES += \ PRODUCT_PACKAGES += \
vndk-sp vndk-sp
# WCNSS # Vibrator
PRODUCT_COPY_FILES += \ PRODUCT_PACKAGES += \
$(LOCAL_PATH)/wifi/WCNSS_cfg.dat:system/etc/firmware/wlan/qca_cld/WCNSS_cfg.dat \ android.hardware.vibrator@1.0-impl \
$(LOCAL_PATH)/wifi/WCNSS_qcom_cfg.ini:system/etc/firmware/wlan/qca_cld/WCNSS_qcom_cfg.ini \ android.hardware.vibrator@1.0-service
$(LOCAL_PATH)/wifi/grippower.info:system/etc/firmware/wlan/qca_cld/grippower.info
# Wifi # USB
PRODUCT_PACKAGES += \
android.hardware.usb@1.0-service
# WiFi
PRODUCT_PACKAGES += \ PRODUCT_PACKAGES += \
android.hardware.wifi@1.0-service \ android.hardware.wifi@1.0-service \
libqsap_sdk \ libqsap_sdk \
@ -391,10 +399,14 @@ PRODUCT_COPY_FILES += \
$(LOCAL_PATH)/wifi/p2p_supplicant_overlay.conf:$(TARGET_COPY_OUT_VENDOR)/etc/wifi/p2p_supplicant_overlay.conf \ $(LOCAL_PATH)/wifi/p2p_supplicant_overlay.conf:$(TARGET_COPY_OUT_VENDOR)/etc/wifi/p2p_supplicant_overlay.conf \
$(LOCAL_PATH)/wifi/wpa_supplicant_overlay.conf:$(TARGET_COPY_OUT_VENDOR)/etc/wifi/wpa_supplicant_overlay.conf $(LOCAL_PATH)/wifi/wpa_supplicant_overlay.conf:$(TARGET_COPY_OUT_VENDOR)/etc/wifi/wpa_supplicant_overlay.conf
PRODUCT_COPY_FILES += \
$(LOCAL_PATH)/wifi/WCNSS_qcom_cfg.ini:$(TARGET_COPY_OUT_VENDOR)/etc/wifi/WCNSS_qcom_cfg.ini
# ADB # ADB
PRODUCT_DEFAULT_PROPERTY_OVERRIDES += \ PRODUCT_SYSTEM_DEFAULT_PROPERTIES += \
persist.sys.usb.config=adb \ persist.sys.usb.config=adb \
ro.adb.secure=0 ro.adb.secure=0 \
ro.secure=0
# Root # Root
PRODUCT_PACKAGES += \ PRODUCT_PACKAGES += \

6
doze/Android.mk Normal file → Executable file
View file

@ -7,6 +7,7 @@ LOCAL_SRC_FILES := $(call all-java-files-under, src)
LOCAL_PACKAGE_NAME := SamsungDoze LOCAL_PACKAGE_NAME := SamsungDoze
LOCAL_CERTIFICATE := platform LOCAL_CERTIFICATE := platform
LOCAL_PRIVATE_PLATFORM_APIS := true
LOCAL_PRIVILEGED_MODULE := true LOCAL_PRIVILEGED_MODULE := true
LOCAL_USE_AAPT2 := true LOCAL_USE_AAPT2 := true
@ -17,10 +18,7 @@ LOCAL_STATIC_ANDROID_LIBRARIES := \
android-support-v7-recyclerview \ android-support-v7-recyclerview \
android-support-v7-preference \ android-support-v7-preference \
android-support-v7-appcompat \ android-support-v7-appcompat \
android-support-v14-preference \ android-support-v14-preference
LOCAL_STATIC_JAVA_LIBRARIES := \
org.lineageos.platform.internal
LOCAL_RESOURCE_DIR := \ LOCAL_RESOURCE_DIR := \
$(LOCAL_PATH)/res \ $(LOCAL_PATH)/res \

6
doze/AndroidManifest.xml Normal file → Executable file
View file

@ -27,14 +27,14 @@
<protected-broadcast android:name="com.android.systemui.doze.pulse" /> <protected-broadcast android:name="com.android.systemui.doze.pulse" />
<uses-sdk <uses-sdk
android:minSdkVersion="26" android:minSdkVersion="24"
android:targetSdkVersion="26"/> android:targetSdkVersion="24"/>
<application <application
android:label="@string/device_settings_app_name" android:label="@string/device_settings_app_name"
android:persistent="true"> android:persistent="true">
<receiver android:name="org.lineageos.settings.doze.BootCompletedReceiver"> <receiver android:name=".BootCompletedReceiver">
<intent-filter> <intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" /> <action android:name="android.intent.action.BOOT_COMPLETED" />
<category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.DEFAULT" />

View file

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2019 The LineageOS 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.
-->
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="#ff80868B" android:state_activated="false" />
<item android:color="?android:attr/colorAccent" android:state_activated="true" />
</selector>

View file

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (C) 2018 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.
-->
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="#FFFFFF" />
</selector>

View file

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (C) 2018 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.
-->
<selector
xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="#BFFFFFFF" />
</selector>

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2014 The Android Open Source Project <!-- Copyright (C) 2019 The LineageOS Project
Licensed under the Apache License, Version 2.0 (the "License"); Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License. you may not use this file except in compliance with the License.
@ -14,7 +14,7 @@
limitations under the License. limitations under the License.
--> -->
<ripple xmlns:android="http://schemas.android.com/apk/res/android" <shape xmlns:android="http://schemas.android.com/apk/res/android"
android:color="?android:attr/colorControlHighlight"> android:shape="rectangle">
<item android:drawable="?android:attr/colorSecondary" /> <solid android:color="@color/switch_bar_bg" />
</ripple> </shape>

View file

@ -29,11 +29,12 @@
android:layout_width="0dp" android:layout_width="0dp"
android:layout_weight="1" android:layout_weight="1"
android:layout_gravity="center_vertical" android:layout_gravity="center_vertical"
android:paddingStart="48dp" android:paddingStart="56dp"
android:maxLines="2" android:maxLines="2"
android:ellipsize="end" android:ellipsize="end"
android:textAppearance="@android:style/TextAppearance.Material.Title" android:textAppearance="@android:style/TextAppearance.Material.Title"
android:textColor="?android:attr/textColorPrimary" android:textColor="@android:color/white"
android:textSize="18sp"
android:textAlignment="viewStart" /> android:textAlignment="viewStart" />
<Switch <Switch
@ -42,6 +43,6 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center_vertical" android:layout_gravity="center_vertical"
android:background="@null" android:background="@null"
android:theme="@style/Theme.Main.SwitchBar" /> android:theme="@style/Theme.Main.SwitchBar.Switch" />
</LinearLayout> </LinearLayout>

View file

@ -54,4 +54,9 @@
<style name="Theme.Main.SwitchBar" parent="@android:style/ThemeOverlay.Material.ActionBar"> <style name="Theme.Main.SwitchBar" parent="@android:style/ThemeOverlay.Material.ActionBar">
</style> </style>
<style name="Theme.Main.SwitchBar.Switch">
<item name="android:trackTint">@color/switchbar_switch_track_tint</item>
<item name="android:thumbTint">@color/switchbar_switch_thumb_tint</item>
</style>
</resources> </resources>

View file

@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<!-- <!--
Copyright (C) 2015 The CyanogenMod Project Copyright (C) 2015 The CyanogenMod Project
2018-2019 The LineageOS Project
Licensed under the Apache License, Version 2.0 (the "License" Licensed under the Apache License, Version 2.0 (the "License"
you may not use this file except in compliance with the License. you may not use this file except in compliance with the License.
@ -16,6 +17,13 @@
--> -->
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<SwitchPreference
android:key="always_on_display"
android:disableDependentsState="true"
android:title="@string/ambient_display_always_on_title"
android:summary="@string/ambient_display_always_on_summary"
android:persistent="false" />
<PreferenceCategory <PreferenceCategory
android:key="tilt_sensor" android:key="tilt_sensor"
android:title="@string/tilt_sensor_title"> android:title="@string/tilt_sensor_title">

View file

@ -1,6 +1,6 @@
/* /*
* Copyright (C) 2015 The CyanogenMod Project * Copyright (C) 2015 The CyanogenMod Project
* 2017 The LineageOS Project * 2017-2019 The LineageOS Project
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -29,10 +29,7 @@ public class BootCompletedReceiver extends BroadcastReceiver {
@Override @Override
public void onReceive(final Context context, Intent intent) { public void onReceive(final Context context, Intent intent) {
if (Utils.isDozeEnabled(context) && Utils.sensorsEnabled(context)) { if (DEBUG) Log.d(TAG, "Received boot completed intent");
if (DEBUG) Log.d(TAG, "Starting service"); Utils.checkDozeService(context);
Utils.startService(context);
}
} }
} }

View file

@ -1,6 +1,6 @@
/* /*
* Copyright (c) 2015 The CyanogenMod Project * Copyright (C) 2015 The CyanogenMod Project
* 2017 The LineageOS Project * 2017-2018 The LineageOS Project
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -25,22 +25,18 @@ import android.content.IntentFilter;
import android.os.IBinder; import android.os.IBinder;
import android.util.Log; import android.util.Log;
public class DozeService extends Service public class DozeService extends Service {
{
private static final String TAG = "DozeService"; private static final String TAG = "DozeService";
private static final boolean DEBUG = false; private static final boolean DEBUG = false;
private ProximitySensor mProximitySensor; private ProximitySensor mProximitySensor;
private TiltSensor mTiltSensor; private TiltSensor mTiltSensor;
private SignificantSensor mSignificantSensor;
@Override @Override
public void onCreate() public void onCreate() {
{
if (DEBUG) Log.d(TAG, "Creating service"); if (DEBUG) Log.d(TAG, "Creating service");
mProximitySensor = new ProximitySensor(this); mProximitySensor = new ProximitySensor(this);
mTiltSensor = new TiltSensor(this); mTiltSensor = new TiltSensor(this);
mSignificantSensor = new SignificantSensor(this);
IntentFilter screenStateFilter = new IntentFilter(Intent.ACTION_SCREEN_ON); IntentFilter screenStateFilter = new IntentFilter(Intent.ACTION_SCREEN_ON);
screenStateFilter.addAction(Intent.ACTION_SCREEN_OFF); screenStateFilter.addAction(Intent.ACTION_SCREEN_OFF);
@ -48,62 +44,55 @@ public class DozeService extends Service
} }
@Override @Override
public int onStartCommand(Intent intent, int flags, int startId) public int onStartCommand(Intent intent, int flags, int startId) {
{
if (DEBUG) Log.d(TAG, "Starting service"); if (DEBUG) Log.d(TAG, "Starting service");
return START_STICKY; return START_STICKY;
} }
@Override @Override
public void onDestroy() public void onDestroy() {
{
if (DEBUG) Log.d(TAG, "Destroying service"); if (DEBUG) Log.d(TAG, "Destroying service");
super.onDestroy(); super.onDestroy();
this.unregisterReceiver(mScreenStateReceiver); this.unregisterReceiver(mScreenStateReceiver);
mProximitySensor.disable(); mProximitySensor.disable();
mTiltSensor.disable(); mTiltSensor.disable();
mSignificantSensor.disable();
} }
@Override @Override
public IBinder onBind(Intent intent) public IBinder onBind(Intent intent) {
{
return null; return null;
} }
private void onDisplayOn() private void onDisplayOn() {
{
if (DEBUG) Log.d(TAG, "Display on"); if (DEBUG) Log.d(TAG, "Display on");
if (Utils.pickUpEnabled(this)) if (Utils.isPickUpEnabled(this)) {
{
mTiltSensor.disable(); mTiltSensor.disable();
mSignificantSensor.disable();
} }
if (Utils.handwaveGestureEnabled(this) || Utils.pocketGestureEnabled(this)) if (Utils.isHandwaveGestureEnabled(this) ||
Utils.isPocketGestureEnabled(this)) {
mProximitySensor.disable(); mProximitySensor.disable();
}
private void onDisplayOff()
{
if (DEBUG) Log.d(TAG, "Display off");
if (Utils.pickUpEnabled(this))
{
mTiltSensor.enable();
mSignificantSensor.enable();
} }
if (Utils.handwaveGestureEnabled(this) || Utils.pocketGestureEnabled(this))
mProximitySensor.enable();
} }
private BroadcastReceiver mScreenStateReceiver = new BroadcastReceiver() private void onDisplayOff() {
{ if (DEBUG) Log.d(TAG, "Display off");
if (Utils.isPickUpEnabled(this)) {
mTiltSensor.enable();
}
if (Utils.isHandwaveGestureEnabled(this) ||
Utils.isPocketGestureEnabled(this)) {
mProximitySensor.enable();
}
}
private BroadcastReceiver mScreenStateReceiver = new BroadcastReceiver() {
@Override @Override
public void onReceive(Context context, Intent intent) public void onReceive(Context context, Intent intent) {
{ if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) {
if (intent.getAction().equals(Intent.ACTION_SCREEN_ON))
onDisplayOn(); onDisplayOn();
else if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) } else if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
onDisplayOff(); onDisplayOff();
}
} }
}; };
} }

View file

@ -1,6 +1,6 @@
/* /*
* Copyright (C) 2015 The CyanogenMod Project * Copyright (C) 2015 The CyanogenMod Project
* 2017-2018 The LineageOS Project * 2017-2019 The LineageOS Project
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -26,6 +26,7 @@ import android.content.Context;
import android.content.DialogInterface; import android.content.DialogInterface;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.os.Bundle; import android.os.Bundle;
import android.os.Handler;
import android.support.v14.preference.PreferenceFragment; import android.support.v14.preference.PreferenceFragment;
import android.support.v14.preference.SwitchPreference; import android.support.v14.preference.SwitchPreference;
import android.support.v7.preference.Preference; import android.support.v7.preference.Preference;
@ -43,11 +44,16 @@ public class DozeSettingsFragment extends PreferenceFragment implements OnPrefer
CompoundButton.OnCheckedChangeListener { CompoundButton.OnCheckedChangeListener {
private TextView mTextView; private TextView mTextView;
private View mSwitchBar;
private SwitchPreference mAlwaysOnDisplayPreference;
private SwitchPreference mPickUpPreference; private SwitchPreference mPickUpPreference;
private SwitchPreference mHandwavePreference; private SwitchPreference mHandwavePreference;
private SwitchPreference mPocketPreference; private SwitchPreference mPocketPreference;
private Handler mHandler = new Handler();
@Override @Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
addPreferencesFromResource(R.xml.doze_settings); addPreferencesFromResource(R.xml.doze_settings);
@ -62,22 +68,40 @@ public class DozeSettingsFragment extends PreferenceFragment implements OnPrefer
boolean dozeEnabled = Utils.isDozeEnabled(getActivity()); boolean dozeEnabled = Utils.isDozeEnabled(getActivity());
mAlwaysOnDisplayPreference = (SwitchPreference) findPreference(Utils.ALWAYS_ON_DISPLAY);
mAlwaysOnDisplayPreference.setEnabled(dozeEnabled);
mAlwaysOnDisplayPreference.setChecked(Utils.isAlwaysOnEnabled(getActivity()));
mAlwaysOnDisplayPreference.setOnPreferenceChangeListener(this);
PreferenceCategory tiltSensorCategory =
(PreferenceCategory) getPreferenceScreen().findPreference(Utils.CATEG_TILT_SENSOR);
PreferenceCategory proximitySensorCategory = PreferenceCategory proximitySensorCategory =
(PreferenceCategory) getPreferenceScreen().findPreference(Utils.CATEG_PROX_SENSOR); (PreferenceCategory) getPreferenceScreen().findPreference(Utils.CATEG_PROX_SENSOR);
mPickUpPreference = (SwitchPreference) findPreference(Utils.GESTURE_PICK_UP_KEY); mPickUpPreference = (SwitchPreference) findPreference(Utils.GESTURE_PICK_UP_KEY);
mPickUpPreference.setEnabled(dozeEnabled); mPickUpPreference.setEnabled(dozeEnabled);
mPickUpPreference.setOnPreferenceChangeListener(this);
mHandwavePreference = (SwitchPreference) findPreference(Utils.GESTURE_HAND_WAVE_KEY); mHandwavePreference = (SwitchPreference) findPreference(Utils.GESTURE_HAND_WAVE_KEY);
mHandwavePreference.setEnabled(dozeEnabled); mHandwavePreference.setEnabled(dozeEnabled);
mHandwavePreference.setOnPreferenceChangeListener(this);
mPocketPreference = (SwitchPreference) findPreference(Utils.GESTURE_POCKET_KEY); mPocketPreference = (SwitchPreference) findPreference(Utils.GESTURE_POCKET_KEY);
mPocketPreference.setEnabled(dozeEnabled); mPocketPreference.setEnabled(dozeEnabled);
mPocketPreference.setOnPreferenceChangeListener(this);
// Hide proximity sensor related features if the device doesn't support them // Hide proximity sensor related features if the device doesn't support them
if (!Utils.getProxCheckBeforePulse(getActivity())) { if (!Utils.getProxCheckBeforePulse(getActivity())) {
getPreferenceScreen().removePreference(proximitySensorCategory); getPreferenceScreen().removePreference(proximitySensorCategory);
} }
// Hide AOD if not supported and set all its dependents otherwise
if (!Utils.alwaysOnDisplayAvailable(getActivity())) {
getPreferenceScreen().removePreference(mAlwaysOnDisplayPreference);
} else {
tiltSensorCategory.setDependency(Utils.ALWAYS_ON_DISPLAY);
proximitySensorCategory.setDependency(Utils.ALWAYS_ON_DISPLAY);
}
} }
@Override @Override
@ -98,29 +122,45 @@ public class DozeSettingsFragment extends PreferenceFragment implements OnPrefer
mTextView.setText(getString(dozeEnabled ? mTextView.setText(getString(dozeEnabled ?
R.string.switch_bar_on : R.string.switch_bar_off)); R.string.switch_bar_on : R.string.switch_bar_off));
View switchBar = view.findViewById(R.id.switch_bar); mSwitchBar = view.findViewById(R.id.switch_bar);
Switch switchWidget = switchBar.findViewById(android.R.id.switch_widget); Switch switchWidget = mSwitchBar.findViewById(android.R.id.switch_widget);
switchWidget.setChecked(dozeEnabled); switchWidget.setChecked(dozeEnabled);
switchWidget.setOnCheckedChangeListener(this); switchWidget.setOnCheckedChangeListener(this);
switchBar.setOnClickListener(v -> switchWidget.setChecked(!switchWidget.isChecked())); mSwitchBar.setActivated(dozeEnabled);
mSwitchBar.setOnClickListener(v -> {
switchWidget.setChecked(!switchWidget.isChecked());
mSwitchBar.setActivated(switchWidget.isChecked());
});
} }
@Override @Override
public boolean onPreferenceChange(Preference preference, Object newValue) { public boolean onPreferenceChange(Preference preference, Object newValue) {
Utils.checkDozeService(getActivity()); if (Utils.ALWAYS_ON_DISPLAY.equals(preference.getKey())) {
Utils.enableAlwaysOn(getActivity(), (Boolean) newValue);
}
mHandler.post(() -> Utils.checkDozeService(getActivity()));
return true; return true;
} }
@Override @Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) { public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) {
Utils.enableDoze(b, getActivity()); Utils.enableDoze(getActivity(), isChecked);
Utils.checkDozeService(getActivity()); Utils.checkDozeService(getActivity());
mTextView.setText(getString(b ? R.string.switch_bar_on : R.string.switch_bar_off)); mTextView.setText(getString(isChecked ? R.string.switch_bar_on : R.string.switch_bar_off));
mSwitchBar.setActivated(isChecked);
mPickUpPreference.setEnabled(b); if (!isChecked) {
mHandwavePreference.setEnabled(b); Utils.enableAlwaysOn(getActivity(), false);
mPocketPreference.setEnabled(b); mAlwaysOnDisplayPreference.setChecked(false);
}
mAlwaysOnDisplayPreference.setEnabled(isChecked);
mPickUpPreference.setEnabled(isChecked);
mHandwavePreference.setEnabled(isChecked);
mPocketPreference.setEnabled(isChecked);
} }
@Override @Override

View file

@ -24,6 +24,10 @@ import android.hardware.SensorEventListener;
import android.hardware.SensorManager; import android.hardware.SensorManager;
import android.util.Log; import android.util.Log;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
public class ProximitySensor implements SensorEventListener { public class ProximitySensor implements SensorEventListener {
private static final boolean DEBUG = false; private static final boolean DEBUG = false;
@ -38,6 +42,7 @@ public class ProximitySensor implements SensorEventListener {
private SensorManager mSensorManager; private SensorManager mSensorManager;
private Sensor mSensor; private Sensor mSensor;
private Context mContext; private Context mContext;
private ExecutorService mExecutorService;
private boolean mSawNear = false; private boolean mSawNear = false;
private long mInPocketTime = 0; private long mInPocketTime = 0;
@ -46,11 +51,16 @@ public class ProximitySensor implements SensorEventListener {
mContext = context; mContext = context;
mSensorManager = mContext.getSystemService(SensorManager.class); mSensorManager = mContext.getSystemService(SensorManager.class);
mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY, false); mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY, false);
mExecutorService = Executors.newSingleThreadExecutor();
}
private Future<?> submit(Runnable runnable) {
return mExecutorService.submit(runnable);
} }
@Override @Override
public void onSensorChanged(SensorEvent event) { public void onSensorChanged(SensorEvent event) {
/* boolean isNear = event.values[0] < mSensor.getMaximumRange(); boolean isNear = event.values[0] < mSensor.getMaximumRange();
if (mSawNear && !isNear) { if (mSawNear && !isNear) {
if (shouldPulse(event.timestamp)) { if (shouldPulse(event.timestamp)) {
Utils.launchDozePulse(mContext); Utils.launchDozePulse(mContext);
@ -58,17 +68,17 @@ public class ProximitySensor implements SensorEventListener {
} else { } else {
mInPocketTime = event.timestamp; mInPocketTime = event.timestamp;
} }
mSawNear = isNear;*/ mSawNear = isNear;
} }
private boolean shouldPulse(long timestamp) { private boolean shouldPulse(long timestamp) {
long delta = timestamp - mInPocketTime; long delta = timestamp - mInPocketTime;
if (Utils.handwaveGestureEnabled(mContext) && Utils.pocketGestureEnabled(mContext)) { if (Utils.isHandwaveGestureEnabled(mContext) && Utils.isPocketGestureEnabled(mContext)) {
return true; return true;
} else if (Utils.handwaveGestureEnabled(mContext)) { } else if (Utils.isHandwaveGestureEnabled(mContext)) {
return delta < HANDWAVE_MAX_DELTA_NS; return delta < HANDWAVE_MAX_DELTA_NS;
} else if (Utils.pocketGestureEnabled(mContext)) { } else if (Utils.isPocketGestureEnabled(mContext)) {
return delta >= POCKET_MIN_DELTA_NS; return delta >= POCKET_MIN_DELTA_NS;
} }
return false; return false;
@ -81,11 +91,16 @@ public class ProximitySensor implements SensorEventListener {
protected void enable() { protected void enable() {
if (DEBUG) Log.d(TAG, "Enabling"); if (DEBUG) Log.d(TAG, "Enabling");
mSensorManager.registerListener(this, mSensor, SensorManager.SENSOR_DELAY_NORMAL); submit(() -> {
mSensorManager.registerListener(this, mSensor,
SensorManager.SENSOR_DELAY_NORMAL);
});
} }
protected void disable() { protected void disable() {
if (DEBUG) Log.d(TAG, "Disabling"); if (DEBUG) Log.d(TAG, "Disabling");
mSensorManager.unregisterListener(this, mSensor); submit(() -> {
mSensorManager.unregisterListener(this, mSensor);
});
} }
} }

View file

@ -1,82 +0,0 @@
/*
* Copyright (c) 2015 The CyanogenMod Project
* 2017-2018 The LineageOS 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.lineageos.settings.doze;
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.SystemClock;
import android.util.Log;
public class SignificantSensor implements SensorEventListener
{
private static final boolean DEBUG = false;
private static final String TAG = "SignificantSensor";
private static final int BATCH_LATENCY_IN_MS = 100;
private static final int MIN_PULSE_INTERVAL_MS = 2500;
private SensorManager mSensorManager;
private Sensor mSensor;
private Context mContext;
private long mEntryTimestamp;
public SignificantSensor(Context context)
{
mContext = context;
mSensorManager = mContext.getSystemService(SensorManager.class);
mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_SIGNIFICANT_MOTION);
}
@Override
public void onSensorChanged(SensorEvent event)
{
if (DEBUG) Log.d(TAG, "Got sensor event: " + event.values[0]);
/* long delta = SystemClock.elapsedRealtime() - mEntryTimestamp;
if (delta < MIN_PULSE_INTERVAL_MS)
return;
mEntryTimestamp = SystemClock.elapsedRealtime();
if (event.values[0] == 1)
Utils.launchDozePulse(mContext);*/
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy)
{
/* Empty */
}
protected void enable()
{
if (DEBUG) Log.d(TAG, "Enabling");
mSensorManager.registerListener(this, mSensor, SensorManager.SENSOR_DELAY_NORMAL, BATCH_LATENCY_IN_MS * 1000);
mEntryTimestamp = SystemClock.elapsedRealtime();
}
protected void disable()
{
if (DEBUG) Log.d(TAG, "Disabling");
mSensorManager.unregisterListener(this, mSensor);
}
}

View file

@ -25,8 +25,12 @@ import android.hardware.SensorManager;
import android.os.SystemClock; import android.os.SystemClock;
import android.util.Log; import android.util.Log;
public class TiltSensor implements SensorEventListener import java.util.concurrent.ExecutorService;
{ import java.util.concurrent.Executors;
import java.util.concurrent.Future;
public class TiltSensor implements SensorEventListener {
private static final boolean DEBUG = false; private static final boolean DEBUG = false;
private static final String TAG = "TiltSensor"; private static final String TAG = "TiltSensor";
@ -36,47 +40,55 @@ public class TiltSensor implements SensorEventListener
private SensorManager mSensorManager; private SensorManager mSensorManager;
private Sensor mSensor; private Sensor mSensor;
private Context mContext; private Context mContext;
private ExecutorService mExecutorService;
private long mEntryTimestamp; private long mEntryTimestamp;
public TiltSensor(Context context) public TiltSensor(Context context) {
{
mContext = context; mContext = context;
mSensorManager = mContext.getSystemService(SensorManager.class); mSensorManager = mContext.getSystemService(SensorManager.class);
mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_TILT_DETECTOR); mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_TILT_DETECTOR);
mExecutorService = Executors.newSingleThreadExecutor();
}
private Future<?> submit(Runnable runnable) {
return mExecutorService.submit(runnable);
} }
@Override @Override
public void onSensorChanged(SensorEvent event) public void onSensorChanged(SensorEvent event) {
{
if (DEBUG) Log.d(TAG, "Got sensor event: " + event.values[0]); if (DEBUG) Log.d(TAG, "Got sensor event: " + event.values[0]);
/* long delta = SystemClock.elapsedRealtime() - mEntryTimestamp; long delta = SystemClock.elapsedRealtime() - mEntryTimestamp;
if (delta < MIN_PULSE_INTERVAL_MS) if (delta < MIN_PULSE_INTERVAL_MS) {
return; return;
} else {
mEntryTimestamp = SystemClock.elapsedRealtime();
}
mEntryTimestamp = SystemClock.elapsedRealtime(); if (event.values[0] == 1) {
Utils.launchDozePulse(mContext);
if (event.values[0] == 1) }
Utils.launchDozePulse(mContext);*/
} }
@Override @Override
public void onAccuracyChanged(Sensor sensor, int accuracy) public void onAccuracyChanged(Sensor sensor, int accuracy) {
{
/* Empty */ /* Empty */
} }
protected void enable() protected void enable() {
{
if (DEBUG) Log.d(TAG, "Enabling"); if (DEBUG) Log.d(TAG, "Enabling");
mSensorManager.registerListener(this, mSensor, SensorManager.SENSOR_DELAY_NORMAL, BATCH_LATENCY_IN_MS * 1000); submit(() -> {
mEntryTimestamp = SystemClock.elapsedRealtime(); mSensorManager.registerListener(this, mSensor,
SensorManager.SENSOR_DELAY_NORMAL, BATCH_LATENCY_IN_MS * 1000);
mEntryTimestamp = SystemClock.elapsedRealtime();
});
} }
protected void disable() protected void disable() {
{
if (DEBUG) Log.d(TAG, "Disabling"); if (DEBUG) Log.d(TAG, "Disabling");
mSensorManager.unregisterListener(this, mSensor); submit(() -> {
mSensorManager.unregisterListener(this, mSensor);
});
} }
} }

View file

@ -1,6 +1,6 @@
/* /*
* Copyright (c) 2015 The CyanogenMod Project * Copyright (C) 2015 The CyanogenMod Project
* 2017 The LineageOS Project * 2017-2019 The LineageOS Project
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -25,6 +25,9 @@ import android.support.v7.preference.PreferenceManager;
import android.provider.Settings; import android.provider.Settings;
import android.util.Log; import android.util.Log;
import com.android.internal.hardware.AmbientDisplayConfiguration;
import static android.provider.Settings.Secure.DOZE_ALWAYS_ON;
import static android.provider.Settings.Secure.DOZE_ENABLED; import static android.provider.Settings.Secure.DOZE_ENABLED;
public final class Utils { public final class Utils {
@ -34,6 +37,9 @@ public final class Utils {
private static final String DOZE_INTENT = "com.android.systemui.doze.pulse"; private static final String DOZE_INTENT = "com.android.systemui.doze.pulse";
protected static final String ALWAYS_ON_DISPLAY = "always_on_display";
protected static final String CATEG_TILT_SENSOR = "tilt_sensor";
protected static final String CATEG_PROX_SENSOR = "proximity_sensor"; protected static final String CATEG_PROX_SENSOR = "proximity_sensor";
protected static final String GESTURE_PICK_UP_KEY = "gesture_pick_up"; protected static final String GESTURE_PICK_UP_KEY = "gesture_pick_up";
@ -53,7 +59,7 @@ public final class Utils {
} }
protected static void checkDozeService(Context context) { protected static void checkDozeService(Context context) {
if (isDozeEnabled(context) && sensorsEnabled(context)) { if (isDozeEnabled(context) && !isAlwaysOnEnabled(context) && sensorsEnabled(context)) {
startService(context); startService(context);
} else { } else {
stopService(context); stopService(context);
@ -76,7 +82,7 @@ public final class Utils {
DOZE_ENABLED, 1) != 0; DOZE_ENABLED, 1) != 0;
} }
protected static boolean enableDoze(boolean enable, Context context) { protected static boolean enableDoze(Context context, boolean enable) {
return Settings.Secure.putInt(context.getContentResolver(), return Settings.Secure.putInt(context.getContentResolver(),
DOZE_ENABLED, enable ? 1 : 0); DOZE_ENABLED, enable ? 1 : 0);
} }
@ -87,23 +93,43 @@ public final class Utils {
new UserHandle(UserHandle.USER_CURRENT)); new UserHandle(UserHandle.USER_CURRENT));
} }
protected static boolean pickUpEnabled(Context context) { protected static boolean enableAlwaysOn(Context context, boolean enable) {
return PreferenceManager.getDefaultSharedPreferences(context) return Settings.Secure.putIntForUser(context.getContentResolver(),
.getBoolean(GESTURE_PICK_UP_KEY, false); DOZE_ALWAYS_ON, enable ? 1 : 0, UserHandle.USER_CURRENT);
} }
protected static boolean handwaveGestureEnabled(Context context) { protected static boolean isAlwaysOnEnabled(Context context) {
return PreferenceManager.getDefaultSharedPreferences(context) final boolean enabledByDefault = context.getResources()
.getBoolean(GESTURE_HAND_WAVE_KEY, false); .getBoolean(com.android.internal.R.bool.config_dozeAlwaysOnEnabled);
return Settings.Secure.getIntForUser(context.getContentResolver(),
DOZE_ALWAYS_ON, alwaysOnDisplayAvailable(context) && enabledByDefault ? 1 : 0,
UserHandle.USER_CURRENT) != 0;
} }
protected static boolean pocketGestureEnabled(Context context) { protected static boolean alwaysOnDisplayAvailable(Context context) {
return new AmbientDisplayConfiguration(context).alwaysOnAvailable();
}
protected static boolean isGestureEnabled(Context context, String gesture) {
return PreferenceManager.getDefaultSharedPreferences(context) return PreferenceManager.getDefaultSharedPreferences(context)
.getBoolean(GESTURE_POCKET_KEY, false); .getBoolean(gesture, false);
}
protected static boolean isPickUpEnabled(Context context) {
return isGestureEnabled(context, GESTURE_PICK_UP_KEY);
}
protected static boolean isHandwaveGestureEnabled(Context context) {
return isGestureEnabled(context, GESTURE_HAND_WAVE_KEY);
}
protected static boolean isPocketGestureEnabled(Context context) {
return isGestureEnabled(context, GESTURE_POCKET_KEY);
} }
protected static boolean sensorsEnabled(Context context) { protected static boolean sensorsEnabled(Context context) {
return pickUpEnabled(context) || handwaveGestureEnabled(context) return isPickUpEnabled(context) || isHandwaveGestureEnabled(context)
|| pocketGestureEnabled(context); || isPocketGestureEnabled(context);
} }
} }

View file

@ -1,29 +0,0 @@
#
# Copyright (C) 2016 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.
#
# Inherit from those products. Most specific first.
$(call inherit-product, $(SRC_TARGET_DIR)/product/core_64_bit.mk)
$(call inherit-product, $(SRC_TARGET_DIR)/product/full_base_telephony.mk)
# Inherit from gts3llte device
$(call inherit-product, device/samsung/gts3llte/device.mk)
# Device identifier. This must come after all inclusions
PRODUCT_DEVICE := gts3llte
PRODUCT_NAME := full_gts3llte
PRODUCT_BRAND := samsung
PRODUCT_MODEL := gts3llte
PRODUCT_MANUFACTURER := samsung

5
gps/Android.mk Normal file → Executable file
View file

@ -15,4 +15,7 @@
# limitations under the License. # limitations under the License.
# #
include $(call first-makefiles-under,$(call my-dir)) LOCAL_PATH := $(call my-dir)
include $(LOCAL_PATH)/build/target_specific_features.mk
include $(call all-makefiles-under,$(LOCAL_PATH))

2
gps/android/AGnss.cpp Normal file → Executable file
View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2017, The Linux Foundation. All rights reserved. * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
* Not a Contribution * Not a Contribution
*/ */
/* /*

8
gps/android/AGnss.h Normal file → Executable file
View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2017, The Linux Foundation. All rights reserved. * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
* Not a Contribution * Not a Contribution
*/ */
/* /*
@ -18,8 +18,8 @@
* limitations under the License. * limitations under the License.
*/ */
#ifndef ANDROID_HARDWARE_GNSS_V1_1_AGNSS_H #ifndef ANDROID_HARDWARE_GNSS_V1_0_AGNSS_H
#define ANDROID_HARDWARE_GNSS_V1_1_AGNSS_H #define ANDROID_HARDWARE_GNSS_V1_0_AGNSS_H
#include <android/hardware/gnss/1.0/IAGnss.h> #include <android/hardware/gnss/1.0/IAGnss.h>
#include <hidl/Status.h> #include <hidl/Status.h>
@ -76,4 +76,4 @@ struct AGnss : public IAGnss {
} // namespace hardware } // namespace hardware
} // namespace android } // namespace android
#endif // ANDROID_HARDWARE_GNSS_V1_1_AGNSS_H #endif // ANDROID_HARDWARE_GNSS_V1_0_AGNSS_H

2
gps/android/AGnssRil.cpp Normal file → Executable file
View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2017, The Linux Foundation. All rights reserved. * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
* Not a Contribution * Not a Contribution
*/ */
/* /*

2
gps/android/AGnssRil.h Normal file → Executable file
View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2017, The Linux Foundation. All rights reserved. * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
* Not a Contribution * Not a Contribution
*/ */
/* /*

11
gps/android/Android.mk Normal file → Executable file
View file

@ -2,8 +2,7 @@ LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS) include $(CLEAR_VARS)
LOCAL_MODULE := android.hardware.gnss@1.0-impl-qti LOCAL_MODULE := android.hardware.gnss@1.0-impl-qti
LOCAL_MODULE_PATH_32 := $(TARGET_OUT_VENDOR)/lib LOCAL_VENDOR_MODULE := true
LOCAL_MODULE_PATH_64 := $(TARGET_OUT_VENDOR)/lib64
LOCAL_MODULE_RELATIVE_PATH := hw LOCAL_MODULE_RELATIVE_PATH := hw
LOCAL_SRC_FILES := \ LOCAL_SRC_FILES := \
AGnss.cpp \ AGnss.cpp \
@ -36,6 +35,7 @@ LOCAL_SHARED_LIBRARIES := \
libhidlbase \ libhidlbase \
libhidltransport \ libhidltransport \
libhwbinder \ libhwbinder \
libcutils \
libutils \ libutils \
android.hardware.gnss@1.0 \ android.hardware.gnss@1.0 \
@ -43,7 +43,6 @@ LOCAL_SHARED_LIBRARIES += \
libloc_core \ libloc_core \
libgps.utils \ libgps.utils \
libdl \ libdl \
libloc_pla \
liblocation_api \ liblocation_api \
LOCAL_CFLAGS += $(GNSS_CFLAGS) LOCAL_CFLAGS += $(GNSS_CFLAGS)
@ -52,19 +51,15 @@ include $(BUILD_SHARED_LIBRARY)
BUILD_GNSS_HIDL_SERVICE := true BUILD_GNSS_HIDL_SERVICE := true
ifneq ($(BOARD_VENDOR_QCOM_LOC_PDK_FEATURE_SET), true) ifneq ($(BOARD_VENDOR_QCOM_LOC_PDK_FEATURE_SET), true)
ifneq ($(LW_FEATURE_SET),true) ifneq ($(LW_FEATURE_SET),true)
ifneq ($(TARGET_HAS_LOW_RAM),true)
BUILD_GNSS_HIDL_SERVICE := false BUILD_GNSS_HIDL_SERVICE := false
endif # TARGET_HAS_LOW_RAM
endif # LW_FEATURE_SET endif # LW_FEATURE_SET
endif # BOARD_VENDOR_QCOM_LOC_PDK_FEATURE_SET endif # BOARD_VENDOR_QCOM_LOC_PDK_FEATURE_SET
ifeq ($(BUILD_GNSS_HIDL_SERVICE), true) ifeq ($(BUILD_GNSS_HIDL_SERVICE), true)
include $(CLEAR_VARS) include $(CLEAR_VARS)
LOCAL_MODULE := android.hardware.gnss@1.0-service-qti LOCAL_MODULE := android.hardware.gnss@1.0-service-qti
LOCAL_MODULE_PATH := $(TARGET_OUT_VENDOR_EXECUTABLES)
LOCAL_MODULE_RELATIVE_PATH := hw
LOCAL_VENDOR_MODULE := true LOCAL_VENDOR_MODULE := true
LOCAL_MODULE_OWNER := qti LOCAL_MODULE_RELATIVE_PATH := hw
LOCAL_INIT_RC := android.hardware.gnss@1.0-service-qti.rc LOCAL_INIT_RC := android.hardware.gnss@1.0-service-qti.rc
LOCAL_SRC_FILES := \ LOCAL_SRC_FILES := \
service.cpp \ service.cpp \

33
gps/android/Gnss.cpp Normal file → Executable file
View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2017, The Linux Foundation. All rights reserved. * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
* Not a Contribution * Not a Contribution
*/ */
/* /*
@ -20,9 +20,13 @@
#define LOG_TAG "LocSvc_GnssInterface" #define LOG_TAG "LocSvc_GnssInterface"
#include <fstream>
#include <log_util.h> #include <log_util.h>
#include <dlfcn.h> #include <dlfcn.h>
#include <cutils/properties.h>
#include "Gnss.h" #include "Gnss.h"
#include <LocationUtil.h>
typedef void* (getLocationInterface)(); typedef void* (getLocationInterface)();
namespace android { namespace android {
@ -107,7 +111,7 @@ GnssInterface* Gnss::getGnssInterface() {
return mGnssInterface; return mGnssInterface;
} }
Return<bool> Gnss::setCallback(const sp<IGnssCallback>& callback) { Return<bool> Gnss::setCallback(const sp<V1_0::IGnssCallback>& callback) {
ENTRY_LOG_CALLFLOW(); ENTRY_LOG_CALLFLOW();
if (mGnssCbIface != nullptr) { if (mGnssCbIface != nullptr) {
mGnssCbIface->unlinkToDeath(mGnssDeathRecipient); mGnssCbIface->unlinkToDeath(mGnssDeathRecipient);
@ -251,7 +255,7 @@ Return<bool> Gnss::injectTime(int64_t timeMs, int64_t timeReferenceMs,
} }
} }
Return<void> Gnss::deleteAidingData(IGnss::GnssAidingData aidingDataFlags) { Return<void> Gnss::deleteAidingData(V1_0::IGnss::GnssAidingData aidingDataFlags) {
ENTRY_LOG_CALLFLOW(); ENTRY_LOG_CALLFLOW();
GnssAPIClient* api = getApi(); GnssAPIClient* api = getApi();
if (api) { if (api) {
@ -260,8 +264,8 @@ Return<void> Gnss::deleteAidingData(IGnss::GnssAidingData aidingDataFlags) {
return Void(); return Void();
} }
Return<bool> Gnss::setPositionMode(IGnss::GnssPositionMode mode, Return<bool> Gnss::setPositionMode(V1_0::IGnss::GnssPositionMode mode,
IGnss::GnssPositionRecurrence recurrence, V1_0::IGnss::GnssPositionRecurrence recurrence,
uint32_t minIntervalMs, uint32_t minIntervalMs,
uint32_t preferredAccuracyMeters, uint32_t preferredAccuracyMeters,
uint32_t preferredTimeMs) { uint32_t preferredTimeMs) {
@ -275,48 +279,49 @@ Return<bool> Gnss::setPositionMode(IGnss::GnssPositionMode mode,
return retVal; return retVal;
} }
Return<sp<IAGnss>> Gnss::getExtensionAGnss() { Return<sp<V1_0::IAGnss>> Gnss::getExtensionAGnss() {
ENTRY_LOG_CALLFLOW(); ENTRY_LOG_CALLFLOW();
mAGnssIface = new AGnss(this); mAGnssIface = new AGnss(this);
return mAGnssIface; return mAGnssIface;
} }
Return<sp<IGnssNi>> Gnss::getExtensionGnssNi() { Return<sp<V1_0::IGnssNi>> Gnss::getExtensionGnssNi() {
ENTRY_LOG_CALLFLOW(); ENTRY_LOG_CALLFLOW();
mGnssNi = new GnssNi(this); mGnssNi = new GnssNi(this);
return mGnssNi; return mGnssNi;
} }
Return<sp<IGnssMeasurement>> Gnss::getExtensionGnssMeasurement() { Return<sp<V1_0::IGnssMeasurement>> Gnss::getExtensionGnssMeasurement() {
ENTRY_LOG_CALLFLOW(); ENTRY_LOG_CALLFLOW();
mGnssMeasurement = new GnssMeasurement(); if (mGnssMeasurement == nullptr)
mGnssMeasurement = new GnssMeasurement();
return mGnssMeasurement; return mGnssMeasurement;
} }
Return<sp<IGnssConfiguration>> Gnss::getExtensionGnssConfiguration() { Return<sp<V1_0::IGnssConfiguration>> Gnss::getExtensionGnssConfiguration() {
ENTRY_LOG_CALLFLOW(); ENTRY_LOG_CALLFLOW();
mGnssConfig = new GnssConfiguration(this); mGnssConfig = new GnssConfiguration(this);
return mGnssConfig; return mGnssConfig;
} }
Return<sp<IGnssGeofencing>> Gnss::getExtensionGnssGeofencing() { Return<sp<V1_0::IGnssGeofencing>> Gnss::getExtensionGnssGeofencing() {
ENTRY_LOG_CALLFLOW(); ENTRY_LOG_CALLFLOW();
mGnssGeofencingIface = new GnssGeofencing(); mGnssGeofencingIface = new GnssGeofencing();
return mGnssGeofencingIface; return mGnssGeofencingIface;
} }
Return<sp<IGnssBatching>> Gnss::getExtensionGnssBatching() { Return<sp<V1_0::IGnssBatching>> Gnss::getExtensionGnssBatching() {
mGnssBatching = new GnssBatching(); mGnssBatching = new GnssBatching();
return mGnssBatching; return mGnssBatching;
} }
Return<sp<IGnssDebug>> Gnss::getExtensionGnssDebug() { Return<sp<V1_0::IGnssDebug>> Gnss::getExtensionGnssDebug() {
ENTRY_LOG_CALLFLOW(); ENTRY_LOG_CALLFLOW();
mGnssDebug = new GnssDebug(this); mGnssDebug = new GnssDebug(this);
return mGnssDebug; return mGnssDebug;
} }
Return<sp<IAGnssRil>> Gnss::getExtensionAGnssRil() { Return<sp<V1_0::IAGnssRil>> Gnss::getExtensionAGnssRil() {
mGnssRil = new AGnssRil(this); mGnssRil = new AGnssRil(this);
return mGnssRil; return mGnssRil;
} }

64
gps/android/Gnss.h Normal file → Executable file
View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2017, The Linux Foundation. All rights reserved. * Copyright (c) 2017-2018-2018-2018, The Linux Foundation. All rights reserved.
* Not a Contribution * Not a Contribution
*/ */
/* /*
@ -18,8 +18,8 @@
* limitations under the License. * limitations under the License.
*/ */
#ifndef ANDROID_HARDWARE_GNSS_V1_1_GNSS_H #ifndef ANDROID_HARDWARE_GNSS_V1_0_GNSS_H
#define ANDROID_HARDWARE_GNSS_V1_1_GNSS_H #define ANDROID_HARDWARE_GNSS_V1_0_GNSS_H
#include <AGnss.h> #include <AGnss.h>
#include <AGnssRil.h> #include <AGnssRil.h>
@ -31,6 +31,7 @@
#include <GnssDebug.h> #include <GnssDebug.h>
#include <android/hardware/gnss/1.0/IGnss.h> #include <android/hardware/gnss/1.0/IGnss.h>
#include <hidl/MQDescriptor.h>
#include <hidl/Status.h> #include <hidl/Status.h>
#include <GnssAPIClient.h> #include <GnssAPIClient.h>
@ -42,34 +43,24 @@ namespace gnss {
namespace V1_0 { namespace V1_0 {
namespace implementation { namespace implementation {
using ::android::hardware::hidl_array;
using ::android::hardware::hidl_memory;
using ::android::hardware::hidl_string;
using ::android::hardware::hidl_vec;
using ::android::hardware::Return; using ::android::hardware::Return;
using ::android::hardware::Void; using ::android::hardware::Void;
using ::android::hardware::hidl_vec;
using ::android::hardware::hidl_string;
using ::android::sp; using ::android::sp;
using ::android::hardware::gnss::V1_0::GnssLocation;
struct Gnss : public IGnss { struct Gnss : public IGnss {
Gnss(); Gnss();
~Gnss(); ~Gnss();
// registerAsService will call interfaceChain to determine the version of service
/* comment this out until we know really how to manipulate hidl version
using interfaceChain_cb = std::function<
void(const ::android::hardware::hidl_vec<::android::hardware::hidl_string>& descriptors)>;
virtual ::android::hardware::Return<void> interfaceChain(interfaceChain_cb _hidl_cb) override {
_hidl_cb({
"android.hardware.gnss@1.1::IGnss",
::android::hidl::base::V1_0::IBase::descriptor,
});
return ::android::hardware::Void();
}
*/
/* /*
* Methods from ::android::hardware::gnss::V1_0::IGnss follow. * Methods from ::android::hardware::gnss::V1_0::IGnss follow.
* These declarations were generated from Gnss.hal. * These declarations were generated from Gnss.hal.
*/ */
Return<bool> setCallback(const sp<IGnssCallback>& callback) override; Return<bool> setCallback(const sp<V1_0::IGnssCallback>& callback) override;
Return<bool> start() override; Return<bool> start() override;
Return<bool> stop() override; Return<bool> stop() override;
Return<void> cleanup() override; Return<void> cleanup() override;
@ -79,30 +70,30 @@ struct Gnss : public IGnss {
Return<bool> injectTime(int64_t timeMs, Return<bool> injectTime(int64_t timeMs,
int64_t timeReferenceMs, int64_t timeReferenceMs,
int32_t uncertaintyMs) override; int32_t uncertaintyMs) override;
Return<void> deleteAidingData(IGnss::GnssAidingData aidingDataFlags) override; Return<void> deleteAidingData(V1_0::IGnss::GnssAidingData aidingDataFlags) override;
Return<bool> setPositionMode(IGnss::GnssPositionMode mode, Return<bool> setPositionMode(V1_0::IGnss::GnssPositionMode mode,
IGnss::GnssPositionRecurrence recurrence, V1_0::IGnss::GnssPositionRecurrence recurrence,
uint32_t minIntervalMs, uint32_t minIntervalMs,
uint32_t preferredAccuracyMeters, uint32_t preferredAccuracyMeters,
uint32_t preferredTimeMs) override; uint32_t preferredTimeMs) override;
Return<sp<IAGnss>> getExtensionAGnss() override; Return<sp<V1_0::IAGnss>> getExtensionAGnss() override;
Return<sp<IGnssNi>> getExtensionGnssNi() override; Return<sp<V1_0::IGnssNi>> getExtensionGnssNi() override;
Return<sp<IGnssMeasurement>> getExtensionGnssMeasurement() override; Return<sp<V1_0::IGnssMeasurement>> getExtensionGnssMeasurement() override;
Return<sp<IGnssConfiguration>> getExtensionGnssConfiguration() override; Return<sp<V1_0::IGnssConfiguration>> getExtensionGnssConfiguration() override;
Return<sp<IGnssGeofencing>> getExtensionGnssGeofencing() override; Return<sp<V1_0::IGnssGeofencing>> getExtensionGnssGeofencing() override;
Return<sp<IGnssBatching>> getExtensionGnssBatching() override; Return<sp<V1_0::IGnssBatching>> getExtensionGnssBatching() override;
Return<sp<IAGnssRil>> getExtensionAGnssRil() override; Return<sp<V1_0::IAGnssRil>> getExtensionAGnssRil() override;
inline Return<sp<IGnssNavigationMessage>> getExtensionGnssNavigationMessage() override { inline Return<sp<V1_0::IGnssNavigationMessage>> getExtensionGnssNavigationMessage() override {
return nullptr; return nullptr;
} }
inline Return<sp<IGnssXtra>> getExtensionXtra() override { inline Return<sp<V1_0::IGnssXtra>> getExtensionXtra() override {
return nullptr; return nullptr;
} }
Return<sp<IGnssDebug>> getExtensionGnssDebug() override; Return<sp<V1_0::IGnssDebug>> getExtensionGnssDebug() override;
// These methods are not part of the IGnss base class. // These methods are not part of the IGnss base class.
GnssAPIClient* getApi(); GnssAPIClient* getApi();
@ -110,6 +101,9 @@ struct Gnss : public IGnss {
Return<bool> updateConfiguration(GnssConfig& gnssConfig); Return<bool> updateConfiguration(GnssConfig& gnssConfig);
GnssInterface* getGnssInterface(); GnssInterface* getGnssInterface();
// Callback for ODCPI request
void odcpiRequestCb(const OdcpiRequestInfo& request);
private: private:
struct GnssDeathRecipient : hidl_death_recipient { struct GnssDeathRecipient : hidl_death_recipient {
GnssDeathRecipient(sp<Gnss> gnss) : mGnss(gnss) { GnssDeathRecipient(sp<Gnss> gnss) : mGnss(gnss) {
@ -132,8 +126,8 @@ struct Gnss : public IGnss {
sp<AGnssRil> mGnssRil = nullptr; sp<AGnssRil> mGnssRil = nullptr;
GnssAPIClient* mApi = nullptr; GnssAPIClient* mApi = nullptr;
sp<IGnssCallback> mGnssCbIface = nullptr; sp<V1_0::IGnssCallback> mGnssCbIface = nullptr;
sp<IGnssNiCallback> mGnssNiCbIface = nullptr; sp<V1_0::IGnssNiCallback> mGnssNiCbIface = nullptr;
GnssConfig mPendingConfig; GnssConfig mPendingConfig;
GnssInterface* mGnssInterface = nullptr; GnssInterface* mGnssInterface = nullptr;
}; };
@ -146,4 +140,4 @@ extern "C" IGnss* HIDL_FETCH_IGnss(const char* name);
} // namespace hardware } // namespace hardware
} // namespace android } // namespace android
#endif // ANDROID_HARDWARE_GNSS_V1_1_GNSS_H #endif // ANDROID_HARDWARE_GNSS_V1_0_GNSS_H

2
gps/android/GnssBatching.cpp Normal file → Executable file
View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2017, The Linux Foundation. All rights reserved. * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
* Not a Contribution * Not a Contribution
*/ */
/* /*

8
gps/android/GnssBatching.h Normal file → Executable file
View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2017, The Linux Foundation. All rights reserved. * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
* Not a Contribution * Not a Contribution
*/ */
/* /*
@ -18,8 +18,8 @@
* limitations under the License. * limitations under the License.
*/ */
#ifndef ANDROID_HARDWARE_GNSS_V1_1_GNSSBATCHING_H #ifndef ANDROID_HARDWARE_GNSS_V1_0_GNSSBATCHING_H
#define ANDROID_HARDWARE_GNSS_V1_1_GNSSBATCHING_H #define ANDROID_HARDWARE_GNSS_V1_0_GNSSBATCHING_H
#include <android/hardware/gnss/1.0/IGnssBatching.h> #include <android/hardware/gnss/1.0/IGnssBatching.h>
#include <hidl/Status.h> #include <hidl/Status.h>
@ -77,4 +77,4 @@ struct GnssBatching : public IGnssBatching {
} // namespace hardware } // namespace hardware
} // namespace android } // namespace android
#endif // ANDROID_HARDWARE_GNSS_V1_1_GNSSBATCHING_H #endif // ANDROID_HARDWARE_GNSS_V1_0_GNSSBATCHING_H

2
gps/android/GnssConfiguration.cpp Normal file → Executable file
View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2017, The Linux Foundation. All rights reserved. * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
* Not a Contribution * Not a Contribution
*/ */
/* /*

8
gps/android/GnssConfiguration.h Normal file → Executable file
View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2017, The Linux Foundation. All rights reserved. * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
* Not a Contribution * Not a Contribution
*/ */
@ -19,8 +19,8 @@
*/ */
#ifndef ANDROID_HARDWARE_GNSS_V1_1_GNSSCONFIGURATION_H #ifndef ANDROID_HARDWARE_GNSS_V1_0_GNSSCONFIGURATION_H
#define ANDROID_HARDWARE_GNSS_V1_1_GNSSCONFIGURATION_H #define ANDROID_HARDWARE_GNSS_V1_0_GNSSCONFIGURATION_H
#include <android/hardware/gnss/1.0/IGnssConfiguration.h> #include <android/hardware/gnss/1.0/IGnssConfiguration.h>
#include <hidl/Status.h> #include <hidl/Status.h>
@ -68,4 +68,4 @@ struct GnssConfiguration : public IGnssConfiguration {
} // namespace hardware } // namespace hardware
} // namespace android } // namespace android
#endif // ANDROID_HARDWARE_GNSS_V1_1_GNSSCONFIGURATION_H #endif // ANDROID_HARDWARE_GNSS_V1_0_GNSSCONFIGURATION_H

57
gps/android/GnssDebug.cpp Normal file → Executable file
View file

@ -30,8 +30,14 @@ namespace implementation {
using ::android::hardware::hidl_vec; using ::android::hardware::hidl_vec;
#define GNSS_DEBUG_UNKNOWN_UTC_TIME (1483228800000ULL) // 1/1/2017 00:00 GMT #define GNSS_DEBUG_UNKNOWN_HORIZONTAL_ACCURACY_METERS (20000000)
#define GNSS_DEBUG_UNKNOWN_UTC_TIME_UNC (1.57783680E17) // 5 years in ns #define GNSS_DEBUG_UNKNOWN_VERTICAL_ACCURACY_METERS (20000)
#define GNSS_DEBUG_UNKNOWN_SPEED_ACCURACY_PER_SEC (500)
#define GNSS_DEBUG_UNKNOWN_BEARING_ACCURACY_DEG (180)
#define GNSS_DEBUG_UNKNOWN_UTC_TIME (1483228800000LL) // 1/1/2017 00:00 GMT
#define GNSS_DEBUG_UNKNOWN_UTC_TIME_UNC (1.57783680E17) // 5 years in ns
#define GNSS_DEBUG_UNKNOWN_FREQ_UNC_NS_PER_SEC (2.0e5) // ppm
GnssDebug::GnssDebug(Gnss* gnss) : mGnss(gnss) GnssDebug::GnssDebug(Gnss* gnss) : mGnss(gnss)
{ {
@ -91,6 +97,40 @@ Return<void> GnssDebug::getDebugData(getDebugData_cb _hidl_cb)
data.position.valid = false; data.position.valid = false;
} }
if (data.position.horizontalAccuracyMeters <= 0 ||
data.position.horizontalAccuracyMeters > GNSS_DEBUG_UNKNOWN_HORIZONTAL_ACCURACY_METERS) {
data.position.horizontalAccuracyMeters = GNSS_DEBUG_UNKNOWN_HORIZONTAL_ACCURACY_METERS;
}
if (data.position.verticalAccuracyMeters <= 0 ||
data.position.verticalAccuracyMeters > GNSS_DEBUG_UNKNOWN_VERTICAL_ACCURACY_METERS) {
data.position.verticalAccuracyMeters = GNSS_DEBUG_UNKNOWN_VERTICAL_ACCURACY_METERS;
}
if (data.position.speedAccuracyMetersPerSecond <= 0 ||
data.position.speedAccuracyMetersPerSecond > GNSS_DEBUG_UNKNOWN_SPEED_ACCURACY_PER_SEC) {
data.position.speedAccuracyMetersPerSecond = GNSS_DEBUG_UNKNOWN_SPEED_ACCURACY_PER_SEC;
}
if (data.position.bearingAccuracyDegrees <= 0 ||
data.position.bearingAccuracyDegrees > GNSS_DEBUG_UNKNOWN_BEARING_ACCURACY_DEG) {
data.position.bearingAccuracyDegrees = GNSS_DEBUG_UNKNOWN_BEARING_ACCURACY_DEG;
}
if (data.position.horizontalAccuracyMeters <= 0 ||
data.position.horizontalAccuracyMeters > GNSS_DEBUG_UNKNOWN_HORIZONTAL_ACCURACY_METERS) {
data.position.horizontalAccuracyMeters = GNSS_DEBUG_UNKNOWN_HORIZONTAL_ACCURACY_METERS;
}
if (data.position.verticalAccuracyMeters <= 0 ||
data.position.verticalAccuracyMeters > GNSS_DEBUG_UNKNOWN_VERTICAL_ACCURACY_METERS) {
data.position.verticalAccuracyMeters = GNSS_DEBUG_UNKNOWN_VERTICAL_ACCURACY_METERS;
}
if (data.position.speedAccuracyMetersPerSecond <= 0 ||
data.position.speedAccuracyMetersPerSecond > GNSS_DEBUG_UNKNOWN_SPEED_ACCURACY_PER_SEC) {
data.position.speedAccuracyMetersPerSecond = GNSS_DEBUG_UNKNOWN_SPEED_ACCURACY_PER_SEC;
}
if (data.position.bearingAccuracyDegrees <= 0 ||
data.position.bearingAccuracyDegrees > GNSS_DEBUG_UNKNOWN_BEARING_ACCURACY_DEG) {
data.position.bearingAccuracyDegrees = GNSS_DEBUG_UNKNOWN_BEARING_ACCURACY_DEG;
}
// time block // time block
if (reports.mTime.mValid) { if (reports.mTime.mValid) {
data.time.timeEstimate = reports.mTime.timeEstimate; data.time.timeEstimate = reports.mTime.timeEstimate;
@ -98,10 +138,17 @@ Return<void> GnssDebug::getDebugData(getDebugData_cb _hidl_cb)
data.time.frequencyUncertaintyNsPerSec = data.time.frequencyUncertaintyNsPerSec =
reports.mTime.frequencyUncertaintyNsPerSec; reports.mTime.frequencyUncertaintyNsPerSec;
} }
else {
if (data.time.timeEstimate < GNSS_DEBUG_UNKNOWN_UTC_TIME) {
data.time.timeEstimate = GNSS_DEBUG_UNKNOWN_UTC_TIME; data.time.timeEstimate = GNSS_DEBUG_UNKNOWN_UTC_TIME;
data.time.timeUncertaintyNs = (float)(GNSS_DEBUG_UNKNOWN_UTC_TIME_UNC); }
data.time.frequencyUncertaintyNsPerSec = 0; if (data.time.timeUncertaintyNs <= 0 ||
data.time.timeUncertaintyNs > (float)GNSS_DEBUG_UNKNOWN_UTC_TIME_UNC) {
data.time.timeUncertaintyNs = (float)GNSS_DEBUG_UNKNOWN_UTC_TIME_UNC;
}
if (data.time.frequencyUncertaintyNsPerSec <= 0 ||
data.time.frequencyUncertaintyNsPerSec > (float)GNSS_DEBUG_UNKNOWN_FREQ_UNC_NS_PER_SEC) {
data.time.frequencyUncertaintyNsPerSec = (float)GNSS_DEBUG_UNKNOWN_FREQ_UNC_NS_PER_SEC;
} }
// satellite data block // satellite data block

6
gps/android/GnssDebug.h Normal file → Executable file
View file

@ -14,8 +14,8 @@
* limitations under the License. * limitations under the License.
*/ */
#ifndef ANDROID_HARDWARE_GNSS_V1_1_GNSSDEBUG_H #ifndef ANDROID_HARDWARE_GNSS_V1_0_GNSSDEBUG_H
#define ANDROID_HARDWARE_GNSS_V1_1_GNSSDEBUG_H #define ANDROID_HARDWARE_GNSS_V1_0_GNSSDEBUG_H
#include <android/hardware/gnss/1.0/IGnssDebug.h> #include <android/hardware/gnss/1.0/IGnssDebug.h>
@ -56,4 +56,4 @@ private:
} // namespace hardware } // namespace hardware
} // namespace android } // namespace android
#endif // ANDROID_HARDWARE_GNSS_V1_1_GNSSDEBUG_H #endif // ANDROID_HARDWARE_GNSS_V1_0_GNSSDEBUG_H

2
gps/android/GnssGeofencing.cpp Normal file → Executable file
View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2017, The Linux Foundation. All rights reserved. * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
* Not a Contribution * Not a Contribution
*/ */
/* /*

8
gps/android/GnssGeofencing.h Normal file → Executable file
View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2017, The Linux Foundation. All rights reserved. * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
* Not a Contribution * Not a Contribution
*/ */
/* /*
@ -18,8 +18,8 @@
* limitations under the License. * limitations under the License.
*/ */
#ifndef ANDROID_HARDWARE_GNSS_V1_1_GNSSGEOFENCING_H #ifndef ANDROID_HARDWARE_GNSS_V1_0_GNSSGEOFENCING_H
#define ANDROID_HARDWARE_GNSS_V1_1_GNSSGEOFENCING_H #define ANDROID_HARDWARE_GNSS_V1_0_GNSSGEOFENCING_H
#include <android/hardware/gnss/1.0/IGnssGeofencing.h> #include <android/hardware/gnss/1.0/IGnssGeofencing.h>
#include <hidl/Status.h> #include <hidl/Status.h>
@ -88,4 +88,4 @@ struct GnssGeofencing : public IGnssGeofencing {
} // namespace hardware } // namespace hardware
} // namespace android } // namespace android
#endif // ANDROID_HARDWARE_GNSS_V1_1_GNSSGEOFENCING_H #endif // ANDROID_HARDWARE_GNSS_V1_0_GNSSGEOFENCING_H

8
gps/android/GnssMeasurement.cpp Normal file → Executable file
View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2017, The Linux Foundation. All rights reserved. * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
* Not a Contribution * Not a Contribution
*/ */
/* /*
@ -52,8 +52,9 @@ GnssMeasurement::~GnssMeasurement() {
} }
// Methods from ::android::hardware::gnss::V1_0::IGnssMeasurement follow. // Methods from ::android::hardware::gnss::V1_0::IGnssMeasurement follow.
Return<IGnssMeasurement::GnssMeasurementStatus> GnssMeasurement::setCallback( Return<IGnssMeasurement::GnssMeasurementStatus> GnssMeasurement::setCallback(
const sp<IGnssMeasurementCallback>& callback) { const sp<V1_0::IGnssMeasurementCallback>& callback) {
Return<IGnssMeasurement::GnssMeasurementStatus> ret = Return<IGnssMeasurement::GnssMeasurementStatus> ret =
IGnssMeasurement::GnssMeasurementStatus::ERROR_GENERIC; IGnssMeasurement::GnssMeasurementStatus::ERROR_GENERIC;
@ -72,9 +73,10 @@ Return<IGnssMeasurement::GnssMeasurementStatus> GnssMeasurement::setCallback(
} }
mGnssMeasurementCbIface = callback; mGnssMeasurementCbIface = callback;
mGnssMeasurementCbIface->linkToDeath(mGnssMeasurementDeathRecipient, 0 /*cookie*/); mGnssMeasurementCbIface->linkToDeath(mGnssMeasurementDeathRecipient, 0);
return mApi->measurementSetCallback(callback); return mApi->measurementSetCallback(callback);
} }
Return<void> GnssMeasurement::close() { Return<void> GnssMeasurement::close() {

15
gps/android/GnssMeasurement.h Normal file → Executable file
View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2017, The Linux Foundation. All rights reserved. * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
* Not a Contribution * Not a Contribution
*/ */
/* /*
@ -18,10 +18,11 @@
* limitations under the License. * limitations under the License.
*/ */
#ifndef ANDROID_HARDWARE_GNSS_V1_1_GNSSMEASUREMENT_H #ifndef ANDROID_HARDWARE_GNSS_V1_0_GNSSMEASUREMENT_H
#define ANDROID_HARDWARE_GNSS_V1_1_GNSSMEASUREMENT_H #define ANDROID_HARDWARE_GNSS_V1_0_GNSSMEASUREMENT_H
#include <android/hardware/gnss/1.0/IGnssMeasurement.h> #include <android/hardware/gnss/1.0/IGnssMeasurement.h>
#include <hidl/MQDescriptor.h>
#include <hidl/Status.h> #include <hidl/Status.h>
namespace android { namespace android {
@ -47,8 +48,8 @@ struct GnssMeasurement : public IGnssMeasurement {
* Methods from ::android::hardware::gnss::V1_0::IGnssMeasurement follow. * Methods from ::android::hardware::gnss::V1_0::IGnssMeasurement follow.
* These declarations were generated from IGnssMeasurement.hal. * These declarations were generated from IGnssMeasurement.hal.
*/ */
Return<GnssMeasurementStatus> setCallback( Return<GnssMeasurement::GnssMeasurementStatus> setCallback(
const sp<IGnssMeasurementCallback>& callback) override; const sp<V1_0::IGnssMeasurementCallback>& callback) override;
Return<void> close() override; Return<void> close() override;
private: private:
@ -63,7 +64,7 @@ struct GnssMeasurement : public IGnssMeasurement {
private: private:
sp<GnssMeasurementDeathRecipient> mGnssMeasurementDeathRecipient = nullptr; sp<GnssMeasurementDeathRecipient> mGnssMeasurementDeathRecipient = nullptr;
sp<IGnssMeasurementCallback> mGnssMeasurementCbIface = nullptr; sp<V1_0::IGnssMeasurementCallback> mGnssMeasurementCbIface = nullptr;
MeasurementAPIClient* mApi; MeasurementAPIClient* mApi;
}; };
@ -73,4 +74,4 @@ struct GnssMeasurement : public IGnssMeasurement {
} // namespace hardware } // namespace hardware
} // namespace android } // namespace android
#endif // ANDROID_HARDWARE_GNSS_V1_1_GNSSMEASUREMENT_H #endif // ANDROID_HARDWARE_GNSS_V1_0_GNSSMEASUREMENT_H

2
gps/android/GnssNi.cpp Normal file → Executable file
View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2017, The Linux Foundation. All rights reserved. * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
* Not a Contribution * Not a Contribution
*/ */
/* /*

8
gps/android/GnssNi.h Normal file → Executable file
View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2017, The Linux Foundation. All rights reserved. * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
* Not a Contribution * Not a Contribution
*/ */
/* /*
@ -18,8 +18,8 @@
* limitations under the License. * limitations under the License.
*/ */
#ifndef ANDROID_HARDWARE_GNSS_V1_1_GNSSNI_H #ifndef ANDROID_HARDWARE_GNSS_V1_0_GNSSNI_H
#define ANDROID_HARDWARE_GNSS_V1_1_GNSSNI_H #define ANDROID_HARDWARE_GNSS_V1_0_GNSSNI_H
#include <android/hardware/gnss/1.0/IGnssNi.h> #include <android/hardware/gnss/1.0/IGnssNi.h>
#include <hidl/Status.h> #include <hidl/Status.h>
@ -72,4 +72,4 @@ struct GnssNi : public IGnssNi {
} // namespace hardware } // namespace hardware
} // namespace android } // namespace android
#endif // ANDROID_HARDWARE_GNSS_V1_1_GNSSNI_H #endif // ANDROID_HARDWARE_GNSS_V1_0_GNSSNI_H

View file

@ -1,4 +1,4 @@
service gnss_service /vendor/bin/hw/android.hardware.gnss@1.0-service-qti service gnss_service /vendor/bin/hw/android.hardware.gnss@1.0-service-qti
class main class hal
user gps user gps
group system gps radio group system gps radio

9
gps/android/location_api/BatchingAPIClient.cpp Normal file → Executable file
View file

@ -1,4 +1,4 @@
/* Copyright (c) 2017, The Linux Foundation. All rights reserved. /* Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are * modification, are permitted provided that the following conditions are
@ -45,6 +45,10 @@ namespace gnss {
namespace V1_0 { namespace V1_0 {
namespace implementation { namespace implementation {
using ::android::hardware::gnss::V1_0::IGnssBatching;
using ::android::hardware::gnss::V1_0::IGnssBatchingCallback;
using ::android::hardware::gnss::V1_0::GnssLocation;
static void convertBatchOption(const IGnssBatching::Options& in, LocationOptions& out, static void convertBatchOption(const IGnssBatching::Options& in, LocationOptions& out,
LocationCapabilitiesMask mask); LocationCapabilitiesMask mask);
@ -153,7 +157,8 @@ void BatchingAPIClient::onCapabilitiesCb(LocationCapabilitiesMask capabilitiesMa
mLocationCapabilitiesMask = capabilitiesMask; mLocationCapabilitiesMask = capabilitiesMask;
} }
void BatchingAPIClient::onBatchingCb(size_t count, Location* location, BatchingOptions batchOptions) void BatchingAPIClient::onBatchingCb(size_t count, Location* location,
BatchingOptions /*batchOptions*/)
{ {
LOC_LOGD("%s]: (count: %zu)", __FUNCTION__, count); LOC_LOGD("%s]: (count: %zu)", __FUNCTION__, count);
if (mGnssBatchingCbIface != nullptr && count > 0) { if (mGnssBatchingCbIface != nullptr && count > 0) {

11
gps/android/location_api/BatchingAPIClient.h Normal file → Executable file
View file

@ -1,4 +1,4 @@
/* Copyright (c) 2017, The Linux Foundation. All rights reserved. /* Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are * modification, are permitted provided that the following conditions are
@ -45,11 +45,11 @@ namespace implementation {
class BatchingAPIClient : public LocationAPIClientBase class BatchingAPIClient : public LocationAPIClientBase
{ {
public: public:
BatchingAPIClient(const sp<IGnssBatchingCallback>& callback); BatchingAPIClient(const sp<V1_0::IGnssBatchingCallback>& callback);
~BatchingAPIClient(); ~BatchingAPIClient();
int getBatchSize(); int getBatchSize();
int startSession(const IGnssBatching::Options& options); int startSession(const V1_0::IGnssBatching::Options& options);
int updateSessionOptions(const IGnssBatching::Options& options); int updateSessionOptions(const V1_0::IGnssBatching::Options& options);
int stopSession(); int stopSession();
void getBatchedLocation(int last_n_locations); void getBatchedLocation(int last_n_locations);
void flushBatchedLocations(); void flushBatchedLocations();
@ -61,9 +61,8 @@ public:
void onBatchingCb(size_t count, Location* location, BatchingOptions batchOptions) final; void onBatchingCb(size_t count, Location* location, BatchingOptions batchOptions) final;
private: private:
sp<IGnssBatchingCallback> mGnssBatchingCbIface; sp<V1_0::IGnssBatchingCallback> mGnssBatchingCbIface;
uint32_t mDefaultId; uint32_t mDefaultId;
int mBatchSize;
LocationCapabilitiesMask mLocationCapabilitiesMask; LocationCapabilitiesMask mLocationCapabilitiesMask;
}; };

6
gps/android/location_api/GeofenceAPIClient.cpp Normal file → Executable file
View file

@ -1,4 +1,4 @@
/* Copyright (c) 2017, The Linux Foundation. All rights reserved. /* Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are * modification, are permitted provided that the following conditions are
@ -42,6 +42,8 @@ namespace gnss {
namespace V1_0 { namespace V1_0 {
namespace implementation { namespace implementation {
using ::android::hardware::gnss::V1_0::IGnssGeofenceCallback;
using ::android::hardware::gnss::V1_0::GnssLocation;
GeofenceAPIClient::GeofenceAPIClient(const sp<IGnssGeofenceCallback>& callback) : GeofenceAPIClient::GeofenceAPIClient(const sp<IGnssGeofenceCallback>& callback) :
LocationAPIClientBase(), LocationAPIClientBase(),
@ -158,7 +160,7 @@ void GeofenceAPIClient::onGeofenceBreachCb(GeofenceBreachNotification geofenceBr
auto r = mGnssGeofencingCbIface->gnssGeofenceTransitionCb( auto r = mGnssGeofencingCbIface->gnssGeofenceTransitionCb(
geofenceBreachNotification.ids[i], gnssLocation, transition, geofenceBreachNotification.ids[i], gnssLocation, transition,
static_cast<GnssUtcTime>(geofenceBreachNotification.timestamp)); static_cast<V1_0::GnssUtcTime>(geofenceBreachNotification.timestamp));
if (!r.isOk()) { if (!r.isOk()) {
LOC_LOGE("%s] Error from gnssGeofenceTransitionCb description=%s", LOC_LOGE("%s] Error from gnssGeofenceTransitionCb description=%s",
__func__, r.description().c_str()); __func__, r.description().c_str());

6
gps/android/location_api/GeofenceAPIClient.h Normal file → Executable file
View file

@ -1,4 +1,4 @@
/* Copyright (c) 2017, The Linux Foundation. All rights reserved. /* Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are * modification, are permitted provided that the following conditions are
@ -45,7 +45,7 @@ using ::android::sp;
class GeofenceAPIClient : public LocationAPIClientBase class GeofenceAPIClient : public LocationAPIClientBase
{ {
public: public:
GeofenceAPIClient(const sp<IGnssGeofenceCallback>& callback); GeofenceAPIClient(const sp<V1_0::IGnssGeofenceCallback>& callback);
virtual ~GeofenceAPIClient() = default; virtual ~GeofenceAPIClient() = default;
void geofenceAdd(uint32_t geofence_id, double latitude, double longitude, void geofenceAdd(uint32_t geofence_id, double latitude, double longitude,
@ -65,7 +65,7 @@ public:
void onResumeGeofencesCb(size_t count, LocationError* errors, uint32_t* ids) final; void onResumeGeofencesCb(size_t count, LocationError* errors, uint32_t* ids) final;
private: private:
sp<IGnssGeofenceCallback> mGnssGeofencingCbIface; sp<V1_0::IGnssGeofenceCallback> mGnssGeofencingCbIface;
}; };
} // namespace implementation } // namespace implementation

21
gps/android/location_api/GnssAPIClient.cpp Normal file → Executable file
View file

@ -1,4 +1,4 @@
/* Copyright (c) 2017, The Linux Foundation. All rights reserved. /* Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are * modification, are permitted provided that the following conditions are
@ -43,6 +43,11 @@ namespace gnss {
namespace V1_0 { namespace V1_0 {
namespace implementation { namespace implementation {
using ::android::hardware::gnss::V1_0::IGnss;
using ::android::hardware::gnss::V1_0::IGnssCallback;
using ::android::hardware::gnss::V1_0::IGnssNiCallback;
using ::android::hardware::gnss::V1_0::GnssLocation;
static void convertGnssSvStatus(GnssSvNotification& in, IGnssCallback::GnssSvStatus& out); static void convertGnssSvStatus(GnssSvNotification& in, IGnssCallback::GnssSvStatus& out);
GnssAPIClient::GnssAPIClient(const sp<IGnssCallback>& gpsCb, GnssAPIClient::GnssAPIClient(const sp<IGnssCallback>& gpsCb,
@ -160,6 +165,10 @@ bool GnssAPIClient::gnssSetPositionMode(IGnss::GnssPositionMode mode,
mLocationOptions.size = sizeof(LocationOptions); mLocationOptions.size = sizeof(LocationOptions);
mLocationOptions.minInterval = minIntervalMs; mLocationOptions.minInterval = minIntervalMs;
mLocationOptions.minDistance = preferredAccuracyMeters; mLocationOptions.minDistance = preferredAccuracyMeters;
if (IGnss::GnssPositionRecurrence::RECURRENCE_SINGLE == recurrence) {
mLocationOptions.minInterval =
std::numeric_limits<decltype(mLocationOptions.minInterval)>::max();
}
if (mode == IGnss::GnssPositionMode::STANDALONE) if (mode == IGnss::GnssPositionMode::STANDALONE)
mLocationOptions.mode = GNSS_SUPL_MODE_STANDALONE; mLocationOptions.mode = GNSS_SUPL_MODE_STANDALONE;
else if (mode == IGnss::GnssPositionMode::MS_BASED) else if (mode == IGnss::GnssPositionMode::MS_BASED)
@ -445,7 +454,7 @@ void GnssAPIClient::onGnssNmeaCb(GnssNmeaNotification gnssNmeaNotification)
android::hardware::hidl_string nmeaString; android::hardware::hidl_string nmeaString;
nmeaString.setToExternal(gnssNmeaNotification.nmea, gnssNmeaNotification.length); nmeaString.setToExternal(gnssNmeaNotification.nmea, gnssNmeaNotification.length);
auto r = gnssCbIface->gnssNmeaCb( auto r = gnssCbIface->gnssNmeaCb(
static_cast<GnssUtcTime>(gnssNmeaNotification.timestamp), nmeaString); static_cast<V1_0::GnssUtcTime>(gnssNmeaNotification.timestamp), nmeaString);
if (!r.isOk()) { if (!r.isOk()) {
LOC_LOGE("%s] Error from gnssNmeaCb nmea=%s length=%zu description=%s", __func__, LOC_LOGE("%s] Error from gnssNmeaCb nmea=%s length=%zu description=%s", __func__,
gnssNmeaNotification.nmea, gnssNmeaNotification.length, r.description().c_str()); gnssNmeaNotification.nmea, gnssNmeaNotification.length, r.description().c_str());
@ -499,10 +508,10 @@ static void convertGnssSvStatus(GnssSvNotification& in, IGnssCallback::GnssSvSta
{ {
memset(&out, 0, sizeof(IGnssCallback::GnssSvStatus)); memset(&out, 0, sizeof(IGnssCallback::GnssSvStatus));
out.numSvs = in.count; out.numSvs = in.count;
if (out.numSvs > static_cast<uint32_t>(GnssMax::SVS_COUNT)) { if (out.numSvs > static_cast<uint32_t>(V1_0::GnssMax::SVS_COUNT)) {
LOC_LOGW("%s]: Too many satellites %zd. Clamps to %d.", LOC_LOGW("%s]: Too many satellites %u. Clamps to %d.",
__FUNCTION__, out.numSvs, GnssMax::SVS_COUNT); __FUNCTION__, out.numSvs, V1_0::GnssMax::SVS_COUNT);
out.numSvs = static_cast<uint32_t>(GnssMax::SVS_COUNT); out.numSvs = static_cast<uint32_t>(V1_0::GnssMax::SVS_COUNT);
} }
for (size_t i = 0; i < out.numSvs; i++) { for (size_t i = 0; i < out.numSvs; i++) {
IGnssCallback::GnssSvInfo& info = out.gnssSvList[i]; IGnssCallback::GnssSvInfo& info = out.gnssSvList[i];

24
gps/android/location_api/GnssAPIClient.h Normal file → Executable file
View file

@ -1,4 +1,4 @@
/* Copyright (c) 2017, The Linux Foundation. All rights reserved. /* Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are * modification, are permitted provided that the following conditions are
@ -30,6 +30,7 @@
#ifndef GNSS_API_CLINET_H #ifndef GNSS_API_CLINET_H
#define GNSS_API_CLINET_H #define GNSS_API_CLINET_H
#include <mutex> #include <mutex>
#include <android/hardware/gnss/1.0/IGnss.h> #include <android/hardware/gnss/1.0/IGnss.h>
#include <android/hardware/gnss/1.0/IGnssCallback.h> #include <android/hardware/gnss/1.0/IGnssCallback.h>
@ -47,28 +48,28 @@ using ::android::sp;
class GnssAPIClient : public LocationAPIClientBase class GnssAPIClient : public LocationAPIClientBase
{ {
public: public:
GnssAPIClient(const sp<IGnssCallback>& gpsCb, GnssAPIClient(const sp<V1_0::IGnssCallback>& gpsCb,
const sp<IGnssNiCallback>& niCb); const sp<V1_0::IGnssNiCallback>& niCb);
virtual ~GnssAPIClient(); virtual ~GnssAPIClient();
GnssAPIClient(const GnssAPIClient&) = delete; GnssAPIClient(const GnssAPIClient&) = delete;
GnssAPIClient& operator=(const GnssAPIClient&) = delete; GnssAPIClient& operator=(const GnssAPIClient&) = delete;
// for GpsInterface // for GpsInterface
void gnssUpdateCallbacks(const sp<IGnssCallback>& gpsCb, void gnssUpdateCallbacks(const sp<V1_0::IGnssCallback>& gpsCb,
const sp<IGnssNiCallback>& niCb); const sp<V1_0::IGnssNiCallback>& niCb);
bool gnssStart(); bool gnssStart();
bool gnssStop(); bool gnssStop();
bool gnssSetPositionMode(IGnss::GnssPositionMode mode, bool gnssSetPositionMode(V1_0::IGnss::GnssPositionMode mode,
IGnss::GnssPositionRecurrence recurrence, V1_0::IGnss::GnssPositionRecurrence recurrence,
uint32_t minIntervalMs, uint32_t minIntervalMs,
uint32_t preferredAccuracyMeters, uint32_t preferredAccuracyMeters,
uint32_t preferredTimeMs); uint32_t preferredTimeMs);
// for GpsNiInterface // for GpsNiInterface
void gnssNiRespond(int32_t notifId, IGnssNiCallback::GnssUserResponseType userResponse); void gnssNiRespond(int32_t notifId, V1_0::IGnssNiCallback::GnssUserResponseType userResponse);
// these apis using LocationAPIControlClient // these apis using LocationAPIControlClient
void gnssDeleteAidingData(IGnss::GnssAidingData aidingDataFlags); void gnssDeleteAidingData(V1_0::IGnss::GnssAidingData aidingDataFlags);
void gnssEnable(LocationTechnologyType techType); void gnssEnable(LocationTechnologyType techType);
void gnssDisable(); void gnssDisable();
void gnssConfigurationUpdate(const GnssConfig& gnssConfig); void gnssConfigurationUpdate(const GnssConfig& gnssConfig);
@ -89,12 +90,13 @@ public:
void onStopTrackingCb(LocationError error) final; void onStopTrackingCb(LocationError error) final;
private: private:
sp<IGnssCallback> mGnssCbIface; sp<V1_0::IGnssCallback> mGnssCbIface;
sp<IGnssNiCallback> mGnssNiCbIface; sp<V1_0::IGnssNiCallback> mGnssNiCbIface;
std::mutex mMutex; std::mutex mMutex;
LocationAPIControlClient* mControlClient; LocationAPIControlClient* mControlClient;
LocationCapabilitiesMask mLocationCapabilitiesMask; LocationCapabilitiesMask mLocationCapabilitiesMask;
bool mLocationCapabilitiesCached; bool mLocationCapabilitiesCached;
LocationOptions mLocationOptions; LocationOptions mLocationOptions;
}; };

39
gps/android/location_api/LocationUtil.cpp Normal file → Executable file
View file

@ -1,4 +1,4 @@
/* Copyright (c) 2017, The Linux Foundation. All rights reserved. /* Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are * modification, are permitted provided that the following conditions are
@ -35,6 +35,10 @@ namespace gnss {
namespace V1_0 { namespace V1_0 {
namespace implementation { namespace implementation {
using ::android::hardware::gnss::V1_0::GnssLocation;
using ::android::hardware::gnss::V1_0::GnssConstellationType;
using ::android::hardware::gnss::V1_0::GnssLocationFlags;
void convertGnssLocation(Location& in, GnssLocation& out) void convertGnssLocation(Location& in, GnssLocation& out)
{ {
memset(&out, 0, sizeof(GnssLocation)); memset(&out, 0, sizeof(GnssLocation));
@ -63,7 +67,38 @@ void convertGnssLocation(Location& in, GnssLocation& out)
out.verticalAccuracyMeters = in.verticalAccuracy; out.verticalAccuracyMeters = in.verticalAccuracy;
out.speedAccuracyMetersPerSecond = in.speedAccuracy; out.speedAccuracyMetersPerSecond = in.speedAccuracy;
out.bearingAccuracyDegrees = in.bearingAccuracy; out.bearingAccuracyDegrees = in.bearingAccuracy;
out.timestamp = static_cast<GnssUtcTime>(in.timestamp); out.timestamp = static_cast<V1_0::GnssUtcTime>(in.timestamp);
}
void convertGnssLocation(const GnssLocation& in, Location& out)
{
memset(&out, 0, sizeof(out));
if (in.gnssLocationFlags & GnssLocationFlags::HAS_LAT_LONG)
out.flags |= LOCATION_HAS_LAT_LONG_BIT;
if (in.gnssLocationFlags & GnssLocationFlags::HAS_ALTITUDE)
out.flags |= LOCATION_HAS_ALTITUDE_BIT;
if (in.gnssLocationFlags & GnssLocationFlags::HAS_SPEED)
out.flags |= LOCATION_HAS_SPEED_BIT;
if (in.gnssLocationFlags & GnssLocationFlags::HAS_BEARING)
out.flags |= LOCATION_HAS_BEARING_BIT;
if (in.gnssLocationFlags & GnssLocationFlags::HAS_HORIZONTAL_ACCURACY)
out.flags |= LOCATION_HAS_ACCURACY_BIT;
if (in.gnssLocationFlags & GnssLocationFlags::HAS_VERTICAL_ACCURACY)
out.flags |= LOCATION_HAS_VERTICAL_ACCURACY_BIT;
if (in.gnssLocationFlags & GnssLocationFlags::HAS_SPEED_ACCURACY)
out.flags |= LOCATION_HAS_SPEED_ACCURACY_BIT;
if (in.gnssLocationFlags & GnssLocationFlags::HAS_BEARING_ACCURACY)
out.flags |= LOCATION_HAS_BEARING_ACCURACY_BIT;
out.latitude = in.latitudeDegrees;
out.longitude = in.longitudeDegrees;
out.altitude = in.altitudeMeters;
out.speed = in.speedMetersPerSec;
out.bearing = in.bearingDegrees;
out.accuracy = in.horizontalAccuracyMeters;
out.verticalAccuracy = in.verticalAccuracyMeters;
out.speedAccuracy = in.speedAccuracyMetersPerSecond;
out.bearingAccuracy = in.bearingAccuracyDegrees;
out.timestamp = static_cast<uint64_t>(in.timestamp);
} }
void convertGnssConstellationType(GnssSvType& in, GnssConstellationType& out) void convertGnssConstellationType(GnssSvType& in, GnssConstellationType& out)

7
gps/android/location_api/LocationUtil.h Normal file → Executable file
View file

@ -1,4 +1,4 @@
/* Copyright (c) 2017, The Linux Foundation. All rights reserved. /* Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are * modification, are permitted provided that the following conditions are
@ -40,8 +40,9 @@ namespace gnss {
namespace V1_0 { namespace V1_0 {
namespace implementation { namespace implementation {
void convertGnssLocation(Location& in, GnssLocation& out); void convertGnssLocation(Location& in, V1_0::GnssLocation& out);
void convertGnssConstellationType(GnssSvType& in, GnssConstellationType& out); void convertGnssLocation(const V1_0::GnssLocation& in, Location& out);
void convertGnssConstellationType(GnssSvType& in, V1_0::GnssConstellationType& out);
void convertGnssEphemerisType(GnssEphemerisType& in, GnssDebug::SatelliteEphemerisType& out); void convertGnssEphemerisType(GnssEphemerisType& in, GnssDebug::SatelliteEphemerisType& out);
void convertGnssEphemerisSource(GnssEphemerisSource& in, GnssDebug::SatelliteEphemerisSource& out); void convertGnssEphemerisSource(GnssEphemerisSource& in, GnssDebug::SatelliteEphemerisSource& out);
void convertGnssEphemerisHealth(GnssEphemerisHealth& in, GnssDebug::SatelliteEphemerisHealth& out); void convertGnssEphemerisHealth(GnssEphemerisHealth& in, GnssDebug::SatelliteEphemerisHealth& out);

38
gps/android/location_api/MeasurementAPIClient.cpp Normal file → Executable file
View file

@ -1,4 +1,4 @@
/* Copyright (c) 2017, The Linux Foundation. All rights reserved. /* Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are * modification, are permitted provided that the following conditions are
@ -42,10 +42,13 @@ namespace gnss {
namespace V1_0 { namespace V1_0 {
namespace implementation { namespace implementation {
using ::android::hardware::gnss::V1_0::IGnssMeasurement;
using ::android::hardware::gnss::V1_0::IGnssMeasurementCallback;
static void convertGnssData(GnssMeasurementsNotification& in, static void convertGnssData(GnssMeasurementsNotification& in,
IGnssMeasurementCallback::GnssData& out); V1_0::IGnssMeasurementCallback::GnssData& out);
static void convertGnssMeasurement(GnssMeasurementsData& in, static void convertGnssMeasurement(GnssMeasurementsData& in,
IGnssMeasurementCallback::GnssMeasurement& out); V1_0::IGnssMeasurementCallback::GnssMeasurement& out);
static void convertGnssClock(GnssMeasurementsClock& in, IGnssMeasurementCallback::GnssClock& out); static void convertGnssClock(GnssMeasurementsClock& in, IGnssMeasurementCallback::GnssClock& out);
MeasurementAPIClient::MeasurementAPIClient() : MeasurementAPIClient::MeasurementAPIClient() :
@ -62,7 +65,7 @@ MeasurementAPIClient::~MeasurementAPIClient()
// for GpsInterface // for GpsInterface
Return<IGnssMeasurement::GnssMeasurementStatus> Return<IGnssMeasurement::GnssMeasurementStatus>
MeasurementAPIClient::measurementSetCallback(const sp<IGnssMeasurementCallback>& callback) MeasurementAPIClient::measurementSetCallback(const sp<V1_0::IGnssMeasurementCallback>& callback)
{ {
LOC_LOGD("%s]: (%p)", __FUNCTION__, &callback); LOC_LOGD("%s]: (%p)", __FUNCTION__, &callback);
@ -70,6 +73,12 @@ MeasurementAPIClient::measurementSetCallback(const sp<IGnssMeasurementCallback>&
mGnssMeasurementCbIface = callback; mGnssMeasurementCbIface = callback;
mMutex.unlock(); mMutex.unlock();
return startTracking();
}
Return<IGnssMeasurement::GnssMeasurementStatus>
MeasurementAPIClient::startTracking()
{
LocationCallbacks locationCallbacks; LocationCallbacks locationCallbacks;
memset(&locationCallbacks, 0, sizeof(LocationCallbacks)); memset(&locationCallbacks, 0, sizeof(LocationCallbacks));
locationCallbacks.size = sizeof(LocationCallbacks); locationCallbacks.size = sizeof(LocationCallbacks);
@ -115,15 +124,18 @@ void MeasurementAPIClient::measurementClose() {
void MeasurementAPIClient::onGnssMeasurementsCb( void MeasurementAPIClient::onGnssMeasurementsCb(
GnssMeasurementsNotification gnssMeasurementsNotification) GnssMeasurementsNotification gnssMeasurementsNotification)
{ {
LOC_LOGD("%s]: (count: %zu active: %zu)", LOC_LOGD("%s]: (count: %zu active: %d)",
__FUNCTION__, gnssMeasurementsNotification.count, mTracking); __FUNCTION__, gnssMeasurementsNotification.count, mTracking);
if (mTracking) { if (mTracking) {
mMutex.lock(); mMutex.lock();
auto gnssMeasurementCbIface(mGnssMeasurementCbIface); sp<V1_0::IGnssMeasurementCallback> gnssMeasurementCbIface = nullptr;
if (mGnssMeasurementCbIface != nullptr) {
gnssMeasurementCbIface = mGnssMeasurementCbIface;
}
mMutex.unlock(); mMutex.unlock();
if (gnssMeasurementCbIface != nullptr) { if (gnssMeasurementCbIface != nullptr) {
IGnssMeasurementCallback::GnssData gnssData; V1_0::IGnssMeasurementCallback::GnssData gnssData;
convertGnssData(gnssMeasurementsNotification, gnssData); convertGnssData(gnssMeasurementsNotification, gnssData);
auto r = gnssMeasurementCbIface->GnssMeasurementCb(gnssData); auto r = gnssMeasurementCbIface->GnssMeasurementCb(gnssData);
if (!r.isOk()) { if (!r.isOk()) {
@ -135,7 +147,7 @@ void MeasurementAPIClient::onGnssMeasurementsCb(
} }
static void convertGnssMeasurement(GnssMeasurementsData& in, static void convertGnssMeasurement(GnssMeasurementsData& in,
IGnssMeasurementCallback::GnssMeasurement& out) V1_0::IGnssMeasurementCallback::GnssMeasurement& out)
{ {
memset(&out, 0, sizeof(IGnssMeasurementCallback::GnssMeasurement)); memset(&out, 0, sizeof(IGnssMeasurementCallback::GnssMeasurement));
if (in.flags & GNSS_MEASUREMENTS_DATA_SIGNAL_TO_NOISE_RATIO_BIT) if (in.flags & GNSS_MEASUREMENTS_DATA_SIGNAL_TO_NOISE_RATIO_BIT)
@ -242,13 +254,13 @@ static void convertGnssClock(GnssMeasurementsClock& in, IGnssMeasurementCallback
} }
static void convertGnssData(GnssMeasurementsNotification& in, static void convertGnssData(GnssMeasurementsNotification& in,
IGnssMeasurementCallback::GnssData& out) V1_0::IGnssMeasurementCallback::GnssData& out)
{ {
out.measurementCount = in.count; out.measurementCount = in.count;
if (out.measurementCount > static_cast<uint32_t>(GnssMax::SVS_COUNT)) { if (out.measurementCount > static_cast<uint32_t>(V1_0::GnssMax::SVS_COUNT)) {
LOC_LOGW("%s]: Too many measurement %zd. Clamps to %d.", LOC_LOGW("%s]: Too many measurement %u. Clamps to %d.",
__FUNCTION__, out.measurementCount, GnssMax::SVS_COUNT); __FUNCTION__, out.measurementCount, V1_0::GnssMax::SVS_COUNT);
out.measurementCount = static_cast<uint32_t>(GnssMax::SVS_COUNT); out.measurementCount = static_cast<uint32_t>(V1_0::GnssMax::SVS_COUNT);
} }
for (size_t i = 0; i < out.measurementCount; i++) { for (size_t i = 0; i < out.measurementCount; i++) {
convertGnssMeasurement(in.measurements[i], out.measurements[i]); convertGnssMeasurement(in.measurements[i], out.measurements[i]);

11
gps/android/location_api/MeasurementAPIClient.h Normal file → Executable file
View file

@ -1,4 +1,4 @@
/* Copyright (c) 2017, The Linux Foundation. All rights reserved. /* Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are * modification, are permitted provided that the following conditions are
@ -42,7 +42,6 @@ namespace gnss {
namespace V1_0 { namespace V1_0 {
namespace implementation { namespace implementation {
using ::android::hardware::gnss::V1_0::IGnssMeasurement;
using ::android::sp; using ::android::sp;
class MeasurementAPIClient : public LocationAPIClientBase class MeasurementAPIClient : public LocationAPIClientBase
@ -54,16 +53,18 @@ public:
MeasurementAPIClient& operator=(const MeasurementAPIClient&) = delete; MeasurementAPIClient& operator=(const MeasurementAPIClient&) = delete;
// for GpsMeasurementInterface // for GpsMeasurementInterface
Return<IGnssMeasurement::GnssMeasurementStatus> measurementSetCallback( Return<V1_0::IGnssMeasurement::GnssMeasurementStatus> measurementSetCallback(
const sp<IGnssMeasurementCallback>& callback); const sp<V1_0::IGnssMeasurementCallback>& callback);
void measurementClose(); void measurementClose();
Return<IGnssMeasurement::GnssMeasurementStatus> startTracking();
// callbacks we are interested in // callbacks we are interested in
void onGnssMeasurementsCb(GnssMeasurementsNotification gnssMeasurementsNotification) final; void onGnssMeasurementsCb(GnssMeasurementsNotification gnssMeasurementsNotification) final;
private: private:
sp<IGnssMeasurementCallback> mGnssMeasurementCbIface;
std::mutex mMutex; std::mutex mMutex;
sp<V1_0::IGnssMeasurementCallback> mGnssMeasurementCbIface;
bool mTracking; bool mTracking;
}; };

6
gps/android/service.cpp Normal file → Executable file
View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2017, The Linux Foundation. All rights reserved. * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
* Not a Contribution * Not a Contribution
*/ */
/* /*
@ -18,9 +18,9 @@
* limitations under the License. * limitations under the License.
*/ */
#define LOG_TAG "android.hardware.gnss@1.0-service-qti" #define LOG_TAG "android.hardware.gnss@1.1-service-qti"
#include <android/hardware/gnss/1.0/IGnss.h> #include <android/hardware/gnss/1.1/IGnss.h>
#include <hidl/LegacySupport.h> #include <hidl/LegacySupport.h>
using android::hardware::gnss::V1_0::IGnss; using android::hardware::gnss::V1_0::IGnss;

View file

@ -0,0 +1,17 @@
GNSS_CFLAGS := \
-Werror \
-Wno-error=unused-parameter \
-Wno-error=format \
-Wno-error=macro-redefined \
-Wno-error=reorder \
-Wno-error=missing-braces \
-Wno-error=self-assign \
-Wno-error=enum-conversion \
-Wno-error=logical-op-parentheses \
-Wno-error=null-arithmetic \
-Wno-error=null-conversion \
-Wno-error=parentheses-equality \
-Wno-error=undefined-bool-conversion \
-Wno-error=tautological-compare \
-Wno-error=switch \
-Wno-error=date-time

10
gps/core/Android.mk Normal file → Executable file
View file

@ -3,8 +3,7 @@ LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS) include $(CLEAR_VARS)
LOCAL_MODULE := libloc_core LOCAL_MODULE := libloc_core
LOCAL_MODULE_PATH_32 := $(TARGET_OUT_VENDOR)/lib LOCAL_VENDOR_MODULE := true
LOCAL_MODULE_PATH_64 := $(TARGET_OUT_VENDOR)/lib64
LOCAL_MODULE_TAGS := optional LOCAL_MODULE_TAGS := optional
ifeq ($(BOARD_VENDOR_QCOM_LOC_PDK_FEATURE_SET),true) ifeq ($(BOARD_VENDOR_QCOM_LOC_PDK_FEATURE_SET),true)
@ -17,8 +16,7 @@ LOCAL_SHARED_LIBRARIES := \
libcutils \ libcutils \
libgps.utils \ libgps.utils \
libdl \ libdl \
liblog \ liblog
libloc_pla
LOCAL_SRC_FILES += \ LOCAL_SRC_FILES += \
LocApiBase.cpp \ LocApiBase.cpp \
@ -27,9 +25,6 @@ LOCAL_SRC_FILES += \
LocDualContext.cpp \ LocDualContext.cpp \
loc_core_log.cpp \ loc_core_log.cpp \
data-items/DataItemsFactoryProxy.cpp \ data-items/DataItemsFactoryProxy.cpp \
data-items/common/ClientIndex.cpp \
data-items/common/DataItemIndex.cpp \
data-items/common/IndexFactory.cpp \
SystemStatusOsObserver.cpp \ SystemStatusOsObserver.cpp \
SystemStatus.cpp SystemStatus.cpp
@ -43,6 +38,7 @@ LOCAL_C_INCLUDES:= \
$(LOCAL_PATH)/observer \ $(LOCAL_PATH)/observer \
LOCAL_HEADER_LIBRARIES := \ LOCAL_HEADER_LIBRARIES := \
libutils_headers \
libgps.utils_headers \ libgps.utils_headers \
libloc_pla_headers \ libloc_pla_headers \
liblocation_api_headers liblocation_api_headers

6
gps/core/ContextBase.cpp Normal file → Executable file
View file

@ -35,7 +35,7 @@
#include <ContextBase.h> #include <ContextBase.h>
#include <msg_q.h> #include <msg_q.h>
#include <loc_target.h> #include <loc_target.h>
#include <platform_lib_includes.h> #include <loc_pla.h>
#include <loc_log.h> #include <loc_log.h>
namespace loc_core { namespace loc_core {
@ -65,6 +65,8 @@ const loc_param_s_type ContextBase::mGps_conf_table[] =
{"USE_EMERGENCY_PDN_FOR_EMERGENCY_SUPL", &mGps_conf.USE_EMERGENCY_PDN_FOR_EMERGENCY_SUPL, NULL, 'n'}, {"USE_EMERGENCY_PDN_FOR_EMERGENCY_SUPL", &mGps_conf.USE_EMERGENCY_PDN_FOR_EMERGENCY_SUPL, NULL, 'n'},
{"AGPS_CONFIG_INJECT", &mGps_conf.AGPS_CONFIG_INJECT, NULL, 'n'}, {"AGPS_CONFIG_INJECT", &mGps_conf.AGPS_CONFIG_INJECT, NULL, 'n'},
{"EXTERNAL_DR_ENABLED", &mGps_conf.EXTERNAL_DR_ENABLED, NULL, 'n'}, {"EXTERNAL_DR_ENABLED", &mGps_conf.EXTERNAL_DR_ENABLED, NULL, 'n'},
{"SUPL_HOST", &mGps_conf.SUPL_HOST, NULL, 's'},
{"SUPL_PORT", &mGps_conf.SUPL_PORT, NULL, 'n'},
}; };
const loc_param_s_type ContextBase::mSap_conf_table[] = const loc_param_s_type ContextBase::mSap_conf_table[] =
@ -98,6 +100,8 @@ void ContextBase::readConfig()
mGps_conf.SUPL_VER = 0x10000; mGps_conf.SUPL_VER = 0x10000;
mGps_conf.SUPL_MODE = 0x1; mGps_conf.SUPL_MODE = 0x1;
mGps_conf.SUPL_ES = 0; mGps_conf.SUPL_ES = 0;
mGps_conf.SUPL_HOST[0] = 0;
mGps_conf.SUPL_PORT = 0;
mGps_conf.CAPABILITIES = 0x7; mGps_conf.CAPABILITIES = 0x7;
/* LTE Positioning Profile configuration is disable by default*/ /* LTE Positioning Profile configuration is disable by default*/
mGps_conf.LPP_PROFILE = 0; mGps_conf.LPP_PROFILE = 0;

5
gps/core/ContextBase.h Normal file → Executable file
View file

@ -36,7 +36,8 @@
#include <LBSProxyBase.h> #include <LBSProxyBase.h>
#include <loc_cfg.h> #include <loc_cfg.h>
#define MAX_XTRA_SERVER_URL_LENGTH 256 #define MAX_XTRA_SERVER_URL_LENGTH (256)
#define MAX_SUPL_SERVER_URL_LENGTH (256)
/* GPS.conf support */ /* GPS.conf support */
/* NOTE: the implementaiton of the parser casts number /* NOTE: the implementaiton of the parser casts number
@ -64,6 +65,8 @@ typedef struct loc_gps_cfg_s
uint32_t LPPE_CP_TECHNOLOGY; uint32_t LPPE_CP_TECHNOLOGY;
uint32_t LPPE_UP_TECHNOLOGY; uint32_t LPPE_UP_TECHNOLOGY;
uint32_t EXTERNAL_DR_ENABLED; uint32_t EXTERNAL_DR_ENABLED;
char SUPL_HOST[MAX_SUPL_SERVER_URL_LENGTH];
uint32_t SUPL_PORT;
} loc_gps_cfg_s_type; } loc_gps_cfg_s_type;
/* NOTE: the implementaiton of the parser casts number /* NOTE: the implementaiton of the parser casts number

0
gps/core/LBSProxyBase.h Normal file → Executable file
View file

6
gps/core/LocAdapterBase.cpp Normal file → Executable file
View file

@ -32,7 +32,7 @@
#include <dlfcn.h> #include <dlfcn.h>
#include <LocAdapterBase.h> #include <LocAdapterBase.h>
#include <loc_target.h> #include <loc_target.h>
#include <platform_lib_log_util.h> #include <log_util.h>
#include <LocAdapterProxyBase.h> #include <LocAdapterProxyBase.h>
namespace loc_core { namespace loc_core {
@ -161,4 +161,8 @@ bool LocAdapterBase::
reportWwanZppFix(LocGpsLocation &/*zppLoc*/) reportWwanZppFix(LocGpsLocation &/*zppLoc*/)
DEFAULT_IMPL(false) DEFAULT_IMPL(false)
bool LocAdapterBase::
reportOdcpiRequestEvent(OdcpiRequestInfo& /*request*/)
DEFAULT_IMPL(false)
} // namespace loc_core } // namespace loc_core

1
gps/core/LocAdapterBase.h Normal file → Executable file
View file

@ -153,6 +153,7 @@ public:
virtual void reportGnssMeasurementDataEvent(const GnssMeasurementsNotification& measurements, virtual void reportGnssMeasurementDataEvent(const GnssMeasurementsNotification& measurements,
int msInWeek); int msInWeek);
virtual bool reportWwanZppFix(LocGpsLocation &zppLoc); virtual bool reportWwanZppFix(LocGpsLocation &zppLoc);
virtual bool reportOdcpiRequestEvent(OdcpiRequestInfo& request);
}; };
} // namespace loc_core } // namespace loc_core

0
gps/core/LocAdapterProxyBase.h Normal file → Executable file
View file

30
gps/core/LocApiBase.cpp Normal file → Executable file
View file

@ -33,7 +33,7 @@
#include <inttypes.h> #include <inttypes.h>
#include <LocApiBase.h> #include <LocApiBase.h>
#include <LocAdapterBase.h> #include <LocAdapterBase.h>
#include <platform_lib_log_util.h> #include <log_util.h>
#include <LocDualContext.h> #include <LocDualContext.h>
namespace loc_core { namespace loc_core {
@ -107,19 +107,16 @@ struct LocSsrMsg : public LocMsg {
struct LocOpenMsg : public LocMsg { struct LocOpenMsg : public LocMsg {
LocApiBase* mLocApi; LocApiBase* mLocApi;
LOC_API_ADAPTER_EVENT_MASK_T mMask; inline LocOpenMsg(LocApiBase* locApi) :
inline LocOpenMsg(LocApiBase* locApi, LocMsg(), mLocApi(locApi)
LOC_API_ADAPTER_EVENT_MASK_T mask) :
LocMsg(), mLocApi(locApi), mMask(mask)
{ {
locallog(); locallog();
} }
inline virtual void proc() const { inline virtual void proc() const {
mLocApi->open(mMask); mLocApi->open(mLocApi->getEvtMask());
} }
inline void locallog() const { inline void locallog() const {
LOC_LOGV("%s:%d]: LocOpen Mask: %x\n", LOC_LOGv("LocOpen Mask: %" PRIx64 "\n", mLocApi->getEvtMask());
__func__, __LINE__, mMask);
} }
inline virtual void log() const { inline virtual void log() const {
locallog(); locallog();
@ -163,8 +160,7 @@ void LocApiBase::addAdapter(LocAdapterBase* adapter)
for (int i = 0; i < MAX_ADAPTERS && mLocAdapters[i] != adapter; i++) { for (int i = 0; i < MAX_ADAPTERS && mLocAdapters[i] != adapter; i++) {
if (mLocAdapters[i] == NULL) { if (mLocAdapters[i] == NULL) {
mLocAdapters[i] = adapter; mLocAdapters[i] = adapter;
mMsgTask->sendMsg(new LocOpenMsg(this, mMsgTask->sendMsg(new LocOpenMsg(this));
(adapter->getEvtMask())));
break; break;
} }
} }
@ -200,7 +196,7 @@ void LocApiBase::removeAdapter(LocAdapterBase* adapter)
close(); close();
} else { } else {
// else we need to remove the bit // else we need to remove the bit
mMsgTask->sendMsg(new LocOpenMsg(this, getEvtMask())); mMsgTask->sendMsg(new LocOpenMsg(this));
} }
} }
} }
@ -208,7 +204,7 @@ void LocApiBase::removeAdapter(LocAdapterBase* adapter)
void LocApiBase::updateEvtMask() void LocApiBase::updateEvtMask()
{ {
mMsgTask->sendMsg(new LocOpenMsg(this, getEvtMask())); open(getEvtMask());
} }
void LocApiBase::handleEngineUpEvent() void LocApiBase::handleEngineUpEvent()
@ -264,6 +260,12 @@ void LocApiBase::reportWwanZppFix(LocGpsLocation &zppLoc)
TO_1ST_HANDLING_LOCADAPTERS(mLocAdapters[i]->reportWwanZppFix(zppLoc)); TO_1ST_HANDLING_LOCADAPTERS(mLocAdapters[i]->reportWwanZppFix(zppLoc));
} }
void LocApiBase::reportOdcpiRequest(OdcpiRequestInfo& request)
{
// loop through adapters, and deliver to the first handling adapter.
TO_1ST_HANDLING_LOCADAPTERS(mLocAdapters[i]->reportOdcpiRequestEvent(request));
}
void LocApiBase::reportSv(GnssSvNotification& svNotify) void LocApiBase::reportSv(GnssSvNotification& svNotify)
{ {
const char* constellationString[] = { "Unknown", "GPS", "SBAS", "GLONASS", const char* constellationString[] = { "Unknown", "GPS", "SBAS", "GLONASS",
@ -440,6 +442,10 @@ enum loc_api_adapter_err LocApiBase::
injectPosition(double /*latitude*/, double /*longitude*/, float /*accuracy*/) injectPosition(double /*latitude*/, double /*longitude*/, float /*accuracy*/)
DEFAULT_IMPL(LOC_API_ADAPTER_ERR_SUCCESS) DEFAULT_IMPL(LOC_API_ADAPTER_ERR_SUCCESS)
enum loc_api_adapter_err LocApiBase::
injectPosition(const Location& /*location*/)
DEFAULT_IMPL(LOC_API_ADAPTER_ERR_SUCCESS)
enum loc_api_adapter_err LocApiBase:: enum loc_api_adapter_err LocApiBase::
setTime(LocGpsUtcTime /*time*/, int64_t /*timeReference*/, int /*uncertainty*/) setTime(LocGpsUtcTime /*time*/, int64_t /*timeReference*/, int /*uncertainty*/)
DEFAULT_IMPL(LOC_API_ADAPTER_ERR_SUCCESS) DEFAULT_IMPL(LOC_API_ADAPTER_ERR_SUCCESS)

5
gps/core/LocApiBase.h Normal file → Executable file
View file

@ -34,7 +34,7 @@
#include <gps_extended.h> #include <gps_extended.h>
#include <LocationAPI.h> #include <LocationAPI.h>
#include <MsgTask.h> #include <MsgTask.h>
#include <platform_lib_log_util.h> #include <log_util.h>
namespace loc_core { namespace loc_core {
class ContextBase; class ContextBase;
@ -134,6 +134,7 @@ public:
void reportGnssMeasurementData(GnssMeasurementsNotification& measurements, int msInWeek); void reportGnssMeasurementData(GnssMeasurementsNotification& measurements, int msInWeek);
void saveSupportedFeatureList(uint8_t *featureList); void saveSupportedFeatureList(uint8_t *featureList);
void reportWwanZppFix(LocGpsLocation &zppLoc); void reportWwanZppFix(LocGpsLocation &zppLoc);
void reportOdcpiRequest(OdcpiRequestInfo& request);
// downward calls // downward calls
// All below functions are to be defined by adapter specific modules: // All below functions are to be defined by adapter specific modules:
@ -153,6 +154,8 @@ public:
setAPN(char* apn, int len); setAPN(char* apn, int len);
virtual enum loc_api_adapter_err virtual enum loc_api_adapter_err
injectPosition(double latitude, double longitude, float accuracy); injectPosition(double latitude, double longitude, float accuracy);
virtual enum loc_api_adapter_err
injectPosition(const Location& location);
virtual enum loc_api_adapter_err virtual enum loc_api_adapter_err
setTime(LocGpsUtcTime time, int64_t timeReference, int uncertainty); setTime(LocGpsUtcTime time, int64_t timeReference, int uncertainty);
virtual enum loc_api_adapter_err virtual enum loc_api_adapter_err

2
gps/core/LocDualContext.cpp Normal file → Executable file
View file

@ -33,7 +33,7 @@
#include <unistd.h> #include <unistd.h>
#include <LocDualContext.h> #include <LocDualContext.h>
#include <msg_q.h> #include <msg_q.h>
#include <platform_lib_log_util.h> #include <log_util.h>
#include <loc_log.h> #include <loc_log.h>
namespace loc_core { namespace loc_core {

0
gps/core/LocDualContext.h Normal file → Executable file
View file

219
gps/core/SystemStatus.cpp Normal file → Executable file
View file

@ -34,8 +34,8 @@
#include <string.h> #include <string.h>
#include <sys/time.h> #include <sys/time.h>
#include <pthread.h> #include <pthread.h>
#include <platform_lib_log_util.h> #include <loc_pla.h>
#include <MsgTask.h> #include <log_util.h>
#include <loc_nmea.h> #include <loc_nmea.h>
#include <DataItemsFactoryProxy.h> #include <DataItemsFactoryProxy.h>
#include <SystemStatus.h> #include <SystemStatus.h>
@ -120,6 +120,12 @@ public:
double mAgcGal; // x16 double mAgcGal; // x16
int32_t mLeapSeconds;// x17 int32_t mLeapSeconds;// x17
int32_t mLeapSecUnc; // x18 int32_t mLeapSecUnc; // x18
uint32_t mGloBpAmpI; // x19
uint32_t mGloBpAmpQ; // x1A
uint32_t mBdsBpAmpI; // x1B
uint32_t mBdsBpAmpQ; // x1C
uint32_t mGalBpAmpI; // x1D
uint32_t mGalBpAmpQ; // x1E
}; };
// parser // parser
@ -154,6 +160,12 @@ private:
eMax0 = eAgcGal, eMax0 = eAgcGal,
eLeapSeconds = 23, eLeapSeconds = 23,
eLeapSecUnc = 24, eLeapSecUnc = 24,
eGloBpAmpI = 25,
eGloBpAmpQ = 26,
eBdsBpAmpI = 27,
eBdsBpAmpQ = 28,
eGalBpAmpI = 29,
eGalBpAmpQ = 30,
eMax eMax
}; };
SystemStatusPQWM1 mM1; SystemStatusPQWM1 mM1;
@ -183,6 +195,12 @@ public:
inline uint32_t getRecErrorRecovery() { return mM1.mRecErrorRecovery; } inline uint32_t getRecErrorRecovery() { return mM1.mRecErrorRecovery; }
inline int32_t getLeapSeconds(){ return mM1.mLeapSeconds; } inline int32_t getLeapSeconds(){ return mM1.mLeapSeconds; }
inline int32_t getLeapSecUnc() { return mM1.mLeapSecUnc; } inline int32_t getLeapSecUnc() { return mM1.mLeapSecUnc; }
inline uint32_t getGloBpAmpI() { return mM1.mGloBpAmpI; }
inline uint32_t getGloBpAmpQ() { return mM1.mGloBpAmpQ; }
inline uint32_t getBdsBpAmpI() { return mM1.mBdsBpAmpI; }
inline uint32_t getBdsBpAmpQ() { return mM1.mBdsBpAmpQ; }
inline uint32_t getGalBpAmpI() { return mM1.mGalBpAmpI; }
inline uint32_t getGalBpAmpQ() { return mM1.mGalBpAmpQ; }
SystemStatusPQWM1parser(const char *str_in, uint32_t len_in) SystemStatusPQWM1parser(const char *str_in, uint32_t len_in)
: SystemStatusNmeaBase(str_in, len_in) : SystemStatusNmeaBase(str_in, len_in)
@ -219,6 +237,14 @@ public:
mM1.mLeapSeconds = atoi(mField[eLeapSeconds].c_str()); mM1.mLeapSeconds = atoi(mField[eLeapSeconds].c_str());
mM1.mLeapSecUnc = atoi(mField[eLeapSecUnc].c_str()); mM1.mLeapSecUnc = atoi(mField[eLeapSecUnc].c_str());
} }
if (mField.size() > eGalBpAmpQ) {
mM1.mGloBpAmpI = atoi(mField[eGloBpAmpI].c_str());
mM1.mGloBpAmpQ = atoi(mField[eGloBpAmpQ].c_str());
mM1.mBdsBpAmpI = atoi(mField[eBdsBpAmpI].c_str());
mM1.mBdsBpAmpQ = atoi(mField[eBdsBpAmpQ].c_str());
mM1.mGalBpAmpI = atoi(mField[eGalBpAmpI].c_str());
mM1.mGalBpAmpQ = atoi(mField[eGalBpAmpQ].c_str());
}
} }
inline SystemStatusPQWM1& get() { return mM1;} //getparser inline SystemStatusPQWM1& get() { return mM1;} //getparser
@ -765,7 +791,13 @@ SystemStatusRfAndParams::SystemStatusRfAndParams(const SystemStatusPQWM1& nmea)
mAgcGps(nmea.mAgcGps), mAgcGps(nmea.mAgcGps),
mAgcGlo(nmea.mAgcGlo), mAgcGlo(nmea.mAgcGlo),
mAgcBds(nmea.mAgcBds), mAgcBds(nmea.mAgcBds),
mAgcGal(nmea.mAgcGal) mAgcGal(nmea.mAgcGal),
mGloBpAmpI(nmea.mGloBpAmpI),
mGloBpAmpQ(nmea.mGloBpAmpQ),
mBdsBpAmpI(nmea.mBdsBpAmpI),
mBdsBpAmpQ(nmea.mBdsBpAmpQ),
mGalBpAmpI(nmea.mGalBpAmpI),
mGalBpAmpQ(nmea.mGalBpAmpQ)
{ {
} }
@ -783,7 +815,13 @@ bool SystemStatusRfAndParams::equals(const SystemStatusRfAndParams& peer)
(mAgcGps != peer.mAgcGps) || (mAgcGps != peer.mAgcGps) ||
(mAgcGlo != peer.mAgcGlo) || (mAgcGlo != peer.mAgcGlo) ||
(mAgcBds != peer.mAgcBds) || (mAgcBds != peer.mAgcBds) ||
(mAgcGal != peer.mAgcGal)) { (mAgcGal != peer.mAgcGal) ||
(mGloBpAmpI != peer.mGloBpAmpI) ||
(mGloBpAmpQ != peer.mGloBpAmpQ) ||
(mBdsBpAmpI != peer.mBdsBpAmpI) ||
(mBdsBpAmpQ != peer.mBdsBpAmpQ) ||
(mGalBpAmpI != peer.mGalBpAmpI) ||
(mGalBpAmpQ != peer.mGalBpAmpQ)) {
return false; return false;
} }
return true; return true;
@ -1217,8 +1255,7 @@ IOsObserver* SystemStatus::getOsObserver()
} }
SystemStatus::SystemStatus(const MsgTask* msgTask) : SystemStatus::SystemStatus(const MsgTask* msgTask) :
mSysStatusObsvr(this, msgTask), mSysStatusObsvr(this, msgTask)
mConnected(false)
{ {
int result = 0; int result = 0;
ENTRY_LOG (); ENTRY_LOG ();
@ -1268,17 +1305,10 @@ SystemStatus::SystemStatus(const MsgTask* msgTask) :
/****************************************************************************** /******************************************************************************
SystemStatus - storing dataitems SystemStatus - storing dataitems
******************************************************************************/ ******************************************************************************/
template <typename TYPE_SYSTEMSTATUS_ITEM, typename TYPE_REPORT, typename TYPE_ITEMBASE>
bool SystemStatus::setItemBaseinReport(TYPE_REPORT& report, const TYPE_ITEMBASE& s)
{
TYPE_SYSTEMSTATUS_ITEM sout(s);
return setIteminReport(report, sout);
}
template <typename TYPE_REPORT, typename TYPE_ITEM> template <typename TYPE_REPORT, typename TYPE_ITEM>
bool SystemStatus::setIteminReport(TYPE_REPORT& report, const TYPE_ITEM& s) bool SystemStatus::setIteminReport(TYPE_REPORT& report, TYPE_ITEM&& s)
{ {
if (!report.empty() && report.back().equals(s)) { if (!report.empty() && report.back().equals(static_cast<TYPE_ITEM&>(s.collate(report.back())))) {
// there is no change - just update reported timestamp // there is no change - just update reported timestamp
report.back().mUtcReported = s.mUtcReported; report.back().mUtcReported = s.mUtcReported;
return false; return false;
@ -1317,11 +1347,10 @@ void SystemStatus::getIteminReport(TYPE_REPORT& reportout, const TYPE_ITEM& c) c
@param[In] data pointer to the NMEA string @param[In] data pointer to the NMEA string
@param[In] len length of the NMEA string @param[In] len length of the NMEA string
@return true when successfully done @return true when the NMEA is consumed by the method.
******************************************************************************/ ******************************************************************************/
bool SystemStatus::setNmeaString(const char *data, uint32_t len) bool SystemStatus::setNmeaString(const char *data, uint32_t len)
{ {
bool ret = false;
if (!loc_nmea_is_debug(data, len)) { if (!loc_nmea_is_debug(data, len)) {
return false; return false;
} }
@ -1332,43 +1361,43 @@ bool SystemStatus::setNmeaString(const char *data, uint32_t len)
pthread_mutex_lock(&mMutexSystemStatus); pthread_mutex_lock(&mMutexSystemStatus);
// parse the received nmea strings here // parse the received nmea strings here
if (0 == strncmp(data, "$PQWM1", SystemStatusNmeaBase::NMEA_MINSIZE)) { if (0 == strncmp(data, "$PQWM1", SystemStatusNmeaBase::NMEA_MINSIZE)) {
SystemStatusPQWM1 s = SystemStatusPQWM1parser(buf, len).get(); SystemStatusPQWM1 s = SystemStatusPQWM1parser(buf, len).get();
ret |= setIteminReport(mCache.mTimeAndClock, SystemStatusTimeAndClock(s)); setIteminReport(mCache.mTimeAndClock, SystemStatusTimeAndClock(s));
ret |= setIteminReport(mCache.mXoState, SystemStatusXoState(s)); setIteminReport(mCache.mXoState, SystemStatusXoState(s));
ret |= setIteminReport(mCache.mRfAndParams, SystemStatusRfAndParams(s)); setIteminReport(mCache.mRfAndParams, SystemStatusRfAndParams(s));
ret |= setIteminReport(mCache.mErrRecovery, SystemStatusErrRecovery(s)); setIteminReport(mCache.mErrRecovery, SystemStatusErrRecovery(s));
} }
else if (0 == strncmp(data, "$PQWP1", SystemStatusNmeaBase::NMEA_MINSIZE)) { else if (0 == strncmp(data, "$PQWP1", SystemStatusNmeaBase::NMEA_MINSIZE)) {
ret = setIteminReport(mCache.mInjectedPosition, setIteminReport(mCache.mInjectedPosition,
SystemStatusInjectedPosition(SystemStatusPQWP1parser(buf, len).get())); SystemStatusInjectedPosition(SystemStatusPQWP1parser(buf, len).get()));
} }
else if (0 == strncmp(data, "$PQWP2", SystemStatusNmeaBase::NMEA_MINSIZE)) { else if (0 == strncmp(data, "$PQWP2", SystemStatusNmeaBase::NMEA_MINSIZE)) {
ret = setIteminReport(mCache.mBestPosition, setIteminReport(mCache.mBestPosition,
SystemStatusBestPosition(SystemStatusPQWP2parser(buf, len).get())); SystemStatusBestPosition(SystemStatusPQWP2parser(buf, len).get()));
} }
else if (0 == strncmp(data, "$PQWP3", SystemStatusNmeaBase::NMEA_MINSIZE)) { else if (0 == strncmp(data, "$PQWP3", SystemStatusNmeaBase::NMEA_MINSIZE)) {
ret = setIteminReport(mCache.mXtra, setIteminReport(mCache.mXtra,
SystemStatusXtra(SystemStatusPQWP3parser(buf, len).get())); SystemStatusXtra(SystemStatusPQWP3parser(buf, len).get()));
} }
else if (0 == strncmp(data, "$PQWP4", SystemStatusNmeaBase::NMEA_MINSIZE)) { else if (0 == strncmp(data, "$PQWP4", SystemStatusNmeaBase::NMEA_MINSIZE)) {
ret = setIteminReport(mCache.mEphemeris, setIteminReport(mCache.mEphemeris,
SystemStatusEphemeris(SystemStatusPQWP4parser(buf, len).get())); SystemStatusEphemeris(SystemStatusPQWP4parser(buf, len).get()));
} }
else if (0 == strncmp(data, "$PQWP5", SystemStatusNmeaBase::NMEA_MINSIZE)) { else if (0 == strncmp(data, "$PQWP5", SystemStatusNmeaBase::NMEA_MINSIZE)) {
ret = setIteminReport(mCache.mSvHealth, setIteminReport(mCache.mSvHealth,
SystemStatusSvHealth(SystemStatusPQWP5parser(buf, len).get())); SystemStatusSvHealth(SystemStatusPQWP5parser(buf, len).get()));
} }
else if (0 == strncmp(data, "$PQWP6", SystemStatusNmeaBase::NMEA_MINSIZE)) { else if (0 == strncmp(data, "$PQWP6", SystemStatusNmeaBase::NMEA_MINSIZE)) {
ret = setIteminReport(mCache.mPdr, setIteminReport(mCache.mPdr,
SystemStatusPdr(SystemStatusPQWP6parser(buf, len).get())); SystemStatusPdr(SystemStatusPQWP6parser(buf, len).get()));
} }
else if (0 == strncmp(data, "$PQWP7", SystemStatusNmeaBase::NMEA_MINSIZE)) { else if (0 == strncmp(data, "$PQWP7", SystemStatusNmeaBase::NMEA_MINSIZE)) {
ret = setIteminReport(mCache.mNavData, setIteminReport(mCache.mNavData,
SystemStatusNavData(SystemStatusPQWP7parser(buf, len).get())); SystemStatusNavData(SystemStatusPQWP7parser(buf, len).get()));
} }
else if (0 == strncmp(data, "$PQWS1", SystemStatusNmeaBase::NMEA_MINSIZE)) { else if (0 == strncmp(data, "$PQWS1", SystemStatusNmeaBase::NMEA_MINSIZE)) {
ret = setIteminReport(mCache.mPositionFailure, setIteminReport(mCache.mPositionFailure,
SystemStatusPositionFailure(SystemStatusPQWS1parser(buf, len).get())); SystemStatusPositionFailure(SystemStatusPQWS1parser(buf, len).get()));
} }
else { else {
@ -1376,7 +1405,7 @@ bool SystemStatus::setNmeaString(const char *data, uint32_t len)
} }
pthread_mutex_unlock(&mMutexSystemStatus); pthread_mutex_unlock(&mMutexSystemStatus);
return ret; return true;
} }
/****************************************************************************** /******************************************************************************
@ -1417,94 +1446,92 @@ bool SystemStatus::eventDataItemNotify(IDataItemCore* dataitem)
switch(dataitem->getId()) switch(dataitem->getId())
{ {
case AIRPLANEMODE_DATA_ITEM_ID: case AIRPLANEMODE_DATA_ITEM_ID:
ret = setItemBaseinReport<SystemStatusAirplaneMode>(mCache.mAirplaneMode, ret = setIteminReport(mCache.mAirplaneMode,
*(static_cast<AirplaneModeDataItemBase*>(dataitem))); SystemStatusAirplaneMode(*(static_cast<AirplaneModeDataItemBase*>(dataitem))));
break; break;
case ENH_DATA_ITEM_ID: case ENH_DATA_ITEM_ID:
ret = setItemBaseinReport<SystemStatusENH>(mCache.mENH, ret = setIteminReport(mCache.mENH,
*(static_cast<ENHDataItemBase*>(dataitem))); SystemStatusENH(*(static_cast<ENHDataItemBase*>(dataitem))));
break; break;
case GPSSTATE_DATA_ITEM_ID: case GPSSTATE_DATA_ITEM_ID:
ret = setItemBaseinReport<SystemStatusGpsState>(mCache.mGPSState, ret = setIteminReport(mCache.mGPSState,
*(static_cast<GPSStateDataItemBase*>(dataitem))); SystemStatusGpsState(*(static_cast<GPSStateDataItemBase*>(dataitem))));
break; break;
case NLPSTATUS_DATA_ITEM_ID: case NLPSTATUS_DATA_ITEM_ID:
ret = setItemBaseinReport<SystemStatusNLPStatus>(mCache.mNLPStatus, ret = setIteminReport(mCache.mNLPStatus,
*(static_cast<NLPStatusDataItemBase*>(dataitem))); SystemStatusNLPStatus(*(static_cast<NLPStatusDataItemBase*>(dataitem))));
break; break;
case WIFIHARDWARESTATE_DATA_ITEM_ID: case WIFIHARDWARESTATE_DATA_ITEM_ID:
ret = setItemBaseinReport<SystemStatusWifiHardwareState>(mCache.mWifiHardwareState, ret = setIteminReport(mCache.mWifiHardwareState,
*(static_cast<WifiHardwareStateDataItemBase*>(dataitem))); SystemStatusWifiHardwareState(*(static_cast<WifiHardwareStateDataItemBase*>(dataitem))));
break; break;
case NETWORKINFO_DATA_ITEM_ID: case NETWORKINFO_DATA_ITEM_ID:
ret = setItemBaseinReport<SystemStatusNetworkInfo>(mCache.mNetworkInfo, ret = setIteminReport(mCache.mNetworkInfo,
*(static_cast<NetworkInfoDataItemBase*>(dataitem))); SystemStatusNetworkInfo(*(static_cast<NetworkInfoDataItemBase*>(dataitem))));
break; break;
case RILSERVICEINFO_DATA_ITEM_ID: case RILSERVICEINFO_DATA_ITEM_ID:
ret = setItemBaseinReport<SystemStatusServiceInfo>(mCache.mRilServiceInfo, ret = setIteminReport(mCache.mRilServiceInfo,
*(static_cast<RilServiceInfoDataItemBase*>(dataitem))); SystemStatusServiceInfo(*(static_cast<RilServiceInfoDataItemBase*>(dataitem))));
break; break;
case RILCELLINFO_DATA_ITEM_ID: case RILCELLINFO_DATA_ITEM_ID:
ret = setItemBaseinReport<SystemStatusRilCellInfo>(mCache.mRilCellInfo, ret = setIteminReport(mCache.mRilCellInfo,
*(static_cast<RilCellInfoDataItemBase*>(dataitem))); SystemStatusRilCellInfo(*(static_cast<RilCellInfoDataItemBase*>(dataitem))));
break; break;
case SERVICESTATUS_DATA_ITEM_ID: case SERVICESTATUS_DATA_ITEM_ID:
ret = setItemBaseinReport<SystemStatusServiceStatus>(mCache.mServiceStatus, ret = setIteminReport(mCache.mServiceStatus,
*(static_cast<ServiceStatusDataItemBase*>(dataitem))); SystemStatusServiceStatus(*(static_cast<ServiceStatusDataItemBase*>(dataitem))));
break; break;
case MODEL_DATA_ITEM_ID: case MODEL_DATA_ITEM_ID:
ret = setItemBaseinReport<SystemStatusModel>(mCache.mModel, ret = setIteminReport(mCache.mModel,
*(static_cast<ModelDataItemBase*>(dataitem))); SystemStatusModel(*(static_cast<ModelDataItemBase*>(dataitem))));
break; break;
case MANUFACTURER_DATA_ITEM_ID: case MANUFACTURER_DATA_ITEM_ID:
ret = setItemBaseinReport<SystemStatusManufacturer>(mCache.mManufacturer, ret = setIteminReport(mCache.mManufacturer,
*(static_cast<ManufacturerDataItemBase*>(dataitem))); SystemStatusManufacturer(*(static_cast<ManufacturerDataItemBase*>(dataitem))));
break; break;
case ASSISTED_GPS_DATA_ITEM_ID: case ASSISTED_GPS_DATA_ITEM_ID:
ret = setItemBaseinReport<SystemStatusAssistedGps>(mCache.mAssistedGps, ret = setIteminReport(mCache.mAssistedGps,
*(static_cast<AssistedGpsDataItemBase*>(dataitem))); SystemStatusAssistedGps(*(static_cast<AssistedGpsDataItemBase*>(dataitem))));
break; break;
case SCREEN_STATE_DATA_ITEM_ID: case SCREEN_STATE_DATA_ITEM_ID:
ret = setItemBaseinReport<SystemStatusScreenState>(mCache.mScreenState, ret = setIteminReport(mCache.mScreenState,
*(static_cast<ScreenStateDataItemBase*>(dataitem))); SystemStatusScreenState(*(static_cast<ScreenStateDataItemBase*>(dataitem))));
break; break;
case POWER_CONNECTED_STATE_DATA_ITEM_ID: case POWER_CONNECTED_STATE_DATA_ITEM_ID:
ret = setItemBaseinReport<SystemStatusPowerConnectState>(mCache.mPowerConnectState, ret = setIteminReport(mCache.mPowerConnectState,
*(static_cast<PowerConnectStateDataItemBase*>(dataitem))); SystemStatusPowerConnectState(*(static_cast<PowerConnectStateDataItemBase*>(dataitem))));
break; break;
case TIMEZONE_CHANGE_DATA_ITEM_ID: case TIMEZONE_CHANGE_DATA_ITEM_ID:
ret = setItemBaseinReport<SystemStatusTimeZoneChange>(mCache.mTimeZoneChange, ret = setIteminReport(mCache.mTimeZoneChange,
*(static_cast<TimeZoneChangeDataItemBase*>(dataitem))); SystemStatusTimeZoneChange(*(static_cast<TimeZoneChangeDataItemBase*>(dataitem))));
break; break;
case TIME_CHANGE_DATA_ITEM_ID: case TIME_CHANGE_DATA_ITEM_ID:
ret = setItemBaseinReport<SystemStatusTimeChange>(mCache.mTimeChange, ret = setIteminReport(mCache.mTimeChange,
*(static_cast<TimeChangeDataItemBase*>(dataitem))); SystemStatusTimeChange(*(static_cast<TimeChangeDataItemBase*>(dataitem))));
break; break;
case WIFI_SUPPLICANT_STATUS_DATA_ITEM_ID: case WIFI_SUPPLICANT_STATUS_DATA_ITEM_ID:
ret = setItemBaseinReport<SystemStatusWifiSupplicantStatus>( ret = setIteminReport(mCache.mWifiSupplicantStatus,
mCache.mWifiSupplicantStatus, SystemStatusWifiSupplicantStatus(*(static_cast<WifiSupplicantStatusDataItemBase*>(dataitem))));
*(static_cast<WifiSupplicantStatusDataItemBase*>(dataitem)));
break; break;
case SHUTDOWN_STATE_DATA_ITEM_ID: case SHUTDOWN_STATE_DATA_ITEM_ID:
ret = setItemBaseinReport<SystemStatusShutdownState>(mCache.mShutdownState, ret = setIteminReport(mCache.mShutdownState,
*(static_cast<ShutdownStateDataItemBase*>(dataitem))); SystemStatusShutdownState(*(static_cast<ShutdownStateDataItemBase*>(dataitem))));
break; break;
case TAC_DATA_ITEM_ID: case TAC_DATA_ITEM_ID:
ret = setItemBaseinReport<SystemStatusTac>(mCache.mTac, ret = setIteminReport(mCache.mTac,
*(static_cast<TacDataItemBase*>(dataitem))); SystemStatusTac(*(static_cast<TacDataItemBase*>(dataitem))));
break; break;
case MCCMNC_DATA_ITEM_ID: case MCCMNC_DATA_ITEM_ID:
ret = setItemBaseinReport<SystemStatusMccMnc>(mCache.mMccMnc, ret = setIteminReport(mCache.mMccMnc,
*(static_cast<MccmncDataItemBase*>(dataitem))); SystemStatusMccMnc(*(static_cast<MccmncDataItemBase*>(dataitem))));
break; break;
case BTLE_SCAN_DATA_ITEM_ID: case BTLE_SCAN_DATA_ITEM_ID:
ret = setItemBaseinReport<SystemStatusBtDeviceScanDetail>(mCache.mBtDeviceScanDetail, ret = setIteminReport(mCache.mBtDeviceScanDetail,
*(static_cast<BtDeviceScanDetailsDataItemBase*>(dataitem))); SystemStatusBtDeviceScanDetail(*(static_cast<BtDeviceScanDetailsDataItemBase*>(dataitem))));
break; break;
case BT_SCAN_DATA_ITEM_ID: case BT_SCAN_DATA_ITEM_ID:
ret = setItemBaseinReport<SystemStatusBtleDeviceScanDetail>( ret = setIteminReport(mCache.mBtLeDeviceScanDetail,
mCache.mBtLeDeviceScanDetail, SystemStatusBtleDeviceScanDetail(*(static_cast<BtLeDeviceScanDetailsDataItemBase*>(dataitem))));
*(static_cast<BtLeDeviceScanDetailsDataItemBase*>(dataitem)));
break; break;
default: default:
break; break;
@ -1623,7 +1650,7 @@ bool SystemStatus::getReport(SystemStatusReports& report, bool isLatestOnly) con
@return true when successfully done @return true when successfully done
******************************************************************************/ ******************************************************************************/
bool SystemStatus::setDefaultReport(void) bool SystemStatus::setDefaultGnssEngineStates(void)
{ {
pthread_mutex_lock(&mMutexSystemStatus); pthread_mutex_lock(&mMutexSystemStatus);
@ -1644,29 +1671,6 @@ bool SystemStatus::setDefaultReport(void)
setDefaultIteminReport(mCache.mPositionFailure, SystemStatusPositionFailure()); setDefaultIteminReport(mCache.mPositionFailure, SystemStatusPositionFailure());
setDefaultIteminReport(mCache.mAirplaneMode, SystemStatusAirplaneMode());
setDefaultIteminReport(mCache.mENH, SystemStatusENH());
setDefaultIteminReport(mCache.mGPSState, SystemStatusGpsState());
setDefaultIteminReport(mCache.mNLPStatus, SystemStatusNLPStatus());
setDefaultIteminReport(mCache.mWifiHardwareState, SystemStatusWifiHardwareState());
setDefaultIteminReport(mCache.mNetworkInfo, SystemStatusNetworkInfo());
setDefaultIteminReport(mCache.mRilServiceInfo, SystemStatusServiceInfo());
setDefaultIteminReport(mCache.mRilCellInfo, SystemStatusRilCellInfo());
setDefaultIteminReport(mCache.mServiceStatus, SystemStatusServiceStatus());
setDefaultIteminReport(mCache.mModel, SystemStatusModel());
setDefaultIteminReport(mCache.mManufacturer, SystemStatusManufacturer());
setDefaultIteminReport(mCache.mAssistedGps, SystemStatusAssistedGps());
setDefaultIteminReport(mCache.mScreenState, SystemStatusScreenState());
setDefaultIteminReport(mCache.mPowerConnectState, SystemStatusPowerConnectState());
setDefaultIteminReport(mCache.mTimeZoneChange, SystemStatusTimeZoneChange());
setDefaultIteminReport(mCache.mTimeChange, SystemStatusTimeChange());
setDefaultIteminReport(mCache.mWifiSupplicantStatus, SystemStatusWifiSupplicantStatus());
setDefaultIteminReport(mCache.mShutdownState, SystemStatusShutdownState());
setDefaultIteminReport(mCache.mTac, SystemStatusTac());
setDefaultIteminReport(mCache.mMccMnc, SystemStatusMccMnc());
setDefaultIteminReport(mCache.mBtDeviceScanDetail, SystemStatusBtDeviceScanDetail());
setDefaultIteminReport(mCache.mBtLeDeviceScanDetail, SystemStatusBtleDeviceScanDetail());
pthread_mutex_unlock(&mMutexSystemStatus); pthread_mutex_unlock(&mMutexSystemStatus);
return true; return true;
} }
@ -1678,17 +1682,12 @@ bool SystemStatus::setDefaultReport(void)
@return true when successfully done @return true when successfully done
******************************************************************************/ ******************************************************************************/
bool SystemStatus::eventConnectionStatus(bool connected, uint8_t type) bool SystemStatus::eventConnectionStatus(bool connected, int8_t type)
{ {
if (connected != mConnected) { // send networkinof dataitem to systemstatus observer clients
mConnected = connected; SystemStatusNetworkInfo s(type, "", "", connected);
mSysStatusObsvr.notify({&s});
// send networkinof dataitem to systemstatus observer clients
SystemStatusNetworkInfo s(type, "", "", false, connected, false);
list<IDataItemCore*> dl(0);
dl.push_back(&s);
mSysStatusObsvr.notify(dl);
}
return true; return true;
} }

91
gps/core/SystemStatus.h Normal file → Executable file
View file

@ -30,9 +30,10 @@
#define __SYSTEM_STATUS__ #define __SYSTEM_STATUS__
#include <stdint.h> #include <stdint.h>
#include <string> #include <sys/time.h>
#include <vector> #include <vector>
#include <platform_lib_log_util.h> #include <loc_pla.h>
#include <log_util.h>
#include <MsgTask.h> #include <MsgTask.h>
#include <IDataItemCore.h> #include <IDataItemCore.h>
#include <IOsObserver.h> #include <IOsObserver.h>
@ -70,14 +71,17 @@ public:
static const uint32_t maxItem = 5; static const uint32_t maxItem = 5;
SystemStatusItemBase() { SystemStatusItemBase() {
timeval tv; struct timespec tv;
gettimeofday(&tv, NULL); clock_gettime(CLOCK_MONOTONIC, &tv);
mUtcTime.tv_sec = tv.tv_sec; mUtcTime.tv_sec = tv.tv_sec;
mUtcTime.tv_nsec = tv.tv_usec *1000ULL; mUtcTime.tv_nsec = tv.tv_nsec;
mUtcReported = mUtcTime; mUtcReported = mUtcTime;
}; };
virtual ~SystemStatusItemBase() { }; virtual ~SystemStatusItemBase() {};
virtual void dump(void) { }; inline virtual SystemStatusItemBase& collate(SystemStatusItemBase&) {
return *this;
}
virtual void dump(void) {};
}; };
class SystemStatusLocation : public SystemStatusItemBase class SystemStatusLocation : public SystemStatusItemBase
@ -92,7 +96,7 @@ public:
const GpsLocationExtended& locationEx) : const GpsLocationExtended& locationEx) :
mValid(true), mValid(true),
mLocation(location), mLocation(location),
mLocationEx(locationEx) { } mLocationEx(locationEx) {}
bool equals(const SystemStatusLocation& peer); bool equals(const SystemStatusLocation& peer);
void dump(void); void dump(void);
}; };
@ -152,6 +156,12 @@ public:
double mAgcGlo; double mAgcGlo;
double mAgcBds; double mAgcBds;
double mAgcGal; double mAgcGal;
uint32_t mGloBpAmpI;
uint32_t mGloBpAmpQ;
uint32_t mBdsBpAmpI;
uint32_t mBdsBpAmpQ;
uint32_t mGalBpAmpI;
uint32_t mGalBpAmpQ;
inline SystemStatusRfAndParams() : inline SystemStatusRfAndParams() :
mPgaGain(0), mPgaGain(0),
mGpsBpAmpI(0), mGpsBpAmpI(0),
@ -165,7 +175,13 @@ public:
mAgcGps(0), mAgcGps(0),
mAgcGlo(0), mAgcGlo(0),
mAgcBds(0), mAgcBds(0),
mAgcGal(0) {} mAgcGal(0),
mGloBpAmpI(0),
mGloBpAmpQ(0),
mBdsBpAmpI(0),
mBdsBpAmpQ(0),
mGalBpAmpI(0),
mGalBpAmpQ(0) {}
inline SystemStatusRfAndParams(const SystemStatusPQWM1& nmea); inline SystemStatusRfAndParams(const SystemStatusPQWM1& nmea);
bool equals(const SystemStatusRfAndParams& peer); bool equals(const SystemStatusRfAndParams& peer);
void dump(void); void dump(void);
@ -444,38 +460,49 @@ public:
class SystemStatusNetworkInfo : public SystemStatusItemBase, class SystemStatusNetworkInfo : public SystemStatusItemBase,
public NetworkInfoDataItemBase public NetworkInfoDataItemBase
{ {
NetworkInfoDataItemBase* mSrcObjPtr;
public: public:
inline SystemStatusNetworkInfo( inline SystemStatusNetworkInfo(
int32_t type=0, int32_t type=0,
std::string typeName="", std::string typeName="",
string subTypeName="", string subTypeName="",
bool available=false,
bool connected=false, bool connected=false,
bool roaming=false) : bool roaming=false) :
NetworkInfoDataItemBase( NetworkInfoDataItemBase(
(NetworkType)type,
type, type,
typeName, typeName,
subTypeName, subTypeName,
available, connected && (!roaming),
connected, connected,
roaming) {} roaming),
mSrcObjPtr(nullptr) {}
inline SystemStatusNetworkInfo(const NetworkInfoDataItemBase& itemBase) : inline SystemStatusNetworkInfo(const NetworkInfoDataItemBase& itemBase) :
NetworkInfoDataItemBase(itemBase) { NetworkInfoDataItemBase(itemBase),
mSrcObjPtr((NetworkInfoDataItemBase*)&itemBase) {
mType = itemBase.getType(); mType = itemBase.getType();
} }
inline bool equals(const SystemStatusNetworkInfo& peer) { inline bool equals(const SystemStatusNetworkInfo& peer) {
if ((mType == peer.mType) && return (mAllTypes == peer.mAllTypes);
(mTypeName == peer.mTypeName) && }
(mSubTypeName == peer.mSubTypeName) && inline virtual SystemStatusItemBase& collate(SystemStatusItemBase& curInfo) {
(mAvailable == peer.mAvailable) && uint64_t allTypes = (static_cast<SystemStatusNetworkInfo&>(curInfo)).mAllTypes;
(mConnected == peer.mConnected) && if (mConnected) {
(mRoaming == peer.mRoaming)) { mAllTypes |= allTypes;
return true; } else if (0 != mAllTypes) {
mAllTypes = (allTypes & (~mAllTypes));
} // else (mConnected == false && mAllTypes == 0)
// we keep mAllTypes as 0, which means no more connections.
if (nullptr != mSrcObjPtr) {
// this is critical, changing mAllTypes of the original obj
mSrcObjPtr->mAllTypes = mAllTypes;
} }
return false; return *this;
} }
inline void dump(void) override { inline void dump(void) override {
LOC_LOGD("NetworkInfo: type=%u connected=%u", mType, mConnected); LOC_LOGD("NetworkInfo: mAllTypes=%" PRIx64 " connected=%u mType=%x",
mAllTypes, mConnected, mType);
} }
}; };
@ -487,8 +514,9 @@ public:
RilServiceInfoDataItemBase() {} RilServiceInfoDataItemBase() {}
inline SystemStatusServiceInfo(const RilServiceInfoDataItemBase& itemBase) : inline SystemStatusServiceInfo(const RilServiceInfoDataItemBase& itemBase) :
RilServiceInfoDataItemBase(itemBase) {} RilServiceInfoDataItemBase(itemBase) {}
inline bool equals(const SystemStatusServiceInfo& /*peer*/) { inline bool equals(const SystemStatusServiceInfo& peer) {
return true; return static_cast<const RilServiceInfoDataItemBase&>(peer) ==
static_cast<const RilServiceInfoDataItemBase&>(*this);
} }
}; };
@ -500,8 +528,9 @@ public:
RilCellInfoDataItemBase() {} RilCellInfoDataItemBase() {}
inline SystemStatusRilCellInfo(const RilCellInfoDataItemBase& itemBase) : inline SystemStatusRilCellInfo(const RilCellInfoDataItemBase& itemBase) :
RilCellInfoDataItemBase(itemBase) {} RilCellInfoDataItemBase(itemBase) {}
inline bool equals(const SystemStatusRilCellInfo& /*peer*/) { inline bool equals(const SystemStatusRilCellInfo& peer) {
return true; return static_cast<const RilCellInfoDataItemBase&>(peer) ==
static_cast<const RilCellInfoDataItemBase&>(*this);
} }
}; };
@ -770,13 +799,9 @@ private:
// Data members // Data members
static pthread_mutex_t mMutexSystemStatus; static pthread_mutex_t mMutexSystemStatus;
SystemStatusReports mCache; SystemStatusReports mCache;
bool mConnected;
template <typename TYPE_SYSTEMSTATUS_ITEM, typename TYPE_REPORT, typename TYPE_ITEMBASE>
bool setItemBaseinReport(TYPE_REPORT& report, const TYPE_ITEMBASE& s);
template <typename TYPE_REPORT, typename TYPE_ITEM> template <typename TYPE_REPORT, typename TYPE_ITEM>
bool setIteminReport(TYPE_REPORT& report, const TYPE_ITEM& s); bool setIteminReport(TYPE_REPORT& report, TYPE_ITEM&& s);
// set default dataitem derived item in report cache // set default dataitem derived item in report cache
template <typename TYPE_REPORT, typename TYPE_ITEM> template <typename TYPE_REPORT, typename TYPE_ITEM>
@ -796,8 +821,8 @@ public:
bool eventDataItemNotify(IDataItemCore* dataitem); bool eventDataItemNotify(IDataItemCore* dataitem);
bool setNmeaString(const char *data, uint32_t len); bool setNmeaString(const char *data, uint32_t len);
bool getReport(SystemStatusReports& reports, bool isLatestonly = false) const; bool getReport(SystemStatusReports& reports, bool isLatestonly = false) const;
bool setDefaultReport(void); bool setDefaultGnssEngineStates(void);
bool eventConnectionStatus(bool connected, uint8_t type); bool eventConnectionStatus(bool connected, int8_t type);
}; };
} // namespace loc_core } // namespace loc_core

682
gps/core/SystemStatusOsObserver.cpp Normal file → Executable file
View file

@ -32,25 +32,20 @@
#include <SystemStatus.h> #include <SystemStatus.h>
#include <SystemStatusOsObserver.h> #include <SystemStatusOsObserver.h>
#include <IDataItemCore.h> #include <IDataItemCore.h>
#include <IClientIndex.h>
#include <IDataItemIndex.h>
#include <IndexFactory.h>
#include <DataItemsFactoryProxy.h> #include <DataItemsFactoryProxy.h>
namespace loc_core namespace loc_core
{ {
SystemStatusOsObserver::SystemStatusOsObserver( template <typename CINT, typename COUT>
SystemStatus* systemstatus, const MsgTask* msgTask) : COUT SystemStatusOsObserver::containerTransfer(CINT& inContainer) {
mSystemStatus(systemstatus), COUT outContainer(0);
mAddress("SystemStatusOsObserver"), for (auto item : inContainer) {
mClientIndex(IndexFactory<IDataItemObserver*, DataItemId> :: createClientIndex()), outContainer.insert(outContainer.begin(), item);
mDataItemIndex(IndexFactory<IDataItemObserver*, DataItemId> :: createDataItemIndex()) }
{ return outContainer;
mContext.mMsgTask = msgTask;
} }
SystemStatusOsObserver::~SystemStatusOsObserver() SystemStatusOsObserver::~SystemStatusOsObserver() {
{
// Close data-item library handle // Close data-item library handle
DataItemsFactoryProxy::closeDataItemLibraryHandle(); DataItemsFactoryProxy::closeDataItemLibraryHandle();
@ -62,290 +57,238 @@ SystemStatusOsObserver::~SystemStatusOsObserver()
} }
mDataItemCache.clear(); mDataItemCache.clear();
delete mClientIndex;
delete mDataItemIndex;
} }
void SystemStatusOsObserver::setSubscriptionObj(IDataItemSubscription* subscriptionObj) void SystemStatusOsObserver::setSubscriptionObj(IDataItemSubscription* subscriptionObj)
{ {
mContext.mSubscriptionObj = subscriptionObj; struct SetSubsObj : public LocMsg {
ObserverContext& mContext;
IDataItemSubscription* mSubsObj;
inline SetSubsObj(ObserverContext& context, IDataItemSubscription* subscriptionObj) :
mContext(context), mSubsObj(subscriptionObj) {}
void proc() const {
mContext.mSubscriptionObj = mSubsObj;
LOC_LOGD("Request cache size - Subscribe:%zu RequestData:%zu", if (!mContext.mSSObserver->mDataItemToClients.empty()) {
mSubscribeReqCache.size(), mReqDataCache.size()); list<DataItemId> dis(
containerTransfer<unordered_set<DataItemId>, list<DataItemId>>(
// we have received the subscription object. process cached requests mContext.mSSObserver->mDataItemToClients.getKeys()));
// process - subscribe request cache mContext.mSubscriptionObj->subscribe(dis, mContext.mSSObserver);
for (auto each : mSubscribeReqCache) { mContext.mSubscriptionObj->requestData(dis, mContext.mSSObserver);
subscribe(each.second, each.first); }
}
// process - requestData request cache
for (auto each : mReqDataCache) {
requestData(each.second, each.first);
}
}
// Helper to cache requests subscribe and requestData till subscription obj is obtained
void SystemStatusOsObserver::cacheObserverRequest(ObserverReqCache& reqCache,
const list<DataItemId>& l, IDataItemObserver* client)
{
ObserverReqCache::iterator dicIter = reqCache.find(client);
if (dicIter != reqCache.end()) {
// found
list<DataItemId> difference(0);
set_difference(l.begin(), l.end(),
dicIter->second.begin(), dicIter->second.end(),
inserter(difference, difference.begin()));
if (!difference.empty()) {
difference.sort();
dicIter->second.merge(difference);
dicIter->second.unique();
} }
} };
else {
// not found if (nullptr == subscriptionObj) {
reqCache[client] = l; LOC_LOGw("subscriptionObj is NULL");
} else {
mContext.mMsgTask->sendMsg(new SetSubsObj(mContext, subscriptionObj));
} }
} }
/****************************************************************************** /******************************************************************************
IDataItemSubscription Overrides IDataItemSubscription Overrides
******************************************************************************/ ******************************************************************************/
void SystemStatusOsObserver::subscribe( void SystemStatusOsObserver::subscribe(const list<DataItemId>& l, IDataItemObserver* client,
const list<DataItemId>& l, IDataItemObserver* client) bool toRequestData)
{ {
if (nullptr == mContext.mSubscriptionObj) {
LOC_LOGD("%s]: Subscription object is NULL. Caching requests", __func__);
cacheObserverRequest(mSubscribeReqCache, l, client);
return;
}
struct HandleSubscribeReq : public LocMsg { struct HandleSubscribeReq : public LocMsg {
HandleSubscribeReq(SystemStatusOsObserver* parent, inline HandleSubscribeReq(SystemStatusOsObserver* parent,
const list<DataItemId>& l, IDataItemObserver* client) : list<DataItemId>& l, IDataItemObserver* client, bool requestData) :
mParent(parent), mClient(client), mDataItemList(l) {} mParent(parent), mClient(client),
virtual ~HandleSubscribeReq() {} mDataItemSet(containerTransfer<list<DataItemId>, unordered_set<DataItemId>>(l)),
mToRequestData(requestData) {}
void proc() const { void proc() const {
unordered_set<DataItemId> dataItemsToSubscribe(0);
mParent->mDataItemToClients.add(mDataItemSet, {mClient}, &dataItemsToSubscribe);
mParent->mClientToDataItems.add(mClient, mDataItemSet);
if (mDataItemList.empty()) { mParent->sendCachedDataItems(mDataItemSet, mClient);
LOC_LOGV("mDataItemList is empty. Nothing to do. Exiting");
return;
}
// Handle First Response // Send subscription set to framework
list<DataItemId> pendingFirstResponseList(0); if (nullptr != mParent->mContext.mSubscriptionObj && !dataItemsToSubscribe.empty()) {
mParent->mClientIndex->add(mClient, mDataItemList, pendingFirstResponseList);
// Do not send first response for only pendingFirstResponseList,
// instead send for all the data items (present in the cache) that
// have been subscribed for each time.
mParent->sendFirstResponse(mDataItemList, mClient);
list<DataItemId> yetToSubscribeDataItemsList(0);
mParent->mDataItemIndex->add(mClient, mDataItemList, yetToSubscribeDataItemsList);
// Send subscription list to framework
if (!yetToSubscribeDataItemsList.empty()) {
mParent->mContext.mSubscriptionObj->subscribe(yetToSubscribeDataItemsList, mParent);
LOC_LOGD("Subscribe Request sent to framework for the following"); LOC_LOGD("Subscribe Request sent to framework for the following");
mParent->logMe(yetToSubscribeDataItemsList); mParent->logMe(dataItemsToSubscribe);
if (mToRequestData) {
mParent->mContext.mSubscriptionObj->requestData(
containerTransfer<unordered_set<DataItemId>, list<DataItemId>>(
std::move(dataItemsToSubscribe)),
mParent);
} else {
mParent->mContext.mSubscriptionObj->subscribe(
containerTransfer<unordered_set<DataItemId>, list<DataItemId>>(
std::move(dataItemsToSubscribe)),
mParent);
}
} }
} }
SystemStatusOsObserver* mParent; mutable SystemStatusOsObserver* mParent;
IDataItemObserver* mClient; IDataItemObserver* mClient;
const list<DataItemId> mDataItemList; const unordered_set<DataItemId> mDataItemSet;
bool mToRequestData;
}; };
mContext.mMsgTask->sendMsg(new (nothrow) HandleSubscribeReq(this, l, client));
if (l.empty() || nullptr == client) {
LOC_LOGw("Data item set is empty or client is nullptr");
} else {
mContext.mMsgTask->sendMsg(
new HandleSubscribeReq(this, (list<DataItemId>&)l, client, toRequestData));
}
} }
void SystemStatusOsObserver::updateSubscription( void SystemStatusOsObserver::updateSubscription(
const list<DataItemId>& l, IDataItemObserver* client) const list<DataItemId>& l, IDataItemObserver* client)
{ {
if (nullptr == mContext.mSubscriptionObj) {
LOC_LOGE("%s:%d]: Subscription object is NULL", __func__, __LINE__);
return;
}
struct HandleUpdateSubscriptionReq : public LocMsg { struct HandleUpdateSubscriptionReq : public LocMsg {
HandleUpdateSubscriptionReq(SystemStatusOsObserver* parent, HandleUpdateSubscriptionReq(SystemStatusOsObserver* parent,
const list<DataItemId>& l, IDataItemObserver* client) : list<DataItemId>& l, IDataItemObserver* client) :
mParent(parent), mClient(client), mDataItemList(l) {} mParent(parent), mClient(client),
virtual ~HandleUpdateSubscriptionReq() {} mDataItemSet(containerTransfer<list<DataItemId>, unordered_set<DataItemId>>(l)) {}
void proc() const { void proc() const {
if (mDataItemList.empty()) { unordered_set<DataItemId> dataItemsToSubscribe(0);
LOC_LOGV("mDataItemList is empty. Nothing to do. Exiting"); unordered_set<DataItemId> dataItemsToUnsubscribe(0);
return; unordered_set<IDataItemObserver*> clients({mClient});
} // below removes clients from all entries keyed with the return of the
// mClientToDataItems.update() call. If leaving an empty set of clients as the
list<DataItemId> currentlySubscribedList(0); // result, the entire entry will be removed. dataItemsToUnsubscribe will be
mParent->mClientIndex->getSubscribedList(mClient, currentlySubscribedList); // populated to keep the keys of the removed entries.
mParent->mDataItemToClients.trimOrRemove(
list<DataItemId> removeDataItemList(0); // this call updates <IDataItemObserver*, DataItemId> map; removes
set_difference(currentlySubscribedList.begin(), currentlySubscribedList.end(), // the DataItemId's that are not new to the clietn from mDataItemSet;
mDataItemList.begin(), mDataItemList.end(), // and returns a set of mDataItemSet's that are no longer used by client.
inserter(removeDataItemList,removeDataItemList.begin())); // This unused set of mDataItemSet's is passed to trimOrRemove method of
// <DataItemId, IDataItemObserver*> map to remove the client from the
// Handle First Response // corresponding entries, and gets a set of the entries that are
list<DataItemId> pendingFirstResponseList(0); // removed from the <DataItemId, IDataItemObserver*> map as a result.
mParent->mClientIndex->add(mClient, mDataItemList, pendingFirstResponseList); mParent->mClientToDataItems.update(mClient,
(unordered_set<DataItemId>&)mDataItemSet),
clients, &dataItemsToUnsubscribe, nullptr);
// below adds mClient to <DataItemId, IDataItemObserver*> map, and populates
// new keys added to that map, which are DataItemIds to be subscribed.
mParent->mDataItemToClients.add(mDataItemSet, clients, &dataItemsToSubscribe);
// Send First Response // Send First Response
mParent->sendFirstResponse(pendingFirstResponseList, mClient); mParent->sendCachedDataItems(mDataItemSet, mClient);
list<DataItemId> yetToSubscribeDataItemsList(0); if (nullptr != mParent->mContext.mSubscriptionObj) {
mParent->mDataItemIndex->add( // Send subscription set to framework
mClient, mDataItemList, yetToSubscribeDataItemsList); if (!dataItemsToSubscribe.empty()) {
LOC_LOGD("Subscribe Request sent to framework for the following");
mParent->logMe(dataItemsToSubscribe);
// Send subscription list to framework mParent->mContext.mSubscriptionObj->subscribe(
if (!yetToSubscribeDataItemsList.empty()) { containerTransfer<unordered_set<DataItemId>, list<DataItemId>>(
mParent->mContext.mSubscriptionObj->subscribe( std::move(dataItemsToSubscribe)),
yetToSubscribeDataItemsList, mParent); mParent);
LOC_LOGD("Subscribe Request sent to framework for the following"); }
mParent->logMe(yetToSubscribeDataItemsList);
}
list<DataItemId> unsubscribeList(0);
list<DataItemId> unused(0);
mParent->mClientIndex->remove(mClient, removeDataItemList, unused);
if (!mParent->mClientIndex->isSubscribedClient(mClient)) {
mParent->mDataItemIndex->remove(
list<IDataItemObserver*> (1,mClient), unsubscribeList);
}
if (!unsubscribeList.empty()) {
// Send unsubscribe to framework // Send unsubscribe to framework
mParent->mContext.mSubscriptionObj->unsubscribe(unsubscribeList, mParent); if (!dataItemsToUnsubscribe.empty()) {
LOC_LOGD("Unsubscribe Request sent to framework for the following"); LOC_LOGD("Unsubscribe Request sent to framework for the following");
mParent->logMe(unsubscribeList); mParent->logMe(dataItemsToUnsubscribe);
mParent->mContext.mSubscriptionObj->unsubscribe(
containerTransfer<unordered_set<DataItemId>, list<DataItemId>>(
std::move(dataItemsToUnsubscribe)),
mParent);
}
} }
} }
SystemStatusOsObserver* mParent; SystemStatusOsObserver* mParent;
IDataItemObserver* mClient; IDataItemObserver* mClient;
const list<DataItemId> mDataItemList; unordered_set<DataItemId> mDataItemSet;
}; };
mContext.mMsgTask->sendMsg(new (nothrow) HandleUpdateSubscriptionReq(this, l, client));
}
void SystemStatusOsObserver::requestData( if (l.empty() || nullptr == client) {
const list<DataItemId>& l, IDataItemObserver* client) LOC_LOGw("Data item set is empty or client is nullptr");
{ } else {
if (nullptr == mContext.mSubscriptionObj) { mContext.mMsgTask->sendMsg(
LOC_LOGD("%s]: Subscription object is NULL. Caching requests", __func__); new HandleUpdateSubscriptionReq(this, (list<DataItemId>&)l, client));
cacheObserverRequest(mReqDataCache, l, client);
return;
} }
struct HandleRequestData : public LocMsg {
HandleRequestData(SystemStatusOsObserver* parent,
const list<DataItemId>& l, IDataItemObserver* client) :
mParent(parent), mClient(client), mDataItemList(l) {}
virtual ~HandleRequestData() {}
void proc() const {
if (mDataItemList.empty()) {
LOC_LOGV("mDataItemList is empty. Nothing to do. Exiting");
return;
}
list<DataItemId> yetToSubscribeDataItemsList(0);
mParent->mClientIndex->add(
mClient, mDataItemList, yetToSubscribeDataItemsList);
mParent->mDataItemIndex->add(
mClient, mDataItemList, yetToSubscribeDataItemsList);
// Send subscription list to framework
if (!mDataItemList.empty()) {
mParent->mContext.mSubscriptionObj->requestData(mDataItemList, mParent);
LOC_LOGD("Subscribe Request sent to framework for the following");
mParent->logMe(yetToSubscribeDataItemsList);
}
}
SystemStatusOsObserver* mParent;
IDataItemObserver* mClient;
const list<DataItemId> mDataItemList;
};
mContext.mMsgTask->sendMsg(new (nothrow) HandleRequestData(this, l, client));
} }
void SystemStatusOsObserver::unsubscribe( void SystemStatusOsObserver::unsubscribe(
const list<DataItemId>& l, IDataItemObserver* client) const list<DataItemId>& l, IDataItemObserver* client)
{ {
if (nullptr == mContext.mSubscriptionObj) {
LOC_LOGE("%s:%d]: Subscription object is NULL", __func__, __LINE__);
return;
}
struct HandleUnsubscribeReq : public LocMsg { struct HandleUnsubscribeReq : public LocMsg {
HandleUnsubscribeReq(SystemStatusOsObserver* parent, HandleUnsubscribeReq(SystemStatusOsObserver* parent,
const list<DataItemId>& l, IDataItemObserver* client) : list<DataItemId>& l, IDataItemObserver* client) :
mParent(parent), mClient(client), mDataItemList(l) {} mParent(parent), mClient(client),
virtual ~HandleUnsubscribeReq() {} mDataItemSet(containerTransfer<list<DataItemId>, unordered_set<DataItemId>>(l)) {}
void proc() const { void proc() const {
if (mDataItemList.empty()) { unordered_set<DataItemId> dataItemsUnusedByClient(0);
LOC_LOGV("mDataItemList is empty. Nothing to do. Exiting"); unordered_set<IDataItemObserver*> clientToRemove(0);
return; mParent->mClientToDataItems.trimOrRemove({mClient}, mDataItemSet, &clientToRemove,
} &dataItemsUnusedByClient);
unordered_set<DataItemId> dataItemsToUnsubscribe(0);
mParent->mDataItemToClients.trimOrRemove(dataItemsUnusedByClient, {mClient},
&dataItemsToUnsubscribe, nullptr);
list<DataItemId> unsubscribeList(0); if (nullptr != mParent->mContext.mSubscriptionObj && !dataItemsToUnsubscribe.empty()) {
list<DataItemId> unused(0);
mParent->mClientIndex->remove(mClient, mDataItemList, unused);
for (auto each : mDataItemList) {
list<IDataItemObserver*> clientListSubs(0);
list<IDataItemObserver*> clientListOut(0);
mParent->mDataItemIndex->remove(
each, list<IDataItemObserver*> (1,mClient), clientListOut);
// check if there are any other subscribed client for this data item id
mParent->mDataItemIndex->getListOfSubscribedClients(each, clientListSubs);
if (clientListSubs.empty())
{
LOC_LOGD("Client list subscribed is empty for dataitem - %d", each);
unsubscribeList.push_back(each);
}
}
if (!unsubscribeList.empty()) {
// Send unsubscribe to framework
mParent->mContext.mSubscriptionObj->unsubscribe(unsubscribeList, mParent);
LOC_LOGD("Unsubscribe Request sent to framework for the following data items"); LOC_LOGD("Unsubscribe Request sent to framework for the following data items");
mParent->logMe(unsubscribeList); mParent->logMe(dataItemsToUnsubscribe);
// Send unsubscribe to framework
mParent->mContext.mSubscriptionObj->unsubscribe(
containerTransfer<unordered_set<DataItemId>, list<DataItemId>>(
std::move(dataItemsToUnsubscribe)),
mParent);
} }
} }
SystemStatusOsObserver* mParent; SystemStatusOsObserver* mParent;
IDataItemObserver* mClient; IDataItemObserver* mClient;
const list<DataItemId> mDataItemList; unordered_set<DataItemId> mDataItemSet;
}; };
mContext.mMsgTask->sendMsg(new (nothrow) HandleUnsubscribeReq(this, l, client));
if (l.empty() || nullptr == client) {
LOC_LOGw("Data item set is empty or client is nullptr");
} else {
mContext.mMsgTask->sendMsg(new HandleUnsubscribeReq(this, (list<DataItemId>&)l, client));
}
} }
void SystemStatusOsObserver::unsubscribeAll(IDataItemObserver* client) void SystemStatusOsObserver::unsubscribeAll(IDataItemObserver* client)
{ {
if (nullptr == mContext.mSubscriptionObj) {
LOC_LOGE("%s:%d]: Subscription object is NULL", __func__, __LINE__);
return;
}
struct HandleUnsubscribeAllReq : public LocMsg { struct HandleUnsubscribeAllReq : public LocMsg {
HandleUnsubscribeAllReq(SystemStatusOsObserver* parent, HandleUnsubscribeAllReq(SystemStatusOsObserver* parent,
IDataItemObserver* client) : IDataItemObserver* client) :
mParent(parent), mClient(client) {} mParent(parent), mClient(client) {}
virtual ~HandleUnsubscribeAllReq() {}
void proc() const {
list<IDataItemObserver*> clients(1, mClient);
list<DataItemId> unsubscribeList(0);
if(0 == mParent->mClientIndex->remove(mClient)) {
return;
}
mParent->mDataItemIndex->remove(clients, unsubscribeList);
if (!unsubscribeList.empty()) { void proc() const {
// Send unsubscribe to framework unordered_set<DataItemId> diByClient = mParent->mClientToDataItems.getValSet(mClient);
mParent->mContext.mSubscriptionObj->unsubscribe(unsubscribeList, mParent); if (!diByClient.empty()) {
LOC_LOGD("Unsubscribe Request sent to framework for the following data items"); unordered_set<DataItemId> dataItemsToUnsubscribe;
mParent->logMe(unsubscribeList); mParent->mClientToDataItems.remove(mClient);
mParent->mDataItemToClients.trimOrRemove(diByClient, {mClient},
&dataItemsToUnsubscribe, nullptr);
if (!dataItemsToUnsubscribe.empty() &&
nullptr != mParent->mContext.mSubscriptionObj) {
LOC_LOGD("Unsubscribe Request sent to framework for the following data items");
mParent->logMe(dataItemsToUnsubscribe);
// Send unsubscribe to framework
mParent->mContext.mSubscriptionObj->unsubscribe(
containerTransfer<unordered_set<DataItemId>, list<DataItemId>>(
std::move(dataItemsToUnsubscribe)),
mParent);
}
} }
} }
SystemStatusOsObserver* mParent; SystemStatusOsObserver* mParent;
IDataItemObserver* mClient; IDataItemObserver* mClient;
}; };
mContext.mMsgTask->sendMsg(new (nothrow) HandleUnsubscribeAllReq(this, client));
if (nullptr == client) {
LOC_LOGw("Data item set is empty or client is nullptr");
} else {
mContext.mMsgTask->sendMsg(new HandleUnsubscribeAllReq(this, client));
}
} }
/****************************************************************************** /******************************************************************************
@ -353,84 +296,81 @@ void SystemStatusOsObserver::unsubscribeAll(IDataItemObserver* client)
******************************************************************************/ ******************************************************************************/
void SystemStatusOsObserver::notify(const list<IDataItemCore*>& dlist) void SystemStatusOsObserver::notify(const list<IDataItemCore*>& dlist)
{ {
list<IDataItemCore*> dataItemList(0);
for (auto each : dlist) {
string dv;
each->stringify(dv);
LOC_LOGD("notify: DataItem In Value:%s", dv.c_str());
IDataItemCore* di = DataItemsFactoryProxy::createNewDataItem(each->getId());
if (nullptr == di) {
LOC_LOGE("Unable to create dataitem:%d", each->getId());
return;
}
// Copy contents into the newly created data item
di->copy(each);
// Request systemstatus to record this dataitem in its cache
if (mSystemStatus->eventDataItemNotify(di)) {
// add this dataitem if updated from last one
dataItemList.push_back(di);
}
}
struct HandleNotify : public LocMsg { struct HandleNotify : public LocMsg {
HandleNotify(SystemStatusOsObserver* parent, const list<IDataItemCore*>& l) : HandleNotify(SystemStatusOsObserver* parent, vector<IDataItemCore*>& v) :
mParent(parent), mDList(l) {} mParent(parent), mDiVec(std::move(v)) {}
virtual ~HandleNotify() {
for (auto each : mDList) { inline virtual ~HandleNotify() {
delete each; for (auto item : mDiVec) {
delete item;
} }
} }
void proc() const { void proc() const {
// Update Cache with received data items and prepare // Update Cache with received data items and prepare
// list of data items to be sent. // list of data items to be sent.
list<DataItemId> dataItemIdsToBeSent(0); unordered_set<DataItemId> dataItemIdsToBeSent(0);
for (auto item : mDList) { for (auto item : mDiVec) {
bool dataItemUpdated = false; if (mParent->updateCache(item)) {
mParent->updateCache(item, dataItemUpdated); dataItemIdsToBeSent.insert(item->getId());
if (dataItemUpdated) {
dataItemIdsToBeSent.push_back(item->getId());
} }
} }
// Send data item to all subscribed clients // Send data item to all subscribed clients
list<IDataItemObserver*> clientList(0); unordered_set<IDataItemObserver*> clientSet(0);
for (auto each : dataItemIdsToBeSent) { for (auto each : dataItemIdsToBeSent) {
list<IDataItemObserver*> clients(0); auto clients = mParent->mDataItemToClients.getValSetPtr(each);
mParent->mDataItemIndex->getListOfSubscribedClients(each, clients); if (nullptr != clients) {
for (auto each_cient: clients) { clientSet.insert(clients->begin(), clients->end());
clientList.push_back(each_cient);
} }
} }
clientList.unique();
for (auto client : clientList) { for (auto client : clientSet) {
list<DataItemId> dataItemIdsSubscribedByThisClient(0); unordered_set<DataItemId> dataItemIdsForThisClient(
list<DataItemId> dataItemIdsToBeSentForThisClient(0); mParent->mClientToDataItems.getValSet(client));
mParent->mClientIndex->getSubscribedList( for (auto itr = dataItemIdsForThisClient.begin();
client, dataItemIdsSubscribedByThisClient); itr != dataItemIdsForThisClient.end(); ) {
dataItemIdsSubscribedByThisClient.sort(); if (dataItemIdsToBeSent.find(*itr) == dataItemIdsToBeSent.end()) {
dataItemIdsToBeSent.sort(); itr = dataItemIdsForThisClient.erase(itr);
} else {
itr++;
}
}
set_intersection(dataItemIdsToBeSent.begin(), mParent->sendCachedDataItems(dataItemIdsForThisClient, client);
dataItemIdsToBeSent.end(),
dataItemIdsSubscribedByThisClient.begin(),
dataItemIdsSubscribedByThisClient.end(),
inserter(dataItemIdsToBeSentForThisClient,
dataItemIdsToBeSentForThisClient.begin()));
mParent->sendCachedDataItems(dataItemIdsToBeSentForThisClient, client);
dataItemIdsSubscribedByThisClient.clear();
dataItemIdsToBeSentForThisClient.clear();
} }
} }
SystemStatusOsObserver* mParent; SystemStatusOsObserver* mParent;
const list<IDataItemCore*> mDList; const vector<IDataItemCore*> mDiVec;
}; };
mContext.mMsgTask->sendMsg(new (nothrow) HandleNotify(this, dataItemList));
if (!dlist.empty()) {
vector<IDataItemCore*> dataItemVec(dlist.size());
for (auto each : dlist) {
IF_LOC_LOGD {
string dv;
each->stringify(dv);
LOC_LOGD("notify: DataItem In Value:%s", dv.c_str());
}
IDataItemCore* di = DataItemsFactoryProxy::createNewDataItem(each->getId());
if (nullptr == di) {
LOC_LOGw("Unable to create dataitem:%d", each->getId());
continue;
}
// Copy contents into the newly created data item
di->copy(each);
// add this dataitem if updated from last one
dataItemVec.push_back(di);
}
if (!dataItemVec.empty()) {
mContext.mMsgTask->sendMsg(new HandleNotify(this, dataItemVec));
}
}
} }
/****************************************************************************** /******************************************************************************
@ -444,7 +384,7 @@ void SystemStatusOsObserver::turnOn(DataItemId dit, int timeOut)
} }
// Check if data item exists in mActiveRequestCount // Check if data item exists in mActiveRequestCount
map<DataItemId, int>::iterator citer = mActiveRequestCount.find(dit); DataItemIdToInt::iterator citer = mActiveRequestCount.find(dit);
if (citer == mActiveRequestCount.end()) { if (citer == mActiveRequestCount.end()) {
// Data item not found in map // Data item not found in map
// Add reference count as 1 and add dataitem to map // Add reference count as 1 and add dataitem to map
@ -482,7 +422,7 @@ void SystemStatusOsObserver::turnOff(DataItemId dit)
} }
// Check if data item exists in mActiveRequestCount // Check if data item exists in mActiveRequestCount
map<DataItemId, int>::iterator citer = mActiveRequestCount.find(dit); DataItemIdToInt::iterator citer = mActiveRequestCount.find(dit);
if (citer != mActiveRequestCount.end()) { if (citer != mActiveRequestCount.end()) {
// found // found
citer->second--; citer->second--;
@ -508,87 +448,127 @@ void SystemStatusOsObserver::turnOff(DataItemId dit)
} }
} }
#ifdef USE_GLIB
bool SystemStatusOsObserver::connectBackhaul()
{
bool result = false;
if (mContext.mFrameworkActionReqObj != NULL) {
struct HandleConnectBackhaul : public LocMsg {
HandleConnectBackhaul(IFrameworkActionReq* fwkActReq) :
mFwkActionReqObj(fwkActReq) {}
virtual ~HandleConnectBackhaul() {}
void proc() const {
LOC_LOGD("HandleConnectBackhaul");
mFwkActionReqObj->connectBackhaul();
}
IFrameworkActionReq* mFwkActionReqObj;
};
mContext.mMsgTask->sendMsg(
new (nothrow) HandleConnectBackhaul(mContext.mFrameworkActionReqObj));
result = true;
}
else {
++mBackHaulConnectReqCount;
LOC_LOGE("Framework action request object is NULL.Caching connect request: %d",
mBackHaulConnectReqCount);
result = false;
}
return result;
}
bool SystemStatusOsObserver::disconnectBackhaul()
{
bool result = false;
if (mContext.mFrameworkActionReqObj != NULL) {
struct HandleDisconnectBackhaul : public LocMsg {
HandleDisconnectBackhaul(IFrameworkActionReq* fwkActReq) :
mFwkActionReqObj(fwkActReq) {}
virtual ~HandleDisconnectBackhaul() {}
void proc() const {
LOC_LOGD("HandleDisconnectBackhaul");
mFwkActionReqObj->disconnectBackhaul();
}
IFrameworkActionReq* mFwkActionReqObj;
};
mContext.mMsgTask->sendMsg(
new (nothrow) HandleDisconnectBackhaul(mContext.mFrameworkActionReqObj));
}
else {
if (mBackHaulConnectReqCount > 0) {
--mBackHaulConnectReqCount;
}
LOC_LOGE("Framework action request object is NULL.Caching disconnect request: %d",
mBackHaulConnectReqCount);
result = false;
}
return result;
}
#endif
/****************************************************************************** /******************************************************************************
Helpers Helpers
******************************************************************************/ ******************************************************************************/
void SystemStatusOsObserver::sendFirstResponse(
const list<DataItemId>& l, IDataItemObserver* to)
{
if (l.empty()) {
LOC_LOGV("list is empty. Nothing to do. Exiting");
return;
}
string clientName;
to->getName(clientName);
list<IDataItemCore*> dataItems(0);
for (auto each : l) {
map<DataItemId, IDataItemCore*>::const_iterator citer = mDataItemCache.find(each);
if (citer != mDataItemCache.end()) {
string dv;
citer->second->stringify(dv);
LOC_LOGI("DataItem: %s >> %s", dv.c_str(), clientName.c_str());
dataItems.push_back(citer->second);
}
}
if (dataItems.empty()) {
LOC_LOGV("No items to notify. Nothing to do. Exiting");
return;
}
to->notify(dataItems);
}
void SystemStatusOsObserver::sendCachedDataItems( void SystemStatusOsObserver::sendCachedDataItems(
const list<DataItemId>& l, IDataItemObserver* to) const unordered_set<DataItemId>& s, IDataItemObserver* to)
{ {
string clientName; if (nullptr == to) {
to->getName(clientName); LOC_LOGv("client pointer is NULL.");
list<IDataItemCore*> dataItems(0); } else {
string clientName;
to->getName(clientName);
list<IDataItemCore*> dataItems(0);
for (auto each : l) { for (auto each : s) {
string dv; auto citer = mDataItemCache.find(each);
IDataItemCore* di = mDataItemCache[each]; if (citer != mDataItemCache.end()) {
di->stringify(dv); string dv;
LOC_LOGI("DataItem: %s >> %s", dv.c_str(), clientName.c_str()); citer->second->stringify(dv);
dataItems.push_back(di); LOC_LOGI("DataItem: %s >> %s", dv.c_str(), clientName.c_str());
dataItems.push_front(citer->second);
}
}
if (dataItems.empty()) {
LOC_LOGv("No items to notify.");
} else {
to->notify(dataItems);
}
} }
to->notify(dataItems);
} }
void SystemStatusOsObserver::updateCache(IDataItemCore* d, bool& dataItemUpdated) bool SystemStatusOsObserver::updateCache(IDataItemCore* d)
{ {
if (nullptr == d) { bool dataItemUpdated = false;
return;
}
// Check if data item exists in cache // Request systemstatus to record this dataitem in its cache
map<DataItemId, IDataItemCore*>::iterator citer = // if the return is false, it means that SystemStatus is not
mDataItemCache.find(d->getId()); // handling it, so SystemStatusOsObserver also doesn't.
if (citer == mDataItemCache.end()) { // So it has to be true to proceed.
// New data item; not found in cache if (nullptr != d && mSystemStatus->eventDataItemNotify(d)) {
IDataItemCore* dataitem = DataItemsFactoryProxy::createNewDataItem(d->getId()); auto citer = mDataItemCache.find(d->getId());
if (nullptr == dataitem) { if (citer == mDataItemCache.end()) {
return; // New data item; not found in cache
IDataItemCore* dataitem = DataItemsFactoryProxy::createNewDataItem(d->getId());
if (nullptr != dataitem) {
// Copy the contents of the data item
dataitem->copy(d);
// Insert in mDataItemCache
mDataItemCache.insert(std::make_pair(d->getId(), dataitem));
dataItemUpdated = true;
}
} else {
// Found in cache; Update cache if necessary
citer->second->copy(d, &dataItemUpdated);
} }
// Copy the contents of the data item if (dataItemUpdated) {
dataitem->copy(d); LOC_LOGV("DataItem:%d updated:%d", d->getId(), dataItemUpdated);
pair<DataItemId, IDataItemCore*> cpair(d->getId(), dataitem);
// Insert in mDataItemCache
mDataItemCache.insert(cpair);
dataItemUpdated = true;
}
else {
// Found in cache; Update cache if necessary
if(0 == citer->second->copy(d, &dataItemUpdated)) {
return;
} }
} }
if (dataItemUpdated) { return dataItemUpdated;
LOC_LOGV("DataItem:%d updated:%d", d->getId(), dataItemUpdated);
}
} }
} // namespace loc_core } // namespace loc_core

109
gps/core/SystemStatusOsObserver.h Normal file → Executable file
View file

@ -39,7 +39,9 @@
#include <MsgTask.h> #include <MsgTask.h>
#include <DataItemId.h> #include <DataItemId.h>
#include <IOsObserver.h> #include <IOsObserver.h>
#include <platform_lib_log_util.h> #include <loc_pla.h>
#include <log_util.h>
#include <LocUnorderedSetMap.h>
namespace loc_core namespace loc_core
{ {
@ -47,86 +49,123 @@ namespace loc_core
SystemStatusOsObserver SystemStatusOsObserver
******************************************************************************/ ******************************************************************************/
using namespace std; using namespace std;
using namespace loc_util;
// Forward Declarations // Forward Declarations
class IDataItemCore; class IDataItemCore;
template<typename CT, typename DIT> class IClientIndex; class SystemStatus;
template<typename CT, typename DIT> class IDataItemIndex; class SystemStatusOsObserver;
typedef map<IDataItemObserver*, list<DataItemId>> ObserverReqCache;
typedef LocUnorderedSetMap<IDataItemObserver*, DataItemId> ClientToDataItems;
typedef LocUnorderedSetMap<DataItemId, IDataItemObserver*> DataItemToClients;
typedef unordered_map<DataItemId, IDataItemCore*> DataItemIdToCore;
typedef unordered_map<DataItemId, int> DataItemIdToInt;
struct SystemContext { struct ObserverContext {
IDataItemSubscription* mSubscriptionObj; IDataItemSubscription* mSubscriptionObj;
IFrameworkActionReq* mFrameworkActionReqObj; IFrameworkActionReq* mFrameworkActionReqObj;
const MsgTask* mMsgTask; const MsgTask* mMsgTask;
SystemStatusOsObserver* mSSObserver;
inline SystemContext() : inline ObserverContext(const MsgTask* msgTask, SystemStatusOsObserver* observer) :
mSubscriptionObj(NULL), mSubscriptionObj(NULL), mFrameworkActionReqObj(NULL),
mFrameworkActionReqObj(NULL), mMsgTask(msgTask), mSSObserver(observer) {}
mMsgTask(NULL) {}
}; };
typedef map<IDataItemObserver*, list<DataItemId>> ObserverReqCache;
// Clients wanting to get data from OS/Framework would need to // Clients wanting to get data from OS/Framework would need to
// subscribe with OSObserver using IDataItemSubscription interface. // subscribe with OSObserver using IDataItemSubscription interface.
// Such clients would need to implement IDataItemObserver interface // Such clients would need to implement IDataItemObserver interface
// to receive data when it becomes available. // to receive data when it becomes available.
class SystemStatus;
class SystemStatusOsObserver : public IOsObserver { class SystemStatusOsObserver : public IOsObserver {
public: public:
// ctor // ctor
SystemStatusOsObserver( inline SystemStatusOsObserver(SystemStatus* systemstatus, const MsgTask* msgTask) :
SystemStatus* systemstatus, const MsgTask* msgTask); mSystemStatus(systemstatus), mContext(msgTask, this),
mAddress("SystemStatusOsObserver"),
mClientToDataItems(MAX_DATA_ITEM_ID), mDataItemToClients(MAX_DATA_ITEM_ID)
#ifdef USE_GLIB
, mBackHaulConnectReqCount(0)
#endif
{
}
// dtor // dtor
~SystemStatusOsObserver(); ~SystemStatusOsObserver();
template <typename CINT, typename COUT>
static COUT containerTransfer(CINT& s);
template <typename CINT, typename COUT>
inline static COUT containerTransfer(CINT&& s) {
return containerTransfer<CINT, COUT>(s);
}
// To set the subscription object // To set the subscription object
virtual void setSubscriptionObj(IDataItemSubscription* subscriptionObj); virtual void setSubscriptionObj(IDataItemSubscription* subscriptionObj);
// To set the framework action request object // To set the framework action request object
inline void setFrameworkActionReqObj(IFrameworkActionReq* frameworkActionReqObj) { inline void setFrameworkActionReqObj(IFrameworkActionReq* frameworkActionReqObj) {
mContext.mFrameworkActionReqObj = frameworkActionReqObj; mContext.mFrameworkActionReqObj = frameworkActionReqObj;
#ifdef USE_GLIB
if (mBackHaulConnectReqCount > 0) {
connectBackhaul();
mBackHaulConnectReqCount = 0;
}
#endif
} }
// IDataItemSubscription Overrides // IDataItemSubscription Overrides
virtual void subscribe(const list<DataItemId>& l, IDataItemObserver* client); inline virtual void subscribe(const list<DataItemId>& l, IDataItemObserver* client) override {
virtual void updateSubscription(const list<DataItemId>& l, IDataItemObserver* client); subscribe(l, client, false);
virtual void requestData(const list<DataItemId>& l, IDataItemObserver* client); }
virtual void unsubscribe(const list<DataItemId>& l, IDataItemObserver* client); virtual void updateSubscription(const list<DataItemId>& l, IDataItemObserver* client) override;
virtual void unsubscribeAll(IDataItemObserver* client); inline virtual void requestData(const list<DataItemId>& l, IDataItemObserver* client) override {
subscribe(l, client, true);
}
virtual void unsubscribe(const list<DataItemId>& l, IDataItemObserver* client) override;
virtual void unsubscribeAll(IDataItemObserver* client) override;
// IDataItemObserver Overrides // IDataItemObserver Overrides
virtual void notify(const list<IDataItemCore*>& dlist); virtual void notify(const list<IDataItemCore*>& dlist) override;
inline virtual void getName(string& name) { inline virtual void getName(string& name) override {
name = mAddress; name = mAddress;
} }
// IFrameworkActionReq Overrides // IFrameworkActionReq Overrides
virtual void turnOn(DataItemId dit, int timeOut = 0); virtual void turnOn(DataItemId dit, int timeOut = 0) override;
virtual void turnOff(DataItemId dit); virtual void turnOff(DataItemId dit) override;
#ifdef USE_GLIB
virtual bool connectBackhaul() override;
virtual bool disconnectBackhaul();
#endif
private: private:
SystemStatus* mSystemStatus; SystemStatus* mSystemStatus;
SystemContext mContext; ObserverContext mContext;
const string mAddress; const string mAddress;
IClientIndex<IDataItemObserver*, DataItemId>* mClientIndex; ClientToDataItems mClientToDataItems;
IDataItemIndex<IDataItemObserver*, DataItemId>* mDataItemIndex; DataItemToClients mDataItemToClients;
map<DataItemId, IDataItemCore*> mDataItemCache; DataItemIdToCore mDataItemCache;
map<DataItemId, int> mActiveRequestCount; DataItemIdToInt mActiveRequestCount;
// Cache the subscribe and requestData till subscription obj is obtained // Cache the subscribe and requestData till subscription obj is obtained
ObserverReqCache mSubscribeReqCache;
ObserverReqCache mReqDataCache;
void cacheObserverRequest(ObserverReqCache& reqCache, void cacheObserverRequest(ObserverReqCache& reqCache,
const list<DataItemId>& l, IDataItemObserver* client); const list<DataItemId>& l, IDataItemObserver* client);
#ifdef USE_GLIB
// Cache the framework action request for connect/disconnect
int mBackHaulConnectReqCount;
#endif
void subscribe(const list<DataItemId>& l, IDataItemObserver* client, bool toRequestData);
// Helpers // Helpers
void sendFirstResponse(const list<DataItemId>& l, IDataItemObserver* to); void sendCachedDataItems(const unordered_set<DataItemId>& s, IDataItemObserver* to);
void sendCachedDataItems(const list<DataItemId>& l, IDataItemObserver* to); bool updateCache(IDataItemCore* d);
void updateCache(IDataItemCore* d, bool& dataItemUpdated); inline void logMe(const unordered_set<DataItemId>& l) {
inline void logMe(const list<DataItemId>& l) { IF_LOC_LOGD {
for (auto id : l) { for (auto id : l) {
LOC_LOGD("DataItem %d", id); LOC_LOGD("DataItem %d", id);
}
} }
} }
}; };

0
gps/core/UlpProxyBase.h Normal file → Executable file
View file

83
gps/core/data-items/DataItemConcreteTypesBase.h Normal file → Executable file
View file

@ -221,9 +221,22 @@ protected:
class NetworkInfoDataItemBase : public IDataItemCore { class NetworkInfoDataItemBase : public IDataItemCore {
public: public:
enum NetworkType {
TYPE_MOBILE,
TYPE_WIFI,
TYPE_ETHERNET,
TYPE_BLUETOOTH,
TYPE_MMS,
TYPE_SUPL,
TYPE_DUN,
TYPE_HIPRI,
TYPE_WIMAX,
TYPE_UNKNOWN,
};
NetworkInfoDataItemBase( NetworkInfoDataItemBase(
int32_t type, string typeName, string subTypeName, NetworkType initialType, int32_t type, string typeName, string subTypeName,
bool available, bool connected, bool roaming ): bool available, bool connected, bool roaming ):
mAllTypes(typeToAllTypes(initialType)),
mType(type), mType(type),
mTypeName(typeName), mTypeName(typeName),
mSubTypeName(subTypeName), mSubTypeName(subTypeName),
@ -235,22 +248,12 @@ public:
inline virtual DataItemId getId() { return mId; } inline virtual DataItemId getId() { return mId; }
virtual void stringify(string& /*valueStr*/) {} virtual void stringify(string& /*valueStr*/) {}
virtual int32_t copy(IDataItemCore* /*src*/, bool* /*dataItemCopied = NULL*/) {return 1;} virtual int32_t copy(IDataItemCore* /*src*/, bool* /*dataItemCopied = NULL*/) {return 1;}
enum NetworkType {
TYPE_UNKNOWN,
TYPE_MOBILE,
TYPE_WIFI,
TYPE_ETHERNET,
TYPE_BLUETOOTH,
TYPE_MMS,
TYPE_SUPL,
TYPE_DUN,
TYPE_HIPRI,
TYPE_WIMAX
};
inline virtual NetworkType getType(void) const { inline virtual NetworkType getType(void) const {
return (NetworkType)mType; return (NetworkType)mType;
} }
// Data members inline uint64_t getAllTypes() { return mAllTypes; }
// Data members
uint64_t mAllTypes;
int32_t mType; int32_t mType;
string mTypeName; string mTypeName;
string mSubTypeName; string mSubTypeName;
@ -259,7 +262,9 @@ public:
bool mRoaming; bool mRoaming;
protected: protected:
DataItemId mId; DataItemId mId;
inline uint64_t typeToAllTypes(NetworkType type) {
return (type >= TYPE_UNKNOWN || type < TYPE_MOBILE) ? 0 : (1<<type);
}
}; };
class ServiceStatusDataItemBase : public IDataItemCore { class ServiceStatusDataItemBase : public IDataItemCore {
@ -309,24 +314,42 @@ protected:
class RilServiceInfoDataItemBase : public IDataItemCore { class RilServiceInfoDataItemBase : public IDataItemCore {
public: public:
RilServiceInfoDataItemBase() : inline RilServiceInfoDataItemBase() :
mId(RILSERVICEINFO_DATA_ITEM_ID) {} mData(nullptr), mId(RILSERVICEINFO_DATA_ITEM_ID) {}
virtual ~RilServiceInfoDataItemBase() {} inline virtual ~RilServiceInfoDataItemBase() { if (nullptr != mData) free(mData); }
inline virtual DataItemId getId() { return mId; } inline virtual DataItemId getId() { return mId; }
virtual void stringify(string& /*valueStr*/) {} virtual void stringify(string& /*valueStr*/) {}
virtual int32_t copy(IDataItemCore* /*src*/, bool* /*dataItemCopied = NULL*/) {return 1;} virtual int32_t copy(IDataItemCore* /*src*/, bool* /*dataItemCopied = NULL*/) {return 1;}
inline RilServiceInfoDataItemBase(const RilServiceInfoDataItemBase& peer) :
RilServiceInfoDataItemBase() {
peer.setPeerData(*this);
}
inline virtual bool operator==(const RilServiceInfoDataItemBase& other) const {
return other.mData == mData;
}
inline virtual void setPeerData(RilServiceInfoDataItemBase& /*peer*/) const {}
void* mData;
protected: protected:
DataItemId mId; DataItemId mId;
}; };
class RilCellInfoDataItemBase : public IDataItemCore { class RilCellInfoDataItemBase : public IDataItemCore {
public: public:
RilCellInfoDataItemBase() : inline RilCellInfoDataItemBase() :
mId(RILCELLINFO_DATA_ITEM_ID) {} mData(nullptr), mId(RILCELLINFO_DATA_ITEM_ID) {}
virtual ~RilCellInfoDataItemBase() {} inline virtual ~RilCellInfoDataItemBase() { if (nullptr != mData) free(mData); }
inline virtual DataItemId getId() { return mId; } inline virtual DataItemId getId() { return mId; }
virtual void stringify(string& /*valueStr*/) {} virtual void stringify(string& /*valueStr*/) {}
virtual int32_t copy(IDataItemCore* /*src*/, bool* /*dataItemCopied = NULL*/) {return 1;} virtual int32_t copy(IDataItemCore* /*src*/, bool* /*dataItemCopied = NULL*/) {return 1;}
inline RilCellInfoDataItemBase(const RilCellInfoDataItemBase& peer) :
RilCellInfoDataItemBase() {
peer.setPeerData(*this);
}
inline virtual bool operator==(const RilCellInfoDataItemBase& other) const {
return other.mData == mData;
}
inline virtual void setPeerData(RilCellInfoDataItemBase& /*peer*/) const {}
void* mData;
protected: protected:
DataItemId mId; DataItemId mId;
}; };
@ -393,7 +416,7 @@ protected:
class MccmncDataItemBase : public IDataItemCore { class MccmncDataItemBase : public IDataItemCore {
public: public:
MccmncDataItemBase(const string & name) : MccmncDataItemBase(const string & name) :
mValue (name), mValue(name),
mId(MCCMNC_DATA_ITEM_ID) {} mId(MCCMNC_DATA_ITEM_ID) {}
virtual ~MccmncDataItemBase() {} virtual ~MccmncDataItemBase() {}
inline virtual DataItemId getId() { return mId; } inline virtual DataItemId getId() { return mId; }
@ -407,7 +430,7 @@ protected:
class SrnDeviceScanDetailsDataItemBase : public IDataItemCore { class SrnDeviceScanDetailsDataItemBase : public IDataItemCore {
public: public:
SrnDeviceScanDetailsDataItemBase (DataItemId Id) : SrnDeviceScanDetailsDataItemBase(DataItemId Id) :
mValidSrnData(false), mValidSrnData(false),
mApSrnRssi(-1), mApSrnRssi(-1),
mApSrnTimestamp(0), mApSrnTimestamp(0),
@ -415,7 +438,7 @@ public:
mReceiveTimestamp(0), mReceiveTimestamp(0),
mErrorCause(-1), mErrorCause(-1),
mId(Id) {} mId(Id) {}
virtual ~SrnDeviceScanDetailsDataItemBase () {} virtual ~SrnDeviceScanDetailsDataItemBase() {}
inline virtual DataItemId getId() { return mId; } inline virtual DataItemId getId() { return mId; }
// Data members common to all SRN tech types // Data members common to all SRN tech types
/* Represents info on whether SRN data is valid (no error)*/ /* Represents info on whether SRN data is valid (no error)*/
@ -456,6 +479,18 @@ public:
virtual int32_t copy(IDataItemCore* /*src*/, bool* /*dataItemCopied = NULL*/) {return 1;} virtual int32_t copy(IDataItemCore* /*src*/, bool* /*dataItemCopied = NULL*/) {return 1;}
}; };
class BatteryLevelDataItemBase : public IDataItemCore {
public:
inline BatteryLevelDataItemBase(uint8_t batteryPct) :
mBatteryPct(batteryPct), mId(BATTERY_LEVEL_DATA_ITEM_ID) {}
inline ~BatteryLevelDataItemBase() {}
inline virtual DataItemId getId() { return mId; }
// Data members
uint8_t mBatteryPct;
protected:
DataItemId mId;
};
} // namespace loc_core } // namespace loc_core
#endif //__DATAITEMCONCRETEBASETYPES__ #endif //__DATAITEMCONCRETEBASETYPES__

8
gps/core/data-items/DataItemId.h Normal file → Executable file
View file

@ -67,7 +67,13 @@ typedef enum e_DataItemId {
BTLE_SCAN_DATA_ITEM_ID, BTLE_SCAN_DATA_ITEM_ID,
BT_SCAN_DATA_ITEM_ID, BT_SCAN_DATA_ITEM_ID,
OEM_GTP_UPLOAD_TRIGGER_READY_ITEM_ID, OEM_GTP_UPLOAD_TRIGGER_READY_ITEM_ID,
MAX_DATA_ITEM_ID
MAX_DATA_ITEM_ID,
// 26 -
BATTERY_LEVEL_DATA_ITEM_ID,
MAX_DATA_ITEM_ID_1_1,
} DataItemId; } DataItemId;
#endif // #ifndef __DATAITEMID_H__ #endif // #ifndef __DATAITEMID_H__

5
gps/core/data-items/DataItemsFactoryProxy.cpp Normal file → Executable file
View file

@ -32,7 +32,8 @@
#include <DataItemId.h> #include <DataItemId.h>
#include <IDataItemCore.h> #include <IDataItemCore.h>
#include <DataItemsFactoryProxy.h> #include <DataItemsFactoryProxy.h>
#include <platform_lib_log_util.h> #include <loc_pla.h>
#include <log_util.h>
namespace loc_core namespace loc_core
{ {
@ -68,7 +69,7 @@ IDataItemCore* DataItemsFactoryProxy::createNewDataItem(DataItemId id)
getConcreteDIFunc = (get_concrete_data_item_fn * ) getConcreteDIFunc = (get_concrete_data_item_fn * )
dlsym(dataItemLibHandle, DATA_ITEMS_GET_CONCRETE_DI); dlsym(dataItemLibHandle, DATA_ITEMS_GET_CONCRETE_DI);
if (NULL != getConcreteDIFunc) { if (NULL != getConcreteDIFunc) {
LOC_LOGD("Loaded function %s : %x",DATA_ITEMS_GET_CONCRETE_DI,getConcreteDIFunc); LOC_LOGD("Loaded function %s : %p",DATA_ITEMS_GET_CONCRETE_DI,getConcreteDIFunc);
mydi = (*getConcreteDIFunc)(id); mydi = (*getConcreteDIFunc)(id);
} }
else { else {

0
gps/core/data-items/DataItemsFactoryProxy.h Normal file → Executable file
View file

0
gps/core/data-items/IDataItemCore.h Normal file → Executable file
View file

View file

@ -1,171 +0,0 @@
/* Copyright (c) 2015, 2017 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 <algorithm>
#include <iterator>
#include <string>
#include <platform_lib_log_util.h>
#include <ClientIndex.h>
#include <IDataItemObserver.h>
#include <DataItemId.h>
using namespace std;
using namespace loc_core;
template <typename CT, typename DIT>
inline ClientIndex <CT,DIT> :: ClientIndex () {}
template <typename CT, typename DIT>
inline ClientIndex <CT,DIT> :: ~ClientIndex () {}
template <typename CT, typename DIT>
bool ClientIndex <CT,DIT> :: isSubscribedClient (CT client) {
bool result = false;
ENTRY_LOG ();
typename map < CT, list <DIT> > :: iterator it =
mDataItemsPerClientMap.find (client);
if (it != mDataItemsPerClientMap.end ()) {
result = true;
}
EXIT_LOG_WITH_ERROR ("%d",result);
return result;
}
template <typename CT, typename DIT>
void ClientIndex <CT,DIT> :: getSubscribedList (CT client, list <DIT> & out) {
ENTRY_LOG ();
typename map < CT, list <DIT> > :: iterator it =
mDataItemsPerClientMap.find (client);
if (it != mDataItemsPerClientMap.end ()) {
out = it->second;
}
EXIT_LOG_WITH_ERROR ("%d",0);
}
template <typename CT, typename DIT>
int ClientIndex <CT,DIT> :: remove (CT client) {
int result = 0;
ENTRY_LOG ();
mDataItemsPerClientMap.erase (client);
EXIT_LOG_WITH_ERROR ("%d",result);
return result;
}
template <typename CT, typename DIT>
void ClientIndex <CT,DIT> :: remove (const list <DIT> & r, list <CT> & out) {
ENTRY_LOG ();
typename map < CT, list <DIT> > :: iterator dicIter =
mDataItemsPerClientMap.begin ();
while (dicIter != mDataItemsPerClientMap.end()) {
typename list <DIT> :: const_iterator it = r.begin ();
for (; it != r.end (); ++it) {
typename list <DIT> :: iterator iter =
find (dicIter->second.begin (), dicIter->second.end (), *it);
if (iter != dicIter->second.end ()) {
dicIter->second.erase (iter);
}
}
if (dicIter->second.empty ()) {
out.push_back (dicIter->first);
// Post-increment operator increases the iterator but returns the
// prevous one that will be invalidated by erase()
mDataItemsPerClientMap.erase (dicIter++);
} else {
++dicIter;
}
}
EXIT_LOG_WITH_ERROR ("%d",0);
}
template <typename CT, typename DIT>
void ClientIndex <CT,DIT> :: remove
(
CT client,
const list <DIT> & r,
list <DIT> & out
)
{
ENTRY_LOG ();
typename map < CT, list <DIT> > :: iterator dicIter =
mDataItemsPerClientMap.find (client);
if (dicIter != mDataItemsPerClientMap.end ()) {
set_intersection (dicIter->second.begin (), dicIter->second.end (),
r.begin (), r.end (),
inserter (out,out.begin ()));
if (!out.empty ()) {
typename list <DIT> :: iterator it = out.begin ();
for (; it != out.end (); ++it) {
dicIter->second.erase (find (dicIter->second.begin (),
dicIter->second.end (),
*it));
}
}
if (dicIter->second.empty ()) {
mDataItemsPerClientMap.erase (dicIter);
EXIT_LOG_WITH_ERROR ("%d",0);
}
}
EXIT_LOG_WITH_ERROR ("%d",0);
}
template <typename CT, typename DIT>
void ClientIndex <CT,DIT> :: add
(
CT client,
const list <DIT> & l,
list <DIT> & out
)
{
ENTRY_LOG ();
list <DIT> difference;
typename map < CT, list <DIT> > :: iterator dicIter =
mDataItemsPerClientMap.find (client);
if (dicIter != mDataItemsPerClientMap.end ()) {
set_difference (l.begin (), l.end (),
dicIter->second.begin (), dicIter->second.end (),
inserter (difference,difference.begin ()));
if (!difference.empty ()) {
difference.sort ();
out = difference;
dicIter->second.merge (difference);
dicIter->second.unique ();
}
} else {
out = l;
pair < CT, list <DIT> > dicnpair (client, out);
mDataItemsPerClientMap.insert (dicnpair);
}
EXIT_LOG_WITH_ERROR ("%d",0);
}
// Explicit instantiation must occur in same namespace where class is defined
namespace loc_core
{
template class ClientIndex <IDataItemObserver *, DataItemId>;
template class ClientIndex <string, DataItemId>;
}

View file

@ -1,70 +0,0 @@
/* Copyright (c) 2015, 2017 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 __CLIENTINDEX_H__
#define __CLIENTINDEX_H__
#include <list>
#include <map>
#include <IClientIndex.h>
using loc_core::IClientIndex;
namespace loc_core
{
template <typename CT, typename DIT>
class ClientIndex : public IClientIndex <CT, DIT> {
public:
ClientIndex ();
~ClientIndex ();
bool isSubscribedClient (CT client);
void getSubscribedList (CT client, std :: list <DIT> & out);
int remove (CT client);
void remove (const std :: list <DIT> & r, std :: list <CT> & out);
void remove (CT client, const std :: list <DIT> & r, std :: list <DIT> & out);
void add (CT client, const std :: list <DIT> & l, std :: list <DIT> & out);
private:
//Data members
std :: map < CT , std :: list <DIT> > mDataItemsPerClientMap;
};
} // namespace loc_core
#endif // #ifndef __CLIENTINDEX_H__

View file

@ -1,202 +0,0 @@
/* Copyright (c) 2015, 2017 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>
#include <algorithm>
#include <iterator>
#include <DataItemIndex.h>
#include <platform_lib_log_util.h>
#include <IDataItemObserver.h>
#include <DataItemId.h>
using namespace std;
using namespace loc_core;
template <typename CT, typename DIT>
inline DataItemIndex <CT,DIT> :: DataItemIndex () {}
template <typename CT, typename DIT>
inline DataItemIndex <CT,DIT> :: ~DataItemIndex () {}
template <typename CT, typename DIT>
void DataItemIndex <CT,DIT> :: getListOfSubscribedClients
(
DIT id,
list <CT> & out
)
{
typename map < DIT, list <CT> > :: iterator cdiIter =
mClientsPerDataItemMap.find (id);
if (cdiIter != mClientsPerDataItemMap.end ()) {
out = cdiIter->second;
}
}
template <typename CT, typename DIT>
int DataItemIndex <CT,DIT> :: remove (DIT id) {
int result = 0;
ENTRY_LOG ();
mClientsPerDataItemMap.erase (id);
EXIT_LOG_WITH_ERROR ("%d",result);
return result;
}
template <typename CT, typename DIT>
void DataItemIndex <CT,DIT> :: remove (const list <CT> & r, list <DIT> & out) {
ENTRY_LOG ();
typename map < DIT, list <CT> > :: iterator cdiIter =
mClientsPerDataItemMap.begin ();
while (cdiIter != mClientsPerDataItemMap.end()) {
typename list <CT> :: const_iterator it = r.begin ();
for (; it != r.end (); ++it) {
typename list <CT> :: iterator iter =
find
(
cdiIter->second.begin (),
cdiIter->second.end (),
*it
);
if (iter != cdiIter->second.end ()) {
cdiIter->second.erase (iter);
}
}
if (cdiIter->second.empty ()) {
out.push_back (cdiIter->first);
// Post-increment operator increases the iterator but returns the
// prevous one that will be invalidated by erase()
mClientsPerDataItemMap.erase (cdiIter++);
} else {
++cdiIter;
}
}
EXIT_LOG_WITH_ERROR ("%d",0);
}
template <typename CT, typename DIT>
void DataItemIndex <CT,DIT> :: remove
(
DIT id,
const list <CT> & r,
list <CT> & out
)
{
ENTRY_LOG ();
typename map < DIT, list <CT> > :: iterator cdiIter =
mClientsPerDataItemMap.find (id);
if (cdiIter != mClientsPerDataItemMap.end ()) {
set_intersection (cdiIter->second.begin (), cdiIter->second.end (),
r.begin (), r.end (),
inserter (out, out.begin ()));
if (!out.empty ()) {
typename list <CT> :: iterator it = out.begin ();
for (; it != out.end (); ++it) {
cdiIter->second.erase (find (cdiIter->second.begin (),
cdiIter->second.end (),
*it));
}
}
if (cdiIter->second.empty ()) {
mClientsPerDataItemMap.erase (cdiIter);
EXIT_LOG_WITH_ERROR ("%d",0);
}
}
EXIT_LOG_WITH_ERROR ("%d",0);
}
template <typename CT, typename DIT>
void DataItemIndex <CT,DIT> :: add
(
DIT id,
const list <CT> & l,
list <CT> & out
)
{
ENTRY_LOG ();
list <CT> difference;
typename map < DIT, list <CT> > :: iterator cdiIter =
mClientsPerDataItemMap.find (id);
if (cdiIter != mClientsPerDataItemMap.end ()) {
set_difference (l.begin (), l.end (),
cdiIter->second.begin (), cdiIter->second.end (),
inserter (difference, difference.begin ()));
if (!difference.empty ()) {
difference.sort ();
out = difference;
cdiIter->second.merge (difference);
}
} else {
out = l;
pair < DIT, list <CT> > cndipair (id, out);
mClientsPerDataItemMap.insert (cndipair);
}
EXIT_LOG_WITH_ERROR ("%d",0);
}
template <typename CT, typename DIT>
void DataItemIndex <CT,DIT> :: add
(
CT client,
const list <DIT> & l,
list <DIT> & out
)
{
ENTRY_LOG ();
typename map < DIT, list <CT> > :: iterator cdiIter;
typename list <DIT> :: const_iterator it = l.begin ();
for (; it != l.end (); ++it) {
cdiIter = mClientsPerDataItemMap.find (*it);
if (cdiIter == mClientsPerDataItemMap.end ()) {
out.push_back (*it);
pair < DIT, list <CT> > cndiPair (*it, list <CT> (1, client));
mClientsPerDataItemMap.insert (cndiPair);
} else {
typename list<CT> :: iterator clientIter =
find
(
cdiIter->second.begin (),
cdiIter->second.end (),
client
);
if (clientIter == cdiIter->second.end()) {
cdiIter->second.push_back (client);
}
}
}
EXIT_LOG_WITH_ERROR ("%d",0);
}
// Explicit instantiation must occur in same namespace where class is defined
namespace loc_core
{
template class DataItemIndex <IDataItemObserver *, DataItemId>;
template class DataItemIndex <string, DataItemId>;
}

View file

@ -1,70 +0,0 @@
/* Copyright (c) 2015, 2017 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 __DATAITEMINDEX_H__
#define __DATAITEMINDEX_H__
#include <list>
#include <map>
#include <IDataItemIndex.h>
using loc_core::IDataItemIndex;
namespace loc_core
{
template <typename CT, typename DIT>
class DataItemIndex : public IDataItemIndex <CT, DIT> {
public:
DataItemIndex ();
~DataItemIndex ();
void getListOfSubscribedClients (DIT id, std :: list <CT> & out);
int remove (DIT id);
void remove (const std :: list <CT> & r, std :: list <DIT> & out);
void remove (DIT id, const std :: list <CT> & r, std :: list <CT> & out);
void add (DIT id, const std :: list <CT> & l, std :: list <CT> & out);
void add (CT client, const std :: list <DIT> & l, std :: list <DIT> & out);
private:
std :: map < DIT, std :: list <CT> > mClientsPerDataItemMap;
};
} // namespace loc_core
#endif // #ifndef __DATAITEMINDEX_H__

View file

@ -1,83 +0,0 @@
/* Copyright (c) 2015, 2017 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 __ICLIENTINDEX_H__
#define __ICLIENTINDEX_H__
#include <list>
namespace loc_core
{
template <typename CT, typename DIT>
class IClientIndex {
public:
// Checks if client is subscribed
virtual bool isSubscribedClient (CT client) = 0;
// gets subscription list
virtual void getSubscribedList (CT client, std :: list <DIT> & out) = 0;
// removes an entry
virtual int remove (CT client) = 0;
// removes std :: list of data items and returns a list of clients
// removed if any.
virtual void remove
(
const std :: list <DIT> & r,
std :: list <CT> & out
) = 0;
// removes list of data items indexed by client and returns list
// of data items removed if any.
virtual void remove
(
CT client,
const std :: list <DIT> & r,
std :: list <DIT> & out
) = 0;
// adds/modifies entry in map and returns new data items added.
virtual void add
(
CT client,
const std :: list <DIT> & l,
std :: list <DIT> & out
) = 0;
// dtor
virtual ~IClientIndex () {}
};
} // namespace loc_core
#endif // #ifndef __ICLIENTINDEX_H__

View file

@ -1,94 +0,0 @@
/* Copyright (c) 2015, 2017 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 __IDATAITEMINDEX_H__
#define __IDATAITEMINDEX_H__
#include <list>
namespace loc_core
{
template <typename CT, typename DIT>
class IDataItemIndex {
public:
// gets std :: list of subscribed clients
virtual void getListOfSubscribedClients
(
DIT id,
std :: list <CT> & out
) = 0;
// removes an entry from
virtual int remove (DIT id) = 0;
// removes list of clients and returns a list of data items
// removed if any.
virtual void remove
(
const std :: list <CT> & r,
std :: list <DIT> & out
) = 0;
// removes list of clients indexed by data item and returns list of
// clients removed if any.
virtual void remove
(
DIT id,
const std :: list <CT> & r,
std :: list <CT> & out
) = 0;
// adds/modifies entry and returns new clients added
virtual void add
(
DIT id,
const std :: list <CT> & l,
std :: list <CT> & out
) = 0;
// adds/modifies entry and returns yet to subscribe list of data items
virtual void add
(
CT client,
const std :: list <DIT> & l,
std :: list <DIT> & out
) = 0;
// dtor
virtual ~IDataItemIndex () {}
};
} // namespace loc_core
#endif // #ifndef __IDATAITEMINDEX_H__

View file

@ -1,64 +0,0 @@
/* Copyright (c) 2015, 2017 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>
#include <IndexFactory.h>
#include <IClientIndex.h>
#include <ClientIndex.h>
#include <IDataItemIndex.h>
#include <DataItemIndex.h>
#include <IDataItemObserver.h>
#include <DataItemId.h>
using namespace std;
using loc_core::IClientIndex;
using loc_core::IDataItemIndex;
using loc_core::IDataItemObserver;
using namespace loc_core;
template <typename CT, typename DIT>
inline IClientIndex <CT, DIT> * IndexFactory <CT, DIT> :: createClientIndex
()
{
return new (nothrow) ClientIndex <CT, DIT> ();
}
template <typename CT, typename DIT>
inline IDataItemIndex <CT, DIT> * IndexFactory <CT, DIT> :: createDataItemIndex
()
{
return new (nothrow) DataItemIndex <CT, DIT> ();
}
// Explicit instantiation must occur in same namespace where class is defined
namespace loc_core
{
template class IndexFactory <IDataItemObserver *, DataItemId>;
template class IndexFactory <string, DataItemId>;
}

View file

@ -1,48 +0,0 @@
/* Copyright (c) 2015, 2017 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 __INDEXFACTORY_H__
#define __INDEXFACTORY_H__
#include <IClientIndex.h>
#include <IDataItemIndex.h>
namespace loc_core
{
template <typename CT, typename DIT>
class IndexFactory {
public:
static IClientIndex <CT, DIT> * createClientIndex ();
static IDataItemIndex <CT, DIT> * createDataItemIndex ();
};
} // namespace loc_core
#endif // #ifndef __INDEXFACTORY_H__

23
gps/core/loc_core_log.cpp Normal file → Executable file
View file

@ -30,9 +30,10 @@
#define LOG_NDEBUG 0 #define LOG_NDEBUG 0
#define LOG_TAG "LocSvc_core_log" #define LOG_TAG "LocSvc_core_log"
#include <log_util.h>
#include <loc_log.h> #include <loc_log.h>
#include <loc_core_log.h> #include <loc_core_log.h>
#include <platform_lib_includes.h> #include <loc_pla.h>
void LocPosMode::logv() const void LocPosMode::logv() const
{ {
@ -100,26 +101,6 @@ const char* loc_get_position_recurrence_name(LocGpsPositionRecurrence recur)
return loc_get_name_from_val(loc_eng_position_recurrences, loc_eng_position_recurrence_num, (long) recur); return loc_get_name_from_val(loc_eng_position_recurrences, loc_eng_position_recurrence_num, (long) recur);
} }
static const loc_name_val_s_type loc_eng_aiding_data_bits[] =
{
NAME_VAL( LOC_GPS_DELETE_EPHEMERIS ),
NAME_VAL( LOC_GPS_DELETE_ALMANAC ),
NAME_VAL( LOC_GPS_DELETE_POSITION ),
NAME_VAL( LOC_GPS_DELETE_TIME ),
NAME_VAL( LOC_GPS_DELETE_IONO ),
NAME_VAL( LOC_GPS_DELETE_UTC ),
NAME_VAL( LOC_GPS_DELETE_HEALTH ),
NAME_VAL( LOC_GPS_DELETE_SVDIR ),
NAME_VAL( LOC_GPS_DELETE_SVSTEER ),
NAME_VAL( LOC_GPS_DELETE_SADATA ),
NAME_VAL( LOC_GPS_DELETE_RTI ),
NAME_VAL( LOC_GPS_DELETE_CELLDB_INFO ),
NAME_VAL( LOC_GPS_DELETE_ALL)
};
static const 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(LocGpsAidingData /*data*/) const char* loc_get_aiding_data_mask_names(LocGpsAidingData /*data*/)
{ {
return NULL; return NULL;

0
gps/core/loc_core_log.h Normal file → Executable file
View file

0
gps/core/observer/IDataItemObserver.h Normal file → Executable file
View file

0
gps/core/observer/IDataItemSubscription.h Normal file → Executable file
View file

Some files were not shown because too many files have changed in this diff Show more