DJMFix.cpp
branchv_0
changeset 2 f34476ab597f
parent 1 98274757fcf6
child 5 ef8f4023e32e
--- a/DJMFix.cpp	Fri Dec 18 21:35:36 2020 +0100
+++ b/DJMFix.cpp	Fri Dec 18 23:19:32 2020 +0100
@@ -15,6 +15,9 @@
  * along with this program. If not, see <http://www.gnu.org/licenses/>.
  */
 #include <iostream>
+#include <thread>
+#include <chrono>
+#include <stdexcept>
 
 #include "DJMFix.h"
 
@@ -22,34 +25,55 @@
 
 class DJMFixImpl : public DJMFix {
 private:
-	MidiSender midiSender;
-public:
+	MidiSender* midiSender;
+	std::thread keepAliveThread;
+	bool running = false;
+	bool stopped = false;
 
-	DJMFixImpl(MidiSender midiSender) : midiSender(midiSender) {
-		std::cerr << "DJMFixImpl()" << std::endl; // TODO: do not mess STDIO
+	void run() {
+		while (!stopped) {
+			std::cerr << "DJMFixImpl::run()" << std::endl; // TODO: do not mess STDIO
+			// TODO: send keep-alive messages
+			std::this_thread::sleep_for(std::chrono::milliseconds(200));
+		}
 	}
 
+public:
+
 	virtual ~DJMFixImpl() override {
 		std::cerr << "~DJMFixImpl()" << std::endl; // TODO: do not mess STDIO
+		if (running) stop();
+	}
+
+	void setMidiSender(MidiSender* midiSender) {
+		std::cerr << "DJMFixImpl::setMidiSender()" << std::endl; // TODO: do not mess STDIO
+		this->midiSender = midiSender;
 	}
 
 	virtual void receive(MidiMessage midiMessage) override {
 		std::cerr << "DJMFixImpl::receive()" << std::endl; // TODO: do not mess STDIO
-
-		midiSender({0xf0, 0xf7});
 	}
 
 	void start() override {
 		std::cerr << "DJMFixImpl::start()" << std::endl; // TODO: do not mess STDIO
+		if (midiSender == nullptr) throw std::logic_error("need a midiSender when starting");
+		midiSender->send({0xf0, 0xf7});
+
+		keepAliveThread = std::thread(&DJMFixImpl::run, this);
+		running = true;
+
 	}
 
 	void stop() override {
+		stopped = true;
+		keepAliveThread.join();
+		running = false;
 		std::cerr << "DJMFixImpl::stop()" << std::endl; // TODO: do not mess STDIO
 	}
 };
 
-DJMFix* create(MidiSender midiSender) {
-	return new DJMFixImpl(midiSender);
+DJMFix* create() {
+	return new DJMFixImpl();
 }
 
 }