Commit a8f81126 authored by beuchatp's avatar beuchatp
Browse files

Added and tested the RemoteController

parent 43004c3d
......@@ -157,6 +157,7 @@ add_message_files(
#----------------------------------------------------------------------
DebugMsg.msg
CustomButton.msg
ViconSubscribeObjectName.msg
)
## Generate services in the 'srv' folder
......@@ -268,6 +269,7 @@ add_executable(SafeControllerService src/nodes/SafeControllerService.cpp)
add_executable(DemoControllerService src/nodes/DemoControllerService.cpp)
add_executable(StudentControllerService src/nodes/StudentControllerService.cpp)
add_executable(MpcControllerService src/nodes/MpcControllerService.cpp)
add_executable(RemoteControllerService src/nodes/RemoteControllerService.cpp)
add_executable(CentralManagerService src/nodes/CentralManagerService.cpp src/CrazyflieIO.cpp)
add_executable(ParameterService src/nodes/ParameterService.cpp)
......@@ -320,6 +322,7 @@ add_dependencies(SafeControllerService d_fall_pps_generate_messages_cpp ${cat
add_dependencies(DemoControllerService d_fall_pps_generate_messages_cpp ${catkin_EXPORTED_TARGETS})
add_dependencies(StudentControllerService d_fall_pps_generate_messages_cpp ${catkin_EXPORTED_TARGETS})
add_dependencies(MpcControllerService d_fall_pps_generate_messages_cpp ${catkin_EXPORTED_TARGETS})
add_dependencies(RemoteControllerService d_fall_pps_generate_messages_cpp ${catkin_EXPORTED_TARGETS})
add_dependencies(CentralManagerService d_fall_pps_generate_messages_cpp ${catkin_EXPORTED_TARGETS})
add_dependencies(ParameterService d_fall_pps_generate_messages_cpp ${catkin_EXPORTED_TARGETS})
......@@ -360,6 +363,7 @@ if(Eigen3_FOUND)
else()
target_link_libraries(MpcControllerService ${catkin_LIBRARIES})
endif()
target_link_libraries(RemoteControllerService ${catkin_LIBRARIES})
target_link_libraries(CentralManagerService ${catkin_LIBRARIES})
target_link_libraries(ParameterService ${catkin_LIBRARIES})
......
......@@ -43,6 +43,7 @@
#include "d_fall_pps/CrazyflieContext.h"
#include "d_fall_pps/CrazyflieData.h"
#include "d_fall_pps/Setpoint.h"
#include "d_fall_pps/ViconSubscribeObjectName.h"
// Types of controllers being used:
......@@ -50,6 +51,7 @@
#define DEMO_CONTROLLER 2
#define STUDENT_CONTROLLER 3
#define MPC_CONTROLLER 4
#define REMOTE_CONTROLLER 5
// Commands for CrazyRadio
......@@ -69,6 +71,7 @@
#define CMD_USE_DEMO_CONTROLLER 2
#define CMD_USE_STUDENT_CONTROLLER 3
#define CMD_USE_MPC_CONTROLLER 4
#define CMD_USE_REMOTE_CONTROLLER 5
#define CMD_CRAZYFLY_TAKE_OFF 11
#define CMD_CRAZYFLY_LAND 12
......@@ -89,11 +92,13 @@
#define LOAD_YAML_DEMO_CONTROLLER_AGENT 2
#define LOAD_YAML_STUDENT_CONTROLLER_AGENT 3
#define LOAD_YAML_MPC_CONTROLLER_AGENT 4
#define LOAD_YAML_REMOTE_CONTROLLER_AGENT 5
#define LOAD_YAML_SAFE_CONTROLLER_COORDINATOR 11
#define LOAD_YAML_DEMO_CONTROLLER_COORDINATOR 12
#define LOAD_YAML_STUDENT_CONTROLLER_COORDINATOR 13
#define LOAD_YAML_MPC_CONTROLLER_COORDINATOR 14
#define LOAD_YAML_REMOTE_CONTROLLER_COORDINATOR 15
// Universal constants
#define PI 3.141592653589
......@@ -136,12 +141,14 @@ private slots:
void on_load_demo_yaml_button_clicked();
void on_load_student_yaml_button_clicked();
void on_load_mpc_yaml_button_clicked();
void on_load_remote_yaml_button_clicked();
// # Enable controllers
void on_enable_safe_controller_clicked();
void on_enable_demo_controller_clicked();
void on_enable_student_controller_clicked();
void on_enable_mpc_controller_clicked();
void on_enable_remote_controller_clicked();
......@@ -149,6 +156,13 @@ private slots:
void on_customButton_2_clicked();
void on_customButton_3_clicked();
// Buttons within the REMOTE controller tab
void on_remote_subscribe_button_clicked();
void on_remote_unsubscribe_button_clicked();
void on_remote_activate_button_clicked();
void on_remote_deactivate_button_clicked();
private:
Ui::MainWindow *ui;
......@@ -164,6 +178,7 @@ private:
ros::Timer m_timer_yaml_file_for_demo_controller;
ros::Timer m_timer_yaml_file_for_student_controller;
ros::Timer m_timer_yaml_file_for_mpc_controller;
ros::Timer m_timer_yaml_file_for_remote_controller;
int m_student_id;
CrazyflieContext m_context;
......@@ -185,16 +200,24 @@ private:
ros::Publisher controllerSetpointPublisher;
ros::Subscriber safeSetpointSubscriber;
// SUBSCRIBERS AND PUBLISHERS FOR THE SETPOINTS:
// > For the Demo Controller
// SUBSCRIBERS AND PUBLISHERS:
// > For the Demo Controller SETPOINTS
ros::Publisher demoSetpointPublisher;
ros::Subscriber demoSetpointSubscriber;
// > For the Student Controller
// > For the Student Controller SETPOINTS
ros::Publisher studentSetpointPublisher;
ros::Subscriber studentSetpointSubscriber;
// > For the MPC Controller
// > For the MPC Controller SETPOINTS
ros::Publisher mpcSetpointPublisher;
ros::Subscriber mpcSetpointSubscriber;
// > For the Remote Controller subscribe action
ros::Publisher remoteSubscribePublisher;
// > For the Remote Controller activate action
ros::Publisher remoteActivatePublisher;
// > For the Remote Controller data
ros::Subscriber remoteDataSubscriber;
// > For the Remote Control setpoint
ros::Subscriber remoteControlSetpointSubscriber;
......@@ -229,6 +252,11 @@ private:
void studentSetpointCallback(const Setpoint& newSetpoint);
void mpcSetpointCallback(const Setpoint& newSetpoint);
void remoteDataCallback(const CrazyflieData& objectData);
void remoteControlSetpointCallback(const CrazyflieData& setpointData);
void DBChangedCallback(const std_msgs::Int32& msg);
// # Load Yaml when acting as the GUI for an Agent
......@@ -236,6 +264,7 @@ private:
void demoYamlFileTimerCallback(const ros::TimerEvent&);
void studentYamlFileTimerCallback(const ros::TimerEvent&);
void mpcYamlFileTimerCallback(const ros::TimerEvent&);
void remoteYamlFileTimerCallback(const ros::TimerEvent&);
......@@ -260,6 +289,7 @@ private:
void highlightDemoControllerTab();
void highlightStudentControllerTab();
void highlightMpcControllerTab();
void highlightRemoteControllerTab();
bool setpointInsideBox(Setpoint setpoint, CrazyflieContext context);
Setpoint correctSetpointBox(Setpoint setpoint, CrazyflieContext context);
......
......@@ -59,7 +59,7 @@ MainWindow::MainWindow(int argc, char **argv, QWidget *parent) :
setCrazyRadioStatus(DISCONNECTED);
m_ros_namespace = ros::this_node::getNamespace();
ROS_INFO("Student GUI node namespace: %s", m_ros_namespace.c_str());
ROS_INFO("[Student GUI] node namespace: %s", m_ros_namespace.c_str());
qRegisterMetaType<ptrToMessage>("ptrToMessage");
QObject::connect(m_rosNodeThread, SIGNAL(newViconData(const ptrToMessage&)), this, SLOT(updateNewViconData(const ptrToMessage&)));
......@@ -67,17 +67,28 @@ MainWindow::MainWindow(int argc, char **argv, QWidget *parent) :
ros::NodeHandle nodeHandle(m_ros_namespace);
// SUBSCRIBERS AND PUBLISHERS FOR THE SETPOINTS:
// > For the Demo Controller
// SUBSCRIBERS AND PUBLISHERS:
// > For the Demo Controller SETPOINTS
demoSetpointPublisher = nodeHandle.advertise<Setpoint>("DemoControllerService/Setpoint", 1);
demoSetpointSubscriber = nodeHandle.subscribe("DemoControllerService/Setpoint", 1, &MainWindow::demoSetpointCallback, this);
// > For the Student Controller
// > For the Student Controller SETPOINTS
studentSetpointPublisher = nodeHandle.advertise<Setpoint>("StudentControllerService/Setpoint", 1);
studentSetpointSubscriber = nodeHandle.subscribe("StudentControllerService/Setpoint", 1, &MainWindow::studentSetpointCallback, this);
// > For the MPC Controller
// > For the MPC Controller SETPOINTS
mpcSetpointPublisher = nodeHandle.advertise<Setpoint>("MpcControllerService/Setpoint", 1);
mpcSetpointSubscriber = nodeHandle.subscribe("MpcControllerService/Setpoint", 1, &MainWindow::mpcSetpointCallback, this);
// > For the Remote Controller subscribe action
remoteSubscribePublisher = nodeHandle.advertise<ViconSubscribeObjectName>("RemoteControllerService/ViconSubscribeObjectName", 1);
// > For the Remote Controller activate action
remoteActivatePublisher = nodeHandle.advertise<std_msgs::Int32>("RemoteControllerService/Activate", 1);
// > For the Remote Controller data
remoteDataSubscriber = nodeHandle.subscribe("RemoteControllerService/RemoteData", 1, &MainWindow::remoteDataCallback, this);;
// > For the Remote Controller data
remoteControlSetpointSubscriber = nodeHandle.subscribe("RemoteControllerService/RemoteControlSetpoint", 1, &MainWindow::remoteControlSetpointCallback, this);;
// subscribers
crazyRadioStatusSubscriber = nodeHandle.subscribe("CrazyRadio/CrazyRadioStatus", 1, &MainWindow::crazyRadioStatusCallback, this);
......@@ -196,6 +207,7 @@ void MainWindow::highlightSafeControllerTab()
ui->tabWidget->tabBar()->setTabTextColor(1, Qt::black);
ui->tabWidget->tabBar()->setTabTextColor(2, Qt::black);
ui->tabWidget->tabBar()->setTabTextColor(3, Qt::black);
ui->tabWidget->tabBar()->setTabTextColor(4, Qt::black);
}
void MainWindow::highlightDemoControllerTab()
{
......@@ -203,6 +215,7 @@ void MainWindow::highlightDemoControllerTab()
ui->tabWidget->tabBar()->setTabTextColor(1, Qt::green);
ui->tabWidget->tabBar()->setTabTextColor(2, Qt::black);
ui->tabWidget->tabBar()->setTabTextColor(3, Qt::black);
ui->tabWidget->tabBar()->setTabTextColor(4, Qt::black);
}
void MainWindow::highlightStudentControllerTab()
{
......@@ -210,6 +223,7 @@ void MainWindow::highlightStudentControllerTab()
ui->tabWidget->tabBar()->setTabTextColor(1, Qt::black);
ui->tabWidget->tabBar()->setTabTextColor(2, Qt::green);
ui->tabWidget->tabBar()->setTabTextColor(3, Qt::black);
ui->tabWidget->tabBar()->setTabTextColor(4, Qt::black);
}
void MainWindow::highlightMpcControllerTab()
{
......@@ -217,6 +231,15 @@ void MainWindow::highlightMpcControllerTab()
ui->tabWidget->tabBar()->setTabTextColor(1, Qt::black);
ui->tabWidget->tabBar()->setTabTextColor(2, Qt::black);
ui->tabWidget->tabBar()->setTabTextColor(3, Qt::green);
ui->tabWidget->tabBar()->setTabTextColor(4, Qt::black);
}
void MainWindow::highlightRemoteControllerTab()
{
ui->tabWidget->tabBar()->setTabTextColor(0, Qt::black);
ui->tabWidget->tabBar()->setTabTextColor(1, Qt::black);
ui->tabWidget->tabBar()->setTabTextColor(2, Qt::black);
ui->tabWidget->tabBar()->setTabTextColor(3, Qt::black);
ui->tabWidget->tabBar()->setTabTextColor(4, Qt::green);
}
void MainWindow::DBChangedCallback(const std_msgs::Int32& msg)
......@@ -241,6 +264,9 @@ void MainWindow::controllerUsedChangedCallback(const std_msgs::Int32& msg)
case MPC_CONTROLLER:
highlightMpcControllerTab();
break;
case REMOTE_CONTROLLER:
highlightRemoteControllerTab();
break;
default:
break;
}
......@@ -811,6 +837,37 @@ void MainWindow::mpcYamlFileTimerCallback(const ros::TimerEvent&)
void MainWindow::on_load_remote_yaml_button_clicked()
{
// Set the "load remote yaml" button to be disabled
ui->load_remote_yaml_button->setEnabled(false);
// Send a message requesting the parameters from the YAML
// file to be reloaded for the remote controller
std_msgs::Int32 msg;
msg.data = LOAD_YAML_REMOTE_CONTROLLER_AGENT;
this->requestLoadControllerYamlPublisher.publish(msg);
ROS_INFO("[STUDENT GUI] Request load of remote controller YAML published");
// 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_remote_controller = nodeHandle.createTimer(ros::Duration(1.5), &MainWindow::remoteYamlFileTimerCallback, this, true);
}
void MainWindow::remoteYamlFileTimerCallback(const ros::TimerEvent&)
{
// Enble the "load remote yaml" button again
ui->load_remote_yaml_button->setEnabled(true);
}
void MainWindow::requestLoadControllerYaml_from_my_GUI_Callback(const std_msgs::Int32& msg)
{
// Extract from the "msg" for which controller the YAML
......@@ -883,6 +940,21 @@ void MainWindow::requestLoadControllerYaml_from_my_GUI_Callback(const std_msgs::
break;
case LOAD_YAML_REMOTE_CONTROLLER_AGENT:
case LOAD_YAML_REMOTE_CONTROLLER_COORDINATOR:
// Set the "load remote yaml" button to be disabled
ui->load_remote_yaml_button->setEnabled(false);
// 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.
m_timer_yaml_file_for_remote_controller = nodeHandle.createTimer(ros::Duration(1.5), &MainWindow::remoteYamlFileTimerCallback, this, true);
break;
default:
ROS_INFO("Unknown 'all controllers to load yaml' command, thus nothing will be disabled");
break;
......@@ -922,6 +994,13 @@ void MainWindow::on_enable_mpc_controller_clicked()
this->PPSClientCommandPublisher.publish(msg);
}
void MainWindow::on_enable_remote_controller_clicked()
{
std_msgs::Int32 msg;
msg.data = CMD_USE_REMOTE_CONTROLLER;
this->PPSClientCommandPublisher.publish(msg);
}
// # Custom command buttons
......@@ -953,6 +1032,102 @@ void MainWindow::on_customButton_3_clicked()
ROS_INFO("Custom button 3 pressed in GUI");
}
// # Custom buttons for the REMOTE controller service
void MainWindow::on_remote_subscribe_button_clicked()
{
// Initialise the message
ViconSubscribeObjectName msg;
// Set the subscribe flag
msg.shouldSubscribe = true;
// Set the object name
msg.objectName = (ui->remote_object_name->text()).toUtf8().constData();
// Publish the message
this->remoteSubscribePublisher.publish(msg);
}
void MainWindow::on_remote_unsubscribe_button_clicked()
{
// Initialise the message
ViconSubscribeObjectName msg;
// Set the subscribe flag
msg.shouldSubscribe = false;
// Set the object name
msg.objectName = (ui->remote_object_name->text()).toUtf8().constData();
// Publish the message
this->remoteSubscribePublisher.publish(msg);
}
void MainWindow::on_remote_activate_button_clicked()
{
// Initialise the message
std_msgs::Int32 msg;
// Set the msg data
msg.data = 1;
// Publish the message
this->remoteActivatePublisher.publish(msg);
}
void MainWindow::on_remote_deactivate_button_clicked()
{
// Initialise the message
std_msgs::Int32 msg;
// Set the msg data
msg.data = 0;
// Publish the message
this->remoteActivatePublisher.publish(msg);
}
void MainWindow::remoteDataCallback(const CrazyflieData& objectData)
{
// Check if the object is occluded
if (objectData.occluded)
{
// Set the column heading label to have a red background
// > IMPORTANT: Set the background auto fill property to true
ui->remote_data_label->setAutoFillBackground(true);
// > Get the pallette currently set for the label
QPalette pal = ui->remote_roll_label->palette();
// > Set the palette property that will change the background
pal.setColor(QPalette::Window, QColor(Qt::red));
// > Update the palette for the label
ui->remote_data_label->setPalette(pal);
}
else
{
// Put the roll, pitch, yaw, and z data into the appropriate fields
ui->remote_data_roll ->setText(QString::number( objectData.roll * RAD2DEG, 'f', 1));
ui->remote_data_pitch->setText(QString::number( objectData.pitch * RAD2DEG, 'f', 1));
ui->remote_data_yaw ->setText(QString::number( objectData.yaw * RAD2DEG, 'f', 1));
ui->remote_data_z ->setText(QString::number( objectData.z, 'f', 2));
// Set the column heading label to have a "normal" background
// > IMPORTANT: Set the background auto fill property to true
ui->remote_data_label->setAutoFillBackground(false);
// > Get the pallette currently set for the roll label
QPalette pal = ui->remote_roll_label->palette();
// > Update the palette for the column heading label
ui->remote_data_label->setPalette(pal);
}
}
void MainWindow::remoteControlSetpointCallback(const CrazyflieData& setpointData)
{
ui->remote_setpoint_roll ->setText(QString::number( setpointData.roll * RAD2DEG, 'f', 1));
ui->remote_setpoint_pitch->setText(QString::number( setpointData.pitch * RAD2DEG, 'f', 1));
ui->remote_setpoint_yaw ->setText(QString::number( setpointData.yaw * RAD2DEG, 'f', 1));
ui->remote_setpoint_z ->setText(QString::number( setpointData.z, 'f', 2));
}
Setpoint MainWindow::correctSetpointBox(Setpoint setpoint, CrazyflieContext context)
{
Setpoint corrected_setpoint;
......
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE QtCreatorProject>
<!-- Written by QtCreator 3.5.1, 2017-10-18T15:20:06. -->
<qtcreator>
<data>
<variable>EnvironmentId</variable>
<value type="QByteArray">{1400dcd4-82c6-466c-a808-34f7a3d4fe21}</value>
</data>
<data>
<variable>ProjectExplorer.Project.ActiveTarget</variable>
<value type="int">0</value>
</data>
<data>
<variable>ProjectExplorer.Project.EditorSettings</variable>
<valuemap type="QVariantMap">
<value type="bool" key="EditorConfiguration.AutoIndent">true</value>
<value type="bool" key="EditorConfiguration.AutoSpacesForTabs">false</value>
<value type="bool" key="EditorConfiguration.CamelCaseNavigation">true</value>
<valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.0">
<value type="QString" key="language">Cpp</value>
<valuemap type="QVariantMap" key="value">
<value type="QByteArray" key="CurrentPreferences">CppGlobal</value>
</valuemap>
</valuemap>
<valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.1">
<value type="QString" key="language">QmlJS</value>
<valuemap type="QVariantMap" key="value">
<value type="QByteArray" key="CurrentPreferences">QmlJSGlobal</value>
</valuemap>
</valuemap>
<value type="int" key="EditorConfiguration.CodeStyle.Count">2</value>
<value type="QByteArray" key="EditorConfiguration.Codec">UTF-8</value>
<value type="bool" key="EditorConfiguration.ConstrainTooltips">false</value>
<value type="int" key="EditorConfiguration.IndentSize">4</value>
<value type="bool" key="EditorConfiguration.KeyboardTooltips">false</value>
<value type="int" key="EditorConfiguration.MarginColumn">80</value>
<value type="bool" key="EditorConfiguration.MouseHiding">true</value>
<value type="bool" key="EditorConfiguration.MouseNavigation">true</value>
<value type="int" key="EditorConfiguration.PaddingMode">1</value>
<value type="bool" key="EditorConfiguration.ScrollWheelZooming">true</value>
<value type="bool" key="EditorConfiguration.ShowMargin">false</value>
<value type="int" key="EditorConfiguration.SmartBackspaceBehavior">0</value>
<value type="bool" key="EditorConfiguration.SpacesForTabs">true</value>
<value type="int" key="EditorConfiguration.TabKeyBehavior">0</value>
<value type="int" key="EditorConfiguration.TabSize">8</value>
<value type="bool" key="EditorConfiguration.UseGlobal">true</value>
<value type="int" key="EditorConfiguration.Utf8BomBehavior">1</value>
<value type="bool" key="EditorConfiguration.addFinalNewLine">true</value>
<value type="bool" key="EditorConfiguration.cleanIndentation">true</value>
<value type="bool" key="EditorConfiguration.cleanWhitespace">true</value>
<value type="bool" key="EditorConfiguration.inEntireDocument">false</value>
</valuemap>
</data>
<data>
<variable>ProjectExplorer.Project.PluginSettings</variable>
<valuemap type="QVariantMap"/>
</data>
<data>
<variable>ProjectExplorer.Project.Target.0</variable>
<valuemap type="QVariantMap">
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Desktop</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Desktop</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">{051621a5-413a-4a38-907c-a6d036ac454e}</value>
<value type="int" key="ProjectExplorer.Target.ActiveBuildConfiguration">0</value>
<value type="int" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
<value type="int" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0">
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/ppsteacher/work/D-FaLL-System/pps_ws/src/d_fall_pps/GUI_Qt/build-studentGUI-Desktop-Debug</value>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">qmake</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibrary">false</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibraryAuto">true</value>
<value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.SeparateDebugInfo">false</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.UseQtQuickCompiler">false</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments">
<value type="QString">-w</value>
<value type="QString">-r</value>
</valuelist>
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">false</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments"></value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments">
<value type="QString">-w</value>
<value type="QString">-r</value>
</valuelist>
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">true</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
<value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
<valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Debug</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
<value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">2</value>
<value type="bool" key="Qt4ProjectManager.Qt4BuildConfiguration.UseShadowBuild">true</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.1">
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">/home/ppsteacher/work/D-FaLL-System/pps_ws/src/d_fall_pps/GUI_Qt/build-studentGUI-Desktop-Release</value>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">qmake</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibrary">false</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibraryAuto">true</value>
<value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.SeparateDebugInfo">false</value>
<value type="bool" key="QtProjectManager.QMakeBuildStep.UseQtQuickCompiler">false</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
<valuelist type="QVariantList" key="Qt4ProjectManager.MakeStep.AutomaticallyAddedMakeArguments">
<value type="QString">-w</value>
<value type="QString">-r</value>
</valuelist>
<value type="bool" key="Qt4ProjectManager.MakeStep.Clean">false</value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments"></value>
<value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
</valuemap>
<value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
</valuemap>