17 gettimeofday(&tv, NULL);
18 mst = ((uint64_t)tv.tv_sec)*1000;
19 mst += round(tv.tv_usec/1000.0);
28 double latitudeH = sin(latitudeArc * 0.5);
29 latitudeH *= latitudeH;
30 double lontitudeH = sin(longitudeArc * 0.5);
31 lontitudeH *= lontitudeH;
33 double arcInRadians = 2.0 * asin(
sqrt(latitudeH + tmp*lontitudeH));
80 double longitudeArc = (lon1 - lon2) * AERA_DEG_TO_RAD;
81 double z = sin(longitudeArc) * cos(lat2Arc);
82 double n = cos(lat1Arc) * sin(lat2Arc) - sin(lat1Arc) * cos(lat2Arc) * cos(longitudeArc);
83 return fmod(630. + atan2(z, n) / AERA_DEG_TO_RAD, 360);
90 if (a->
addr == addr)
return (a);
98 uint32_t airplaneAddr;
101 double airplaneAltitude;
102 double groundDistance;
103 double correctedAltitude;
112 char logMessage[256];
114 struct timeval timeVal;
116 uint32_t gpsSec, uSec;
117 uint64_t curtimeWithmSec;
123 int sentToSocket = 0;
126 gettimeofday(&timeVal, 0x0);
127 curtime = timeVal.tv_sec;
129 uSec = (uint32_t)(timeVal.tv_usec);
130 strftime(time, 30,
"%Y %m %d %H %M %S", gmtime(&curtime));
132 curtimeWithmSec = ((uint64_t)curtime)*1000;
133 curtimeWithmSec += round(uSec/1000.0);
136 airplaneAddr = mm->
addr;
141 heading = 90 - aircraft->
track;
145 velocity = aircraft->
speed;
149 airplaneLat = mm->
fLat;
150 airplaneLon = mm->
fLon;
151 airplaneAltitude = mm->
altitude * 0.3048;
156 zenith = 90.0 - atan(correctedAltitude / groundDistance) /
AERA_DEG_TO_RAD;
158 distance =
sqrt((groundDistance * groundDistance) + (correctedAltitude * correctedAltitude));
160 if (
Modes.aera_net && zenith <= 80.) {
178 float airplaneLatF = (float)(airplaneLat);
179 float airplaneLonF = (float)(airplaneLon);
180 float airplaneAltitudeF = (float)(airplaneAltitude);
181 float zenithF = (float)(zenith);
182 float azimuthF = (float)(azimuth);
183 float distanceF = (float)(distance);
185 unsigned char socketMessage[52];
186 strncpy((
char*)socketMessage,
"AIRPLANE",8);
187 *(
unsigned int*)&socketMessage[8] = htonl(airplaneAddr);
188 *(
unsigned int*)&socketMessage[12] = htonl(gpsSec);
189 *(
unsigned int*)&socketMessage[16] = htonl(uSec);
190 unsigned int tmp = *(
unsigned int*)&airplaneLatF;
191 *(
unsigned int*)&socketMessage[20] = htonl(tmp);
192 tmp = *(
unsigned int*)&airplaneLonF;
193 *(
unsigned int*)&socketMessage[24] = htonl(tmp);
194 tmp = *(
unsigned int*)&airplaneAltitudeF;
195 *(
unsigned int*)&socketMessage[28] = htonl(tmp);
196 tmp = *(
unsigned int*)&zenithF;
197 *(
unsigned int*)&socketMessage[32] = htonl(tmp);
198 tmp = *(
unsigned int*)&azimuthF;
199 *(
unsigned int*)&socketMessage[36] = htonl(tmp);
200 tmp = *(
unsigned int*)&distanceF;
201 *(
unsigned int*)&socketMessage[40] = htonl(tmp);
202 *(
int*)&socketMessage[44] = htonl(heading);
203 *(
int*)&socketMessage[48] = htonl(velocity);
214 for (j = 0; j < mm->
msgbits/8; j++) lengthHex += sprintf(hex + lengthHex,
"%02x", mm->
msg[j]);
215 sprintf(logMessage,
"%llu *%s; %s %u %06u %06x %3.12f %3.12f %5.2f %f %f %f %d %d %d\n", curtimeWithmSec, hex, time, gpsSec, uSec, airplaneAddr, airplaneLat, airplaneLon, airplaneAltitude, zenith, azimuth, distance, heading, velocity, sentToSocket);
226 time_t curtime = time(NULL);
229 strftime(logFile, 128,
"%Y%m%d.log", gmtime(&curtime));
231 file = fopen(logFile,
"a");
232 fputs(logMessage, file);
238 signal(SIGPIPE, SIG_IGN);
241 struct sockaddr_in serv_addr;
242 struct hostent *server;
243 *aeraSocketFD = socket(AF_INET, SOCK_STREAM, 0);
245 if (*aeraSocketFD < 0) {
250 server = gethostbyname(host);
257 bzero((
char *) &serv_addr,
sizeof(serv_addr));
258 serv_addr.sin_family = AF_INET;
259 bcopy((
char*)server->h_addr,(
char*)&serv_addr.sin_addr.s_addr,server->h_length);
260 serv_addr.sin_port = htons(port);
262 if ( connect(*aeraSocketFD,(
struct sockaddr *) &serv_addr,
sizeof(serv_addr)) < 0) {
273 current_time = time(NULL);
275 close(*aeraSocketFD);
290 error = write(*aeraSocketFD, socketMessage, length);
291 if (error != length) {
295 error = write(*aeraSocketFD, socketMessage, length);
296 if (error != length) {
int aeraReconnectToSocket(int *aeraSocketFD)
#define AERA_STATION_LATITUDE
void aeraWriteLogfile(char *logMessage)
double aeraCalcAzimuth(double lat1, double lon1, double lat2, double lon2)
double aeraCalcGroundDistance(double lat1, double lon1, double lat2, double lon2)
#define MODES_ACFLAGS_LATLON_VALID
#define AERA_EARTH_RADIUS_IN_METERS
double aeraCalcCorrectedAltitude(double alt1, double alt2, double groundDistance)
struct aircraft * interactiveFindAircraft2(uint32_t addr)
int aeraWriteToSocket(int *aeraSocketFD, unsigned char *socketMessage, int length)
int aeraSocketReconnectTime
#define AERA_STATION_LONGITUDE
#define AERA_STATION_ALTITUDE
int aeraConnectToSocket(int *aeraSocketFD, char host[], int port)