X-Git-Url: https://git.llucax.com/z.facultad/75.42/plaqui.git/blobdiff_plain/a4fcf877753b034b1df7fa73d41388849fbc9000..bdec65138826cc15529c0fc5454aa11bbd877c20:/Model/src/simulator.cpp

diff --git a/Model/src/simulator.cpp b/Model/src/simulator.cpp
index f910c85..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,6 +158,11 @@ void Simulator::simulate()
 		(*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();
 
@@ -167,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 :-(
@@ -292,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);
 			}
 		}
@@ -342,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 :)
@@ -398,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) {
@@ -419,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) {
@@ -438,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;
@@ -467,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)
@@ -485,6 +560,72 @@ 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 {
+				std::cout << "ERROR : Item no es tipo Control!!" << 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;
+	}
+}
+