{
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':
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();
\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
\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
#include "tactondebug.h"\r
\r
+#include <QDebug>\r
int TactonDebug::MaxFrequency = 400;\r
int TactonDebug::MaxAmplitude = 255;\r
int TactonDebug::MaxDuration = 2000;\r
catch(...)\r
{\r
_tactonPlayer = NULL;\r
+ qDebug() << "No wristband found";\r
}\r
\r
setupUi(this);\r
#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
//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
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
#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