+ 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, conector3;
+
+ while (nodo != NULL) {
+ if (nodo->type != XML_ELEMENT_NODE) {
+ nodo = nodo->next;
+ 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;
+ while (props != NULL) {
+ if (nodo->type == XML_ELEMENT_NODE) {
+ if (xmlStrcmp(props->name, BAD_CAST"conector") == 0) {
+ xmlNodePtr temp = props->children;
+ while ((temp != NULL) && (conector1 == NULL))
+ if (temp->type == XML_ELEMENT_NODE) {
+ conector1 = temp;
+ temp = temp->next;
+ break;
+ } else {
+ temp = temp->next;
+ }
+ while ((temp != NULL) && (conector2 == NULL))
+ if (temp->type == XML_ELEMENT_NODE) {
+ conector2 = temp;
+ temp = temp->next;
+ break;
+ } 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;
+ }
+ // Bien, conector1 y 2 deberian estar apuntando a <entrada> y/o <salida>
+ if (conector1 != NULL) {
+ // si, aca hay un conector!, veamos cual es
+ if (xmlStrcmp(conector1->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(conector1->children));
+ // y lo conecto
+ 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));
+ current_item->connect(to_connect, IConector::OUT);
+ }
+ }
+ if (conector2 != NULL) {
+ // si, aca hay un conector!, veamos cual es
+ if (xmlStrcmp(conector2->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(conector2->children));
+ // y lo conecto
+ 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));
+ 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
+ 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));
+ current_item->connect(to_connect, IConector::OUT);
+ }
+ }
+ nodo = nodo->next;
+ }
+ // Fin de las conexiones
+}
+
+std::string Simulator::get_state_as_xml()
+{
+ std::stringstream out;
+
+ // XML Header
+ out << "<?xml version=\"1.0\" ?>" << std::endl;
+
+ out << "<plantstatus frame=\"" << frame << "\">" << std::endl;
+
+ std::list<PlantItem *>::iterator i2;
+ 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 long 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;
+ }
+ 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;
+ }