24 #include "laser_drawing_area.h"
26 #include <netcomm/fawkes/client.h>
27 #include <blackboard/remote.h>
28 #include <interfaces/Laser360Interface.h>
29 #include <interfaces/Laser720Interface.h>
31 #include <interfaces/ObjectPositionInterface.h>
32 #include <interfaces/Position2DTrackInterface.h>
33 #include <interfaces/SwitchInterface.h>
34 #include <interfaces/VisualDisplay2DInterface.h>
37 #include <gui_utils/service_chooser_dialog.h>
38 #include <gui_utils/multi_interface_chooser_dialog.h>
39 #include <gui_utils/interface_dispatcher.h>
40 #include <gui_utils/connection_dispatcher.h>
41 #include <gui_utils/robot/allemaniacs_athome.h>
43 #include <gtkmm/main.h>
48 #include <utils/misc/string_conversions.h>
51 #define MAX_OBJECTPOSITIONINTERFACES_PERSONS 10
52 #define MAX_OBJECTPOSITIONINTERFACES_LEGS 15
53 #define MAX_OBJECTPOSITIONINTERFACES_MISC 20
54 #define MAX_TRACKINTERFACES 10
56 using namespace fawkes;
84 const Glib::RefPtr<Gtk::Builder> &builder)
85 : Gtk::Window(cobject), __athome_drawer(true)
87 __laser_if_names.push_back(std::make_pair(
"Laser360Interface",
"Laser"));
89 builder->get_widget_derived(
"da_laser", __area);
90 builder->get_widget(
"tb_connection", __tb_connection);
91 builder->get_widget(
"tb_select", __tb_select);
92 builder->get_widget(
"tb_lines", __tb_lines);
93 builder->get_widget(
"tb_points", __tb_points);
94 builder->get_widget(
"tb_hull", __tb_hull);
95 builder->get_widget(
"tb_trimvals", __tb_trimvals);
96 builder->get_widget(
"tb_rotation", __tb_rotation);
97 builder->get_widget(
"tb_legtracker", __tb_legtracker);
98 builder->get_widget(
"tb_stop", __tb_stop);
99 builder->get_widget(
"tb_zoom_in", __tb_zoom_in);
100 builder->get_widget(
"tb_zoom_out", __tb_zoom_out);
101 builder->get_widget(
"tb_exit", __tb_exit);
102 builder->get_widget(
"dlg_ltopen", __dlg_ltopen);
103 builder->get_widget(
"pgb_ltopen", __pgb_ltopen);
105 __area->set_robot_drawer(&__athome_drawer);
107 __tb_select->set_sensitive(
false);
108 __tb_lines->set_sensitive(
false);
109 __tb_points->set_sensitive(
false);
110 __tb_hull->set_sensitive(
false);
111 __tb_trimvals->set_sensitive(
false);
112 __tb_rotation->set_sensitive(
false);
113 __tb_legtracker->set_sensitive(
false);
114 __tb_stop->set_sensitive(
false);
115 __tb_zoom_in->set_sensitive(
false);
116 __tb_zoom_out->set_sensitive(
false);
141 if ( ! __connection_dispatcher.get_client()->connected() ) {
145 __connection_dispatcher.get_client()->disconnect();
153 if ( ! __connection_dispatcher.get_client()->connected() ) {
154 Gtk::MessageDialog md(*
this,
155 "Cannot get list of interfaces if not connected.",
157 Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK,
159 md.set_title(
"Interface Selection Failed");
162 std::auto_ptr<MultiInterfaceChooserDialog> ifcd(
170 open_interfaces(interfaces);
183 __area->reset_laser_ifs();
184 for (InterfaceDispatcherPairList::const_iterator it = __laser_ifs.begin();
185 it != __laser_ifs.end(); ++it) {
186 __bb->unregister_listener(it->second);
188 __bb->close(it->first);
191 __laser_if_names = types_and_ids;
194 for (TypeIdPairList::const_iterator it = types_and_ids.begin();
195 it != types_and_ids.end(); ++it)
197 const Glib::ustring& type = it->first;
198 const Glib::ustring&
id = it->second;
201 if (type ==
"Laser720Interface") {
203 }
else if (type ==
"Laser360Interface") {
206 throw Exception(
"Invalid interface type %s", type.c_str());
209 std::string msg = std::string(
"Failed to open interface: ") + e.
what();
210 Gtk::MessageDialog md(*
this, msg,
false,
211 Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK,
213 md.set_title(
"Opening Interface Failed");
219 sigc::hide(sigc::mem_fun(*__area, &LaserDrawingArea::queue_draw)));
223 std::string msg = std::string(
"Failed to register interface dispatcher: ") + e.
what();
224 Gtk::MessageDialog md(*
this, msg,
false,
225 Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK,
227 md.set_title(
"Registrating Interface Dispatcher Failed");
234 __laser_ifs.push_back(p);
238 std::list<Interface*> keys;
239 for (InterfaceDispatcherPairList::const_iterator it = __laser_ifs.begin();
240 it != __laser_ifs.end(); ++it)
242 keys.push_back(it->first);
244 __area->set_laser_ifs(keys);
253 __l_objpos_if_persons = NULL;
254 __l_objpos_if_legs = NULL;
255 __l_objpos_if_misc = NULL;
257 __laser_segmentation_if = NULL;
265 __area->set_connected(
true);
266 open_interfaces(__laser_if_names);
269 __area->set_line_if(__line_if);
272 __area->set_visdisp_if(__visdis_if);
279 on_legtracker_toggled();
281 __area->queue_draw();
283 __tb_connection->set_stock_id(Gtk::Stock::DISCONNECT);
284 __tb_select->set_sensitive(
true);
285 __tb_lines->set_sensitive(
true);
286 __tb_points->set_sensitive(
true);
287 __tb_hull->set_sensitive(
true);
288 __tb_trimvals->set_sensitive(
true);
289 __tb_rotation->set_sensitive(
true);
290 __tb_legtracker->set_sensitive(
true);
291 __tb_stop->set_sensitive(
true);
292 __tb_zoom_in->set_sensitive(
true);
293 __tb_zoom_out->set_sensitive(
true);
295 __area->reset_laser_ifs();
296 __area->set_line_if(NULL);
297 __area->set_visdisp_if(NULL);
298 __area->queue_draw();
299 __area->set_connected(
false);
301 __area->reset_laser_ifs();
302 for (InterfaceDispatcherPairList::const_iterator it = __laser_ifs.begin();
303 it != __laser_ifs.end(); ++it) {
304 __bb->unregister_listener(it->second);
306 __bb->close(it->first);
308 __bb->close(__line_if);
309 __bb->close(__visdis_if);
322 __area->set_connected(
false);
323 __area->reset_laser_ifs();
324 __area->set_line_if(NULL);
325 __area->set_visdisp_if(NULL);
326 __area->queue_draw();
327 for (InterfaceDispatcherPairList::const_iterator it = __laser_ifs.begin();
328 it != __laser_ifs.end(); ++it) {
329 __bb->unregister_listener(it->second);
331 __bb->close(it->first);
334 if(__laser_segmentation_if)
335 __bb->close(__laser_segmentation_if);
337 __bb->close(__switch_if);
339 __bb->close(__target_if);
340 __bb->close(__line_if);
341 __bb->close(__visdis_if);
343 std::list<ObjectPositionInterface*>::iterator objpos_if_itt;
344 std::list<Position2DTrackInterface*>::iterator track_if_itt;
345 if(__l_objpos_if_persons){
346 for( objpos_if_itt = __l_objpos_if_persons->begin(); objpos_if_itt != __l_objpos_if_persons->end(); objpos_if_itt++ ) {
347 __bb->close(*objpos_if_itt);
349 __l_objpos_if_persons->clear();
351 if(__l_objpos_if_legs){
352 for( objpos_if_itt = __l_objpos_if_legs->begin(); objpos_if_itt != __l_objpos_if_legs->end(); objpos_if_itt++ ) {
353 __bb->close(*objpos_if_itt);
355 __l_objpos_if_legs->clear();
357 if(__l_objpos_if_misc){
358 for( objpos_if_itt = __l_objpos_if_misc->begin(); objpos_if_itt != __l_objpos_if_misc->end(); objpos_if_itt++ ) {
359 __bb->close(*objpos_if_itt);
361 __l_objpos_if_misc->clear();
364 for( track_if_itt = __l_track_if->begin(); track_if_itt != __l_track_if->end(); track_if_itt++ ) {
365 __bb->close(*track_if_itt);
367 __l_track_if->clear();
375 __l_objpos_if_persons = NULL;
376 __l_objpos_if_legs = NULL;
377 __l_objpos_if_misc = NULL;
379 __laser_segmentation_if = NULL;
385 __tb_connection->set_stock_id(Gtk::Stock::CONNECT);
386 __tb_select->set_sensitive(
false);
387 __tb_lines->set_sensitive(
false);
388 __tb_points->set_sensitive(
false);
389 __tb_hull->set_sensitive(
false);
390 __tb_trimvals->set_sensitive(
false);
391 __tb_rotation->set_sensitive(
false);
392 __tb_legtracker->set_sensitive(
false);
393 __tb_stop->set_sensitive(
false);
394 __tb_zoom_in->set_sensitive(
false);
395 __tb_zoom_out->set_sensitive(
false);
402 if ( __tb_rotation->get_active() ) {
403 __area->set_rotation(M_PI / 2);
405 __area->set_rotation(0);
413 __area->toggle_break_drawing();
421 if (!__tb_legtracker->get_active()) {
422 __bb->close(__laser_segmentation_if);
423 __bb->close(__switch_if);
424 __bb->close(__target_if);
426 std::list<ObjectPositionInterface*>::iterator objpos_if_itt;
427 std::list<Position2DTrackInterface*>::iterator track_if_itt;
428 if (__l_objpos_if_persons) {
429 for( objpos_if_itt = __l_objpos_if_persons->begin(); objpos_if_itt != __l_objpos_if_persons->end(); objpos_if_itt++ ) {
430 __bb->close(*objpos_if_itt);
432 __l_objpos_if_persons->clear();
434 if (__l_objpos_if_legs) {
435 for( objpos_if_itt = __l_objpos_if_legs->begin(); objpos_if_itt != __l_objpos_if_legs->end(); objpos_if_itt++ ) {
436 __bb->close(*objpos_if_itt);
438 __l_objpos_if_legs->clear();
440 if (__l_objpos_if_misc) {
441 for( objpos_if_itt = __l_objpos_if_misc->begin(); objpos_if_itt != __l_objpos_if_misc->end(); objpos_if_itt++ ) {
442 __bb->close(*objpos_if_itt);
444 __l_objpos_if_misc->clear();
448 for( track_if_itt = __l_track_if->begin(); track_if_itt != __l_track_if->end(); track_if_itt++ ) {
449 __bb->close(*track_if_itt);
451 __l_track_if->clear();
454 __laser_segmentation_if = NULL;
457 __l_objpos_if_persons = NULL;
458 __l_objpos_if_legs = NULL;
459 __l_objpos_if_misc = NULL;
462 __area->set_objpos_if(__l_objpos_if_persons,__l_objpos_if_legs,__l_objpos_if_misc,__laser_segmentation_if, __l_track_if, __target_if,__switch_if);
465 unsigned int num_opens = 3
466 + MAX_OBJECTPOSITIONINTERFACES_PERSONS
467 + MAX_OBJECTPOSITIONINTERFACES_LEGS
468 + MAX_OBJECTPOSITIONINTERFACES_MISC
469 + MAX_TRACKINTERFACES;
471 float step_fraction = 1.0 / num_opens;
472 unsigned int opened = 0;
473 __pgb_ltopen->set_fraction(0);
474 __dlg_ltopen->show();
475 __area->queue_draw();
477 __laser_segmentation_if = __bb->open_for_reading<
Laser720Interface>(
"SegmentsLaser");
478 __pgb_ltopen->set_fraction(++opened * step_fraction);
479 while (Gtk::Main::events_pending()) Gtk::Main::iteration();
484 __l_objpos_if_persons =
new std::list<ObjectPositionInterface*>();
485 __l_objpos_if_legs =
new std::list<ObjectPositionInterface*>();
486 __l_objpos_if_misc =
new std::list<ObjectPositionInterface*>();
487 __l_track_if =
new std::list<Position2DTrackInterface*>();
488 for (
int i=1; i <= MAX_OBJECTPOSITIONINTERFACES_PERSONS; ++i){
490 __l_objpos_if_persons->push_back(new_objpos_if);
491 __pgb_ltopen->set_fraction(++opened * step_fraction);
492 while (Gtk::Main::events_pending()) Gtk::Main::iteration();
494 for (
int i=1; i <= MAX_OBJECTPOSITIONINTERFACES_LEGS; ++i){
496 __l_objpos_if_legs->push_back(new_objpos_if);
497 __pgb_ltopen->set_fraction(++opened * step_fraction);
498 while (Gtk::Main::events_pending()) Gtk::Main::iteration();
500 for (
int i=1; i <= MAX_OBJECTPOSITIONINTERFACES_MISC; ++i){
502 __l_objpos_if_misc->push_back(new_objpos_if);
503 __pgb_ltopen->set_fraction(++opened * step_fraction);
504 while (Gtk::Main::events_pending()) Gtk::Main::iteration();
507 for (
int i=1; i <= MAX_TRACKINTERFACES; ++i){
509 __l_track_if->push_back( new_track_if );
510 __pgb_ltopen->set_fraction(++opened * step_fraction);
511 while (Gtk::Main::events_pending()) Gtk::Main::iteration();
514 __switch_if = __bb->open_for_reading<
SwitchInterface>(
"legtracker write!");
515 __pgb_ltopen->set_fraction(++opened * step_fraction);
516 while (Gtk::Main::events_pending()) Gtk::Main::iteration();
517 __dlg_ltopen->hide();
518 __area->set_objpos_if(__l_objpos_if_persons, __l_objpos_if_legs,
519 __l_objpos_if_misc,__laser_segmentation_if,
520 __l_track_if, __target_if,__switch_if);
521 __area->queue_draw();
529 if ( __tb_trimvals->get_active() ) {
530 __area->set_resolution(3);
532 __area->set_resolution(1);
544 InterfaceDispatcherPairList __laser_ifs;
549 std::list<ObjectPositionInterface*>* __l_objpos_if_persons;
550 std::list<ObjectPositionInterface*>* __l_objpos_if_legs;
551 std::list<ObjectPositionInterface*>* __l_objpos_if_misc;
552 std::list<Position2DTrackInterface*>* __l_track_if;
561 Gtk::ToolButton *__tb_connection;
562 Gtk::RadioToolButton *__tb_lines;
563 Gtk::RadioToolButton *__tb_points;
564 Gtk::RadioToolButton *__tb_hull;
565 Gtk::ToggleToolButton *__tb_trimvals;
566 Gtk::ToggleToolButton *__tb_rotation;
567 Gtk::ToggleToolButton *__tb_legtracker;
568 Gtk::ToggleToolButton *__tb_stop;
569 Gtk::ToolButton *__tb_zoom_in;
570 Gtk::ToolButton *__tb_zoom_out;
571 Gtk::ToolButton *__tb_exit;
572 Gtk::ToolButton *__tb_select;
574 Gtk::Dialog *__dlg_ltopen;
575 Gtk::ProgressBar *__pgb_ltopen;
577 TypeIdPairList __laser_if_names;
581 main(
int argc,
char** argv)
583 Gtk::Main kit(argc, argv);
585 Glib::RefPtr<Gtk::Builder> builder;
586 builder = Gtk::Builder::create_from_file(RESDIR
"/guis/lasergui/lasergui.ui");
589 builder->get_widget_derived(
"wnd_lasergui", window);
591 Gtk::Main::run(*window);
Laser360Interface Fawkes BlackBoard Interface.
virtual void on_select_clicked()
Event handler for connection button.
Only draw beam end points.
ObjectPositionInterface Fawkes BlackBoard Interface.
std::list< TypeIdPair > TypeIdPairList
List of type and ID of an interface.
virtual void on_disconnect()
Event handler for disconnected event.
void open_interfaces(const TypeIdPairList &types_and_ids)
Open interfaces.
void on_legtracker_toggled()
Event handler for legtracker button.
virtual void on_connection_clicked()
Event handler for connection button.
MultiInterfaceChooserDialog::TypeIdPair TypeIdPair
Shorthand for pair of interface type and ID.
Base class for all Fawkes BlackBoard interfaces.
Laser GUI window for Gtkmm.
void on_stop_toggled()
Event handler for stop button.
void set_draw_mode(draw_mode_t mode)
Set the drawing mode.
SwitchInterface Fawkes BlackBoard Interface.
virtual const char * what() const
Get primary string.
Base class for exceptions in Fawkes.
void run_and_connect()
Run dialog and try to connect.
std::pair< Glib::ustring, Glib::ustring > TypeIdPair
Pair of type and IDs of interfaces.
std::list< InterfaceDispatcherPair > InterfaceDispatcherPairList
A list of interfaces and their respective dispatchers.
void on_trimvals_toggled()
Event handler for trim button.
virtual void on_connect()
Event handler for connected event.
fawkes::Interface Interface
Typedef of fawkes::Interface to override Glib::Interface.
TypeIdPairList get_selected_interfaces() const
Get selected interface types and their respective IDs.
LaserGuiGtkWindow(BaseObjectType *cobject, const Glib::RefPtr< Gtk::Builder > &builder)
Constructor for Gtk::Builder.
static MultiInterfaceChooserDialog * create(Gtk::Window &parent, BlackBoard *blackboard, const char *type_pattern, const char *id_pattern, const TypeIdPairList &loaded_interfaces, const Glib::ustring &title=DEFAULT_TITLE)
Factory method.
The BlackBoard abstract class.
std::pair< Interface *, InterfaceDispatcher * > InterfaceDispatcherPair
For each interface, an interface dispatcher is opened that listens for data changes.
MultiInterfaceChooserDialog::TypeIdPairList TypeIdPairList
Shorthand for set of pairs of interface type and ID.
Watches network client events and dispatches them as signals.
void on_rotation_toggled()
Event handler for rotation button.
VisualDisplay2DInterface Fawkes BlackBoard Interface.
Draw AllemaniACs AtHome robot.
static std::string to_string(unsigned int i)
Convert unsigned int value to a string.
Interface listener with dispatcher.
Laser720Interface Fawkes BlackBoard Interface.
void on_exit_clicked()
Event handler for exit button.
Position2DTrackInterface Fawkes BlackBoard Interface.
sigc::signal< void, Interface * > signal_data_changed()
Get "data changed" signal.