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);
}
(*i1)->update();
std::list<PlantItem *>::iterator i2;
+ for(i2=items.begin(); i2!=items.end(); i2++) {
+ (*i2)->update();
+ (*i2)->update_color();
+ }
+
for(i2=items.begin(); i2!=items.end(); i2++)
(*i2)->simulate();
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 :-(
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);
}
}
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 :)
// 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) {
// 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) {
// 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;
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)
}
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;
+ }
+}
+