IISEC / Mbed 2 deprecated echo_machine

Dependencies:   mbed

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?

UserRevisionLine numberNew 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