A DTMF sequence editor and player for HAM radio equipment command & control.

Dependencies:   mbed ExtTextLCD

Revision:
0:1324e7d9d471
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed_dtmf_generator.cpp	Mon Mar 07 22:51:19 2011 +0000
@@ -0,0 +1,88 @@
+#include "mbed_dtmf_generator.hpp"
+#include "snd_wave_generator/SineWave.h"
+#include "snd_wave_generator/WaveCombo.h"
+#include <iostream>
+#include <sstream>
+#include <string>
+
+using namespace snd_wave_generator;
+
+MbedDtmfGenerator::MbedDtmfGenerator() :
+    generator(16000)
+{
+    std::cout << "Init Wave" << "\r" << std::endl;     
+    makeWaves();
+}
+
+void MbedDtmfGenerator::makeKeyWave(int pos, int row, int col)
+{
+    std::cout << "Init Key Wave #" << pos << " R" << row << "C" << col << "\r" << std::endl;     
+    std::auto_ptr<WaveCombo> wave(new WaveCombo());
+    wave->add(colWaves[col].get());
+    wave->add(rowWaves[row].get());
+    
+    waves[pos] = wave;
+}
+
+void MbedDtmfGenerator::makeWaves()
+{
+    static int colFreq[4] = { 1209, 1336, 1477, 1633 };
+    static int rowFreq[4] = { 697, 770, 852, 941 };
+    
+    for(int i = 0; i < 4; ++i) {
+        std::cout << "Init ColWave " << i << " hz=" << colFreq[i] << "\r" << std::endl;     
+        colWaves[i].reset(new SineWave(colFreq[i]));
+        
+        std::cout << "Init RowWave " << i << " hz=" << rowFreq[i] << "\r" << std::endl;     
+        rowWaves[i].reset(new SineWave(rowFreq[i]));
+    }
+
+    makeKeyWave(0, 3, 1);    
+    for(int row = 0; row < 3; ++row) {
+        for(int col = 0; col < 3; ++col) {
+            makeKeyWave(row * 3 + col + 1, row, col);
+        }
+    }
+    for(int ltr=0; ltr < 4; ++ltr) {
+        makeKeyWave(ltr+10, ltr, 3);
+    }
+    makeKeyWave(14, 3, 0);
+    makeKeyWave(15, 3, 2);
+}
+
+Wave * MbedDtmfGenerator::getWaveFor(char ch)
+{
+    int index = -1;
+    if (ch >= '0' && ch <= '9') {
+        index = ch - '0';
+    }
+    else if (ch >= 'A' && ch <= 'D') {
+        index = ch - 'A' + 10;
+    }
+    else if (ch == '*') {
+        index = 14;
+    }
+    else if (ch == '#') {
+        index = 15;
+    }
+    std::cout << "Wave for '" << ch << "' => " << index << "\r" << std::endl;
+    return this->waves[index].get();
+}
+
+void MbedDtmfGenerator::play(char ch) 
+{
+    Wave *wave = getWaveFor(ch);
+    std::cout << "Play Wave '" << ch << "'" << "\r" << std::endl; 
+    if (wave) {    
+        generator.play(getWaveFor(ch));
+    }
+    else {
+        std::cout << "No wave !\r" << std::endl;
+    }
+}
+
+void MbedDtmfGenerator::stop() 
+{
+    std::cout << "Stop Wave" << "\r" << std::endl;     
+    generator.stop();
+}