1
0
Fork 0

Merge branch 'aperry/terrasync'

This commit is contained in:
Tim Moore 2010-05-06 10:59:21 +02:00
commit d0be86810e

View file

@ -32,9 +32,12 @@
#ifdef __MINGW32__ #ifdef __MINGW32__
#include <time.h> #include <time.h>
#include <unistd.h> #include <unistd.h>
#elif defined(_MSC_VER)
#include <io.h>
#endif #endif
#include <stdlib.h> // atoi() atof() abs() system() #include <stdlib.h> // atoi() atof() abs() system()
#include <signal.h> // signal()
#include <simgear/compiler.h> #include <simgear/compiler.h>
@ -109,9 +112,10 @@ static void usage( const string& prog ) {
} }
std::deque<std::string> waitingTiles; deque<string> waitingTiles;
typedef std::map<std::string,time_t> CompletedTiles; typedef map<string,time_t> CompletedTiles;
CompletedTiles completedTiles; CompletedTiles completedTiles;
netSocket theSocket;
#ifdef HAVE_SVN_CLIENT_H #ifdef HAVE_SVN_CLIENT_H
@ -269,9 +273,37 @@ void sync_tree(const char* dir) {
} }
} }
#ifdef _MSC_VER
typedef void (__cdecl * sighandler_t)(int);
#elif defined( __APPLE__ )
typedef sig_t sighandler_t;
#endif
bool terminating = false;
sighandler_t prior_signal_handlers[32];
int termination_triggering_signals[] = {
#ifndef _MSC_VER
SIGHUP, SIGINT, SIGQUIT, SIGKILL,
#else
SIGINT, SIGILL, SIGFPE, SIGSEGV, SIGTERM, SIGBREAK, SIGABRT,
#endif
0}; // zero terminated
void terminate_request_handler(int param) {
char msg[] = "\nReceived signal XX, intend to exit soon.\n"
"repeat the signal to force immediate termination.\n";
msg[17] = '0' + param / 10;
msg[18] = '0' + param % 10;
write(1, msg, sizeof(msg) - 1);
terminating = true;
signal(param, prior_signal_handlers[param]);
theSocket.close();
}
const int nowhere = -9999; const int nowhere = -9999;
// parse message // parse message
static void parse_message( const string &msg, int *lat, int *lon ) { static void parse_message( const string &msg, int *lat, int *lon ) {
double dlat, dlon; double dlat, dlon;
@ -281,8 +313,8 @@ static void parse_message( const string &msg, int *lat, int *lon ) {
string::size_type pos = text.find( "$GPGGA" ); string::size_type pos = text.find( "$GPGGA" );
if ( pos == string::npos ) if ( pos == string::npos )
{ {
*lat = -9999.0; *lat = nowhere;
*lon = -9999.0; *lon = nowhere;
return; return;
} }
string tmp = text.substr( pos + 7 ); string tmp = text.substr( pos + 7 );
@ -408,7 +440,8 @@ static void sync_areas( int lat, int lon, int lat_dir, int lon_dir ) {
void getWaitingTile() { void getWaitingTile() {
while ( !waitingTiles.empty() ) { while ( !waitingTiles.empty() ) {
CompletedTiles::iterator ii = completedTiles.find( waitingTiles.front() ); CompletedTiles::iterator ii =
completedTiles.find( waitingTiles.front() );
time_t now = time(0); time_t now = time(0);
if ( ii == completedTiles.end() || ii->second + 600 < now ) { if ( ii == completedTiles.end() || ii->second + 600 < now ) {
sync_tree(waitingTiles.front().c_str()); sync_tree(waitingTiles.front().c_str());
@ -422,7 +455,7 @@ void getWaitingTile() {
int main( int argc, char **argv ) { int main( int argc, char **argv ) {
int port = 5501; int port = 5501;
char host[256] = ""; // accept messages from anyone char host[256] = "localhost";
bool testing = false; bool testing = false;
bool do_checkout(true); bool do_checkout(true);
int verbose(0); int verbose(0);
@ -486,14 +519,12 @@ int main( int argc, char **argv ) {
// Must call this before any other net stuff // Must call this before any other net stuff
netInit( &argc,argv ); netInit( &argc,argv );
netSocket s; if ( ! theSocket.open( false ) ) { // open a UDP socket
if ( ! s.open( false ) ) { // open a UDP socket
printf("error opening socket\n"); printf("error opening socket\n");
return -1; return -1;
} }
if ( s.bind( host, port ) == -1 ) { if ( theSocket.bind( host, port ) == -1 ) {
printf("error binding to port %d\n", port); printf("error binding to port %d\n", port);
return -1; return -1;
} }
@ -524,7 +555,14 @@ int main( int argc, char **argv ) {
} }
while ( true ) { // main loop for (int* sigp=termination_triggering_signals; *sigp; sigp++) {
prior_signal_handlers[*sigp] =
signal(*sigp, *terminate_request_handler);
if (verbose) cout << "Intercepted signal " << *sigp << endl;
}
while ( !terminating ) {
// main loop
recv_msg = false; recv_msg = false;
if ( testing ) { if ( testing ) {
// No FGFS communications // No FGFS communications
@ -532,8 +570,11 @@ int main( int argc, char **argv ) {
lon = -123; lon = -123;
recv_msg = (lat != last_lat) || (lon != last_lon); recv_msg = (lat != last_lat) || (lon != last_lon);
} else { } else {
s.setBlocking(waitingTiles.empty()); if (verbose && waitingTiles.empty()) {
len = s.recv(msg, maxlen, 0); cout << "Idle; waiting for FlightGear position\n";
}
theSocket.setBlocking(waitingTiles.empty());
len = theSocket.recv(msg, maxlen, 0);
if (len >= 0) { if (len >= 0) {
msg[len] = '\0'; msg[len] = '\0';
recv_msg = true; recv_msg = true;
@ -546,7 +587,7 @@ int main( int argc, char **argv ) {
// Ignore messages where the location does not change // Ignore messages where the location does not change
if ( lat != last_lat || lon != last_lon ) { if ( lat != last_lat || lon != last_lon ) {
cout << "pos in msg = " << lat << "," << lon << endl; cout << "pos in msg = " << lat << "," << lon << endl;
std::deque<std::string> oldRequests; deque<string> oldRequests;
oldRequests.swap( waitingTiles ); oldRequests.swap( waitingTiles );
int lat_dir, lon_dir, dist; int lat_dir, lon_dir, dist;
if ( last_lat == nowhere || last_lon == nowhere ) { if ( last_lat == nowhere || last_lon == nowhere ) {
@ -584,11 +625,11 @@ int main( int argc, char **argv ) {
} }
else if ( testing ) { else if ( testing ) {
exit( 0 ); terminating = true;
} else } else
ulSleep( 1 ); ulSleep( 1 );
} // while true } // while !terminating
return 0; return 0;
} }