1 /**
2 * Copyright (C) 2020 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 #include <stdbool.h>
18 #include <stdint.h>
19 #include <string.h>
20
21 #include "chpp/common/gnss.h"
22 #include "chpp/log.h"
23 #include "chpp/macros.h"
24 #include "chpp/platform/platform_gnss.h"
25 #include "chre/pal/gnss.h"
26
27 static const struct chrePalSystemApi *gSystemApi;
28 static const struct chrePalGnssCallbacks *gCallbacks;
29
gnssPalOpen(const struct chrePalSystemApi * systemApi,const struct chrePalGnssCallbacks * callbacks)30 static bool gnssPalOpen(const struct chrePalSystemApi *systemApi,
31 const struct chrePalGnssCallbacks *callbacks) {
32 gSystemApi = systemApi;
33 gCallbacks = callbacks;
34
35 return true;
36 }
37
gnssPalClose(void)38 static void gnssPalClose(void) {}
39
gnssPalGetCapabilities(void)40 static uint32_t gnssPalGetCapabilities(void) {
41 return CHRE_GNSS_CAPABILITIES_LOCATION | CHRE_GNSS_CAPABILITIES_MEASUREMENTS |
42 CHRE_GNSS_CAPABILITIES_GNSS_ENGINE_BASED_PASSIVE_LISTENER;
43 }
44
gnssPalControlLocationSession(bool enable,uint32_t minIntervalMs,uint32_t minTimeToNextFixMs)45 static bool gnssPalControlLocationSession(bool enable, uint32_t minIntervalMs,
46 uint32_t minTimeToNextFixMs) {
47 // TODO
48 UNUSED_VAR(enable);
49 UNUSED_VAR(minIntervalMs);
50 UNUSED_VAR(minTimeToNextFixMs);
51
52 return true; // If successful
53 }
54
gnssPalSendLocationEvent(void)55 void gnssPalSendLocationEvent(void) {
56 struct chreGnssLocationEvent *event =
57 (struct chreGnssLocationEvent *)(chppMalloc(
58 sizeof(struct chreGnssLocationEvent)));
59 if (event == NULL) {
60 CHPP_LOG_OOM();
61 } else {
62 memset(event, 0, sizeof(struct chreGnssLocationEvent));
63
64 event->timestamp = gSystemApi->getCurrentTime();
65 gCallbacks->locationEventCallback(event);
66 }
67 }
68
gnssPalSendMeasurementEvent(void)69 void gnssPalSendMeasurementEvent(void) {
70 struct chreGnssDataEvent *event = (struct chreGnssDataEvent *)(chppMalloc(
71 sizeof(struct chreGnssDataEvent)));
72 struct chreGnssMeasurement *measurement =
73 (struct chreGnssMeasurement *)(chppMalloc(
74 sizeof(struct chreGnssMeasurement)));
75 if (event == NULL) {
76 CHPP_LOG_OOM();
77 } else if (measurement == NULL) {
78 CHPP_LOG_OOM();
79 chppFree(event);
80 } else {
81 memset(event, 0, sizeof(struct chreGnssDataEvent));
82 memset(measurement, 0, sizeof(struct chreGnssMeasurement));
83 measurement->c_n0_dbhz = 63.0f;
84
85 event->measurements = measurement;
86 event->measurement_count = 1;
87 event->clock.time_ns = (int64_t)(gSystemApi->getCurrentTime());
88 gCallbacks->measurementEventCallback(event);
89 }
90 }
91
gnssPalReleaseLocationEvent(struct chreGnssLocationEvent * event)92 static void gnssPalReleaseLocationEvent(struct chreGnssLocationEvent *event) {
93 gSystemApi->memoryFree(event);
94 }
95
gnssPalControlMeasurementSession(bool enable,uint32_t minIntervalMs)96 static bool gnssPalControlMeasurementSession(bool enable,
97 uint32_t minIntervalMs) {
98 // TODO
99 UNUSED_VAR(enable);
100 UNUSED_VAR(minIntervalMs);
101
102 return true; // If successful
103 }
104
gnssPalReleaseMeasurementDataEvent(struct chreGnssDataEvent * event)105 static void gnssPalReleaseMeasurementDataEvent(
106 struct chreGnssDataEvent *event) {
107 gSystemApi->memoryFree(CHPP_CONST_CAST_POINTER(event->measurements));
108 gSystemApi->memoryFree(event);
109 }
110
gnssPalConfigurePassiveLocationListener(bool enable)111 static bool gnssPalConfigurePassiveLocationListener(bool enable) {
112 // TODO
113 UNUSED_VAR(enable);
114
115 return true; // If successful
116 }
117
118 #ifdef CHPP_SERVICE_ENABLED_GNSS
chrePalGnssGetApi(uint32_t requestedApiVersion)119 const struct chrePalGnssApi *chrePalGnssGetApi(uint32_t requestedApiVersion) {
120 static const struct chrePalGnssApi api = {
121 .moduleVersion = CHPP_PAL_GNSS_API_VERSION,
122 .open = gnssPalOpen,
123 .close = gnssPalClose,
124 .getCapabilities = gnssPalGetCapabilities,
125 .controlLocationSession = gnssPalControlLocationSession,
126 .releaseLocationEvent = gnssPalReleaseLocationEvent,
127 .controlMeasurementSession = gnssPalControlMeasurementSession,
128 .releaseMeasurementDataEvent = gnssPalReleaseMeasurementDataEvent,
129 .configurePassiveLocationListener =
130 gnssPalConfigurePassiveLocationListener,
131 };
132
133 CHPP_STATIC_ASSERT(
134 CHRE_PAL_GNSS_API_CURRENT_VERSION == CHPP_PAL_GNSS_API_VERSION,
135 "A newer CHRE PAL API version is available. Please update.");
136
137 if (!CHRE_PAL_VERSIONS_ARE_COMPATIBLE(api.moduleVersion,
138 requestedApiVersion)) {
139 return NULL;
140 } else {
141 return &api;
142 }
143 }
144 #endif
145