浏览代码

implemented Launchpad::getKeyPressed()

Fabian Peter Hammerle 10 年之前
父节点
当前提交
adc03f3b2c
共有 4 个文件被更改,包括 37 次插入0 次删除
  1. 22 0
      Launchpad.cpp
  2. 5 0
      Launchpad.h
  3. 5 0
      LaunchpadScreen.cpp
  4. 5 0
      LaunchpadScreen.h

+ 22 - 0
Launchpad.cpp

@@ -34,6 +34,14 @@ Launchpad::Launchpad()
 	{
 		throw "no launchpad for midi input found";
 	}
+
+	for(KeyCoordinate x = 0; x < width; x++) {
+		for(KeyCoordinate y = 0; y < height; y++) {
+			if(x != 8 || y != 8) {
+				setKeyPressed(x, y, false);
+			}
+		}
+	}
 }
 
 void Launchpad::midiMessageCallback(double timeStamp, Message &message, void *userData)
@@ -134,8 +142,15 @@ void Launchpad::setColorAll(const LaunchpadColor& color)
 	}
 }
 
+bool Launchpad::getKeyPressed(KeyCoordinate x, KeyCoordinate y)
+{
+    return keyBeingPressed[x][y];
+}
+
 void Launchpad::keyPressed(unsigned char x, unsigned char y)
 {
+    setKeyPressed(x, y, true);
+
 	if(keyPressedCallback)
 	{
 		keyPressedCallback(x, y, keyEventCallbackData);
@@ -148,6 +163,13 @@ void Launchpad::keyReleased(unsigned char x, unsigned char y)
 	{
 		keyReleasedCallback(x, y, keyEventCallbackData);
 	}
+
+    setKeyPressed(x, y, false);
+}
+
+void Launchpad::setKeyPressed(KeyCoordinate x, KeyCoordinate y, bool pressed)
+{
+    keyBeingPressed[x][y] = pressed;
 }
 
 } // namespace

+ 5 - 0
Launchpad.h

@@ -3,12 +3,14 @@
 #include "Output.h"
 #include "LaunchpadColor.h"
 #include <utility>
+#include <atomic>
 
 namespace midi {
 
 class Launchpad
 {
 public:
+    typedef unsigned char KeyCoordinate;
 	typedef void (*KeyEventCallback)(unsigned char x, unsigned char y, void* data);
 	
 	static const unsigned char width = 9;
@@ -17,6 +19,7 @@ public:
 private:
 	LaunchpadColor colors[width][height];
 	bool colorSet[width][height];
+    std::atomic<bool> keyBeingPressed[width][height];
 
 protected:
 	Input midiin;
@@ -33,6 +36,7 @@ public:
 	const LaunchpadColor& getColor(unsigned char x, unsigned char y) const;
 	void setColor(unsigned char x, unsigned char y, const LaunchpadColor& color);
 	void setColorAll(const LaunchpadColor& color);
+    bool getKeyPressed(KeyCoordinate x, KeyCoordinate y);
 
 protected:
 	void keyPressed(unsigned char x, unsigned char y);
@@ -40,6 +44,7 @@ protected:
 
 private:
 	static void midiMessageCallback(double timeStamp, Message &message, void *launchpad);
+    void setKeyPressed(KeyCoordinate x, KeyCoordinate y, bool pressed);
 };
 
 };

+ 5 - 0
LaunchpadScreen.cpp

@@ -49,6 +49,11 @@ void LaunchpadScreen::sync()
 	}
 }
 
+bool LaunchpadScreen::getKeyPressed(KeyCoordinate x, KeyCoordinate y)
+{
+    return enabled() && launchpad->getKeyPressed(x, y);
+}
+
 LaunchpadScreen::LaunchpadScreen()
     : launchpad(0), active(false)
 {

+ 5 - 0
LaunchpadScreen.h

@@ -6,6 +6,10 @@ namespace midi {
 
 class LaunchpadScreen
 {
+public:
+    typedef Launchpad::KeyCoordinate KeyCoordinate;
+
+private:
     LaunchpadColor colors[Launchpad::width][Launchpad::height];
     Launchpad* launchpad;
     bool active;
@@ -24,6 +28,7 @@ protected:
 	void setColor(unsigned char x, unsigned char y, const LaunchpadColor& color);
 	void setColorAll(const LaunchpadColor& color);
     void sync();
+    bool getKeyPressed(KeyCoordinate x, KeyCoordinate y);
 
 private:
     static void keyPressedCallback(unsigned char x, unsigned char y, void* screen);