X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fengineer%2Fengineer.cpp;h=11729be5b9a6f1754c0036704258f893cea6c4ff;hb=6dc18b0e518407bd2a86602bae1e9bbae05da7c8;hp=14e98c6b6b7aa2074bcfdb6c5f59a7ad0b696caa;hpb=f9254f57b736927a57a2fd793ee18f6c9766dd43;p=r2c2.git diff --git a/source/engineer/engineer.cpp b/source/engineer/engineer.cpp index 14e98c6..11729be 100644 --- a/source/engineer/engineer.cpp +++ b/source/engineer/engineer.cpp @@ -20,6 +20,7 @@ Distributed under the GPL #include #include #include +#include #include "libmarklin/except.h" #include "libmarklin/tracktype.h" #include "engineer.h" @@ -37,8 +38,7 @@ Engineer::Engineer(int argc, char **argv): fullscreen(false), layout(catalogue), layout_3d(layout), - train_prop(0), - train_prop_stale(false), + server(0), placing_train(0), placing_block(0), placing_entry(0), @@ -49,6 +49,7 @@ Engineer::Engineer(int argc, char **argv): bool debug = false; string device = "/dev/ttyS0"; unsigned quality = 4; + bool network = false; GetOpt getopt; getopt.add_option('r', "resolution", res, GetOpt::REQUIRED_ARG); @@ -57,6 +58,7 @@ Engineer::Engineer(int argc, char **argv): getopt.add_option('d', "device", device, GetOpt::REQUIRED_ARG); getopt.add_option('q', "quality", quality, GetOpt::REQUIRED_ARG); getopt.add_option('s', "simulate", simulate, GetOpt::NO_ARG); + getopt.add_option('n', "network", network, GetOpt::NO_ARG); getopt.add_option( "no-lighting", no_lighting, GetOpt::NO_ARG); getopt(argc, argv); @@ -87,9 +89,16 @@ Engineer::Engineer(int argc, char **argv): DataFile::load(layout, args.front()); trfc_mgr = new TrafficManager(control, layout); - trfc_mgr->signal_block_reserved.connect(sigc::mem_fun(this, &Engineer::block_reserved)); if(FS::exists("engineer.state")) DataFile::load(*trfc_mgr, "engineer.state"); + trfc_mgr->signal_train_added.connect(sigc::mem_fun(this, &Engineer::train_added)); + trfc_mgr->signal_block_reserved.connect(sigc::mem_fun(this, &Engineer::block_reserved)); + + if(network) + { + server = new Server(*trfc_mgr); + server->use_event_dispatcher(event_disp); + } const map &sensors = control.get_sensors(); for(map::const_iterator i=sensors.begin(); i!=sensors.end(); ++i) @@ -103,36 +112,7 @@ Engineer::~Engineer() if(!simulate) trfc_mgr->save("engineer.state"); delete trfc_mgr; -} - -void Engineer::add_train() -{ - train_prop = new TrainProperties(*this, ui_res, 0); - root->add(*train_prop); - train_prop->signal_ok.connect(sigc::mem_fun(this, &Engineer::dismiss_train_prop)); - train_prop->signal_cancel.connect(sigc::mem_fun(this, &Engineer::dismiss_train_prop)); - train_prop_stale = false; - train_prop->set_visible(true); -} - -Train *Engineer::add_train(const LocoType &type, unsigned addr) -{ - Locomotive *loco = new Locomotive(type, control, addr); - Train *train = new Train(*trfc_mgr, *loco); - train->set_name(format("Train %d", trfc_mgr->get_trains().size())); - - TrainPanel *tpanel = new TrainPanel(*this, ui_res, *train); - root->add(*tpanel); - int y = main_panel->get_geometry().y; - for(list::iterator i=train_panels.begin(); i!=train_panels.end(); ++i) - y -= (*i)->get_geometry().h; - tpanel->set_position(0, y-tpanel->get_geometry().h); - train_panels.push_back(tpanel); - tpanel->set_visible(true); - - place_train(*train); - - return train; + delete server; } void Engineer::place_train(Train &train) @@ -200,6 +180,7 @@ int Engineer::main() Application::main(); + delete root; delete glc; delete wnd; delete dpy; @@ -213,6 +194,7 @@ void Engineer::tick() control.tick(); trfc_mgr->tick(); + event_disp.tick(Time::zero); glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); @@ -247,10 +229,10 @@ void Engineer::tick() if(track.get_turnout_id()) { Turnout &trnt = control.get_turnout(track.get_turnout_id()); - (*i)->render_route(trnt.get_route()); + (*i)->render_path(trnt.get_path()); } else - (*i)->render_route(-1); + (*i)->render_path(-1); } if(placing_train && placing_block) @@ -314,21 +296,9 @@ void Engineer::tick() root->render(); - if(train_prop_stale) - { - delete train_prop; - train_prop = 0; - } - glc->swap_buffers(); } -void Engineer::key_press(unsigned key, unsigned mod, wchar_t ch) -{ - if(train_prop) - train_prop->key_press(key, mod, ch); -} - void Engineer::button_press(int x, int y, unsigned btn, unsigned) { if(placing_train) @@ -357,7 +327,7 @@ void Engineer::button_press(int x, int y, unsigned btn, unsigned) Turnout &turnout = control.get_turnout(tid); try { - turnout.set_route((turnout.get_route()+1)%track->get_track().get_type().get_n_routes()); + turnout.set_path((turnout.get_path()+1)%track->get_track().get_type().get_n_paths()); main_panel->set_status_text(format("Turnout %d switched", turnout.get_address())); } catch(const TurnoutBusy &e) @@ -510,9 +480,18 @@ Track3D *Engineer::pick_track(int x, int y) return layout_3d.pick_track(xx, yy, size); } -void Engineer::dismiss_train_prop() +void Engineer::train_added(Train &train) { - train_prop_stale = true; + TrainPanel *tpanel = new TrainPanel(*this, ui_res, train); + root->add(*tpanel); + int y = main_panel->get_geometry().y; + for(list::iterator i=train_panels.begin(); i!=train_panels.end(); ++i) + y -= (*i)->get_geometry().h; + tpanel->set_position(0, y-tpanel->get_geometry().h); + train_panels.push_back(tpanel); + tpanel->set_visible(true); + + place_train(train); } Application::RegApp Engineer::reg;