]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
add file
authorAnthony Minessale <anthony.minessale@gmail.com>
Tue, 5 Jun 2007 18:27:51 +0000 (18:27 +0000)
committerAnthony Minessale <anthony.minessale@gmail.com>
Tue, 5 Jun 2007 18:27:51 +0000 (18:27 +0000)
git-svn-id: http://svn.openzap.org/svn/openzap/trunk@221 a93c3328-9c30-0410-af19-c9cd2b2d52af

libs/freetdm/src/zap_callerid.c [new file with mode: 0644]

diff --git a/libs/freetdm/src/zap_callerid.c b/libs/freetdm/src/zap_callerid.c
new file mode 100644 (file)
index 0000000..f94ec59
--- /dev/null
@@ -0,0 +1,141 @@
+#include "openzap.h"
+#include "fsk.h"
+#include "uart.h"
+
+
+static void fsk_byte_handler (void *x, int data)
+{
+       zap_fsk_data_state_t *state = (zap_fsk_data_state_t *) x;
+       uint8_t byte = data;
+
+ top:
+
+       if (state->init == 3) {
+               return;
+       }
+
+       if (state->dlen) {
+               goto add_byte;
+       }
+
+       if (state->bpos == 1) {
+               state->blen = byte;
+
+               if ((uint32_t)(state->dlen = state->bpos + byte + 2) > state->bufsize) {
+                       state->dlen = state->bufsize;
+               }
+               goto top;
+       }
+
+ add_byte:
+
+       if (state->bpos <= state->dlen) {
+               state->buf[state->bpos++] = byte;
+       } else {
+               state->init = 3;
+       }
+}
+
+zap_status_t zap_fsk_data_parse(zap_fsk_data_state_t *state, zap_size_t *type, char **data, zap_size_t *len)
+{
+
+       int i, sum = 0;
+       
+ top:
+
+       if (state->checksum != 0 || state->ppos >= state->dlen - 1) {
+               return ZAP_FAIL;
+       }
+
+       if (!state->ppos) {
+               for(i = 0; i < state->bpos; i++) {
+                       sum += state->buf[i];
+               }
+               state->checksum = sum % 256;
+               state->ppos = 2;                
+               if (state->buf[0] != ZAP_CID_TYPE_MDMF && state->buf[0] != ZAP_CID_TYPE_SDMF) {
+                       state->checksum = -1;
+               }
+               goto top;
+       }
+
+       if (state->buf[0] == ZAP_CID_TYPE_SDMF) {
+               /* convert sdmf to mdmf so we don't need 2 parsers */
+               if (state->ppos == 2) {
+                       *type = MDMF_DATETIME;
+                       *len = 8;
+               } else {
+                       if (state->buf[state->ppos] == 'P' || state->buf[state->ppos] == 'O') {
+                               *type = MDMF_NO_NUM;
+                               *len = 1;
+                       } else {
+                               *type = MDMF_PHONE_NUM;
+                               *len = state->blen - 8;
+                       }
+               }
+               *data = (char *)&state->buf[state->ppos];
+               state->ppos += *len;            
+               return ZAP_SUCCESS;
+       } else if (state->buf[0] == ZAP_CID_TYPE_MDMF) {
+               *type = state->buf[state->ppos++];
+               *len = state->buf[state->ppos++];
+               *data = (char *)&state->buf[state->ppos];
+               state->ppos += *len;
+               return ZAP_SUCCESS;
+       }
+
+       return ZAP_FAIL;
+}
+
+zap_status_t zap_fsk_demod_feed(zap_fsk_data_state_t *state, int16_t *data, zap_size_t samples)
+{
+       uint32_t x;
+       int16_t *sp = data;
+
+       if (state->init == 3) {
+               return ZAP_FAIL;
+       }
+
+       for (x = 0; x < samples; x++) {
+               dsp_fsk_sample (state->fsk1200_handle, (double) *sp++ / 32767.0);
+               if (state->dlen && state->bpos >= state->dlen) {
+                       state->init = 3;
+                       return ZAP_FAIL;
+               }
+       }
+
+       return ZAP_SUCCESS;
+}
+
+zap_status_t zap_fsk_demod_destroy(zap_fsk_data_state_t *state)
+{
+       dsp_fsk_destroy(&state->fsk1200_handle);
+       memset(state, 0, sizeof(*state));
+       return ZAP_SUCCESS;
+}
+
+int zap_fsk_demod_init(zap_fsk_data_state_t *state, int rate, uint8_t *buf, zap_size_t bufsize)
+{
+
+       dsp_fsk_attr_t fsk1200_attr;
+
+       if (state->fsk1200_handle) {
+               dsp_fsk_destroy(&state->fsk1200_handle);
+       }
+
+       state->buf = buf;
+       state->bufsize = bufsize;
+       
+       dsp_fsk_attr_init (&fsk1200_attr);
+       dsp_fsk_attr_set_samplerate (&fsk1200_attr, rate);
+       dsp_fsk_attr_set_bytehandler (&fsk1200_attr, fsk_byte_handler, state);
+       state->fsk1200_handle = dsp_fsk_create (&fsk1200_attr);
+
+       if (state->fsk1200_handle == NULL) {
+               return ZAP_FAIL;
+       }
+
+       return ZAP_SUCCESS;
+}
+
+