fix low frequencies bug
authorThomas Pietrzak <thomas.pietrzak@gmail.com>
Fri, 17 Jun 2011 21:49:57 +0000 (21:49 +0000)
committerThomas Pietrzak <thomas.pietrzak@gmail.com>
Fri, 17 Jun 2011 21:49:57 +0000 (21:49 +0000)
git-svn-id: svn+ssh://thomaspietrzak.com/var/svn/rep@37 47cf9a05-e0a8-4ed5-9e9b-101a649bc004

Arduino/Tacton/Tacton.cpp
Arduino/Tacton/Tacton.h
Arduino/TactonManager/TactonManager.h
Arduino/TactonPlayer/TactonPlayer.cpp
Arduino/TactonPlayer/TactonPlayer.h
TactonLibrary.suo
TactonPlayer/TactonPlayer.cpp
TactonPlayer/TactonPlayer.hpp

index 11bf828801693c80c1490c7ba2fcc97e1c04b7be..259b30a40efad4e6e46d0b2a997f557b32614ff4 100644 (file)
@@ -2,11 +2,6 @@
 #include "Tacton.h"\r
 \r
 \r
-/*Tacton::Tacton()\r
-:_nbframes(0), _patterns(NULL), _durations(NULL), _frequencies(NULL), _amplitudes(NULL)\r
-{\r
-}*/\r
-\r
 Tacton::Tacton(unsigned int nbframes, byte *desc)\r
 :_nbframes(nbframes), _patterns((byte *)malloc(nbframes * sizeof(byte))), _durations((unsigned int *)malloc(nbframes * sizeof(unsigned int))), _frequencies((unsigned int *)malloc(nbframes * sizeof(unsigned int))), _amplitudes((byte *)malloc(nbframes * sizeof(byte)))\r
 {\r
@@ -22,18 +17,6 @@ Tacton::Tacton(unsigned int nbframes, byte *desc)
        }\r
 }\r
 \r
