]> git.llucax.com Git - z.facultad/75.42/plaqui.git/blobdiff - Model/src/simulator.cpp
La Division ahora anda bien en todos los casos
[z.facultad/75.42/plaqui.git] / Model / src / simulator.cpp
index 9e84e8a257559f093b83e56fbd43000bcd2ae77f..7811d4eef0694d3520ac04452c42421ad986b8cb 100644 (file)
@@ -158,8 +158,10 @@ void Simulator::simulate()
                (*i1)->update();
 
        std::list<PlantItem *>::iterator i2;
                (*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();
+               (*i2)->update_color();
+       }
        
        for(i2=items.begin(); i2!=items.end(); i2++) 
                (*i2)->simulate();
        
        for(i2=items.begin(); i2!=items.end(); i2++) 
                (*i2)->simulate();
@@ -312,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) );
                                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);
                        }
                }
                                color = loadRGB(nodo->children);
                        }
                }
@@ -512,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
                                // 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));
                        } 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;
                        }
                }
                nodo = nodo->next;
@@ -541,13 +539,16 @@ std::string Simulator::get_state_as_xml()
        for(i2=items.begin(); i2!=items.end(); i2++)
                (*i2)->get_state_as_xml(out);
 
        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)
 {
        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)
        while (nodo != NULL) {
                if (nodo->type == XML_ELEMENT_NODE) {
                        if (xmlStrcmp(nodo->name, BAD_CAST"rojo")==0)
@@ -559,6 +560,10 @@ RGB Simulator::loadRGB(xmlNodePtr nodo)
                }
                nodo = nodo->next;
        }
                }
                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);
 }
 
        return RGB(r,g,b);
 }
 
@@ -572,7 +577,7 @@ void Simulator::do_logic_connetions(xmlNodePtr nodo)
                        continue;
                }
                // obtengo el items actual por su nombre
                        continue;
                }
                // obtengo el items actual por su nombre
-               if (xmlStrcmp(nodo->name, BAD_CAST"and") == 0) {
+               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);
                        std::string s = (char *)xmlGetProp(nodo, BAD_CAST"nombre");
                        current = find_logic((char *)xmlGetProp(nodo, BAD_CAST"nombre"));
                        connect_logic(current, nodo->children);
@@ -592,7 +597,16 @@ void Simulator::connect_logic(LogicControl *current, xmlNodePtr nodo)
                if (xmlStrcmp(nodo->name, BAD_CAST"entrada") == 0) {
                        item = dynamic_cast<Control *>(find((char *)XML_GET_CONTENT(nodo->children)));
                        if (item != NULL) {
                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 );
+                               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 {
                                std::cout << "ERROR : Item no es tipo Control!!" << std::endl;
                        }
                        } else {
                                std::cout << "ERROR : Item no es tipo Control!!" << std::endl;
                        }
@@ -601,7 +615,13 @@ void Simulator::connect_logic(LogicControl *current, xmlNodePtr nodo)
                        if (item != NULL) {
                                item->get_logic_input()->connect( current, IConector::IN );
                        } else {
                        if (item != NULL) {
                                item->get_logic_input()->connect( current, IConector::IN );
                        } else {
-                               std::cout << "ERROR : Item no es tipo Control!!" << std::endl;
+                               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;
+                               }
                        }
                }
 
                        }
                }