From 7a37a53357e55b1077a0a939964b3b0e1ac2d1fb Mon Sep 17 00:00:00 2001
From: Paul Beuchat <beuchatp@control.ee.ethz.ch>
Date: Sat, 8 Sep 2018 15:29:21 +0200
Subject: [PATCH] Added mutex to student GUI in an attempt to prevent battery
 voltage and image from semi-freezing

---
 .../GUI_Qt/studentGUI/include/MainWindow.h    |  3 ++
 .../GUI_Qt/studentGUI/src/MainWindow.cpp      | 33 ++++++++++++++++---
 2 files changed, 32 insertions(+), 4 deletions(-)

diff --git a/pps_ws/src/d_fall_pps/GUI_Qt/studentGUI/include/MainWindow.h b/pps_ws/src/d_fall_pps/GUI_Qt/studentGUI/include/MainWindow.h
index 5ad79b7c..896286d8 100644
--- a/pps_ws/src/d_fall_pps/GUI_Qt/studentGUI/include/MainWindow.h
+++ b/pps_ws/src/d_fall_pps/GUI_Qt/studentGUI/include/MainWindow.h
@@ -220,6 +220,9 @@ private:
     Setpoint m_mpc_setpoint;
 
     int m_flying_state;
+    QMutex m_flying_state_mutex;
+    QMutex voltage_field_mutex;
+    QMutex battery_status_label_mutex;
     int m_battery_state;
     // BATTERY EMPTY VOLTAGES (THESE SHOULD BE READ IN AS PARAMTERS)
     //const std::vector<float> m_cutoff_voltages {3.1966,        3.2711,        3.3061,        3.3229,        3.3423,        3.3592,        3.3694,        3.385,        3.4006,        3.4044,        3.4228,        3.4228,        3.4301,        3.4445,        3.4531,        3.4677,        3.4705,        3.4712,        3.4756,        3.483,        3.4944,        3.5008,        3.5008,        3.5084,        3.511,        3.5122,        3.5243,        3.5329,        3.5412,        3.5529,        3.5609,        3.5625,        3.5638,        3.5848,        3.6016,        3.6089,        3.6223,        3.628,        3.6299,        3.6436,        3.6649,        3.6878,        3.6983,        3.7171,        3.7231,        3.7464,        3.7664,        3.7938,        3.8008,        3.816,        3.8313,        3.8482,        3.866,        3.8857,        3.8984,        3.9159,        3.9302,        3.9691,        3.997,        4.14    };