-/*Tacton::Tacton(const Tacton &tacton)\r
-:_nbframes(tacton._nbframes), _patterns((byte *)malloc(tacton._nbframes * sizeof(byte))), _durations((unsigned int *)malloc(tacton._nbframes * sizeof(unsigned int))), _frequencies((unsigned int *)malloc(tacton._nbframes * sizeof(unsigned int))), _amplitudes((byte *)malloc(tacton._nbframes * sizeof(byte)))\r
-{\r
-       for(int i = 0 ; i < tacton._nbframes ; i++)\r
-       {\r
-               _patterns[i] = tacton._patterns[i];\r
-               _durations[i] = tacton._durations[i];\r
-               _frequencies[i] = tacton._frequencies[i];\r
-               _amplitudes[i] = tacton._amplitudes[i];\r
-       }\r
-}*/\r
-\r
 Tacton::~Tacton()\r
 {\r
        free(_patterns);\r
@@ -46,34 +29,5 @@ void Tacton::play(const TactonPlayer &player) const
 {            \r
        if (isValid())\r
                for (int i = 0 ; i < _nbframes ; i++)\r
-                       player.beep(_patterns[i], _durations[i], _frequencies[i], _amplitudes[i]);\r
+                       player.beep(_patterns[i], (long)_durations[i], _frequencies[i], _amplitudes[i]);\r
 }\r
-\r
-/*Tacton& Tacton::operator=(const Tacton &t) \r
-{\r
-    if (this == &t)\r
-               return *this;\r
-       if (_patterns)\r
-               free(_patterns);\r
-       if (_durations)\r
-               free(_durations);\r
-       if (_frequencies)\r
-               free(_frequencies);\r
-       if (_amplitudes)\r
-               free(_amplitudes);\r
-       _nbframes = t._nbframes;\r
-       _patterns = (byte *)malloc(_nbframes * sizeof(byte));\r
-       _durations = (unsigned int *)malloc(_nbframes * sizeof(unsigned int));\r
-       _frequencies = (unsigned int *)malloc(_nbframes * sizeof(unsigned int));\r
-       _amplitudes = (byte *)malloc(_nbframes * sizeof(byte));\r
-       for(int i = 0 ; i < _nbframes ; i++)\r
-       {\r
-               _patterns[i] = t._patterns[i];\r
-               _durations[i] = t._durations[i];\r
-               _frequencies[i] = t._frequencies[i];\r
-               _amplitudes[i] = t._amplitudes[i];\r
-       }\r
-\r
-    return *this;\r
-}*/\r
-  
\ No newline at end of file
index 8ef8ae1ba273e1b4de988d9acace52131ed08cb0..8b9b2891c85853ff1e502e99043a3c05e1941ea2 100644 (file)
@@ -8,14 +8,11 @@
 class Tacton \r
 {\r
        public:\r
-//             Tacton();\r
                Tacton(unsigned int nbframes, byte *desc);\r
-//             Tacton(const Tacton &tacton);\r
                ~Tacton();\r
                \r
                void play(const TactonPlayer &player) const;\r
                \r
-//             Tacton & operator=(const Tacton &t);\r
                boolean isValid() const { return _patterns && _durations && _frequencies && _amplitudes; }\r
 \r
        private:\r
index 5d89970534ed72427da0f20c4a3447815717e149..32a3bc7ecdb55f91972cedc88c097004361b8dc1 100644 (file)
@@ -14,7 +14,6 @@ class TactonManager
        public:\r
                TactonManager(TactonPlayer *player);\r
                \r
-//             void add(const Tacton &t);\r
                void add(unsigned int nbframes, byte *desc);\r
                const Tacton *get(byte numtacton) const;\r
                \r
index b8a7a3f9e4bd3e4aa6cd329836b451fa8ce32169..731bfcb3714fb7c200121f4177a65a38c2379a10 100644 (file)
@@ -8,20 +8,35 @@ TactonPlayer::TactonPlayer(byte nbtactors, byte *pins)
                pinMode(pins[i], OUTPUT);     \r
 }\r
 \r
-void TactonPlayer::beep(byte pattern, unsigned int duration, unsigned int frequency, byte amplitude) const\r
+void TactonPlayer::beep(byte pattern, long duration, unsigned int frequency, byte amplitude) const\r
 {\r
     int i;\r
-    long del = (long)(1000000 / frequency);\r
-    long looptime = (long)((((long)duration) * 1000) / (del * 2));\r
+    long del = (long)(1000000 / ((long)frequency));\r
+    long looptime = (long)((duration * 1000) / (del * 2));\r
+       long udel = del % 1000;\r
+       long mdel = del / 1000;\r
     for (i = 0 ; i < looptime ; i++)\r
     {\r
                for (int j = 0 ; j < 8 ; j++)\r
                        if (j < _nbtactors && (pattern & (0x01 << j)))\r
                                analogWrite(_pins[j], amplitude);\r
-               delayMicroseconds(del);\r
+               //delayMicroseconds is not accurate over 16383µs\r
+               if (del > 10000)\r
+               {\r
+                       delayMicroseconds(udel);\r
+                       delay(mdel);\r
+               }\r
+               else\r
+                       delayMicroseconds(del);\r
                for (int j = 0 ; j < 8 ; j++)\r
                        if (j < _nbtactors && (pattern & (0x01 << j)))\r
                                analogWrite(_pins[j], 0);\r
-               delayMicroseconds(del);\r
+               if (del > 10000)\r
+               {\r
+                       delayMicroseconds(udel);\r
+                       delay(mdel);\r
+               }\r
+               else\r
+                       delayMicroseconds(del);\r
     }\r
 }\r
index 775f9f60be75f4475bbfa86937413db5a43597a1..2fa99b2034f9e0198b2b03ed90c9e8c72fe04950 100644 (file)
@@ -9,12 +9,12 @@ class TactonPlayer
                TactonPlayer(byte nbtactors, byte *pins);\r
 \r
                //8bits pattern => max 8 tactors, change type if using more\r
-               void beep(byte pattern, unsigned int duration, unsigned int frequency, byte amplitude) const;\r
+               void beep(byte pattern, long duration, unsigned int frequency, byte amplitude) const;\r
                \r
-               void debug1() { analogWrite(_pins[0], 255); delay(200); analogWrite(_pins[0], 0); delay(100);}\r
-               void debug2() { analogWrite(_pins[1], 255); delay(200); analogWrite(_pins[1], 0); delay(100); }\r
-               void debug3() { analogWrite(_pins[2], 255); delay(200); analogWrite(_pins[2], 0); delay(100); }\r
-               void debug4() { analogWrite(_pins[3], 255); delay(200); analogWrite(_pins[3], 0); delay(100); }\r
+               void debug1() { analogWrite(_pins[0], 255); delay(100); analogWrite(_pins[0], 0); delay(100);}\r
+               void debug2() { analogWrite(_pins[1], 255); delay(100); analogWrite(_pins[1], 0); delay(100); }\r
+               void debug3() { analogWrite(_pins[2], 255); delay(100); analogWrite(_pins[2], 0); delay(100); }\r
+               void debug4() { analogWrite(_pins[3], 255); delay(100); analogWrite(_pins[3], 0); delay(100); }\r
        \r
        private:                \r
                byte _nbtactors;\r
index 56817b7501a4b43fffefc50d462c1de5a6857055..3ff37c824e1e6f1d5a7141f5a45aed07eb681823 100644 (file)
Binary files a/TactonLibrary.suo and b/TactonLibrary.suo differ
index acebf80098cd7c566bddc241d5a60c995638193a..b739d6e321520000c864f24c85f8b6f6d57327eb 100644 (file)
@@ -94,4 +94,9 @@ void TactonPlayer::schedule(unsigned char index, unsigned long timestamp)
        buffer[4] = (unsigned char)((timestamp & 0x0000ff00) >> 8);\r
        buffer[5] = (unsigned char)(timestamp & 0x000000ff);\r
        _comport->WriteData(buffer, 6);\r
-}
\ No newline at end of file
+}\r
+\r
+void TactonPlayer::debugRead(char *res, int nb) const\r
+{\r
+       _comport->ReadData(res, nb);\r
+}\r
index 48296a99ceea2d6467830440cc63f462398174a6..49621a7249f6044c6be630eb0bc916f6184094f9 100644 (file)
@@ -14,16 +14,19 @@ class TactonPlayer
                        void __declspec(dllexport) stop();\r
 \r
                        //register a tacton\r
-                       void __declspec(dllexport) regist(const Tacton &t);\r
+                       __declspec(dllexport) void regist(const Tacton &t);\r
                        //register a list of tactons in a file, returns the number of tactons loaded\r
-                       unsigned int __declspec(dllexport) registFile(char *filename);\r
+                       __declspec(dllexport) unsigned int registFile(char *filename);\r
 \r
                        //play a registered tacton\r
-                       void __declspec(dllexport) play(unsigned char index);\r
+                       __declspec(dllexport) void play(unsigned char index);\r
                        //play a specified tacton\r
-                       void __declspec(dllexport) play(const Tacton &t);\r
+                       __declspec(dllexport) void play(const Tacton &t);\r
                        //schedule the play of a registered tacton\r
-                       void __declspec(dllexport) schedule(unsigned char index, unsigned long timestamp);\r
+                       __declspec(dllexport) void schedule(unsigned char index, unsigned long timestamp);\r
+\r
+                       //read on the serial port\r
+                       __declspec(dllexport) void debugRead(char *res, int nb) const;\r
 \r
 private:\r
                Serial *_comport;\r