zap_status_t zap_analog_configure_span(zap_span_t *span, char *tonemap, uint32_t digit_timeout, uint32_t max_dialstr, zio_signal_cb_t sig_cb)
{
-
+ zap_analog_data_t *analog_data;
assert(sig_cb != NULL);
if (span->signal_type) {
max_dialstr = 11;
}
- span->analog_data = malloc(sizeof(*span->analog_data));
- memset(span->analog_data, 0, sizeof(*span->analog_data));
- assert(span->analog_data != NULL);
+ analog_data = malloc(sizeof(*analog_data));
+ memset(analog_data, 0, sizeof(*analog_data));
+ assert(analog_data != NULL);
- span->analog_data->digit_timeout = digit_timeout;
- span->analog_data->max_dialstr = max_dialstr;
- span->analog_data->sig_cb = sig_cb;
+ analog_data->digit_timeout = digit_timeout;
+ analog_data->max_dialstr = max_dialstr;
+ analog_data->sig_cb = sig_cb;
span->signal_type = ZAP_SIGTYPE_ANALOG;
+ span->signal_data = analog_data;
span->outgoing_call = span->trunk_type == ZAP_TRUNK_FXS ? analog_fxs_outgoing_call : analog_fxo_outgoing_call;
zap_span_load_tones(span, tonemap);
zap_tone_type_t tt = ZAP_TONE_DTMF;
char dtmf[128] = "";
zap_size_t dtmf_offset = 0;
- zap_analog_data_t *data = zchan->span->analog_data;
+ zap_analog_data_t *analog_data = zchan->span->signal_data;
zap_channel_t *closed_chan;
uint32_t state_counter = 0, elapsed = 0, interval = 0, last_digit = 0, indicate = 0, dial_timeout = 30000;
zap_sigmsg_t sig;
sig.event_id = ZAP_SIGEVENT_UP;
}
- data->sig_cb(&sig);
+ analog_data->sig_cb(&sig);
continue;
}
break;
zap_set_string(zchan->caller_data.dnis, dtmf);
}
- data->sig_cb(&sig);
+ analog_data->sig_cb(&sig);
continue;
}
break;
{
zap_channel_done(zchan);
sig.event_id = ZAP_SIGEVENT_STOP;
- data->sig_cb(&sig);
+ analog_data->sig_cb(&sig);
goto done;
}
break;
}
- if (last_digit && ((elapsed - last_digit > data->digit_timeout) || strlen(dtmf) > data->max_dialstr)) {
+ if (last_digit && ((elapsed - last_digit > analog_data->digit_timeout) || strlen(dtmf) > analog_data->max_dialstr)) {
zap_log(ZAP_LOG_DEBUG, "Number obtained [%s]\n", dtmf);
zap_set_state_locked(zchan, ZAP_CHANNEL_STATE_IDLE);
last_digit = 0;
if (zchan->detected_tones[i]) {
zap_log(ZAP_LOG_DEBUG, "Detected tone %s\n", zap_tonemap2str(zchan->detected_tones[i]));
sig.raw_data = &i;
- data->sig_cb(&sig);
+ analog_data->sig_cb(&sig);
}
}
static __inline__ zap_status_t process_event(zap_span_t *span, zap_event_t *event)
{
zap_sigmsg_t sig;
- zap_analog_data_t *data = event->channel->span->analog_data;
+ zap_analog_data_t *analog_data = event->channel->span->signal_data;
memset(&sig, 0, sizeof(sig));
sig.chan_id = event->channel->chan_id;
zap_set_state_locked(event->channel, ZAP_CHANNEL_STATE_UP);
} else {
sig.event_id = ZAP_SIGEVENT_FLASH;
- data->sig_cb(&sig);
+ analog_data->sig_cb(&sig);
if (event->channel->token_count == 1) {
zap_set_flag_locked(event->channel, ZAP_CHANNEL_HOLD);
zap_set_state_locked(event->channel, ZAP_CHANNEL_STATE_DIALTONE);
static void *zap_analog_run(zap_thread_t *me, void *obj)
{
zap_span_t *span = (zap_span_t *) obj;
- zap_analog_data_t *data = span->analog_data;
+ zap_analog_data_t *analog_data = span->signal_data;
zap_log(ZAP_LOG_DEBUG, "ANALOG thread starting.\n");
- while(zap_test_flag(data, ZAP_ANALOG_RUNNING)) {
+ while(zap_test_flag(analog_data, ZAP_ANALOG_RUNNING)) {
int waitms = 10;
zap_status_t status;
end:
- zap_clear_flag(data, ZAP_ANALOG_RUNNING);
+ zap_clear_flag(analog_data, ZAP_ANALOG_RUNNING);
zap_log(ZAP_LOG_DEBUG, "ANALOG thread ending.\n");
zap_status_t zap_analog_start(zap_span_t *span)
{
- zap_set_flag(span->analog_data, ZAP_ANALOG_RUNNING);
+ zap_analog_data_t *analog_data = span->signal_data;
+ zap_set_flag(analog_data, ZAP_ANALOG_RUNNING);
return zap_thread_create_detached(zap_analog_run, span);
}
static L3INT zap_isdn_931_34(void *pvt, L2UCHAR *msg, L2INT mlen)
{
zap_span_t *span = (zap_span_t *) pvt;
- zap_isdn_data_t *data = span->isdn_data;
+ zap_isdn_data_t *isdn_data = span->signal_data;
Q931mes_Generic *gen = (Q931mes_Generic *) msg;
Q931ie_ChanID *chanid = Q931GetIEPtr(gen->ChanID, gen->buf);
int chan_id = chanid->ChanSlot;
zap_channel_t *zchan = NULL;
assert(span != NULL);
- assert(data != NULL);
+ assert(isdn_data != NULL);
if (chan_id) {
zchan = &span->channels[chan_id];
{
zap_span_t *span = (zap_span_t *) pvt;
zap_size_t len = (zap_size_t) mlen;
+ zap_isdn_data_t *isdn_data = span->signal_data;
+
#ifdef IODEBUG
//char bb[4096] = "";
//print_hex_bytes(msg, len, bb, sizeof(bb));
#endif
assert(span != NULL);
- return zap_channel_write(span->isdn_data->dchan, msg, len, &len) == ZAP_SUCCESS ? 0 : -1;
+ return zap_channel_write(isdn_data->dchan, msg, len, &len) == ZAP_SUCCESS ? 0 : -1;
}
static __inline__ void state_advance(zap_channel_t *zchan)
{
Q931mes_Generic *gen = (Q931mes_Generic *) zchan->caller_data.raw_data;
- zap_isdn_data_t *data = zchan->span->isdn_data;
+ zap_isdn_data_t *isdn_data = zchan->span->signal_data;
zap_sigmsg_t sig;
zap_status_t status;
{
if (zap_test_flag(zchan, ZAP_CHANNEL_OUTBOUND)) {
sig.event_id = ZAP_SIGEVENT_PROGRESS;
- if ((status = data->sig_cb(&sig) != ZAP_SUCCESS)) {
+ if ((status = isdn_data->sig_cb(&sig) != ZAP_SUCCESS)) {
zap_set_state_locked(zchan, ZAP_CHANNEL_STATE_HANGUP);
}
} else {
gen->MesType = Q931mes_PROGRESS;
- Q931Rx43(&data->q931, (void *)gen, gen->Size);
+ Q931Rx43(&isdn_data->q931, (void *)gen, gen->Size);
}
}
break;
{
if (!zap_test_flag(zchan, ZAP_CHANNEL_OUTBOUND)) {
sig.event_id = ZAP_SIGEVENT_START;
- if ((status = data->sig_cb(&sig) != ZAP_SUCCESS)) {
+ if ((status = isdn_data->sig_cb(&sig) != ZAP_SUCCESS)) {
zap_set_state_locked(zchan, ZAP_CHANNEL_STATE_HANGUP);
}
}
{
if (zap_test_flag(zchan, ZAP_CHANNEL_OUTBOUND)) {
sig.event_id = ZAP_SIGEVENT_PROGRESS_MEDIA;
- if ((status = data->sig_cb(&sig) != ZAP_SUCCESS)) {
+ if ((status = isdn_data->sig_cb(&sig) != ZAP_SUCCESS)) {
zap_set_state_locked(zchan, ZAP_CHANNEL_STATE_HANGUP);
}
} else {
gen->MesType = Q931mes_ALERTING;
- Q931Rx43(&data->q931, (void *)gen, gen->Size);
+ Q931Rx43(&isdn_data->q931, (void *)gen, gen->Size);
}
}
break;
{
if (zap_test_flag(zchan, ZAP_CHANNEL_OUTBOUND)) {
sig.event_id = ZAP_SIGEVENT_UP;
- if ((status = data->sig_cb(&sig) != ZAP_SUCCESS)) {
+ if ((status = isdn_data->sig_cb(&sig) != ZAP_SUCCESS)) {
zap_set_state_locked(zchan, ZAP_CHANNEL_STATE_HANGUP);
}
} else {
gen->MesType = Q931mes_CONNECT;
gen->BearerCap = 0;
- Q931Rx43(&data->q931, (void *)gen, zchan->caller_data.raw_data_len);
+ Q931Rx43(&isdn_data->q931, (void *)gen, zchan->caller_data.raw_data_len);
}
}
break;
zap_copy_string((char *)ptrCalledNum->Digit, zchan->caller_data.ani, strlen(zchan->caller_data.ani)+1);
//gen->Size += strlen(zchan->caller_data.ani);
- Q931Rx43(&data->q931, (L3UCHAR *) gen, gen->Size);
+ Q931Rx43(&isdn_data->q931, (L3UCHAR *) gen, gen->Size);
}
break;
case ZAP_CHANNEL_STATE_HANGUP:
cause.Value = (unsigned char) zchan->caller_data.hangup_cause;
*cause.Diag = '\0';
gen->Cause = Q931AppendIE((L3UCHAR *) gen, (L3UCHAR *) &cause);
- Q931Rx43(&data->q931, (L3UCHAR *) gen, gen->Size);
+ Q931Rx43(&isdn_data->q931, (L3UCHAR *) gen, gen->Size);
}
break;
case ZAP_CHANNEL_STATE_TERMINATING:
{
sig.event_id = ZAP_SIGEVENT_STOP;
- status = data->sig_cb(&sig);
+ status = isdn_data->sig_cb(&sig);
gen->MesType = Q931mes_RELEASE;
- Q931Rx43(&data->q931, (void *)gen, gen->Size);
+ Q931Rx43(&isdn_data->q931, (void *)gen, gen->Size);
}
default:
break;
static __inline__ zap_status_t process_event(zap_span_t *span, zap_event_t *event)
{
zap_sigmsg_t sig;
- zap_isdn_data_t *data = span->isdn_data;
+ zap_isdn_data_t *isdn_data = span->signal_data;
memset(&sig, 0, sizeof(sig));
sig.chan_id = event->channel->chan_id;
}
zap_set_flag(event->channel, ZAP_CHANNEL_SUSPENDED);
zap_channel_get_alarms(event->channel);
- data->sig_cb(&sig);
+ isdn_data->sig_cb(&sig);
zap_log(ZAP_LOG_WARNING, "channel %d:%d (%d:%d) has alarms [%s]\n",
event->channel->span_id, event->channel->chan_id,
event->channel->physical_span_id, event->channel->physical_chan_id,
sig.event_id = ZAP_OOB_ALARM_CLEAR;
zap_clear_flag(event->channel, ZAP_CHANNEL_SUSPENDED);
zap_channel_get_alarms(event->channel);
- data->sig_cb(&sig);
+ isdn_data->sig_cb(&sig);
}
break;
}
static void *zap_isdn_run(zap_thread_t *me, void *obj)
{
zap_span_t *span = (zap_span_t *) obj;
- zap_isdn_data_t *data = span->isdn_data;
+ zap_isdn_data_t *isdn_data = span->signal_data;
unsigned char buf[1024];
zap_size_t len = sizeof(buf);
int errs = 0;
zap_log(ZAP_LOG_DEBUG, "ISDN thread starting.\n");
- Q921Start(&data->q921);
+ Q921Start(&isdn_data->q921);
- while(zap_test_flag(data, ZAP_ISDN_RUNNING)) {
+ while(zap_test_flag(isdn_data, ZAP_ISDN_RUNNING)) {
zap_wait_flag_t flags = ZAP_READ;
- zap_status_t status = zap_channel_wait(data->dchan, &flags, 100);
+ zap_status_t status = zap_channel_wait(isdn_data->dchan, &flags, 100);
- Q921TimerTick(&data->q921);
+ Q921TimerTick(&isdn_data->q921);
check_state(span);
check_events(span);
case ZAP_TIMEOUT:
{
/*zap_log(ZAP_LOG_DEBUG, "Timeout!\n");*/
- /*Q931TimeTick(data->q931, L3ULONG ms);*/
+ /*Q931TimeTick(isdn_data->q931, L3ULONG ms);*/
errs = 0;
}
break;
errs = 0;
if (flags & ZAP_READ) {
len = sizeof(buf);
- if (zap_channel_read(data->dchan, buf, &len) == ZAP_SUCCESS) {
+ if (zap_channel_read(isdn_data->dchan, buf, &len) == ZAP_SUCCESS) {
#ifdef IODEBUG
//char bb[4096] = "";
//print_hex_bytes(buf, len, bb, sizeof(bb));
//zap_log(ZAP_LOG_DEBUG, "READ %d\n%s\n%s\n\n", (int)len, LINE, bb);
#endif
- Q921QueueHDLCFrame(&data->q921, buf, (int)len);
- Q921Rx12(&data->q921);
+ Q921QueueHDLCFrame(&isdn_data->q921, buf, (int)len);
+ Q921Rx12(&isdn_data->q921);
}
} else {
zap_log(ZAP_LOG_DEBUG, "No Read FLAG!\n");
done:
- zap_channel_close(&data->dchans[0]);
- zap_channel_close(&data->dchans[1]);
- zap_clear_flag(span->isdn_data, ZAP_ISDN_RUNNING);
+ zap_channel_close(&isdn_data->dchans[0]);
+ zap_channel_close(&isdn_data->dchans[1]);
+ zap_clear_flag(isdn_data, ZAP_ISDN_RUNNING);
#ifdef WIN32
timeEndPeriod(1);
zap_status_t zap_isdn_start(zap_span_t *span)
{
- zap_set_flag(span->isdn_data, ZAP_ISDN_RUNNING);
+ zap_isdn_data_t *isdn_data = span->signal_data;
+ zap_set_flag(isdn_data, ZAP_ISDN_RUNNING);
return zap_thread_create_detached(zap_isdn_run, span);
}
{
uint32_t i, x = 0;
zap_channel_t *dchans[2] = {0};
-
+ zap_isdn_data_t *isdn_data;
if (span->signal_type) {
snprintf(span->last_error, sizeof(span->last_error), "Span is already configured for signalling [%d].", span->signal_type);
return ZAP_FAIL;
}
- span->isdn_data = malloc(sizeof(*span->isdn_data));
- assert(span->isdn_data != NULL);
- memset(span->isdn_data, 0, sizeof(*span->isdn_data));
+ isdn_data = malloc(sizeof(*isdn_data));
+ assert(isdn_data != NULL);
+ memset(isdn_data, 0, sizeof(*isdn_data));
- span->isdn_data->sig_cb = sig_cb;
- span->isdn_data->dchans[0] = dchans[0];
- span->isdn_data->dchans[1] = dchans[1];
- span->isdn_data->dchan = span->isdn_data->dchans[0];
+ isdn_data->sig_cb = sig_cb;
+ isdn_data->dchans[0] = dchans[0];
+ isdn_data->dchans[1] = dchans[1];
+ isdn_data->dchan = isdn_data->dchans[0];
- Q921_InitTrunk(&span->isdn_data->q921,
+ Q921_InitTrunk(&isdn_data->q921,
0,
0,
mode,
zap_isdn_921_21,
(Q921TxCB_t)zap_isdn_921_23,
span,
- &span->isdn_data->q931);
+ &isdn_data->q931);
- Q931Api_InitTrunk(&span->isdn_data->q931,
+ Q931Api_InitTrunk(&isdn_data->q931,
dialect,
mode,
span->trunk_type,
zap_isdn_931_34,
(Q931TxCB_t)q931_rx_32,
zap_isdn_931_err,
- &span->isdn_data->q921,
+ &isdn_data->q921,
span);
- span->isdn_data->q931.autoRestartAck = 1;
- span->isdn_data->q931.autoConnectAck = 1;
+ isdn_data->q931.autoRestartAck = 1;
+ isdn_data->q931.autoConnectAck = 1;
+ span->signal_data = isdn_data;
span->signal_type = ZAP_SIGTYPE_ISDN;
span->outgoing_call = isdn_outgoing_call;