/*
* Copyright (C) 2016 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.
*/
#define LOG_TAG "GnssHAL_GnssInterface"
#include <Gnss.h>
#include <GnssUtils.h>
#include <utils/SystemClock.h>
namespace android {
namespace hardware {
namespace gnss {
namespace V2_0 {
namespace implementation {
using ::android::hardware::gnss::measurement_corrections::V1_0::implementation::
GnssMeasurementCorrections;
using ::android::hardware::gnss::visibility_control::V1_0::implementation::GnssVisibilityControl;
sp<V2_0::IGnssCallback> Gnss::sGnssCallback_2_0 = nullptr;
sp<V1_1::IGnssCallback> Gnss::sGnssCallback_1_1 = nullptr;
std::vector<std::unique_ptr<ThreadFuncArgs>> Gnss::sThreadFuncArgsList;
sp<V1_0::IGnssCallback> Gnss::sGnssCbIface = nullptr;
bool Gnss::sInterfaceExists = false;
bool Gnss::sWakelockHeldGnss = false;
bool Gnss::sWakelockHeldFused = false;
GpsCallbacks Gnss::sGnssCb = {
.size = sizeof(GpsCallbacks),
.location_cb = locationCb,
.status_cb = statusCb,
.sv_status_cb = gpsSvStatusCb,
.nmea_cb = nmeaCb,
.set_capabilities_cb = setCapabilitiesCb,
.acquire_wakelock_cb = acquireWakelockCb,
.release_wakelock_cb = releaseWakelockCb,
.create_thread_cb = createThreadCb,
.request_utc_time_cb = requestUtcTimeCb,
.set_system_info_cb = setSystemInfoCb,
.gnss_sv_status_cb = gnssSvStatusCb,
};
uint32_t Gnss::sCapabilitiesCached = 0;
uint16_t Gnss::sYearOfHwCached = 0;
Gnss::Gnss(gps_device_t* gnssDevice) :
mDeathRecipient(new GnssHidlDeathRecipient(this)) {
/* Error out if an instance of the interface already exists. */
LOG_ALWAYS_FATAL_IF(sInterfaceExists);
sInterfaceExists = true;
if (gnssDevice == nullptr) {
ALOGE("%s: Invalid device_t handle", __func__);
return;
}
mGnssIface = gnssDevice->get_gps_interface(gnssDevice);
}
Gnss::~Gnss() {
sInterfaceExists = false;
sThreadFuncArgsList.clear();
}
void Gnss::locationCb(GpsLocation* location) {
if (sGnssCbIface == nullptr && sGnssCallback_1_1 == nullptr && sGnssCallback_2_0 == nullptr) {
ALOGE("%s: GNSS Callback Interface configured incorrectly", __func__);
return;
}
if (location == nullptr) {
ALOGE("%s: Invalid location from GNSS HAL", __func__);
return;
}
android::hardware::gnss::V1_0::GnssLocation gnssLocation_1_0 = V1_0::implementation::convertToGnssLocation(location);
if(sGnssCallback_2_0 != nullptr) {
//ALOGE("%s: ceshi is here0", __func__);
const ElapsedRealtime timestamp = {
.flags = ElapsedRealtimeFlags::HAS_TIMESTAMP_NS |
ElapsedRealtimeFlags::HAS_TIME_UNCERTAINTY_NS,
.timestampNs = static_cast<uint64_t>(::android::elapsedRealtimeNano()),
.timeUncertaintyNs = 1000000};
V2_0::GnssLocation gnssLocation = {.v1_0 = gnssLocation_1_0, .elapsedRealtime = timestamp};
auto ret = sGnssCallback_2_0->gnssLocationCb_2_0(gnssLocation);
if (!ret.isOk()) {
ALOGE("%s: Unable to invoke callback", __func__);
}
} else if(sGnssCallback_1_1 != nullptr) {
//ALOGE("%s: ceshi is here1", __func__);
auto ret = sGnssCallback_1_1->gnssLocationCb(gnssLocation_1_0);
if (!ret.isOk()) {
ALOGE("%s: Unable to invoke callback", __func__);
}
} else if(sGnssCbIface != nullptr) {
//ALOGE("%s: ceshi is here2", __func__);
auto ret = sGnssCbIface->gnssLocationCb(gnssLocation_1_0);
if (!ret.isOk()) {
ALOGE("%s: Unable to invoke callback", __func__);
}
}
}
void Gnss::statusCb(GpsStatus* gnssStatus) {
if (sGnssCbIface == nullptr && sGnssCallback_1_1 == nullptr && sGnssCallback_2_0 == nullptr) {
ALOGE("%s: GNSS Callback Interface configured incorrectly", __func__);
return;
}
if (gnssStatus == nullptr) {
ALOGE("%s: Invalid GpsStatus from GNSS HAL", __func__);
return;
}
IGnssCallback::GnssStatusValue status = static_cast<IGnssCallback::GnssStatusValue>(gnssStatus->status);
if(sGnssCallback_2_0 != nullptr) {
auto ret = sGnssCallback_2_0->gnssStatusCb(status);
if (!ret.isOk()) {
ALOGE("%s: Unable to invoke callback", __func__);
}
} else if(sGnssCallback_1_1 != nullptr) {
auto ret = sGnssCallback_1_1->gnssStatusCb(status);
if (!ret.isOk()) {
ALOGE("%s: Unable to invoke callback", __func__);
}
} else if(sGnssCbIface != nullptr) {
auto ret = sGnssCbIface->gnssStatusCb(status);
if (!ret.isOk()) {
ALOGE("%s: Unable to invoke callback", __func__);
}
}
}
void Gnss::gnssSvStatusCb(GnssSvStatus* status) {
if (sGnssCbIface == nullptr && sGnssCallback_1_1 == nullptr && sGnssCallback_2_0 == nullptr) {
ALOGE("%s: GNSS Callback Interface configured incorrectly", __func__);
return;
}
if (status == nullptr) {
ALOGE("Invalid status from GNSS HAL %s", __func__);
return;
}
IGnssCallback::GnssSvStatus svStatus;
svStatus.numSvs = status->num_svs;
if (svStatus.numSvs > static_cast<uint32_t>(V1_0::GnssMax::SVS_COUNT)) {
ALOGW("Too many satellites %u. Clamps to %d.", svStatus.numSvs, V1_0::GnssMax::SVS_COUNT);
svStatus.numSvs = static_cast<uint32_t>(V1_0::GnssMax::SVS_COUNT);
}
for (size_t i = 0; i < svStatus.numSvs; i++) {
auto svInfo = status->gnss_sv_list[i];
V1_0::IGnssCallback::GnssSvInfo gnssSvInfo = {
.svid = svInfo.svid,
.constellation = static_cast<
android::hardware::gnss::V1_0::GnssConstellationType>(
svInfo.constellation),
.cN0Dbhz = svInfo.c_n0_dbhz,
.elevationDegrees = svInfo.elevation,
.azimuthDegrees = svInfo.azimuth,
// Older chipsets do not provide carrier frequency, hence
// HAS_CARRIER_FREQUENCY flag and the carrierFrequencyHz fields
// are not set. So we are resetting both fields here.
//.svFlag = static_cast<uint8_t>(
// svInfo.flags &= ~(static_cast<uint8_t>(
// V1_0::IGnssCallback::GnssSvFlags::HAS_CARRIER_FREQUENCY))),
.svFlag = svInfo.flags,
.carrierFrequencyHz = 1111*1e6F};
svStatus.gnssSvList[i] = gnssSvInfo;
}
if(sGnssCallback_2_0 != nullptr) {
auto ret = sGnssCallback_2_0->gnssSvStatusCb(svStatus);
if (!ret.isOk()) {
ALOGE("%s: Unable to invoke callback", __func__);
}
} else if(sGnssCallback_1_1 != nullptr) {
auto ret = sGnssCallback_1_1->gnssSvStatusCb(svStatus);
if (!ret.isOk()) {
ALOGE("%s: Unable to invoke callback", __func__);
}
} else if(sGnssCbIface != nullptr) {
auto ret = sGnssCbIface->gnssSvStatusCb(svStatus);
if (!ret.isOk()) {
ALOGE("%s: Unable to invoke callback", __func__);
}
}
}
/*
* This enum is used by gpsSvStatusCb() method below to convert GpsSvStatus
* to GnssSvStatus for backward compatibility. It is only used by the default
* implementation and is not part of the GNSS interface.
*/
enum SvidValues : uint16_t {
GLONASS_SVID_OFFSET = 64,
GLONASS_SVID_COUNT = 24,
BEIDOU_SVID_OFFSET = 200,
BEIDOU_SVID_COUNT = 35,
SBAS_SVID_MIN = 33,
SBAS_SVID_MAX = 64
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
Android版本4g模块适配GPS功能 gnss2.0源码以及GPS搜星测试工具,适用于Android11以上版本。测试时GPS天线必须使用专用天线,一般的天线信号强度太弱搜不到卫星信号。Google要求最新android10必须用gnss 1.1以上,android11要求gnss 2.0以上。 1. 下载gnss 2.0版本软件包后解压,更新源码hardware\interfaces\gnss\2.0\default\ 目录,更新后在这个目录下执行下 “touch *”,确保编译时候能识别到更新。 2. device.mk编译添加: PRODUCT_PACKAGES += \ android.hardware.gnss@2.0-impl \ android.hardware.gnss@2.0-service 3. 将gps.default.so 放到/vendor/lib64/hw/下面(gps.default.so 文件一般可以找模块原厂提供)。
资源推荐
资源详情
资源评论
收起资源包目录
支持4g模块GPS功能 源码包以及测试工具.zip (37个子文件)
支持4g模块GPS功能 源码包以及测试工具
gnss2.0
default
GnssVisibilityControl.h 2KB
android.hardware.gnss@2.0-service.xml 344B
GnssConfiguration.cpp 4KB
Android.bp 2KB
GnssUtils.cpp 4KB
GnssDebug.h 2KB
GnssMeasurementCorrections.h 2KB
GnssMeasurement.cpp 20KB
GnssConfiguration.h 2KB
service.cpp 503B
GnssMeasurementCorrections.cpp 3KB
GnssNavigationMessage.h 3KB
GnssMeasurement.h 3KB
Gnss.cpp 41KB
OWNERS 57B
GnssGeofencing.cpp 8KB
ThreadCreationWrapper.cpp 1KB
Gnss.h 9KB
ThreadCreationWrapper.h 2KB
AGnssRil.cpp 5KB
AGnss.h 3KB
GnssXtra.h 3KB
GnssNi.h 3KB
GnssBatching.cpp 8KB
android.hardware.gnss@2.0-service.rc 120B
GnssXtra.cpp 3KB
AGnss.cpp 7KB
GnssNi.cpp 4KB
GnssBatching.h 2KB
GnssNavigationMessage.cpp 3KB
GnssDebug.cpp 2KB
GnssVisibilityControl.cpp 2KB
AGnssRil.h 3KB
GnssUtils.h 1KB
GnssGeofencing.h 4KB
gps.default.so 58KB
GPS_Test_Plus_v1_20_HA.apk 426KB
共 37 条
- 1
资源评论
Y在想什么
- 粉丝: 1917
- 资源: 3
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 3122080306 邹子轩 实验报告二.docx
- 基于STM32 NUCLEO板设计彩色LED照明灯(纯cubeMX开发)(大赛作品,文档完整,可直接运行)
- 发那科工业机器人保养大全
- Sphere.h
- REMD固有时间尺度分解信号分量可视化(Matlab完整源码和数据)
- 嵌入式系统双单片机STC89C52+STC15W104多功能学习板电路图可扩展 适用于单片机初学者和教学
- 基于STM32蓝牙控制小车系统设计(硬件+源代码+论文)大赛作品
- XILINXFPGA源码基于Spartan3火龙刀系列FPGA开发板VGA测试例程
- Java聊天室的设计与实现【尚学堂·百战程序员】
- python中matplotlib教程
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功