X-Git-Url: https://git.llucax.com/z.facultad/75.42/plaqui.git/blobdiff_plain/fb8d2fb83534b0ca76f81e6d107e38d002642a46..66124e5142afe9748ba184592792fe307fd4a3b5:/Model/src/simulator.cpp?ds=sidebyside diff --git a/Model/src/simulator.cpp b/Model/src/simulator.cpp index b6a77d3..7811d4e 100644 --- a/Model/src/simulator.cpp +++ b/Model/src/simulator.cpp @@ -37,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); } @@ -151,8 +158,10 @@ void Simulator::simulate() (*i1)->update(); std::list::iterator i2; - for(i2=items.begin(); i2!=items.end(); i2++) + for(i2=items.begin(); i2!=items.end(); i2++) { (*i2)->update(); + (*i2)->update_color(); + } for(i2=items.begin(); i2!=items.end(); i2++) (*i2)->simulate(); @@ -170,6 +179,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 :-( @@ -295,7 +314,7 @@ void Simulator::loadTank(xmlNodePtr nodo) 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) { + } else if (xmlStrcmp(nodo->name, BAD_CAST"color") == 0) { color = loadRGB(nodo->children); } } @@ -345,6 +364,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 :) @@ -401,19 +488,11 @@ 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(conector1->children)); // y lo conecto - if (!current_item->connect(to_connect, IConector::IN)) { - std::cout << s << " Error al conectar1 ENTRADA = " << (char *)XML_GET_CONTENT(conector1->children) << std::endl; - } else { - std::cout << s << " ENTRADA1 = " << (char *)XML_GET_CONTENT(conector1->children) << std::endl; - } + current_item->connect(to_connect, IConector::IN); } else if (xmlStrcmp(conector1->name, BAD_CAST"salida") == 0) { // Era a salida, es casi lo mismo que arriba to_connect = find((char *)XML_GET_CONTENT(conector1->children)); - if (!current_item->connect(to_connect, IConector::OUT)) { - std::cout << s << " Error al conectar2 SALIDA" << std::endl; - } else { - std::cout << s << " SALIDA1 = " << (char *)XML_GET_CONTENT(conector1->children) << std::endl; - } + current_item->connect(to_connect, IConector::OUT); } } if (conector2 != NULL) { @@ -422,17 +501,11 @@ 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(conector2->children)); // y lo conecto - if (!current_item->connect(to_connect, IConector::IN)) { - std::cout << s << " Error al conectar2 ENTRADA = " << (char *)XML_GET_CONTENT(conector2->children) << std::endl; - } else { - std::cout << s << " ENTRADA2 = " << (char *)XML_GET_CONTENT(conector2->children) << std::endl; - } + current_item->connect(to_connect, IConector::IN); } else if (xmlStrcmp(conector2->name, BAD_CAST"salida") == 0) { // Era a salida, es casi lo mismo que arriba to_connect = find((char *)XML_GET_CONTENT(conector2->children)); - if (!current_item->connect(to_connect, IConector::OUT)) { - std::cout << s << " Error al conectar " << std::endl; - } + current_item->connect(to_connect, IConector::OUT); } } if (conector3 != NULL) { @@ -441,15 +514,11 @@ 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 - if (!current_item->connect(to_connect, IConector::IN)) { - std::cout << s << " Error al conectar " << std::endl; - } + current_item->connect(to_connect, IConector::IN); } 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; - } + current_item->connect(to_connect, IConector::OUT); } } nodo = nodo->next; @@ -470,13 +539,16 @@ std::string Simulator::get_state_as_xml() for(i2=items.begin(); i2!=items.end(); i2++) (*i2)->get_state_as_xml(out); + std::list::iterator i3; + for(i3=control_lst.begin(); i3!=control_lst.end(); i3++) + (*i3)->get_state_as_xml(out); out << ""; return out.str();; } RGB Simulator::loadRGB(xmlNodePtr nodo) { - unsigned r,g,b; + unsigned long r,g,b; while (nodo != NULL) { if (nodo->type == XML_ELEMENT_NODE) { if (xmlStrcmp(nodo->name, BAD_CAST"rojo")==0) @@ -488,6 +560,72 @@ RGB Simulator::loadRGB(xmlNodePtr nodo) } nodo = nodo->next; } + r = static_cast(255 * (r / 65535.0f)); + g = static_cast(255 * (g / 65535.0f)); + b = static_cast(255 * (b / 65535.0f)); + 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) || (xmlStrcmp(nodo->name, BAD_CAST"not") == 0) || (xmlStrcmp(nodo->name, BAD_CAST"or") == 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) { + if (dynamic_cast(item)) { + std::string donde = (char *)xmlGetProp(nodo, BAD_CAST"id"); + if (donde == "inferior") { + current->connect( item->get_logic_output(), IConector::IN ); + } else { + current->connect( item->get_logic_input(), IConector::IN ); + } + } else { + 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 { + LogicControl *logic = dynamic_cast(find_logic((char *)XML_GET_CONTENT(nodo->children))); + /* Bien, si no era un control, debe ser una compuerta */ + if (logic != NULL) { + logic->connect(current, IConector::IN); + } else { + std::cout << "ERROR : Item no es tipo Control ni tipo LogicControl ... esto si que esta todo malllll!!" << std::endl; + } + } + } + + nodo = nodo->next; + } +} +