]> git.llucax.com Git - z.facultad/75.42/plaqui.git/blobdiff - Model/src/simulator.cpp
Se corrige el XML a mano para probarlo.
[z.facultad/75.42/plaqui.git] / Model / src / simulator.cpp
index b6a77d3bc68922ba1729f686091b39eaa001dd2e..be680057c5f596a7a404f9569a4facee8d443c8e 100644 (file)
@@ -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<PlantItem *>::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<LogicControl *>::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<LogicControl *>::iterator i3;
+       for(i3=control_lst.begin(); i3!=control_lst.end(); i3++)
+               (*i3)->get_state_as_xml(out);
        out << "</plantstatus>";
        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,78 @@ RGB Simulator::loadRGB(xmlNodePtr nodo)
                }
                nodo = nodo->next;
        }
+       r = static_cast<unsigned long>(255 * (r / 65535.0f));
+       g = static_cast<unsigned long>(255 * (g / 65535.0f));
+       b = static_cast<unsigned long>(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<Control *>(find((char *)XML_GET_CONTENT(nodo->children)));
+                       if (item != NULL) {
+                               if (dynamic_cast<Tank *>(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 {
+                               LogicControl *logic = dynamic_cast<LogicControl *>(find_logic((char *)XML_GET_CONTENT(nodo->children)));
+                               /* Bien, si no era un control, debe ser una compuerta */
+                               if (logic != NULL) {
+                                       current->connect(logic, IConector::IN);
+                               } else {
+                                       std::cout << "ERROR : Item no es tipo Control ni tipo LogicControl ... esto si que esta todo malllll!!" << 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 {
+                               LogicControl *logic = dynamic_cast<LogicControl *>(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;
+       }
+}
+