www.pudn.com > slow.zip > progress.C
/********************************************************* ********************************************************** progress.c ********************************************************** **********************************************************/ #line 1 "progress.F" /* Modem for MIPS AJF January 1995 Wait for tone (dial, connect, etc.) */ #include#include #include #include #line 1 "< >" static float _fstepf_1(filter *fi, float x) { /* /usr/fisher/mipsbin/mkfilter -Bu -Bp -o 2 -a 0.04062500000 0.04270833333 -l */ float *v = fi -> v; v[0] = v[1]; v[1] = v[2]; v[2] = v[3]; v[3] = v[4]; v[4] = ( 4.2443368477e-05 * x) + ( -0.9816582826 * v[0]) + ( 3.8104707151 * v[1]) + ( -5.6793132062 * v[2]) + ( 3.8459049510 * v[3]); return (v[0] + v[4]) - 2 * v[2]; } static fspec _fspecs_1 = { 4, 4, _fstepf_1 }; static float _fstepf_2(filter *fi, float x) { /* /usr/fisher/mipsbin/mkfilter -Bu -Bp -o 2 -a 0.04583333333 0.04791666667 -l */ float *v = fi -> v; v[0] = v[1]; v[1] = v[2]; v[2] = v[3]; v[3] = v[4]; v[4] = ( 4.2443368700e-05 * x) + ( -0.9816582826 * v[0]) + ( 3.7750239468 * v[1]) + ( -5.6108354356 * v[2]) + ( 3.8101285572 * v[3]); return (v[0] + v[4]) - 2 * v[2]; } static fspec _fspecs_2 = { 4, 4, _fstepf_2 }; static float _fstepf_3(filter *fi, float x) { /* /usr/fisher/mipsbin/mkfilter -Bu -Bp -o 2 -a 0.21770833333 0.21979166667 -l */ float *v = fi -> v; v[0] = v[1]; v[1] = v[2]; v[2] = v[3]; v[3] = v[4]; v[4] = ( 4.2443368410e-05 * x) + ( -0.9816582826 * v[0]) + ( 0.7696097760 * v[1]) + ( -2.1323332640 * v[2]) + ( 0.7767665124 * v[3]); return (v[0] + v[4]) - 2 * v[2]; } static fspec _fspecs_3 = { 4, 4, _fstepf_3 }; static float _fstepf_4(filter *fi, float x) { /* /usr/fisher/mipsbin/mkfilter -Hp -Bu -o 2 -a 0.03125 -l */ float *v = fi -> v; v[0] = v[1]; v[1] = v[2]; v[2] = ( 8.7033077934e-01 * x) + ( -0.7575469445 * v[0]) + ( 1.7237761728 * v[1]); return (v[0] + v[2]) - 2 * v[1]; } static fspec _fspecs_4 = { 2, 2, _fstepf_4 }; static float _fstepf_5(filter *fi, float x) { /* /usr/fisher/mipsbin/mkfilter -Bu -Lp -o 2 -a 0.004166666667 -l */ float *v = fi -> v; v[0] = v[1]; v[1] = v[2]; v[2] = ( 1.6822370862e-04 * x) + ( -0.9636529842 * v[0]) + ( 1.9629800894 * v[1]); return (v[0] + v[2]) + 2 * v[1]; } static fspec _fspecs_5 = { 2, 2, _fstepf_5 }; #line 9 "progress.F" #include #include #include "modem.h" #define debug_cadence false struct cadence_detector { cadence_detector() { pcnt = acnt = 0; /* sample counts */ oncount = offcount = 0; /* cadence on/off counts */ } void insert(bool); void debug(); int oncount, offcount; private: int pcnt, acnt; }; /* Filter coeffs constructed by: mkfilter -Bu -Bp -o 2 -a (A1) (A2) where A1 = F1 / SAMPLERATE, A2 = F2 / SAMPLERATE Indexed by tone; see modem.h */ static fspec *bpfspecs[] = { (&_fspecs_1), /* 390 .. 410 Hz, centre 400 Hz [0] */ (&_fspecs_2), /* 440 .. 460 Hz, centre 450 Hz [1] (dial) */ (&_fspecs_3), /* 2090 .. 2110 Hz, centre 2100 Hz [2] (conn) */ }; static fspec *fefs = (&_fspecs_4); /* 300 Hz hpf */ static fspec *lpfs = (&_fspecs_5); /* 40 Hz lpf */ inline int secs(float f) { return (int) (f * SAMPLERATE); } global void waitfortone(int tone) { tone_detector *td1 = new tone_detector(fefs, bpfspecs[0], lpfs, true), *td2 = new tone_detector(fefs, bpfspecs[tone], lpfs, true); cadence_detector *cd1 = new cadence_detector(), *cd2 = new cadence_detector(); int totcount = 0; bool found = false; until (found) { float x = insample(); td1 -> insert(x); cd1 -> insert(td1 -> present); td2 -> insert(x); cd2 -> insert(td2 -> present); if (debug_cadence && totcount%500 == 0) { td1 -> debug(); cd1 -> debug(); td2 -> debug(); cd2 -> debug(); putc('\n', stderr); } switch (tone) { case DIAL_TONE: if (totcount >= secs(5.0f)) giveup("No dial tone"); if (td2 -> prescount > secs(1.5f)) found = true; break; case CONN_TONE: if (totcount % secs(3.5f) == 0) { /* send CNG or V.25 CT every 3.5 secs */ float f = (options & opt_fax) ? 1100.0 : 1300.0; sendfreq(f, 0.5f); } if (totcount >= secs(45.0f)) giveup("No reply"); /* long delay in case there's an answering m/c */ if ((td2 -> prescount > secs(2.7f)) || (cd2 -> oncount > 6)) found = true; /* V.25, V.25 bis */ break; } if (td1 -> prescount >= secs(3.0f)) giveup("Number unobtainable"); if (cd1 -> oncount >= 4 && cd1 -> offcount >= 4) giveup("Number busy"); totcount++; } delete td1; delete td2; delete cd1; delete cd2; } void cadence_detector::insert(bool pres) { if (pres) { pcnt++; if (acnt >= secs(0.25f) && acnt <= secs(0.55f)) offcount++; /* 0.25 was 0.3 */ acnt = 0; } else { acnt++; if (pcnt >= secs(0.25f) && pcnt <= secs(0.55f)) oncount++; /* 0.25 was 0.3 */ pcnt = 0; } } void cadence_detector::debug() { fprintf(stderr, " [%d:%d]", offcount, oncount); }