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> 30 #include <interfaces/Laser1080Interface.h> 32 #include <interfaces/ObjectPositionInterface.h> 33 #include <interfaces/Position2DTrackInterface.h> 34 #include <interfaces/SwitchInterface.h> 35 #include <interfaces/VisualDisplay2DInterface.h> 38 #include <gui_utils/service_chooser_dialog.h> 39 #include <gui_utils/multi_interface_chooser_dialog.h> 40 #include <gui_utils/interface_dispatcher.h> 41 #include <gui_utils/connection_dispatcher.h> 42 #include <gui_utils/robot/allemaniacs_athome.h> 44 #include <gtkmm/main.h> 49 #include <utils/misc/string_conversions.h> 52 #define MAX_OBJECTPOSITIONINTERFACES_PERSONS 10 53 #define MAX_OBJECTPOSITIONINTERFACES_LEGS 15 54 #define MAX_OBJECTPOSITIONINTERFACES_MISC 20 55 #define MAX_TRACKINTERFACES 10 85 const Glib::RefPtr<Gtk::Builder> &builder)
86 : Gtk::Window(cobject), __athome_drawer(true)
88 __laser_if_names.push_back(std::make_pair(
"Laser360Interface",
"Laser"));
90 builder->get_widget_derived(
"da_laser", __area);
91 builder->get_widget(
"tb_connection", __tb_connection);
92 builder->get_widget(
"tb_select", __tb_select);
93 builder->get_widget(
"tb_lines", __tb_lines);
94 builder->get_widget(
"tb_points", __tb_points);
95 builder->get_widget(
"tb_hull", __tb_hull);
96 builder->get_widget(
"tb_trimvals", __tb_trimvals);
97 builder->get_widget(
"tb_rotation", __tb_rotation);
98 builder->get_widget(
"tb_legtracker", __tb_legtracker);
99 builder->get_widget(
"tb_stop", __tb_stop);
100 builder->get_widget(
"tb_zoom_in", __tb_zoom_in);
101 builder->get_widget(
"tb_zoom_out", __tb_zoom_out);
102 builder->get_widget(
"tb_exit", __tb_exit);
103 builder->get_widget(
"dlg_ltopen", __dlg_ltopen);
104 builder->get_widget(
"pgb_ltopen", __pgb_ltopen);
106 __area->set_robot_drawer(&__athome_drawer);
108 __tb_select->set_sensitive(
false);
109 __tb_lines->set_sensitive(
false);
110 __tb_points->set_sensitive(
false);
111 __tb_hull->set_sensitive(
false);
112 __tb_trimvals->set_sensitive(
false);
113 __tb_rotation->set_sensitive(
false);
114 __tb_legtracker->set_sensitive(
false);
115 __tb_stop->set_sensitive(
false);
116 __tb_zoom_in->set_sensitive(
false);
117 __tb_zoom_out->set_sensitive(
false);
142 if ( ! __connection_dispatcher.get_client()->connected() ) {
146 __connection_dispatcher.get_client()->disconnect();
154 if ( ! __connection_dispatcher.get_client()->connected() ) {
155 Gtk::MessageDialog md(*
this,
156 "Cannot get list of interfaces if not connected.",
158 Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK,
160 md.set_title(
"Interface Selection Failed");
163 #if __cplusplus >= 201103L 164 std::unique_ptr<MultiInterfaceChooserDialog> ifcd(
166 std::auto_ptr<MultiInterfaceChooserDialog> ifcd(
174 const TypeIdPairList interfaces = ifcd->get_selected_interfaces();
175 open_interfaces(interfaces);
188 __area->reset_laser_ifs();
189 for (InterfaceDispatcherPairList::const_iterator it = __laser_ifs.begin();
190 it != __laser_ifs.end(); ++it) {
191 __bb->unregister_listener(it->second);
193 __bb->close(it->first);
196 __laser_if_names = types_and_ids;
199 for (TypeIdPairList::const_iterator it = types_and_ids.begin();
200 it != types_and_ids.end(); ++it)
202 const Glib::ustring& type = it->first;
203 const Glib::ustring&
id = it->second;
204 Interface* itf = NULL;
206 if (type ==
"Laser1080Interface") {
208 }
else if (type ==
"Laser720Interface") {
210 }
else if (type ==
"Laser360Interface") {
213 throw Exception(
"Invalid interface type %s", type.c_str());
216 std::string msg = std::string(
"Failed to open interface: ") + e.
what();
217 Gtk::MessageDialog md(*
this, msg,
false,
218 Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK,
220 md.set_title(
"Opening Interface Failed");
226 sigc::hide(sigc::mem_fun(*__area, &LaserDrawingArea::queue_draw)));
230 std::string msg = std::string(
"Failed to register interface dispatcher: ") + e.
what();
231 Gtk::MessageDialog md(*
this, msg,
false,
232 Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK,
234 md.set_title(
"Registrating Interface Dispatcher Failed");
240 const InterfaceDispatcherPair p = std::make_pair(itf, itfd);
241 __laser_ifs.push_back(p);
245 std::list<Interface*> keys;
246 for (InterfaceDispatcherPairList::const_iterator it = __laser_ifs.begin();
247 it != __laser_ifs.end(); ++it)
249 keys.push_back(it->first);
251 __area->set_laser_ifs(keys);
260 __l_objpos_if_persons = NULL;
261 __l_objpos_if_legs = NULL;
262 __l_objpos_if_misc = NULL;
264 __laser_segmentation_if = NULL;
272 __area->set_connected(
true);
273 open_interfaces(__laser_if_names);
276 __area->set_line_if(__line_if);
279 __area->set_visdisp_if(__visdis_if);
286 on_legtracker_toggled();
288 __area->queue_draw();
290 __tb_connection->set_stock_id(Gtk::Stock::DISCONNECT);
291 __tb_select->set_sensitive(
true);
292 __tb_lines->set_sensitive(
true);
293 __tb_points->set_sensitive(
true);
294 __tb_hull->set_sensitive(
true);
295 __tb_trimvals->set_sensitive(
true);
296 __tb_rotation->set_sensitive(
true);
297 __tb_legtracker->set_sensitive(
true);
298 __tb_stop->set_sensitive(
true);
299 __tb_zoom_in->set_sensitive(
true);
300 __tb_zoom_out->set_sensitive(
true);
302 __area->reset_laser_ifs();
303 __area->set_line_if(NULL);
304 __area->set_visdisp_if(NULL);
305 __area->queue_draw();
306 __area->set_connected(
false);
308 __area->reset_laser_ifs();
309 for (InterfaceDispatcherPairList::const_iterator it = __laser_ifs.begin();
310 it != __laser_ifs.end(); ++it) {
311 __bb->unregister_listener(it->second);
313 __bb->close(it->first);
315 __bb->close(__line_if);
316 __bb->close(__visdis_if);
329 __area->set_connected(
false);
330 __area->reset_laser_ifs();
331 __area->set_line_if(NULL);
332 __area->set_visdisp_if(NULL);
333 __area->queue_draw();
334 for (InterfaceDispatcherPairList::const_iterator it = __laser_ifs.begin();
335 it != __laser_ifs.end(); ++it) {
336 __bb->unregister_listener(it->second);
338 __bb->close(it->first);
341 if(__laser_segmentation_if)
342 __bb->close(__laser_segmentation_if);
344 __bb->close(__switch_if);
346 __bb->close(__target_if);
347 __bb->close(__line_if);
348 __bb->close(__visdis_if);
350 std::list<ObjectPositionInterface*>::iterator objpos_if_itt;
351 std::list<Position2DTrackInterface*>::iterator track_if_itt;
352 if(__l_objpos_if_persons){
353 for( objpos_if_itt = __l_objpos_if_persons->begin(); objpos_if_itt != __l_objpos_if_persons->end(); objpos_if_itt++ ) {
354 __bb->close(*objpos_if_itt);
356 __l_objpos_if_persons->clear();
358 if(__l_objpos_if_legs){
359 for( objpos_if_itt = __l_objpos_if_legs->begin(); objpos_if_itt != __l_objpos_if_legs->end(); objpos_if_itt++ ) {
360 __bb->close(*objpos_if_itt);
362 __l_objpos_if_legs->clear();
364 if(__l_objpos_if_misc){
365 for( objpos_if_itt = __l_objpos_if_misc->begin(); objpos_if_itt != __l_objpos_if_misc->end(); objpos_if_itt++ ) {
366 __bb->close(*objpos_if_itt);
368 __l_objpos_if_misc->clear();
371 for( track_if_itt = __l_track_if->begin(); track_if_itt != __l_track_if->end(); track_if_itt++ ) {
372 __bb->close(*track_if_itt);
374 __l_track_if->clear();
382 __l_objpos_if_persons = NULL;
383 __l_objpos_if_legs = NULL;
384 __l_objpos_if_misc = NULL;
386 __laser_segmentation_if = NULL;
392 __tb_connection->set_stock_id(Gtk::Stock::CONNECT);
393 __tb_select->set_sensitive(
false);
394 __tb_lines->set_sensitive(
false);
395 __tb_points->set_sensitive(
false);
396 __tb_hull->set_sensitive(
false);
397 __tb_trimvals->set_sensitive(
false);
398 __tb_rotation->set_sensitive(
false);
399 __tb_legtracker->set_sensitive(
false);
400 __tb_stop->set_sensitive(
false);
401 __tb_zoom_in->set_sensitive(
false);
402 __tb_zoom_out->set_sensitive(
false);
409 if ( __tb_rotation->get_active() ) {
410 __area->set_rotation(M_PI / 2);
412 __area->set_rotation(0);
420 __area->toggle_break_drawing();
428 if (!__tb_legtracker->get_active()) {
429 __bb->close(__laser_segmentation_if);
430 __bb->close(__switch_if);
431 __bb->close(__target_if);
433 std::list<ObjectPositionInterface*>::iterator objpos_if_itt;
434 std::list<Position2DTrackInterface*>::iterator track_if_itt;
435 if (__l_objpos_if_persons) {
436 for( objpos_if_itt = __l_objpos_if_persons->begin(); objpos_if_itt != __l_objpos_if_persons->end(); objpos_if_itt++ ) {
437 __bb->close(*objpos_if_itt);
439 __l_objpos_if_persons->clear();
441 if (__l_objpos_if_legs) {
442 for( objpos_if_itt = __l_objpos_if_legs->begin(); objpos_if_itt != __l_objpos_if_legs->end(); objpos_if_itt++ ) {
443 __bb->close(*objpos_if_itt);
445 __l_objpos_if_legs->clear();
447 if (__l_objpos_if_misc) {
448 for( objpos_if_itt = __l_objpos_if_misc->begin(); objpos_if_itt != __l_objpos_if_misc->end(); objpos_if_itt++ ) {
449 __bb->close(*objpos_if_itt);
451 __l_objpos_if_misc->clear();
455 for( track_if_itt = __l_track_if->begin(); track_if_itt != __l_track_if->end(); track_if_itt++ ) {
456 __bb->close(*track_if_itt);
458 __l_track_if->clear();
461 __laser_segmentation_if = NULL;
464 __l_objpos_if_persons = NULL;
465 __l_objpos_if_legs = NULL;
466 __l_objpos_if_misc = NULL;
469 __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);
472 unsigned int num_opens = 3
473 + MAX_OBJECTPOSITIONINTERFACES_PERSONS
474 + MAX_OBJECTPOSITIONINTERFACES_LEGS
475 + MAX_OBJECTPOSITIONINTERFACES_MISC
476 + MAX_TRACKINTERFACES;
478 float step_fraction = 1.0 / num_opens;
479 unsigned int opened = 0;
480 __pgb_ltopen->set_fraction(0);
481 __dlg_ltopen->show();
482 __area->queue_draw();
484 __laser_segmentation_if = __bb->open_for_reading<
Laser720Interface>(
"SegmentsLaser");
485 __pgb_ltopen->set_fraction(++opened * step_fraction);
486 while (Gtk::Main::events_pending()) Gtk::Main::iteration();
491 __l_objpos_if_persons =
new std::list<ObjectPositionInterface*>();
492 __l_objpos_if_legs =
new std::list<ObjectPositionInterface*>();
493 __l_objpos_if_misc =
new std::list<ObjectPositionInterface*>();
494 __l_track_if =
new std::list<Position2DTrackInterface*>();
495 for (
int i=1; i <= MAX_OBJECTPOSITIONINTERFACES_PERSONS; ++i){
497 __l_objpos_if_persons->push_back(new_objpos_if);
498 __pgb_ltopen->set_fraction(++opened * step_fraction);
499 while (Gtk::Main::events_pending()) Gtk::Main::iteration();
501 for (
int i=1; i <= MAX_OBJECTPOSITIONINTERFACES_LEGS; ++i){
503 __l_objpos_if_legs->push_back(new_objpos_if);
504 __pgb_ltopen->set_fraction(++opened * step_fraction);
505 while (Gtk::Main::events_pending()) Gtk::Main::iteration();
507 for (
int i=1; i <= MAX_OBJECTPOSITIONINTERFACES_MISC; ++i){
509 __l_objpos_if_misc->push_back(new_objpos_if);
510 __pgb_ltopen->set_fraction(++opened * step_fraction);
511 while (Gtk::Main::events_pending()) Gtk::Main::iteration();
514 for (
int i=1; i <= MAX_TRACKINTERFACES; ++i){
516 __l_track_if->push_back( new_track_if );
517 __pgb_ltopen->set_fraction(++opened * step_fraction);
518 while (Gtk::Main::events_pending()) Gtk::Main::iteration();
521 __switch_if = __bb->open_for_reading<
SwitchInterface>(
"legtracker write!");
522 __pgb_ltopen->set_fraction(++opened * step_fraction);
523 while (Gtk::Main::events_pending()) Gtk::Main::iteration();
524 __dlg_ltopen->hide();
525 __area->set_objpos_if(__l_objpos_if_persons, __l_objpos_if_legs,
526 __l_objpos_if_misc,__laser_segmentation_if,
527 __l_track_if, __target_if,__switch_if);
528 __area->queue_draw();
536 if ( __tb_trimvals->get_active() ) {
537 __area->set_resolution(3);
539 __area->set_resolution(1);
551 InterfaceDispatcherPairList __laser_ifs;
556 std::list<ObjectPositionInterface*>* __l_objpos_if_persons;
557 std::list<ObjectPositionInterface*>* __l_objpos_if_legs;
558 std::list<ObjectPositionInterface*>* __l_objpos_if_misc;
559 std::list<Position2DTrackInterface*>* __l_track_if;
568 Gtk::ToolButton *__tb_connection;
569 Gtk::RadioToolButton *__tb_lines;
570 Gtk::RadioToolButton *__tb_points;
571 Gtk::RadioToolButton *__tb_hull;
572 Gtk::ToggleToolButton *__tb_trimvals;
573 Gtk::ToggleToolButton *__tb_rotation;
574 Gtk::ToggleToolButton *__tb_legtracker;
575 Gtk::ToggleToolButton *__tb_stop;
576 Gtk::ToolButton *__tb_zoom_in;
577 Gtk::ToolButton *__tb_zoom_out;
578 Gtk::ToolButton *__tb_exit;
579 Gtk::ToolButton *__tb_select;
581 Gtk::Dialog *__dlg_ltopen;
582 Gtk::ProgressBar *__pgb_ltopen;
584 TypeIdPairList __laser_if_names;
588 main(
int argc,
char** argv)
590 Gtk::Main kit(argc, argv);
595 Glib::RefPtr<Gtk::Builder> builder;
596 builder = Gtk::Builder::create_from_file(RESDIR
"/guis/lasergui/lasergui.ui");
599 builder->get_widget_derived(
"wnd_lasergui", window);
601 Gtk::Main::run(*window);
Laser360Interface Fawkes BlackBoard Interface.
virtual void on_select_clicked()
Event handler for connection button.
Only draw beam end points.
Laser1080Interface Fawkes BlackBoard Interface.
ObjectPositionInterface Fawkes BlackBoard Interface.
std::list< TypeIdPair > TypeIdPairList
List of type and ID of an interface.
Fawkes library namespace.
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.
virtual const char * what() const
Get primary string.
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.
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.
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.