xmlDocPtr document;
document = xmlParseFile(filename.c_str());
if (document == NULL) {
+ is_load_ok = false;
+ std::cout << "Error cargando XML" << std::endl;
return;
}
+ is_load_ok = true;
+
/* bien, el archivo se parseo bien! */
xmlNodePtr nodo, items;
nodo = document->children;
loadUnion(items);
} else if (xmlStrcmp(items->name, BAD_CAST"drenaje")==0) {
loadDrain(items);
+ } else if (xmlStrcmp(items->name, BAD_CAST"and")==0) {
+ loadAnd(items);
+ } else if (xmlStrcmp(items->name, BAD_CAST"or")==0) {
+ loadOr(items);
+ } else if (xmlStrcmp(items->name, BAD_CAST"not")==0) {
+ loadNot(items);
}
}
items = items->next;
}
// Bien, la planta esta cargada, conectemos todo!!
do_connections(nodo->children);
+ do_logic_connetions(nodo->children);
}
+ xmlFreeDoc(document);
}
Simulator::~Simulator()
{
- // FIXME REMOVER TODOOOOOO
+ std::list<PlantItem *>::iterator i = items.begin();
+ PlantItem *o;
+
+ while (i != items.end()) {
+ o = (*i);
+ items.remove(o);
+ delete o;
+ i = items.begin();
+ }
}
void Simulator::add_pump(const std::string &name, float max_flow, RGB color)
{
Pump *p = new Pump(name);
- // FIXME no va!!
p->set_max_flow(max_flow);
p->set_color(color);
pump_lst.push_back(p);
void Simulator::add_union(const std::string &name, float max_flow)
{
Union *u = new Union(name);
- // FIXME no va!!
u->set_max_flow(max_flow);
union_lst.push_back(u);
items.push_back(u);
void Simulator::add_conduct(const std::string &name, float flujo)
{
Conduct *p = new Conduct(name);
- // FIXME no va!!
p->set_max_flow(flujo);
conduct_lst.push_back(p);
items.push_back(p);
for(i1=pump_lst.begin(); i1!=pump_lst.end(); i1++)
(*i1)->update();
- // Simulo!
std::list<PlantItem *>::iterator i2;
- for(i2=items.begin(); i2!=items.end(); i2++)
+ for(i2=items.begin(); i2!=items.end(); i2++)
+ (*i2)->update();
+
+ for(i2=items.begin(); i2!=items.end(); i2++)
(*i2)->simulate();
frame++;
return NULL;
}
-bool Simulator::pump_deactivate(const std::string &name)
+LogicControl *Simulator::find_logic(const std::string &name)
{
- // Busco el elemento, usando RTTI :-(
- Pump *pump = dynamic_cast<Pump *>(find(name));
+ // Busco el item, aca no me importa de que tipo es!
+ std::list<LogicControl *>::iterator i;
+ for(i=control_lst.begin(); i!=control_lst.end(); i++)
+ if ((*i)->get_name() == name)
+ return *i;
+ return NULL;
+}
- if (!pump) {
- // Ups!, "name" no era un Pump!!!
+bool Simulator::set_open(const std::string &name, bool open)
+{
+ // Busco el elemento, usando RTTI :-(
+ IConector *tmp = find(name);
+ Pump *p;
+ Exclusa *e;
+ if ((p = dynamic_cast<Pump*>(tmp))) {
+ if (open) {
+ p->activate();
+ } else {
+ p->deactivate();
+ }
+ } else if ((e = dynamic_cast<Exclusa*>(tmp))) {
+ if (open) {
+ e->open();
+ } else {
+ e->close();
+ }
+ } else {
return false;
}
- pump->deactivate();
- return true;
}
void Simulator::loadBomba(xmlNodePtr nodo)
} else if (xmlStrcmp(nodo->name, BAD_CAST"entrega") == 0) {
flujo = atof( (char *)XML_GET_CONTENT(nodo->children) );
} else if (xmlStrcmp(nodo->name, BAD_CAST"color") == 0) {
- // FIXME !
- color = RGB();
+ color = loadRGB(nodo->children);
}
}
nodo = nodo->next;
std::string name = (char *)xmlGetProp(nodo, BAD_CAST"nombre");
int orientacion=0, x, y;
float capacidad, inicial;
- RGB color; // TODO
+ RGB color;
nodo = nodo->children;
while (nodo != NULL) {
capacidad = atoi( (char *)XML_GET_CONTENT(nodo->children) );
} else if (xmlStrcmp(nodo->name, BAD_CAST"inicial") == 0) {
inicial = atof( (char *)XML_GET_CONTENT(nodo->children) );
+ } else if (xmlStrcmp(nodo->name, BAD_CAST"") == 0) {
+ color = loadRGB(nodo->children);
}
}
nodo = nodo->next;
add_drainage(name);
}
+void Simulator::loadNot(xmlNodePtr nodo)
+{
+ std::string name = (char *)xmlGetProp(nodo, BAD_CAST"nombre");
+ std::string id = (char *)xmlGetProp(nodo, BAD_CAST"id");
+ int orientacion=0, x, y;
+
+ nodo = nodo->children;
+ while (nodo != NULL) {
+ if (nodo->type == XML_ELEMENT_NODE) {
+ if (xmlStrcmp(nodo->name, BAD_CAST"salida") == 0) {
+ //p->out_lines.push_back((char *)XML_GET_CONTENT(nodo->children));
+ } else if (xmlStrcmp(nodo->name, BAD_CAST"entrada") == 0) {
+ //p->in_lines.push_back((char *)XML_GET_CONTENT(nodo->children));
+ }
+ }
+ nodo = nodo->next;
+ }
+
+ Not *n = new Not();
+ n->set_name(name);
+ control_lst.push_back(n);
+}
+
+void Simulator::loadOr(xmlNodePtr nodo)
+{
+ std::string name = (char *)xmlGetProp(nodo, BAD_CAST"nombre");
+ std::string id = (char *)xmlGetProp(nodo, BAD_CAST"id");
+
+ nodo = nodo->children;
+ while (nodo != NULL) {
+ if (nodo->type == XML_ELEMENT_NODE) {
+ if (xmlStrcmp(nodo->name, BAD_CAST"salida") == 0) {
+ //p->out_lines.push_back((char *)XML_GET_CONTENT(nodo->children));
+ } else if (xmlStrcmp(nodo->name, BAD_CAST"entrada") == 0) {
+ //p->in_lines.push_back((char *)XML_GET_CONTENT(nodo->children));
+ }
+ }
+ nodo = nodo->next;
+ }
+
+ Or *n = new Or();
+ n->set_name(name);
+ control_lst.push_back(n);
+}
+
+void Simulator::loadAnd(xmlNodePtr nodo)
+{
+ std::string name = (char *)xmlGetProp(nodo, BAD_CAST"nombre");
+ std::string id = (char *)xmlGetProp(nodo, BAD_CAST"id");
+ int orientacion=0, x, y;
+
+ nodo = nodo->children;
+ while (nodo != NULL) {
+ if (nodo->type == XML_ELEMENT_NODE) {
+ if (xmlStrcmp(nodo->name, BAD_CAST"salida") == 0) {
+ // p->out_lines.push_back((char *)XML_GET_CONTENT(nodo->children));
+ } else if (xmlStrcmp(nodo->name, BAD_CAST"entrada") == 0) {
+ // p->in_lines.push_back((char *)XML_GET_CONTENT(nodo->children));
+ }
+ }
+ nodo = nodo->next;
+ }
+
+ And *n = new And();
+ n->set_name(name);
+ control_lst.push_back(n);
+}
+
void Simulator::do_connections(xmlNodePtr nodo)
{
// Intengo conectar los elementos :)
IConector *current_item, *to_connect;
xmlNodePtr props; // propiedades del item actual
- xmlNodePtr conector1, conector2;
+ xmlNodePtr conector1, conector2, conector3;
while (nodo != NULL) {
if (nodo->type != XML_ELEMENT_NODE) {
continue;
}
// obtengo el items actual por su nombre
+ std::string s = (char *)xmlGetProp(nodo, BAD_CAST"nombre");
current_item = find((char *)xmlGetProp(nodo, BAD_CAST"nombre"));
props = nodo->children;
- conector2 = conector1 = NULL;
+ conector3 = conector2 = conector1 = NULL;
while (props != NULL) {
if (nodo->type == XML_ELEMENT_NODE) {
if (xmlStrcmp(props->name, BAD_CAST"conector") == 0) {
} else {
temp = temp->next;
}
+ while ((temp != NULL) && (conector3 == NULL))
+ if (temp->type == XML_ELEMENT_NODE) {
+ conector3 = temp;
+ temp = temp->next;
+ break;
+ } else {
+ temp = temp->next;
+ }
}
}
props = props->next;
current_item->connect(to_connect, IConector::OUT);
}
}
+ if (conector3 != NULL) {
+ // si, aca hay un conector!, veamos cual es
+ if (xmlStrcmp(conector3->name, BAD_CAST"entrada") == 0) {
+ // bien, es a la entrada!, obtengo el item al cual lo tengo que conectar
+ to_connect = find((char *)XML_GET_CONTENT(conector3->children));
+ // y lo conecto
+ if (!current_item->connect(to_connect, IConector::IN)) {
+ std::cout << s << " Error al conectar " << std::endl;
+ }
+ } else if (xmlStrcmp(conector3->name, BAD_CAST"salida") == 0) {
+ // Era a salida, es casi lo mismo que arriba
+ to_connect = find((char *)XML_GET_CONTENT(conector3->children));
+ if (!current_item->connect(to_connect, IConector::OUT)) {
+ std::cout << s << " Error al conectar " << std::endl;
+ }
+ }
+ }
nodo = nodo->next;
}
// Fin de las conexiones
return out.str();;
}
+RGB Simulator::loadRGB(xmlNodePtr nodo)
+{
+ unsigned r,g,b;
+ while (nodo != NULL) {
+ if (nodo->type == XML_ELEMENT_NODE) {
+ if (xmlStrcmp(nodo->name, BAD_CAST"rojo")==0)
+ r = atoi( (char *)XML_GET_CONTENT(nodo->children) );
+ if (xmlStrcmp(nodo->name, BAD_CAST"verde")==0)
+ g = atoi( (char *)XML_GET_CONTENT(nodo->children) );
+ if (xmlStrcmp(nodo->name, BAD_CAST"azul")==0)
+ b = atoi( (char *)XML_GET_CONTENT(nodo->children) );
+ }
+ nodo = nodo->next;
+ }
+ return RGB(r,g,b);
+}
+
+void Simulator::do_logic_connetions(xmlNodePtr nodo)
+{
+ LogicControl *current;
+
+ while (nodo != NULL) {
+ if (nodo->type != XML_ELEMENT_NODE) {
+ nodo = nodo->next;
+ continue;
+ }
+ // obtengo el items actual por su nombre
+ if (xmlStrcmp(nodo->name, BAD_CAST"and") == 0) {
+ std::string s = (char *)xmlGetProp(nodo, BAD_CAST"nombre");
+ current = find_logic((char *)xmlGetProp(nodo, BAD_CAST"nombre"));
+ connect_logic(current, nodo->children);
+ }
+ nodo = nodo->next;
+ }
+}
+
+void Simulator::connect_logic(LogicControl *current, xmlNodePtr nodo)
+{
+ Control *item;
+ while (nodo != NULL) {
+ if (nodo->type != XML_ELEMENT_NODE) {
+ nodo = nodo->next;
+ continue;
+ }
+ if (xmlStrcmp(nodo->name, BAD_CAST"entrada") == 0) {
+ item = dynamic_cast<Control *>(find((char *)XML_GET_CONTENT(nodo->children)));
+ if (item != NULL) {
+ current->connect( item->get_logic_output(), IConector::IN );
+ } else {
+ std::cout << "ERROR : Item no es tipo Control!!" << std::endl;
+ }
+ } else if (xmlStrcmp(nodo->name, BAD_CAST"salida") == 0) {
+ item = dynamic_cast<Control *>(find((char *)XML_GET_CONTENT(nodo->children)));
+ if (item != NULL) {
+ item->get_logic_input()->connect( current, IConector::IN );
+ } else {
+ std::cout << "ERROR : Item no es tipo Control!!" << std::endl;
+ }
+ }
+
+ nodo = nodo->next;
+ }
+}
+