int x;
char buf2[20];
- /* We need to remap normal DTMF (0-0, *, #, A-D) to Ademco's psuedo-hex (0-0, B-F, nothing for A)
+ /* We need to remap normal DTMF (0-0, *, #, A-D) to Ademco's pseudo-hex (0-0, B-F, nothing for A)
and calculate the checksum */
for (sum = 0, s = buf, t = buf2; *s; s++, t++)
{
buf[1] = s->p.s_regs[4];
buf[2] = '\0';
if (s->p.result_code_format == ASCII_RESULT_CODES)
- s->at_tx_handler(s, s->at_tx_user_data, buf, 2);
- s->at_tx_handler(s, s->at_tx_user_data, (uint8_t *) t, strlen(t));
- s->at_tx_handler(s, s->at_tx_user_data, buf, 2);
+ s->at_tx_handler(s->at_tx_user_data, buf, 2);
+ s->at_tx_handler(s->at_tx_user_data, (uint8_t *) t, strlen(t));
+ s->at_tx_handler(s->at_tx_user_data, buf, 2);
}
/*- End of function --------------------------------------------------------*/
break;
case NUMERIC_RESULT_CODES:
snprintf((char *) buf, sizeof(buf), "%d%c", code, s->p.s_regs[3]);
- s->at_tx_handler(s, s->at_tx_user_data, buf, strlen((char *) buf));
+ s->at_tx_handler(s->at_tx_user_data, buf, strlen((char *) buf));
break;
default:
/* No result codes */
{
s->rx_data[s->rx_data_bytes++] = DLE;
s->rx_data[s->rx_data_bytes++] = ETX;
- s->at_tx_handler(s, s->at_tx_user_data, s->rx_data, s->rx_data_bytes);
+ s->at_tx_handler(s->at_tx_user_data, s->rx_data, s->rx_data_bytes);
s->rx_data_bytes = 0;
}
if (s->at_rx_mode != AT_MODE_OFFHOOK_COMMAND && s->at_rx_mode != AT_MODE_ONHOOK_COMMAND)
result = true;
if (s->class1_handler)
- result = s->class1_handler(s, s->class1_user_data, direction, operation, val);
+ result = s->class1_handler(s->class1_user_data, direction, operation, val);
switch (result)
{
case 0:
break;
}
/*endswitch*/
- return s->modem_control_handler(s, s->modem_control_user_data, op, num);
+ return s->modem_control_handler(s->modem_control_user_data, op, num);
}
/*- End of function --------------------------------------------------------*/
const char *t;
if (s->p.echo)
- s->at_tx_handler(s, s->at_tx_user_data, (uint8_t *) cmd, len);
+ s->at_tx_handler(s->at_tx_user_data, (uint8_t *) cmd, len);
for (i = 0; i < len; i++)
{
}
/*- End of function --------------------------------------------------------*/
+SPAN_DECLARE(void) at_set_modem_control_handler(at_state_t *s,
+ at_modem_control_handler_t modem_control_handler,
+ void *modem_control_user_data)
+{
+ s->modem_control_handler = modem_control_handler;
+ s->modem_control_user_data = modem_control_user_data;
+}
+/*- End of function --------------------------------------------------------*/
+
SPAN_DECLARE(logging_state_t *) at_get_logging_state(at_state_t *s)
{
return &s->logging;
typedef struct at_state_s at_state_t;
-typedef int (*at_modem_control_handler_t)(at_state_t *s, void *user_data, int op, const char *num);
-typedef int (*at_tx_handler_t)(at_state_t *s, void *user_data, const uint8_t *buf, size_t len);
-typedef int (*at_class1_handler_t)(at_state_t *s, void *user_data, int direction, int operation, int val);
+typedef int (*at_modem_control_handler_t)(void *user_data, int op, const char *num);
+typedef int (*at_tx_handler_t)(void *user_data, const uint8_t *buf, size_t len);
+typedef int (*at_class1_handler_t)(void *user_data, int direction, int operation, int val);
enum at_rx_mode_e
{
\return A pointer to the logging context */
SPAN_DECLARE(logging_state_t *) at_get_logging_state(at_state_t *s);
+
+SPAN_DECLARE(void) at_set_modem_control_handler(at_state_t *s,
+ at_modem_control_handler_t modem_control_handler,
+ void *modem_control_user_data);
+
/*! Initialise an AT interpreter context.
\brief Initialise an AT interpreter context.
\param s The AT context.
}
/*- End of function --------------------------------------------------------*/
-static int t31_modem_control_handler(at_state_t *s, void *user_data, int op, const char *num)
+static int t31_modem_control_handler(void *user_data, int op, const char *num)
{
- t31_state_t *t;
+ t31_state_t *s;
- t = (t31_state_t *) user_data;
+ s = (t31_state_t *) user_data;
switch (op)
{
case AT_MODEM_CONTROL_CALL:
- t->call_samples = 0;
- t38_core_restart(&t->t38_fe.t38);
+ s->call_samples = 0;
+ t38_core_restart(&s->t38_fe.t38);
break;
case AT_MODEM_CONTROL_ANSWER:
- t->call_samples = 0;
- t38_core_restart(&t->t38_fe.t38);
+ s->call_samples = 0;
+ t38_core_restart(&s->t38_fe.t38);
break;
case AT_MODEM_CONTROL_ONHOOK:
- if (t->non_ecm_tx.holding)
+ if (s->non_ecm_tx.holding)
{
- t->non_ecm_tx.holding = false;
+ s->non_ecm_tx.holding = false;
/* Tell the application to release further data */
- at_modem_control(&t->at_state, AT_MODEM_CONTROL_CTS, (void *) 1);
+ at_modem_control(&s->at_state, AT_MODEM_CONTROL_CTS, (void *) 1);
}
/*endif*/
- if (t->at_state.rx_signal_present)
+ if (s->at_state.rx_signal_present)
{
- t->at_state.rx_data[t->at_state.rx_data_bytes++] = DLE;
- t->at_state.rx_data[t->at_state.rx_data_bytes++] = ETX;
- t->at_state.at_tx_handler(&t->at_state,
- t->at_state.at_tx_user_data,
- t->at_state.rx_data,
- t->at_state.rx_data_bytes);
- t->at_state.rx_data_bytes = 0;
+ s->at_state.rx_data[s->at_state.rx_data_bytes++] = DLE;
+ s->at_state.rx_data[s->at_state.rx_data_bytes++] = ETX;
+ s->at_state.at_tx_handler(s->at_state.at_tx_user_data,
+ s->at_state.rx_data,
+ s->at_state.rx_data_bytes);
+ s->at_state.rx_data_bytes = 0;
}
/*endif*/
- restart_modem(t, FAX_MODEM_SILENCE_TX);
+ restart_modem(s, FAX_MODEM_SILENCE_TX);
break;
case AT_MODEM_CONTROL_RESTART:
- restart_modem(t, (int) (intptr_t) num);
+ restart_modem(s, (int) (intptr_t) num);
return 0;
case AT_MODEM_CONTROL_DTE_TIMEOUT:
if (num)
- t->dte_data_timeout = t->call_samples + ms_to_samples((intptr_t) num);
+ s->dte_data_timeout = s->call_samples + ms_to_samples((intptr_t) num);
else
- t->dte_data_timeout = 0;
+ s->dte_data_timeout = 0;
/*endif*/
return 0;
}
/*endswitch*/
- return t->modem_control_handler(t, t->modem_control_user_data, op, num);
+ return s->modem_control_handler(s, s->modem_control_user_data, op, num);
}
/*- End of function --------------------------------------------------------*/
{
s->at_state.rx_data[s->at_state.rx_data_bytes++] = DLE;
s->at_state.rx_data[s->at_state.rx_data_bytes++] = ETX;
- s->at_state.at_tx_handler(&s->at_state,
- s->at_state.at_tx_user_data,
+ s->at_state.at_tx_handler(s->at_state.at_tx_user_data,
s->at_state.rx_data,
s->at_state.rx_data_bytes);
s->at_state.rx_data_bytes = 0;
s->at_state.rx_data[s->at_state.rx_data_bytes++] = (uint8_t) s->audio.current_byte;
if (s->at_state.rx_data_bytes >= 250)
{
- s->at_state.at_tx_handler(&s->at_state,
- s->at_state.at_tx_user_data,
+ s->at_state.at_tx_handler(s->at_state.at_tx_user_data,
s->at_state.rx_data,
s->at_state.rx_data_bytes);
s->at_state.rx_data_bytes = 0;
s->at_state.rx_data[s->at_state.rx_data_bytes++] = buf[i];
if (s->at_state.rx_data_bytes >= 250)
{
- s->at_state.at_tx_handler(&s->at_state,
- s->at_state.at_tx_user_data,
+ s->at_state.at_tx_handler(s->at_state.at_tx_user_data,
s->at_state.rx_data,
s->at_state.rx_data_bytes);
s->at_state.rx_data_bytes = 0;
/*endfor*/
s->at_state.rx_data[s->at_state.rx_data_bytes++] = DLE;
s->at_state.rx_data[s->at_state.rx_data_bytes++] = ETX;
- s->at_state.at_tx_handler(&s->at_state, s->at_state.at_tx_user_data, s->at_state.rx_data, s->at_state.rx_data_bytes);
+ s->at_state.at_tx_handler(s->at_state.at_tx_user_data, s->at_state.rx_data, s->at_state.rx_data_bytes);
s->at_state.rx_data_bytes = 0;
if (msg[1] == 0x13 && ok)
{
s->hdlc_tx.len = 0;
s->hdlc_tx.final = false;
s->dled = false;
- hdlc_rx_init(&s->audio.modems.hdlc_rx, false, true, HDLC_FRAMING_OK_THRESHOLD, hdlc_accept_frame, s);
fax_modems_start_slow_modem(&s->audio.modems, FAX_MODEM_V21_RX);
+ hdlc_rx_init(&s->audio.modems.hdlc_rx, false, true, HDLC_FRAMING_OK_THRESHOLD, hdlc_accept_frame, s);
s->at_state.transmit = true;
}
/*- End of function --------------------------------------------------------*/
}
/*- End of function --------------------------------------------------------*/
-static int process_class1_cmd(at_state_t *t, void *user_data, int direction, int operation, int val)
+static int process_class1_cmd(void *user_data, int direction, int operation, int val)
{
int new_modem;
int new_transmit;
/*endfor*/
s->at_state.rx_data[s->at_state.rx_data_bytes++] = DLE;
s->at_state.rx_data[s->at_state.rx_data_bytes++] = ETX;
- s->at_state.at_tx_handler(&s->at_state, s->at_state.at_tx_user_data, s->at_state.rx_data, s->at_state.rx_data_bytes);
+ s->at_state.at_tx_handler(s->at_state.at_tx_user_data, s->at_state.rx_data, s->at_state.rx_data_bytes);
s->at_state.rx_data_bytes = 0;
}
/*endif*/
{
s->at_state.rx_data[s->at_state.rx_data_bytes++] = DLE;
s->at_state.rx_data[s->at_state.rx_data_bytes++] = ETX;
- s->at_state.at_tx_handler(&s->at_state, s->at_state.at_tx_user_data, s->at_state.rx_data, s->at_state.rx_data_bytes);
+ s->at_state.at_tx_handler(s->at_state.at_tx_user_data, s->at_state.rx_data, s->at_state.rx_data_bytes);
}
/*endif*/
s->at_state.rx_data_bytes = 0;
t->hdlc_tx.ptr = 0;
+ /* Prepare the non-ecm HDLC bit stream -> T.38 HDLC -> non-ecm HDLC bit stream path */
hdlc_tx_init(&s->hdlc_tx_non_ecm, false, 1, false, hdlc_tx_underflow2, s);
hdlc_rx_init(&s->hdlc_rx_non_ecm, false, true, 2, hdlc_accept_non_ecm_frame, t);
return 0;
}
/*- End of function --------------------------------------------------------*/
-static int modem_call_control(at_state_t *s, void *user_data, int op, const char *num)
+static int modem_call_control(void *user_data, int op, const char *num)
{
switch (op)
{
}
/*- End of function --------------------------------------------------------*/
-static int at_tx_handler(at_state_t *s, void *user_data, const uint8_t *buf, size_t len)
+static int at_tx_handler(void *user_data, const uint8_t *buf, size_t len)
{
int i;
for (i = 0; i < 10; i++)
{
- if (psuedo_terminal_create(&modem[i]))
+ if (pseudo_terminal_create(&modem[i]))
{
printf("Failure\n");
exit(2);
for (i = 0; i < 10; i++)
{
- if (psuedo_terminal_close(&modem[i]))
+ if (pseudo_terminal_close(&modem[i]))
{
printf("Failure\n");
exit(2);
int next_id = 0;
const char *device_root_name = "/dev/spandsp";
-int psuedo_terminal_close(modem_t *modem)
+int pseudo_terminal_close(modem_t *modem)
{
#if defined(WIN32)
if (modem->master)
}
/*- End of function --------------------------------------------------------*/
-int psuedo_terminal_create(modem_t *modem)
+int pseudo_terminal_create(modem_t *modem)
{
#if defined(WIN32)
COMMTIMEOUTS timeouts = {0};
if (!SetCommTimeouts(modem->master, &timeouts))
{
span_log(&modem->logging, SPAN_LOG_ERROR, "Cannot set up non-blocking read on %s\n", modem->devlink);
- psuedo_terminal_close(modem);
+ pseudo_terminal_close(modem);
return -1;
}
modem->threadAbort = CreateEvent(NULL, true, false, NULL);
if (symlink(modem->stty, modem->devlink))
{
span_log(&modem->logging, SPAN_LOG_ERROR, "Fatal error: failed to create %s symbolic link\n", modem->devlink);
- psuedo_terminal_close(modem);
+ pseudo_terminal_close(modem);
return -1;
}
if (fcntl(modem->master, F_SETFL, fcntl(modem->master, F_GETFL, 0) | O_NONBLOCK))
{
span_log(&modem->logging, SPAN_LOG_ERROR, "Cannot set up non-blocking read on %s\n", ttyname(modem->master));
- psuedo_terminal_close(modem);
+ pseudo_terminal_close(modem);
return -1;
}
#endif
typedef struct modem_s modem_t;
-int psuedo_terminal_close(modem_t *modem);
+int pseudo_terminal_close(modem_t *modem);
-int psuedo_terminal_create(modem_t *modem);
+int pseudo_terminal_create(modem_t *modem);
}
/*- End of function --------------------------------------------------------*/
-static int at_tx_handler(at_state_t *s, void *user_data, const uint8_t *buf, size_t len)
+static int at_tx_handler(void *user_data, const uint8_t *buf, size_t len)
{
#if defined(WIN32)
DWORD res;
{
case 1:
x[0] = (num) ? 0x11 : 0x13;
- at_tx_handler(&t31_state->at_state, user_data, x, 1);
+ at_tx_handler(user_data, x, 1);
break;
case 2:
break;
}
}
- if (psuedo_terminal_create(&modem[0]))
+ if (pseudo_terminal_create(&modem[0]))
printf("Failure\n");
#if !defined(WIN32)
#endif
t30_tests(t38_mode, use_ecm, use_gui, log_audio, test_sending, g1050_model_no, g1050_speed_pattern_no);
- if (psuedo_terminal_close(&modem[0]))
+ if (pseudo_terminal_close(&modem[0]))
printf("Failure\n");
printf("Tests passed\n");
return 0;
}
/*- End of function --------------------------------------------------------*/
-static int at_tx_handler(at_state_t *s, void *user_data, const uint8_t *buf, size_t len)
+static int at_tx_handler(void *user_data, const uint8_t *buf, size_t len)
{
size_t i;
return 0;
}
-static int t31_at_tx_handler(at_state_t *s, void *user_data, const uint8_t *buf, size_t len)
+static int t31_at_tx_handler(void *user_data, const uint8_t *buf, size_t len)
{
modem_t *modem = user_data;
static int control_handler(modem_t *modem, const char *num, int op)
{
switch_core_session_t *session = NULL;
- at_state_t *at_state;
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG1, "Control Handler op:%d state:[%s] %s\n",
op, modem_state2name(modem_get_state(modem)), modem->devlink);
u_char x[1];
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG1,
"Modem %s [%s] - CTS %s\n", modem->devlink, modem_state2name(modem_get_state(modem)), (int) (intptr_t) num ? "XON" : "XOFF");
-
- at_state = t31_get_at_state(modem->t31_state);
if (num) {
x[0] = 0x11;
- t31_at_tx_handler(at_state, modem, x, 1);
+ t31_at_tx_handler(modem, x, 1);
switch_clear_flag(modem, MODEM_FLAG_XOFF);
wake_modem_thread(modem);
} else {
x[0] = 0x13;
- t31_at_tx_handler(at_state, modem, x, 1);
+ t31_at_tx_handler(modem, x, 1);
switch_set_flag(modem, MODEM_FLAG_XOFF);
}
}