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
${OPENAIR2_DIR}/UTIL/OCG/OCG_parse_filename.c
${OPENAIR2_DIR}/UTIL/OCG/OCG_parse_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/grid.c
${OPENAIR2_DIR}/UTIL/OMG/id_manager.c
${OPENAIR2_DIR}/UTIL/OMG/job.c
${OPENAIR2_DIR}/UTIL/OMG/mobility_parser.c
${OPENAIR2_DIR}/UTIL/OMG/omg.c
${OPENAIR2_DIR}/UTIL/OMG/omg_hashtable.c
${OPENAIR2_DIR}/UTIL/OMG/rwalk.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/steadystaterwp.c
${OPENAIR2_DIR}/UTIL/OMG/storage_traci_OMG.c
${OPENAIR2_DIR}/UTIL/OMG/trace.c
${OPENAIR2_DIR}/UTIL/OMG/trace_hashtable.c
${OPENAIR2_DIR}/UTIL/OPT/probe.c
......@@ -897,6 +892,15 @@ set(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
${OPENAIR2_DIR}/UTIL/OSA/osa_key_deriver.c
${OPENAIR2_DIR}/UTIL/OSA/osa_rijndael.c
......@@ -1752,7 +1756,6 @@ add_executable(oaisim
${OPENAIR_TARGETS}/SIMU/USER/oaisim.c
${OPENAIR2_DIR}/RRC/NAS/nas_config.c
${OPENAIR2_DIR}/RRC/NAS/rb_config.c
${OPENAIR2_DIR}/UTIL/OMG/sumo.c
${OPENAIR3_DIR}/NAS/UE/nas_ue_task.c
${GTPU_need_ITTI}
${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.
This diff is collapsed.
#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
This diff is collapsed.
/*
* 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 @@
#include "trace.h"
#include "grid.h"
#include "steadystaterwp.h"
#ifdef SUMO_IF
#include "sumo.h"
#endif
#include "../OMV/structures.h"
//#define STANDALONE
......@@ -109,11 +111,11 @@ init_mobility_generator (omg_global_param omg_param_list[])
case TRACE:
start_trace_generator (omg_param_list[node_t]);
break;
#ifdef SUMO_IF
case SUMO:
start_sumo_generator (omg_param_list[node_t]);
break;
#endif
case STEADY_RWP:
start_steadystaterwp_generator (omg_param_list[node_t]);
break;
......@@ -152,12 +154,12 @@ stop_mobility_generator (omg_global_param * omg_param_list)
case STEADY_RWP:
break;
#ifdef SUMO_IF
case SUMO:
stop_sumo_generator ();
//LOG_D(OMG," --------OMG will interface with SUMO for mobility generation-------- \n");
break;
#endif
default:
LOG_N (OMG, "Unsupported generator\n");
}
......@@ -198,12 +200,12 @@ update_node_vector (int mobility_type, double cur_time)
case TRACE:
update_trace_nodes (cur_time);
break;
#ifdef SUMO_IF
case SUMO:
// printf("in SUMO case \n");
update_sumo_nodes (cur_time);
break;
#endif
case STEADY_RWP:
update_steadystaterwp_nodes (cur_time);
break;
......@@ -248,12 +250,12 @@ get_nodes_positions (int mobility_type, double cur_time)
case TRACE:
get_trace_positions_updated (cur_time);
break;
#ifdef SUMO_IF
case SUMO:
LOG_I (OMG, "getting positions from SUMO\n");
get_sumo_positions_updated (cur_time);
break;
#endif
case STEADY_RWP:
get_steadystaterwp_positions_updated (cur_time);
break;
......@@ -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);
break;
#ifdef SUMO_IF
case SUMO:
LOG_E (OMG, "not possible to change mobility type to sumo \n");
break;
#endif
case TRACE:
LOG_E (OMG, "not possible to change mobility type to trace \n");
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
This diff is collapsed.
/*
* 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
This diff is collapsed.
/*
* 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