Fix bug (not playing)
authorThomas Pietrzak <thomas.pietrzak@gmail.com>
Tue, 28 Aug 2012 14:25:30 +0000 (14:25 +0000)
committerThomas Pietrzak <thomas.pietrzak@gmail.com>
Tue, 28 Aug 2012 14:25:30 +0000 (14:25 +0000)
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

Arduino/TactonPlayer/TactonManager.cpp
Arduino/TactonPlayer/TactonManager.h
Arduino/TactonPlayer/TactonPlayer.h
Arduino/TactonPlayer/TactonPlayerPrecise.cpp
Arduino/TactonPlayer/TactonPlayerPrecise.h
Arduino/TactonPlayer/TactonPlayerPreciseNew.cpp
Arduino/TactonPlayer/TactonPlayerPreciseNew.h
Arduino/TactonPlayer/TactonPlayerWithAmplitude.cpp

index 05a2dd4b053fd8050694c0a19de613e0ffd716fd..ddc9717fa625ee89bdc1f63c10f7c4c05b4e98ba 100644 (file)
@@ -116,18 +116,14 @@ void TactonManager::checkPlay()
        }*/\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
index 240a2acb11d472eaad1df6d46cace785b9f7f93a..e2e83b8cd7565de1b34271b57e074f1546f8423d 100644 (file)
@@ -23,7 +23,8 @@ class TactonManager
                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
index 0647ce443d45d2a6355150058add731e956d17a8..3294fb6ad5a6010dea208277c5629c0a35f6ff8c 100644 (file)
@@ -13,9 +13,13 @@ class TactonPlayer
        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
@@ -29,19 +33,13 @@ class TactonPlayer
                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
index c891ddafca0a694123b70e7194fcb32e54136c40..599631eacd7e45d30b1bfa3d42466f220862ee8e 100644 (file)
@@ -35,14 +35,15 @@ void TactonPlayerPrecise::init() const
 \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
@@ -67,8 +68,8 @@ void TactonPlayerPrecise::setFrequency(unsigned int frequency)
 \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
@@ -81,7 +82,7 @@ void TactonPlayerPrecise::setDuration(unsigned long duration)
 \r
 void TactonPlayerPrecise::setAmplitude(byte amplitude)\r
 {\r
-       TactonPlayer::setAmplitude(amplitude);\r
+//     TactonPlayer::setAmplitude(amplitude);\r
 //     OCR2A = amplitude;\r
        \r
 /*     Serial.print("_amplitude=");\r
@@ -90,14 +91,14 @@ void TactonPlayerPrecise::setAmplitude(byte amplitude)
 \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
@@ -136,6 +137,7 @@ void TactonPlayerPrecise::beep(byte pattern, unsigned long duration, unsigned in
        setFrequency(frequency);\r
 //     setAmplitude(amplitude);\r
        setDuration(duration);\r
+       \r
        setPattern(pattern);\r
        //_active = true;\r
        turnOnPins();\r
index 4793abee987d452b178bb26ea1e0b9cb5702e797..32e1f49b40886972d4434d967cf37ea0d3a543f6 100644 (file)
@@ -27,6 +27,8 @@ class TactonPlayerPrecise: public TactonPlayer
                static uint8_t _portB;\r
                static uint8_t _portC;\r
                static uint8_t _portD;\r
+               \r
+               unsigned int _frequency;\r
 };\r
 \r
 #endif\r
index 42922793e428ef32e14547b270e026159afa9198..9918eabd68096099ec518c048857d48bde675b6c 100644 (file)
@@ -12,71 +12,56 @@ TactonPlayerPreciseNew::TactonPlayerPreciseNew(byte nbtactors, byte *pins, byte
 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
@@ -93,13 +78,7 @@ void TactonPlayerPreciseNew::stop()
 \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++)
        {
@@ -111,27 +90,11 @@ void TactonPlayerPreciseNew::beep(byte pattern, unsigned long duration, unsigned
        \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
@@ -140,11 +103,5 @@ void TactonPlayerPreciseNew::beep(byte pattern, unsigned long duration, unsigned
        //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
index 99b20534cb50ce54cdf8ba8257fa7419befff453..796b3c4325981d60d751b8d873e730fb3247ef9b 100644 (file)
@@ -10,9 +10,9 @@ class TactonPlayerPreciseNew: public TactonPlayer
        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
@@ -21,8 +21,7 @@ class TactonPlayerPreciseNew: public TactonPlayer
                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
index f5b432d10930ca9f694436716f74a74203cd29c7..8359848714eb7e26e1e5ac04e43fe75386cbad08 100644 (file)
@@ -21,10 +21,6 @@ void TactonPlayerWithAmplitude::init() const
 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