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
28using 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
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
77bool
79 Message * message) noexcept
80{
81 try {
82 if (interface == writer_) {
83 //logger_->log_debug(bbil_name(), "Forwarding message");
84 logger_->log_debug(bbil_name(),
85 "Forwarding message from sender %s, source %s",
86 message->sender_id().get_string().c_str(),
87 message->source_id().get_string().c_str());
88 Message *m = message->clone();
89 m->set_hops(message->hops());
90 m->ref();
91 reader_->msgq_enqueue(m, true);
92 message->set_id(m->id());
93 logger_->log_debug(bbil_name(),
94 "Sender after enqueueing: %s",
95 m->sender_id().get_string().c_str());
96 logger_->log_debug(bbil_name(),
97 "Source after enqueueing: %s",
98 m->source_id().get_string().c_str());
99 m->unref();
100 return false;
101 } else {
102 // Don't know why we were called, let 'em enqueue
103 logger_->log_error(bbil_name(), "Message received for unknown interface");
104 return true;
105 }
106 } catch (Exception &e) {
107 logger_->log_error(bbil_name(), "Exception when message received");
108 logger_->log_error("SyncInterfaceListener", e);
109 return false;
110 }
111}
112
113void
115{
116 try {
117 if (interface == reader_) {
118 //logger_->log_debug(bbil_name(), "Copying data");
119 reader_->read();
120 writer_->copy_values(reader_);
121 writer_->write();
122 } else {
123 // Don't know why we were called, let 'em enqueue
124 logger_->log_error(bbil_name(), "Data changed for unknown interface");
125 }
126 } catch (Exception &e) {
127 logger_->log_error(bbil_name(), "Exception when data changed");
128 logger_->log_error(bbil_name(), e);
129 }
130}
virtual ~SyncInterfaceListener()
Destructor.
virtual bool bb_interface_message_received(fawkes::Interface *interface, fawkes::Message *message) noexcept
BlackBoard message received notification.
virtual void bb_interface_data_refreshed(fawkes::Interface *interface) noexcept
BlackBoard data refreshed notification.
SyncInterfaceListener(fawkes::Logger *logger, fawkes::Interface *reader, fawkes::Interface *writer, fawkes::BlackBoard *reader_bb, fawkes::BlackBoard *writer_bb)
Constructor.
BlackBoard interface listener.
void bbil_add_message_interface(Interface *interface)
Add an interface to the message received watch list.
void bbil_add_data_interface(Interface *interface)
Add an interface to the data modification watch list.
The BlackBoard abstract class.
Definition: blackboard.h:46
virtual void unregister_listener(BlackBoardInterfaceListener *listener)
Unregister BB interface listener.
Definition: blackboard.cpp:212
virtual void register_listener(BlackBoardInterfaceListener *listener, ListenerRegisterFlag flag=BBIL_FLAG_ALL)
Register BB event listener.
Definition: blackboard.cpp:185
Base class for exceptions in Fawkes.
Definition: exception.h:36
Base class for all Fawkes BlackBoard interfaces.
Definition: interface.h:80
Interface for logging.
Definition: logger.h:42
Base class for all messages passed through interfaces in Fawkes BlackBoard.
Definition: message.h:44
Uuid source_id() const
Get ID of the original source of the message.
Definition: message.cpp:346
Uuid sender_id() const
Get ID of the immediate sender, not necessarily the creator of the message.
Definition: message.cpp:336
void set_hops(unsigned int hops)
Set number of hops.
Definition: message.cpp:227
virtual Message * clone() const
Clone this message.
Definition: message.cpp:418
unsigned int id() const
Get message ID.
Definition: message.cpp:181
void unref()
Decrement reference count and conditionally delete this instance.
Definition: refcount.cpp:95
void ref()
Increment reference count.
Definition: refcount.cpp:67
std::string get_string() const
Get the string representation of the Uuid.
Definition: uuid.cpp:107
Fawkes library namespace.