diff --git a/pps_ws/src/d_fall_pps/GUI_Qt/studentGUI/src/MainWindow.cpp b/pps_ws/src/d_fall_pps/GUI_Qt/studentGUI/src/MainWindow.cpp
index 49e5df67..c1d91b1c 100644
--- a/pps_ws/src/d_fall_pps/GUI_Qt/studentGUI/src/MainWindow.cpp
+++ b/pps_ws/src/d_fall_pps/GUI_Qt/studentGUI/src/MainWindow.cpp
@@ -368,7 +368,9 @@ void MainWindow::mpcSetpointCallback(const Setpoint& newSetpoint)
 void MainWindow::flyingStateChangedCallback(const std_msgs::Int32& msg)
 {
 	// PUT THE CURRENT STATE INTO THE CLASS VARIABLE
+	m_flying_state_mutex.lock();
 	m_flying_state = msg.data;
+	m_flying_state_mutex.unlock();
 
 	// UPDATE THE LABEL TO DISPLAY THE FLYING STATE
     //QString qstr = "Flying State: ";
@@ -378,6 +380,7 @@ void MainWindow::flyingStateChangedCallback(const std_msgs::Int32& msg)
         {
             //qstr.append("Motors OFF");
             // SET THE APPROPRIATE IMAGE FOR THE FLYING STATE LABEL
+            ui->flying_state_label->clear();
             QPixmap flying_state_off_pixmap(":/images/flying_state_off.png");
             ui->flying_state_label->setPixmap(flying_state_off_pixmap);
             ui->flying_state_label->setScaledContents(true);
@@ -389,6 +392,7 @@ void MainWindow::flyingStateChangedCallback(const std_msgs::Int32& msg)
         {
             //qstr.append("Take OFF");
             // SET THE APPROPRIATE IMAGE FOR THE FLYING STATE LABEL
+            ui->flying_state_label->clear();
             QPixmap flying_state_enabling_pixmap(":/images/flying_state_enabling.png");
             ui->flying_state_label->setPixmap(flying_state_enabling_pixmap);
             ui->flying_state_label->setScaledContents(true);
@@ -400,6 +404,7 @@ void MainWindow::flyingStateChangedCallback(const std_msgs::Int32& msg)
         {
             //qstr.append("Flying");
             // SET THE APPROPRIATE IMAGE FOR THE FLYING STATE LABEL
+            ui->flying_state_label->clear();
             QPixmap flying_state_flying_pixmap(":/images/flying_state_flying.png");
             ui->flying_state_label->setPixmap(flying_state_flying_pixmap);
             ui->flying_state_label->setScaledContents(true);
@@ -411,6 +416,7 @@ void MainWindow::flyingStateChangedCallback(const std_msgs::Int32& msg)
         {
             //qstr.append("Land");
             // SET THE APPROPRIATE IMAGE FOR THE FLYING STATE LABEL
+            ui->flying_state_label->clear();
             QPixmap flying_state_disabling_pixmap(":/images/flying_state_disabling.png");
             ui->flying_state_label->setPixmap(flying_state_disabling_pixmap);
             ui->flying_state_label->setScaledContents(true);
@@ -421,6 +427,7 @@ void MainWindow::flyingStateChangedCallback(const std_msgs::Int32& msg)
         default:
         {
             // SET THE APPROPRIATE IMAGE FOR THE FLYING STATE LABEL
+            ui->flying_state_label->clear();
             QPixmap flying_state_unknown_pixmap(":/images/flying_state_unknown.png");
             ui->flying_state_label->setPixmap(flying_state_unknown_pixmap);
             ui->flying_state_label->setScaledContents(true);
@@ -474,6 +481,7 @@ void MainWindow::setCrazyRadioStatus(int radio_status)
         case CONNECTED:
         {
             // SET THE APPROPRIATE IMAGE FOR THE RADIOSTATUS LABEL
+            ui->rf_status_label->clear();
             QPixmap rf_connected_pixmap(":/images/rf_connected.png");
             ui->rf_status_label->setPixmap(rf_connected_pixmap);
             ui->rf_status_label->setScaledContents(true);
@@ -486,34 +494,38 @@ void MainWindow::setCrazyRadioStatus(int radio_status)
         case CONNECTING:
         {
             // SET THE APPROPRIATE IMAGE FOR THE RADIO STATUS LABEL
+            ui->rf_status_label->clear();
             QPixmap rf_connecting_pixmap(":/images/rf_connecting.png");
             ui->rf_status_label->setPixmap(rf_connecting_pixmap);
             ui->rf_status_label->setScaledContents(true);
             ui->rf_status_label->update();
-            // SET THE BATTERY VOLTAGE FIELD TO BE BLANK
-            // QString qstr = "-.-- V";
-            // ui->voltage_field->setText(qstr);
             break;
         }
 
         case DISCONNECTED:
         {
             // SET THE APPROPRIATE IMAGE FOR THE RADIO STATUS LABEL
+            ui->rf_status_label->clear();
             QPixmap rf_disconnected_pixmap(":/images/rf_disconnected.png");
             ui->rf_status_label->setPixmap(rf_disconnected_pixmap);
             ui->rf_status_label->setScaledContents(true);
             ui->rf_status_label->update();
             // SET THE BATTERY VOLTAGE FIELD TO BE BLANK
             QString qstr = "-.-- V";
+            voltage_field_mutex.lock();
             ui->voltage_field->setText(qstr);
+            voltage_field_mutex.unlock();
             // SET THE APPROPRIATE IMAGE FOR THE BATTERY STATUS LABEL
             if (m_battery_label_image_current_index != BATTERY_LABEL_IMAGE_INDEX_UNKNOWN)
 			{
+				battery_status_label_mutex.lock();
+				ui->battery_status_label->clear();
 	            QPixmap battery_unknown_pixmap(":/images/battery_unknown.png");
 	            ui->battery_status_label->setPixmap(battery_unknown_pixmap);
 	            ui->battery_status_label->setScaledContents(true);
 	            m_battery_label_image_current_index = BATTERY_LABEL_IMAGE_INDEX_UNKNOWN;
 	            ui->battery_status_label->update();
+	            battery_status_label_mutex.unlock();
 	        }
             // DISABLE THE REMAINDER OF THE GUI
             disableGUI();
@@ -540,6 +552,7 @@ float MainWindow::fromVoltageToPercent(float voltage)
 
 	// COMPUTE THE PERCENTAGE DIFFERENTLY DEPENDING ON
 	// THE CURRENT FLYING STATE
+	m_flying_state_mutex.lock();
 	if (m_flying_state == STATE_MOTORS_OFF)
 	{
 		voltage_when_empty = battery_voltage_empty_while_motors_off;
@@ -550,6 +563,7 @@ float MainWindow::fromVoltageToPercent(float voltage)
 		voltage_when_empty = battery_voltage_empty_while_flying;
 		voltage_when_full  = battery_voltage_full_while_flying;
 	}
+	m_flying_state_mutex.unlock();
 	//voltage_when_empty = battery_voltage_empty_while_motors_off;
 	//voltage_when_full  = battery_voltage_full_while_motors_off;
 
@@ -577,10 +591,12 @@ void MainWindow::updateBatteryVoltage(float battery_voltage)
     m_battery_voltage = battery_voltage;
 
     // UPDATE THE BATTERY VOLTAGE FIELD
+    voltage_field_mutex.lock();
     QString qstr = "";
     qstr.append(QString::number(battery_voltage, 'f', 2));
     qstr.append(" V");
     ui->voltage_field->setText(qstr);
+    voltage_field_mutex.unlock();
 
 	// COMPUTE THE BATTERY VOLTAGE AS A PERCENTAGE
 	float battery_voltage_percentage = fromVoltageToPercent(battery_voltage);
@@ -588,6 +604,7 @@ void MainWindow::updateBatteryVoltage(float battery_voltage)
 	//ROS_INFO_STREAM("Battery percentage = " << battery_voltage_percentage );
 
 	// UPDATE THE IMAGE DISPLAYED IN THE BATTERY VOLTAGE LABEL IMAGE
+	battery_status_label_mutex.lock();
 	switch(m_battery_state)
 	{
 		// WHEN THE BATTERY IS IN A LOW STATE
@@ -596,6 +613,7 @@ void MainWindow::updateBatteryVoltage(float battery_voltage)
 			// SET THE IMAGE FOR THE BATTERY STATUS LABEL
 			if (m_battery_label_image_current_index != BATTERY_LABEL_IMAGE_INDEX_EMPTY)
 			{
+				ui->battery_status_label->clear();
 				QPixmap battery_empty_pixmap(":/images/battery_empty.png");
 				ui->battery_status_label->setPixmap(battery_empty_pixmap);
 				ui->battery_status_label->setScaledContents(true);
@@ -618,6 +636,7 @@ void MainWindow::updateBatteryVoltage(float battery_voltage)
 				if (m_battery_label_image_current_index != BATTERY_LABEL_IMAGE_INDEX_EMPTY)
 				{
 					// SET THE IMAGE FOR THE BATTERY STATUS LABEL
+					ui->battery_status_label->clear();
 					QPixmap battery_empty_pixmap(":/images/battery_empty.png");
 					ui->battery_status_label->setPixmap(battery_empty_pixmap);
 					ui->battery_status_label->setScaledContents(true);
@@ -634,6 +653,7 @@ void MainWindow::updateBatteryVoltage(float battery_voltage)
 				if (m_battery_label_image_current_index != BATTERY_LABEL_IMAGE_INDEX_20)
 				{
 					// SET THE IMAGE FOR THE BATTERY STATUS LABEL
+					ui->battery_status_label->clear();
 					QPixmap battery_20_pixmap(":/images/battery_20.png");
 					ui->battery_status_label->setPixmap(battery_20_pixmap);
 					ui->battery_status_label->setScaledContents(true);
@@ -650,6 +670,7 @@ void MainWindow::updateBatteryVoltage(float battery_voltage)
 				if (m_battery_label_image_current_index != BATTERY_LABEL_IMAGE_INDEX_40)
 				{
 					// SET THE IMAGE FOR THE BATTERY STATUS LABEL
+					ui->battery_status_label->clear();
 					QPixmap battery_40_pixmap(":/images/battery_40.png");
 					ui->battery_status_label->setPixmap(battery_40_pixmap);
 					ui->battery_status_label->setScaledContents(true);
@@ -666,6 +687,7 @@ void MainWindow::updateBatteryVoltage(float battery_voltage)
 				if (m_battery_label_image_current_index != BATTERY_LABEL_IMAGE_INDEX_60)
 				{
 					// SET THE IMAGE FOR THE BATTERY STATUS LABEL
+					ui->battery_status_label->clear();
 					QPixmap battery_60_pixmap(":/images/battery_60.png");
 					ui->battery_status_label->setPixmap(battery_60_pixmap);
 					ui->battery_status_label->setScaledContents(true);
@@ -682,6 +704,7 @@ void MainWindow::updateBatteryVoltage(float battery_voltage)
 				if (m_battery_label_image_current_index != BATTERY_LABEL_IMAGE_INDEX_80)
 				{
 					// SET THE IMAGE FOR THE BATTERY STATUS LABEL
+					ui->battery_status_label->clear();
 					QPixmap battery_80_pixmap(":/images/battery_80.png");
 					ui->battery_status_label->setPixmap(battery_80_pixmap);
 					ui->battery_status_label->setScaledContents(true);
@@ -694,6 +717,7 @@ void MainWindow::updateBatteryVoltage(float battery_voltage)
 				if (m_battery_label_image_current_index != BATTERY_LABEL_IMAGE_INDEX_FULL)
 				{
 					// SET THE IMAGE FOR THE BATTERY STATUS LABEL
+					ui->battery_status_label->clear();
 					QPixmap battery_full_pixmap(":/images/battery_full.png");
 					ui->battery_status_label->setPixmap(battery_full_pixmap);
 					ui->battery_status_label->setScaledContents(true);
@@ -709,6 +733,7 @@ void MainWindow::updateBatteryVoltage(float battery_voltage)
         	if (m_battery_label_image_current_index != BATTERY_LABEL_IMAGE_INDEX_UNKNOWN)
 			{
 	            // SET THE IMAGE FOR THE BATTERY STATUS LABEL
+	            ui->battery_status_label->clear();
 	            QPixmap battery_unknown_pixmap(":/images/battery_unknown.png");
 	            ui->battery_status_label->setPixmap(battery_unknown_pixmap);
 	            ui->battery_status_label->setScaledContents(true);
@@ -718,7 +743,7 @@ void MainWindow::updateBatteryVoltage(float battery_voltage)
 			break;
         }
 	}
-	//ui->battery_status_label->update();
+	battery_status_label_mutex.unlock();
 }
 
 void MainWindow::CFBatteryCallback(const std_msgs::Float32& msg)
-- 
GitLab