uint32_t bit_factor;
uint32_t bit_accum;
uint32_t sample_counter;
+ int32_t samples_per_bit;
+ int32_t est_bytes;
fsk_modem_types_t modem_type;
zap_fsk_data_state_t *fsk_data;
zap_fsk_write_sample_t write_sample_callback;
zap_channel_state_t last_state;
zap_mutex_t *mutex;
teletone_dtmf_detect_state_t dtmf_detect;
- uint32_t dtmf_delay;
+ uint32_t buffer_delay;
zap_event_t event_header;
char last_error[256];
zio_event_cb_t event_callback;
uint32_t skip_read_frames;
zap_buffer_t *dtmf_buffer;
zap_buffer_t *digit_buffer;
+ zap_buffer_t *fsk_buffer;
uint32_t dtmf_on;
uint32_t dtmf_off;
teletone_generation_session_t tone_session;
zio_span_next_event_t next_event;
};
+zap_size_t zap_fsk_modulator_generate_bit(zap_fsk_modulator_t *fsk_trans, int8_t bit, int16_t *buf, zap_size_t buflen);
+int32_t zap_fsk_modulator_generate_carrier_bits(zap_fsk_modulator_t *fsk_trans, uint32_t bits);
+void zap_fsk_modulator_generate_chan_sieze(zap_fsk_modulator_t *fsk_trans);
+void zap_fsk_modulator_send_data(zap_fsk_modulator_t *fsk_trans);
#define zap_fsk_modulator_send_all(_it) zap_fsk_modulator_generate_chan_sieze(_it); \
zap_fsk_modulator_generate_carrier_bits(_it, _it->carrier_bits_start); \
zap_fsk_modulator_send_data(_it); \
void zap_channel_rotate_tokens(zap_channel_t *zchan);
void zap_channel_clear_detected_tones(zap_channel_t *zchan);
void zap_channel_clear_needed_tones(zap_channel_t *zchan);
+zap_status_t zap_channel_send_fsk_data(zap_channel_t *zchan, zap_fsk_data_state_t *fsk_data, float db_level);
zap_status_t zap_channel_clear_token(zap_channel_t *zchan, int32_t token_id);
zap_status_t zap_channel_add_token(zap_channel_t *zchan, char *token);
zap_status_t zap_channel_set_state(zap_channel_t *zchan, zap_channel_state_t state);
struct helper {
int fd;
+ int wrote;
};
zap_status_t my_write_sample(int16_t *buf, zap_size_t buflen, void *user_data)
struct helper *foo = (struct helper *) user_data;
write(foo->fd, buf, buflen * 2);
+ foo->wrote += buflen * 2;
+ return ZAP_SUCCESS;
}
int main(int argc, char *argv[])
char str[128] = "";
char fbuf[256];
uint8_t databuf[1024] = "";
- struct helper foo;
-
+ struct helper foo = {0};
+ int x, bytes, start_bits = 180, stop_bits = 5, sbits = 300;
if (argc < 2) {
zap_fsk_data_add_mdmf(&fsk_data, MDMF_DATETIME, "06061234", 8);
zap_fsk_data_add_mdmf(&fsk_data, MDMF_PHONE_NUM, "5551212", 7);
zap_fsk_data_add_mdmf(&fsk_data, MDMF_PHONE_NAME, "Fred Smith", 10);
- //zap_fsk_data_add_mdmf(&fsk_data, MDMF_ALT_ROUTE, url, strlen(url));
+ for(x = 0; x < 0; x++)
+ zap_fsk_data_add_mdmf(&fsk_data, MDMF_ALT_ROUTE, url, strlen(url));
#else
zap_fsk_data_add_sdmf(&fsk_data, "06061234", "0");
//zap_fsk_data_add_sdmf(&state, "06061234", "5551212");
zap_fsk_modulator_init(&fsk_trans, FSK_BELL202, 8000, &fsk_data, -14, 180, 5, 300, my_write_sample, &foo);
zap_fsk_modulator_send_all((&fsk_trans));
+ printf("%d %d %d\n", fsk_data.dlen, foo.wrote, fsk_trans.est_bytes);
+
if (fd > -1) {
close (fd);
}
for (i = 0; i < bits; i++) {
if ((r = zap_fsk_modulator_generate_bit(fsk_trans, bit, fsk_trans->sample_buffer, sizeof(fsk_trans->sample_buffer) / 2))) {
- fsk_trans->write_sample_callback(fsk_trans->sample_buffer, r, fsk_trans->user_data);
+ if (fsk_trans->write_sample_callback(fsk_trans->sample_buffer, r, fsk_trans->user_data) != ZAP_SUCCESS) {
+ break;
+ }
} else {
break;
}
for (i = 0; i < fsk_trans->chan_sieze_bits; i++) {
if ((r = zap_fsk_modulator_generate_bit(fsk_trans, bit, fsk_trans->sample_buffer, sizeof(fsk_trans->sample_buffer) / 2))) {
- fsk_trans->write_sample_callback(fsk_trans->sample_buffer, r, fsk_trans->user_data);
+ if (fsk_trans->write_sample_callback(fsk_trans->sample_buffer, r, fsk_trans->user_data) != ZAP_SUCCESS) {
+ break;
+ }
} else {
break;
}
while((bit = zap_bitstream_get_bit(&fsk_trans->bs)) > -1) {
if ((r = zap_fsk_modulator_generate_bit(fsk_trans, bit, fsk_trans->sample_buffer, sizeof(fsk_trans->sample_buffer) / 2))) {
- fsk_trans->write_sample_callback(fsk_trans->sample_buffer, r, fsk_trans->user_data);
+ if (fsk_trans->write_sample_callback(fsk_trans->sample_buffer, r, fsk_trans->user_data) != ZAP_SUCCESS) {
+ break;
+ }
} else {
break;
}
teletone_dds_state_set_tone(&fsk_trans->dds, fsk_modem_definitions[fsk_trans->modem_type].freq_space, sample_rate, 0);
teletone_dds_state_set_tone(&fsk_trans->dds, fsk_modem_definitions[fsk_trans->modem_type].freq_mark, sample_rate, 1);
fsk_trans->bit_factor = (fsk_modem_definitions[fsk_trans->modem_type].baud_rate * ZAP_FSK_MOD_FACTOR) / (float)sample_rate;
+ fsk_trans->samples_per_bit = (uint32_t) (sample_rate / fsk_modem_definitions[fsk_trans->modem_type].baud_rate);
+ fsk_trans->est_bytes = ((fsk_data->dlen * 10) + carrier_bits_start + carrier_bits_stop + chan_sieze_bits) * ((fsk_trans->samples_per_bit + 1) * 2);
fsk_trans->bit_accum = 0;
fsk_trans->fsk_data = fsk_data;
teletone_dds_state_set_tx_level(&fsk_trans->dds, db_level);
return ZAP_NOTIMPL;
}
+static zap_status_t zchan_fsk_write_sample(int16_t *buf, zap_size_t buflen, void *user_data)
+{
+ zap_channel_t *zchan = (zap_channel_t *) user_data;
+ zap_buffer_write(zchan->fsk_buffer, buf, buflen * 2);
+ return ZAP_SUCCESS;
+}
+
+zap_status_t zap_channel_send_fsk_data(zap_channel_t *zchan, zap_fsk_data_state_t *fsk_data, float db_level)
+{
+ struct zap_fsk_modulator fsk_trans;
+
+ if (!zchan->fsk_buffer) {
+ zap_buffer_create(&zchan->fsk_buffer, 128, 128, 0);
+ }
+ zap_fsk_modulator_init(&fsk_trans, FSK_BELL202, zchan->rate, fsk_data, -14, 180, 5, 180, zchan_fsk_write_sample, zchan);
+ zap_fsk_modulator_send_all((&fsk_trans));
+ zchan->buffer_delay = 2000 / zchan->effective_interval;
+ return ZAP_SUCCESS;
+}
+
+
zap_status_t zap_channel_set_event_callback(zap_channel_t *zchan, zio_event_cb_t event_callback)
{
zap_mutex_lock(zchan->mutex);
{
zap_status_t status = ZAP_FAIL;
zio_codec_t codec_func = NULL;
- zap_size_t dtmf_blen, max = datasize;
-
+ zap_size_t blen, max = datasize;
+ zap_buffer_t *buffer = NULL;
+
assert(zchan != NULL);
assert(zchan->zio != NULL);
}
}
- if (zchan->dtmf_buffer && (dtmf_blen = zap_buffer_inuse(zchan->dtmf_buffer)) && (!zchan->dtmf_delay || --zchan->dtmf_delay == 0)) {
+ if (!zchan->buffer_delay || --zchan->buffer_delay == 0) {
+ if (zchan->fsk_buffer && (blen = zap_buffer_inuse(zchan->fsk_buffer))) {
+ buffer = zchan->fsk_buffer;
+ } else if (zchan->dtmf_buffer && (blen = zap_buffer_inuse(zchan->dtmf_buffer))) {
+ buffer = zchan->dtmf_buffer;
+ }
+ }
+
+ if (buffer) {
zap_size_t dlen = *datalen;
uint8_t auxbuf[1024];
zap_size_t len, br;
dlen *= 2;
}
- len = dtmf_blen > dlen ? dlen : dtmf_blen;
+ len = blen > dlen ? dlen : blen;
- br = zap_buffer_read(zchan->dtmf_buffer, auxbuf, len);
+ br = zap_buffer_read(buffer, auxbuf, len);
if (br < dlen) {
memset(auxbuf + br, 0, dlen - br);