Add support for angles on hardware, fixed PWM frequency
authorThomas Pietrzak <thomas.pietrzak@gmail.com>
Tue, 11 Sep 2012 10:36:36 +0000 (10:36 +0000)
committerThomas Pietrzak <thomas.pietrzak@gmail.com>
Tue, 11 Sep 2012 10:36:36 +0000 (10:36 +0000)
git-svn-id: svn+ssh://thomaspietrzak.com/var/svn/rep@99 47cf9a05-e0a8-4ed5-9e9b-101a649bc004

Arduino/wristbandTactons/wristbandTactons.ino
TactonDebug/MagicCircle/magiccircle.cpp
TactonDebug/TactonDebug.suo
TactonDebug/TactonDebug/tactondebug.cpp
TactonLibrary.suo
TactonPlayer/Tacton.hpp
TactonPlayer/TactonPlayer.cpp
TactonPlayer/TactonPlayer.hpp

index 0e4e14b36ded8dca0227a010306e1fef653e0c89..a0e4df7956f4a75f9a0779e4f2ef0404dc3ebc85 100644 (file)
@@ -29,13 +29,13 @@ void loop()
 {
   byte index;
   unsigned long timestamp;
-  unsigned int freq;
+  unsigned int param;
 
   if (Serial.available() > 0)
   {
     if (command == 0)
       command = Serial.read();
-      switch(command)
+    switch(command)
     {
     //set the timestamp to 0, and watch for scheduled tactons
     case 'S':
@@ -154,12 +154,52 @@ void loop()
     case 'F':
       if (Serial.available() >= 2)
       {
-        freq = (((unsigned long)Serial.read()) << 8) | \
+        param = (((unsigned long)Serial.read()) << 8) | \
             (((unsigned long)Serial.read()));
-        manager.setFrequency(freq);
+        manager.setFrequency(param);
         command = 0;
       }
       break;
+    //sets an angle in degrees
+    case 'a':
+      if (Serial.available() >= 2)
+      {
+        param = (((unsigned long)Serial.read()) << 8) | \
+            (((unsigned long)Serial.read()));
+        manager.setAngle(param);
+        command = 0;
+      }
+      break;
+    //sets a series on angles
+    // sNDnA1A2...AN
+    // N = nb angles (1 byte)
+    // D = duration in ms of each frame (2 bytes)
+    // n = number of frames (2 bytes)
+    // A1, A2, ..., AN : angles (2 bytes per tactor)
+    case 's':
+      if (nbf == 0 && Serial.available() >= 1)
+        nbf = (unsigned int) Serial.read();
+      if (nbf > 0)
+      {
+        //DO NOT OVERFLOW max(nbf): 60
+        while (posbuf < 2 * nbf + 4 && Serial.available() > 0)
+        {
+          buffer[posbuf] = Serial.read();
+          //Serial.print(buffer[posbuf], HEX);
+          posbuf++;
+        }
+        if (posbuf >= 2 * nbf + 4)
+        {
+          manager.setAngleSequence(nbf, \
+            (buffer[0] << 8) | buffer[1], \
+            (buffer[2] << 8) | buffer[3], \
+            buffer + 4);
+          posbuf = 0;
+          command = 0;
+          nbf = 0;
+        }
+      }
+      break;
     //stop any vibration
     case 'B':
       manager.stop();
index ed257ea5d3117d23c18cfdaa0f2d7a99ae5f5648..8b883c716431f7e00c17fa3217efda82b5102027 100644 (file)
@@ -77,7 +77,7 @@ void MagicCircle::setDirection(const QString &direction)
 \r
 void MagicCircle::setSpeed(int speed)\r
 {\r
-       _timer.setInterval(_stepsize / speed * 1000);\r
+       _timer.setInterval(_stepsize / speed * 1000.0);\r
 }\r
 \r
 void MagicCircle::setResolution(int res)\r
@@ -93,6 +93,9 @@ void MagicCircle::setFrequency(int frequency)
 \r
 void MagicCircle::tactileFeedback(float angle)\r
 {\r
+       _tactonPlayer->playAngle(angle);// * M_PI / 180);\r
+       return;\r
+\r
        unsigned char amplitudes[4];\r
        memset(amplitudes, 0, 4);\r
 \r
index d16f968764d865f25a9fda3e3707072f7f1aa49f..a15620dbcdde91a5703ef73338db4931dcc47551 100644 (file)
Binary files a/TactonDebug/TactonDebug.suo and b/TactonDebug/TactonDebug.suo differ
index d25c25b434d58d0af3d7190adad3dd8852370d9e..e370ca70176fc1642a39ce4d34e398c51085cbcd 100644 (file)
@@ -1,5 +1,6 @@
 #include "tactondebug.h"\r
 \r
+#include <QDebug>\r
 int TactonDebug::MaxFrequency = 400;\r
 int TactonDebug::MaxAmplitude = 255;\r
 int TactonDebug::MaxDuration = 2000;\r
@@ -14,6 +15,7 @@ TactonDebug::TactonDebug(QWidget *parent, Qt::WFlags flags)
        catch(...)\r
        {\r
                _tactonPlayer = NULL;\r
+               qDebug() << "No wristband found";\r
        }\r
 \r
        setupUi(this);\r
index e0587c7bb029e66b609ec372846e0e3c1e8fe524..74821d47612720cb02978479b9aed2f9ec77af1b 100644 (file)
Binary files a/TactonLibrary.suo and b/TactonLibrary.suo differ
index d71859af01d2d1cda576e72520205f0f1c25bfaa..31cf63155c5ed31677203a0301edb9ee1e639598 100644 (file)
 #ifdef __MACOSX__\r
 #define EXPORTED\r
 #else\r
-#define EXPORTED __declspec(dllexport)\r
+       #ifdef _WINDLL\r
+       #define EXPORTED __declspec(dllexport)\r
+       #else \r
+       #define EXPORTED __declspec(dllimport)\r
+       #endif\r
 #endif\r
 \r
-class Tacton \r
+class EXPORTED Tacton \r
 {\r
        public:\r
                //creates a tacton using the raw data format\r
@@ -26,46 +30,46 @@ class Tacton
                //2 for the duration\r
                //2 for the frequency\r
                //1 for the amplitude\r
-               EXPORTED Tacton(unsigned int nbframes, unsigned char *desc);\r
+               Tacton(unsigned int nbframes, unsigned char *desc);\r
                //creates a tacton using the CSV format\r
                //1 field for the number of frames, then 4 fields per frame \r
                //1 for the pattern\r
                //1 for the duration\r
                //1 for the frequency\r
                //1 for the amplitude\r
-               EXPORTED Tacton(char *desc);\r
-               EXPORTED Tacton(unsigned int nbframes, unsigned char *patterns, unsigned int *durations, unsigned int *frequencies, unsigned char *amplitudes);\r
+               Tacton(char *desc);\r
+               Tacton(unsigned int nbframes, unsigned char *patterns, unsigned int *durations, unsigned int *frequencies, unsigned char *amplitudes);\r
                //create a simple vibration\r
-               EXPORTED Tacton(char *pattern, unsigned int duration, unsigned int frequency, unsigned char amplitude);\r
-               EXPORTED Tacton(const char *pattern, unsigned int duration, unsigned int frequency, unsigned char amplitude);\r
-               EXPORTED Tacton(unsigned char pattern, unsigned int duration, unsigned int frequency, unsigned char amplitude);\r
-               EXPORTED Tacton(const Tacton &t);\r
-               EXPORTED ~Tacton();\r
+               Tacton(char *pattern, unsigned int duration, unsigned int frequency, unsigned char amplitude);\r
+               Tacton(const char *pattern, unsigned int duration, unsigned int frequency, unsigned char amplitude);\r
+               Tacton(unsigned char pattern, unsigned int duration, unsigned int frequency, unsigned char amplitude);\r
+               Tacton(const Tacton &t);\r
+               ~Tacton();\r
 \r
                //changes the pattern using raw format\r
-               EXPORTED void setPattern(char pattern);\r
-               EXPORTED void setPattern(unsigned int frame, char pattern);\r
+               void setPattern(char pattern);\r
+               void setPattern(unsigned int frame, char pattern);\r
                //changes the pattern using string format\r
-               EXPORTED void setPattern(char *pattern);\r
-               EXPORTED void setPattern(const char *pattern);\r
-               EXPORTED void setPattern(unsigned int frame, char *pattern);\r
-               EXPORTED void setPattern(unsigned int frame, const char *pattern);\r
+               void setPattern(char *pattern);\r
+               void setPattern(const char *pattern);\r
+               void setPattern(unsigned int frame, char *pattern);\r
+               void setPattern(unsigned int frame, const char *pattern);\r
                //changes the duration\r
-               EXPORTED void setDuration(unsigned int duration);\r
-               EXPORTED void setDuration(unsigned int frame, unsigned int duration);\r
+               void setDuration(unsigned int duration);\r
+               void setDuration(unsigned int frame, unsigned int duration);\r
                //changes the frequency\r
-               EXPORTED void setFrequency(unsigned int frequency);\r
-               EXPORTED void setFrequency(unsigned int frame, unsigned int frequency);\r
+               void setFrequency(unsigned int frequency);\r
+               void setFrequency(unsigned int frame, unsigned int frequency);\r
                //changes the amplitude\r
-               EXPORTED void setAmplitude(unsigned int amplitude);\r
-               EXPORTED void setAmplitude(unsigned int frame, unsigned int amplitude);\r
+               void setAmplitude(unsigned int amplitude);\r
+               void setAmplitude(unsigned int frame, unsigned int amplitude);\r
 \r
                \r
                //returns the number of frames\r
-               EXPORTED const unsigned int getNbFrames() const;\r
+               const unsigned int getNbFrames() const;\r
 \r
                //returns the raw code (useful to send to the serial port)\r
-               EXPORTED void *rawCode() const;\r
+               void *rawCode() const;\r
 \r
        private:\r
                unsigned int _nbframes;\r
index 08687215c71e499ecd231365ceaa1d1eac728191..0b46a7c333290c54862675833f725d0f3c80cfe4 100644 (file)
@@ -144,6 +144,42 @@ void TactonPlayer::setAmplitudes(unsigned char nbtactors, unsigned char *amplitu
        delete[] buffer;\r
 }\r
 \r
+void TactonPlayer::playAngle(unsigned int angle)\r
+{\r
+       if (!_comport)\r
+               return;\r
+\r
+       unsigned char *buffer = new unsigned char[3];\r
+       buffer[0] = 'a';\r
+       buffer[1] = (unsigned char)((angle & 0x0000ff00) >> 8);\r
+       buffer[2] = (unsigned char)(angle & 0x000000ff);\r
+       _comport->WriteData(buffer, 3);\r
+       delete[] buffer;\r
+}\r
+\r
+//plays an animation alterning a series of angles\r
+void TactonPlayer::playAngleSequence(unsigned char nbangles, unsigned int frameduration, unsigned int nbframes, unsigned int *angles)\r
+{\r
+       if (!_comport)\r
+               return;\r
+\r
+       unsigned char *buffer = new unsigned char[6 + 2 * nbangles];\r
+       buffer[0] = 's';\r
+       buffer[1] = nbangles;\r
+       buffer[2] = (unsigned char)((frameduration & 0x0000ff00) >> 8);\r
+       buffer[3] = (unsigned char)(frameduration & 0x000000ff);\r
+       buffer[4] = (unsigned char)((nbframes & 0x0000ff00) >> 8);\r
+       buffer[5] = (unsigned char)(nbframes & 0x000000ff);\r
+\r
+       for (int i = 0 ; i < nbangles ; i++)\r
+       {\r
+               buffer[6 + 2 * i] = (angles[i]  & 0x0000ff00) >> 8;\r
+               buffer[6 + 2 * i + 1] = angles[i]  & 0x000000ff;\r
+       }\r
+       _comport->WriteData(buffer, 6 + 2 * nbangles);\r
+       delete[] buffer;\r
+}\r
+\r
 void TactonPlayer::stopBuzz()\r
 {\r
        if (!_comport)\r
index a5be7775b6439728aeeb30cbf651e5003527d586..c79e2aeb686f07d31ac5d6412bd9120535584677 100644 (file)
@@ -5,41 +5,51 @@
 #define EXPORTED\r
 #else\r
 #include <ArduinoSerial\Serial.hpp>\r
-#define EXPORTED __declspec(dllexport)\r
+       #ifdef _WINDLL\r
+       #define EXPORTED __declspec(dllexport)\r
+       #else\r
+       #define EXPORTED __declspec(dllimport)\r
+       #endif\r
 #endif\r
 \r
-class TactonPlayer\r
+class EXPORTED TactonPlayer\r
 {\r
        public:\r
-                       EXPORTED TactonPlayer(const char *port = "COM5");\r
-                       EXPORTED ~TactonPlayer();\r
+                       TactonPlayer(const char *port = "COM5");\r
+                       ~TactonPlayer();\r
 \r
                        //set the timestamp to 0, and watch for scheduled tactons\r
-                       EXPORTED void start();\r
+                       void start();\r
                        //stop watching scheduled tactons, and erase registered tactons\r
-                       EXPORTED void stop();\r
+                       void stop();\r
 \r
                        //register a tacton\r
-                       EXPORTED void regist(const Tacton &t);\r
+                       void regist(const Tacton &t);\r
                        //register a list of tactons in a file, returns the number of tactons loaded\r
-                       EXPORTED unsigned int registFile(char *filename);\r
+                       unsigned int registFile(char *filename);\r
 \r
                        //play a registered tacton\r
-                       EXPORTED void play(unsigned char index);\r
+                       void play(unsigned char index);\r
                        //play a specified tacton\r
-                       EXPORTED void play(const Tacton &t);\r
+                       void play(const Tacton &t);\r
                        //schedule the play of a registered tacton\r
-                       EXPORTED void schedule(unsigned char index, unsigned long timestamp);\r
+                       void schedule(unsigned char index, unsigned long timestamp);\r
 \r
                        //sets an amplitude for each vibrator\r
-                       EXPORTED void setAmplitudes(unsigned char nbtactors, unsigned char *amplitudes);\r
+                       void setAmplitudes(unsigned char nbtactors, unsigned char *amplitudes);\r
                        //sets a frequency for all vibrator\r
-                       EXPORTED void setFrequency(unsigned int frequency);\r
+                       void setFrequency(unsigned int frequency);\r
                        //stop any vibration\r
-                       EXPORTED void stopBuzz();\r
+                       void stopBuzz();\r
+\r
+                       //sets a vibration on a virtual circle around 4 vibrators\r
+                       void playAngle(unsigned int angle);\r
+\r
+                       //plays an animation alterning a series of angles\r
+                       void playAngleSequence(unsigned char nbangles, unsigned int frameduration, unsigned int nbframes, unsigned int *angles);\r
 \r
                        //read on the serial port\r
-                       EXPORTED void debugRead(char *res, int nb) const;\r
+                       void debugRead(char *res, int nb) const;\r
 \r
 private:\r
                Serial *_comport;\r