{\r
if (nbtactors != _nbtactors)\r
return;\r
+\r
+ //clear\r
+ TCCR1A = 0;\r
+ //set duty cycle to 0\r
+ OCR1A = 0;\r
+ OCR1B = 0;\r
\r
sei();\r
init();\r
{
byte index;
unsigned long timestamp;
+ unsigned int freq;
if (Serial.available() > 0)
{
command = 0;
}
break;
- //sets a frequency for all the vibrators and an amplitude for each one
- // BnFFa1a2...an
+ //sets an amplitude for each vibrator
+ // Ana1a2...an
// n = nb tactors (1 byte)
- // FF = frequency (2 bytes)
// A1, A2, ..., an : amplitudes (1 byte per tactor)
- case 'B':
+ case 'A':
if (nbf == 0 && Serial.available() >= 1)
nbf = (unsigned int) Serial.read();
if (nbf > 0)
{
//DO NOT OVERFLOW max(nbf): 60
- while (posbuf < nbf + 2 && Serial.available() > 0)
+ while (posbuf < nbf && Serial.available() > 0)
{
buffer[posbuf] = Serial.read();
posbuf++;
}
- if (posbuf >= nbf + 2)
+ if (posbuf >= nbf)
{
- manager.buzz(nbf, buffer);
+ manager.setAmplitudes(nbf, buffer);
posbuf = 0;
command = 0;
nbf = 0;
}
}
break;
+ //sets the frequency
+ case 'F':
+ if (Serial.available() >= 2)
+ {
+ freq = (((unsigned long)Serial.read()) << 8) | \
+ (((unsigned long)Serial.read()));
+ manager.setFrequency(freq);
+ command = 0;
+ }
+ break;
//stop any vibration
- case 'A':
+ case 'B':
manager.stop();
command = 0;
break;
setDirection(_direction->currentText());\r
setResolution(_resolution->value());\r
setSpeed(_speed->value());\r
+ setFrequency(_frequency->value());\r
\r
connect(_play, SIGNAL(clicked(bool)), this, SLOT(play(bool)));\r
connect(_stop, SIGNAL(clicked(bool)), this, SLOT(stop(bool)));\r
connect(_direction, SIGNAL(editTextChanged(const QString &)), this, SLOT(setDirection(const QString &)));\r
connect(_speed, SIGNAL(valueChanged(int)), this, SLOT(setSpeed(int)));\r
connect(_resolution, SIGNAL(valueChanged(int)), this, SLOT(setResolution(int)));\r
+ connect(_frequency, SIGNAL(valueChanged(int)), this, SLOT(setFrequency(int)));\r
\r
connect(this, SIGNAL(setAngle(float)), SLOT(tactileFeedback(float)));\r
connect(this, SIGNAL(setAngle(float)), SLOT(visualFeedback(float)));\r
setSpeed(_speed->value());\r
}\r
\r
+void MagicCircle::setFrequency(int frequency)\r
+{\r
+ _tactonPlayer->setFrequency(frequency);\r
+}\r
+\r
void MagicCircle::tactileFeedback(float angle)\r
{\r
unsigned char amplitudes[4];\r
else\r
amplitudes[2] = - 255 * cos(angle * M_PI / 180);\r
\r
- _tactonPlayer->buzz(_frequency->value(), 4, amplitudes);\r
+ _tactonPlayer->setAmplitudes(4, amplitudes);\r
}\r
\r
void MagicCircle::visualFeedback(float)\r
void setDirection(const QString &);\r
void setSpeed(int);\r
void setResolution(int);\r
+ void setFrequency(int);\r
\r
void tactileFeedback(float);\r
void visualFeedback(float);\r
<number>1</number>\r
</property>\r
<property name="maximum">\r
- <number>720</number>\r
+ <number>3000</number>\r
</property>\r
<property name="value">\r
- <number>30</number>\r
+ <number>180</number>\r
</property>\r
</widget>\r
</item>\r
<number>360</number>\r
</property>\r
<property name="value">\r
- <number>16</number>\r
+ <number>360</number>\r
</property>\r
</widget>\r
</item>\r
<number>400</number>\r
</property>\r
<property name="value">\r
- <number>250</number>\r
+ <number>300</number>\r
</property>\r
</widget>\r
</item>\r
_comport->WriteData(buffer, 6);\r
}\r
\r
-void TactonPlayer::buzz(unsigned int frequency, unsigned int nbtactors, unsigned char *amplitudes)\r
+void TactonPlayer::setFrequency(unsigned int frequency)\r
{\r
if (!_comport)\r
return;\r
\r
- unsigned char *buffer = new unsigned char[4 + nbtactors];\r
- buffer[0] = 'B';\r
+ unsigned char buffer[3];\r
+ buffer[0] = 'F';\r
+ buffer[1] = (unsigned char)((frequency & 0x0000ff00) >> 8);\r
+ buffer[2] = (unsigned char)(frequency & 0x000000ff);\r
+ _comport->WriteData(buffer, 3);\r
+}\r
+\r
+void TactonPlayer::setAmplitudes(unsigned int nbtactors, unsigned char *amplitudes)\r
+{\r
+ if (!_comport)\r
+ return;\r
+\r
+ unsigned char *buffer = new unsigned char[2 + nbtactors];\r
+ buffer[0] = 'A';\r
buffer[1] = nbtactors;\r
- buffer[2] = (unsigned char)((frequency & 0x0000ff00) >> 8);\r
- buffer[3] = (unsigned char)(frequency & 0x000000ff);\r
- memcpy(buffer + 4, amplitudes, nbtactors);\r
- _comport->WriteData(buffer, 4 + nbtactors);\r
+ memcpy(buffer + 2, amplitudes, nbtactors);\r
+ _comport->WriteData(buffer, 2 + nbtactors);\r
delete[] buffer;\r
}\r
\r
if (!_comport)\r
return;\r
\r
- _comport->WriteData("A", 1);\r
+ _comport->WriteData("B", 1);\r
}\r
\r
void TactonPlayer::debugRead(char *res, int nb) const\r
//schedule the play of a registered tacton\r
EXPORTED void schedule(unsigned char index, unsigned long timestamp);\r
\r
- //sets a given frequency for all vibrators, and an amplitude for each vibrator\r
- //vibrates until explicitely stop\r
- EXPORTED void buzz(unsigned int frequency, unsigned int nbtactors, unsigned char *amplitudes);\r
+ //sets an amplitude for each vibrator\r
+ EXPORTED void setAmplitudes(unsigned int nbtactors, unsigned char *amplitudes);\r
+ //sets a frequency for all vibrator\r
+ EXPORTED void setFrequency(unsigned int frequency);\r
//stop any vibration\r
EXPORTED void stopBuzz();\r
\r