27 #include <blackboard/local.h>
28 #include <blackboard/remote.h>
29 #include <blackboard/exceptions.h>
30 #include <blackboard/bbconfig.h>
31 #include <blackboard/interface_listener.h>
33 #include <interfaces/TestInterface.h>
35 #include <interface/interface_info.h>
36 #include <core/exceptions/system.h>
37 #include <netcomm/fawkes/client.h>
38 #include <netcomm/fawkes/server_thread.h>
39 #include <utils/time/time.h>
50 using namespace fawkes;
56 signal_handler(
int signum)
68 int expval = ti_reader->
test_int() + 1;
71 printf(
"Sent with message ID %u\n", msgid);
74 cout <<
"Error, more than one message! flushing." << endl;
83 printf(
"Received message of ID %u, Message improperly detected to be a SetTestStringMessage\n", msg->
id());
87 printf(
"Received message with ID %u (enqueue time: %s)\n", m2->
id(), m2->
time_enqueued()->
str());
92 cout <<
"BUG: caught write denied exception" << endl;
97 cout <<
"Illegal message '" << ti_writer->
msgq_first()->
type() <<
"' type received" << endl;
105 if ( val == expval ) {
108 cout <<
" failure, value is " << ti_reader->
test_int() <<
", expected "
112 printf(
"No message in queue, if network test this means the message was dropped\n");
130 __reader_bb = reader_bb;
131 __writer_bb = writer_bb;
133 bbil_add_data_interface(__reader);
134 bbil_add_message_interface(__writer);
136 __reader_bb->register_listener(
this);
137 __writer_bb->register_listener(
this);
144 __reader_bb->unregister_listener(
this);
145 __writer_bb->unregister_listener(
this);
150 bb_interface_message_received(
Interface *interface,
154 if ( interface == __writer ) {
155 printf(
"%s: Forwarding message\n", bbil_name());
159 __reader->msgq_enqueue(m);
160 message->set_id(m->
id());
165 printf(
"%s: Message received for unknown interface\n", bbil_name());
169 printf(
"%s: Exception when message received\n", bbil_name());
177 bb_interface_data_changed(
Interface *interface)
throw()
180 if ( interface == __reader ) {
183 __writer->copy_values(__reader);
187 printf(
"%s: Data changed for unknown interface", bbil_name());
190 printf(
"%s: Exception when data changed\n", bbil_name());
206 main(
int argc,
char **argv)
208 signal(SIGINT, signal_handler);
221 for (InterfaceInfoList::iterator i = infl->begin(); i != infl->end(); ++i) {
222 const unsigned char *hash = (*i).hash();
223 char phash[__INTERFACE_HASH_SIZE * 2 + 1];
224 memset(phash, 0,
sizeof(phash));
225 for (
unsigned int j = 0; j < __INTERFACE_HASH_SIZE; ++j) {
226 sprintf(&phash[j * 2],
"%02x", hash[j]);
228 printf(
"%s::%s (%s), w:%i r:%u s:%u\n",
229 (*i).type(), (*i).id(), phash, (*i).has_writer(),
230 (*i).num_readers(), (*i).serial());
238 cout <<
"Opening interfaces.. " << flush;
246 cout <<
"failed! Aborting" << endl;
252 cout <<
"Trying to open second writer.. " << flush;
255 rbb->
close(ti_writer_two);
256 cout <<
"BUG: Detection of second writer did NOT work!" << endl;
259 cout <<
"exception caught as expected, detected and prevented second writer!" << endl;
263 cout <<
"Trying to open third writer.. " << flush;
266 cout <<
"No exception as expected, different ID ok!" << endl;
267 rbb->
close(ti_writer_three);
269 cout <<
"BUG: Third writer with different ID detected as another writer!" << endl;
274 <<
"Running data tests ==================================================" << endl;
276 cout <<
"Writing initial value ("
277 << TestInterface::TEST_CONSTANT <<
") into interface as TestInt" << endl;
278 ti_writer->
set_test_int( TestInterface::TEST_CONSTANT );
282 cout <<
"BUG: caught write denied exception" << endl;
286 cout <<
"Giving some time to have value processed" << endl;
289 cout <<
"Reading value from reader interface.. " << flush;
292 if ( val == TestInterface::TEST_CONSTANT ) {
293 cout <<
" success, value is " << ti_reader->
test_int() <<
" as expected" << endl;
295 cout <<
" failure, value is " << ti_reader->
test_int() <<
", expected "
296 << TestInterface::TEST_CONSTANT << endl;
299 cout <<
"Closing interfaces.. " << flush;
301 rbb->
close(ti_reader);
302 rbb->
close(ti_writer);
303 cout <<
"done" << endl;
305 cout <<
"failed" << endl;
309 cout << endl << endl <<
"Starting MESSAGING tests" << endl
310 <<
"Press Ctrl-C to continue with next test" << endl << endl;
315 printf(
"Writer serial: %u shifted: %u\n", ti_writer->
serial(), ti_writer->
serial() << 16);
316 printf(
"Reader serial: %u shifted: %u\n", ti_reader->
serial(), ti_reader->
serial() << 16);
318 test_messaging(ti_reader, ti_writer);
320 rbb->
close(ti_reader);
321 lbb->
close(ti_writer);
323 cout << endl << endl <<
"Starting MESSAGING tests, doing repeater scenario" << endl
324 <<
"Press Ctrl-C to continue with next test" << endl << endl;
348 printf(
"Writer serial: %u shifted: %u\n", ti_writer->
serial(), ti_writer->
serial() << 16);
349 printf(
"Reader serial: %u shifted: %u\n", ti_reader->
serial(), ti_reader->
serial() << 16);
353 test_messaging(ti_reader, ti_writer);
356 lbb->
close(ti_reader);
357 rbb->
close(ti_writer);
358 rep_rbb->
close(rep_reader);
359 lbb->
close(rep_writer);
363 cout <<
"Tests done" << endl;
Base class for all messages passed through interfaces in Fawkes BlackBoard.
unsigned short serial() const
Get instance serial of interface.
void unref()
Decrement reference count and conditionally delete this instance.
const char * hash_printable() const
Get printable interface hash.
const char * type() const
Get message type.
void write()
Write from local copy into BlackBoard memory.
unsigned int id() const
Get message ID.
Base class for all Fawkes BlackBoard interfaces.
virtual Interface * open_for_writing(const char *interface_type, const char *identifier)=0
Open interface for writing.
unsigned int msgq_size()
Get size of message queue.
int32_t test_int() const
Get test_int value.
void set_test_int(const int32_t new_test_int)
Set test_int value.
void msgq_pop()
Erase first message from queue.
virtual void start_nethandler(FawkesNetworkHub *hub)
Start network handler.
Interface information list.
Base class for exceptions in Fawkes.
void read()
Read from BlackBoard into local copy.
int32_t test_int() const
Get test_int value.
void ref()
Increment reference count.
virtual Message * clone() const
Clone this message.
SetTestIntMessage Fawkes BlackBoard Interface Message.
bool msgq_first_is()
Check if first message has desired type.
unsigned int msgq_enqueue(Message *message)
Enqueue message at end of queue.
void print_trace()
Prints trace to stderr.
const Time * time_enqueued() const
Get time when message was enqueued.
virtual InterfaceInfoList * list_all()=0
Get list of all currently existing interfaces.
virtual Interface * open_for_reading(const char *interface_type, const char *identifier)=0
Open interface for reading.
void msgq_flush()
Flush all messages.
const char * str(bool utc=false) const
Output function.
Message * msgq_first()
Get the first message from the message queue.
The BlackBoard abstract class.
Thrown if a writer is already active on an interface that writing has been requested for...
SetTestStringMessage Fawkes BlackBoard Interface Message.
This exception is thrown if a write has been attempted on a read-only interface.
void set_hops(unsigned int hops)
Set number of hops.
BlackBoard interface listener.
Synchronize two interfaces.
void start(bool wait=true)
Call this method to start the thread.
TestInterface Fawkes BlackBoard Interface.
virtual void close(Interface *interface)=0
Close interface.