{\r
_player->stop();\r
}\r
+\r
+void TactonManager::setAngle(unsigned int angle)\r
+{\r
+ _player->setAngle(angle);\r
+}\r
+\r
+void TactonManager::setAngleSequence(unsigned int nbangles, unsigned int frameduration, unsigned int nbframes, byte *angles)\r
+{/*\r
+ Serial.print("Nb angles ");\r
+ Serial.println(nbangles);\r
+ Serial.print("Frame duration ");\r
+ Serial.println(frameduration);\r
+ Serial.print("Nb frames ");\r
+ Serial.println(nbframes);*/\r
+ \r
+ unsigned int a[nbangles];\r
+ for (int i = 0 ; i < nbangles ; i++)\r
+ a[i] = (angles[2 * i] << 8) |angles[2 * i + 1];\r
+ \r
+ for (int i = 0 ; i < nbframes ; i++)\r
+ {\r
+ setAngle(a[i % nbangles]);\r
+/* Serial.print("Angle ");\r
+ Serial.println(a[i % nbangles]);*/\r
+ // /!\ don't forget to multiply if the timer was changed in TactonPlayer\r
+ delay(64 * frameduration);\r
+ }\r
+ _player->clear();\r
+}\r
void setAmplitudes(unsigned int nbf, byte *desc);\r
void setFrequency(unsigned int freq);\r
void stop();\r
+ //angle in degrees made with 4 vibrators\r
+ void setAngle(unsigned int angle);\r
+ void setAngleSequence(unsigned int nbangles, unsigned int frameduration, unsigned int nbframes, byte *angles);\r
\r
\r
void clear();\r
} \r
}\r
\r
+void TactonPlayer::clear()\r
+{\r
+ for (int i = 0 ; i < _nbtactors ; i++)\r
+ digitalWrite(_pins[i], LOW);\r
+}\r
+\r
+\r
void __cxa_pure_virtual(void) {};
\ No newline at end of file
//if using more than 8, change type of pattern\r
#define MAXTACTORS 8\r
\r
+#define TACTOR_RIGHT 0\r
+#define TACTOR_UP 1\r
+#define TACTOR_LEFT 2\r
+#define TACTOR_DOWN 3\r
+\r
extern "C" void __cxa_pure_virtual(void); \r
\r
class TactonPlayer \r
//set a different amplitude for each vibrator\r
virtual void setAmplitudes(byte nbtactors, byte amplitudes[]) = 0;\r
// virtual void setPattern(byte pattern) { _pattern = pattern; }\r
+ virtual void setAngle(unsigned int angle) = 0;\r
\r
\r
//Stop any vibration\r
virtual void stop() = 0;\r
+ \r
+ //Clear the pattern, the frequency remains\r
+ virtual void clear();\r
\r
//8bits pattern => max 8 tactors, change type if using more\r
virtual void beep(byte pattern, unsigned long duration, unsigned int frequency, byte amplitude) = 0;\r
\r
//set prescalar for timer0 and timer2 to 1\r
// /!\ this affects delay!\r
+ TCCR0B |= (1 << CS00);\r
TCCR0B &= ~(1 << CS01);\r
+ TCCR0B &= ~(1 << CS02);\r
+ TCCR2B |= (1 << CS20);\r
TCCR2B &= ~(1 << CS21);\r
+ TCCR2B &= ~(1 << CS22);\r
}\r
\r
void TactonPlayerPreciseNew::setFrequency(unsigned int frequency)\r
analogWrite(_pins[i], amplitudes[i]);\r
}\r
\r
+void TactonPlayerPreciseNew::setAngle(unsigned int angle)\r
+{\r
+ //vertical\r
+ if (angle < 180)\r
+ {\r
+ analogWrite(_pins[TACTOR_UP], 255 * sin(angle * M_PI / 180.0));\r
+ analogWrite(_pins[TACTOR_DOWN], 0);\r
+ }\r
+ else\r
+ {\r
+ analogWrite(_pins[TACTOR_DOWN], - 255 * sin(angle * M_PI / 180.0));\r
+ analogWrite(_pins[TACTOR_UP], 0);\r
+ }\r
+\r
+ //horizontal\r
+ if (angle < 90 || angle > 270)\r
+ {\r
+ analogWrite(_pins[TACTOR_RIGHT], 255 * cos(angle * M_PI / 180.0));\r
+ analogWrite(_pins[TACTOR_LEFT], 0);\r
+ }\r
+ else\r
+ {\r
+ analogWrite(_pins[TACTOR_RIGHT], 0);\r
+ analogWrite(_pins[TACTOR_LEFT], - 255 * cos(angle * M_PI / 180.0));\r
+ }\r
+}\r
+\r
+\r
//Stop any vibration\r
void TactonPlayerPreciseNew::stop()\r
{\r
OCR1A = 0;\r
OCR1B = 0;\r
//clear the pattern\r
- for (int i = 0 ; i < _nbtactors ; i++)\r
- digitalWrite(_pins[i], LOW);\r
+ clear(); \r
}\r
-\r
+ \r
//Play a Tacton for a specified duration, frequency and amplitude\r
void TactonPlayerPreciseNew::beep(byte pattern, unsigned long duration, unsigned int frequency, byte amplitude)\r
{
void setFrequency(unsigned int frequency);\r
//sets a different amplitude for each vibrator\r
void setAmplitudes(byte nbtactors, byte *amplitudes);\r
+ \r
+ void setAngle(unsigned int angle);\r
\r
//Stop any vibration\r
void stop();\r