xref: /aosp_15_r20/system/chre/chpp/platform/linux/services/platform_gnss.c (revision 84e339476a462649f82315436d70fd732297a399)
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