radio_medium.cpp
Go to the documentation of this file.
1 
7 #include "radio_medium.h"
8 #include <argos3/core/simulator/simulator.h>
9 #include <argos3/core/simulator/space/space.h>
10 #include <argos3/core/simulator/space/positional_indices/grid.h>
11 #include <argos3/core/utility/configuration/argos_exception.h>
12 #include <argos3/core/utility/logging/argos_log.h>
13 
14 namespace argos {
15 
16  /****************************************/
17  /****************************************/
18 
20  try {
21  CMedium::Init(t_tree);
22  /* Get the positional index method */
23  std::string strPosIndexMethod("grid");
24  GetNodeAttributeOrDefault(t_tree, "index", strPosIndexMethod, strPosIndexMethod);
25  /* Get the arena center and size */
26  CVector3 cArenaCenter;
27  CVector3 cArenaSize;
28  TConfigurationNode& tArena = GetNode(CSimulator::GetInstance().GetConfigurationRoot(), "arena");
29  GetNodeAttribute(tArena, "size", cArenaSize);
30  GetNodeAttributeOrDefault(tArena, "center", cArenaCenter, cArenaCenter);
31  /* Create the positional index for Radio entities */
32  if(strPosIndexMethod == "grid") {
33  size_t punGridSize[3];
34  if(!NodeAttributeExists(t_tree, "grid_size")) {
35  punGridSize[0] = static_cast<size_t>(cArenaSize.GetX());
36  punGridSize[1] = static_cast<size_t>(cArenaSize.GetY());
37  punGridSize[2] = static_cast<size_t>(cArenaSize.GetZ());
38  }
39  else {
40  std::string strPosGridSize;
41  GetNodeAttribute(t_tree, "grid_size", strPosGridSize);
42  ParseValues<size_t>(strPosGridSize, 3, punGridSize, ',');
43  }
45  cArenaCenter - cArenaSize * 0.5f, cArenaCenter + cArenaSize * 0.5f,
46  punGridSize[0], punGridSize[1], punGridSize[2]);
47  m_pcRadioEntityGridUpdateOperation = new CRadioEntityGridUpdater(*pcGrid);
48  pcGrid->SetUpdateEntityOperation(m_pcRadioEntityGridUpdateOperation);
49  m_pcRadioEntityIndex = pcGrid;
50  }
51  else {
52  THROW_ARGOSEXCEPTION("Unknown method \"" << strPosIndexMethod << "\" for the positional index.");
53  }
54  }
55  catch(CARGoSException& ex) {
56  THROW_ARGOSEXCEPTION_NESTED("Error in initialization of the radio medium", ex);
57  }
58  }
59 
60  /****************************************/
61  /****************************************/
62 
64  Update();
65  }
66 
67  /****************************************/
68  /****************************************/
69 
71  m_pcRadioEntityIndex->Reset();
72  }
73 
74  /****************************************/
75  /****************************************/
76 
78  delete m_pcRadioEntityIndex;
79  if(m_pcRadioEntityGridUpdateOperation != nullptr) {
80  delete m_pcRadioEntityGridUpdateOperation;
81  }
82  }
83 
84  /****************************************/
85  /****************************************/
86 
88  /* Update the positional indices of the radios */
89  m_pcRadioEntityIndex->Update();
90  }
91 
92  /****************************************/
93  /****************************************/
94 
96  m_pcRadioEntityIndex->AddEntity(c_entity);
97  m_pcRadioEntityIndex->Update();
98  }
99 
100  /****************************************/
101  /****************************************/
102 
104  m_pcRadioEntityIndex->RemoveEntity(c_entity);
105  m_pcRadioEntityIndex->Update();
106  }
107 
108  /****************************************/
109  /****************************************/
110 
112  "radio",
113  "Michael Allwright [allsey87@gmail.com]",
114  "1.0",
115  "Enables communication between a radio actuator and radio sensor.",
116  "This medium indexes the radio entities in the space and allows\n"
117  "transmitting radios to find nearby receiving radios.\n\n"
118  "REQUIRED XML CONFIGURATION\n\n"
119  "<radio id=\"radios\" />\n\n"
120  "OPTIONAL XML CONFIGURATION\n\n"
121  "None for the time being\n",
122  "Under development"
123  );
124 
125  /****************************************/
126  /****************************************/
127 
128 }
#define THROW_ARGOSEXCEPTION_NESTED(message, nested)
This macro throws an ARGoS exception with the passed message and nesting the passed exception.
#define THROW_ARGOSEXCEPTION(message)
This macro throws an ARGoS exception with the passed message.
The namespace containing all the ARGoS related code.
Definition: ci_actuator.h:12
REGISTER_MEDIUM(CDirectionalLEDMedium, "directional_led", "Michael Allwright [allsey87@gmail.com]", "1.0", "Manages directional LED entities.", "This medium is required to manage the directional LED entities, so that\n" "the associated camera sensors can find them. If you use a camera sensor,\n" "you must add this medium the sensors XML configuration.\n\n" "REQUIRED XML CONFIGURATION\n\n" "<directional_led id=\"led\" />\n\n" "OPTIONAL XML CONFIGURATION\n\n" "None for the time being\n", "Under development")
TConfigurationNode & GetNode(TConfigurationNode &t_node, const std::string &str_tag)
Given a tree root node, returns the first of its child nodes with the wanted name.
bool NodeAttributeExists(TConfigurationNode &t_node, const std::string &str_attribute)
Returns true if the specified attribute of a node exists.
void GetNodeAttributeOrDefault(TConfigurationNode &t_node, const std::string &str_attribute, T &t_buffer, const T &t_default)
Returns the value of a node's attribute, or the passed default value.
ticpp::Element TConfigurationNode
The ARGoS configuration XML node.
void GetNodeAttribute(TConfigurationNode &t_node, const std::string &str_attribute, T &t_buffer)
Returns the value of a node's attribute.
virtual void Init(TConfigurationNode &t_tree)
Initialized the medium.
Definition: medium.cpp:16
static CSimulator & GetInstance()
Returns the instance to the CSimulator class.
Definition: simulator.cpp:78
void SetUpdateEntityOperation(CEntityOperation *pc_operation)
Definition: grid_impl.h:907
The exception that wraps all errors in ARGoS.
A 3D vector class.
Definition: vector3.h:31
Real GetX() const
Returns the x coordinate of this vector.
Definition: vector3.h:105
Real GetY() const
Returns the y coordinate of this vector.
Definition: vector3.h:121
Real GetZ() const
Returns the z coordinate of this vector.
Definition: vector3.h:137
virtual void Init(TConfigurationNode &t_tree)
Initialized the medium.
virtual void Destroy()
Undoes whatever was done by Init().
virtual void Update()
Updates the state of this medium.
virtual void Reset()
Resets the resource.
virtual void PostSpaceInit()
Executes extra initialization activities after the space has been initialized.
void AddEntity(CRadioEntity &c_entity)
Adds the specified entity to the list of managed entities.
void RemoveEntity(CRadioEntity &c_entity)
Removes the specified entity from the list of managed entities.