#include <glibmm/timer.h>
#include <sigc++/slot.h>
#include <fstream>
-#include <iterator>
-#include <algorithm>
#ifdef DEBUG
# include <iostream>
#endif // DEBUG
Plant::~Plant(void) {
#ifdef DEBUG
- cerr << __FILE__ << ": destructor." << endl;
+ cerr << __FILE__ << "(" << __LINE__ << ")"
+ << ": destructor." << endl;
#endif // DEBUG
// Termino transmisiones.
Glib::Mutex::Lock lock(transmissions_mutex);
Plant::Plant(const string& filename): simulator(filename), filename(filename) {
#ifdef DEBUG
- cerr << __FILE__ << ": constructor. filename = " << filename << endl;
+ cerr << __FILE__ << "(" << __LINE__ << ")"
+ << ": constructor. filename = " << filename << endl;
#endif // DEBUG
// TODO plant
/* simulator.add_pump("bomba1");
void Plant::real_run(void) {
#ifdef DEBUG
- cerr << __FILE__ << ": real_run." << endl;
+ cerr << __FILE__ << "(" << __LINE__ << ")"
+ << ": real_run." << endl;
#endif // DEBUG
while (!stop) {
+ simulator_mutex.lock();
simulator.simulate();
- Glib::Mutex::Lock lock(transmissions_mutex);
+ simulator_mutex.unlock();
+ transmissions_mutex.lock();
for (TransmitterList::iterator i = transmissions.begin();
i != transmissions.end(); i++) {
(*i)->send(simulator.get_state_as_xml());
}
+ transmissions_mutex.unlock();
Glib::usleep(1000000);
}
}
bool Plant::transmission_start(string& host, Connection::Port& port) {
+#ifdef DEBUG
+ cerr << __FILE__ << "(" << __LINE__ << ")"
+ << ": transmission_start(host = " << host <<
+ ", port = " << port << ")." << endl;
+#endif // DEBUG
Glib::Mutex::Lock lock(transmissions_mutex);
for (TransmitterList::iterator i = transmissions.begin();
i != transmissions.end(); i++) {
if (((*i)->get_host() == host) && ((*i)->get_port() == port)) {
+#ifdef DEBUG
+ cerr << __FILE__ << "(" << __LINE__ << ")"
+ << ": transmission_start ERROR: ya existe."
+ << endl;
+#endif // DEBUG
return false;
}
}
Transmitter* trans;
try {
trans = new Transmitter(host, port);
- } catch (...) { // TODO - Hace mas selectivo el catch?
- delete trans;
+ } catch (const sockerr& e) { // TODO - Hace mas selectivo el catch?
+#ifdef DEBUG
+ cerr << __FILE__ << "(" << __LINE__ << ")"
+ << ": transmission_start ERROR (" << e.serrno()
+ << "): " << e.errstr() << endl;
+#endif // DEBUG
+ //delete trans;
return false;
+// } catch (...) { // TODO - Hace mas selectivo el catch?
+//#ifdef DEBUG
+// cerr << __FILE__ << "(" << __LINE__ << ")"
+// << ": transmission_start ERROR: desconocido."
+// << endl;
+//#endif // DEBUG
+// //delete trans;
+// return false;
}
transmissions.push_back(trans);
trans->run();
+ host = trans->get_host();
+ port = trans->get_port();
return true;
}
bool Plant::transmission_stop(const string& host,
const Connection::Port& port) {
+#ifdef DEBUG
+ cerr << __FILE__ << "(" << __LINE__ << ")"
+ << ": transmission_stop(host = " << host <<
+ ", port = " << port << ")." << endl;
+#endif // DEBUG
Glib::Mutex::Lock lock(transmissions_mutex);
for (TransmitterList::iterator i = transmissions.begin();
i != transmissions.end(); i++) {
return false; // No la encontró.
}
+bool Plant::on_transmission_finished(Transmitter* transmission) {
+#ifdef DEBUG
+ cerr << __FILE__ << "(" << __LINE__ << ")"
+ << ": on_transmission_finished(transmission = "
+ << transmission << ")" << endl;
+#endif // DEBUG
+ Glib::Mutex::Lock lock(transmissions_mutex);
+ transmissions.remove(transmission);
+#ifdef DEBUG
+ cerr << __FILE__ << "(" << __LINE__ << ")"
+ << ": lista de conexiones" << endl;
+ for (TransmitterList::const_iterator i = transmissions.begin();
+ i != transmissions.end(); i++) {
+ cerr << "\t " << *i << endl;
+ }
+#endif // DEBUG
+}
+
+bool Plant::set_open(const std::string& element, bool open) {
+#ifdef DEBUG
+ cerr << __FILE__ << "(" << __LINE__ << ")"
+ << ": set_open(element = " << element <<
+ ", open = " << open << ")." << endl;
+#endif // DEBUG
+ Glib::Mutex::Lock lock(simulator_mutex);
+ return simulator.set_open(element, open);
+}
+
const string Plant::get_xml(void) const {
+#ifdef DEBUG
+ cerr << __FILE__ << "(" << __LINE__ << ")"
+ << ": get_xml()." << endl;
+#endif // DEBUG
ostringstream oss;
- try {
- ifstream ifs(filename.c_str());
- ifs >> noskipws;
- copy(istream_iterator<char>(ifs), istream_iterator<char>(),
- ostream_iterator<char>(oss));
- } catch (...) { // TODO hacerlo mas selectivo?
- return "";
- }
+ ifstream ifs(filename.c_str());
+ ifs >> oss.rdbuf();
return oss.str();
}
}
*/
-//const std::string& Plant::get_name(void) const {
-// return name;
+//const std::string& Plant::get_filename(void) const {
+// return filename;
//}
/// \todo FIXME esto deberia estar protegido por un mutex.