- Code formatting

- remove coef_in.h and coef_out.h that was only included as data definitions in fskmodem.c

If you understand spanish, please help us translate the comments in fskmodem.c. Thanks!


git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@48205 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
Olle Johansson
2006-12-02 13:40:13 +00:00
parent c23bc46089
commit 757363eda4
5 changed files with 173 additions and 136 deletions

View File

@@ -226,8 +226,8 @@ void callerid_get_dtmf(char *cidstring, char *number, int *flags)
} }
number[i] = 0; number[i] = 0;
} else { } else {
ast_log(LOG_DEBUG, "Unknown CID protocol, start digit '%c'\n", if (option_debug)
cidstring[0]); ast_log(LOG_DEBUG, "Unknown CID protocol, start digit '%c'\n", cidstring[0]);
*flags = CID_UNKNOWN_NUMBER; *flags = CID_UNKNOWN_NUMBER;
} }
} }
@@ -240,6 +240,7 @@ int ast_gen_cas(unsigned char *outbuf, int sendsas, int len, int codec)
float ci1 = 0.0; float ci1 = 0.0;
float cr2 = 1.0; float cr2 = 1.0;
float ci2 = 0.0; float ci2 = 0.0;
if (sendsas) { if (sendsas) {
if (len < saslen) if (len < saslen)
return -1; return -1;
@@ -262,10 +263,9 @@ static unsigned short calc_crc(unsigned short crc, unsigned char data)
for (i = 0; i < CHAR_BIT; i++) { for (i = 0; i < CHAR_BIT; i++) {
org <<= 1; org <<= 1;
dst >>= 1; dst >>= 1;
if (org & 0x100) { if (org & 0x100)
dst |= 0x80; dst |= 0x80;
} }
}
data = (unsigned char) dst; data = (unsigned char) dst;
crc ^= (unsigned int) data << (16 - CHAR_BIT); crc ^= (unsigned int) data << (16 - CHAR_BIT);
for (j = 0; j < CHAR_BIT; j++) { for (j = 0; j < CHAR_BIT; j++) {
@@ -344,24 +344,20 @@ int callerid_feed_jp(struct callerid_state *cid, unsigned char *ubuf, int len, i
} }
break; break;
case 1: /* SOH */ case 1: /* SOH */
if (b == 0x01) { if (b == 0x01)
cid->sawflag = 2; cid->sawflag = 2;
}
break ; break ;
case 2: /* HEADER */ case 2: /* HEADER */
if (b == 0x07) { if (b == 0x07)
cid->sawflag = 3; cid->sawflag = 3;
}
break; break;
case 3: /* STX */ case 3: /* STX */
if (b == 0x02) { if (b == 0x02)
cid->sawflag = 4; cid->sawflag = 4;
}
break; break;
case 4: /* SERVICE TYPE */ case 4: /* SERVICE TYPE */
if (b == 0x40) { if (b == 0x40)
cid->sawflag = 5; cid->sawflag = 5;
}
break; break;
case 5: /* Frame Length */ case 5: /* Frame Length */
cid->sawflag = 6; cid->sawflag = 6;
@@ -691,6 +687,7 @@ static int callerid_genmsg(char *msg, int size, const char *number, const char *
char *ptr; char *ptr;
int res; int res;
int i, x; int i, x;
/* Get the time */ /* Get the time */
time(&t); time(&t);
localtime_r(&t,&tm); localtime_r(&t,&tm);
@@ -715,7 +712,8 @@ static int callerid_genmsg(char *msg, int size, const char *number, const char *
} else { } else {
/* Send up to 16 digits of number MAX */ /* Send up to 16 digits of number MAX */
i = strlen(number); i = strlen(number);
if (i > 16) i = 16; if (i > 16)
i = 16;
res = snprintf(ptr, size, "\002%c", i); res = snprintf(ptr, size, "\002%c", i);
size -= res; size -= res;
ptr += res; ptr += res;
@@ -739,7 +737,8 @@ static int callerid_genmsg(char *msg, int size, const char *number, const char *
} else { } else {
/* Send up to 16 digits of name MAX */ /* Send up to 16 digits of name MAX */
i = strlen(name); i = strlen(name);
if (i > 16) i = 16; if (i > 16)
i = 16;
res = snprintf(ptr, size, "\007%c", i); res = snprintf(ptr, size, "\007%c", i);
size -= res; size -= res;
ptr += res; ptr += res;
@@ -763,6 +762,7 @@ int vmwi_generate(unsigned char *buf, int active, int mdmf, int codec)
float cr = 1.0; float cr = 1.0;
float ci = 0.0; float ci = 0.0;
float scont = 0.0; float scont = 0.0;
if (mdmf) { if (mdmf) {
/* MDMF Message waiting */ /* MDMF Message waiting */
msg[len++] = 0x82; msg[len++] = 0x82;

View File

@@ -1,13 +0,0 @@
{ { 1.8229206611e-04,-7.8997325866e-01,2.2401819940e+00,-4.6751353581e+00,5.5080745712e+00,-5.0571565772e+00,2.6215820004e+00,0.0000000000e+00,
}, { 9.8532175289e-02,-5.6297236492e-02,3.3146713415e-01,-9.2239200436e-01,1.4844365184e+00,-2.0183258642e+00,2.0074154497e+00,0.0000000000e+00,
}, }, { { 1.8229206610e-04,-7.8997325866e-01,7.7191410839e-01,-2.8075643964e+00,1.6948618347e+00,-3.0367273700e+00,9.0333559408e-01,0.0000000000e+00,
}, { 9.8531161839e-02,-5.6297236492e-02,1.1421579050e-01,-4.8122536483e-01,4.0121072432e-01,-7.4834487567e-01,6.9170822332e-01,0.0000000000e+00,
}, }, { { 1.8229206611e-04,-7.8997325866e-01,2.9003821430e+00,-6.1082779024e+00,7.7169345751e+00,-6.6075999680e+00,3.3941838836e+00,0.0000000000e+00,
}, { 9.8539686961e-02,-5.6297236492e-02,4.2915323820e-01,-1.2609358633e+00,2.2399213250e+00,-2.9928879142e+00,2.5990173742e+00,0.0000000000e+00,
}, }, { { 1.8229206610e-04,-7.8997325866e-01,-7.7191410839e-01,-2.8075643964e+00,-1.6948618347e+00,-3.0367273700e+00,-9.0333559408e-01,0.0000000000e+00,
}, { 9.8531161839e-02,-5.6297236492e-02,-1.1421579050e-01,-4.8122536483e-01,-4.0121072432e-01,-7.4834487567e-01,-6.9170822332e-01,0.0000000000e+00,
}, }, { { 1.8229206611e-04,-7.8997325866e-01,2.5782298908e+00,-5.3629717478e+00,6.5890882172e+00,-5.8012914776e+00,3.0171839130e+00,0.0000000000e+00,
}, { 9.8534230718e-02,-5.6297236492e-02,3.8148618075e-01,-1.0848760410e+00,1.8441165168e+00,-2.4860666655e+00,2.3103384142e+00,0.0000000000e+00,
}, }, { { 1.8229206610e-04,-7.8997325866e-01,-3.8715051001e-01,-2.6192408538e+00,-8.3977994034e-01,-2.8329897913e+00,-4.5306444352e-01,0.0000000000e+00,
}, { 9.8531160936e-02,-5.6297236492e-02,-5.7284484199e-02,-4.3673866734e-01,-1.9564766257e-01,-6.2028156584e-01,-3.4692356122e-01,0.0000000000e+00,
}, },

View File

@@ -1,4 +0,0 @@
{ 1.3868644653e-08,-6.3283665042e-01,4.0895057217e+00,-1.1020074592e+01,1.5850766191e+01,-1.2835109292e+01,5.5477477340e+00,0.0000000000e+00,
}, { 3.1262119724e-03,-7.8390522307e-03,8.5209627801e-02,-4.0804129163e-01,1.1157139955e+00,-1.8767603680e+00,1.8916395224e+00,0.0000000000e+00
},

View File

@@ -25,6 +25,9 @@
* \author Mark Spencer <markster@digium.com> * \author Mark Spencer <markster@digium.com>
* *
* \arg Includes code and algorithms from the Zapata library. * \arg Includes code and algorithms from the Zapata library.
*
* \todo - REMOVE ALL SPANISH COMMENTS AND TRANSLATE THEM TO ENGLISH. Thank you.
* Swedish will work too :-)
*/ */
#include "asterisk.h" #include "asterisk.h"
@@ -52,7 +55,7 @@ static inline float get_sample(short **buffer, int *len)
(*buffer)++; (*buffer)++;
(*len)--; (*len)--;
return retval; return retval;
} };
#define GET_SAMPLE get_sample(&buffer, len) #define GET_SAMPLE get_sample(&buffer, len)
@@ -63,7 +66,30 @@ static inline float get_sample(short **buffer, int *len)
/* IDX_COEF = 1-6 => Coeficientes y[n] */ /* IDX_COEF = 1-6 => Coeficientes y[n] */
static double coef_in[NF][NBW][8] = { static double coef_in[NF][NBW][8] = {
#include "coef_in.h" {
{ 1.8229206611e-04,-7.8997325866e-01,2.2401819940e+00,-4.6751353581e+00,5.5080745712e+00,-5.0571565772e+00,2.6215820004e+00,0.0000000000e+00, },
{ 9.8532175289e-02,-5.6297236492e-02,3.3146713415e-01,-9.2239200436e-01,1.4844365184e+00,-2.0183258642e+00,2.0074154497e+00,0.0000000000e+00, },
},
{
{ 1.8229206610e-04,-7.8997325866e-01,7.7191410839e-01,-2.8075643964e+00,1.6948618347e+00,-3.0367273700e+00,9.0333559408e-01,0.0000000000e+00, } ,
{ 9.8531161839e-02,-5.6297236492e-02,1.1421579050e-01,-4.8122536483e-01,4.0121072432e-01,-7.4834487567e-01,6.9170822332e-01,0.0000000000e+00, },
},
{
{ 1.8229206611e-04,-7.8997325866e-01,2.9003821430e+00,-6.1082779024e+00,7.7169345751e+00,-6.6075999680e+00,3.3941838836e+00,0.0000000000e+00, },
{ 9.8539686961e-02,-5.6297236492e-02,4.2915323820e-01,-1.2609358633e+00,2.2399213250e+00,-2.9928879142e+00,2.5990173742e+00,0.0000000000e+00, },
},
{
{ 1.8229206610e-04,-7.8997325866e-01,-7.7191410839e-01,-2.8075643964e+00,-1.6948618347e+00,-3.0367273700e+00,-9.0333559408e-01,0.0000000000e+00, },
{ 9.8531161839e-02,-5.6297236492e-02,-1.1421579050e-01,-4.8122536483e-01,-4.0121072432e-01,-7.4834487567e-01,-6.9170822332e-01,0.0000000000e+00, },
},
{
{ 1.8229206611e-04,-7.8997325866e-01,2.5782298908e+00,-5.3629717478e+00,6.5890882172e+00,-5.8012914776e+00,3.0171839130e+00,0.0000000000e+00, },
{ 9.8534230718e-02,-5.6297236492e-02,3.8148618075e-01,-1.0848760410e+00,1.8441165168e+00,-2.4860666655e+00,2.3103384142e+00,0.0000000000e+00, },
},
{
{ 1.8229206610e-04,-7.8997325866e-01,-3.8715051001e-01,-2.6192408538e+00,-8.3977994034e-01,-2.8329897913e+00,-4.5306444352e-01,0.0000000000e+00, },
{ 9.8531160936e-02,-5.6297236492e-02,-5.7284484199e-02,-4.3673866734e-01,-1.9564766257e-01,-6.2028156584e-01,-3.4692356122e-01,0.0000000000e+00, },
},
}; };
/* Coeficientes para filtro de salida */ /* Coeficientes para filtro de salida */
@@ -73,7 +99,8 @@ static double coef_in[NF][NBW][8]={
/* IDX_COEF = 1-6 => Coeficientes y[n] */ /* IDX_COEF = 1-6 => Coeficientes y[n] */
static double coef_out[NBW][8] = { static double coef_out[NBW][8] = {
#include "coef_out.h" { 1.3868644653e-08,-6.3283665042e-01,4.0895057217e+00,-1.1020074592e+01,1.5850766191e+01,-1.2835109292e+01,5.5477477340e+00,0.0000000000e+00, },
{ 3.1262119724e-03,-7.8390522307e-03,8.5209627801e-02,-4.0804129163e-01,1.1157139955e+00,-1.8767603680e+00,1.8916395224e+00,0.0000000000e+00, },
}; };
@@ -88,9 +115,11 @@ static inline float filtroM(fsk_data *fskd,float in)
fskd->fmxv[(fskd->fmp+6)&7] = in*(*pc++); fskd->fmxv[(fskd->fmp+6)&7] = in*(*pc++);
s = (fskd->fmxv[(fskd->fmp + 6) & 7] - fskd->fmxv[fskd->fmp]) + 3 * (fskd->fmxv[(fskd->fmp + 2) & 7] - fskd->fmxv[(fskd->fmp + 4) & 7]); s = (fskd->fmxv[(fskd->fmp + 6) & 7] - fskd->fmxv[fskd->fmp]) + 3 * (fskd->fmxv[(fskd->fmp + 2) & 7] - fskd->fmxv[(fskd->fmp + 4) & 7]);
for (i=0,j=fskd->fmp;i<6;i++,j++) s+=fskd->fmyv[j&7]*(*pc++); for (i = 0, j = fskd->fmp; i < 6; i++, j++)
s += fskd->fmyv[j&7]*(*pc++);
fskd->fmyv[j&7] = s; fskd->fmyv[j&7] = s;
fskd->fmp++; fskd->fmp&=7; fskd->fmp++;
fskd->fmp &= 7;
return s; return s;
} }
@@ -105,9 +134,11 @@ static inline float filtroS(fsk_data *fskd,float in)
fskd->fsxv[(fskd->fsp+6)&7] = in*(*pc++); fskd->fsxv[(fskd->fsp+6)&7] = in*(*pc++);
s = (fskd->fsxv[(fskd->fsp + 6) & 7] - fskd->fsxv[fskd->fsp]) + 3 * (fskd->fsxv[(fskd->fsp + 2) & 7] - fskd->fsxv[(fskd->fsp + 4) & 7]); s = (fskd->fsxv[(fskd->fsp + 6) & 7] - fskd->fsxv[fskd->fsp]) + 3 * (fskd->fsxv[(fskd->fsp + 2) & 7] - fskd->fsxv[(fskd->fsp + 4) & 7]);
for (i=0,j=fskd->fsp;i<6;i++,j++) s+=fskd->fsyv[j&7]*(*pc++); for (i = 0, j = fskd->fsp; i < 6; i++, j++)
s += fskd->fsyv[j&7]*(*pc++);
fskd->fsyv[j&7] = s; fskd->fsyv[j&7] = s;
fskd->fsp++; fskd->fsp&=7; fskd->fsp++;
fskd->fsp &= 7;
return s; return s;
} }
@@ -126,9 +157,11 @@ static inline float filtroL(fsk_data *fskd,float in)
15 * (fskd->flxv[(fskd->flp+2)&7] + fskd->flxv[(fskd->flp+4)&7]) + 15 * (fskd->flxv[(fskd->flp+2)&7] + fskd->flxv[(fskd->flp+4)&7]) +
20 * fskd->flxv[(fskd->flp+3)&7]; 20 * fskd->flxv[(fskd->flp+3)&7];
for (i=0,j=fskd->flp;i<6;i++,j++) s+=fskd->flyv[j&7]*(*pc++); for (i = 0,j = fskd->flp;i<6;i++,j++)
s += fskd->flyv[j&7]*(*pc++);
fskd->flyv[j&7] = s; fskd->flyv[j&7] = s;
fskd->flp++; fskd->flp&=7; fskd->flp++;
fskd->flp &= 7;
return s; return s;
} }
@@ -149,7 +182,7 @@ static inline int demodulador(fsk_data *fskd, float *retval, float x)
fskd->pcola &= (NCOLA-1); fskd->pcola &= (NCOLA-1);
*retval = x; *retval = x;
return(0); return 0;
} }
static int get_bit_raw(fsk_data *fskd, short *buffer, int *len) static int get_bit_raw(fsk_data *fskd, short *buffer, int *len)
@@ -159,15 +192,20 @@ static int get_bit_raw(fsk_data *fskd, short *buffer, int *len)
int f; int f;
spb = fskd->spb; spb = fskd->spb;
if (fskd->spb == 7) spb = 8000.0 / 1200.0; if (fskd->spb == 7)
spb = 8000.0 / 1200.0;
ds = spb/32.; ds = spb/32.;
spb2 = spb/2.; spb2 = spb/2.;
for (f = 0;;) { for (f = 0;;) {
if (demodulador(fskd,&x, GET_SAMPLE)) return(-1); if (demodulador(fskd, &x, GET_SAMPLE))
return -1;
if ((x * fskd->x0) < 0) { /* Transicion */ if ((x * fskd->x0) < 0) { /* Transicion */
if (!f) { if (!f) {
if (fskd->cont<(spb2)) fskd->cont+=ds; else fskd->cont-=ds; if (fskd->cont<(spb2))
fskd->cont += ds;
else
fskd->cont -= ds;
f = 1; f = 1;
} }
} }
@@ -179,7 +217,7 @@ static int get_bit_raw(fsk_data *fskd, short *buffer, int *len)
} }
} }
f = (x > 0) ? 0x80 : 0; f = (x > 0) ? 0x80 : 0;
return(f); return f;
} }
int fsk_serie(fsk_data *fskd, short *buffer, int *len, int *outbyte) int fsk_serie(fsk_data *fskd, short *buffer, int *len, int *outbyte)
@@ -188,6 +226,7 @@ int fsk_serie(fsk_data *fskd, short *buffer, int *len, int *outbyte)
int i,j,n1,r; int i,j,n1,r;
int samples = 0; int samples = 0;
int olen; int olen;
switch(fskd->state) { switch(fskd->state) {
/* Pick up where we left off */ /* Pick up where we left off */
case STATE_SEARCH_STARTBIT2: case STATE_SEARCH_STARTBIT2:
@@ -215,21 +254,23 @@ of a transmission (what a LOSING design), we cant do it this elegantly */
beginning of a start bit in the TDD sceanario. It just looks for sufficient beginning of a start bit in the TDD sceanario. It just looks for sufficient
level to maybe, perhaps, guess, maybe that its maybe the beginning of level to maybe, perhaps, guess, maybe that its maybe the beginning of
a start bit, perhaps. This whole thing stinks! */ a start bit, perhaps. This whole thing stinks! */
if (demodulador(fskd,&fskd->x1,GET_SAMPLE)) return(-1); if (demodulador(fskd,&fskd->x1,GET_SAMPLE))
return -1;
samples++; samples++;
for(;;) for(;;) {
{
search_startbit2: search_startbit2:
if (!*len) { if (!*len) {
fskd->state = STATE_SEARCH_STARTBIT2; fskd->state = STATE_SEARCH_STARTBIT2;
return 0; return 0;
} }
samples++; samples++;
if (demodulador(fskd,&fskd->x2,GET_SAMPLE)) return(-1); if (demodulador(fskd,&fskd->x2,GET_SAMPLE))
return(-1);
#if 0 #if 0
printf("x2 = %5.5f ", fskd->x2); printf("x2 = %5.5f ", fskd->x2);
#endif #endif
if (fskd->x2 < -0.5) break; if (fskd->x2 < -0.5)
break;
} }
search_startbit3: search_startbit3:
/* Esperamos 0.5 bits antes de usar DPLL */ /* Esperamos 0.5 bits antes de usar DPLL */
@@ -238,11 +279,14 @@ search_startbit3:
fskd->state = STATE_SEARCH_STARTBIT3; fskd->state = STATE_SEARCH_STARTBIT3;
return 0; return 0;
} }
for(;i;i--) { if (demodulador(fskd,&fskd->x1,GET_SAMPLE)) return(-1); for(;i;i--) {
if (demodulador(fskd,&fskd->x1,GET_SAMPLE))
return(-1);
#if 0 #if 0
printf("x1 = %5.5f ", fskd->x1); printf("x1 = %5.5f ", fskd->x1);
#endif #endif
samples++; } samples++;
}
/* x1 debe ser negativo (confirmaci<63>n del bit de start) */ /* x1 debe ser negativo (confirmaci<63>n del bit de start) */
@@ -266,9 +310,12 @@ getbyte:
olen = *len; olen = *len;
i = get_bit_raw(fskd, buffer, len); i = get_bit_raw(fskd, buffer, len);
buffer += (olen - *len); buffer += (olen - *len);
if (i == -1) return(-1); if (i == -1)
if (i) n1++; return(-1);
a>>=1; a|=i; if (i)
n1++;
a >>= 1;
a |= i;
} }
j = 8-fskd->nbit; j = 8-fskd->nbit;
a >>= j; a >>= j;
@@ -278,12 +325,16 @@ getbyte:
olen = *len; olen = *len;
i = get_bit_raw(fskd, buffer, len); i = get_bit_raw(fskd, buffer, len);
buffer += (olen - *len); buffer += (olen - *len);
if (i == -1) return(-1); if (i == -1)
if (i) n1++; return(-1);
if (i)
n1++;
if (fskd->paridad == 1) { /* paridad = 1 (par) */ if (fskd->paridad == 1) { /* paridad = 1 (par) */
if (n1&1) a|=0x100; /* error */ if (n1&1)
a |= 0x100; /* error */
} else { /* paridad = 2 (impar) */ } else { /* paridad = 2 (impar) */
if (!(n1&1)) a|=0x100; /* error */ if (!(n1&1))
a |= 0x100; /* error */
} }
} }
@@ -291,8 +342,10 @@ getbyte:
for (j = fskd->nstop;j;j--) { for (j = fskd->nstop;j;j--) {
r = get_bit_raw(fskd, buffer, len); r = get_bit_raw(fskd, buffer, len);
if (r == -1) return(-1); if (r == -1)
if (!r) a|=0x200; return(-1);
if (!r)
a |= 0x200;
} }
/* Por fin retornamos */ /* Por fin retornamos */

View File

@@ -174,7 +174,8 @@ int tdd_feed(struct tdd_state *tdd, unsigned char *ubuf, int len)
if (b > 0x7f) if (b > 0x7f)
continue; continue;
c = tdd_decode_baudot(tdd,b); c = tdd_decode_baudot(tdd,b);
if ((c < 1) || (c > 126)) continue; /* if not valid */ if ((c < 1) || (c > 126))
continue; /* if not valid */
break; break;
} }
} }