diff --git a/gnss/1.1/default/GnssDebug.cpp b/gnss/1.1/default/GnssDebug.cpp index 471ed2421d..252f4e6373 100644 --- a/gnss/1.1/default/GnssDebug.cpp +++ b/gnss/1.1/default/GnssDebug.cpp @@ -20,6 +20,7 @@ #include "Constants.h" #include "GnssDebug.h" +#include "MockLocation.h" using namespace ::android::hardware::gnss::common; @@ -32,17 +33,17 @@ namespace implementation { // Methods from ::android::hardware::gnss::V1_0::IGnssDebug follow. Return GnssDebug::getDebugData(V1_0::IGnssDebug::getDebugData_cb _hidl_cb) { PositionDebug positionDebug = { - .valid = true, - .latitudeDegrees = kMockLatitudeDegrees, - .longitudeDegrees = kMockLongitudeDegrees, - .altitudeMeters = kMockAltitudeMeters, - .speedMetersPerSec = kMockSpeedMetersPerSec, - .bearingDegrees = kMockBearingDegrees, - .horizontalAccuracyMeters = kMockHorizontalAccuracyMeters, - .verticalAccuracyMeters = kMockVerticalAccuracyMeters, - .speedAccuracyMetersPerSecond = kMockSpeedAccuracyMetersPerSecond, - .bearingAccuracyDegrees = kMockBearingAccuracyDegrees, - .ageSeconds = 0.99}; + .valid = true, + .latitudeDegrees = gMockLatitudeDegrees, + .longitudeDegrees = gMockLongitudeDegrees, + .altitudeMeters = gMockAltitudeMeters, + .speedMetersPerSec = kMockSpeedMetersPerSec, + .bearingDegrees = kMockBearingDegrees, + .horizontalAccuracyMeters = kMockHorizontalAccuracyMeters, + .verticalAccuracyMeters = kMockVerticalAccuracyMeters, + .speedAccuracyMetersPerSecond = kMockSpeedAccuracyMetersPerSecond, + .bearingAccuracyDegrees = kMockBearingAccuracyDegrees, + .ageSeconds = 0.99}; TimeDebug timeDebug = {.timeEstimate = kMockTimestamp, .timeUncertaintyNs = 1000, diff --git a/gnss/common/utils/default/Android.bp b/gnss/common/utils/default/Android.bp index 8d9d4d46aa..730de4bfed 100644 --- a/gnss/common/utils/default/Android.bp +++ b/gnss/common/utils/default/Android.bp @@ -29,6 +29,7 @@ cc_library_static { "v2_1/GnssDebug.cpp", "v2_1/GnssMeasurement.cpp", "v2_1/GnssMeasurementCorrections.cpp", + "MockLocation.cpp", "Utils.cpp", "NmeaFixInfo.cpp", ], diff --git a/gnss/common/utils/default/MockLocation.cpp b/gnss/common/utils/default/MockLocation.cpp new file mode 100644 index 0000000000..2d8e7c59ea --- /dev/null +++ b/gnss/common/utils/default/MockLocation.cpp @@ -0,0 +1,25 @@ +/* + * Copyright (C) 2020 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. + */ + +#include "MockLocation.h" + +namespace android::hardware::gnss::common { + +float gMockLatitudeDegrees{37.4219999}; +float gMockLongitudeDegrees{-122.0840575}; +float gMockAltitudeMeters{1.60062531}; + +} // namespace android::hardware::gnss::common diff --git a/gnss/common/utils/default/Utils.cpp b/gnss/common/utils/default/Utils.cpp index 386090e486..fa83634024 100644 --- a/gnss/common/utils/default/Utils.cpp +++ b/gnss/common/utils/default/Utils.cpp @@ -15,6 +15,7 @@ */ #include +#include #include #include @@ -141,9 +142,9 @@ V2_0::GnssLocation Utils::getMockLocationV2_0() { V1_0::GnssLocation Utils::getMockLocationV1_0() { V1_0::GnssLocation location = { .gnssLocationFlags = 0xFF, - .latitudeDegrees = kMockLatitudeDegrees, - .longitudeDegrees = kMockLongitudeDegrees, - .altitudeMeters = kMockAltitudeMeters, + .latitudeDegrees = gMockLatitudeDegrees, + .longitudeDegrees = gMockLongitudeDegrees, + .altitudeMeters = gMockAltitudeMeters, .speedMetersPerSec = kMockSpeedMetersPerSec, .bearingDegrees = kMockBearingDegrees, .horizontalAccuracyMeters = kMockHorizontalAccuracyMeters, diff --git a/gnss/common/utils/default/include/Constants.h b/gnss/common/utils/default/include/Constants.h index 000a9ec7d2..ad4e0eb9e9 100644 --- a/gnss/common/utils/default/include/Constants.h +++ b/gnss/common/utils/default/include/Constants.h @@ -24,9 +24,6 @@ namespace hardware { namespace gnss { namespace common { -const float kMockLatitudeDegrees = 37.4219999; -const float kMockLongitudeDegrees = -122.0840575; -const float kMockAltitudeMeters = 1.60062531; const float kMockSpeedMetersPerSec = 0; const float kMockBearingDegrees = 0; const float kMockHorizontalAccuracyMeters = 5; diff --git a/gnss/common/utils/default/include/MockLocation.h b/gnss/common/utils/default/include/MockLocation.h new file mode 100644 index 0000000000..cd8cb5dad1 --- /dev/null +++ b/gnss/common/utils/default/include/MockLocation.h @@ -0,0 +1,36 @@ +/* + * Copyright (C) 2020 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. + */ + +#ifndef android_hardware_gnss_common_MockLocation_H_ +#define android_hardware_gnss_common_MockLocation_H_ + +#include + +namespace android { +namespace hardware { +namespace gnss { +namespace common { + +extern float gMockLatitudeDegrees; +extern float gMockLongitudeDegrees; +extern float gMockAltitudeMeters; + +} // namespace common +} // namespace gnss +} // namespace hardware +} // namespace android + +#endif // android_hardware_gnss_common_MockLocation_H_ diff --git a/gnss/common/utils/default/include/v2_1/GnssTemplate.h b/gnss/common/utils/default/include/v2_1/GnssTemplate.h index 0128df4812..7c3c58abcd 100644 --- a/gnss/common/utils/default/include/v2_1/GnssTemplate.h +++ b/gnss/common/utils/default/include/v2_1/GnssTemplate.h @@ -33,6 +33,7 @@ #include "GnssDebug.h" #include "GnssMeasurement.h" #include "GnssMeasurementCorrections.h" +#include "MockLocation.h" #include "NmeaFixInfo.h" #include "Utils.h" @@ -113,12 +114,17 @@ struct GnssTemplate : public T_IGnss { getExtensionMeasurementCorrections_1_1() override; Return> getExtensionGnssAntennaInfo() override; + Return debug(const hidl_handle& fd, const hidl_vec& options) override; + private: std::unique_ptr getLocationFromHW(); void reportLocation(const V2_0::GnssLocation&) const; void reportLocation(const V1_0::GnssLocation&) const; void reportSvStatus(const hidl_vec&) const; + Return help(const hidl_handle& fd); + Return setLocation(const hidl_handle& fd, const hidl_vec& options); + static sp sGnssCallback_2_1; static sp sGnssCallback_2_0; static sp sGnssCallback_1_1; @@ -639,4 +645,59 @@ void GnssTemplate::reportLocation(const V2_0::GnssLocation& location) c } } +template +Return GnssTemplate::setLocation(const hidl_handle& fd, + const hidl_vec& options) { + auto lat = gMockLatitudeDegrees; + auto lon = gMockLongitudeDegrees; + auto ele = gMockAltitudeMeters; + + for (size_t i = 1; i < options.size(); ++i) { + std::string option = options[i]; + if (option.rfind("lat=", 0) == 0) { + option = option.substr(4); + lat = stof(option); + } else if (option.rfind("lon=", 0) == 0) { + option = option.substr(4); + lon = stof(option); + } else if (option.rfind("ele=", 0) == 0) { + option = option.substr(4); + ele = stof(option); + } else { + dprintf(fd->data[0], "unsupported location argument: %s\n", option.c_str()); + } + } + + gMockLatitudeDegrees = lat; + gMockLongitudeDegrees = lon; + gMockAltitudeMeters = ele; + + dprintf(fd->data[0], "mock location updated to lat=%f lon=%f ele=%f\n", gMockLatitudeDegrees, + gMockLongitudeDegrees, gMockAltitudeMeters); + + return Void(); +} + +template +Return GnssTemplate::help(const hidl_handle& fd) { + dprintf(fd->data[0], + "invalid option for Gnss HAL; valid options are:\n" + "location lat=.. lon=.. ele=..\n"); + return Void(); +} + +template +Return GnssTemplate::debug(const hidl_handle& fd, + const hidl_vec& options) { + if (options.size() == 0) { + return help(fd); + } else if (options[0] == "location") { + return setLocation(fd, options); + } else { + return help(fd); + } + + return Void(); +} + } // namespace android::hardware::gnss::common::implementation diff --git a/gnss/common/utils/default/v2_1/GnssDebug.cpp b/gnss/common/utils/default/v2_1/GnssDebug.cpp index 492b970b59..d78b0b6ddc 100644 --- a/gnss/common/utils/default/v2_1/GnssDebug.cpp +++ b/gnss/common/utils/default/v2_1/GnssDebug.cpp @@ -19,6 +19,7 @@ #include #include "Constants.h" +#include "MockLocation.h" #include "v2_1/GnssDebug.h" using namespace ::android::hardware::gnss::common; @@ -29,9 +30,9 @@ namespace android::hardware::gnss::V1_1::implementation { Return GnssDebug::getDebugData(V1_0::IGnssDebug::getDebugData_cb _hidl_cb) { PositionDebug positionDebug = { .valid = true, - .latitudeDegrees = kMockLatitudeDegrees, - .longitudeDegrees = kMockLongitudeDegrees, - .altitudeMeters = kMockAltitudeMeters, + .latitudeDegrees = gMockLatitudeDegrees, + .longitudeDegrees = gMockLongitudeDegrees, + .altitudeMeters = gMockAltitudeMeters, .speedMetersPerSec = kMockSpeedMetersPerSec, .bearingDegrees = kMockBearingDegrees, .horizontalAccuracyMeters = kMockHorizontalAccuracyMeters,