From 2e31a030ba063252c3d42662af894ea35bb0d2be Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Daniel=20M=C3=BCller?= <d_muel20@uni-muenster.de>
Date: Fri, 30 Nov 2018 17:39:26 +0100
Subject: [PATCH] * Some updates to the Barista Task

---
 Grinder/Version.h                          |  2 +-
 Grinder/task/tasks/BaristaProtocol.h       |  6 +++++-
 Grinder/task/tasks/BaristaTask.cpp         | 18 ++++++++++++++----
 Grinder/task/tasks/BaristaTask.h           |  7 ++++++-
 Grinder/task/tasks/BaristaTrainingTask.cpp | 16 +++++++++-------
 Grinder/task/tasks/BaristaTrainingTask.h   |  4 ++--
 Grinder/ui/task/TaskWidget.cpp             |  3 ++-
 7 files changed, 39 insertions(+), 17 deletions(-)

diff --git a/Grinder/Version.h b/Grinder/Version.h
index bb9b2eb..3989e7f 100644
--- a/Grinder/Version.h
+++ b/Grinder/Version.h
@@ -17,7 +17,7 @@
 #define GRNDR_VERSION_MAJOR		0
 #define GRNDR_VERSION_MINOR		10
 #define GRNDR_VERSION_REVISION	0
-#define GRNDR_VERSION_BUILD		290
+#define GRNDR_VERSION_BUILD		291
 
 namespace grndr
 {
diff --git a/Grinder/task/tasks/BaristaProtocol.h b/Grinder/task/tasks/BaristaProtocol.h
index abbdef9..97dd237 100644
--- a/Grinder/task/tasks/BaristaProtocol.h
+++ b/Grinder/task/tasks/BaristaProtocol.h
@@ -7,9 +7,13 @@
 #define BARISTAPROTOCOL_H
 
 #define BARISTA_COMMAND_SETLIBRARY "setlibrarypath"
+
 #define BARISTA_COMMAND_STARTTRAINING "starttraining"
-#define BARISTA_COMMAND_UPDATE "iterationupdate"
+#define BARISTA_COMMAND_PAUSETRAINING "pausetraining"
+#define BARISTA_COMMAND_RESUMETRAINING "starttraining"
 #define BARISTA_COMMAND_TRAININGDONE "trainingfinished"
+#define BARISTA_COMMAND_UPDATE "iterationupdate"
+
 #define BARISTA_COMMAND_SHUTDOWN "shutdown"
 
 #endif
diff --git a/Grinder/task/tasks/BaristaTask.cpp b/Grinder/task/tasks/BaristaTask.cpp
index 50d13e6..7b4a34c 100644
--- a/Grinder/task/tasks/BaristaTask.cpp
+++ b/Grinder/task/tasks/BaristaTask.cpp
@@ -38,6 +38,16 @@ void BaristaTask::deserialize(DeserializationContext& ctx)
 	_libraryPath = ctx.settings()(Serialization_Value_LibraryPath).toString();
 }
 
