sync_listener.cpp
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include "sync_listener.h"
00024
00025 #include <blackboard/blackboard.h>
00026 #include <utils/logging/logger.h>
00027
00028 using namespace fawkes;
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049 SyncInterfaceListener::SyncInterfaceListener(fawkes::Logger *logger,
00050 fawkes::Interface *reader,
00051 fawkes::Interface *writer,
00052 fawkes::BlackBoard *reader_bb,
00053 fawkes::BlackBoard *writer_bb)
00054 : BlackBoardInterfaceListener("SyncInterfaceListener(%s-%s)", writer->uid(), reader->id())
00055 {
00056 __logger = logger;
00057 __reader = reader;
00058 __writer = writer;
00059 __reader_bb = reader_bb;
00060 __writer_bb = writer_bb;
00061
00062 bbil_add_data_interface(__reader);
00063 bbil_add_message_interface(__writer);
00064
00065 __reader_bb->register_listener(this, BlackBoard::BBIL_FLAG_DATA);
00066 __writer_bb->register_listener(this, BlackBoard::BBIL_FLAG_MESSAGES);
00067 }
00068
00069
00070
00071 SyncInterfaceListener::~SyncInterfaceListener()
00072 {
00073 __reader_bb->unregister_listener(this);
00074 __writer_bb->unregister_listener(this);
00075 }
00076
00077
00078 bool
00079 SyncInterfaceListener::bb_interface_message_received(Interface *interface,
00080 Message *message) throw()
00081 {
00082 try {
00083 if ( interface == __writer ) {
00084 __logger->log_debug(bbil_name(), "Forwarding message");
00085 Message *m = message->clone();
00086 m->set_hops(message->hops());
00087 m->ref();
00088 __reader->msgq_enqueue(m);
00089 message->set_id(m->id());
00090 m->unref();
00091 return false;
00092 } else {
00093
00094 __logger->log_error(bbil_name(), "Message received for unknown interface");
00095 return true;
00096 }
00097 } catch (Exception &e) {
00098 __logger->log_error(bbil_name(), "Exception when message received");
00099 __logger->log_error("SyncInterfaceListener", e);
00100 return false;
00101 }
00102 }
00103
00104
00105 void
00106 SyncInterfaceListener::bb_interface_data_changed(Interface *interface) throw()
00107 {
00108 try {
00109 if ( interface == __reader ) {
00110
00111 __reader->read();
00112 __writer->copy_values(__reader);
00113 __writer->write();
00114 } else {
00115
00116 __logger->log_error(bbil_name(), "Data changed for unknown interface");
00117 }
00118 } catch (Exception &e) {
00119 __logger->log_error(bbil_name(), "Exception when data changed");
00120 __logger->log_error(bbil_name(), e);
00121 }
00122 }