Added support for sidekeys
authorThomas Pietrzak <thomas.pietrzak@gmail.com>
Thu, 30 Aug 2012 08:50:32 +0000 (08:50 +0000)
committerThomas Pietrzak <thomas.pietrzak@gmail.com>
Thu, 30 Aug 2012 08:50:32 +0000 (08:50 +0000)
git-svn-id: svn+ssh://thomaspietrzak.com/var/svn/rep@92 47cf9a05-e0a8-4ed5-9e9b-101a649bc004

Arduino/dynamickeyboard/dynamickeyboard.ino

index 276149dffb00c06ab0086b932841d3afe9e91794..7dcf20fed787a9f47f78a1d71c694f567a41c2f6 100644 (file)
@@ -10,6 +10,12 @@ byte maxDutyCycle = 255;
 byte minDutyCycle = 200;
 word boostDuration = 150;
 
+//TODO: manage any number of keys
+byte keySides1[4];
+byte keySides2[4];
+int keyPins1[4];
+int keyPins2[4];
+
 byte command = 0;
 
 void sendInformation()
@@ -45,6 +51,22 @@ void setup()
   pinMode(strobePin, OUTPUT);
   pinMode(pwmPin, OUTPUT);
   SPI.begin();
+  
+  keyPins1[0] = A0;
+  keyPins1[1] = A1;
+  keyPins1[2] = A2;
+  keyPins1[3] = A3;
+  keyPins2[0] = A4;
+  keyPins2[1] = A5;
+  keyPins2[2] = A6;
+  keyPins2[3] = A7;
+  
+  for (int i = 0 ; i < 4 ; i++)
+  {
+    keySides1[i] = 0;
+    keySides2[i] = 0;
+  }
+
 /*
   pinMode(clockPin, OUTPUT);
   pinMode(dataPin, OUTPUT);
@@ -57,6 +79,62 @@ void setup()
   analogWrite(pwmPin, minDutyCycle);
 }
 
+/*
+  Event protocol:
+  FkTRBL
+  F: event type (force)
+  k: key ID
+  T: force on the top
+  R: force on the right
+  B: force on the bottom
+  L: force on the left
+*/
+//TODO: manage any number of keys
+void checkEvents()
+{
+  boolean newevent = false;
+  
+  //check key1
+  for (int i = 0 ; i < 4 ; i++)
+  {
+    byte b = analogRead(keyPins1[i]);
+    //check if the state has changed
+    if ((keySides1[i] == 0 && b > 0) || (keySides1[i] > 0 && b == 0))
+    {
+      keySides1[i] = b;
+      newevent = true;
+    }
+  }
+  if (newevent)
+  {
+      Serial.write("F");
+      Serial.write(1);
+      for (int i = 0 ; i < 4 ; i++)
+        Serial.print(keySides1[i]);
+      newevent = false;
+  }
+
+  //check key2
+  for (int i = 0 ; i < 4 ; i++)
+  {
+    byte b = analogRead(keyPins2[i]);
+    //check if the state has changed
+    if ((keySides2[i] == 0 && b > 0) || (keySides2[i] > 0 && b == 0))
+    {
+      keySides2[i] = b;
+      newevent = true;
+    }
+  }
+  if (newevent)
+  {
+      Serial.write("F");
+      Serial.write(2);
+      for (int i = 0 ; i < 4 ; i++)
+        Serial.print(keySides2[i]);
+      newevent = false;
+  }
+}
+
 /*
   Protocol:
   cXYZ...  where c is a character (byte) representing the command
@@ -83,7 +161,7 @@ void setup()
            be used too often
     I      send information (parameters)
 */
-void loop()
+void readCommands()
 {
   if (Serial.available() == 0)
     return;
@@ -152,4 +230,9 @@ void loop()
       break;
   } 
 }
-\r
+
+void loop()
+{
+  checkEvents();
+  readCommands();
+}\r