1 /* 2 * Copyright (C) 2017 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 #pragma once 17 18 #include <errno.h> 19 #include <fcntl.h> 20 #include <sys/epoll.h> 21 22 #include <hardware/gps.h> 23 24 #define GPS_DEBUG 0 25 #define GPS_DATA_BUFFER_MAX_SIZE 256 26 27 #define DEFAULT_GPS_LOCATION_FLAG \ 28 (GPS_LOCATION_HAS_LAT_LONG | GPS_LOCATION_HAS_ALTITUDE | \ 29 GPS_LOCATION_HAS_BEARING | GPS_LOCATION_HAS_SPEED | \ 30 GPS_LOCATION_HAS_ACCURACY) 31 32 #if GPS_DEBUG 33 #define D(...) ALOGD(__VA_ARGS__) 34 #else 35 #define D(...) ((void)0) 36 #endif 37 38 // Control commands to GPS thread 39 enum { CMD_QUIT = 0, CMD_START = 1, CMD_STOP = 2 }; 40 41 // GPS HAL's state 42 typedef struct { 43 int init; 44 int fd; 45 int control[2]; 46 pthread_t thread; 47 GpsCallbacks callbacks; 48 } GpsState; 49 50 typedef struct { 51 GpsLocation fix; 52 gps_location_callback callback; 53 char buffer[GPS_DATA_BUFFER_MAX_SIZE + 1]; 54 int index; 55 } GpsDataReader; 56 57 void gps_state_thread(void* arg); 58 59 static inline int epoll_register(int epoll_fd, int fd) { 60 fcntl(fd, F_SETFL, fcntl(fd, F_GETFL) | O_NONBLOCK); 61 62 struct epoll_event ev; 63 ev.events = EPOLLIN; 64 ev.data.fd = fd; 65 66 int ret; 67 do { 68 ret = epoll_ctl(epoll_fd, EPOLL_CTL_ADD, fd, &ev); 69 } while (ret < 0 && errno == EINTR); 70 return ret; 71 } 72 73 static inline int epoll_deregister(int epoll_fd, int fd) { 74 int ret; 75 do { 76 ret = epoll_ctl(epoll_fd, EPOLL_CTL_DEL, fd, NULL); 77 } while (ret < 0 && errno == EINTR); 78 return ret; 79 } 80