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> 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;
const Time * time_enqueued() const
Get time when message was enqueued.
Base class for all messages passed through interfaces in Fawkes BlackBoard.
unsigned int id() const
Get message ID.
const char * str(bool utc=false) const
Output function.
void unref()
Decrement reference count and conditionally delete this instance.
Fawkes library namespace.
int32_t test_int() const
Get test_int value.
void write()
Write from local copy into BlackBoard memory.
Base class for all Fawkes BlackBoard interfaces.
unsigned int msgq_size()
Get size of message queue.
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.
Message * msgq_first()
Get the first message from the message queue.
unsigned short serial() const
Get instance serial of interface.
void read()
Read from BlackBoard into local copy.
virtual Message * clone() const
Clone this message.
void ref()
Increment reference count.
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.
virtual InterfaceInfoList * list_all()=0
Get list of all currently existing interfaces.
int32_t test_int() const
Get test_int value.
virtual Interface * open_for_reading(const char *interface_type, const char *identifier, const char *owner=NULL)=0
Open interface for reading.
void msgq_flush()
Flush all messages.
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.
virtual Interface * open_for_writing(const char *interface_type, const char *identifier, const char *owner=NULL)=0
Open interface for writing.
const char * type() const
Get message type.
BlackBoard interface listener.
Synchronize two interfaces.
void start(bool wait=true)
Call this method to start the thread.
TestInterface Fawkes BlackBoard Interface.
const char * hash_printable() const
Get printable interface hash.
virtual void close(Interface *interface)=0
Close interface.