diff --git a/dfall_ws/src/dfall_pkg/CMakeLists.txt b/dfall_ws/src/dfall_pkg/CMakeLists.txt index ee4cb694ebdb66ca49c4d56b7bdbc14d19edab09..9071a97aa946affec3fff31ca4a7954b6512d65c 100755 --- a/dfall_ws/src/dfall_pkg/CMakeLists.txt +++ b/dfall_ws/src/dfall_pkg/CMakeLists.txt @@ -57,9 +57,10 @@ find_package(Qt5Svg REQUIRED) # GUI -- Add src, includes, and resources -set(MY_GUI_LIB_PATH_SRC ${PROJECT_SOURCE_DIR}/GUI_Qt/CrazyFlyGUI/src) -set(MY_GUI_LIB_PATH_INC ${PROJECT_SOURCE_DIR}/GUI_Qt/CrazyFlyGUI/include) -set(MY_RESOURCE_FILE_QRC ${PROJECT_SOURCE_DIR}/GUI_Qt/CrazyFlyGUI/CrazyFlyGUI.qrc) +set(MY_GUI_LIB_PATH_SRC ${PROJECT_SOURCE_DIR}/GUI_Qt/CrazyFlyGUI/src) +set(MY_GUI_LIB_PATH_INC ${PROJECT_SOURCE_DIR}/GUI_Qt/CrazyFlyGUI/include) +set(MY_GUI_LIB_PATH_FORMS ${PROJECT_SOURCE_DIR}/GUI_Qt/CrazyFlyGUI/forms) +set(MY_RESOURCE_FILE_QRC ${PROJECT_SOURCE_DIR}/GUI_Qt/CrazyFlyGUI/CrazyFlyGUI.qrc) @@ -99,7 +100,7 @@ set(SRC_HDRS_QOBJECT_GUI ${MY_GUI_LIB_PATH_INC}/CFLinker.h ) # GUI -- wrap UI file and QOBJECT files -qt5_wrap_ui(UIS_HDRS_GUI ${MY_GUI_LIB_PATH_SRC}/mainguiwindow.ui) +qt5_wrap_ui(UIS_HDRS_GUI ${MY_GUI_LIB_PATH_FORMS}/mainguiwindow.ui) qt5_wrap_cpp(SRC_MOC_HDRS_GUI ${SRC_HDRS_QOBJECT_GUI}) # GUI -- wrap resource file qrc->rcc qt5_add_resources(MY_RESOURCE_FILE_RCC ${MY_RESOURCE_FILE_QRC}) diff --git a/dfall_ws/src/dfall_pkg/GUI_Qt/CrazyFlyGUI/CrazyFlyGUI.pro b/dfall_ws/src/dfall_pkg/GUI_Qt/CrazyFlyGUI/CrazyFlyGUI.pro index 1f9cbd2f3351c91ff071eb34291805de96c1d7a5..61aa744e5c1027e93fad9c516450e8eb0922d57a 100755 --- a/dfall_ws/src/dfall_pkg/GUI_Qt/CrazyFlyGUI/CrazyFlyGUI.pro +++ b/dfall_ws/src/dfall_pkg/GUI_Qt/CrazyFlyGUI/CrazyFlyGUI.pro @@ -20,6 +20,8 @@ QT+= svg SOURCES += \ + src/centerMarker.cpp \ + src/channelLUT.cpp \ src/cornergrabber.cpp \ src/crazyFlyZone.cpp \ src/crazyFlyZoneTab.cpp \ @@ -31,6 +33,8 @@ SOURCES += \ src/tablePiece.cpp HEADERS += \ + include/centerMarker.h \ + include/channelLUT.h \ include/cornergrabber.h \ include/crazyFlyZone.h \ include/crazyFlyZoneTab.h \ @@ -44,4 +48,4 @@ HEADERS += \ include/crazyFly.h FORMS += \ - src/mainguiwindow.ui + forms/mainguiwindow.ui diff --git a/dfall_ws/src/dfall_pkg/GUI_Qt/CrazyFlyGUI/src/mainguiwindow.ui b/dfall_ws/src/dfall_pkg/GUI_Qt/CrazyFlyGUI/forms/mainguiwindow.ui similarity index 100% rename from dfall_ws/src/dfall_pkg/GUI_Qt/CrazyFlyGUI/src/mainguiwindow.ui rename to dfall_ws/src/dfall_pkg/GUI_Qt/CrazyFlyGUI/forms/mainguiwindow.ui diff --git a/dfall_ws/src/dfall_pkg/GUI_Qt/CrazyFlyGUI/include/mainguiwindow.h b/dfall_ws/src/dfall_pkg/GUI_Qt/CrazyFlyGUI/include/mainguiwindow.h index d5aceaf6c46aa192527beac37e6633fe171095a6..e0f696ccec790c74bfa7b3a87acf7c446ef766c8 100755 --- a/dfall_ws/src/dfall_pkg/GUI_Qt/CrazyFlyGUI/include/mainguiwindow.h +++ b/dfall_ws/src/dfall_pkg/GUI_Qt/CrazyFlyGUI/include/mainguiwindow.h @@ -216,11 +216,12 @@ private: Ui::MainGUIWindow *ui; myGraphicsScene* scene; + void _init(); + +#ifdef CATKIN_MAKE ros::Timer m_timer_yaml_file_for_safe_controller; ros::Timer m_timer_yaml_file_for_custom_controller; - void _init(); - void safeYamlFileTimerCallback(const ros::TimerEvent&); void customYamlFileTimerCallback(const ros::TimerEvent&); @@ -232,6 +233,7 @@ private: void getParameterIntVectorWithKnownLength(ros::NodeHandle& nodeHandle, std::string name, std::vector<int>& val, int length); int getParameterIntVectorWithUnknownLength(ros::NodeHandle& nodeHandle, std::string name, std::vector<int>& val); bool getParameterBool(ros::NodeHandle& nodeHandle, std::string name); +#endif #ifdef CATKIN_MAKE @@ -271,6 +273,8 @@ private: int getTabIndexFromName(QString name); + +#ifdef CATKIN_MAKE CrazyflieDB m_data_base; void clear_database_file(); @@ -282,6 +286,7 @@ private: void save_database_file(); void insert_or_update_entry_database(CrazyflieEntry entry); +#endif }; diff --git a/dfall_ws/src/dfall_pkg/GUI_Qt/CrazyFlyGUI/src/mainguiwindow.cpp b/dfall_ws/src/dfall_pkg/GUI_Qt/CrazyFlyGUI/src/mainguiwindow.cpp index 441e11d96ade9662d9fd85da124694a3ab6f076b..1fb3cf4afd571961402a08197b511d98e990ee91 100755 --- a/dfall_ws/src/dfall_pkg/GUI_Qt/CrazyFlyGUI/src/mainguiwindow.cpp +++ b/dfall_ws/src/dfall_pkg/GUI_Qt/CrazyFlyGUI/src/mainguiwindow.cpp @@ -265,7 +265,7 @@ void MainGUIWindow::_init() QShortcut* close_GUI_shortcut = new QShortcut(QKeySequence(tr("CTRL+C")), this, SLOT(close())); - #ifdef CATKIN_MAKE +#ifdef CATKIN_MAKE _rosNodeThread->init(); qRegisterMetaType<ptrToMessage>("ptrToMessage"); QObject::connect(_rosNodeThread, SIGNAL(newViconData(const ptrToMessage&)), this, SLOT(updateNewViconData(const ptrToMessage&))); @@ -298,7 +298,7 @@ void MainGUIWindow::_init() // to all of the agents nodes that they should (re/dis)-connect from // the Crazy-Radio crazyRadioCommandAllAgentsPublisher = nodeHandle.advertise<std_msgs::Int32>("crazyRadioCommandAllAgents", 1); - #endif +#endif } void MainGUIWindow::doTabClosed(int tab_index) @@ -845,6 +845,7 @@ void MainGUIWindow::on_unlink_button_clicked() void MainGUIWindow::on_save_in_DB_button_clicked() { +#ifdef CATKIN_MAKE // we need to update and then save? CrazyflieDB tmp_db; for(int i = 0; i < cf_linker->links.size(); i++) @@ -889,8 +890,11 @@ void MainGUIWindow::on_save_in_DB_button_clicked() //std_msgs::Int32 msg; //msg.data = 1; //this->DBChangedPublisher.publish(msg); +#endif } + +#ifdef CATKIN_MAKE void MainGUIWindow::clear_database_file() { CrazyflieDB tmp_db; @@ -917,7 +921,10 @@ void MainGUIWindow::clear_database_file() ROS_INFO("Failed to read DB"); } } +#endif + +#ifdef CATKIN_MAKE void MainGUIWindow::fill_database_file() { clear_database_file(); @@ -930,7 +937,10 @@ void MainGUIWindow::fill_database_file() } save_database_file(); } +#endif + +#ifdef CATKIN_MAKE void MainGUIWindow::save_database_file() { CMCommand commandCall; @@ -944,7 +954,10 @@ void MainGUIWindow::save_database_file() ROS_ERROR("failed to save db"); } } +#endif + +#ifdef CATKIN_MAKE void MainGUIWindow::insert_or_update_entry_database(CrazyflieEntry entry) { CMUpdate updateCall; @@ -952,7 +965,10 @@ void MainGUIWindow::insert_or_update_entry_database(CrazyflieEntry entry) updateCall.request.crazyflieEntry = entry; _rosNodeThread->m_update_db_client.call(updateCall); } +#endif + +#ifdef CATKIN_MAKE int MainGUIWindow::read_database_from_file(CrazyflieDB &read_db) { CMRead getDBCall; @@ -967,9 +983,12 @@ int MainGUIWindow::read_database_from_file(CrazyflieDB &read_db) return -1; } } +#endif + void MainGUIWindow::on_load_from_DB_button_clicked() { +#ifdef CATKIN_MAKE CrazyflieDB tmp_db; if(read_database_from_file(tmp_db) == 0) @@ -1039,6 +1058,7 @@ void MainGUIWindow::on_load_from_DB_button_clicked() { ROS_ERROR("Failed to read DB"); } +#endif } void MainGUIWindow::on_comboBoxCFs_currentTextChanged(const QString &arg1) @@ -1053,7 +1073,9 @@ void MainGUIWindow::on_comboBoxCFs_currentTextChanged(const QString &arg1) } else { + #ifdef CATKIN_MAKE ROS_INFO("name not found in LUT"); + #endif } } @@ -1080,156 +1102,161 @@ void MainGUIWindow::on_comboBoxCFs_currentTextChanged(const QString &arg1) // > (RE)CONNECT THE RADIO void MainGUIWindow::on_all_connect_button_clicked() { - std_msgs::Int32 msg; - msg.data = CMD_RECONNECT; - crazyRadioCommandAllAgentsPublisher.publish(msg); +// std_msgs::Int32 msg; +// msg.data = CMD_RECONNECT; +// crazyRadioCommandAllAgentsPublisher.publish(msg); } // > DISCONNECT THE RADIO void MainGUIWindow::on_all_disconnect_button_clicked() { - std_msgs::Int32 msg; - msg.data = CMD_DISCONNECT; - crazyRadioCommandAllAgentsPublisher.publish(msg); +// std_msgs::Int32 msg; +// msg.data = CMD_DISCONNECT; +// crazyRadioCommandAllAgentsPublisher.publish(msg); } // > TAKE-OFF void MainGUIWindow::on_all_take_off_button_clicked() { - std_msgs::Int32 msg; - msg.data = CMD_CRAZYFLY_TAKE_OFF; - commandAllAgentsPublisher.publish(msg); +// std_msgs::Int32 msg; +// msg.data = CMD_CRAZYFLY_TAKE_OFF; +// commandAllAgentsPublisher.publish(msg); } // > LAND void MainGUIWindow::on_all_land_button_clicked() { - std_msgs::Int32 msg; - msg.data = CMD_CRAZYFLY_LAND; - commandAllAgentsPublisher.publish(msg); +// std_msgs::Int32 msg; +// msg.data = CMD_CRAZYFLY_LAND; +// commandAllAgentsPublisher.publish(msg); } // > MOTORS OFF void MainGUIWindow::on_all_motors_off_button_clicked() { +#ifdef CATKIN_MAKE dfall_pkg::IntWithHeader msg; msg.data = CMD_CRAZYFLY_MOTORS_OFF; msg.shouldCheckForAgentID = false; //commandAllAgentsPublisher.publish(msg); emergencyStopPublisher.publish(msg); +#endif } // > ENABLE SAFE CONTROLLER void MainGUIWindow::on_all_enable_safe_controller_button_clicked() { - std_msgs::Int32 msg; - msg.data = CMD_USE_SAFE_CONTROLLER; - commandAllAgentsPublisher.publish(msg); +// std_msgs::Int32 msg; +// msg.data = CMD_USE_SAFE_CONTROLLER; +// commandAllAgentsPublisher.publish(msg); } // > ENABLE SAFE CONTROLLER void MainGUIWindow::on_all_enable_custom_controller_button_clicked() { - std_msgs::Int32 msg; - msg.data = CMD_USE_CUSTOM_CONTROLLER; - commandAllAgentsPublisher.publish(msg); +// std_msgs::Int32 msg; +// msg.data = CMD_USE_CUSTOM_CONTROLLER; +// commandAllAgentsPublisher.publish(msg); } // > LOAD THE YAML PARAMETERS FOR THE SAFE CONTROLLER void MainGUIWindow::on_all_load_safe_controller_yaml_own_agent_button_clicked() { - // Disable the button - ui->all_load_safe_controller_yaml_own_agent_button->setEnabled(false); - ui->all_load_safe_controller_yaml_coordinator_button->setEnabled(false); - - // Send the message that the YAML paremters should be loaded - std_msgs::Int32 msg; - msg.data = LOAD_YAML_SAFE_CONTROLLER_AGENT; - requestLoadControllerYamlPublisher.publish(msg); - - // Start a timer which will enable the button in its callback - // > This is required because the agent node waits some time between - // re-loading the values from the YAML file and then assigning then - // to the local variable of the agent. - // > Thus we use this timer to prevent the user from clicking the - // button in the GUI repeatedly. - ros::NodeHandle nodeHandle("~"); - m_timer_yaml_file_for_safe_controller = nodeHandle.createTimer(ros::Duration(1.5), &MainGUIWindow::safeYamlFileTimerCallback, this, true); +// // Disable the button +// ui->all_load_safe_controller_yaml_own_agent_button->setEnabled(false); +// ui->all_load_safe_controller_yaml_coordinator_button->setEnabled(false); + +// // Send the message that the YAML paremters should be loaded +// std_msgs::Int32 msg; +// msg.data = LOAD_YAML_SAFE_CONTROLLER_AGENT; +// requestLoadControllerYamlPublisher.publish(msg); + +// // Start a timer which will enable the button in its callback +// // > This is required because the agent node waits some time between +// // re-loading the values from the YAML file and then assigning then +// // to the local variable of the agent. +// // > Thus we use this timer to prevent the user from clicking the +// // button in the GUI repeatedly. +// ros::NodeHandle nodeHandle("~"); +// m_timer_yaml_file_for_safe_controller = nodeHandle.createTimer(ros::Duration(1.5), &MainGUIWindow::safeYamlFileTimerCallback, this, true); } // > LOAD THE YAML PARAMETERS FOR THE CUSTOM CONTROLLER void MainGUIWindow::on_all_load_custom_controller_yaml_own_agent_button_clicked() { - // Disable the button - ui->all_load_custom_controller_yaml_own_agent_button->setEnabled(false); - ui->all_load_custom_controller_yaml_coordinator_button->setEnabled(false); - - // Send the message that the YAML paremters should be loaded - std_msgs::Int32 msg; - msg.data = LOAD_YAML_CUSTOM_CONTROLLER_AGENT; - requestLoadControllerYamlPublisher.publish(msg); - - // Start a timer which will enable the button in its callback - // > This is required because the agent node waits some time between - // re-loading the values from the YAML file and then assigning then - // to the local variable of the agent. - // > Thus we use this timer to prevent the user from clicking the - // button in the GUI repeatedly. - ros::NodeHandle nodeHandle("~"); - m_timer_yaml_file_for_custom_controller = nodeHandle.createTimer(ros::Duration(1.5), &MainGUIWindow::customYamlFileTimerCallback, this, true); +// // Disable the button +// ui->all_load_custom_controller_yaml_own_agent_button->setEnabled(false); +// ui->all_load_custom_controller_yaml_coordinator_button->setEnabled(false); + +// // Send the message that the YAML paremters should be loaded +// std_msgs::Int32 msg; +// msg.data = LOAD_YAML_CUSTOM_CONTROLLER_AGENT; +// requestLoadControllerYamlPublisher.publish(msg); + +// // Start a timer which will enable the button in its callback +// // > This is required because the agent node waits some time between +// // re-loading the values from the YAML file and then assigning then +// // to the local variable of the agent. +// // > Thus we use this timer to prevent the user from clicking the +// // button in the GUI repeatedly. +// ros::NodeHandle nodeHandle("~"); +// m_timer_yaml_file_for_custom_controller = nodeHandle.createTimer(ros::Duration(1.5), &MainGUIWindow::customYamlFileTimerCallback, this, true); } // > SEND THE YAML PARAMETERS FOR THE SAFE CONTROLLER void MainGUIWindow::on_all_load_safe_controller_yaml_coordinator_button_clicked() { - // Disable the button - ui->all_load_safe_controller_yaml_own_agent_button->setEnabled(false); - ui->all_load_safe_controller_yaml_coordinator_button->setEnabled(false); - - // Send the message that the YAML paremters should be loaded - // by the coordinator (and then the agent informed) - std_msgs::Int32 msg; - msg.data = LOAD_YAML_SAFE_CONTROLLER_COORDINATOR; - requestLoadControllerYamlPublisher.publish(msg); - - // Start a timer which will enable the button in its callback - // > This is required because the agent node waits some time between - // re-loading the values from the YAML file and then assigning then - // to the local variable of the agent. - // > Thus we use this timer to prevent the user from clicking the - // button in the GUI repeatedly. - ros::NodeHandle nodeHandle("~"); - m_timer_yaml_file_for_safe_controller = nodeHandle.createTimer(ros::Duration(1.5), &MainGUIWindow::safeYamlFileTimerCallback, this, true); +// // Disable the button +// ui->all_load_safe_controller_yaml_own_agent_button->setEnabled(false); +// ui->all_load_safe_controller_yaml_coordinator_button->setEnabled(false); + +// // Send the message that the YAML paremters should be loaded +// // by the coordinator (and then the agent informed) +// std_msgs::Int32 msg; +// msg.data = LOAD_YAML_SAFE_CONTROLLER_COORDINATOR; +// requestLoadControllerYamlPublisher.publish(msg); + +// // Start a timer which will enable the button in its callback +// // > This is required because the agent node waits some time between +// // re-loading the values from the YAML file and then assigning then +// // to the local variable of the agent. +// // > Thus we use this timer to prevent the user from clicking the +// // button in the GUI repeatedly. +// ros::NodeHandle nodeHandle("~"); +// m_timer_yaml_file_for_safe_controller = nodeHandle.createTimer(ros::Duration(1.5), &MainGUIWindow::safeYamlFileTimerCallback, this, true); } // > SEND THE YAML PARAMETERS FOR THE CUSTOM CONTROLLER void MainGUIWindow::on_all_load_custom_controller_yaml_coordinator_button_clicked() { - // Disable the button - ui->all_load_custom_controller_yaml_own_agent_button->setEnabled(false); - ui->all_load_custom_controller_yaml_coordinator_button->setEnabled(false); - - // Send the message that the YAML paremters should be loaded - // by the coordinator (and then the agent informed) - std_msgs::Int32 msg; - msg.data = LOAD_YAML_CUSTOM_CONTROLLER_COORDINATOR; - requestLoadControllerYamlPublisher.publish(msg); - - // Start a timer which will enable the button in its callback - // > This is required because the agent node waits some time between - // re-loading the values from the YAML file and then assigning then - // to the local variable of the agent. - // > Thus we use this timer to prevent the user from clicking the - // button in the GUI repeatedly. - ros::NodeHandle nodeHandle("~"); - m_timer_yaml_file_for_custom_controller = nodeHandle.createTimer(ros::Duration(1.5), &MainGUIWindow::customYamlFileTimerCallback, this, true); +// // Disable the button +// ui->all_load_custom_controller_yaml_own_agent_button->setEnabled(false); +// ui->all_load_custom_controller_yaml_coordinator_button->setEnabled(false); + +// // Send the message that the YAML paremters should be loaded +// // by the coordinator (and then the agent informed) +// std_msgs::Int32 msg; +// msg.data = LOAD_YAML_CUSTOM_CONTROLLER_COORDINATOR; +// requestLoadControllerYamlPublisher.publish(msg); + +// // Start a timer which will enable the button in its callback +// // > This is required because the agent node waits some time between +// // re-loading the values from the YAML file and then assigning then +// // to the local variable of the agent. +// // > Thus we use this timer to prevent the user from clicking the +// // button in the GUI repeatedly. +// ros::NodeHandle nodeHandle("~"); +// m_timer_yaml_file_for_custom_controller = nodeHandle.createTimer(ros::Duration(1.5), &MainGUIWindow::customYamlFileTimerCallback, this, true); } + +#ifdef CATKIN_MAKE // > CALLBACK TO RE-ENABLE THE SAFE CONTROLLER YAML BUTTONS void MainGUIWindow::safeYamlFileTimerCallback(const ros::TimerEvent&) { - // Enble the "load" and the "send" safe controller YAML button again - ui->all_load_safe_controller_yaml_own_agent_button->setEnabled(true); - ui->all_load_safe_controller_yaml_coordinator_button->setEnabled(true); +// // Enble the "load" and the "send" safe controller YAML button again +// ui->all_load_safe_controller_yaml_own_agent_button->setEnabled(true); +// ui->all_load_safe_controller_yaml_coordinator_button->setEnabled(true); } // > CALLBACK TO RE-ENABLE THE CUSTOM CONTROLLER YAML BUTTONS void MainGUIWindow::customYamlFileTimerCallback(const ros::TimerEvent&) { - // Enble the "load" and the "send" custom controller YAML button again - ui->all_load_custom_controller_yaml_own_agent_button->setEnabled(true); - ui->all_load_custom_controller_yaml_coordinator_button->setEnabled(true); +// // Enble the "load" and the "send" custom controller YAML button again +// ui->all_load_custom_controller_yaml_own_agent_button->setEnabled(true); +// ui->all_load_custom_controller_yaml_coordinator_button->setEnabled(true); } +#endif /* // > CALLBACK TO SEND THE CUSTOM CONTROLLER YAML PARAMETERS AS A MESSAGE @@ -1312,6 +1339,9 @@ void MainGUIWindow::customSendYamlAsMessageTimerCallback(const ros::TimerEvent&) // P A A R R A A M M EEEEE T EEEEE R R SSSS // ---------------------------------------------------------------------------------- + +#ifdef CATKIN_MAKE + // load parameters from corresponding YAML file // float MainGUIWindow::getParameterFloat(ros::NodeHandle& nodeHandle, std::string name) @@ -1371,3 +1401,5 @@ bool MainGUIWindow::getParameterBool(ros::NodeHandle& nodeHandle, std::string na } return val; } + +#endif