24 #include "blackboard.h"
26 #include <blackboard/remote.h>
28 #include <eclipseclass.h>
50 for ( std::vector< Interface* >::iterator iit = m_interfaces.begin();
51 iit != m_interfaces.end();
53 { m_blackboard->
close( *iit ); }
70 return m_blackboard ?
true :
false;
76 for ( std::vector< Interface* >::iterator iit = m_interfaces.begin();
77 iit != m_interfaces.end();
79 { m_blackboard->
close( *iit ); }
102 std::vector< Interface* > m_interfaces;
108 using namespace fawkes;
112 bool process_message_args(
Message* msg, EC_word arg_list);
115 p_connect_to_blackboard()
119 printf(
"p_connect_to_blackboard(): already connected\n" );
126 if ( EC_succeed != EC_arg( 1 ).is_string( &hostname ) )
128 printf(
"p_connect_to_blackboard(): first argument is not a string\n" );
134 g_blackboard.
connect( hostname );
147 p_disconnect_from_blackboard()
151 printf(
"p_disconnect_from_blackboard(): not connected\n" );
166 printf(
"p_is_alive(): not connected\n" );
171 {
return EC_succeed; }
182 printf(
"p_open_interface(): not connected\n" );
187 char* interface_type;
190 if ( EC_succeed != EC_arg( 1 ).is_atom( &mode) )
192 printf(
"p_open_interface(): no mode given\n" );
196 if ( EC_succeed != EC_arg( 2 ).is_string( &interface_type ) )
198 printf(
"p_open_interface(): no type given\n" );
202 if ( EC_succeed != EC_arg ( 3 ).is_string( &interface_id ) )
204 printf(
"p_open_interface(): no id given\n" );
212 if ( 0 == strcmp(
"w", mode.name() ) )
234 printf(
"p_close_interface(): not connected\n" );
241 if ( EC_succeed != EC_arg( 1 ).is_string( &interface_id ) )
243 printf(
"p_close_interface(): no id given\n" );
247 bool iface_found =
false;
249 for ( vector< Interface* >::iterator it = g_blackboard.
interfaces().begin();
253 if ( 0 == strcmp( (*it)->id(), interface_id ) )
264 {
return EC_succeed; }
275 if ( EC_succeed != EC_arg( 1 ).is_string( &interface_id ) )
277 printf(
"p_has_writer(): no id given\n" );
281 for ( vector< Interface* >::iterator it = g_blackboard.
interfaces().begin();
285 if ( 0 == strcmp( (*it)->id(), interface_id ) )
287 if ( (*it)->has_writer() )
288 {
return EC_succeed; }
305 printf(
"p_instance_serial(): not connected to blackboard\n" );
310 if ( EC_succeed != EC_arg( 1 ).is_string( &interface_id ) )
312 printf(
"p_instance_serial(): no interface id given\n" );
316 for ( vector< Interface* >::iterator iit = g_blackboard.
interfaces().begin();
320 if ( 0 == strcmp( (*iit)->id(), interface_id ) )
322 if ( EC_succeed != EC_arg( 2 ).unify( (*iit)->serial() ) )
324 printf(
"p_instance_serial(): could not bind return value\n" );
339 for ( vector< Interface* >::iterator it = g_blackboard.
interfaces().begin();
352 for ( vector< Interface* >::iterator it = g_blackboard.
interfaces().begin();
356 if ( (*it)->is_writer() )
364 p_read_from_interface()
369 if ( EC_succeed != EC_arg( 1 ).is_string( &interface_id ) )
371 printf(
"p_read_from_interface(): no interface id given\n" );
375 if ( EC_succeed != EC_arg( 2 ).is_string( &field ) )
377 printf(
"p_read_from_interface(): no field given\n" );
381 vector< Interface* >::iterator it;
386 if ( 0 == strcmp( interface_id, (*it)->id() ) )
389 for ( fit = (*it)->fields();
390 fit != (*it)->fields_end();
393 if ( 0 == strcmp( field, fit.
get_name() ) )
399 if ( EC_succeed != EC_arg( 3 ).unify( EC_atom( (
char*)
"true" ) ) )
401 printf(
"p_read_from_interface(): could not bind return value\n" );
407 if ( EC_succeed != EC_arg( 3 ).unify( EC_atom( (
char*)
"false" ) ) )
409 printf(
"p_read_from_interface(): could not bind return value\n" );
417 if ( EC_succeed != EC_arg( 3 ).unify( EC_word( (
long) fit.
get_int8() ) ) )
419 printf(
"p_read_from_interface(): could not bind return value\n" );
426 if ( EC_succeed != EC_arg( 3 ).unify( EC_word( (
long) fit.
get_uint8() ) ) )
428 printf(
"p_read_from_interface(): could not bind return value\n" );
435 if ( EC_succeed != EC_arg( 3 ).unify( EC_word( (
long) fit.
get_int16() ) ) )
437 printf(
"p_read_from_interface(): could not bind return value\n" );
444 if ( EC_succeed != EC_arg( 3 ).unify( EC_word( (
long) fit.
get_uint16() ) ) )
446 printf(
"p_read_from_interface(): could not bind return value\n" );
453 if ( EC_succeed != EC_arg( 3 ).unify( EC_word( (
long) fit.
get_int32() ) ) )
455 printf(
"bb_read_interface/3: could not bind value\n" );
462 if ( EC_succeed != EC_arg( 3 ).unify( EC_word( (
long) fit.
get_uint32() ) ) )
464 printf(
"p_read_from_interface(): could not bind return value\n" );
471 if ( EC_succeed != EC_arg( 3 ).unify( EC_word( (
long) fit.
get_int64() ) ) )
473 printf(
"p_read_from_interface(): could not bind return value\n" );
480 if ( EC_succeed != EC_arg( 3 ).unify( EC_word( (
long) fit.
get_uint64() ) ) )
482 printf(
"p_read_from_interface(): could not bind return value\n" );
489 if ( EC_succeed != EC_arg( 3 ).unify( EC_word( (
double) fit.
get_float() ) ) )
491 printf(
"p_read_from_interface(): could not bind return value\n" );
498 if ( EC_succeed != EC_arg( 3 ).unify( EC_word( fit.
get_string() ) ) )
500 printf(
"p_read_from_interface(): could not bind return value\n" );
507 printf(
"p_read_from_interface(): NOT YET IMPLEMENTED\n" );
513 printf(
"p_read_from_interface(): could not bind return value\n" );
526 if ( fit == (*it)->fields_end() )
528 printf(
"p_read_from_interface(): interface %s has no field %s\n",
529 interface_id, field );
540 printf(
"p_read_from_interface(): no interface with id %s found\n",
550 p_write_to_interface()
555 if ( EC_succeed != EC_arg( 1 ).is_string( &interface_id ) )
557 printf(
"p_write_to_interface(): no interface id given\n" );
561 if ( EC_succeed != EC_arg( 2 ).is_string( &field ) )
563 printf(
"p_write_to_interface(): no field given\n" );
567 vector< Interface* >::iterator it;
572 if ( 0 == strcmp( interface_id, (*it)->id() ) )
574 if ( !(*it)->is_writer() )
576 printf(
"p_write_to_interface(): not a writer\n" );
581 for ( fit = (*it)->fields();
582 fit != (*it)->fields_end();
585 if ( 0 == strcmp( field, fit.
get_name() ) )
591 if ( EC_succeed != EC_arg( 3 ).is_atom( &val ) )
593 printf(
"p_write_to_interface(): no value_given\n" );
597 if ( 0 == strcmp(
"true", val.name() ) )
599 else if ( 0 == strcmp(
"false", val.name() ) )
603 printf(
"p_write_to_interface(): boolean value neither true nor false\n" );
613 if ( EC_succeed != EC_arg( 3 ).is_long( &val ) )
615 printf(
"p_write_to_interface(): no value given\n" );
627 if ( EC_succeed != EC_arg( 3 ).is_long( &val ) )
629 printf(
"p_write_to_interface(): no value given\n" );
641 if ( EC_succeed != EC_arg( 3 ).is_long( &val ) )
643 printf(
"p_write_to_interface(): no value given\n" );
655 if ( EC_succeed != EC_arg( 3 ).is_long( &val ) )
657 printf(
"p_write_to_interface(): no value given\n" );
669 if ( EC_succeed != EC_arg( 3 ).is_long( &val ) )
671 printf(
"p_write_to_interface(): no value given\n" );
683 if ( EC_succeed != EC_arg( 3 ).is_long( &val ) )
685 printf(
"p_write_to_interface(): no value given\n" );
697 if ( EC_succeed != EC_arg( 3 ).is_long( &val ) )
699 printf(
"p_write_to_interface(): no value given\n" );
711 if ( EC_succeed != EC_arg( 3 ).is_long( &val ) )
713 printf(
"p_write_to_interface(): no value given\n" );
725 if ( EC_succeed != EC_arg( 3 ).is_double( &val ) )
727 printf(
"p_write_to_interface(): no value given\n" );
739 if ( EC_succeed != EC_arg( 3 ).is_string( &val ) )
741 printf(
"p_write_to_interface(): no value given\n" );
752 printf(
"p_write_to_interface(): NOT YET IMPLEMENTET\n" );
764 if ( fit == (*it)->fields_end() )
766 printf(
"p_write_to_interface(): interface %s has no field %s\n",
767 interface_id, field );
778 printf(
"p_write_to_interface(): no interface with id %s found\n",
795 if ( EC_succeed != EC_arg( 1 ).is_string( &interface_id ) )
797 printf(
"p_send_message(): no interface id given\n" );
801 if ( EC_succeed != EC_arg( 2 ).is_string( &message_type ) )
803 printf(
"p_send_message(): no message type given\n" );
807 vector< Interface* >::iterator it;
812 if ( 0 == strcmp( interface_id, (*it)->id() ) )
814 if ( (*it)->is_writer() )
816 printf(
"p_send_message(): interface with id %s is a writer\n", interface_id );
822 Message* msg = (*it)->create_message( message_type );
826 if ( EC_succeed == EC_arg( 3 ).is_list( head, tail ) )
828 if ( !process_message_args(msg, ::list(head, tail)) )
834 (*it)->msgq_enqueue( msg );
848 printf(
"p_send_message(): no interface with name %s\n", interface_id );
861 if ( EC_succeed != EC_arg( 1 ).is_string( &interface_id ) )
863 printf(
"p_recv_messages(): no interface id given\n" );
867 vector< Interface* >::iterator it;
873 if ( 0 == strcmp( interface_id, (*it)->id() ) )
875 EC_word msg_list = nil();
877 while ( !(*it)->msgq_empty() )
879 Message* msg = (*it)->msgq_first();
882 EC_word args = nil();
893 { value = EC_atom( (
char*)
"true" ); }
895 { value = EC_atom( (
char*)
"false" ); }
900 value = EC_word( (
long) fit.
get_int8() );
904 value = EC_word( (
long) fit.
get_uint8() );
908 value = EC_word( (
long) fit.
get_int16() );
916 value = EC_word( (
long) fit.
get_int32() );
924 value = EC_word( (
long) fit.
get_int64() );
932 value = EC_word( (
double) fit.
get_float() );
941 printf(
"p_recv_messages(): NOT YET IMPLEMENTED\n" );
945 printf(
"p_recv_messages(): unknown field type\n" );
948 EC_word field = ::list( EC_word( fit.
get_name() ),
949 ::list( value, nil() ) );
950 args = ::list(field, args);
954 msg_list = ::list( ::list( EC_word( msg->
type() ),
955 ::list(args, nil() ) ),
961 if ( EC_succeed != EC_arg( 2 ).unify( msg_list ) )
963 printf(
"p_recv_messages(): could not bind return value\n" );
973 printf(
"p_recv_messages(): no interface with id %s found\n", interface_id );
982 process_message_args(
Message* msg, EC_word arg_list)
987 for ( ; EC_succeed == arg_list.is_list(head, tail) ; arg_list = tail )
995 if ( EC_succeed != head.is_list( field, t1 ) ||
996 EC_succeed != t1.is_list( value, t2 ) )
998 printf(
"p_send_messge(): could not parse argument list\n" );
1003 if ( EC_succeed != field.is_string( &field_name ) )
1005 printf(
"p_send_message(): malformed argument list\n" );
1010 for ( fit = msg->
fields();
1014 if ( 0 == strcmp( fit.
get_name(), field_name ) )
1021 if ( EC_succeed != value.is_atom( &val ) )
1023 printf(
"p_send_message(): no value_given (bool)\n" );
1027 if ( 0 == strcmp(
"true", val.name() ) )
1029 else if ( 0 == strcmp(
"false", val.name() ) )
1033 printf(
"p_send_message(): boolean value neither true nor false\n" );
1043 if ( EC_succeed != value.is_long( &val ) )
1045 printf(
"p_send_message(): no value given (int8)\n" );
1057 if ( EC_succeed != value.is_long( &val ) )
1059 printf(
"p_send_message(): no value given (uint8)\n" );
1071 if ( EC_succeed != value.is_long( &val ) )
1073 printf(
"p_send_message(): no value given (int16)\n" );
1085 if ( EC_succeed != value.is_long( &val ) )
1087 printf(
"p_send_message(): no value given (uint16)\n" );
1099 if ( EC_succeed != value.is_long( &val ) )
1101 printf(
"p_send_message(): no value given (int32)\n" );
1113 if ( EC_succeed != value.is_long( &val ) )
1115 printf(
"p_send_message(): no value given (uint32)\n" );
1127 if ( EC_succeed != value.is_long( &val ) )
1129 printf(
"p_send_message(): no value given (int64)\n" );
1141 if ( EC_succeed != value.is_long( &val ) )
1143 printf(
"p_send_message(): no value given (uint64)\n" );
1155 if ( EC_succeed != value.is_double( &val ) )
1157 printf(
"p_send_message(): no value given (float)\n" );
1169 if ( EC_succeed != value.is_string( &val ) )
1171 printf(
"p_send_message(): no value given (string)\n" );
1182 printf(
"p_send_message(): NOT YET IMPLEMENTET\n" );
1195 printf(
"p_send_message(): message has no field with name %s\n",