Eclipse SUMO - Simulation of Urban MObility
Loading...
Searching...
No Matches
libsumocpp2c.cpp
Go to the documentation of this file.
1/****************************************************************************/
2// Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3// Copyright (C) 2020-2024 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/****************************************************************************/
19// Implementation of the libsumo c++ to c wrapper
20/****************************************************************************/
21
22#ifdef _MSC_VER
23// Avoid warnings in windows build because of strcpy instead of strcpy_s,
24// because the latter is not available on all platforms
25#define _CRT_SECURE_NO_WARNINGS
26#pragma warning(disable:4820 4514 5045 4668 4710)
27#endif
28
29#include <sstream>
30#include <iostream>
31#include <stdlib.h>
33#include <libsumo/TraCIDefs.h>
34#include <libsumo/Simulation.h>
35#include <libsumo/Vehicle.h>
36
37#include "libsumocpp2c.h"
38
39#define DELIMITER ' '
40
41inline char*
42allocateAndCopyString(ModelInstance* comp, const std::string& s) {
43 char* buf = NULL;
44 buf = (char*)comp->allocateMemory(1 + s.length(), sizeof(char));
45 s.copy(buf, 1 + s.length());
46 return buf;
47}
48
49void
50libsumo_load(char* callOptions) {
51 // Tokenize the string, because Simulation::load expects a vector
52 std::vector<std::string> options;
53 std::stringstream ss(callOptions);
54 std::string temp_str;
55 while (std::getline(ss, temp_str, DELIMITER)) {
56 options.push_back(temp_str);
57 }
58
59 try {
60 libsumo::Simulation::load(options);
61 } catch (const libsumo::TraCIException& e) {
62 std::cerr << "libsumo::Simulation::load() failed - reason: " << e.what() << std::endl;
63 abort();
64 }
65}
66
67void
69 libsumo::Simulation::close();
70}
71
72void
73libsumo_step(double time) {
74 libsumo::Simulation::step(time);
75}
76
77int
79 return libsumo::Vehicle::getIDCount();
80}
81
82void
83libsumo_vehicle_moveToXY(const char* paramString) {
84 try {
85 std::vector<std::string> params;
86 std::stringstream ss(paramString);
87 std::string temp_str;
88 while (std::getline(ss, temp_str, DELIMITER)) {
89 params.push_back(temp_str);
90 }
91 char* pEnd;
92 const std::string vehID = params[0];
93 const std::string edgeID = params[1];
94 int laneIndex = strtol(params[2].c_str(), &pEnd, 10);
95 double x = strtod(params[3].c_str(), &pEnd);
96 double y = strtod(params[4].c_str(), &pEnd);
97 double angle = params.size() >= 6 ? strtod(params[5].c_str(), &pEnd) : libsumo::INVALID_DOUBLE_VALUE;
98 int keepRoute = params.size() >= 7 ? strtol(params[6].c_str(), &pEnd, 10) : 1;
99 double matchThreshold = params.size() >= 8 ? strtod(params[7].c_str(), &pEnd) : 100;
100 libsumo::Vehicle::moveToXY(vehID, edgeID, laneIndex, x, y, angle, keepRoute, matchThreshold);
101 } catch (const std::runtime_error& e) {
102 std::cerr << "libsumo::Vehicle::moveToXY() failed - reason: " << e.what() << std::endl;
103 abort();
104 }
105}
106
107void
109 try {
110 std::vector<std::string> params;
111 std::stringstream ss(comp->getterParameters);
112 std::string temp_str;
113 while (std::getline(ss, temp_str, DELIMITER)) {
114 params.push_back(temp_str);
115 }
116
117 const std::string vehID = params[0];
118 const std::string key = params[1];
119 std::pair<std::string, std::string> p = libsumo::Vehicle::getParameterWithKey(vehID, key);
120 const std::string resultString = p.first + DELIMITER + p.second;
121 *result = allocateAndCopyString(comp, resultString);
122 } catch (const std::runtime_error& e) {
123 std::cerr << "libsumo::Vehicle::getParameterWithKey() failed - reason: " << e.what() << std::endl;
124 abort();
125 }
126}
127
128void
129libsumo_vehicle_getLaneID(ModelInstance* comp, const char** result) {
130 try {
131 std::vector<std::string> params;
132 std::stringstream ss(comp->getterParameters);
133 std::string temp_str;
134 while (std::getline(ss, temp_str, DELIMITER)) {
135 params.push_back(temp_str);
136 }
137
138 const std::string vehID = params[0];
139 *result = allocateAndCopyString(comp, libsumo::Vehicle::getLaneID(vehID));
140 } catch (const std::runtime_error& e) {
141 std::cerr << "libsumo::Vehicle::getLaneID() failed - reason: " << e.what() << std::endl;
142 abort();
143 }
144}
145
146void
147libsumo_vehicle_getPosition(ModelInstance* comp, const char** result) {
148 try {
149 std::vector<std::string> params;
150 std::stringstream ss(comp->getterParameters);
151 std::string temp_str;
152 while (std::getline(ss, temp_str, DELIMITER)) {
153 params.push_back(temp_str);
154 }
155
156 const std::string vehID = params[0];
157 libsumo::TraCIPosition pos = libsumo::Vehicle::getPosition(vehID);
158 std::ostringstream os;
159 os << pos.x << DELIMITER << pos.y;
160 *result = allocateAndCopyString(comp, os.str());
161 } catch (const std::runtime_error& e) {
162 std::cerr << "libsumo::Vehicle::getPosition() failed - reason: " << e.what() << std::endl;
163 abort();
164 }
165}
An error which allows to continue.
Definition TraCIDefs.h:144
void libsumo_vehicle_moveToXY(const char *paramString)
#define DELIMITER
char * allocateAndCopyString(ModelInstance *comp, const std::string &s)
void libsumo_load(char *callOptions)
void libsumo_vehicle_getLaneID(ModelInstance *comp, const char **result)
void libsumo_vehicle_getPosition(ModelInstance *comp, const char **result)
void libsumo_vehicle_getParameterWithKey(ModelInstance *comp, const char **result)
void libsumo_step(double time)
void libsumo_close(void)
int libsumo_vehicle_getIDCount(void)
TRACI_CONST double INVALID_DOUBLE_VALUE
char * getterParameters
Parameters stored for the next (libsumo) getter call. Workaround for FMIv2 not allowing input values ...
allocateMemoryType allocateMemory
A 2D or 3D-position, for 2D positions z == INVALID_DOUBLE_VALUE.
Definition TraCIDefs.h:178