Commit 6277038d authored by Navid Nikaein's avatar Navid Nikaein

remove the OMG SUMO related files and update te top-level OMG and cmakefiles

parent 4787c975
...@@ -870,21 +870,16 @@ set(UTIL_SRC ...@@ -870,21 +870,16 @@ set(UTIL_SRC
${OPENAIR2_DIR}/UTIL/OCG/OCG_parse_filename.c ${OPENAIR2_DIR}/UTIL/OCG/OCG_parse_filename.c
${OPENAIR2_DIR}/UTIL/OCG/OCG_parse_XML.c ${OPENAIR2_DIR}/UTIL/OCG/OCG_parse_XML.c
${OPENAIR2_DIR}/UTIL/OCG/OCG_save_XML.c ${OPENAIR2_DIR}/UTIL/OCG/OCG_save_XML.c
${OPENAIR2_DIR}/UTIL/OMG/client_traci_OMG.c
${OPENAIR2_DIR}/UTIL/OMG/common.c ${OPENAIR2_DIR}/UTIL/OMG/common.c
${OPENAIR2_DIR}/UTIL/OMG/grid.c ${OPENAIR2_DIR}/UTIL/OMG/grid.c
${OPENAIR2_DIR}/UTIL/OMG/id_manager.c
${OPENAIR2_DIR}/UTIL/OMG/job.c ${OPENAIR2_DIR}/UTIL/OMG/job.c
${OPENAIR2_DIR}/UTIL/OMG/mobility_parser.c ${OPENAIR2_DIR}/UTIL/OMG/mobility_parser.c
${OPENAIR2_DIR}/UTIL/OMG/omg.c ${OPENAIR2_DIR}/UTIL/OMG/omg.c
${OPENAIR2_DIR}/UTIL/OMG/omg_hashtable.c ${OPENAIR2_DIR}/UTIL/OMG/omg_hashtable.c
${OPENAIR2_DIR}/UTIL/OMG/rwalk.c ${OPENAIR2_DIR}/UTIL/OMG/rwalk.c
${OPENAIR2_DIR}/UTIL/OMG/rwp.c ${OPENAIR2_DIR}/UTIL/OMG/rwp.c
${OPENAIR2_DIR}/UTIL/OMG/sumo.c
${OPENAIR2_DIR}/UTIL/OMG/socket_traci_OMG.c
${OPENAIR2_DIR}/UTIL/OMG/static.c ${OPENAIR2_DIR}/UTIL/OMG/static.c
${OPENAIR2_DIR}/UTIL/OMG/steadystaterwp.c ${OPENAIR2_DIR}/UTIL/OMG/steadystaterwp.c
${OPENAIR2_DIR}/UTIL/OMG/storage_traci_OMG.c
${OPENAIR2_DIR}/UTIL/OMG/trace.c ${OPENAIR2_DIR}/UTIL/OMG/trace.c
${OPENAIR2_DIR}/UTIL/OMG/trace_hashtable.c ${OPENAIR2_DIR}/UTIL/OMG/trace_hashtable.c
${OPENAIR2_DIR}/UTIL/OPT/probe.c ${OPENAIR2_DIR}/UTIL/OPT/probe.c
...@@ -897,6 +892,15 @@ set(UTIL_SRC ...@@ -897,6 +892,15 @@ set(UTIL_SRC
) )
add_library(UTIL ${UTIL_SRC}) add_library(UTIL ${UTIL_SRC})
#set(OMG_SUMO_SRC
# ${OPENAIR2_DIR}/UTIL/OMG/client_traci_OMG.c
# ${OPENAIR2_DIR}/UTIL/OMG/id_manager.c
# ${OPENAIR2_DIR}/UTIL/OMG/sumo.c
# ${OPENAIR2_DIR}/UTIL/OMG/socket_traci_OMG.c
# ${OPENAIR2_DIR}/UTIL/OMG/storage_traci_OMG.c
# )
#add_library(OMG_SUMO ${OMG_SUMO_SRC})
set(SECU_OSA_SRC set(SECU_OSA_SRC
${OPENAIR2_DIR}/UTIL/OSA/osa_key_deriver.c ${OPENAIR2_DIR}/UTIL/OSA/osa_key_deriver.c
${OPENAIR2_DIR}/UTIL/OSA/osa_rijndael.c ${OPENAIR2_DIR}/UTIL/OSA/osa_rijndael.c
...@@ -1752,7 +1756,6 @@ add_executable(oaisim ...@@ -1752,7 +1756,6 @@ add_executable(oaisim
${OPENAIR_TARGETS}/SIMU/USER/oaisim.c ${OPENAIR_TARGETS}/SIMU/USER/oaisim.c
${OPENAIR2_DIR}/RRC/NAS/nas_config.c ${OPENAIR2_DIR}/RRC/NAS/nas_config.c
${OPENAIR2_DIR}/RRC/NAS/rb_config.c ${OPENAIR2_DIR}/RRC/NAS/rb_config.c
${OPENAIR2_DIR}/UTIL/OMG/sumo.c
${OPENAIR3_DIR}/NAS/UE/nas_ue_task.c ${OPENAIR3_DIR}/NAS/UE/nas_ue_task.c
${GTPU_need_ITTI} ${GTPU_need_ITTI}
${OPENAIR_TARGETS}/COMMON/create_tasks.c ${OPENAIR_TARGETS}/COMMON/create_tasks.c
......
----------------------------------------------------------------------------------
OpenAir Mobility Generator (OMG) - Mobility provided by the SUMO simulator
----------------------------------------------------------------------------------
Notes:
- The Simulation of Urban Mobility (SUMO) needs to be downloaded, configured and compiled. Please download the sources from this address
http://sumo.sourceforge.net/
or alternatively chechout from the following SUMO svn
svn co https://sumo.svn.sourceforge.net/svnroot/sumo/trunk/sumo sumo
(among the other required packages for SUMO, you also need the following tools for SUMO compilation. Please use the following command to install:
sudo apt-get install build-essential autoconf buildtool)
and follow the installation instructions at http://sumo.sourceforge.net/doc/current/docs/userdoc/Installing.html
- OMG will look for the SUMO and SUMO-GUI exectuable from this SUMO folder.
- SUMO/SCENARIOS is the default folder for SUMO scenarios. Please add all required scenario on that folder.
- OMG will launch SUMO with one single SUMO config file. Please regoup all your SUMO XML files (network, route et others) in one .cfg file. More details on the SUMO website.
- SUMO will be lauched using the following command
sumo -c scen.sumo.cfg -b 0 -e 1000 -v
or, if you want to enable TraCI server (here as example listening on port 8883). Please bear in mind that this launch will be blocking upon a TraCI client
sumo -c scen.sumo.cfg -b 0 -e 1000 -remote-port 8883 -v
or, if you prefer the SUMO GUI and select manually the scenario file on the GUI window
sumo-gui
- Once installation completed, please check that SUMO is working properly by following the STANDALONE scenario
- GUI: lauch: sumo-gui
load: scen.sumo.cfg
- CommandLine: sumo -c scen.sumo.cfg -b 0 -e 1000 -v
----------------------------------------------------------------------------------
The OpenAirInterface Team
openair_tech@eurecom.fr
----------------------------------------------------------------------------------
<configuration>
<input>
<net-file value="traci_ex_Map.net.xml"/>
<route-files value="traci_ex_ROU.rou.xml"/>
<!-- <additional-files value="test.add.xml"/> -->
</input>
</configuration>
Sumo version used 0.12.3:
to start sumo with the existing route and network files below command was used.
sumo -n traci_ex_Map.net.xml -r traci_ex_ROU.rou.xml -b 0 -e 1000 --remote-port 8883 -v
\ No newline at end of file
<configuration>
<input>
<net-file value="traci_ex_Map.net.xml"/>
<route-files value="traci_ex_ROU.rou.xml"/>
<!-- <additional-files value="test.add.xml"/> -->
</input>
<simulation>
<begin>0</begin>
<end>200</end>
</simulation>
<traci_server>
<remote-port>8890</remote-port>
</traci_server>
</configuration>
This source diff could not be displayed because it is too large. You can view the blob instead.
<?xml version="1.0"?>
<!-- generated on 08/19/09 15:48:50 by SUMO duarouter Version 0.11.0
<configuration>
<input
net-file="C:\For_MOVE\MOVE_example\ex_Map.net.xml"
flow-definition="C:\For_MOVE\MOVE_example\ex_FLOW.flow.xml"
/>
<output
output-file="C:\For_MOVE\MOVE_example\ex_ROU.rou.xml"
/>
<processing
continue-on-unbuild="true"
/>
<time
begin="0"
end="1000"
/>
<report
verbose="true"
suppress-warnings="true"
/>
</configuration>
-->
<routes>
<vehicle id="0" depart="0">
<route edges="edgeD-2-0 edgeR-2-0 edgeD-1-1 edgeR-1-1 edgeD-0-2"/>
</vehicle>
<vehicle id="1" depart="10">
<route edges="edgeD-2-0 edgeR-2-0 edgeD-1-1 edgeR-1-1 edgeD-0-2"/>
</vehicle>
<vehicle id="2" depart="20">
<route edges="edgeD-2-0 edgeR-2-0 edgeD-1-1 edgeR-1-1 edgeD-0-2"/>
</vehicle>
<vehicle id="3" depart="30">
<route edges="edgeD-2-0 edgeR-2-0 edgeD-1-1 edgeR-1-1 edgeD-0-2"/>
</vehicle>
<vehicle id="4" depart="40">
<route edges="edgeD-2-0 edgeR-2-0 edgeD-1-1 edgeR-1-1 edgeD-0-2"/>
</vehicle>
<vehicle id="5" depart="50">
<route edges="edgeD-2-0 edgeR-2-0 edgeD-1-1 edgeR-1-1 edgeD-0-2"/>
</vehicle>
<vehicle id="6" depart="60">
<route edges="edgeD-2-0 edgeR-2-0 edgeD-1-1 edgeR-1-1 edgeD-0-2"/>
</vehicle>
<vehicle id="7" depart="70">
<route edges="edgeD-2-0 edgeR-2-0 edgeD-1-1 edgeR-1-1 edgeD-0-2"/>
</vehicle>
<vehicle id="8" depart="80">
<route edges="edgeD-2-0 edgeR-2-0 edgeD-1-1 edgeR-1-1 edgeD-0-2"/>
</vehicle>
<vehicle id="9" depart="90">
<route edges="edgeD-2-0 edgeR-2-0 edgeD-1-1 edgeR-1-1 edgeD-0-2"/>
</vehicle>
<vehicle id="10" depart="100">
<route edges="edgeD-2-0 edgeR-2-0 edgeD-1-1 edgeR-1-1 edgeD-0-2"/>
</vehicle>
<vehicle id="11" depart="110">
<route edges="edgeD-2-0 edgeR-2-0 edgeD-1-1 edgeR-1-1 edgeD-0-2"/>
</vehicle>
<vehicle id="12" depart="120">
<route edges="edgeD-2-0 edgeR-2-0 edgeD-1-1 edgeR-1-1 edgeD-0-2"/>
</vehicle>
<vehicle id="13" depart="130">
<route edges="edgeD-2-0 edgeR-2-0 edgeD-1-1 edgeR-1-1 edgeD-0-2"/>
</vehicle>
<vehicle id="14" depart="140">
<route edges="edgeD-2-0 edgeR-2-0 edgeD-1-1 edgeR-1-1 edgeD-0-2"/>
</vehicle>
<vehicle id="15" depart="150">
<route edges="edgeD-2-0 edgeR-2-0 edgeD-1-1 edgeR-1-1 edgeD-0-2"/>
</vehicle>
<vehicle id="16" depart="160">
<route edges="edgeD-2-0 edgeR-2-0 edgeD-1-1 edgeR-1-1 edgeD-0-2"/>
</vehicle>
<vehicle id="17" depart="170">
<route edges="edgeD-2-0 edgeR-2-0 edgeD-1-1 edgeR-1-1 edgeD-0-2"/>
</vehicle>
<vehicle id="18" depart="180">
<route edges="edgeD-2-0 edgeR-2-0 edgeD-1-1 edgeR-1-1 edgeD-0-2"/>
</vehicle>
<vehicle id="19" depart="190">
<route edges="edgeD-2-0 edgeR-2-0 edgeD-1-1 edgeR-1-1 edgeD-0-2"/>
</vehicle>
<vehicle id="20" depart="200">
<route edges="edgeD-2-0 edgeR-2-0 edgeD-1-1 edgeR-1-1 edgeD-0-2"/>
</vehicle>
<vehicle id="21" depart="210">
<route edges="edgeD-2-0 edgeR-2-0 edgeD-1-1 edgeR-1-1 edgeD-0-2"/>
</vehicle>
<vehicle id="22" depart="220">
<route edges="edgeD-2-0 edgeR-2-0 edgeD-1-1 edgeR-1-1 edgeD-0-2"/>
</vehicle>
<vehicle id="23" depart="230">
<route edges="edgeD-2-0 edgeR-2-0 edgeD-1-1 edgeR-1-1 edgeD-0-2"/>
</vehicle>
<vehicle id="24" depart="240">
<route edges="edgeD-2-0 edgeR-2-0 edgeD-1-1 edgeR-1-1 edgeD-0-2"/>
</vehicle>
<vehicle id="25" depart="250">
<route edges="edgeD-2-0 edgeR-2-0 edgeD-1-1 edgeR-1-1 edgeD-0-2"/>
</vehicle>
<vehicle id="26" depart="260">
<route edges="edgeD-2-0 edgeR-2-0 edgeD-1-1 edgeR-1-1 edgeD-0-2"/>
</vehicle>
<vehicle id="27" depart="270">
<route edges="edgeD-2-0 edgeR-2-0 edgeD-1-1 edgeR-1-1 edgeD-0-2"/>
</vehicle>
<vehicle id="28" depart="280">
<route edges="edgeD-2-0 edgeR-2-0 edgeD-1-1 edgeR-1-1 edgeD-0-2"/>
</vehicle>
<vehicle id="29" depart="290">
<route edges="edgeD-2-0 edgeR-2-0 edgeD-1-1 edgeR-1-1 edgeD-0-2"/>
</vehicle>
<vehicle id="30" depart="300">
<route edges="edgeD-2-0 edgeR-2-0 edgeD-1-1 edgeR-1-1 edgeD-0-2"/>
</vehicle>
<vehicle id="31" depart="310">
<route edges="edgeD-2-0 edgeR-2-0 edgeD-1-1 edgeR-1-1 edgeD-0-2"/>
</vehicle>
<vehicle id="32" depart="320">
<route edges="edgeD-2-0 edgeR-2-0 edgeD-1-1 edgeR-1-1 edgeD-0-2"/>
</vehicle>
<vehicle id="33" depart="330">
<route edges="edgeD-2-0 edgeR-2-0 edgeD-1-1 edgeR-1-1 edgeD-0-2"/>
</vehicle>
<vehicle id="34" depart="340">
<route edges="edgeD-2-0 edgeR-2-0 edgeD-1-1 edgeR-1-1 edgeD-0-2"/>
</vehicle>
<vehicle id="35" depart="350">
<route edges="edgeD-2-0 edgeR-2-0 edgeD-1-1 edgeR-1-1 edgeD-0-2"/>
</vehicle>
<vehicle id="36" depart="360">
<route edges="edgeD-2-0 edgeR-2-0 edgeD-1-1 edgeR-1-1 edgeD-0-2"/>
</vehicle>
<vehicle id="37" depart="370">
<route edges="edgeD-2-0 edgeR-2-0 edgeD-1-1 edgeR-1-1 edgeD-0-2"/>
</vehicle>
<vehicle id="38" depart="380">
<route edges="edgeD-2-0 edgeR-2-0 edgeD-1-1 edgeR-1-1 edgeD-0-2"/>
</vehicle>
<vehicle id="39" depart="390">
<route edges="edgeD-2-0 edgeR-2-0 edgeD-1-1 edgeR-1-1 edgeD-0-2"/>
</vehicle>
<vehicle id="40" depart="400">
<route edges="edgeD-2-0 edgeR-2-0 edgeD-1-1 edgeR-1-1 edgeD-0-2"/>
</vehicle>
<vehicle id="41" depart="410">
<route edges="edgeD-2-0 edgeR-2-0 edgeD-1-1 edgeR-1-1 edgeD-0-2"/>
</vehicle>
<vehicle id="42" depart="420">
<route edges="edgeD-2-0 edgeR-2-0 edgeD-1-1 edgeR-1-1 edgeD-0-2"/>
</vehicle>
<vehicle id="43" depart="430">
<route edges="edgeD-2-0 edgeR-2-0 edgeD-1-1 edgeR-1-1 edgeD-0-2"/>
</vehicle>
<vehicle id="44" depart="440">
<route edges="edgeD-2-0 edgeR-2-0 edgeD-1-1 edgeR-1-1 edgeD-0-2"/>
</vehicle>
<vehicle id="45" depart="450">
<route edges="edgeD-2-0 edgeR-2-0 edgeD-1-1 edgeR-1-1 edgeD-0-2"/>
</vehicle>
<vehicle id="46" depart="460">
<route edges="edgeD-2-0 edgeR-2-0 edgeD-1-1 edgeR-1-1 edgeD-0-2"/>
</vehicle>
<vehicle id="47" depart="470">
<route edges="edgeD-2-0 edgeR-2-0 edgeD-1-1 edgeR-1-1 edgeD-0-2"/>
</vehicle>
<vehicle id="48" depart="480">
<route edges="edgeD-2-0 edgeR-2-0 edgeD-1-1 edgeR-1-1 edgeD-0-2"/>
</vehicle>
<vehicle id="49" depart="490">
<route edges="edgeD-2-0 edgeR-2-0 edgeD-1-1 edgeR-1-1 edgeD-0-2"/>
</vehicle>
<vehicle id="50" depart="500">
<route edges="edgeD-2-0 edgeR-2-0 edgeD-1-1 edgeR-1-1 edgeD-0-2"/>
</vehicle>
<vehicle id="51" depart="510">
<route edges="edgeD-2-0 edgeR-2-0 edgeD-1-1 edgeR-1-1 edgeD-0-2"/>
</vehicle>
<vehicle id="52" depart="520">
<route edges="edgeD-2-0 edgeR-2-0 edgeD-1-1 edgeR-1-1 edgeD-0-2"/>
</vehicle>
<vehicle id="53" depart="530">
<route edges="edgeD-2-0 edgeR-2-0 edgeD-1-1 edgeR-1-1 edgeD-0-2"/>
</vehicle>
<vehicle id="54" depart="540">
<route edges="edgeD-2-0 edgeR-2-0 edgeD-1-1 edgeR-1-1 edgeD-0-2"/>
</vehicle>
<vehicle id="55" depart="550">
<route edges="edgeD-2-0 edgeR-2-0 edgeD-1-1 edgeR-1-1 edgeD-0-2"/>
</vehicle>
<vehicle id="56" depart="560">
<route edges="edgeD-2-0 edgeR-2-0 edgeD-1-1 edgeR-1-1 edgeD-0-2"/>
</vehicle>
<vehicle id="57" depart="570">
<route edges="edgeD-2-0 edgeR-2-0 edgeD-1-1 edgeR-1-1 edgeD-0-2"/>
</vehicle>
<vehicle id="58" depart="580">
<route edges="edgeD-2-0 edgeR-2-0 edgeD-1-1 edgeR-1-1 edgeD-0-2"/>
</vehicle>
<vehicle id="59" depart="590">
<route edges="edgeD-2-0 edgeR-2-0 edgeD-1-1 edgeR-1-1 edgeD-0-2"/>
</vehicle>
<vehicle id="60" depart="600">
<route edges="edgeD-2-0 edgeR-2-0 edgeD-1-1 edgeR-1-1 edgeD-0-2"/>
</vehicle>
<vehicle id="61" depart="610">
<route edges="edgeD-2-0 edgeR-2-0 edgeD-1-1 edgeR-1-1 edgeD-0-2"/>
</vehicle>
<vehicle id="62" depart="620">
<route edges="edgeD-2-0 edgeR-2-0 edgeD-1-1 edgeR-1-1 edgeD-0-2"/>
</vehicle>
<vehicle id="63" depart="630">
<route edges="edgeD-2-0 edgeR-2-0 edgeD-1-1 edgeR-1-1 edgeD-0-2"/>
</vehicle>
<vehicle id="64" depart="640">
<route edges="edgeD-2-0 edgeR-2-0 edgeD-1-1 edgeR-1-1 edgeD-0-2"/>
</vehicle>
<vehicle id="65" depart="650">
<route edges="edgeD-2-0 edgeR-2-0 edgeD-1-1 edgeR-1-1 edgeD-0-2"/>
</vehicle>
<vehicle id="66" depart="660">
<route edges="edgeD-2-0 edgeR-2-0 edgeD-1-1 edgeR-1-1 edgeD-0-2"/>
</vehicle>
<vehicle id="67" depart="670">
<route edges="edgeD-2-0 edgeR-2-0 edgeD-1-1 edgeR-1-1 edgeD-0-2"/>
</vehicle>
<vehicle id="68" depart="680">
<route edges="edgeD-2-0 edgeR-2-0 edgeD-1-1 edgeR-1-1 edgeD-0-2"/>
</vehicle>
<vehicle id="69" depart="690">
<route edges="edgeD-2-0 edgeR-2-0 edgeD-1-1 edgeR-1-1 edgeD-0-2"/>
</vehicle>
<vehicle id="70" depart="700">
<route edges="edgeD-2-0 edgeR-2-0 edgeD-1-1 edgeR-1-1 edgeD-0-2"/>
</vehicle>
<vehicle id="71" depart="710">
<route edges="edgeD-2-0 edgeR-2-0 edgeD-1-1 edgeR-1-1 edgeD-0-2"/>
</vehicle>
<vehicle id="72" depart="720">
<route edges="edgeD-2-0 edgeR-2-0 edgeD-1-1 edgeR-1-1 edgeD-0-2"/>
</vehicle>
<vehicle id="73" depart="730">
<route edges="edgeD-2-0 edgeR-2-0 edgeD-1-1 edgeR-1-1 edgeD-0-2"/>
</vehicle>
<vehicle id="74" depart="740">
<route edges="edgeD-2-0 edgeR-2-0 edgeD-1-1 edgeR-1-1 edgeD-0-2"/>
</vehicle>
<vehicle id="75" depart="750">
<route edges="edgeD-2-0 edgeR-2-0 edgeD-1-1 edgeR-1-1 edgeD-0-2"/>
</vehicle>
<vehicle id="76" depart="760">
<route edges="edgeD-2-0 edgeR-2-0 edgeD-1-1 edgeR-1-1 edgeD-0-2"/>
</vehicle>
<vehicle id="77" depart="770">
<route edges="edgeD-2-0 edgeR-2-0 edgeD-1-1 edgeR-1-1 edgeD-0-2"/>
</vehicle>
<vehicle id="78" depart="780">
<route edges="edgeD-2-0 edgeR-2-0 edgeD-1-1 edgeR-1-1 edgeD-0-2"/>
</vehicle>
<vehicle id="79" depart="790">
<route edges="edgeD-2-0 edgeR-2-0 edgeD-1-1 edgeR-1-1 edgeD-0-2"/>
</vehicle>
<vehicle id="80" depart="800">
<route edges="edgeD-2-0 edgeR-2-0 edgeD-1-1 edgeR-1-1 edgeD-0-2"/>
</vehicle>
<vehicle id="81" depart="810">
<route edges="edgeD-2-0 edgeR-2-0 edgeD-1-1 edgeR-1-1 edgeD-0-2"/>
</vehicle>
<vehicle id="82" depart="820">
<route edges="edgeD-2-0 edgeR-2-0 edgeD-1-1 edgeR-1-1 edgeD-0-2"/>
</vehicle>
<vehicle id="83" depart="830">
<route edges="edgeD-2-0 edgeR-2-0 edgeD-1-1 edgeR-1-1 edgeD-0-2"/>
</vehicle>
<vehicle id="84" depart="840">
<route edges="edgeD-2-0 edgeR-2-0 edgeD-1-1 edgeR-1-1 edgeD-0-2"/>
</vehicle>
<vehicle id="85" depart="850">
<route edges="edgeD-2-0 edgeR-2-0 edgeD-1-1 edgeR-1-1 edgeD-0-2"/>
</vehicle>
<vehicle id="86" depart="860">
<route edges="edgeD-2-0 edgeR-2-0 edgeD-1-1 edgeR-1-1 edgeD-0-2"/>
</vehicle>
<vehicle id="87" depart="870">
<route edges="edgeD-2-0 edgeR-2-0 edgeD-1-1 edgeR-1-1 edgeD-0-2"/>
</vehicle>
<vehicle id="88" depart="880">
<route edges="edgeD-2-0 edgeR-2-0 edgeD-1-1 edgeR-1-1 edgeD-0-2"/>
</vehicle>
<vehicle id="89" depart="890">
<route edges="edgeD-2-0 edgeR-2-0 edgeD-1-1 edgeR-1-1 edgeD-0-2"/>
</vehicle>
<vehicle id="90" depart="900">
<route edges="edgeD-2-0 edgeR-2-0 edgeD-1-1 edgeR-1-1 edgeD-0-2"/>
</vehicle>
<vehicle id="91" depart="910">
<route edges="edgeD-2-0 edgeR-2-0 edgeD-1-1 edgeR-1-1 edgeD-0-2"/>
</vehicle>
<vehicle id="92" depart="920">
<route edges="edgeD-2-0 edgeR-2-0 edgeD-1-1 edgeR-1-1 edgeD-0-2"/>
</vehicle>
<vehicle id="93" depart="930">
<route edges="edgeD-2-0 edgeR-2-0 edgeD-1-1 edgeR-1-1 edgeD-0-2"/>
</vehicle>
<vehicle id="94" depart="940">
<route edges="edgeD-2-0 edgeR-2-0 edgeD-1-1 edgeR-1-1 edgeD-0-2"/>
</vehicle>
<vehicle id="95" depart="950">
<route edges="edgeD-2-0 edgeR-2-0 edgeD-1-1 edgeR-1-1 edgeD-0-2"/>
</vehicle>
<vehicle id="96" depart="960">
<route edges="edgeD-2-0 edgeR-2-0 edgeD-1-1 edgeR-1-1 edgeD-0-2"/>
</vehicle>
<vehicle id="97" depart="970">
<route edges="edgeD-2-0 edgeR-2-0 edgeD-1-1 edgeR-1-1 edgeD-0-2"/>
</vehicle>
<vehicle id="98" depart="980">
<route edges="edgeD-2-0 edgeR-2-0 edgeD-1-1 edgeR-1-1 edgeD-0-2"/>
</vehicle>
<vehicle id="99" depart="990">
<route edges="edgeD-2-0 edgeR-2-0 edgeD-1-1 edgeR-1-1 edgeD-0-2"/>
</vehicle>
</routes>
#ifndef TRACICONSTANTS_H
#define TRACICONSTANTS_H
// command: subscribe simulation variable
#define CMD_SUBSCRIBE_SIM_VARIABLE 0xdb
// departed vehicle ids (get: simulation)
#define VAR_DEPARTED_VEHICLES_IDS 0x74
// command: simulation step (new version)
#define CMD_SIMSTEP2 0x02
// command: close sumo
#define CMD_CLOSE 0x7F
// command: get vehicle variable
#define CMD_GET_VEHICLE_VARIABLE 0xa4
// command: Scenario
#define CMD_SCENARIO 0x73
// max count of vehicles
#define DOMVAR_MAXCOUNT 0x0A
// 32 bit integer
#define TYPE_INTEGER 0x09
// speed of a node
#define DOMVAR_SPEED 0x04
// position of a domain object
#define DOMVAR_POSITION 0x02
// position (2D) (get: vehicle, poi, set: poi)
#define VAR_POSITION 0x42
// speed (get: vehicle)
#define VAR_SPEED 0x40
// position of a domain object
#define DOMVAR_POSITION 0x02
// ids of arrived vehicles (get: simulation)
#define VAR_ARRIVED_VEHICLES_IDS 0x7a
// ****************************************
// RESULT TYPES
// ****************************************
// result type: Ok
#define RTYPE_OK 0x00
#endif
\ No newline at end of file
/*
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The OpenAirInterface Software Alliance licenses this file to You under
* the OAI Public License, Version 1.0 (the "License"); you may not use this file
* except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.openairinterface.org/?page_id=698
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*-------------------------------------------------------------------------------
* For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org
*/
/*! \file client_traci_OMG.c
* \brief The OMG TraCI to send/receive commands from/to SUMO via socket interfaces.
* \author S. Uppoor, J. Harri
* \date 2012
* \version 0.1
* \company INRIA, Eurecom
* \email: sandesh.uppor@inria.fr, haerri@eurecom.fr
* \note
* \warning
*/
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/time.h>
#include <string.h>
#include "client_traci_OMG.h"
#include "TraCIConstants.h"
#define UNUSED_VARIABLE(vARIABLE) (void)(vARIABLE)
int handshake(char *hoststr,int portno)
{
check_endianness(); // check endianness
int i;
for(i = 0; i< 10; i++) {
if ( connection_(hoststr,portno) <0 ) {
#ifdef STANDALONE
printf("connection error...trying again in 3 seconds\n");
#else
LOG_E(OMG, " Could not connect to TraCIServer - sleeping before trying again...\n");
#endif
sleep(5);
} else {
#ifdef STANDALONE
printf(" SUMO now connected to OMG on host address\n");
#else
LOG_N(OMG, " SUMO now connected to OMG on host address %s and port %i .\n", hoststr, portno);
#endif
return 0;
}
}
#ifdef STANDALONE
printf(" SUMO unreachable...giving up...\n");
#else
LOG_E(OMG, " SUMO unreachable...giving up...\n");
#endif
return -1;
}
void init(int max_sim_time)
{
#ifdef STANDALONE
printf(" Initializing TraCI...\n");
#else
LOG_N(OMG, " Initializing TraCI...\n");
#endif
char *objID = " ";
// size_t size = strlen(objID);
int noSubscribedVars = 2;
writeUnsignedByte(0);
writeInt(1 + 4 + 1 + 4 + 4 + 4 + (int) strlen(objID) + 1 + noSubscribedVars);
writeUnsignedByte(CMD_SUBSCRIBE_SIM_VARIABLE); // command id
writeInt(0); // begin time
writeInt(max_sim_time*1000); // end time
writeString(objID); // object id
writeUnsignedByte(noSubscribedVars); // variable number
writeUnsignedByte(VAR_DEPARTED_VEHICLES_IDS);
writeUnsignedByte(VAR_ARRIVED_VEHICLES_IDS);
// send request message
sendExact(storageLength(storageStart));
extractCommandStatus(receiveExact(), CMD_SUBSCRIBE_SIM_VARIABLE, description);
if (departed == NULL) {
departed = (string_list*) malloc(sizeof(string_list)); // departed MUST point to HEAD
departed->string = NULL;
departed->next = NULL;
}
if (arrived == NULL) {
arrived = (string_list*) malloc(sizeof(string_list)); // arrived MUST point to HEAD
arrived->string = NULL;
arrived->next = NULL;
}
processSubscriptions();
reset();
}
void processSubscriptions()
{
int noSubscriptions = readInt();
string_list* tmp_departed = departed;
string_list* tmp_arrived = arrived;
int s;
for (s = 0; s<noSubscriptions; ++s) {
int respStart = readInt();
int respLength = readUnsignedByte();
if (respLength == 0)
respLength = readInt();
int cmdId = readUnsignedByte();
if (cmdId<0xe0||cmdId>0xef) { // only responses to subscription to supported types (vehicles, TLC, polygones...) are accepted
//LOG_W(OMG, " Invalide Subscription response: %d\n",cmdId);
//printf(" Invalide Subscription response: %d\n",cmdId);
return;
}
char *objID = readString();
int varNo = readUnsignedByte();
UNUSED_VARIABLE(objID);
UNUSED_VARIABLE(respStart);
int i;
for (i=0; i<varNo; ++i) {
int varID = readUnsignedByte();
bool ok = readUnsignedByte()==RTYPE_OK;
int valueDataType = readUnsignedByte();
UNUSED_VARIABLE(valueDataType);
if (ok&&cmdId==CMD_SUBSCRIBE_SIM_VARIABLE+0x10&&varID==VAR_DEPARTED_VEHICLES_IDS) {
tmp_departed = readStringList(tmp_departed);
//printf(" OMG Got departed cars\n");
continue;
}
if (ok&&cmdId==CMD_SUBSCRIBE_SIM_VARIABLE+0x10&&varID==VAR_ARRIVED_VEHICLES_IDS) {
tmp_arrived = readStringList(tmp_arrived);
//printf(" OMG Got arrived cars\n");
continue;
}
}
free( objID );
}
}
int extractCommandStatus(storage *s, unsigned char commandId, char * description)
{
int success=0;
if(s == NULL) {
//LOG_E(OMG, " client_traci_OMG::extractCommandStatus(): Tracker is NULL \n");
//printf(" client_traci_OMG::extractCommandStatus(): Tracker is NULL \n");
return success=0;
}
// validate the the message response from SUMO
int storageLength_ = storageLength(s);
// tracker currently points to the begining of the recieved data in the linked list
tracker = s;
// storage *freeTracker = tracker; // save it for calling free
int commandLength = readUnsignedByte();
// CommandID needs to fit
int rcvdCommandId = readUnsignedByte();
if (rcvdCommandId == (int)commandId) {
//printf("%d",rcvdCommandId);
//LOG_E(OMG, " Server answered to command\n");
//printf(" Server answered to command\n");
}
// Get result and description
unsigned char result = readUnsignedByte();
if (result != RTYPE_OK) {
printf(" Server returned error\n");
return success=0;
}
if (result == RTYPE_OK) {
// printf(" Server returned success\n");
success=1;
}
description = readString();
// print description if needed
free( description );
description = 0;
//free actual message content
//depends on the message which is handled
/* if (commandId != CMD_GET_VEHICLE_VARIABLE)
freeStorage(freeTracker);*/
UNUSED_VARIABLE(commandLength);
UNUSED_VARIABLE(storageLength_);
return success;
}
void commandSimulationStep(double time)
{
// progress the simulation in SUMO
// reset is used to initalize the global parameters
reset();
// Send command
writeUnsignedByte(1 + 1 + 4); // command length
writeUnsignedByte(CMD_SIMSTEP2); // look up TraCIConstants.h
// writeInt((int)(time*1000)); // TraCI accepts time in milli seconds
writeInt((int)(time)); // TraCI accepts time in milli seconds
sendExact(storageLength(storageStart));
extractCommandStatus(receiveExact(), CMD_SIMSTEP2, description);
if (departed == NULL) {
departed = (string_list*) malloc(sizeof(string_list)); // departed MUST point to HEAD
departed->string = NULL;
departed->next = NULL;
}
if (arrived == NULL) {
arrived = (string_list*) malloc(sizeof(string_list)); // arrived MUST point to HEAD
arrived->string = NULL;
arrived->next = NULL;
}
/* if (departed == NULL)
departed = (String_list)malloc(sizeof(String_list)); // departed MUST point to HEAD
if (arrived == NULL)
arrived = (String_list)malloc(sizeof(String_list)); // departed MUST point to HEAD
*/
processSubscriptions();
}
void commandClose()
{
reset();
// command length
writeUnsignedByte(0x02);
// command id
writeUnsignedByte(CMD_CLOSE);
// send request message
#ifdef STANDALONE
printf("closing the socket... \n");
#else
LOG_N(OMG,"closing the socket... \n");
#endif
sendExact(storageLength(storageStart));
extractCommandStatus(receiveExact(), CMD_CLOSE, description);
}
void commandGetVehicleVariable(char *vehID, int varID)// malloc for vehID and varID depends on speed or position
{
reset();
int domID = CMD_GET_VEHICLE_VARIABLE;//0xa4 specific for get vehicle variable command
// command length
writeUnsignedByte(1 + 1 + 1 + 4 + (int)strlen(vehID));
// command id
writeUnsignedByte(CMD_GET_VEHICLE_VARIABLE);
// variable id
writeUnsignedByte(varID);
// object id
writeString(vehID);
// send request message
sendExact(storageLength(storageStart));
// receive answer message
//receiveExact();
if (extractCommandStatus(receiveExact(), CMD_GET_VEHICLE_VARIABLE, description)) { //<---RESPONSE_GET_VEHICLE_VARIABLE
// validate result state
if(tracker == NULL) {
// LOG_E(OMG, " client_traci_OMG::commandGetVehicleVariable(): Tracker is NULL \n");
//printf(" client_traci_OMG::commandGetVehicleVariable(): Tracker is NULL \n");
return;
}
int length = readUnsignedByte();
if(length ==0)
length = readInt();
int cmdId =readUnsignedByte();
if (cmdId != (CMD_GET_VEHICLE_VARIABLE+0x10)) {
//LOG_E(OMG, " Wrong response recieved\n");
//printf(" Wrong response recieved\n");
return;
}
int VariableID = readUnsignedByte();
char* rs = readString();
int valueDataType = readUnsignedByte();
UNUSED_VARIABLE(VariableID);
UNUSED_VARIABLE(rs);
UNUSED_VARIABLE(valueDataType);
UNUSED_VARIABLE(domID);
free( rs );
}
}
// TODO not working for now..need to find a way to get the same info without using CMD_SCENARIO (as not implemented by SUMO)
int commandGetMaxSUMONodesVariable()
{
reset();
int max_car = 0;
// command length
writeUnsignedByte(1 + 1 + 1 + 1 + 4 + 1 + 1 + 4);
// command id
writeUnsignedByte(CMD_SCENARIO);
// flag
writeUnsignedByte(0x00); // GET command for the generic environment-related values
// command id
//writeUnsignedByte(CMD_SCENARIO);
// domain id
writeUnsignedByte(0x01); // vehicle
writeInt(0); // first vehicular domain
// variable id
writeUnsignedByte(DOMVAR_MAXCOUNT); // get maximum number of vehicles
writeUnsignedByte(TYPE_INTEGER); // get maximum number of vehicles
writeInt(max_car); // get maximum number of vehicles
// send request message
sendExact(storageLength(storageStart));
// receive answer message
if (extractCommandStatus(receiveExact(), CMD_SCENARIO, description)) { //<---RESPONSE_GET_VEHICLE_VARIABLE
// validate result state
if(tracker == NULL) {
//LOG_E(OMG, " client_traci_OMG::commandGetMaxSUMONodesVariable(): Tracker is NULL \n");
return -1;
}
int res = readUnsignedByte();
int Length = readUnsignedByte(); // to check with Int
int cmdId =readUnsignedByte();
if (cmdId != (CMD_SCENARIO)) {
//LOG_E(OMG, " Wrong response recieved \n");
return -1;
}
int flag = readUnsignedByte();
int dom = readUnsignedByte(); // domain
int domID = readInt(); // domain ID
int VariableID = readUnsignedByte();
int valueDataType = readUnsignedByte();
if (valueDataType == TYPE_INTEGER) {
max_car = readInt();
//LOG_N(OMG, " max Number SUMO nodes is: %f \n", max_car);
} else {
//LOG_W(OMG, " No Matching Data Type Value \n");
}
UNUSED_VARIABLE(res);
UNUSED_VARIABLE(Length);
UNUSED_VARIABLE(flag);
UNUSED_VARIABLE(dom);
UNUSED_VARIABLE(domID);
UNUSED_VARIABLE(VariableID);
}
return max_car;
}
void GetSpeed(node_struct* node, char * sumo_id)
{
commandGetVehicleVariable(sumo_id, VAR_SPEED);
double speed_double = readDouble();
node->mob->speed = speed_double;
}
void GetPosition(node_struct* node, char * sumo_id)
{
commandGetVehicleVariable(sumo_id, VAR_POSITION);
double x_double = readDouble();
if (x_double < 0.0)
x_double = 0.0;
double y_double = readDouble();
if (y_double < 0.0)
y_double = 0.0;
node->x_pos = x_double;
node->y_pos = y_double;
}
/*
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The OpenAirInterface Software Alliance licenses this file to You under
* the OAI Public License, Version 1.0 (the "License"); you may not use this file
* except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.openairinterface.org/?page_id=698
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*-------------------------------------------------------------------------------
* For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org
*/
/*! \file client_traci_OMG.h
* \brief The OMG TraCI to send/receive commands from/to SUMO via socket interfaces.
* \author S. Uppoor, J. Harri
* \date 2012
* \version 0.1
* \company INRIA, Eurecom
* \email: sandesh.uppor@inria.fr, haerri@eurecom.fr
* \note
* \warning
*/
#ifndef TRACICLIENT_OMG_H
#define TRACICLIENT_OMG_H
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "omg.h"
//#include "TraCIConstants.h"
#include "storage_traci_OMG.h"
#include "socket_traci_OMG.h"
#define MAX_ATTEMPTS 5; // number of connection attemps to SUMO
int targetTime;
char *description;
string_list* departed; // string list of all vehicles appearing in SUMO at the current time step
string_list* arrived; // string list of all vehicles leaving SUMO at the current time step
/**
* Global parameters defined in storage_traci_OMG.h
*/
extern storage *head;
extern storage *storageStart;
extern storage *tracker;
extern int descLen;
/**
* \fn handshake(char *,int)
* \brief Talks to SUMO by establishing connection
* \param Accepts host name and port number
*/
int handshake(char *,int);
/**
* \fn extractCommandStatus(storage *, unsigned char , char *)
* \brief Validates the RESPONSE recieved by SUMO
* \param Accepts storage pointer where data is read and stored, command ID for which response is recieved, description
*/
int extractCommandStatus(storage *, unsigned char , char *);
/**
* \fn commandSimulationStep(double)
* \brief Advances the SUMO Simulation
* \param Accepts number of steps or seconds SUMO should Simulate
*/
void commandSimulationStep(double);
/**
* \fn commandClose(void);
* \brief Send termination command to SUMO
*/
void commandClose(void);
/**
* \fn commandGetVehicleVariable(char *vehID, int varID)
* \brief Gets the position position and speed info
* \param Accepts vehicle ID and variable ID, here variable ID is the comaand type
*/
void commandGetVehicleVariable(char *vehID, int varID);
/**
* \fn get_num_sumo_nodes(void)
* \brief Return the total number of nodes to be simulated in SUMO
*/
int commandGetMaxSUMONodesVariable(void);
/**
* \fn init(int max_sim_time)
* \brief Initialize SUMO and set the periodic subscriptions
*/
void init(int max_sim_time);
/**
* \fn void processSubscriptions(String_list departed, String_list arrived)
* \brief process the subscription values sent by SUMO at each SUMO time step
*/
void processSubscriptions(void);
/**
* \fn void GetSpeed(NodePtr node, char * sumo_id);
* \brief ask SUMO to return the speed for the indicated vehicle ID
* \param NodePtr node the pointer to the OAISim node
* \param char *sumo_id the SUMO ID of the target node
*/
void GetSpeed(node_struct* node, char * sumo_id);
/**
* \fn void Position(NodePtr node, char * sumo_id);
* \brief ask SUMO to return the position (X,Y) for the indicated vehicle ID
* \param NodePtr node the pointer to the OAISim node
* \param char *sumo_id the SUMO ID of the target node
*/
void GetPosition(node_struct* node, char * sumo_id);
#endif
/*
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The OpenAirInterface Software Alliance licenses this file to You under
* the OAI Public License, Version 1.0 (the "License"); you may not use this file
* except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.openairinterface.org/?page_id=698
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*-------------------------------------------------------------------------------
* For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org
*/
/*! \file id_manager.c
* \brief Main function containing the OMG ID Manager
* \author J. Harri
* \date 2012
* \version 0.1
* \company Eurecom
* \email:
* \note
* \warning
*/
#include "id_manager.h"
#include "assertions.h"
#include <stdio.h>
#include <string.h>
MapPtr create_map(void)
{
MapPtr ptr;
ptr = malloc(sizeof(map_struct));
return ptr;
}
IDManagerPtr create_IDManager(void)
{
IDManagerPtr ptr;
ptr = malloc(sizeof(id_manager_struct));
ptr->map_oai2sumo = NULL;
ptr->map_sumo2oai = NULL;
return ptr;
}
Map_list add_map_entry(MapPtr map, Map_list Map_Vector)
{
Map_list entry = malloc(sizeof(map_list_struct));
entry->map = map;
entry->next = NULL;
if (Map_Vector == NULL) {
//printf("Map-vector is NULL, assigning a new entry\n");
return entry;
} else {
Map_list tmp = Map_Vector;
while (tmp->next != NULL) {
//printf("getting the tail...\n");
tmp = tmp->next;
}
//printf("got it...adding entry...\n");
tmp->next = entry;
return Map_Vector;
}
}
Map_list remove_entry(MapPtr map, Map_list Map_Vector)
{
Map_list entry = malloc(sizeof(map_list_struct));
entry->map = map;
entry->next = NULL;
if (Map_Vector == NULL) {
return entry;
} else {
Map_list tmp = Map_Vector;
while (tmp->next != NULL) {
tmp = tmp->next;
}
tmp->next = entry;
return Map_Vector;
}
}
char* get_SumoID_by_OAI(int oai_id, IDManagerPtr ID_manager)
{
if(ID_manager->map_oai2sumo == NULL)
return NULL;
else {
return get_sumo_entry(oai_id, ID_manager->map_oai2sumo);
}
}
int get_oaiID_by_SUMO(char *sumo_id, IDManagerPtr ID_manager)
{
if(ID_manager->map_sumo2oai == NULL) {
//printf("ID_Manager: get_oaiID_by_SUMO: uninitialized map\n");
return -1;
}
else {
//printf("ID_Manager: get_oaiID_by_SUMO: OAI_entry is: %d \n", get_oai_entry(sumo_id, ID_manager->map_sumo2oai));
return get_oai_entry(sumo_id, ID_manager->map_sumo2oai);
}
}
void remove_oaiID_by_SUMO(char *sumo_id, IDManagerPtr ID_manager)
{
if(ID_manager->map_sumo2oai == NULL) {
printf("ID_Manager: remove_oaiID_by_SUMO: uninitialized map\n");
return;
} else {
ID_manager->map_sumo2oai = remove_oai_entry(sumo_id, ID_manager->map_sumo2oai);
if(ID_manager->map_oai2sumo !=NULL) {
ID_manager->map_oai2sumo = remove_oai_entry(sumo_id, ID_manager->map_oai2sumo); // need to remove in the other list as well
}
//return ID_manager->map_sumo2oai;
}
}
char* get_sumo_entry(int oai_id, Map_list Map_Vector)
{
Map_list tmp = Map_Vector;
AssertFatal( Map_Vector, "bug here..should not be NULL" );
AssertFatal( Map_Vector->map, "bug here..map should have been initialized" );
if (tmp->map->oai_id == oai_id) {
//printf("got it...at the head and value is %s \n",tmp->map->sumo_id);
return tmp->map->sumo_id;
} else {
//printf("here...\n");
while (tmp->next != NULL) {
tmp = tmp->next;
if (tmp->map->oai_id == oai_id) {
//printf("got it...in main value is %s \n",tmp->map->sumo_id);
return tmp->map->sumo_id;
}
}
}
return NULL;
}
int get_oai_entry(char *sumo_id, Map_list Map_Vector)
{
Map_list tmp = Map_Vector;
if (strcmp(tmp->map->sumo_id, sumo_id) == 0) {
//printf("found it %s \n",tmp->map->sumo_id);
return tmp->map->oai_id;
} else {
while (tmp->next != NULL) {
tmp = tmp->next;
if (strcmp(tmp->map->sumo_id, sumo_id) == 0) {
return tmp->map->oai_id;
}
}
}
return -1;
}
Map_list remove_oai_entry(char *sumo_id, Map_list Map_Vector)
{
Map_list tmp = Map_Vector;
// Map_list entry;
//printf("removing entry %s \n",sumo_id);
if (strcmp(tmp->map->sumo_id, sumo_id) == 0) {
//printf("1: found it %s \n",tmp->map->sumo_id);
// int id = tmp->map->oai_id;
// free(tmp);
if(tmp->next == NULL)
return NULL;
else {
return tmp->next;
}
//if(strcmp(tmp->map->sumo_id, "0") == 0) {
//printf("OAI ID is %d \n",id);
//exit(-1);
//}
//return id;
} else {
//printf("removing entry %s \n",sumo_id);
while (tmp->next != NULL) {
if (strcmp(tmp->next->map->sumo_id, sumo_id) == 0) {
//printf("2: found it %s \n",tmp->next->map->sumo_id);
// int id = tmp->next->map->oai_id;
// entry = tmp->next; // save the entry to remove
tmp->next = tmp->next->next; // jump over the entry to be removed
// free(entry); // freeing the entry
//if(strcmp(tmp->next->map->sumo_id, "0") == 0)
// exit(-1);
//return id;
}
tmp = tmp->next;
}
}
return Map_Vector;
}
/*
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The OpenAirInterface Software Alliance licenses this file to You under
* the OAI Public License, Version 1.0 (the "License"); you may not use this file
* except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.openairinterface.org/?page_id=698
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*-------------------------------------------------------------------------------
* For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org
*/
/*! \file id_manager.h
* \brief Prototypes of the OMG ID Manager to handle the mapping between OAI ID and SUMO ID
* \author J. Harri
* \date 2012
* \version 0.1
* \company Eurecom
* \email:
* \note
* \warning
*/
#ifndef __IDMANAGER_H_
#define __IDMANAGER_H_
#include <stdlib.h>
/*!A sructure that represents a mapping (OAI_ID, SUMO_ID), i.e the node ID given by OAI and the node ID given by SUMO */
typedef struct map_struct {
int oai_id; /*!< the oai ID as an integer */
char *sumo_id; /*!< SUMO gives IDs as strings */
} map_struct;
typedef struct map_struct* MapPtr; /*!< The typedef that reflects a #map_struct*/
/*!A sructure that gathers all the existing ID Maping */
struct map_list_struct {
map_struct *map; /*!< Avariable of type #MapPtr. It represents a node */
struct map_list_struct *next; /*!< A pointer to the next element */
} map_list_struct;
typedef struct map_list_struct* Map_list; /*!< The typedef that reflects a #map_list_struct*/
/*!A sructure that includes all characteristics of an ID management Unit */
typedef struct id_manager_struct {
struct map_list_struct *map_oai2sumo; /*!< Avariable of type #MapPtr. It represents the mapping from OAI ID to SUMO ID for one noe */
struct map_list_struct *map_sumo2oai; /*!< Avariable of type #MapPtr. It represents the mapping from SUMO ID to OAI ID for one noe */
} id_manager_struct;
typedef struct id_manager_struct* IDManagerPtr; /*!< The typedef that reflects a #id_manager_struct*/
/**
* \fn MapPtr create_map(void)
* \brief Create and allocate memory for a map object (OAI ID / SUMO ID).
* \return a pointer to the newly created Map
*/
MapPtr create_map(void);
/**
* \fn IDManangerPtr create_IDManager(void)
* \brief Create and allocate memory for a the ID Manager.
* \return a pointer to the ID Manager
*/
IDManagerPtr create_IDManager(void);
/**
* \fn Map_list add_entry(MapPtr map, Map_list Map_Vector)
* \brief Add a mapping entry to the MapList
* \param map the pointer to the map to be added to the Map_list
* \param Map_Vector the reference to the Map_list (pointing to the HEAD if not NULL)
* \retun the pointer to the updated/created map list (pointing to the HEAD)
*/
Map_list add_map_entry(MapPtr map, Map_list Map_Vector);
/**
* \fn char* get_SumoID_by_OAI(int oai_id, IDManagerPtr ID_manager)
* \brief map a SUMO ID from a OAI ID; return NULL if the mapping does not exist
* \param oai_id the OAI ID to be mapped to the SUMO ID
* \param ID_manager the reference to the ID Manager
* \return the SUMO ID in string format
*/
char* get_sumoID_by_OAI(int oai_id, IDManagerPtr ID_manager);
/**
* \fn int get_OaiID_by_SUMO(char* sumo_id, IDManagerPtr ID_manager)
* \brief map a OAI ID from a SUMO ID; return -1 if the mapping does not exist
* \param sumo_id the SUMO ID to be mapped to the OAI ID
* \param ID_manager the reference to the ID Manager
* \return the OAI ID in int format
*/
int get_oaiID_by_SUMO(char* sumo_id, IDManagerPtr ID_manager);
/**
* \fn int remove_OaiID_by_SUMO(char *sumo_id, IDManagerPtr ID_manager);
* \brief remove an OAI-SUMO mapping from a SUMO ID, and return the ID; return -1 if the mapping does not exist
* \param sumo_id the SUMO ID used to remove the mapping
* \param ID_manager the reference to the ID Manager
* \return the updated pointer to the Map_list
*/
void remove_oaiID_by_SUMO(char *sumo_id, IDManagerPtr ID_manager);
/**
* \fn char* get_sumo_entry(int oai_id, Map_list Map_Vector)
* \brief retrieve the SUMO ID from a OAI ID from the OAI_SUMO map; return NULL if not found
* \param oai_id the OAI ID to retrive the corresponding SUMO ID
* \param Map_Vector the reference to the OAI_2_SUMO Map list
* \return the SUMO ID in string format
*/
char* get_sumo_entry(int oai_id, Map_list Map_Vector);
/**
* \fn get_oai_entry(char* sumo_id, Map_list Map_Vector)
* \brief retrieve the OAI ID from a SUMO ID from the SUMO_OAI map; returns -1 if not found
* \param sumo_id the SUMO ID to retrieve the corresponding OAI ID
* \param Map_Vector the reference to the SUMO_2_OAI Map list
* \return the OAI ID in int format
*/
int get_oai_entry(char*, Map_list);
/**
* \fn int remove_oai_entry(char *sumo_id, Map_list Map_Vector);
* \brief remove the SUMO-OAI mapping, from a SUMO ID; returns the found OAI ID; returns -1 if the mapping does not exist.
* \param sumo_id the SUMO ID used to remove the mapping.
* \param Map_Vector the reference to the SUMO_2_OAI Map list
* \return the updated pointer to the Map_list
*/
Map_list remove_oai_entry(char *sumo_id, Map_list Map_Vector);
#endif /* __IDMANAGER_H_ */
...@@ -45,7 +45,9 @@ ...@@ -45,7 +45,9 @@
#include "trace.h" #include "trace.h"
#include "grid.h" #include "grid.h"
#include "steadystaterwp.h" #include "steadystaterwp.h"
#ifdef SUMO_IF
#include "sumo.h" #include "sumo.h"
#endif
#include "../OMV/structures.h" #include "../OMV/structures.h"
//#define STANDALONE //#define STANDALONE
...@@ -109,11 +111,11 @@ init_mobility_generator (omg_global_param omg_param_list[]) ...@@ -109,11 +111,11 @@ init_mobility_generator (omg_global_param omg_param_list[])
case TRACE: case TRACE:
start_trace_generator (omg_param_list[node_t]); start_trace_generator (omg_param_list[node_t]);
break; break;
#ifdef SUMO_IF
case SUMO: case SUMO:
start_sumo_generator (omg_param_list[node_t]); start_sumo_generator (omg_param_list[node_t]);
break; break;
#endif
case STEADY_RWP: case STEADY_RWP:
start_steadystaterwp_generator (omg_param_list[node_t]); start_steadystaterwp_generator (omg_param_list[node_t]);
break; break;
...@@ -152,12 +154,12 @@ stop_mobility_generator (omg_global_param * omg_param_list) ...@@ -152,12 +154,12 @@ stop_mobility_generator (omg_global_param * omg_param_list)
case STEADY_RWP: case STEADY_RWP:
break; break;
#ifdef SUMO_IF
case SUMO: case SUMO:
stop_sumo_generator (); stop_sumo_generator ();
//LOG_D(OMG," --------OMG will interface with SUMO for mobility generation-------- \n"); //LOG_D(OMG," --------OMG will interface with SUMO for mobility generation-------- \n");
break; break;
#endif
default: default:
LOG_N (OMG, "Unsupported generator\n"); LOG_N (OMG, "Unsupported generator\n");
} }
...@@ -198,12 +200,12 @@ update_node_vector (int mobility_type, double cur_time) ...@@ -198,12 +200,12 @@ update_node_vector (int mobility_type, double cur_time)
case TRACE: case TRACE:
update_trace_nodes (cur_time); update_trace_nodes (cur_time);
break; break;
#ifdef SUMO_IF
case SUMO: case SUMO:
// printf("in SUMO case \n"); // printf("in SUMO case \n");
update_sumo_nodes (cur_time); update_sumo_nodes (cur_time);
break; break;
#endif
case STEADY_RWP: case STEADY_RWP:
update_steadystaterwp_nodes (cur_time); update_steadystaterwp_nodes (cur_time);
break; break;
...@@ -248,12 +250,12 @@ get_nodes_positions (int mobility_type, double cur_time) ...@@ -248,12 +250,12 @@ get_nodes_positions (int mobility_type, double cur_time)
case TRACE: case TRACE:
get_trace_positions_updated (cur_time); get_trace_positions_updated (cur_time);
break; break;
#ifdef SUMO_IF
case SUMO: case SUMO:
LOG_I (OMG, "getting positions from SUMO\n"); LOG_I (OMG, "getting positions from SUMO\n");
get_sumo_positions_updated (cur_time); get_sumo_positions_updated (cur_time);
break; break;
#endif
case STEADY_RWP: case STEADY_RWP:
get_steadystaterwp_positions_updated (cur_time); get_steadystaterwp_positions_updated (cur_time);
break; break;
...@@ -371,11 +373,11 @@ set_new_mob_type (int id, int node_t, int mob_t, double cur_time) ...@@ -371,11 +373,11 @@ set_new_mob_type (int id, int node_t, int mob_t, double cur_time)
move_steadystaterwp_node (pair, cur_time); move_steadystaterwp_node (pair, cur_time);
break; break;
#ifdef SUMO_IF
case SUMO: case SUMO:
LOG_E (OMG, "not possible to change mobility type to sumo \n"); LOG_E (OMG, "not possible to change mobility type to sumo \n");
break; break;
#endif
case TRACE: case TRACE:
LOG_E (OMG, "not possible to change mobility type to trace \n"); LOG_E (OMG, "not possible to change mobility type to trace \n");
break; break;
......
/*
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The OpenAirInterface Software Alliance licenses this file to You under
* the OAI Public License, Version 1.0 (the "License"); you may not use this file
* except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.openairinterface.org/?page_id=698
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*-------------------------------------------------------------------------------
* For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org
*/
/*! \file socket_traci_OMG.c
* \brief The socket interface of TraCI to connect OAI to SUMO. A 'C' reimplementation of the TraCI version of simITS (F. Hrizi, fatma.hrizi@eurecom.fr)
* \author S. Uppoor
* \date 2012
* \version 0.1
* \company INRIA
* \email: sandesh.uppor@inria.fr
* \note
* \warning
*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include "socket_traci_OMG.h"
#include "storage_traci_OMG.h"
int connection_(char *hoststr,int portno)
{
host = gethostbyname(hoststr);
printf("trying to connect to %s at the port %i \n",hoststr, portno);
if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
#ifdef STANDALONE
printf(" Socket Error\n");
#else
LOG_D(OMG, " Socket Error\n");
#endif
}
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(portno);
server_addr.sin_addr = *((struct in_addr *)host->h_addr);
bzero(&(server_addr.sin_zero),8);
if (connect(sock, (struct sockaddr *)&server_addr,
sizeof(struct sockaddr)) < 0) {
#ifdef STANDALONE
printf("Connection Failed\n");
#else
LOG_E(OMG, " Connection Error\n");
#endif
return -1;
}
return 1;
}
void sendExact(int cmdLength)
{
msgLength = cmdLength + 4;
writeInt(msgLength);
rearange();
unsigned char *buf = (unsigned char *)malloc(sizeof(unsigned char) * (msgLength));
storage *cur_ptr = storageStart;
size_t i = 0;
size_t numbytes = msgLength;
while (cur_ptr->next != NULL) {
buf[i]= cur_ptr->item;
cur_ptr = cur_ptr->next;
i++;
}
buf[i]= cur_ptr->item;
while (numbytes > 0) {
int n = send(sock, buf, (int)numbytes, 0);//<----- need to check
if (numbytes == n)
break;
if (n<0) {
#ifdef STANDALONE
printf(" ERROR writing to socket\n");
#else
LOG_E(OMG, " ERROR writing to socket\n");
#endif
}
numbytes -= n;
buf +=n;
}
freeStorage(storageStart);
free(buf);
}
storage * receiveExact()
{
unsigned char* bufLength = (unsigned char *)malloc(sizeof(unsigned char) * (4));
int bytesRead = 0;
int readThisTime = 0;
//Get the length of the entire message by reading the 1st field
while (bytesRead<4) {
readThisTime = recv( sock, (char*)(bufLength + bytesRead), 4-bytesRead, 0 );
if( readThisTime <= 0 ) {
#ifdef STANDALONE
printf(" tcpip::Socket::receive() @ recv\n");
#else
LOG_E(OMG, " tcpip::Socket::receive() @ recv\n");
#endif
}
bytesRead += readThisTime;
}
// create storage to access the content
tracker = writePacket(bufLength, 4);
free( bufLength );
bufLength = 0;
// store pointer to free the space later
// storage *freeTracker = tracker;
int s= readInt();
int NN = s - 4;
printf("debug \n");
printf("value of s is %d \n",s);
printf("end debug \n");
//Free space after use
//freeStorage(freeTracker); // JHNOte: will be done by calling reset() in storage_traci_omg
int mySize = 0;
mySize = sizeof(unsigned char) * (NN);
printf("debug \n");
printf("value of mySize is %d \n",mySize);
printf("end debug \n");
// receive actual message content
//unsigned char* buf = (unsigned char *)malloc(sizeof(unsigned char) * (NN));
unsigned char* buf = (unsigned char *)malloc(mySize);
bytesRead = 0;
readThisTime = 0;
while (bytesRead<NN) {
readThisTime = recv( sock, (char*)(buf + bytesRead), NN-bytesRead, 0 );
if( readThisTime <= 0 ) {
#ifdef STANDALONE
printf(" tcpip::Socket::receive() @ recv\n");
#else
LOG_E(OMG, " tcpip::Socket::receive() @ recv\n");
#endif
}
bytesRead += readThisTime;
}
storage* temp = writePacket(buf, NN);
free( buf );
return temp;
}
void close_connection()
{
#ifdef STANDALONE
printf("closing the socket \n");
#else
LOG_E(OMG, "closing the socket \n");
#endif
close(sock);
}
/*
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The OpenAirInterface Software Alliance licenses this file to You under
* the OAI Public License, Version 1.0 (the "License"); you may not use this file
* except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.openairinterface.org/?page_id=698
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*-------------------------------------------------------------------------------
* For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org
*/
/*! \file socket_traci_OMG.h
* \brief The socket interface of TraCI to connect OAI to SUMO. A 'C' reimplementation of the TraCI version of simITS (F. Hrizi, fatma.hrizi@eurecom.fr)
* \author S. Uppoor
* \date 2012
* \version 0.1
* \company INRIA
* \email: sandesh.uppor@inria.fr
* \note
* \warning
*/
#ifndef SOCKET_TRACI_OMG_H
#define SOCKET_TRACI_OMG_H
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <string.h>
#include "omg.h"
#include "storage_traci_OMG.h"
int sock, portno, msgLength;
struct hostent *host;
struct sockaddr_in server_addr;
/**
* Global parameters defined in storage_traci_OMG.h
*/
extern storage *tracker;
extern storage *head;
extern storage *storageStart;
/**
* \fn connection_(char *,int)
* \brief Talks to SUMO by establishing connection
* \param Accepts host name and port number
*/
int connection_(char *, int);
/**
* \fn sendExact(int);
* \brief Pack the data from storage to buf and write to socket
* \param Accepts command length
*/
void sendExact(int);
/**
* \fn recieveExact(void);
* \brief Pack the data to storage from buf after reading from socket
* Returns storage pointer
*/
storage* receiveExact(void);
/**
* \fn close_connection(void);
* \brief close socket connection
*/
void close_connection(void);
#endif
/*
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The OpenAirInterface Software Alliance licenses this file to You under
* the OAI Public License, Version 1.0 (the "License"); you may not use this file
* except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.openairinterface.org/?page_id=698
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*-------------------------------------------------------------------------------
* For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org
*/
/*! \file storage_traci_OMG.c
* \brief The data storage object carrying data from/to SUMO. 'C' reimplementation of the TraCI version of simITS (F. Hrizi, fatma.hrizi@eurecom.fr)
* \author S. Uppoor
* \date 2012
* \version 0.2
* \company INRIA
* \email: sandesh.uppor@inria.fr
* \note 0.1 -> 0.2: (J. Harri) added reader and writer to String_list
* \warning
*/
#include <string.h>
#include "storage_traci_OMG.h"
//using namespace std
bool bigEndian;
void reset()
{
tracker = NULL;
head = NULL;
descLen = 0;
freeStorage(storageStart); // freeing the storage object
storageStart=NULL;
}
void check_endianness()
{
//checking endianness
un.s = 0x0102;
if (sizeof(short) == 2) {
if (un.c[0] == 1 && un.c[1] == 2)
bigEndian = true;
}
}
int storageLength(storage *cur_ptr)
{
int count=0;
while(cur_ptr != NULL) {
cur_ptr=cur_ptr->next;
count++;
}
return(count);
}
void rearange()
{
//Since linked list is used, all data is appended to the last pointer,
// we face problem in sendExact(int cmdLength) in socket_traci_OMG.c
// since total length of the entire message is appended last
// storage = command + length(4 bytes) is changed to storage = length(4 bytes) + command
int pos = msgLength - 4;
int count =0;
storage *cur_ptr = NULL;
storage *temp_ptr = NULL;
storage *temp_pptr = NULL;
cur_ptr = storageStart;
while (count != pos && cur_ptr->next != NULL) {
temp_pptr = cur_ptr;
cur_ptr = cur_ptr->next;
count++;
}
temp_ptr = cur_ptr;
while(cur_ptr->next != NULL) {
cur_ptr = cur_ptr-> next;
}
cur_ptr->next = storageStart;
storageStart = temp_ptr;
temp_pptr->next = NULL;
}
unsigned char readChar()
{
// if (tracker!=NULL)
// {
unsigned char hd = tracker->item;
//printf("OMG char: %d \n",(int)hd);
tracker = tracker->next;
return hd;
//}else
// {
// LOG_E(OMG, " Storage::readChar(): Tracker is NULL \n");
// unsigned char *error = NULL;
// return error; //
// }
}
void writeChar(unsigned char value)
{
storage *temp;
temp = (storage *)malloc(sizeof(storage));
if (head == NULL) {
head = temp;
head->next = NULL;
head->item = value;
storageStart = temp; //points to start of actual message
} else {
head->next = temp;
temp->next = NULL;
temp->item = value;
head = temp;
}
}
int readByte()
{
int i = (int)(readChar());
if (i < 128) return i;
else return (i - 256);
}
void writeByte(int value)
{
if (value < -128 || value > 127) {
LOG_E(OMG, " Storage::writeByte(): Invalid value, not in [-128, 127]\n");
}
writeChar( (unsigned char)( (value+256) % 256 ) );
}
int readUnsignedByte()
{
return (int)(readChar());
}
void writeUnsignedByte(int value)
{
if (value < 0 || value > 255) {
LOG_E(OMG, " Storage::writeUnsignedByte(): Invalid value, not in [0, 255]\n");
}
writeChar( ((unsigned char)value));
}
// JNNOTE: had to change the behavior here, as tmp was always pointing at the end of the String and not at the beginning: accordingly, all strings where always '0'
char * readString()
{
int i=0;
int len = readInt();
descLen = len;
char *tmp = (char *)malloc(sizeof(char) * (len));
char *ret = tmp; // JHNOTE: added a pointer pointing at the head of the String
//printf("OMG ready to readString of length %d \n",len);
for (; i < len; i++) {
*tmp++ = (char) readChar();
}
*tmp++ = '\0'; // makes sure it's NUL terminated
//printf("OMG readString - %s \n",ret);
//printf("OMG readString - %s \n",tmp);
return ret; // the head is returned
}
void writeString(char *s)
{
int count=0;
char* s_copy=s;
for(; *s!='\0'; s++)
count++;
writeInt(count);
for(; *s_copy!='\0'; s_copy++)
writeChar(*s_copy);
}
string_list* readStringList(string_list* vector)
{
int i=0;
int len = readInt();
descLen = len;
string_list* entry = NULL;
for (; i < len; i++) {
if (vector->string == NULL) {
char *tmp = readString();
//printf("OMG - 1 SUMO ID: %s \n",tmp);
vector->string = tmp;//readString();
} else {
entry = (string_list*) malloc(sizeof(string_list));
char *tmp = readString();
//printf("OMG - SUMO ID: %s \n",tmp);
entry->string = tmp;//readString();
entry->next = NULL;
if(vector !=NULL) {
string_list* tmp = vector;
while (tmp->next != NULL) {
tmp = tmp->next;
}
tmp->next = entry;
}
}
}
return vector;
}
void writeStringList(string_list* vector)
{
int count=0;
string_list* tmp = vector;
// JHNote: a better solution would be to save the pointer to the reference of this Int and replace the value with count at the end....
if (tmp->string !=NULL)
count++;
while (tmp->next != NULL) {
tmp = tmp->next;
count++;
}
writeInt(count);
tmp = vector;
if (tmp->string !=NULL) {
writeString(tmp->string);
}
while (tmp->next != NULL) {
tmp = tmp->next;
writeString(tmp->string);
}
}
int readShort()
{
LOG_W(OMG, " readShort not implented \n");
return -1;
}
void writeShort(int value)
{
LOG_W(OMG, " writeShort not implented \n");
return;
}
int readInt()
{
int value = 0;
unsigned char *p_value = (unsigned char*)(&value);
if (bigEndian) {
// network is big endian
p_value[0] = readChar();
p_value[1] = readChar();
p_value[2] = readChar();
p_value[3] = readChar();
} else {
// network is little endian
p_value[3] = readChar();
p_value[2] = readChar();
p_value[1] = readChar();
p_value[0] = readChar();
}
return value;
}
void writeInt(int value)
{
unsigned char *p_value = (unsigned char*)(&value);
if (bigEndian) {
// network is big endian
writeChar(p_value[0]);
writeChar(p_value[1]);
writeChar(p_value[2]);
writeChar(p_value[3]);
} else {
// network is little endian
writeChar(p_value[3]);
writeChar(p_value[2]);
writeChar(p_value[1]);
writeChar(p_value[0]);
}
}
float readFloat()
{
float value = 0;
unsigned char *p_value = (unsigned char*)(&value);
if (bigEndian) {
// network is big endian
p_value[0] = readChar();
p_value[1] = readChar();
p_value[2] = readChar();
p_value[3] = readChar();
} else {
// network is big endian
p_value[3] = readChar();
p_value[2] = readChar();
p_value[1] = readChar();
p_value[0] = readChar();
}
return value;
}
void writeFloat(float value)
{
unsigned char *p_value = (unsigned char*)(&value);
if (bigEndian) {
// network is big endian
writeChar(p_value[0]);
writeChar(p_value[1]);
writeChar(p_value[2]);
writeChar(p_value[3]);
} else {
// network is big endian
writeChar(p_value[3]);
writeChar(p_value[2]);
writeChar(p_value[1]);
writeChar(p_value[0]);
}
}
double readDouble()
{
double value = 0;
unsigned char *p_value = (unsigned char*)(&value);
if (bigEndian) {
// network is big endian
int i = 0;
for (; i<8; ++i) {
p_value[i] = readChar();
}
} else {
int i=7;
// network is big endian
for (; i>=0; --i) {
p_value[i] = readChar();
}
}
return value;
}
void writeDouble(double value)
{
unsigned char *p_value = (unsigned char*)(&value);
if (bigEndian) {
int i=0;
// network is big endian
for (; i<8; ++i) {
writeChar(p_value[i]);
}
} else {
int i=7;
// network is big endian
for (; i>=0; --i) {
writeChar(p_value[i]);
}
}
}
storage* writePacket (unsigned char* packet, int length)
{
//printf("required length is %d \n",length);
storage *recvpacket = NULL;
storage *recvpacketStart= NULL;
storage *temp_ = NULL;
int localSize = sizeof(storage);
printf("size of storage is %d bytes \n",localSize);
int i = 0;
for(; i < length; i++) {
printf("in %d round \n",i);
//storage *temp_ = (storage *)malloc(sizeof(storage));
temp_ = (storage *)malloc(sizeof(storage));
if (recvpacket == NULL) {
recvpacket = temp_;
recvpacketStart = recvpacket;
recvpacket->next = NULL;
recvpacket->item = packet[i];
} else {
temp_->next =NULL;
temp_-> item = packet[i];
recvpacket-> next = temp_;
recvpacket =temp_;
}
}
return recvpacketStart;
}
/*void writeStorage(){
LOG_W(OMG, " writeStorage not implented \n");
return;
}*/
void freeStorage(storage * freePtr)
{
storage *node,*temp;
node = freePtr; // start at the head.
while (node != NULL) { // traverse entire list.
temp = node ; // save node pointer.
node = node->next; // advance to next.
free(temp);
} // free the saved one.
freePtr = NULL; // finally, mark as empty list.
}
void reset_String_list(string_list* vector)
{
string_list* entry = vector;
string_list* tmp;
while (entry->next != NULL) {
tmp = entry;
entry = entry->next;
free(tmp);
}
vector = NULL;
}
/*
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The OpenAirInterface Software Alliance licenses this file to You under
* the OAI Public License, Version 1.0 (the "License"); you may not use this file
* except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.openairinterface.org/?page_id=698
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*-------------------------------------------------------------------------------
* For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org
*/
/*! \file storage_traci_OMG.h
* \brief The data storage object carrying data from/to SUMO. 'C' reimplementation of the TraCI version of simITS (F. Hrizi, fatma.hrizi@eurecom.fr)
* \author S. Uppoor
* \date 2012
* \version 0.1
* \company INRIA
* \email: sandesh.uppor@inria.fr
* \note
* \warning
*/
#ifndef STORAGE_TRACI_OMG_H
#define STORAGE_TRACI_OMG_H
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <string.h>
#include "omg.h"
// sortation of bytes forwards or backwards?------------------
extern bool bigEndian;
union n {
short s;
char c[sizeof(short)];
} un ;
void check_endianness(void);
//----------------STORAGE------------------------------------
struct Storage {
unsigned char item;
struct Storage *next;
} ;
typedef struct Storage storage;
// pointer which always points to next entry to be read
// updated in readChar function in storage_traci_OMG
storage *tracker;
storage *head;
storage *storageStart;
int descLen;
extern int msgLength;
void reset(void);
int storageLength(storage *);
void rearange(void);
unsigned char readChar(void);
void writeChar(unsigned char);
int readByte(void) ;
void writeByte(int) ;
int readUnsignedByte(void);
void writeUnsignedByte(int);
char * readString(void) ;
void writeString(char *);
string_list* readStringList(string_list*) ;
void writeStringList(string_list*);
int readShort(void) ;
void writeShort(int);
int readInt(void) ;
void writeInt(int);
float readFloat(void) ;
void writeFloat( float );
double readDouble(void) ;
void writeDouble( double );
storage* writePacket(unsigned char*, int);
//void writeStorage(storage & );
void freeStorage(storage *);
#endif
/*
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The OpenAirInterface Software Alliance licenses this file to You under
* the OAI Public License, Version 1.0 (the "License"); you may not use this file
* except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.openairinterface.org/?page_id=698
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*-------------------------------------------------------------------------------
* For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org
*/
/*! \file sumo.c
* \brief The OMG interface to SUMO (Simulation of Urban Mobility)
* \author S. Uppoor, J. Harri
* \date 2012
* \version 0.1
* \company INRIA, Eurecom
* \email: sandesh.uppor@inria.fr, haerri@eurecom.fr
* \note
* \warning
*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>
#include <math.h>
#include <string.h>
#include <signal.h>
#include "sumo.h"
#include "client_traci_OMG.h"
#include "assertions.h"
int
start_sumo_generator (omg_global_param omg_param_list)
{
char sumo_line[300];
int n_id;
static int id = 0;
// sprintf(sumo_line, "%s -c %s -b %d -e %d --remote-port %d --step-length %d -v ",omg_param_list.sumo_command, omg_param_list.sumo_config, omg_param_list.sumo_start, omg_param_list.sumo_end, omg_param_list.sumo_port, omg_param_list.sumo_step);
sprintf (sumo_line, "%s -c %s ", omg_param_list.sumo_command,
omg_param_list.sumo_config);
printf ("%s\n", sumo_line);
if ((pid = fork ()) == 0) {
// Start SUMO in the child process
if (system (sumo_line)) ; /* this if for no gcc warnings */
//childs addresss space
}
//still in the parent process
// Talk to SUMO
targetTime = 1;
departed = NULL;
arrived = NULL;
// switch on error to return to OAI
handshake (omg_param_list.sumo_host, omg_param_list.sumo_port);
init (omg_param_list.sumo_end - omg_param_list.sumo_start);
int max_node_SUMO = 100; //commandGetMaxSUMONodesVariable(); TODO method not implemented in TraCI server..must find another solution
// printf("received Number of nodes %d\n", max_node_SUMO);
// create the OAI/SUMO ID manager
id_manager = create_IDManager ();
node_struct *node = NULL;
mobility_struct *mobility = NULL;
active_nodes = NULL; // container to return a subset of only ACTIVE OAI nodes in SUMO
last_update_time = 0.0;
// just check for faulty values
if (omg_param_list.nodes <= 0) {
#ifdef STANDALONE
printf ("Number of nodes has not been set\n");
#else
LOG_W (OMG, "Number of nodes has not been set\n");
#endif
return (-1);
}
#ifdef STANDALONE
printf ("Number of OAI-equipped nodes in SUMO has been set to %d\n",
omg_param_list.nodes);
printf ("Number of SUMO simulated nodes has been set to %d\n",
max_node_SUMO);
#else
LOG_I (OMG, "Number of OAI-equipped nodes in SUMO has been set to %d\n",
omg_param_list.nodes);
LOG_I (OMG, "Number of SUMO simulated nodes has been set to %d\n",
max_node_SUMO);
#endif
// check and match number of nodes in mobility file provided
if (omg_param_list.nodes > max_node_SUMO) {
#ifdef STANDALONE
printf ("Not all OAI nodes will be moving according to SUMO.\n");
#else
LOG_I (OMG, "Not all OAI nodes will be moving according to SUMO.\n");
#endif
} else {
#ifdef STANDALONE
printf ("OAI nodes will be mapped to a subset of SUMO nodes\n");
#else
LOG_I (OMG, "OAI nodes will be mapped to a subset of SUMO nodes\n");
#endif
}
if (omg_param_list.nodes_type == eNB) {
#ifdef STANDALONE
printf ("Node type has been set to eNB\n");
#else
LOG_I (OMG, "Node type has been set to eNB\n");
#endif
} else if (omg_param_list.nodes_type == UE) {
#ifdef STANDALONE
printf ("Node type has been set to UE\n");
#else
LOG_I (OMG, "Node type has been set to UE\n");
#endif
}
for (n_id = id; n_id < omg_param_list.nodes + id; n_id++) {
node = create_node ();
mobility = create_mobility ();
node->mobile = 0; // 0 means inactive in SUMO; 1 means active in SUMO; as long as a mapping between OAI-SUMO has not been created, nodes are inactive and do not move
node->id = n_id; // this is OAI ID, not SUMO
node->type = omg_param_list.nodes_type; // UE eNB...
node->generator = SUMO; // SUMO
node->mob = mobility;
// FIXME! wrong use of node_vector and node_vector_end
// FIXME node_vector_end is declared with MAX_NUM_NODE_TYPES elements, but here we are indexing with SUMO from enum mobility_types
// FIXME node_vector is declared with MAX_NUM_NODE_TYPES elements, but here we are indexing with SUMO from enum mobility_types
node_vector_end[SUMO] =
(node_list *) add_entry (node, node_vector_end[SUMO]);
if (node_vector[SUMO] == NULL)
node_vector[SUMO] = node_vector_end[SUMO];
}
id += omg_param_list.nodes;
update_IDs (); // update the mapping between departed and arrived nodes in SUMO.
return (0);
}
void
update_IDs (void)
{
#ifdef STANDALONE
printf ("Updating the ID mapping between SUMO and OAI\n");
#else
LOG_D (OMG, "Updating the ID mapping between SUMO and OAI\n");
#endif
string_list *tmp_arrived, *tmp_departed;
if (arrived == NULL) {
printf ("arrived vehicles is NULL \n");
return;
}
tmp_arrived = arrived;
tmp_departed = departed;
if (departed == NULL) {
printf ("departed vehicles is NULL \n");
return;
}
if (tmp_departed->string != NULL) {
// char *tmp_string = malloc (sizeof (strlen (tmp_departed->string)));
char *tmp_string = malloc( strlen(tmp_departed->string) + 1 );
strcpy (tmp_string, tmp_departed->string);
//printf("OMG - 2 head is not null and value is: %s\n",tmp_string);
int OAI_ID = get_oaiID_by_SUMO (tmp_string, id_manager);
if (OAI_ID == -1) {
if (!activate_and_map (tmp_string)) {
// printf("Reached the Maximum of OAI nodes to be mapped to SUMO\n");
// LOG_I(OMG, "Reached the Maximum of OAI nodes to be mapped to SUMO\n");
free( tmp_string );
return; // stopping mapping as the maximum of OAI nodes has been reached;
}
}
free( tmp_string );
}
while (tmp_departed->next != NULL) {
// printf("OMG - 2 main is not null \n");
//char tmp_string [strlen(tmp_departed->string)];
//char *tmp_string = malloc (sizeof (strlen (tmp_departed->string)));
char *tmp_string = malloc( strlen(tmp_departed->string) + 1 );
strcpy (tmp_string, tmp_departed->string);
//char *tmp_string = tmp_departed->string;
int OAI_ID = get_oaiID_by_SUMO (tmp_string, id_manager);
if (OAI_ID == -1) {
if (!activate_and_map (tmp_string)) {
//printf("Reached the Maximum of OAI nodes to be mapped to SUMO\n");
//LOG_I(OMG, "Reached the Maximum of OAI nodes to be mapped to SUMO\n");
free( tmp_string );
return; // stopping mapping as the maximum of OAI nodes has been reached;
}
}
free( tmp_string );
tmp_departed = tmp_departed->next;
}
departed = clear_string_list (departed);
if (tmp_arrived->string != NULL) {
char *tmp_string = tmp_arrived->string;
//printf("OMG - 3 head is not null and value is: %s\n",tmp_arrived->string);
if (!desactivate_and_unmap (tmp_string)) {
printf ("Could not locate the OAI node ID %s \n", tmp_string);
//LOG_I(OMG, "Could not locate the OAI node ID %s \n", tmp_string);
}
}
while (tmp_arrived->next != NULL) {
char *tmp_string = tmp_arrived->string;
if (!desactivate_and_unmap (tmp_string)) {
printf ("Could not locate the OAI node\n");
// LOG_I(OMG, "Could not locate the OAI node\n");
}
tmp_arrived = tmp_arrived->next;
}
arrived = clear_string_list (arrived);
}
bool
desactivate_and_unmap (char *sumo_id)
{
#ifdef STANDALONE
printf ("desactivating node %s \n", sumo_id);
#else
LOG_I (OMG, "desactivating node %s \n", sumo_id);
#endif
int OAI_ID = get_oaiID_by_SUMO (sumo_id, id_manager);
remove_oaiID_by_SUMO (sumo_id, id_manager);
if (OAI_ID != -1) {
//TODO generalize to UE and eNB (must change the method)
// FIXME! wrong use of node_vector
// FIXME node_vector is declared with MAX_NUM_NODE_TYPES elements, but here we are indexing with SUMO from enum mobility_types
node_struct *node = find_node (node_vector[SUMO], OAI_ID, UE);
if (node == NULL)
node = find_node (node_vector[SUMO], OAI_ID, eNB);
if (node != NULL) {
node->mobile = 0; // this node is now inactive;
active_nodes = remove_node_entry (node, active_nodes);
return true;
}
}
#ifdef STANDALONE
printf
("Could not desactive an OAI node, as the SUMO-OAI mapping could not be found for the SUMO node ID %s \n",
sumo_id);
#else
LOG_I (OMG,
"Could not desactive an OAI node, as the SUMO-OAI mapping could not be found for the SUMO node ID %s \n",
sumo_id);
#endif
return false;
}
bool
activate_and_map (char *sumo_id)
{
MapPtr map = create_map ();
#ifdef STANDALONE
printf ("activating node %s \n", sumo_id);
#else
LOG_I (OMG, "activating node %s \n", sumo_id);
#endif
// TODO: So far, only UE can be SUMO mobile, but could change
AssertFatal( false, "node_vector array has only MAX_NUM_NODE_TYPES (=3) elements, but indexing here with SUMO (=4)");
node_struct *active_node = get_first_inactive_OAI_node (node_vector[SUMO], UE);
if (active_node != NULL) {
// found an inactive OAI node; will be mapped to SUMO
active_node->mobile = 1; // now node is active in SUMO
active_nodes = add_entry (active_node, active_nodes);
map->oai_id = active_node->id;
// map->sumo_id = malloc (sizeof ((int) strlen (sumo_id)));
map->sumo_id = malloc( strlen(sumo_id) + 1 );
strcpy (map->sumo_id, sumo_id);
#ifdef STANDALONE
printf ("added a mapping between oai ID: %d and SUMO ID: %s \n",
map->oai_id, map->sumo_id);
#else
LOG_I (OMG, "added a mapping between oai ID: %d and SUMO ID: %s \n",
map->oai_id, map->sumo_id);
#endif
// TODO fusion the two lists...leads to data inconsistency
// FIXME adding the same memory region to two lists => crash at free() time
id_manager->map_sumo2oai =
add_map_entry (map, id_manager->map_sumo2oai);
id_manager->map_oai2sumo = add_map_entry (map, id_manager->map_oai2sumo); //map_sumo2oai
return true;
}
else {
#ifdef STANDALONE
printf
("All OAI Nodes are already active in SUMO; cannot control this SUMO node in OAI\n");
#else
LOG_I (OMG,
"All OAI Nodes are already active in SUMO; cannot control this SUMO node in OAI\n");
#endif
return false;
}
}
void
update_sumo_nodes (double cur_time)
{
if ((cur_time - last_update_time) < MIN_SUMO_STEP) {
// the min time interval for SUMO must be 100ms or more
printf ("--------Update Step too small--------\n");
return;
}
last_update_time = cur_time; // keeps track of the last update time to get the update interval
// commandSimulationStep(1.0);// Advance the SUMO simulation by cur_time units
commandSimulationStep (cur_time); // Advance the SUMO simulation by cur_time units
LOG_I (OMG, "--------Updated SUMO positions by %f [ms]--------\n",
cur_time);
update_IDs (); // both are in the traCI client
}
void
update_sumo_positions (node_struct * node)
{
#ifdef STANDALONE
printf ("--------GET SUMO Mobility for a single node--------\n");
#else
LOG_D (OMG, "--------GET SUMO Mobility for a single node--------\n");
#endif
Map_list tmp = id_manager->map_oai2sumo;
char *sumo_id = get_sumo_entry (node->id, tmp);
if (sumo_id != NULL) {
//printf(" OAI ID is: %d and SUMO ID is %s \n",node->ID, sumo_id);
GetPosition (node, sumo_id);
GetSpeed (node, sumo_id);
}
}
node_list *
get_sumo_positions_updated (double cur_time)
{
#ifdef STANDALONE
printf
("--------GET SUMO Mobility for a group of ACTIVE OAI nodes--------\n");
#else
LOG_I (OMG,
"--------GET SUMO Mobility for a group of ACTIVE OAI nodes--------\n");
#endif
// FIXME! wrong use of node_vector
// FIXME node_vector is declared with MAX_NUM_NODE_TYPES elements, but here we are indexing with SUMO from enum mobility_types
if (node_vector[SUMO] != NULL) {
node_list *tmp = node_vector[SUMO];
while (tmp != NULL) {
if ((tmp->node->generator == SUMO) && (tmp->node->mobile == 1)) {
// OAI node MUST be active
LOG_I (OMG, "found an active node with id %d \n",
tmp->node->id);
LOG_I (OMG, "Old Positions \n");
//printf("Old Positions \n");
display_node_position (tmp->node->id, tmp->node->generator,
tmp->node->type, tmp->node->mobile,
tmp->node->x_pos, tmp->node->y_pos);
update_sumo_positions (tmp->node);
//printf("New Positions \n");
LOG_I (OMG, "New Positions \n");
display_node_position (tmp->node->id, tmp->node->generator,
tmp->node->type, tmp->node->mobile,
tmp->node->x_pos, tmp->node->y_pos);
}
tmp = tmp->next;
}
}
return active_nodes;
}
node_struct *
get_first_inactive_OAI_node (node_list * list, int node_type)
{
node_list *current;
if (list != NULL) {
//start search
current = list;
while (current->next != NULL) {
if ((current->node->mobile == 0)
&& (current->node->type == node_type)) {
return current->node;
}
current = current->next;
}
}
return NULL; // all nodes are active already..reached the maximum number of OAI nodes
}
bool
stop_sumo_generator (void)
{
#ifdef STANDALONE
printf
(" --------Destructor for SUMO: closing the TraCI socket and killing SUMO ---- \n");
#else
LOG_I (OMG,
" --------Destructor for SUMO: closing the TraCI socket and killing SUMO ---- \n");
#endif
commandClose (); // closing the connection with SUMO via TraCI
close_connection (); // closing the socket connection
kill (pid, SIGKILL); // killing SUMO in case it could not close by itself
return true;
}
/*
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The OpenAirInterface Software Alliance licenses this file to You under
* the OAI Public License, Version 1.0 (the "License"); you may not use this file
* except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.openairinterface.org/?page_id=698
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*-------------------------------------------------------------------------------
* For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org
*/
/*! \file sumo.h
* \brief The OMG interface to SUMO (Simulation of Urban Mobility)
* \author S. Uppoor, J. Harri
* \date 2012
* \version 0.1
* \company INRIA, Eurecom
* \email: sandesh.uppor@inria.fr, haerri@eurecom.fr
* \note
* \warning
*/
#ifndef SUMO_H_
#define SUMO_H_
#include "omg.h"
#include "id_manager.h"
#include <stdio.h>
#define MIN_SUMO_STEP 100 // 100ms is the smallest allowed SUMO update step
/*! A global variable used to store the SUMO process ID to later kill it smoothly when OAI askes OMG to stop SUMO*/
pid_t pid;
/*! A sumo global variable representing the OMG-SUMO ID manager. It is created at the start_sumo_generator(void) and keep a mapping between SUMO and OAI IDs. */
IDManagerPtr id_manager;
/*! A Node_list intended to contain the list of OAI 'active' nodes in SUMO. replaces the return of the full Node_Vector when OAI requests the new positions of its nodes. The list is reset at each use, but the pointer to the respective nodes is just set to NULL*/
node_list* active_nodes;
/*! A global variable keeping track of the last update time of SUMO, to be used to get the update interval when update_sumo_nodes(cur_time) is called */
double last_update_time;
/**
* \fn void start_sumo_generator(omg_global_param omg_param_list)
* \brief Start SUMO by setting the initial positions of each node then letting it sleep till it departs to its destination and add this job to the Job_Vector
* \param omg_param_list a structure that contains the main parameters needed to establish the random positions distribution
*/
int start_sumo_generator(omg_global_param omg_param_list) ;
/**
* \fn void update_sumo(double cur_time)
* \brief Update SUMO simulation time by x timesteps. After advancing the SUMO for the next timestep, SUMO will automatically update all nodes positions.
* Note that the SUMO positions are kept by SUMO. One need to specifically query SUMO to get them.
* \param cur_time a variable of type double that represents the current time
*/
void update_sumo_nodes(double cur_time) ;
/**
* \fn void get_sumo_positions(NodePtr node)
* \brief Get the current position and speed of a node from SUMO. Invokes TraCI
* \param node the pointer to a node we want to synch with SUMO.
*/
void update_sumo_positions(node_struct* node);
/**
* \fn Node_list get_sumo_positions_updated(double cur_time);
* \brief Get the current position and speed of a list of nodes. First, OMG retrieves the list of ACTIVE nodes, and second it updates their position from SUMO. Invokes TraCI
* \param cur_time a variable of type double that represents the current time
* \return the list of ACTIVE OAI nodes, which positions have been updated by SUMO
*/
node_list* get_sumo_positions_updated(double cur_time);
/**
* \fn NodePtr get_first_inactive_OAI_node(Node_list list, int node_type)
* \brief Get the first inactive OAI node to map it to a new SUMO node. An inactive OAI node has its mobility flag set to '0'.
* \param node the pointer to the Node_Vector containing all OAI nodes
* \param node_type the type of node we would like to locate (here: SUMO)
* \return the reference to the first inactive OAI node; returns NULL is none could be found (all OAI nodes are currently active)
*/
node_struct* get_first_inactive_OAI_node(node_list* list, int node_type);
/**
* \fn void update_IDs(String_list *departed, String_list *arrived)
* \brief Updates the mapping between SUMO and OAI nodes; Once a node departs in SUMO, it is mapped to a inactive OAI node. If none are found, the SUMO node will not have any mapping. Once a node arrives, the mapping is removed and the OAI node becomes inactive again. When an OAI node is inactive, it mobility parameters are invalid and MUST NOT be used/requested by OAI.
*/
void update_IDs(void);
/**
* \fn bool desactive_and_unmap(char *sumo_id)
* \brief desactivates an OAI node as it is no longer in SUMO; will be recycled by a new SUMO node in the future;
* \param sumo_id the string representing the SUMO ID of the OAI node;
* \return true in case of success; false otherwise;
*/
bool desactivate_and_unmap(char *sumo_id);
/**
* \fn bool activate_and_map(void)
* \brief activated an OAI node as a SUMO node entered in SUMO; Conceptually, this represents adding a communication device (OAI) to a SUMO node;
* It will find the first inactive OAI node, activates it and add the sumo mapping;
* \param sumo_id the string representing the SUMO ID of the OAI node;
* \return true in case of success; false if the maximum of OAI node has been reached
*/
bool activate_and_map(char *sumo_id);
/**
* \fn int stop_sumo_generator(void)
* \brief stops SUMO, stop the socket and kills SUMO process in the child domain.
* \return true in case of success; false otherwise
*/
bool stop_sumo_generator(void);
#endif /* SUMO_H_ */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment