#include <cmath>
#include <limits>
+#include <signal.h>
#include <GL/gl.h>
#include <msp/core/except.h>
#include <msp/core/getopt.h>
#include <msp/gl/matrix.h>
#include <msp/gl/projection.h>
#include <msp/gl/transform.h>
+#include <msp/io/print.h>
#include <msp/strings/formatter.h>
#include <msp/strings/lexicalcast.h>
#include <msp/strings/regex.h>
i->second->signal_state_changed.connect(sigc::bind(sigc::mem_fun(this, &Engineer::sensor_event), i->second));
view_all();
+
+ catch_signal(SIGINT);
+ catch_signal(SIGTERM);
+ catch_signal(SIGSEGV);
+ catch_signal(SIGILL);
+ catch_signal(SIGFPE);
+ catch_signal(SIGABRT);
}
Engineer::~Engineer()
{
+ const list<Train *> &trains = trfc_mgr->get_trains();
+ for(list<Train *>::const_iterator i=trains.begin(); i!=trains.end(); ++i)
+ (*i)->set_speed(0);
+
+ while(control.get_queue_length())
+ control.tick();
+
if(!simulate)
trfc_mgr->save("engineer.state");
delete trfc_mgr;
//glEnable(GL_DEPTH_TEST);
glEnable(GL_MULTISAMPLE);
- layout_3d.render();
+ layout_3d.get_scene().render();
glDisable(GL_LIGHTING);
glColor4f(1, 1, 1, 1);
- const list<Track3D *> <racks = layout_3d.get_tracks();
+ /*const list<Track3D *> <racks = layout_3d.get_tracks();
for(list<Track3D *>::const_iterator i=ltracks.begin(); i!=ltracks.end(); ++i)
{
Track &track = (*i)->get_track();
}
else
(*i)->render_path(-1);
- }
+ }*/
if(placing_train && placing_block)
{
place_train(train);
}
+void Engineer::sighandler(int sig)
+{
+ if(sig==SIGSEGV || sig==SIGILL || sig==SIGFPE || sig==SIGABRT)
+ {
+ signal(sig, SIG_DFL);
+ IO::print(IO::cerr, "Fatal signal received, terminating\n");
+ const map<unsigned, Locomotive *> &locos = control.get_locomotives();
+ for(map<unsigned, Locomotive *>::const_iterator i=locos.begin(); i!=locos.end(); ++i)
+ i->second->set_speed(0);
+ control.flush();
+ raise(sig);
+ }
+ else if(sig==SIGTERM || sig==SIGINT)
+ exit(0);
+}
+
Application::RegApp<Engineer> Engineer::reg;