Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed
voiceecho.cpp@0:f99e355ba60d, 2019-04-17 (annotated)
- Committer:
- titanium
- Date:
- Wed Apr 17 03:23:25 2019 +0000
- Revision:
- 0:f99e355ba60d
- Child:
- 1:5972dbd390c8
echo machine v1
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| titanium | 0:f99e355ba60d | 1 | #include "mbed.h" |
| titanium | 0:f99e355ba60d | 2 | |
| titanium | 0:f99e355ba60d | 3 | /* IO pin defines*/ |
| titanium | 0:f99e355ba60d | 4 | DigitalOut led1(LED1); |
| titanium | 0:f99e355ba60d | 5 | PwmOut pwm(p21); |
| titanium | 0:f99e355ba60d | 6 | AnalogIn mic(p20); |
| titanium | 0:f99e355ba60d | 7 | AnalogOut spk(p18); |
| titanium | 0:f99e355ba60d | 8 | Ticker readtick, writetick; |
| titanium | 0:f99e355ba60d | 9 | // Serial pc(USBTX, USBRX); |
| titanium | 0:f99e355ba60d | 10 | |
| titanium | 0:f99e355ba60d | 11 | #define WAVMAX 7000 /*buffer size; SAMPFREQ*DEALY<WAVMAX*/ |
| titanium | 0:f99e355ba60d | 12 | #define SAMPFREQ 16000.0 |
| titanium | 0:f99e355ba60d | 13 | #define DELAY 0.25 /*s*/ |
| titanium | 0:f99e355ba60d | 14 | |
| titanium | 0:f99e355ba60d | 15 | unsigned short wave[WAVMAX]; |
| titanium | 0:f99e355ba60d | 16 | int readindex=0, writeindex=0; |
| titanium | 0:f99e355ba60d | 17 | |
| titanium | 0:f99e355ba60d | 18 | class KBline : public Serial |
| titanium | 0:f99e355ba60d | 19 | { |
| titanium | 0:f99e355ba60d | 20 | public: |
| titanium | 0:f99e355ba60d | 21 | char line[100]; |
| titanium | 0:f99e355ba60d | 22 | int index; |
| titanium | 0:f99e355ba60d | 23 | int receiving; //status 0=not started, 1=waiting, 2=receiving, 3=end |
| titanium | 0:f99e355ba60d | 24 | private: |
| titanium | 0:f99e355ba60d | 25 | void serialirq() |
| titanium | 0:f99e355ba60d | 26 | { |
| titanium | 0:f99e355ba60d | 27 | char ch; |
| titanium | 0:f99e355ba60d | 28 | if (this->readable()) { |
| titanium | 0:f99e355ba60d | 29 | ch=this->getc(); |
| titanium | 0:f99e355ba60d | 30 | switch(ch) { //simple line editing |
| titanium | 0:f99e355ba60d | 31 | case '\n': |
| titanium | 0:f99e355ba60d | 32 | case '\r': //LF and CR terminate reading |
| titanium | 0:f99e355ba60d | 33 | line[index++]=ch; |
| titanium | 0:f99e355ba60d | 34 | line[index++]=0; |
| titanium | 0:f99e355ba60d | 35 | this->printf("\r\n"); |
| titanium | 0:f99e355ba60d | 36 | receiving=3; |
| titanium | 0:f99e355ba60d | 37 | break; |
| titanium | 0:f99e355ba60d | 38 | case 21: /* control-U cancels entire line*/ |
| titanium | 0:f99e355ba60d | 39 | this->printf("\n\r"); |
| titanium | 0:f99e355ba60d | 40 | index=0; |
| titanium | 0:f99e355ba60d | 41 | break; |
| titanium | 0:f99e355ba60d | 42 | case 0x08: |
| titanium | 0:f99e355ba60d | 43 | case 0x7f: /*BS and DEL delete the last character*/ |
| titanium | 0:f99e355ba60d | 44 | if (index>0) { |
| titanium | 0:f99e355ba60d | 45 | index--; |
| titanium | 0:f99e355ba60d | 46 | this->putc(0x08); |
| titanium | 0:f99e355ba60d | 47 | this->putc(0x20); |
| titanium | 0:f99e355ba60d | 48 | this->putc(0x08); |
| titanium | 0:f99e355ba60d | 49 | } |
| titanium | 0:f99e355ba60d | 50 | break; |
| titanium | 0:f99e355ba60d | 51 | default: |
| titanium | 0:f99e355ba60d | 52 | receiving=2; |
| titanium | 0:f99e355ba60d | 53 | line[index++]=ch; |
| titanium | 0:f99e355ba60d | 54 | this->putc(ch); |
| titanium | 0:f99e355ba60d | 55 | break; |
| titanium | 0:f99e355ba60d | 56 | } |
| titanium | 0:f99e355ba60d | 57 | } |
| titanium | 0:f99e355ba60d | 58 | } |
| titanium | 0:f99e355ba60d | 59 | public: |
| titanium | 0:f99e355ba60d | 60 | KBline(PinName tx, PinName rx) : Serial(tx, rx) |
| titanium | 0:f99e355ba60d | 61 | { |
| titanium | 0:f99e355ba60d | 62 | receiving=0; |
| titanium | 0:f99e355ba60d | 63 | } |
| titanium | 0:f99e355ba60d | 64 | // KBline(Serial *pc) { term=pc; }; //constructor |
| titanium | 0:f99e355ba60d | 65 | void start_getline() |
| titanium | 0:f99e355ba60d | 66 | { |
| titanium | 0:f99e355ba60d | 67 | index=0; |
| titanium | 0:f99e355ba60d | 68 | receiving=1; |
| titanium | 0:f99e355ba60d | 69 | this->attach(this, &KBline::serialirq); |
| titanium | 0:f99e355ba60d | 70 | } |
| titanium | 0:f99e355ba60d | 71 | // int receiving() { return(receiving);} |
| titanium | 0:f99e355ba60d | 72 | char *getline() |
| titanium | 0:f99e355ba60d | 73 | { |
| titanium | 0:f99e355ba60d | 74 | while (receiving!=3) wait(0.1); |
| titanium | 0:f99e355ba60d | 75 | receiving=0; |
| titanium | 0:f99e355ba60d | 76 | return(line); |
| titanium | 0:f99e355ba60d | 77 | } |
| titanium | 0:f99e355ba60d | 78 | } ; |
| titanium | 0:f99e355ba60d | 79 | |
| titanium | 0:f99e355ba60d | 80 | void read_wave() /*timer driven*/ |
| titanium | 0:f99e355ba60d | 81 | { |
| titanium | 0:f99e355ba60d | 82 | wave[readindex++]= mic.read_u16(); //mic.read()*30000; |
| titanium | 0:f99e355ba60d | 83 | if (readindex>=WAVMAX) readindex=0; |
| titanium | 0:f99e355ba60d | 84 | } |
| titanium | 0:f99e355ba60d | 85 | |
| titanium | 0:f99e355ba60d | 86 | void new_writeindex(int wi) |
| titanium | 0:f99e355ba60d | 87 | { |
| titanium | 0:f99e355ba60d | 88 | if (wi<0) wi += WAVMAX; |
| titanium | 0:f99e355ba60d | 89 | writeindex=wi % WAVMAX; |
| titanium | 0:f99e355ba60d | 90 | } |
| titanium | 0:f99e355ba60d | 91 | |
| titanium | 0:f99e355ba60d | 92 | void write_wave() |
| titanium | 0:f99e355ba60d | 93 | { |
| titanium | 0:f99e355ba60d | 94 | unsigned short val=wave[writeindex]; |
| titanium | 0:f99e355ba60d | 95 | pwm.write(val*0.001); |
| titanium | 0:f99e355ba60d | 96 | spk.write_u16(val); // (val/30000.0 ); |
| titanium | 0:f99e355ba60d | 97 | new_writeindex(writeindex+1); |
| titanium | 0:f99e355ba60d | 98 | // wave[index] +=val<<1; |
| titanium | 0:f99e355ba60d | 99 | } |
| titanium | 0:f99e355ba60d | 100 | |
| titanium | 0:f99e355ba60d | 101 | // main() runs in its own thread in the OS |
| titanium | 0:f99e355ba60d | 102 | int main() |
| titanium | 0:f99e355ba60d | 103 | { |
| titanium | 0:f99e355ba60d | 104 | KBline pc(USBTX, USBRX); |
| titanium | 0:f99e355ba60d | 105 | float delay=DELAY; |
| titanium | 0:f99e355ba60d | 106 | |
| titanium | 0:f99e355ba60d | 107 | pc.baud(9600); |
| titanium | 0:f99e355ba60d | 108 | pwm.period_us(50); |
| titanium | 0:f99e355ba60d | 109 | delay=DELAY; |
| titanium | 0:f99e355ba60d | 110 | readindex=0; |
| titanium | 0:f99e355ba60d | 111 | new_writeindex(readindex-delay*SAMPFREQ); |
| titanium | 0:f99e355ba60d | 112 | |
| titanium | 0:f99e355ba60d | 113 | readtick.attach(read_wave, 1.0/SAMPFREQ); |
| titanium | 0:f99e355ba60d | 114 | writetick.attach(write_wave, 1.0/SAMPFREQ); |
| titanium | 0:f99e355ba60d | 115 | pc.printf("echo machine delay=%fs\n\r", delay); |
| titanium | 0:f99e355ba60d | 116 | while (true) { |
| titanium | 0:f99e355ba60d | 117 | pc.start_getline(); |
| titanium | 0:f99e355ba60d | 118 | while (pc.receiving!=3) { |
| titanium | 0:f99e355ba60d | 119 | led1 = !led1; |
| titanium | 0:f99e355ba60d | 120 | wait(0.2); |
| titanium | 0:f99e355ba60d | 121 | } |
| titanium | 0:f99e355ba60d | 122 | delay=(pc.line[0]-'0') *0.1; /* multiple of 0.1s */ |
| titanium | 0:f99e355ba60d | 123 | new_writeindex(readindex-delay*SAMPFREQ); |
| titanium | 0:f99e355ba60d | 124 | pc.printf("new delay %5.2fs %d \n\r", delay, (readindex-writeindex)% WAVMAX); |
| titanium | 0:f99e355ba60d | 125 | } |
| titanium | 0:f99e355ba60d | 126 | } |
| titanium | 0:f99e355ba60d | 127 |