X-Git-Url: https://git.llucax.com/z.facultad/75.42/plaqui.git/blobdiff_plain/be1908f8097dbbc871bfd7c55432de43d25647b7..cc77948bedbd851e009ad3b8a421dea93c3ceeff:/Model/src/simulator.cpp?ds=inline diff --git a/Model/src/simulator.cpp b/Model/src/simulator.cpp index 72c59ca..9e84e8a 100644 --- a/Model/src/simulator.cpp +++ b/Model/src/simulator.cpp @@ -11,6 +11,7 @@ Simulator::Simulator(const std::string &filename) document = xmlParseFile(filename.c_str()); if (document == NULL) { is_load_ok = false; + std::cout << "Error cargando XML" << std::endl; return; } @@ -36,12 +37,19 @@ Simulator::Simulator(const std::string &filename) 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); } @@ -149,9 +157,11 @@ void Simulator::simulate() for(i1=pump_lst.begin(); i1!=pump_lst.end(); i1++) (*i1)->update(); - // Simulo! std::list::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++; @@ -167,6 +177,16 @@ IConector *Simulator::find(const std::string &name) return NULL; } +LogicControl *Simulator::find_logic(const std::string &name) +{ + // Busco el item, aca no me importa de que tipo es! + std::list::iterator i; + for(i=control_lst.begin(); i!=control_lst.end(); i++) + if ((*i)->get_name() == name) + return *i; + return NULL; +} + bool Simulator::set_open(const std::string &name, bool open) { // Busco el elemento, usando RTTI :-( @@ -342,6 +362,74 @@ void Simulator::loadDrain(xmlNodePtr nodo) 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 :) @@ -355,6 +443,7 @@ void Simulator::do_connections(xmlNodePtr nodo) 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; conector3 = conector2 = conector1 = NULL; @@ -423,11 +512,15 @@ void Simulator::do_connections(xmlNodePtr nodo) // 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 - current_item->connect(to_connect, IConector::IN); + 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)); - current_item->connect(to_connect, IConector::OUT); + if (!current_item->connect(to_connect, IConector::OUT)) { + std::cout << s << " Error al conectar " << std::endl; + } } } nodo = nodo->next; @@ -469,3 +562,50 @@ RGB Simulator::loadRGB(xmlNodePtr nodo) 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(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(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; + } +} +