1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143
|
/*
This file is part of Kismet
Kismet is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
Kismet is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Kismet; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#ifndef __GPSD_H__
#define __GPSD_H__
#include "config.h"
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <netdb.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <fcntl.h>
#include <math.h>
#ifdef HAVE_INTTYPES_H
#include <inttypes.h>
#endif
// gpsd return looks like
// SEND: PAVM
// RECV: GPSD,P=41.711378 -73.931428,A=42.500000,V=0.000000,M=1
// or
// RECV: GPSD,P=41.711548 -73.931020,A=61.800000,V=0.000000,M=3
// POSITION, ALT, VELOCITY, MODE
// Our command
// const char gpsd_command[] = "PAVMH\n";
// Query gpsd version
const char gpsd_init_command[] = "l\n";
// Optional GPSD commands (enable jitter correction, etc)
const char gpsd_opt_commands[] = "j=1\n";
// Watcher mode
const char gpsd_watch_command[] = "w=1\n";
// GPS poll command
const char gpsd_poll_command[] = "PAVM\n";
// Options
#define GPSD_OPT_FORCEMODE 1
// Max data size
#define GPSD_MAX_DATASIZE 2048
// gpsd GPS capture
class GPSD {
public:
GPSD(char *in_host, int in_port);
~GPSD(void);
char *FetchError();
// Open gpsd on host, port
int OpenGPSD();
// Close it
int CloseGPSD();
// Set options
void SetOptions(uint32_t in_opt) { options = in_opt; }
// Get our file descriptor
int FetchDescriptor() { return sock; }
unsigned int MergeSet(fd_set *in_rset, fd_set *in_wset, unsigned int in_max);
int Poll(fd_set *in_rset, fd_set *in_wset);
// Fetch a location
int FetchLoc(float *in_lat, float *in_lon, float *in_alt,
float *in_spd, float *in_hed, int *mode);
// Fetch mode
int FetchMode() { return mode; }
// Write poll request data
void WritePoll();
// Various GPS transformations
static float CalcHeading(float in_lat, float in_lon, float in_lat2, float in_lon2);
static double CalcRad(double lat);
static double Rad2Deg(double x);
static double Deg2Rad(double x);
static double EarthDistance(double in_lat, double in_lon,
double in_lat2, double in_lon2);
protected:
char errstr[1024];
// Are we in polling or watcher mode?
int poll_mode;
int poll_timer;
// 'O' response reports speed as m/s instead of knots?
int si_units;
int sock;
float lat, lon, alt, spd, hed;
int mode;
int last_mode;
// Last location used for softheading calcs
float last_lat, last_lon, last_hed;
time_t last_hed_time;
char data[GPSD_MAX_DATASIZE + 1];
int data_pos;
char *host;
int port;
struct sockaddr_in localaddr, servaddr;
struct hostent *h;
uint32_t options;
};
#endif
|