From: Thomas Pietrzak Date: Tue, 28 Aug 2012 14:25:30 +0000 (+0000) Subject: Fix bug (not playing) X-Git-Url: https://git.thomaspietrzak.com/?a=commitdiff_plain;h=8ccdf74d6a41250612dcc7aab2c820b54f0f4e4a;p=tactonlibrary.git Fix bug (not playing) ini wasn't called: ctc mode was not set. git-svn-id: svn+ssh://thomaspietrzak.com/var/svn/rep@90 47cf9a05-e0a8-4ed5-9e9b-101a649bc004 --- diff --git a/Arduino/TactonPlayer/TactonManager.cpp b/Arduino/TactonPlayer/TactonManager.cpp index 05a2dd4..ddc9717 100644 --- a/Arduino/TactonPlayer/TactonManager.cpp +++ b/Arduino/TactonPlayer/TactonManager.cpp @@ -116,18 +116,14 @@ void TactonManager::checkPlay() }*/ } -void TactonManager::buzz(unsigned int nbf, byte *desc) +void TactonManager::setFrequency(unsigned int freq) { - byte *amplitudes = (byte *)malloc(nbf * sizeof(byte)); - if (amplitudes == NULL) - return; - - for (unsigned int i = 0 ; i < nbf ; i++) - amplitudes[i] = desc[i + 2]; + _player->setFrequency(freq); +} - unsigned int frequency = (((unsigned int)(desc[1])) << 8) | ((unsigned int)(desc[0])); - _player->buzz(frequency, nbf, amplitudes); - free(amplitudes); +void TactonManager::setAmplitudes(unsigned int nbf, byte *desc) +{ + _player->setAmplitudes(nbf, desc); } void TactonManager::stop() diff --git a/Arduino/TactonPlayer/TactonManager.h b/Arduino/TactonPlayer/TactonManager.h index 240a2ac..e2e83b8 100644 --- a/Arduino/TactonPlayer/TactonManager.h +++ b/Arduino/TactonPlayer/TactonManager.h @@ -23,7 +23,8 @@ class TactonManager void checkPlay(); void setOffset(unsigned long timestamp); - void buzz(unsigned int nbf, byte *desc); + void setAmplitudes(unsigned int nbf, byte *desc); + void setFrequency(unsigned int freq); void stop(); diff --git a/Arduino/TactonPlayer/TactonPlayer.h b/Arduino/TactonPlayer/TactonPlayer.h index 0647ce4..3294fb6 100644 --- a/Arduino/TactonPlayer/TactonPlayer.h +++ b/Arduino/TactonPlayer/TactonPlayer.h @@ -13,9 +13,13 @@ class TactonPlayer public: TactonPlayer(byte nbtactors, byte *pins); - //Same frequency for all the vibrators, different amplitude. - //Vibrates until stop - virtual void buzz(unsigned int frequency, byte nbtactors, byte amplitudes[]) = 0; + virtual void setFrequency(unsigned int frequency) = 0;//{ _frequency = frequency; } +// virtual void setDuration(unsigned long duration) { _duration = duration; } +// virtual void setAmplitude(byte amplitude) { _amplitude = amplitude; } + //set a different amplitude for each vibrator + virtual void setAmplitudes(byte nbtactors, byte amplitudes[]) = 0; +// virtual void setPattern(byte pattern) { _pattern = pattern; } + //Stop any vibration virtual void stop() = 0; @@ -29,19 +33,13 @@ class TactonPlayer void debug4() { analogWrite(_pins[3], 255); delay(100); analogWrite(_pins[3], 0); delay(100); } */ protected: - virtual void init() const {} - - virtual void setFrequency(unsigned int frequency) { _frequency = frequency; } - virtual void setDuration(unsigned long duration) { _duration = duration; } - virtual void setAmplitude(byte amplitude) { _amplitude = amplitude; } - virtual void setPattern(byte pattern) { _pattern = pattern; } - + virtual void init() const = 0;// {} byte _nbtactors; byte *_pins; - byte _pattern; +/* byte _pattern; unsigned long _duration; unsigned int _frequency; - byte _amplitude; + byte _amplitude;*/ }; #endif diff --git a/Arduino/TactonPlayer/TactonPlayerPrecise.cpp b/Arduino/TactonPlayer/TactonPlayerPrecise.cpp index c891dda..599631e 100644 --- a/Arduino/TactonPlayer/TactonPlayerPrecise.cpp +++ b/Arduino/TactonPlayer/TactonPlayerPrecise.cpp @@ -35,14 +35,15 @@ void TactonPlayerPrecise::init() const void TactonPlayerPrecise::setFrequency(unsigned int frequency) { - TactonPlayer::setFrequency(frequency); +// TactonPlayer::setFrequency(frequency); + _frequency = frequency; - unsigned long ocr = F_CPU / _frequency / 2 - 1; + unsigned long ocr = F_CPU / frequency / 2 - 1; byte prescalarbits = (1 << CS10); if (ocr > 0xffff) { - ocr = F_CPU / _frequency / 64 / 2 - 1; + ocr = F_CPU / frequency / 64 / 2 - 1; prescalarbits = (1 << CS11) | (1 << CS10); } /* @@ -67,8 +68,8 @@ void TactonPlayerPrecise::setFrequency(unsigned int frequency) void TactonPlayerPrecise::setDuration(unsigned long duration) { - TactonPlayer::setDuration(duration); - _toggle_count = 2 * _frequency * _duration / 1000; +// TactonPlayer::setDuration(duration); + _toggle_count = 2 * _frequency * duration / 1000; /* _cv = (F_CPU / 1000 * _duration) / 256 / _ccper256cv; _currentcv = 0; @@ -81,7 +82,7 @@ void TactonPlayerPrecise::setDuration(unsigned long duration) void TactonPlayerPrecise::setAmplitude(byte amplitude) { - TactonPlayer::setAmplitude(amplitude); +// TactonPlayer::setAmplitude(amplitude); // OCR2A = amplitude; /* Serial.print("_amplitude="); @@ -90,14 +91,14 @@ void TactonPlayerPrecise::setAmplitude(byte amplitude) void TactonPlayerPrecise::setPattern(byte pattern) { - TactonPlayer::setPattern(pattern); + //TactonPlayer::setPattern(pattern); _portB = _portC = _portD = 0; for (int i = 0 ; i < _nbtactors ; i++) { pinMode(_pins[i], OUTPUT); volatile uint8_t * port = portOutputRegister(digitalPinToPort(_pins[i])); - if (_pattern & (1 << i)) + if (pattern & (1 << i)) { if (port == &PORTB) _portB |= digitalPinToBitMask(_pins[i]); @@ -136,6 +137,7 @@ void TactonPlayerPrecise::beep(byte pattern, unsigned long duration, unsigned in setFrequency(frequency); // setAmplitude(amplitude); setDuration(duration); + setPattern(pattern); //_active = true; turnOnPins(); diff --git a/Arduino/TactonPlayer/TactonPlayerPrecise.h b/Arduino/TactonPlayer/TactonPlayerPrecise.h index 4793abe..32e1f49 100644 --- a/Arduino/TactonPlayer/TactonPlayerPrecise.h +++ b/Arduino/TactonPlayer/TactonPlayerPrecise.h @@ -27,6 +27,8 @@ class TactonPlayerPrecise: public TactonPlayer static uint8_t _portB; static uint8_t _portC; static uint8_t _portD; + + unsigned int _frequency; }; #endif diff --git a/Arduino/TactonPlayer/TactonPlayerPreciseNew.cpp b/Arduino/TactonPlayer/TactonPlayerPreciseNew.cpp index 4292279..9918eab 100644 --- a/Arduino/TactonPlayer/TactonPlayerPreciseNew.cpp +++ b/Arduino/TactonPlayer/TactonPlayerPreciseNew.cpp @@ -12,71 +12,56 @@ TactonPlayerPreciseNew::TactonPlayerPreciseNew(byte nbtactors, byte *pins, byte void TactonPlayerPreciseNew::init() const { //init PWM timer -// TCNT1 = 0; + //CTC mode TCCR1A = (1 << COM1A0) | (1 << COM1B0); TCCR1B = (1 << WGM12); //set duty cycle to 0; OCR1A = 0; + + //set prescalar for timer0 and timer2 to 1 + // /!\ this affects delay! + TCCR0B &= ~(1 << CS01); + TCCR2B &= ~(1 << CS21); } void TactonPlayerPreciseNew::setFrequency(unsigned int frequency) { - TactonPlayer::setFrequency(frequency); + //TactonPlayer::setFrequency(frequency); + + sei(); + init(); - unsigned long ocr = F_CPU / _frequency / 2 - 1; + unsigned long ocr = F_CPU / frequency / 2 - 1; byte prescalarbits = (1 << CS10); if (ocr > 0xffff) { - ocr = F_CPU / _frequency / 64 / 2 - 1; + ocr = F_CPU / frequency / 64 / 2 - 1; prescalarbits = (1 << CS11) | (1 << CS10); } - /* - Serial.print("_frequency="); - Serial.print(_frequency, DEC); - Serial.print(" prescalar="); - Serial.print(prescalarbits, BIN); - Serial.print(" ocr="); - Serial.println(ocr, HEX);*/ - +/* + Serial.print("Set freq "); + Serial.println(frequency, DEC); + Serial.print("OCR "); + Serial.println(ocr, DEC); + Serial.print("Prescalar "); + Serial.println(prescalarbits, HEX);*/ //set pre-scaler TCCR1B |= prescalarbits; //set duty cycle OCR1A = ocr; - /*Serial.print(" OCR1A="); - Serial.println(OCR1A, HEX);*/ - //OCR1B = ocr; -/* - _ccper256cv = F_CPU / 512 / _frequency; - _currentcvi = 0;*/ - -/* Serial.print("_frequency="); - Serial.print(_frequency, DEC); - Serial.print(" _ccper256cv="); - Serial.println(_ccper256cv, DEC);*/ } -//Start a vibration of a given frequency, with different amplitudes for each vibrator -void TactonPlayerPreciseNew::buzz(unsigned int frequency, byte nbtactors, byte *amplitudes) +//Sets a different amplitudes for each vibrator +void TactonPlayerPreciseNew::setAmplitudes(byte nbtactors, byte *amplitudes) { if (nbtactors != _nbtactors) return; - //clear - TCCR1A = 0; - //set duty cycle to 0 - OCR1A = 0; - OCR1B = 0; - - sei(); - init(); - //set the amplitudes for (int i = 0 ; i < _nbtactors ; i++) analogWrite(_pins[i], amplitudes[i]); - - setFrequency(frequency); } //Stop any vibration @@ -93,13 +78,7 @@ void TactonPlayerPreciseNew::stop() //Play a Tacton for a specified duration, frequency and amplitude void TactonPlayerPreciseNew::beep(byte pattern, unsigned long duration, unsigned int frequency, byte amplitude) -{ - sei(); - init(); -// setAmplitude(amplitude); -// setDuration(duration); -// setPattern(pattern); - +{ //set the pattern for (int i = 0 ; i < _nbtactors ; i++) { @@ -111,27 +90,11 @@ void TactonPlayerPreciseNew::beep(byte pattern, unsigned long duration, unsigned //set the frequency and activate the output setFrequency(frequency); -// analogWrite(9, 1); - /* - Serial.print("Start pattern"); - Serial.println(pattern, HEX); - */ - //Start the PWM -// TCCR1A |= 1 << COM1A1; -// TIMSK1 = (1 << OCIE1A); - -// Serial.print("Wait"); -// Serial.println(duration, DEC); - delay(duration); -/* Serial.println("TCCR1"); - Serial.println(TCCR1A, BIN); - Serial.println(TCCR1B, BIN); - */ + // /!\ multiply by 64 when the prescalar is applied to timer0 + delay(64*duration); + //Stop the PWM -// TIMSK1 &= ~(1 << OCIE1A); -// TCCR1A &= ~(1 << COM1A1); - TCCR1A = 0; //set duty cycle to 0 @@ -140,11 +103,5 @@ void TactonPlayerPreciseNew::beep(byte pattern, unsigned long duration, unsigned //clear the pattern for (int i = 0 ; i < _nbtactors ; i++) digitalWrite(_pins[i], LOW); - -// Serial.println("Stop"); - -// TIMSK2 = (1 << OCIE2A) | (1 << TOIE2); -// TIMSK2 = (1 << TOIE2); -// sei(); } diff --git a/Arduino/TactonPlayer/TactonPlayerPreciseNew.h b/Arduino/TactonPlayer/TactonPlayerPreciseNew.h index 99b2053..796b3c4 100644 --- a/Arduino/TactonPlayer/TactonPlayerPreciseNew.h +++ b/Arduino/TactonPlayer/TactonPlayerPreciseNew.h @@ -10,9 +10,9 @@ class TactonPlayerPreciseNew: public TactonPlayer public: TactonPlayerPreciseNew(byte nbtactors, byte *pins, byte pwmPin); - //Same frequency for all the vibrators, different amplitude. - //Vibrates until stop - void buzz(unsigned int frequency, byte nbtactors, byte *amplitudes); + void setFrequency(unsigned int frequency); + //sets a different amplitude for each vibrator + void setAmplitudes(byte nbtactors, byte *amplitudes); //Stop any vibration void stop(); @@ -21,8 +21,7 @@ class TactonPlayerPreciseNew: public TactonPlayer void beep(byte pattern, unsigned long duration, unsigned int frequency, byte amplitude); private: - void init() const; - void setFrequency(unsigned int frequency); + void init() const; //void setDuration(unsigned long duration); //void setAmplitude(byte amplitude); //void setPattern(byte pattern); diff --git a/Arduino/TactonPlayer/TactonPlayerWithAmplitude.cpp b/Arduino/TactonPlayer/TactonPlayerWithAmplitude.cpp index f5b432d..8359848 100644 --- a/Arduino/TactonPlayer/TactonPlayerWithAmplitude.cpp +++ b/Arduino/TactonPlayer/TactonPlayerWithAmplitude.cpp @@ -21,10 +21,6 @@ void TactonPlayerWithAmplitude::init() const void TactonPlayerWithAmplitude::beep(byte pattern, unsigned long duration, unsigned int frequency, byte amplitude) { init(); - setFrequency(frequency); - setAmplitude(amplitude); - setDuration(duration); - setPattern(pattern); int i; long del = (long)(1000000 / ((long)frequency));