}*/\r
}\r
\r
-void TactonManager::buzz(unsigned int nbf, byte *desc)\r
+void TactonManager::setFrequency(unsigned int freq)\r
{\r
- byte *amplitudes = (byte *)malloc(nbf * sizeof(byte));\r
- if (amplitudes == NULL) \r
- return;\r
- \r
- for (unsigned int i = 0 ; i < nbf ; i++)\r
- amplitudes[i] = desc[i + 2];\r
+ _player->setFrequency(freq);\r
+}\r
\r
- unsigned int frequency = (((unsigned int)(desc[1])) << 8) | ((unsigned int)(desc[0]));\r
- _player->buzz(frequency, nbf, amplitudes);\r
- free(amplitudes);\r
+void TactonManager::setAmplitudes(unsigned int nbf, byte *desc)\r
+{\r
+ _player->setAmplitudes(nbf, desc);\r
}\r
\r
void TactonManager::stop()\r
void checkPlay();\r
void setOffset(unsigned long timestamp);\r
\r
- void buzz(unsigned int nbf, byte *desc);\r
+ void setAmplitudes(unsigned int nbf, byte *desc);\r
+ void setFrequency(unsigned int freq);\r
void stop();\r
\r
\r
public:\r
TactonPlayer(byte nbtactors, byte *pins);\r
\r
- //Same frequency for all the vibrators, different amplitude.\r
- //Vibrates until stop\r
- virtual void buzz(unsigned int frequency, byte nbtactors, byte amplitudes[]) = 0;\r
+ virtual void setFrequency(unsigned int frequency) = 0;//{ _frequency = frequency; }\r
+// virtual void setDuration(unsigned long duration) { _duration = duration; }\r
+// virtual void setAmplitude(byte amplitude) { _amplitude = amplitude; }\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
+\r
\r
//Stop any vibration\r
virtual void stop() = 0;\r
void debug4() { analogWrite(_pins[3], 255); delay(100); analogWrite(_pins[3], 0); delay(100); }\r
*/\r
protected:\r
- virtual void init() const {}\r
- \r
- virtual void setFrequency(unsigned int frequency) { _frequency = frequency; }\r
- virtual void setDuration(unsigned long duration) { _duration = duration; }\r
- virtual void setAmplitude(byte amplitude) { _amplitude = amplitude; }\r
- virtual void setPattern(byte pattern) { _pattern = pattern; }\r
-\r
+ virtual void init() const = 0;// {}\r
byte _nbtactors;\r
byte *_pins;\r
- byte _pattern;\r
+/* byte _pattern;\r
unsigned long _duration;\r
unsigned int _frequency;\r
- byte _amplitude;\r
+ byte _amplitude;*/\r
};\r
\r
#endif\r
\r
void TactonPlayerPrecise::setFrequency(unsigned int frequency)\r
{\r
- TactonPlayer::setFrequency(frequency);\r
+// TactonPlayer::setFrequency(frequency);\r
+ _frequency = frequency;\r
\r
- unsigned long ocr = F_CPU / _frequency / 2 - 1;\r
+ unsigned long ocr = F_CPU / frequency / 2 - 1;\r
byte prescalarbits = (1 << CS10);\r
\r
if (ocr > 0xffff)\r
{\r
- ocr = F_CPU / _frequency / 64 / 2 - 1;\r
+ ocr = F_CPU / frequency / 64 / 2 - 1;\r
prescalarbits = (1 << CS11) | (1 << CS10);\r
}\r
/*\r
\r
void TactonPlayerPrecise::setDuration(unsigned long duration)\r
{\r
- TactonPlayer::setDuration(duration);\r
- _toggle_count = 2 * _frequency * _duration / 1000;\r
+// TactonPlayer::setDuration(duration);\r
+ _toggle_count = 2 * _frequency * duration / 1000;\r
\r
/* _cv = (F_CPU / 1000 * _duration) / 256 / _ccper256cv;\r
_currentcv = 0;\r
\r
void TactonPlayerPrecise::setAmplitude(byte amplitude)\r
{\r
- TactonPlayer::setAmplitude(amplitude);\r
+// TactonPlayer::setAmplitude(amplitude);\r
// OCR2A = amplitude;\r
\r
/* Serial.print("_amplitude=");\r
\r
void TactonPlayerPrecise::setPattern(byte pattern)\r
{\r
- TactonPlayer::setPattern(pattern);\r
+ //TactonPlayer::setPattern(pattern);\r
\r
_portB = _portC = _portD = 0;\r
for (int i = 0 ; i < _nbtactors ; i++)\r
{\r
pinMode(_pins[i], OUTPUT);\r
volatile uint8_t * port = portOutputRegister(digitalPinToPort(_pins[i]));\r
- if (_pattern & (1 << i))\r
+ if (pattern & (1 << i))\r
{\r
if (port == &PORTB)\r
_portB |= digitalPinToBitMask(_pins[i]);\r
setFrequency(frequency);\r
// setAmplitude(amplitude);\r
setDuration(duration);\r
+ \r
setPattern(pattern);\r
//_active = true;\r
turnOnPins();\r
static uint8_t _portB;\r
static uint8_t _portC;\r
static uint8_t _portD;\r
+ \r
+ unsigned int _frequency;\r
};\r
\r
#endif\r
void TactonPlayerPreciseNew::init() const\r
{\r
//init PWM timer\r
-// TCNT1 = 0;\r
+\r
//CTC mode\r
TCCR1A = (1 << COM1A0) | (1 << COM1B0); \r
TCCR1B = (1 << WGM12);\r
//set duty cycle to 0;\r
OCR1A = 0;\r
+ \r
+ //set prescalar for timer0 and timer2 to 1\r
+ // /!\ this affects delay!\r
+ TCCR0B &= ~(1 << CS01);\r
+ TCCR2B &= ~(1 << CS21);\r
}\r
\r
void TactonPlayerPreciseNew::setFrequency(unsigned int frequency)\r
{\r
- TactonPlayer::setFrequency(frequency);\r
+ //TactonPlayer::setFrequency(frequency);\r
+\r
+ sei();\r
+ init();\r
\r
- unsigned long ocr = F_CPU / _frequency / 2 - 1;\r
+ unsigned long ocr = F_CPU / frequency / 2 - 1;\r
byte prescalarbits = (1 << CS10);\r
\r
if (ocr > 0xffff)\r
{\r
- ocr = F_CPU / _frequency / 64 / 2 - 1;\r
+ ocr = F_CPU / frequency / 64 / 2 - 1;\r
prescalarbits = (1 << CS11) | (1 << CS10);\r
}\r
- /*\r
- Serial.print("_frequency=");\r
- Serial.print(_frequency, DEC);\r
- Serial.print(" prescalar=");\r
- Serial.print(prescalarbits, BIN);\r
- Serial.print(" ocr=");\r
- Serial.println(ocr, HEX);*/\r
-\r
+/*\r
+ Serial.print("Set freq ");\r
+ Serial.println(frequency, DEC);\r
+ Serial.print("OCR ");\r
+ Serial.println(ocr, DEC);\r
+ Serial.print("Prescalar ");\r
+ Serial.println(prescalarbits, HEX);*/\r
//set pre-scaler\r
TCCR1B |= prescalarbits;\r
//set duty cycle\r
OCR1A = ocr;\r
- /*Serial.print(" OCR1A=");\r
- Serial.println(OCR1A, HEX);*/\r
- //OCR1B = ocr;\r
-/*\r
- _ccper256cv = F_CPU / 512 / _frequency;\r
- _currentcvi = 0;*/\r
-\r
-/* Serial.print("_frequency=");\r
- Serial.print(_frequency, DEC);\r
- Serial.print(" _ccper256cv=");\r
- Serial.println(_ccper256cv, DEC);*/\r
}\r
\r
-//Start a vibration of a given frequency, with different amplitudes for each vibrator\r
-void TactonPlayerPreciseNew::buzz(unsigned int frequency, byte nbtactors, byte *amplitudes)\r
+//Sets a different amplitudes for each vibrator\r
+void TactonPlayerPreciseNew::setAmplitudes(byte nbtactors, byte *amplitudes)\r
{\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
- \r
//set the amplitudes\r
for (int i = 0 ; i < _nbtactors ; i++)\r
analogWrite(_pins[i], amplitudes[i]);\r
-\r
- setFrequency(frequency);\r
}\r
\r
//Stop any vibration\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
-{\r
- sei();\r
- init();\r
-// setAmplitude(amplitude);\r
-// setDuration(duration);\r
-// setPattern(pattern);
-
+{
//set the pattern
for (int i = 0 ; i < _nbtactors ; i++)
{
\r
//set the frequency and activate the output\r
setFrequency(frequency);\r
-// analogWrite(9, 1);\r
- /*\r
- Serial.print("Start pattern");\r
- Serial.println(pattern, HEX);\r
- */
- //Start the PWM\r
-// TCCR1A |= 1 << COM1A1;\r
-// TIMSK1 = (1 << OCIE1A);
-
-// Serial.print("Wait");\r
-// Serial.println(duration, DEC);\r
- delay(duration);\r
\r
-/* Serial.println("TCCR1");\r
- Serial.println(TCCR1A, BIN);
- Serial.println(TCCR1B, BIN);\r
- */
+ // /!\ multiply by 64 when the prescalar is applied to timer0
+ delay(64*duration);\r
+ \r
//Stop the PWM
-// TIMSK1 &= ~(1 << OCIE1A);\r
-// TCCR1A &= ~(1 << COM1A1);\r
-\r
TCCR1A = 0;\r
\r
//set duty cycle to 0\r
//clear the pattern\r
for (int i = 0 ; i < _nbtactors ; i++)\r
digitalWrite(_pins[i], LOW);\r
-\r
-// Serial.println("Stop");\r
-
-// TIMSK2 = (1 << OCIE2A) | (1 << TOIE2);\r
-// TIMSK2 = (1 << TOIE2);\r
-// sei();\r
}\r
\r
public:\r
TactonPlayerPreciseNew(byte nbtactors, byte *pins, byte pwmPin);\r
\r
- //Same frequency for all the vibrators, different amplitude.\r
- //Vibrates until stop\r
- void buzz(unsigned int frequency, byte nbtactors, byte *amplitudes);\r
+ void setFrequency(unsigned int frequency);\r
+ //sets a different amplitude for each vibrator\r
+ void setAmplitudes(byte nbtactors, byte *amplitudes);\r
\r
//Stop any vibration\r
void stop();\r
void beep(byte pattern, unsigned long duration, unsigned int frequency, byte amplitude);\r
\r
private:\r
- void init() const; \r
- void setFrequency(unsigned int frequency);\r
+ void init() const;\r
//void setDuration(unsigned long duration);\r
//void setAmplitude(byte amplitude);\r
//void setPattern(byte pattern);\r
void TactonPlayerWithAmplitude::beep(byte pattern, unsigned long duration, unsigned int frequency, byte amplitude)\r
{\r
init();\r
- setFrequency(frequency);\r
- setAmplitude(amplitude);\r
- setDuration(duration);\r
- setPattern(pattern);\r
\r
int i;\r
long del = (long)(1000000 / ((long)frequency));\r