Fawkes API  Fawkes Development Version
sync_listener.cpp
1 
2 /***************************************************************************
3  * sync_listener.cpp - Sync Interface Listener
4  *
5  * Created: Fri Jun 05 11:01:23 2009
6  * Copyright 2006-2009 Tim Niemueller [www.niemueller.de]
7  *
8  ****************************************************************************/
9 
10 /* This program is free software; you can redistribute it and/or modify
11  * it under the terms of the GNU General Public License as published by
12  * the Free Software Foundation; either version 2 of the License, or
13  * (at your option) any later version.
14  *
15  * This program is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18  * GNU Library General Public License for more details.
19  *
20  * Read the full text in the LICENSE.GPL file in the doc directory.
21  */
22 
23 #include "sync_listener.h"
24 
25 #include <blackboard/blackboard.h>
26 #include <logging/logger.h>
27 
28 using namespace fawkes;
29 
30 /** @class SyncInterfaceListener "sync_listener.h"
31  * Synchronize two interfaces.
32  * This class synchronizes two interfaces, a reading and a writing instance
33  * of the same type. To accomplish this it listens for data changed and message
34  * events and forwards them as appropriate to "the other side".
35  * @author Tim Niemueller
36  */
37 
38 /** Constructor.
39  * Automatically registers the listener with the (two) blackboards as
40  * appropriate. It also automatically unregisters in the destructor.
41  * @param logger logger to write informational output to
42  * @param reader reading interface instance
43  * @param writer writing interface instance of the same type as \p reader
44  * @param reader_bb the BlackBoard instance the reading instance has been
45  * created on
46  * @param writer_bb the BlackBoard instance the writing instance has been
47  * created on
48  */
50  fawkes::Interface * reader,
51  fawkes::Interface * writer,
52  fawkes::BlackBoard *reader_bb,
53  fawkes::BlackBoard *writer_bb)
54 : BlackBoardInterfaceListener("SyncInterfaceListener(%s-%s)", writer->uid(), reader->id())
55 {
56  logger_ = logger;
57  reader_ = reader;
58  writer_ = writer;
59  reader_bb_ = reader_bb;
60  writer_bb_ = writer_bb;
61 
62  bbil_add_data_interface(reader_);
65 
66  reader_bb_->register_listener(this, BlackBoard::BBIL_FLAG_DATA);
67  writer_bb_->register_listener(this, BlackBoard::BBIL_FLAG_MESSAGES);
68 }
69 
70 /** Destructor. */
72 {
73  reader_bb_->unregister_listener(this);
74  writer_bb_->unregister_listener(this);
75 }
76 
77 bool
79 {
80  try {
81  if (interface == writer_) {
82  //logger_->log_debug(bbil_name(), "Forwarding message");
83  Message *m = message->clone();
84  m->set_hops(message->hops());
85  m->ref();
86  reader_->msgq_enqueue(m);
87  message->set_id(m->id());
88  m->unref();
89  return false;
90  } else {
91  // Don't know why we were called, let 'em enqueue
92  logger_->log_error(bbil_name(), "Message received for unknown interface");
93  return true;
94  }
95  } catch (Exception &e) {
96  logger_->log_error(bbil_name(), "Exception when message received");
97  logger_->log_error("SyncInterfaceListener", e);
98  return false;
99  }
100 }
101 
102 void
104 {
105  try {
106  if (interface == reader_) {
107  //logger_->log_debug(bbil_name(), "Copying data");
108  reader_->read();
109  writer_->copy_values(reader_);
110  writer_->write();
111  } else {
112  // Don't know why we were called, let 'em enqueue
113  logger_->log_error(bbil_name(), "Data changed for unknown interface");
114  }
115  } catch (Exception &e) {
116  logger_->log_error(bbil_name(), "Exception when data changed");
117  logger_->log_error(bbil_name(), e);
118  }
119 }
fawkes::RefCount::unref
void unref()
Decrement reference count and conditionally delete this instance.
Definition: refcount.cpp:101
SyncInterfaceListener::bb_interface_message_received
virtual bool bb_interface_message_received(fawkes::Interface *interface, fawkes::Message *message)
BlackBoard message received notification.
Definition: sync_listener.cpp:78
SyncInterfaceListener::~SyncInterfaceListener
virtual ~SyncInterfaceListener()
Destructor.
Definition: sync_listener.cpp:71
fawkes::BlackBoard::register_listener
virtual void register_listener(BlackBoardInterfaceListener *listener, ListenerRegisterFlag flag=BBIL_FLAG_ALL)
Register BB event listener.
Definition: blackboard.cpp:190
fawkes::Message
Definition: message.h:41
SyncInterfaceListener::bb_interface_data_changed
virtual void bb_interface_data_changed(fawkes::Interface *interface)
BlackBoard data changed notification.
Definition: sync_listener.cpp:103
fawkes::BlackBoard::unregister_listener
virtual void unregister_listener(BlackBoardInterfaceListener *listener)
Unregister BB interface listener.
Definition: blackboard.cpp:217
fawkes::BlackBoardInterfaceListener
Definition: interface_listener.h:47
fawkes::BlackBoard
Definition: blackboard.h:50
fawkes::RefCount::ref
void ref()
Increment reference count.
Definition: refcount.cpp:73
fawkes::Logger
Definition: logger.h:41
fawkes
fawkes::BlackBoardInterfaceListener::bbil_add_message_interface
void bbil_add_message_interface(Interface *interface)
Add an interface to the message received watch list.
Definition: interface_listener.cpp:247
fawkes::Interface
Definition: interface.h:78
fawkes::Message::set_hops
void set_hops(unsigned int hops)
Set number of hops.
Definition: message.cpp:213
fawkes::Message::clone
virtual Message * clone() const
Clone this message.
Definition: message.cpp:389
fawkes::Message::id
unsigned int id() const
Get message ID.
Definition: message.cpp:186
SyncInterfaceListener::SyncInterfaceListener
SyncInterfaceListener(fawkes::Logger *logger, fawkes::Interface *reader, fawkes::Interface *writer, fawkes::BlackBoard *reader_bb, fawkes::BlackBoard *writer_bb)
Constructor.
Definition: sync_listener.cpp:49
fawkes::BlackBoardInterfaceListener::bbil_add_data_interface
void bbil_add_data_interface(Interface *interface)
Add an interface to the data modification watch list.
Definition: interface_listener.cpp:238
fawkes::Exception
Definition: exception.h:41