+void BaristaTask::execute()
+{
+	initiateBaristaConnection();
+}
+
+void BaristaTask::stop()
+{
+	shutdownBaristaConnection();
+}
+
 void BaristaTask::initiateBaristaConnection()
 {
 	changeTaskState(TaskState::Initiating);
@@ -79,10 +89,10 @@ void BaristaTask::shutdownBaristaConnection(bool shutdownBarista)
 
 	if (shutdownBarista)
 	{
-		if (_requestSocket && _taskState > TaskState::Initiating)
+		if (_requestSocket)
 		{
 			BaristaMessage shutdownMessage{BARISTA_COMMAND_SHUTDOWN};
-			sendMessage(shutdownMessage, _requestSocket);
+			sendMessage(shutdownMessage, _requestSocket, true, false);
 		}
 	}
 
@@ -156,7 +166,7 @@ bool BaristaTask::decodeMessage(const zmq::message_t& message, SettingsContainer
 	return true;
 }
 
-void BaristaTask::sendMessage(const SettingsContainer& settings, std::unique_ptr<zmq::socket_t>& socket, bool receiveAck)
+void BaristaTask::sendMessage(const SettingsContainer& settings, std::unique_ptr<zmq::socket_t>& socket, bool receiveAck, bool blocking)
 {
 	// Just encode the message and send it over the socket
 	zmq::message_t message;
@@ -164,7 +174,7 @@ void BaristaTask::sendMessage(const SettingsContainer& settings, std::unique_ptr
 	if (encodeMessage(message, settings))
 	{
 		try {
-			socket->send(message);
+			socket->send(message, blocking ? ZMQ_DONTWAIT : 0);
 		} catch (std::exception& e) {
 			// Ignore ZMQ errors here
 		}
diff --git a/Grinder/task/tasks/BaristaTask.h b/Grinder/task/tasks/BaristaTask.h
index a640ec8..d8978a5 100644
--- a/Grinder/task/tasks/BaristaTask.h
+++ b/Grinder/task/tasks/BaristaTask.h
@@ -37,6 +37,10 @@ namespace grndr
 		virtual void serialize(SerializationContext& ctx) const override;
 		virtual void deserialize(DeserializationContext& ctx) override;
 
+	protected:
+		virtual void execute() override;
+		virtual void stop() override;
+
 	protected:
 		void initiateBaristaConnection();
 		void shutdownBaristaConnection(bool shutdownBarista = true);
@@ -46,7 +50,7 @@ namespace grndr
 	protected:
 		bool encodeMessage(zmq::message_t& message, const SettingsContainer& settings);
 		bool decodeMessage(const zmq::message_t& message, SettingsContainer& settings);
-		void sendMessage(const SettingsContainer& settings, std::unique_ptr<zmq::socket_t>& socket, bool receiveAck = true);
+		void sendMessage(const SettingsContainer& settings, std::unique_ptr<zmq::socket_t>& socket, bool receiveAck = true, bool blocking = true);
 
 		bool checkMessageStatus(BaristaMessage& message) const;
 
@@ -68,6 +72,7 @@ namespace grndr
 		void handleSettingLibrary(const SettingsContainer& messageData);
 
 		void sendSetLibraryMessage();
+		void sendPauseMessage(bool setPause);
 
 	protected:
 		unsigned int _baristaPort{6980};
diff --git a/Grinder/task/tasks/BaristaTrainingTask.cpp b/Grinder/task/tasks/BaristaTrainingTask.cpp
index 8bc5015..cd0f1ec 100644
--- a/Grinder/task/tasks/BaristaTrainingTask.cpp
+++ b/Grinder/task/tasks/BaristaTrainingTask.cpp
@@ -42,14 +42,9 @@ void BaristaTrainingTask::deserialize(DeserializationContext& ctx)
 	_solverPath = ctx.settings()(Serialization_Value_SolverPath).toString();
 }
 
-void BaristaTrainingTask::execute()
+void BaristaTrainingTask::pause(bool setPause)
 {
-	initiateBaristaConnection();
-}
-
-void BaristaTrainingTask::stop()
-{
-	shutdownBaristaConnection();
+	sendPauseTrainingMessage(setPause);
 }
 
 void BaristaTrainingTask::baristaReady()
@@ -147,3 +142,10 @@ void BaristaTrainingTask::sendStartTrainingMessage()
 
 	sendMessage(message, _requestSocket);
 }
+
+void BaristaTrainingTask::sendPauseTrainingMessage(bool setPause)
+{
+	BaristaMessage message{setPause ? BARISTA_COMMAND_PAUSETRAINING : BARISTA_COMMAND_RESUMETRAINING};
+
+	sendMessage(message, _requestSocket);
+}
diff --git a/Grinder/task/tasks/BaristaTrainingTask.h b/Grinder/task/tasks/BaristaTrainingTask.h
index 4b6cf8c..72ffe74 100644
--- a/Grinder/task/tasks/BaristaTrainingTask.h
+++ b/Grinder/task/tasks/BaristaTrainingTask.h
@@ -37,8 +37,7 @@ namespace grndr
 		virtual void deserialize(DeserializationContext& ctx) override;
 
 	protected:
-		virtual void execute() override;
-		virtual void stop() override;
+		virtual void pause(bool setPause) override;
 
 	protected:
 		virtual void baristaReady() override;
@@ -51,6 +50,7 @@ namespace grndr
 		void handleTraining(const SettingsContainer& messageData);
 
 		void sendStartTrainingMessage();
+		void sendPauseTrainingMessage(bool setPause);
 
 	protected:
 		enum WorkerTaskState
diff --git a/Grinder/ui/task/TaskWidget.cpp b/Grinder/ui/task/TaskWidget.cpp
index d61344d..c9fdc96 100644
--- a/Grinder/ui/task/TaskWidget.cpp
+++ b/Grinder/ui/task/TaskWidget.cpp
@@ -113,7 +113,8 @@ void TaskWidget::updateUi()
 		ui->progressBar->setValue(task->getProgress() * 100.0f);
 
 		ui->btnStart->setEnabled(!task->isRunning() || task->getCapabilities().testFlag(Task::Capability::CanBePaused));
-		ui->btnStart->setIcon(QIcon{task->isRunning() ?  FILE_ICON_PAUSE : FILE_ICON_START});
+		ui->btnStart->setIcon(QIcon{task->isRunning() && !task->isPaused() ?  FILE_ICON_PAUSE : FILE_ICON_START});
+		ui->btnStart->setToolTip(task->isRunning() && !task->isPaused() ? "Pause task" : (task->isRunning() ? "Resume task" : "Start task"));
 		ui->btnStop->setEnabled(task->isRunning());
 		ui->btnRefresh->setEnabled(task->isRunning() && task->getCapabilities().testFlag(Task::Capability::CanBeRefreshed));
 
-- 
GitLab