Eclipse SUMO - Simulation of Urban MObility
sumo_main.cpp
Go to the documentation of this file.
1/****************************************************************************/
2// Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.org/sumo
3// Copyright (C) 2001-2022 German Aerospace Center (DLR) and others.
4// This program and the accompanying materials are made available under the
5// terms of the Eclipse Public License 2.0 which is available at
6// https://www.eclipse.org/legal/epl-2.0/
7// This Source Code may also be made available under the following Secondary
8// Licenses when the conditions for such availability set forth in the Eclipse
9// Public License 2.0 are satisfied: GNU General Public License, version 2
10// or later which is available at
11// https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html
12// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later
13/****************************************************************************/
22// Main for SUMO
23/****************************************************************************/
24#include <config.h>
25
26#ifdef HAVE_VERSION_H
27#include <version.h>
28#endif
29
30#include <csignal>
31#include <netload/NLBuilder.h>
35#include <utils/xml/XMLSubSys.h>
37
38
39// ===========================================================================
40// functions
41// ===========================================================================
42void
43signalHandler(int signum) {
44 if (MSNet::hasInstance()) {
45 switch (signum) {
46 case SIGINT:
47 case SIGTERM:
48 if (MSNet::getInstance()->isInterrupted()) {
49 std::cout << TL("Another interrupt signal received, hard exit.") << std::endl;
50 exit(signum);
51 }
52 std::cout << TL("Interrupt signal received, trying to exit gracefully.") << std::endl;
54 break;
55#ifndef WIN32
56 case SIGUSR1:
57 std::cout << "Step #" << SIMSTEP << std::endl;
58 std::cout << MSNet::getInstance()->generateStatistics(string2time(OptionsCont::getOptions().getString("begin"))) << std::endl;
59 break;
60 case SIGUSR2:
61 //TODO reload sim
62 break;
63#endif
64 default:
65 break;
66 }
67 }
68}
69
70
71/* -------------------------------------------------------------------------
72 * main
73 * ----------------------------------------------------------------------- */
74int
75main(int argc, char** argv) {
76 signal(SIGINT, signalHandler);
77 signal(SIGTERM, signalHandler);
78#ifndef WIN32
79 signal(SIGUSR1, signalHandler);
80 signal(SIGUSR2, signalHandler);
81#endif
82
85 // give some application descriptions
86 oc.setApplicationDescription(TL("A microscopic, multi-modal traffic simulation."));
87 oc.setApplicationName("sumo", "Eclipse SUMO sumo Version " VERSION_STRING);
88 gSimulation = true;
89 int ret = 0;
90 MSNet* net = nullptr;
91 try {
92 // initialise subsystems
94 OptionsIO::setArgs(argc, argv);
95 // load the net
97 while (state == MSNet::SIMSTATE_LOADING) {
98 net = NLBuilder::init();
99 if (net != nullptr) {
100 state = net->simulate(string2time(oc.getString("begin")), string2time(oc.getString("end")));
101 delete net;
102 } else {
103 break;
104 }
105 // flush warnings and prepare reinit of all outputs
109 }
110 } catch (const ProcessError& e) {
111 if (std::string(e.what()) != std::string("Process Error") && std::string(e.what()) != std::string("")) {
112 WRITE_ERROR(e.what());
113 }
114 MsgHandler::getErrorInstance()->inform(TL("Quitting (on error)."), false);
115 // we need to delete the network explicitly to trigger the cleanup in the correct order
116 delete net;
117 ret = 1;
118#ifndef _DEBUG
119 } catch (const std::exception& e) {
120 if (std::string(e.what()) != std::string("")) {
121 WRITE_ERROR(e.what());
122 }
123 MsgHandler::getErrorInstance()->inform(TL("Quitting (on error)."), false);
124 ret = 1;
125 } catch (...) {
126 MsgHandler::getErrorInstance()->inform(TL("Quitting (on unknown error)."), false);
127 ret = 1;
128#endif
129 }
132 return ret;
133}
134
135
136/****************************************************************************/
#define WRITE_ERROR(msg)
Definition: MsgHandler.h:274
#define TL(string)
Definition: MsgHandler.h:282
SUMOTime string2time(const std::string &r)
convert string to SUMOTime
Definition: SUMOTime.cpp:45
#define SIMSTEP
Definition: SUMOTime.h:60
bool gSimulation
Definition: StdDefs.cpp:29
The simulated network and simulation perfomer.
Definition: MSNet.h:88
const std::string generateStatistics(SUMOTime start)
Writes performance output and running vehicle stats.
Definition: MSNet.cpp:432
static MSNet * getInstance()
Returns the pointer to the unique instance of MSNet (singleton).
Definition: MSNet.cpp:183
SimulationState
Possible states of a simulation - running or stopped with different reasons.
Definition: MSNet.h:93
@ SIMSTATE_LOADING
The simulation is loading.
Definition: MSNet.h:95
void interrupt()
Definition: MSNet.h:809
static bool hasInstance()
Returns whether the network was already constructed.
Definition: MSNet.h:154
SimulationState simulate(SUMOTime start, SUMOTime stop)
Simulates from timestep start to stop.
Definition: MSNet.cpp:384
static MsgHandler * getErrorInstance()
Returns the instance to add errors to.
Definition: MsgHandler.cpp:79
virtual void inform(std::string msg, bool addType=true)
adds a new error to the list
Definition: MsgHandler.cpp:116
static void setupI18n(const std::string &locale="")
set up gettext stuff
Definition: MsgHandler.cpp:228
static MsgHandler * getWarningInstance()
Returns the instance to add warnings to.
Definition: MsgHandler.cpp:66
virtual void clear(bool resetInformed=true)
Clears information whether an error occurred previously and print aggregated message summary.
Definition: MsgHandler.cpp:161
static void cleanupOnEnd()
Removes pending handler.
Definition: MsgHandler.cpp:292
static MSNet * init(const bool isLibsumo=false)
Definition: NLBuilder.cpp:278
A storage for options typed value containers)
Definition: OptionsCont.h:89
void setApplicationName(const std::string &appName, const std::string &fullName)
Sets the application name.
std::string getString(const std::string &name) const
Returns the string-value of the named option (only for Option_String)
void setApplicationDescription(const std::string &appDesc)
Sets the application description.
static OptionsCont & getOptions()
Retrieves the options.
Definition: OptionsCont.cpp:59
static void setArgs(int argc, char **argv)
Stores the command line arguments for later parsing.
Definition: OptionsIO.cpp:58
static void closeAll(bool keepErrorRetrievers=false)
static void close()
Closes all of an applications subsystems.
static void close()
request termination of connection
static void init()
Initialises the xml-subsystem.
Definition: XMLSubSys.cpp:54
int main(int argc, char **argv)
Definition: sumo_main.cpp:75
void signalHandler(int signum)
Definition: sumo_main.cpp:43