comparison spandsp-0.0.3/spandsp-0.0.3/src/t31.c @ 5:f762bf195c4b

import spandsp-0.0.3
author Peter Meerwald <pmeerw@cosy.sbg.ac.at>
date Fri, 25 Jun 2010 16:00:21 +0200
parents
children
comparison
equal deleted inserted replaced
4:26cd8f1ef0b1 5:f762bf195c4b
1 /*
2 * SpanDSP - a series of DSP components for telephony
3 *
4 * t31.c - A T.31 compatible class 1 FAX modem interface.
5 *
6 * Written by Steve Underwood <steveu@coppice.org>
7 *
8 * Special thanks to Lee Howard <faxguy@howardsilvan.com>
9 * for his great work debugging and polishing this code.
10 *
11 * Copyright (C) 2004, 2005, 2006 Steve Underwood
12 *
13 * All rights reserved.
14 *
15 * This program is free software; you can redistribute it and/or modify
16 * it under the terms of the GNU General Public License version 2, as
17 * published by the Free Software Foundation.
18 *
19 * This program is distributed in the hope that it will be useful,
20 * but WITHOUT ANY WARRANTY; without even the implied warranty of
21 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22 * GNU General Public License for more details.
23 *
24 * You should have received a copy of the GNU General Public License
25 * along with this program; if not, write to the Free Software
26 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
27 *
28 * $Id: t31.c,v 1.83 2006/11/30 15:41:47 steveu Exp $
29 */
30
31 /*! \file */
32
33 #ifdef HAVE_CONFIG_H
34 #include <config.h>
35 #endif
36
37 #define _GNU_SOURCE
38
39 #include <inttypes.h>
40 #include <stdlib.h>
41 #include <stdio.h>
42 #include <fcntl.h>
43 #include <time.h>
44 #include <memory.h>
45 #include <string.h>
46 #include <ctype.h>
47 #if defined(HAVE_TGMATH_H)
48 #include <tgmath.h>
49 #endif
50 #if defined(HAVE_MATH_H)
51 #include <math.h>
52 #endif
53 #include <assert.h>
54 #include <tiffio.h>
55
56 #include "spandsp/telephony.h"
57 #include "spandsp/logging.h"
58 #include "spandsp/bit_operations.h"
59 #include "spandsp/dc_restore.h"
60 #include "spandsp/queue.h"
61 #include "spandsp/power_meter.h"
62 #include "spandsp/complex.h"
63 #include "spandsp/tone_generate.h"
64 #include "spandsp/async.h"
65 #include "spandsp/hdlc.h"
66 #include "spandsp/silence_gen.h"
67 #include "spandsp/fsk.h"
68 #include "spandsp/v29rx.h"
69 #include "spandsp/v29tx.h"
70 #include "spandsp/v27ter_rx.h"
71 #include "spandsp/v27ter_tx.h"
72 #if defined(ENABLE_V17)
73 #include "spandsp/v17rx.h"
74 #include "spandsp/v17tx.h"
75 #endif
76 #include "spandsp/t4.h"
77 #include "spandsp/t30.h"
78 #include "spandsp/t38_core.h"
79
80 #include "spandsp/at_interpreter.h"
81 #include "spandsp/t31.h"
82
83 #define MS_PER_TX_CHUNK 30
84 #define INDICATOR_TX_COUNT 4
85 #define DEFAULT_DTE_TIMEOUT 5
86
87 typedef const char *(*at_cmd_service_t)(t31_state_t *s, const char *cmd);
88
89 #define ETX 0x03
90 #define DLE 0x10
91 #define SUB 0x1A
92
93 enum
94 {
95 T31_FLUSH,
96 T31_SILENCE_TX,
97 T31_SILENCE_RX,
98 T31_CED_TONE,
99 T31_CNG_TONE,
100 T31_NOCNG_TONE,
101 T31_V21_TX,
102 T31_V17_TX,
103 T31_V27TER_TX,
104 T31_V29_TX,
105 T31_V21_RX,
106 T31_V17_RX,
107 T31_V27TER_RX,
108 T31_V29_RX
109 };
110
111 enum
112 {
113 T38_TIMED_STEP_NONE = 0,
114 T38_TIMED_STEP_NON_ECM_MODEM,
115 T38_TIMED_STEP_NON_ECM_MODEM_2,
116 T38_TIMED_STEP_NON_ECM_MODEM_3,
117 T38_TIMED_STEP_HDLC_MODEM,
118 T38_TIMED_STEP_HDLC_MODEM_2,
119 T38_TIMED_STEP_HDLC_MODEM_3,
120 T38_TIMED_STEP_HDLC_MODEM_4,
121 T38_TIMED_STEP_PAUSE
122 };
123
124 static int restart_modem(t31_state_t *s, int new_modem);
125 static void hdlc_accept(void *user_data, int ok, const uint8_t *msg, int len);
126 #if defined(ENABLE_V17)
127 static int early_v17_rx(void *user_data, const int16_t amp[], int len);
128 #endif
129 static int early_v27ter_rx(void *user_data, const int16_t amp[], int len);
130 static int early_v29_rx(void *user_data, const int16_t amp[], int len);
131 static int dummy_rx(void *s, const int16_t amp[], int len);
132 static int silence_rx(void *user_data, const int16_t amp[], int len);
133 static int cng_rx(void *user_data, const int16_t amp[], int len);
134
135 static __inline__ void t31_set_at_rx_mode(t31_state_t *s, int new_mode)
136 {
137 s->at_state.at_rx_mode = new_mode;
138 }
139 /*- End of function --------------------------------------------------------*/
140
141 static int process_rx_indicator(t38_core_state_t *s, void *user_data, int indicator)
142 {
143 t31_state_t *t;
144
145 t = (t31_state_t *) user_data;
146 switch (indicator)
147 {
148 case T38_IND_NO_SIGNAL:
149 break;
150 case T38_IND_CNG:
151 break;
152 case T38_IND_CED:
153 break;
154 case T38_IND_V21_PREAMBLE:
155 t->hdlc_rx_len = 0;
156 break;
157 case T38_IND_V27TER_2400_TRAINING:
158 break;
159 case T38_IND_V27TER_4800_TRAINING:
160 break;
161 case T38_IND_V29_7200_TRAINING:
162 break;
163 case T38_IND_V29_9600_TRAINING:
164 break;
165 case T38_IND_V17_7200_SHORT_TRAINING:
166 break;
167 case T38_IND_V17_7200_LONG_TRAINING:
168 break;
169 case T38_IND_V17_9600_SHORT_TRAINING:
170 break;
171 case T38_IND_V17_9600_LONG_TRAINING:
172 break;
173 case T38_IND_V17_12000_SHORT_TRAINING:
174 break;
175 case T38_IND_V17_12000_LONG_TRAINING:
176 break;
177 case T38_IND_V17_14400_SHORT_TRAINING:
178 break;
179 case T38_IND_V17_14400_LONG_TRAINING:
180 break;
181 case T38_IND_V8_ANSAM:
182 break;
183 case T38_IND_V8_SIGNAL:
184 break;
185 case T38_IND_V34_CNTL_CHANNEL_1200:
186 break;
187 case T38_IND_V34_PRI_CHANNEL:
188 break;
189 case T38_IND_V34_CC_RETRAIN:
190 break;
191 case T38_IND_V33_12000_TRAINING:
192 break;
193 case T38_IND_V33_14400_TRAINING:
194 break;
195 default:
196 break;
197 }
198 t->missing_data = FALSE;
199 return 0;
200 }
201 /*- End of function --------------------------------------------------------*/
202
203 static int process_rx_data(t38_core_state_t *s, void *user_data, int data_type, int field_type, const uint8_t *buf, int len)
204 {
205 t31_state_t *t;
206 int i;
207
208 t = (t31_state_t *) user_data;
209 switch (data_type)
210 {
211 case T38_DATA_V21:
212 case T38_DATA_V27TER_2400:
213 case T38_DATA_V27TER_4800:
214 case T38_DATA_V29_7200:
215 case T38_DATA_V29_9600:
216 case T38_DATA_V17_7200:
217 case T38_DATA_V17_9600:
218 case T38_DATA_V17_12000:
219 case T38_DATA_V17_14400:
220 case T38_DATA_V8:
221 case T38_DATA_V34_PRI_RATE:
222 case T38_DATA_V34_CC_1200:
223 case T38_DATA_V34_PRI_CH:
224 case T38_DATA_V33_12000:
225 case T38_DATA_V33_14400:
226 default:
227 break;
228 }
229 switch (field_type)
230 {
231 case T38_FIELD_HDLC_DATA:
232 if (t->hdlc_rx_len + len <= 256 - 2)
233 {
234 for (i = 0; i < len; i++)
235 t->hdlc_rx_buf[t->hdlc_rx_len++] = bit_reverse8(buf[i]);
236 }
237 break;
238 case T38_FIELD_HDLC_FCS_OK:
239 if (len > 0)
240 span_log(&t->logging, SPAN_LOG_WARNING, "There is data in a T38_FIELD_HDLC_FCS_OK!\n");
241 span_log(&t->logging, SPAN_LOG_FLOW, "Type %s - CRC OK (%s)\n", t30_frametype(t->tx_data[2]), (t->missing_data) ? "missing octets" : "clean");
242 /* Don't deal with zero length frames. Some T.38 implementations send multiple T38_FIELD_HDLC_FCS_OK
243 packets, when they have sent no data for the body of the frame. */
244 if (t->current_rx_type == T31_V21_RX && t->tx_out_bytes > 0 && !t->missing_data)
245 hdlc_accept((void *) t, TRUE, t->hdlc_rx_buf, t->hdlc_rx_len);
246 t->hdlc_rx_len = 0;
247 t->missing_data = FALSE;
248 break;
249 case T38_FIELD_HDLC_FCS_BAD:
250 if (len > 0)
251 span_log(&t->logging, SPAN_LOG_WARNING, "There is data in a T38_FIELD_HDLC_FCS_BAD!\n");
252 span_log(&t->logging, SPAN_LOG_FLOW, "Type %s - CRC bad (%s)\n", t30_frametype(t->tx_data[2]), (t->missing_data) ? "missing octets" : "clean");
253 t->hdlc_rx_len = 0;
254 t->missing_data = FALSE;
255 break;
256 case T38_FIELD_HDLC_FCS_OK_SIG_END:
257 if (len > 0)
258 span_log(&t->logging, SPAN_LOG_WARNING, "There is data in a T38_FIELD_HDLC_FCS_OK_SIG_END!\n");
259 span_log(&t->logging, SPAN_LOG_FLOW, "Type %s - CRC OK, sig end (%s)\n", t30_frametype(t->tx_data[2]), (t->missing_data) ? "missing octets" : "clean");
260 if (t->current_rx_type == T31_V21_RX)
261 {
262 /* Don't deal with zero length frames. Some T.38 implementations send multiple T38_FIELD_HDLC_FCS_OK
263 packets, when they have sent no data for the body of the frame. */
264 if (t->tx_out_bytes > 0)
265 hdlc_accept((void *) t, TRUE, t->hdlc_rx_buf, t->hdlc_rx_len);
266 hdlc_accept((void *) t, TRUE, NULL, PUTBIT_CARRIER_DOWN);
267 }
268 t->tx_out_bytes = 0;
269 t->missing_data = FALSE;
270 t->hdlc_rx_len = 0;
271 t->missing_data = FALSE;
272 break;
273 case T38_FIELD_HDLC_FCS_BAD_SIG_END:
274 if (len > 0)
275 span_log(&t->logging, SPAN_LOG_WARNING, "There is data in a T38_FIELD_HDLC_FCS_BAD_SIG_END!\n");
276 span_log(&t->logging, SPAN_LOG_FLOW, "Type %s - CRC bad, sig end (%s)\n", t30_frametype(t->tx_data[2]), (t->missing_data) ? "missing octets" : "clean");
277 if (t->current_rx_type == T31_V21_RX)
278 hdlc_accept((void *) t, TRUE, NULL, PUTBIT_CARRIER_DOWN);
279 t->hdlc_rx_len = 0;
280 t->missing_data = FALSE;
281 break;
282 case T38_FIELD_HDLC_SIG_END:
283 if (len > 0)
284 span_log(&t->logging, SPAN_LOG_WARNING, "There is data in a T38_FIELD_HDLC_SIG_END!\n");
285 /* This message is expected under 2 circumstances. One is as an alternative to T38_FIELD_HDLC_FCS_OK_SIG_END -
286 i.e. they send T38_FIELD_HDLC_FCS_OK, and then T38_FIELD_HDLC_SIG_END when the carrier actually drops.
287 The other is because the HDLC signal drops unexpectedly - i.e. not just after a final frame. */
288 if (t->current_rx_type == T31_V21_RX)
289 hdlc_accept((void *) t, TRUE, NULL, PUTBIT_CARRIER_DOWN);
290 t->hdlc_rx_len = 0;
291 t->missing_data = FALSE;
292 break;
293 case T38_FIELD_T4_NON_ECM_DATA:
294 break;
295 case T38_FIELD_T4_NON_ECM_SIG_END:
296 break;
297 case T38_FIELD_CM_MESSAGE:
298 case T38_FIELD_JM_MESSAGE:
299 case T38_FIELD_CI_MESSAGE:
300 case T38_FIELD_V34RATE:
301 default:
302 break;
303 }
304 return 0;
305 }
306 /*- End of function --------------------------------------------------------*/
307
308 static int process_rx_missing(t38_core_state_t *s, void *user_data, int rx_seq_no, int expected_seq_no)
309 {
310 t31_state_t *t;
311
312 t = (t31_state_t *) user_data;
313 t->missing_data = TRUE;
314 return 0;
315 }
316 /*- End of function --------------------------------------------------------*/
317
318 int t31_t38_send_timeout(t31_state_t *s, int samples)
319 {
320 int len;
321 uint8_t buf[100];
322 /* Training times for all the modem options, with and without TEP */
323 static const int training_time[] =
324 {
325 0, 0, /* T38_IND_NO_SIGNAL */
326 0, 0, /* T38_IND_CNG */
327 0, 0, /* T38_IND_CED */
328 1000, 1000, /* T38_IND_V21_PREAMBLE */
329 943, 1158, /* T38_IND_V27TER_2400_TRAINING */
330 708, 923, /* T38_IND_V27TER_4800_TRAINING */
331 234, 454, /* T38_IND_V29_7200_TRAINING */
332 234, 454, /* T38_IND_V29_9600_TRAINING */
333 142, 367, /* T38_IND_V17_7200_SHORT_TRAINING */
334 1393, 1618, /* T38_IND_V17_7200_LONG_TRAINING */
335 142, 367, /* T38_IND_V17_9600_SHORT_TRAINING */
336 1393, 1618, /* T38_IND_V17_9600_LONG_TRAINING */
337 142, 367, /* T38_IND_V17_12000_SHORT_TRAINING */
338 1393, 1618, /* T38_IND_V17_12000_LONG_TRAINING */
339 142, 367, /* T38_IND_V17_14400_SHORT_TRAINING */
340 1393, 1618, /* T38_IND_V17_14400_LONG_TRAINING */
341 0, 0, /* T38_IND_V8_ANSAM */
342 0, 0, /* T38_IND_V8_SIGNAL */
343 0, 0, /* T38_IND_V34_CNTL_CHANNEL_1200 */
344 0, 0, /* T38_IND_V34_PRI_CHANNEL */
345 0, 0, /* T38_IND_V34_CC_RETRAIN */
346 0, 0, /* T38_IND_V33_12000_TRAINING */
347 0, 0, /* T38_IND_V33_14400_TRAINING */
348 };
349
350 s->call_samples += samples;
351
352 if (s->timed_step == T38_TIMED_STEP_NONE)
353 return 0;
354 if (s->call_samples < s->next_send_samples)
355 return 0;
356 len = 0;
357 switch (s->timed_step)
358 {
359 case T38_TIMED_STEP_NON_ECM_MODEM:
360 /* Create a 75ms silence */
361 t38_core_send_indicator(&s->t38, T38_IND_NO_SIGNAL, INDICATOR_TX_COUNT);
362 s->timed_step = T38_TIMED_STEP_NON_ECM_MODEM_2;
363 s->next_send_samples += ms_to_samples(75);
364 break;
365 case T38_TIMED_STEP_NON_ECM_MODEM_2:
366 /* Switch on a fast modem, and give the training time to complete */
367 t38_core_send_indicator(&s->t38, s->next_tx_indicator, INDICATOR_TX_COUNT);
368 s->timed_step = T38_TIMED_STEP_NON_ECM_MODEM_3;
369 s->next_send_samples += ms_to_samples(training_time[s->next_tx_indicator << 1]);
370 break;
371 case T38_TIMED_STEP_NON_ECM_MODEM_3:
372 /* Send a chunk of non-ECM image data */
373 //if ((len = get_non_ecm_image_chunk(s, buf, s->octets_per_non_ecm_packet)))
374 // t38_core_send_data(&s->t38, s->current_tx_data, T38_FIELD_T4_NON_ECM_DATA, buf, abs(len));
375 if (len > 0)
376 {
377 s->next_send_samples += ms_to_samples(MS_PER_TX_CHUNK);
378 }
379 else
380 {
381 t38_core_send_data(&s->t38, s->current_tx_data, T38_FIELD_T4_NON_ECM_SIG_END, NULL, 0);
382 t38_core_send_indicator(&s->t38, T38_IND_NO_SIGNAL, INDICATOR_TX_COUNT);
383 s->timed_step = T38_TIMED_STEP_NONE;
384 }
385 break;
386 case T38_TIMED_STEP_HDLC_MODEM:
387 /* Send HDLC preambling */
388 t38_core_send_indicator(&s->t38, s->next_tx_indicator, INDICATOR_TX_COUNT);
389 s->next_send_samples += ms_to_samples(training_time[s->next_tx_indicator << 1]);
390 s->timed_step = T38_TIMED_STEP_HDLC_MODEM_2;
391 break;
392 case T38_TIMED_STEP_HDLC_MODEM_2:
393 /* Send HDLC octet */
394 buf[0] = bit_reverse8(s->hdlc_tx_buf[s->hdlc_tx_ptr++]);
395 t38_core_send_data(&s->t38, s->current_tx_data, T38_FIELD_HDLC_DATA, buf, 1);
396 if (s->hdlc_tx_ptr >= s->hdlc_tx_len)
397 s->timed_step = T38_TIMED_STEP_HDLC_MODEM_3;
398 s->next_send_samples += ms_to_samples(MS_PER_TX_CHUNK);
399 break;
400 case T38_TIMED_STEP_HDLC_MODEM_3:
401 /* End of HDLC frame */
402 s->hdlc_tx_ptr = 0;
403 if (s->hdlc_final)
404 {
405 s->hdlc_tx_len = 0;
406 t38_core_send_data(&s->t38, s->current_tx_data, T38_FIELD_HDLC_FCS_OK_SIG_END, NULL, 0);
407 s->timed_step = T38_TIMED_STEP_HDLC_MODEM_4;
408 at_put_response_code(&s->at_state, AT_RESPONSE_CODE_OK);
409 t31_set_at_rx_mode(s, AT_MODE_OFFHOOK_COMMAND);
410 s->hdlc_final = FALSE;
411 restart_modem(s, T31_SILENCE_TX);
412 }
413 else
414 {
415 t38_core_send_data(&s->t38, s->current_tx_data, T38_FIELD_HDLC_FCS_OK, NULL, 0);
416 s->timed_step = T38_TIMED_STEP_HDLC_MODEM_2;
417 at_put_response_code(&s->at_state, AT_RESPONSE_CODE_CONNECT);
418 }
419 s->next_send_samples += ms_to_samples(MS_PER_TX_CHUNK);
420 break;
421 case T38_TIMED_STEP_HDLC_MODEM_4:
422 /* End of HDLC transmission */
423 /* We have already sent T38_FIELD_HDLC_FCS_OK_SIG_END. It seems some boxes may not like
424 us sending a T38_FIELD_HDLC_SIG_END at this point. Just say there is no signal. */
425 //t38_core_send_data(&s->t38, s->current_tx_data, T38_FIELD_HDLC_SIG_END, NULL, 0);
426 t38_core_send_indicator(&s->t38, T38_IND_NO_SIGNAL, INDICATOR_TX_COUNT);
427 s->timed_step = T38_TIMED_STEP_NONE;
428 break;
429 case T38_TIMED_STEP_PAUSE:
430 /* End of timed pause */
431 s->timed_step = T38_TIMED_STEP_NONE;
432 break;
433 }
434 return 0;
435 }
436 /*- End of function --------------------------------------------------------*/
437
438 static int t31_modem_control_handler(at_state_t *s, void *user_data, int op, const char *num)
439 {
440 t31_state_t *t;
441
442 t = (t31_state_t *) user_data;
443 switch (op)
444 {
445 case AT_MODEM_CONTROL_ANSWER:
446 t->call_samples = 0;
447 break;
448 case AT_MODEM_CONTROL_CALL:
449 t->call_samples = 0;
450 break;
451 case AT_MODEM_CONTROL_ONHOOK:
452 if (t->tx_holding)
453 {
454 t->tx_holding = FALSE;
455 /* Tell the application to release further data */
456 at_modem_control(&t->at_state, AT_MODEM_CONTROL_CTS, (void *) 1);
457 }
458 if (t->at_state.rx_signal_present)
459 {
460 t->at_state.rx_data[t->at_state.rx_data_bytes++] = DLE;
461 t->at_state.rx_data[t->at_state.rx_data_bytes++] = ETX;
462 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);
463 t->at_state.rx_data_bytes = 0;
464 }
465 restart_modem(t, T31_SILENCE_TX);
466 break;
467 case AT_MODEM_CONTROL_RESTART:
468 restart_modem(t, (int) (intptr_t) num);
469 return 0;
470 case AT_MODEM_CONTROL_DTE_TIMEOUT:
471 if (num)
472 t->dte_data_timeout = t->call_samples + ms_to_samples((intptr_t) num);
473 else
474 t->dte_data_timeout = 0;
475 return 0;
476 }
477 return t->modem_control_handler(t, t->modem_control_user_data, op, num);
478 }
479 /*- End of function --------------------------------------------------------*/
480
481 static void non_ecm_put_bit(void *user_data, int bit)
482 {
483 t31_state_t *s;
484
485 s = (t31_state_t *) user_data;
486 if (bit < 0)
487 {
488 /* Special conditions */
489 switch (bit)
490 {
491 case PUTBIT_TRAINING_FAILED:
492 s->at_state.rx_trained = FALSE;
493 break;
494 case PUTBIT_TRAINING_SUCCEEDED:
495 /* The modem is now trained */
496 at_put_response_code(&s->at_state, AT_RESPONSE_CODE_CONNECT);
497 s->at_state.rx_signal_present = TRUE;
498 s->at_state.rx_trained = TRUE;
499 break;
500 case PUTBIT_CARRIER_UP:
501 break;
502 case PUTBIT_CARRIER_DOWN:
503 if (s->at_state.rx_signal_present)
504 {
505 s->at_state.rx_data[s->at_state.rx_data_bytes++] = DLE;
506 s->at_state.rx_data[s->at_state.rx_data_bytes++] = ETX;
507 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);
508 s->at_state.rx_data_bytes = 0;
509 at_put_response_code(&s->at_state, AT_RESPONSE_CODE_NO_CARRIER);
510 t31_set_at_rx_mode(s, AT_MODE_OFFHOOK_COMMAND);
511 }
512 s->at_state.rx_signal_present = FALSE;
513 s->at_state.rx_trained = FALSE;
514 break;
515 default:
516 if (s->at_state.p.result_code_format)
517 span_log(&s->logging, SPAN_LOG_FLOW, "Eh!\n");
518 break;
519 }
520 return;
521 }
522 s->current_byte = (s->current_byte >> 1) | (bit << 7);
523 if (++s->bit_no >= 8)
524 {
525 if (s->current_byte == DLE)
526 s->at_state.rx_data[s->at_state.rx_data_bytes++] = (uint8_t) s->current_byte;
527 s->at_state.rx_data[s->at_state.rx_data_bytes++] = (uint8_t) s->current_byte;
528 if (s->at_state.rx_data_bytes >= 250)
529 {
530 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);
531 s->at_state.rx_data_bytes = 0;
532 }
533 s->bit_no = 0;
534 s->current_byte = 0;
535 }
536 }
537 /*- End of function --------------------------------------------------------*/
538
539 static int non_ecm_get_bit(void *user_data)
540 {
541 t31_state_t *s;
542 int bit;
543 int fill;
544
545 s = (t31_state_t *) user_data;
546 if (s->bit_no <= 0)
547 {
548 if (s->tx_out_bytes != s->tx_in_bytes)
549 {
550 /* There is real data available to send */
551 s->current_byte = s->tx_data[s->tx_out_bytes];
552 s->tx_out_bytes = (s->tx_out_bytes + 1) & (T31_TX_BUF_LEN - 1);
553 if (s->tx_holding)
554 {
555 /* See if the buffer is approaching empty. It might be time to release flow control. */
556 fill = (s->tx_in_bytes - s->tx_out_bytes);
557 if (s->tx_in_bytes < s->tx_out_bytes)
558 fill += (T31_TX_BUF_LEN + 1);
559 if (fill < T31_TX_BUF_LOW_TIDE)
560 {
561 s->tx_holding = FALSE;
562 /* Tell the application to release further data */
563 at_modem_control(&s->at_state, AT_MODEM_CONTROL_CTS, (void *) 1);
564 }
565 }
566 s->tx_data_started = TRUE;
567 }
568 else
569 {
570 if (s->data_final)
571 {
572 s->data_final = FALSE;
573 /* This will put the modem into its shutdown sequence. When
574 it has finally shut down, an OK response will be sent. */
575 return PUTBIT_END_OF_DATA;
576 }
577 /* Fill with 0xFF bytes at the start of transmission, or 0x00 if we are in
578 the middle of transmission. This follows T.31 and T.30 practice. */
579 s->current_byte = (s->tx_data_started) ? 0x00 : 0xFF;
580 }
581 s->bit_no = 8;
582 }
583 s->bit_no--;
584 bit = s->current_byte & 1;
585 s->current_byte >>= 1;
586 return bit;
587 }
588 /*- End of function --------------------------------------------------------*/
589
590 static void hdlc_tx_underflow(void *user_data)
591 {
592 t31_state_t *s;
593
594 s = (t31_state_t *) user_data;
595 if (s->hdlc_final)
596 {
597 s->hdlc_final = FALSE;
598 /* Schedule an orderly shutdown of the modem */
599 hdlc_tx_frame(&(s->hdlctx), NULL, 0);
600 }
601 else
602 {
603 at_put_response_code(&s->at_state, AT_RESPONSE_CODE_CONNECT);
604 }
605 }
606 /*- End of function --------------------------------------------------------*/
607
608 static void hdlc_accept(void *user_data, int ok, const uint8_t *msg, int len)
609 {
610 uint8_t buf[256];
611 t31_state_t *s;
612 int i;
613
614 s = (t31_state_t *) user_data;
615 if (len < 0)
616 {
617 /* Special conditions */
618 switch (len)
619 {
620 case PUTBIT_TRAINING_FAILED:
621 s->at_state.rx_trained = FALSE;
622 break;
623 case PUTBIT_TRAINING_SUCCEEDED:
624 /* The modem is now trained */
625 s->at_state.rx_signal_present = TRUE;
626 s->at_state.rx_trained = TRUE;
627 break;
628 case PUTBIT_CARRIER_UP:
629 if (s->modem == T31_CNG_TONE || s->modem == T31_NOCNG_TONE || s->modem == T31_V21_RX)
630 {
631 s->at_state.rx_signal_present = TRUE;
632 s->rx_message_received = FALSE;
633 }
634 break;
635 case PUTBIT_CARRIER_DOWN:
636 if (s->rx_message_received)
637 {
638 if (s->at_state.dte_is_waiting)
639 {
640 if (s->at_state.ok_is_pending)
641 {
642 at_put_response_code(&s->at_state, AT_RESPONSE_CODE_OK);
643 s->at_state.ok_is_pending = FALSE;
644 }
645 else
646 {
647 at_put_response_code(&s->at_state, AT_RESPONSE_CODE_NO_CARRIER);
648 t31_set_at_rx_mode(s, AT_MODE_OFFHOOK_COMMAND);
649 }
650 s->at_state.dte_is_waiting = FALSE;
651 }
652 else
653 {
654 buf[0] = AT_RESPONSE_CODE_NO_CARRIER;
655 queue_write_msg(&(s->rx_queue), buf, 1);
656 }
657 }
658 s->at_state.rx_signal_present = FALSE;
659 s->at_state.rx_trained = FALSE;
660 break;
661 case PUTBIT_FRAMING_OK:
662 if (s->modem == T31_CNG_TONE || s->modem == T31_NOCNG_TONE)
663 {
664 /* Once we get any valid HDLC the CNG tone stops, and we drop
665 to the V.21 receive modem on its own. */
666 s->modem = T31_V21_RX;
667 s->at_state.transmit = FALSE;
668 }
669 if (s->modem != T31_V21_RX)
670 {
671 /* V.21 has been detected while expecting a different carrier.
672 If +FAR=0 then result +FCERROR and return to command-mode.
673 If +FAR=1 then report +FRH:3 and CONNECT, switching to
674 V.21 receive mode. */
675 if (s->at_state.p.adaptive_receive)
676 {
677 s->at_state.rx_signal_present = TRUE;
678 s->rx_message_received = TRUE;
679 s->modem = T31_V21_RX;
680 s->at_state.transmit = FALSE;
681 s->at_state.dte_is_waiting = TRUE;
682 at_put_response_code(&s->at_state, AT_RESPONSE_CODE_FRH3);
683 at_put_response_code(&s->at_state, AT_RESPONSE_CODE_CONNECT);
684 }
685 else
686 {
687 s->modem = T31_SILENCE_TX;
688 t31_set_at_rx_mode(s, AT_MODE_OFFHOOK_COMMAND);
689 s->rx_message_received = FALSE;
690 at_put_response_code(&s->at_state, AT_RESPONSE_CODE_FCERROR);
691 }
692 }
693 else
694 {
695 if (!s->rx_message_received)
696 {
697 /* Report CONNECT as soon as possible to avoid a timeout. */
698 at_put_response_code(&s->at_state, AT_RESPONSE_CODE_CONNECT);
699 s->rx_message_received = TRUE;
700 }
701 }
702 break;
703 case PUTBIT_ABORT:
704 /* Just ignore these */
705 break;
706 default:
707 span_log(&s->logging, SPAN_LOG_WARNING, "Unexpected HDLC special length - %d!\n", len);
708 break;
709 }
710 return;
711 }
712 /* If OK is pending then we just ignore whatever comes in */
713 if (!s->at_state.ok_is_pending)
714 {
715 if (s->at_state.dte_is_waiting)
716 {
717 /* Send straight away */
718 /* It is safe to look at the two bytes beyond the length of the message,
719 and expect to find the FCS there. */
720 for (i = 0; i < len + 2; i++)
721 {
722 if (msg[i] == DLE)
723 s->at_state.rx_data[s->at_state.rx_data_bytes++] = DLE;
724 s->at_state.rx_data[s->at_state.rx_data_bytes++] = msg[i];
725 }
726 s->at_state.rx_data[s->at_state.rx_data_bytes++] = DLE;
727 s->at_state.rx_data[s->at_state.rx_data_bytes++] = ETX;
728 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);
729 s->at_state.rx_data_bytes = 0;
730 if (msg[1] == 0x13 && ok)
731 {
732 /* This is the last frame. We don't send OK until the carrier drops to avoid
733 redetecting it later. */
734 s->at_state.ok_is_pending = TRUE;
735 }
736 else
737 {
738 at_put_response_code(&s->at_state, (ok) ? AT_RESPONSE_CODE_OK : AT_RESPONSE_CODE_ERROR);
739 s->at_state.dte_is_waiting = FALSE;
740 s->rx_message_received = FALSE;
741 }
742 }
743 else
744 {
745 /* Queue it */
746 buf[0] = (ok) ? AT_RESPONSE_CODE_OK : AT_RESPONSE_CODE_ERROR;
747 /* It is safe to look at the two bytes beyond the length of the message,
748 and expect to find the FCS there. */
749 memcpy(buf + 1, msg, len + 2);
750 queue_write_msg(&(s->rx_queue), buf, len + 3);
751 }
752 }
753 t31_set_at_rx_mode(s, AT_MODE_OFFHOOK_COMMAND);
754 }
755 /*- End of function --------------------------------------------------------*/
756
757 static void t31_v21_rx(t31_state_t *s)
758 {
759 hdlc_rx_init(&(s->hdlcrx), FALSE, TRUE, 5, hdlc_accept, s);
760 s->at_state.ok_is_pending = FALSE;
761 s->hdlc_final = FALSE;
762 s->hdlc_tx_len = 0;
763 s->dled = FALSE;
764 fsk_rx_init(&(s->v21rx), &preset_fsk_specs[FSK_V21CH2], TRUE, (put_bit_func_t) hdlc_rx_put_bit, &(s->hdlcrx));
765 s->at_state.transmit = TRUE;
766 }
767 /*- End of function --------------------------------------------------------*/
768
769 static int restart_modem(t31_state_t *s, int new_modem)
770 {
771 tone_gen_descriptor_t tone_desc;
772 int ind;
773
774 span_log(&s->logging, SPAN_LOG_FLOW, "Restart modem %d\n", new_modem);
775 if (s->modem == new_modem)
776 return 0;
777 queue_flush(&(s->rx_queue));
778 s->modem = new_modem;
779 s->data_final = FALSE;
780 s->at_state.rx_signal_present = FALSE;
781 s->at_state.rx_trained = FALSE;
782 s->rx_message_received = FALSE;
783 s->rx_handler = (span_rx_handler_t *) &dummy_rx;
784 s->rx_user_data = NULL;
785 switch (s->modem)
786 {
787 case T31_CNG_TONE:
788 if (s->t38_mode)
789 {
790 t38_core_send_indicator(&s->t38, T38_IND_CNG, INDICATOR_TX_COUNT);
791 }
792 else
793 {
794 /* CNG is special, since we need to receive V.21 HDLC messages while sending the
795 tone. Everything else in FAX processing sends only one way at a time. */
796 /* 0.5s of 1100Hz + 3.0s of silence repeating */
797 make_tone_gen_descriptor(&tone_desc,
798 1100,
799 -11,
800 0,
801 0,
802 500,
803 3000,
804 0,
805 0,
806 TRUE);
807 tone_gen_init(&(s->tone_gen), &tone_desc);
808 /* Do V.21/HDLC receive in parallel. The other end may send its
809 first message at any time. The CNG tone will continue until
810 we get a valid preamble. */
811 s->rx_handler = (span_rx_handler_t *) &cng_rx;
812 s->rx_user_data = s;
813 t31_v21_rx(s);
814 s->tx_handler = (span_tx_handler_t *) &tone_gen;
815 s->tx_user_data = &(s->tone_gen);
816 s->next_tx_handler = NULL;
817 }
818 s->at_state.transmit = TRUE;
819 break;
820 case T31_NOCNG_TONE:
821 if (s->t38_mode)
822 {
823 }
824 else
825 {
826 s->rx_handler = (span_rx_handler_t *) &cng_rx;
827 s->rx_user_data = s;
828 t31_v21_rx(s);
829 silence_gen_set(&(s->silence_gen), 0);
830 s->tx_handler = (span_tx_handler_t *) &silence_gen;
831 s->tx_user_data = &(s->silence_gen);
832 }
833 s->at_state.transmit = FALSE;
834 break;
835 case T31_CED_TONE:
836 if (s->t38_mode)
837 {
838 t38_core_send_indicator(&s->t38, T38_IND_CED, INDICATOR_TX_COUNT);
839 }
840 else
841 {
842 silence_gen_alter(&(s->silence_gen), ms_to_samples(200));
843 make_tone_gen_descriptor(&tone_desc,
844 2100,
845 -11,
846 0,
847 0,
848 2600,
849 75,
850 0,
851 0,
852 FALSE);
853 tone_gen_init(&(s->tone_gen), &tone_desc);
854 s->tx_handler = (span_tx_handler_t *) &silence_gen;
855 s->tx_user_data = &(s->silence_gen);
856 s->next_tx_handler = (span_tx_handler_t *) &tone_gen;
857 s->next_tx_user_data = &(s->tone_gen);
858 }
859 s->at_state.transmit = TRUE;
860 break;
861 case T31_V21_TX:
862 if (s->t38_mode)
863 {
864 t38_core_send_indicator(&s->t38, T38_IND_V21_PREAMBLE, INDICATOR_TX_COUNT);
865 }
866 else
867 {
868 hdlc_tx_init(&(s->hdlctx), FALSE, 2, FALSE, hdlc_tx_underflow, s);
869 /* The spec says 1s +-15% of preamble. So, the minimum is 32 octets. */
870 hdlc_tx_preamble(&(s->hdlctx), 32);
871 fsk_tx_init(&(s->v21tx), &preset_fsk_specs[FSK_V21CH2], (get_bit_func_t) hdlc_tx_get_bit, &(s->hdlctx));
872 s->tx_handler = (span_tx_handler_t *) &fsk_tx;
873 s->tx_user_data = &(s->v21tx);
874 s->next_tx_handler = NULL;
875 }
876 s->hdlc_final = FALSE;
877 s->hdlc_tx_len = 0;
878 s->dled = FALSE;
879 s->at_state.transmit = TRUE;
880 break;
881 case T31_V21_RX:
882 if (s->t38_mode)
883 {
884 }
885 else
886 {
887 s->rx_handler = (span_rx_handler_t *) &fsk_rx;
888 s->rx_user_data = &(s->v21rx);
889 t31_v21_rx(s);
890 }
891 break;
892 #if defined(ENABLE_V17)
893 case T31_V17_TX:
894 if (s->t38_mode)
895 {
896 switch (s->bit_rate)
897 {
898 case 7200:
899 ind = (s->short_train) ? T38_IND_V17_7200_SHORT_TRAINING : T38_IND_V17_7200_LONG_TRAINING;
900 break;
901 case 9600:
902 ind = (s->short_train) ? T38_IND_V17_9600_SHORT_TRAINING : T38_IND_V17_9600_LONG_TRAINING;
903 break;
904 case 12000:
905 ind = (s->short_train) ? T38_IND_V17_12000_SHORT_TRAINING : T38_IND_V17_12000_LONG_TRAINING;
906 break;
907 case 14400:
908 default:
909 ind = (s->short_train) ? T38_IND_V17_14400_SHORT_TRAINING : T38_IND_V17_14400_LONG_TRAINING;
910 break;
911 }
912 t38_core_send_indicator(&s->t38, ind, INDICATOR_TX_COUNT);
913 }
914 else
915 {
916 v17_tx_restart(&(s->v17tx), s->bit_rate, FALSE, s->short_train);
917 s->tx_handler = (span_tx_handler_t *) &v17_tx;
918 s->tx_user_data = &(s->v17tx);
919 s->next_tx_handler = NULL;
920 }
921 s->tx_out_bytes = 0;
922 s->tx_data_started = FALSE;
923 s->at_state.transmit = TRUE;
924 break;
925 case T31_V17_RX:
926 if (!s->t38_mode)
927 {
928 s->rx_handler = (span_rx_handler_t *) &early_v17_rx;
929 s->rx_user_data = s;
930 v17_rx_restart(&(s->v17rx), s->bit_rate, s->short_train);
931 /* Allow for +FCERROR/+FRH:3 */
932 t31_v21_rx(s);
933 }
934 s->at_state.transmit = FALSE;
935 break;
936 #endif
937 case T31_V27TER_TX:
938 if (s->t38_mode)
939 {
940 switch (s->bit_rate)
941 {
942 case 2400:
943 ind = T38_IND_V27TER_2400_TRAINING;
944 break;
945 case 4800:
946 default:
947 ind = T38_IND_V27TER_4800_TRAINING;
948 break;
949 }
950 t38_core_send_indicator(&s->t38, ind, INDICATOR_TX_COUNT);
951 }
952 else
953 {
954 v27ter_tx_restart(&(s->v27ter_tx), s->bit_rate, FALSE);
955 s->tx_handler = (span_tx_handler_t *) &v27ter_tx;
956 s->tx_user_data = &(s->v27ter_tx);
957 s->next_tx_handler = NULL;
958 }
959 s->tx_out_bytes = 0;
960 s->tx_data_started = FALSE;
961 s->at_state.transmit = TRUE;
962 break;
963 case T31_V27TER_RX:
964 if (!s->t38_mode)
965 {
966 s->rx_handler = (span_rx_handler_t *) &early_v27ter_rx;
967 s->rx_user_data = s;
968 v27ter_rx_restart(&(s->v27ter_rx), s->bit_rate, FALSE);
969 /* Allow for +FCERROR/+FRH:3 */
970 t31_v21_rx(s);
971 }
972 s->at_state.transmit = FALSE;
973 break;
974 case T31_V29_TX:
975 if (s->t38_mode)
976 {
977 switch (s->bit_rate)
978 {
979 case 7200:
980 ind = T38_IND_V29_7200_TRAINING;
981 break;
982 case 9600:
983 default:
984 ind = T38_IND_V29_9600_TRAINING;
985 break;
986 }
987 t38_core_send_indicator(&s->t38, ind, INDICATOR_TX_COUNT);
988 }
989 else
990 {
991 v29_tx_restart(&(s->v29tx), s->bit_rate, FALSE);
992 s->tx_handler = (span_tx_handler_t *) &v29_tx;
993 s->tx_user_data = &(s->v29tx);
994 s->next_tx_handler = NULL;
995 }
996 s->tx_out_bytes = 0;
997 s->tx_data_started = FALSE;
998 s->at_state.transmit = TRUE;
999 break;
1000 case T31_V29_RX:
1001 if (!s->t38_mode)
1002 {
1003 s->rx_handler = (span_rx_handler_t *) &early_v29_rx;
1004 s->rx_user_data = s;
1005 v29_rx_restart(&(s->v29rx), s->bit_rate, FALSE);
1006 /* Allow for +FCERROR/+FRH:3 */
1007 t31_v21_rx(s);
1008 }
1009 s->at_state.transmit = FALSE;
1010 break;
1011 case T31_SILENCE_TX:
1012 if (s->t38_mode)
1013 {
1014 t38_core_send_indicator(&s->t38, T38_IND_NO_SIGNAL, INDICATOR_TX_COUNT);
1015 }
1016 else
1017 {
1018 silence_gen_set(&(s->silence_gen), 0);
1019 s->tx_handler = (span_tx_handler_t *) &silence_gen;
1020 s->tx_user_data = &(s->silence_gen);
1021 s->next_tx_handler = NULL;
1022 }
1023 s->at_state.transmit = FALSE;
1024 break;
1025 case T31_SILENCE_RX:
1026 if (!s->t38_mode)
1027 {
1028 s->rx_handler = (span_rx_handler_t *) &silence_rx;
1029 s->rx_user_data = s;
1030
1031 silence_gen_set(&(s->silence_gen), 0);
1032 s->tx_handler = (span_tx_handler_t *) &silence_gen;
1033 s->tx_user_data = &(s->silence_gen);
1034 s->next_tx_handler = NULL;
1035 }
1036 s->at_state.transmit = FALSE;
1037 break;
1038 case T31_FLUSH:
1039 /* Send 200ms of silence to "push" the last audio out */
1040 if (s->t38_mode)
1041 {
1042 t38_core_send_indicator(&s->t38, T38_IND_NO_SIGNAL, INDICATOR_TX_COUNT);
1043 }
1044 else
1045 {
1046 s->modem = T31_SILENCE_TX;
1047 silence_gen_alter(&(s->silence_gen), ms_to_samples(200));
1048 s->tx_handler = (span_tx_handler_t *) &silence_gen;
1049 s->tx_user_data = &(s->silence_gen);
1050 s->next_tx_handler = NULL;
1051 s->at_state.transmit = TRUE;
1052 }
1053 break;
1054 }
1055 s->bit_no = 0;
1056 s->current_byte = 0xFF;
1057 s->tx_in_bytes = 0;
1058 return 0;
1059 }
1060 /*- End of function --------------------------------------------------------*/
1061
1062 static __inline__ void dle_unstuff_hdlc(t31_state_t *s, const char *stuffed, int len)
1063 {
1064 int i;
1065
1066 for (i = 0; i < len; i++)
1067 {
1068 if (s->dled)
1069 {
1070 s->dled = FALSE;
1071 if (stuffed[i] == ETX)
1072 {
1073 if (s->t38_mode)
1074 {
1075 }
1076 else
1077 {
1078 hdlc_tx_frame(&(s->hdlctx), s->hdlc_tx_buf, s->hdlc_tx_len);
1079 }
1080 s->hdlc_final = (s->hdlc_tx_buf[1] & 0x10);
1081 s->hdlc_tx_len = 0;
1082 }
1083 else if (stuffed[i] == SUB)
1084 {
1085 s->hdlc_tx_buf[s->hdlc_tx_len++] = DLE;
1086 s->hdlc_tx_buf[s->hdlc_tx_len++] = DLE;
1087 }
1088 else
1089 {
1090 s->hdlc_tx_buf[s->hdlc_tx_len++] = stuffed[i];
1091 }
1092 }
1093 else
1094 {
1095 if (stuffed[i] == DLE)
1096 s->dled = TRUE;
1097 else
1098 s->hdlc_tx_buf[s->hdlc_tx_len++] = stuffed[i];
1099 }
1100 }
1101 }
1102 /*- End of function --------------------------------------------------------*/
1103
1104 static __inline__ void dle_unstuff(t31_state_t *s, const char *stuffed, int len)
1105 {
1106 int i;
1107 int fill;
1108 int next;
1109
1110 for (i = 0; i < len; i++)
1111 {
1112 if (s->dled)
1113 {
1114 s->dled = FALSE;
1115 if (stuffed[i] == ETX)
1116 {
1117 s->data_final = TRUE;
1118 t31_set_at_rx_mode(s, AT_MODE_OFFHOOK_COMMAND);
1119 return;
1120 }
1121 }
1122 else if (stuffed[i] == DLE)
1123 {
1124 s->dled = TRUE;
1125 continue;
1126 }
1127 s->tx_data[s->tx_in_bytes] = stuffed[i];
1128 next = (s->tx_in_bytes + 1) & (T31_TX_BUF_LEN - 1);
1129 if (next == s->tx_out_bytes)
1130 {
1131 /* Oops. We hit the end of the buffer. Give up. Loose stuff. :-( */
1132 return;
1133 }
1134 s->tx_in_bytes = next;
1135 }
1136 if (!s->tx_holding)
1137 {
1138 /* See if the buffer is approaching full. We might need to apply flow control. */
1139 fill = (s->tx_in_bytes - s->tx_out_bytes);
1140 if (s->tx_in_bytes < s->tx_out_bytes)
1141 fill += (T31_TX_BUF_LEN + 1);
1142 if (fill > T31_TX_BUF_HIGH_TIDE)
1143 {
1144 s->tx_holding = TRUE;
1145 /* Tell the application to hold further data */
1146 at_modem_control(&s->at_state, AT_MODEM_CONTROL_CTS, (void *) 0);
1147 }
1148 }
1149 }
1150 /*- End of function --------------------------------------------------------*/
1151
1152 static int process_class1_cmd(at_state_t *t, void *user_data, int direction, int operation, int val)
1153 {
1154 int new_modem;
1155 int new_transmit;
1156 int i;
1157 int len;
1158 int immediate_response;
1159 t31_state_t *s;
1160 uint8_t msg[256];
1161
1162 s = (t31_state_t *) user_data;
1163 new_transmit = direction;
1164 immediate_response = TRUE;
1165 switch (operation)
1166 {
1167 case 'S':
1168 s->at_state.transmit = new_transmit;
1169 if (new_transmit)
1170 {
1171 /* Send a specified period of silence, to space transmissions. */
1172 restart_modem(s, T31_SILENCE_TX);
1173 silence_gen_alter(&(s->silence_gen), val*80);
1174 s->at_state.transmit = TRUE;
1175 }
1176 else
1177 {
1178 /* Wait until we have received a specified period of silence. */
1179 queue_flush(&(s->rx_queue));
1180 s->silence_awaited = val*80;
1181 t31_set_at_rx_mode(s, AT_MODE_DELIVERY);
1182 restart_modem(s, T31_SILENCE_RX);
1183 }
1184 immediate_response = FALSE;
1185 span_log(&s->logging, SPAN_LOG_FLOW, "Silence %dms\n", val*10);
1186 break;
1187 case 'H':
1188 switch (val)
1189 {
1190 case 3:
1191 new_modem = (new_transmit) ? T31_V21_TX : T31_V21_RX;
1192 s->short_train = FALSE;
1193 s->bit_rate = 300;
1194 break;
1195 default:
1196 return -1;
1197 }
1198 span_log(&s->logging, SPAN_LOG_FLOW, "HDLC\n");
1199 if (new_modem != s->modem)
1200 {
1201 restart_modem(s, new_modem);
1202 immediate_response = FALSE;
1203 }
1204 s->at_state.transmit = new_transmit;
1205 if (new_transmit)
1206 {
1207 t31_set_at_rx_mode(s, AT_MODE_HDLC);
1208 at_put_response_code(&s->at_state, AT_RESPONSE_CODE_CONNECT);
1209 }
1210 else
1211 {
1212 /* Send straight away, if there is something queued. */
1213 t31_set_at_rx_mode(s, AT_MODE_DELIVERY);
1214 s->rx_message_received = FALSE;
1215 do
1216 {
1217 if (!queue_empty(&(s->rx_queue)))
1218 {
1219 len = queue_read_msg(&(s->rx_queue), msg, 256);
1220 if (len > 1)
1221 {
1222 if (msg[0] == AT_RESPONSE_CODE_OK)
1223 at_put_response_code(&s->at_state, AT_RESPONSE_CODE_CONNECT);
1224 for (i = 1; i < len; i++)
1225 {
1226 if (msg[i] == DLE)
1227 s->at_state.rx_data[s->at_state.rx_data_bytes++] = DLE;
1228 s->at_state.rx_data[s->at_state.rx_data_bytes++] = msg[i];
1229 }
1230 s->at_state.rx_data[s->at_state.rx_data_bytes++] = DLE;
1231 s->at_state.rx_data[s->at_state.rx_data_bytes++] = ETX;
1232 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);
1233 s->at_state.rx_data_bytes = 0;
1234 }
1235 at_put_response_code(&s->at_state, msg[0]);
1236 }
1237 else
1238 {
1239 s->at_state.dte_is_waiting = TRUE;
1240 break;
1241 }
1242 }
1243 while (msg[0] == AT_RESPONSE_CODE_CONNECT);
1244 }
1245 immediate_response = FALSE;
1246 break;
1247 default:
1248 switch (val)
1249 {
1250 case 24:
1251 new_modem = (new_transmit) ? T31_V27TER_TX : T31_V27TER_RX;
1252 s->short_train = FALSE;
1253 s->bit_rate = 2400;
1254 break;
1255 case 48:
1256 new_modem = (new_transmit) ? T31_V27TER_TX : T31_V27TER_RX;
1257 s->short_train = FALSE;
1258 s->bit_rate = 4800;
1259 break;
1260 case 72:
1261 new_modem = (new_transmit) ? T31_V29_TX : T31_V29_RX;
1262 s->short_train = FALSE;
1263 s->bit_rate = 7200;
1264 break;
1265 case 96:
1266 new_modem = (new_transmit) ? T31_V29_TX : T31_V29_RX;
1267 s->short_train = FALSE;
1268 s->bit_rate = 9600;
1269 break;
1270 #if defined(ENABLE_V17)
1271 case 73:
1272 new_modem = (new_transmit) ? T31_V17_TX : T31_V17_RX;
1273 s->short_train = FALSE;
1274 s->bit_rate = 7200;
1275 break;
1276 case 74:
1277 new_modem = (new_transmit) ? T31_V17_TX : T31_V17_RX;
1278 s->short_train = TRUE;
1279 s->bit_rate = 7200;
1280 break;
1281 case 97:
1282 new_modem = (new_transmit) ? T31_V17_TX : T31_V17_RX;
1283 s->short_train = FALSE;
1284 s->bit_rate = 9600;
1285 break;
1286 case 98:
1287 new_modem = (new_transmit) ? T31_V17_TX : T31_V17_RX;
1288 s->short_train = TRUE;
1289 s->bit_rate = 9600;
1290 break;
1291 case 121:
1292 new_modem = (new_transmit) ? T31_V17_TX : T31_V17_RX;
1293 s->short_train = FALSE;
1294 s->bit_rate = 12000;
1295 break;
1296 case 122:
1297 new_modem = (new_transmit) ? T31_V17_TX : T31_V17_RX;
1298 s->short_train = TRUE;
1299 s->bit_rate = 12000;
1300 break;
1301 case 145:
1302 new_modem = (new_transmit) ? T31_V17_TX : T31_V17_RX;
1303 s->short_train = FALSE;
1304 s->bit_rate = 14400;
1305 break;
1306 case 146:
1307 new_modem = (new_transmit) ? T31_V17_TX : T31_V17_RX;
1308 s->short_train = TRUE;
1309 s->bit_rate = 14400;
1310 break;
1311 #endif
1312 default:
1313 return -1;
1314 }
1315 span_log(&s->logging, SPAN_LOG_FLOW, "Short training = %d, bit rate = %d\n", s->short_train, s->bit_rate);
1316 if (new_transmit)
1317 {
1318 t31_set_at_rx_mode(s, AT_MODE_STUFFED);
1319 at_put_response_code(&s->at_state, AT_RESPONSE_CODE_CONNECT);
1320 }
1321 else
1322 {
1323 t31_set_at_rx_mode(s, AT_MODE_DELIVERY);
1324 }
1325 restart_modem(s, new_modem);
1326 immediate_response = FALSE;
1327 break;
1328 }
1329 return immediate_response;
1330 }
1331 /*- End of function --------------------------------------------------------*/
1332
1333 void t31_call_event(t31_state_t *s, int event)
1334 {
1335 span_log(&s->logging, SPAN_LOG_FLOW, "Call event %d received\n", event);
1336 at_call_event(&s->at_state, event);
1337 }
1338 /*- End of function --------------------------------------------------------*/
1339
1340 int t31_at_rx(t31_state_t *s, const char *t, int len)
1341 {
1342 if (s->dte_data_timeout)
1343 s->dte_data_timeout = s->call_samples + ms_to_samples(5000);
1344 switch (s->at_state.at_rx_mode)
1345 {
1346 case AT_MODE_ONHOOK_COMMAND:
1347 case AT_MODE_OFFHOOK_COMMAND:
1348 at_interpreter(&s->at_state, t, len);
1349 break;
1350 case AT_MODE_DELIVERY:
1351 /* Data from the DTE in this state returns us to command mode */
1352 if (len)
1353 {
1354 s->at_state.rx_data_bytes = 0;
1355 s->at_state.transmit = FALSE;
1356 s->modem = T31_SILENCE_TX;
1357 t31_set_at_rx_mode(s, AT_MODE_OFFHOOK_COMMAND);
1358 at_put_response_code(&s->at_state, AT_RESPONSE_CODE_OK);
1359 }
1360 break;
1361 case AT_MODE_HDLC:
1362 dle_unstuff_hdlc(s, t, len);
1363 break;
1364 case AT_MODE_STUFFED:
1365 dle_unstuff(s, t, len);
1366 break;
1367 }
1368 return len;
1369 }
1370 /*- End of function --------------------------------------------------------*/
1371
1372 static int dummy_rx(void *user_data, const int16_t amp[], int len)
1373 {
1374 return 0;
1375 }
1376 /*- End of function --------------------------------------------------------*/
1377
1378 static int silence_rx(void *user_data, const int16_t amp[], int len)
1379 {
1380 t31_state_t *s;
1381
1382 /* Searching for a specified minimum period of silence. */
1383 s = (t31_state_t *) user_data;
1384 if (s->silence_awaited && s->silence_heard >= s->silence_awaited)
1385 {
1386 at_put_response_code(&s->at_state, AT_RESPONSE_CODE_OK);
1387 t31_set_at_rx_mode(s, AT_MODE_OFFHOOK_COMMAND);
1388 s->silence_heard = 0;
1389 s->silence_awaited = 0;
1390 }
1391 return 0;
1392 }
1393 /*- End of function --------------------------------------------------------*/
1394
1395 static int cng_rx(void *user_data, const int16_t amp[], int len)
1396 {
1397 t31_state_t *s;
1398
1399 s = (t31_state_t *) user_data;
1400 if (s->call_samples > ms_to_samples(s->at_state.p.s_regs[7]*1000))
1401 {
1402 /* After calling, S7 has elapsed... no carrier found. */
1403 at_put_response_code(&s->at_state, AT_RESPONSE_CODE_NO_CARRIER);
1404 restart_modem(s, T31_SILENCE_TX);
1405 at_modem_control(&s->at_state, AT_MODEM_CONTROL_HANGUP, NULL);
1406 t31_set_at_rx_mode(s, AT_MODE_ONHOOK_COMMAND);
1407 }
1408 else
1409 {
1410 fsk_rx(&(s->v21rx), amp, len);
1411 }
1412 return 0;
1413 }
1414 /*- End of function --------------------------------------------------------*/
1415
1416 #if defined(ENABLE_V17)
1417 static int early_v17_rx(void *user_data, const int16_t amp[], int len)
1418 {
1419 t31_state_t *s;
1420
1421 s = (t31_state_t *) user_data;
1422 v17_rx(&(s->v17rx), amp, len);
1423 if (s->at_state.rx_trained)
1424 {
1425 /* The fast modem has trained, so we no longer need to run the slow
1426 one in parallel. */
1427 span_log(&s->logging, SPAN_LOG_FLOW, "Switching from V.17 + V.21 to V.17 (%.2fdBm0)\n", v17_rx_signal_power(&(s->v17rx)));
1428 s->rx_handler = (span_rx_handler_t *) &v17_rx;
1429 s->rx_user_data = &(s->v17rx);
1430 }
1431 else
1432 {
1433 fsk_rx(&(s->v21rx), amp, len);
1434 if (s->rx_message_received)
1435 {
1436 /* We have received something, and the fast modem has not trained. We must
1437 be receiving valid V.21 */
1438 span_log(&s->logging, SPAN_LOG_FLOW, "Switching from V.17 + V.21 to V.21\n");
1439 s->rx_handler = (span_rx_handler_t *) &fsk_rx;
1440 s->rx_user_data = &(s->v21rx);
1441 }
1442 }
1443 return len;
1444 }
1445 /*- End of function --------------------------------------------------------*/
1446 #endif
1447
1448 static int early_v27ter_rx(void *user_data, const int16_t amp[], int len)
1449 {
1450 t31_state_t *s;
1451
1452 s = (t31_state_t *) user_data;
1453 v27ter_rx(&(s->v27ter_rx), amp, len);
1454 if (s->at_state.rx_trained)
1455 {
1456 /* The fast modem has trained, so we no longer need to run the slow
1457 one in parallel. */
1458 span_log(&s->logging, SPAN_LOG_FLOW, "Switching from V.27ter + V.21 to V.27ter (%.2fdBm0)\n", v27ter_rx_signal_power(&(s->v27ter_rx)));
1459 s->rx_handler = (span_rx_handler_t *) &v27ter_rx;
1460 s->rx_user_data = &(s->v27ter_rx);
1461 }
1462 else
1463 {
1464 fsk_rx(&(s->v21rx), amp, len);
1465 if (s->rx_message_received)
1466 {
1467 /* We have received something, and the fast modem has not trained. We must
1468 be receiving valid V.21 */
1469 span_log(&s->logging, SPAN_LOG_FLOW, "Switching from V.27ter + V.21 to V.21\n");
1470 s->rx_handler = (span_rx_handler_t *) &fsk_rx;
1471 s->rx_user_data = &(s->v21rx);
1472 }
1473 }
1474 return len;
1475 }
1476 /*- End of function --------------------------------------------------------*/
1477
1478 static int early_v29_rx(void *user_data, const int16_t amp[], int len)
1479 {
1480 t31_state_t *s;
1481
1482 s = (t31_state_t *) user_data;
1483 v29_rx(&(s->v29rx), amp, len);
1484 if (s->at_state.rx_trained)
1485 {
1486 /* The fast modem has trained, so we no longer need to run the slow
1487 one in parallel. */
1488 span_log(&s->logging, SPAN_LOG_FLOW, "Switching from V.29 + V.21 to V.29 (%.2fdBm0)\n", v29_rx_signal_power(&(s->v29rx)));
1489 s->rx_handler = (span_rx_handler_t *) &v29_rx;
1490 s->rx_user_data = &(s->v29rx);
1491 }
1492 else
1493 {
1494 fsk_rx(&(s->v21rx), amp, len);
1495 if (s->rx_message_received)
1496 {
1497 /* We have received something, and the fast modem has not trained. We must
1498 be receiving valid V.21 */
1499 span_log(&s->logging, SPAN_LOG_FLOW, "Switching from V.29 + V.21 to V.21\n");
1500 s->rx_handler = (span_rx_handler_t *) &fsk_rx;
1501 s->rx_user_data = &(s->v21rx);
1502 }
1503 }
1504 return len;
1505 }
1506 /*- End of function --------------------------------------------------------*/
1507
1508 int t31_rx(t31_state_t *s, int16_t amp[], int len)
1509 {
1510 int i;
1511 int32_t power;
1512
1513 /* Monitor for received silence. Maximum needed detection is AT+FRS=255 (255*10ms). */
1514 /* We could probably only run this loop if (s->modem == T31_SILENCE_RX), however,
1515 the spec says "when silence has been present on the line for the amount of
1516 time specified". That means some of the silence may have occurred before
1517 the AT+FRS=n command. This condition, however, is not likely to ever be the
1518 case. (AT+FRS=n will usually be issued before the remote goes silent.) */
1519 for (i = 0; i < len; i++)
1520 {
1521 /* Clean up any DC influence. */
1522 power = power_meter_update(&(s->rx_power), amp[i] - s->last_sample);
1523 s->last_sample = amp[i];
1524 if (power > s->silence_threshold_power)
1525 {
1526 s->silence_heard = 0;
1527 }
1528 else
1529 {
1530 if (s->silence_heard <= ms_to_samples(255*10))
1531 s->silence_heard++;
1532 }
1533 }
1534
1535 /* Time is determined by counting the samples in audio packets coming in. */
1536 s->call_samples += len;
1537
1538 /* In HDLC transmit mode, if 5 seconds elapse without data from the DTE
1539 we must treat this as an error. We return the result ERROR, and change
1540 to command-mode. */
1541 if (s->dte_data_timeout && s->call_samples > s->dte_data_timeout)
1542 {
1543 t31_set_at_rx_mode(s, AT_MODE_OFFHOOK_COMMAND);
1544 at_put_response_code(&s->at_state, AT_RESPONSE_CODE_ERROR);
1545 restart_modem(s, T31_SILENCE_TX);
1546 }
1547
1548 if (!s->at_state.transmit || s->modem == T31_CNG_TONE)
1549 s->rx_handler(s->rx_user_data, amp, len);
1550 return 0;
1551 }
1552 /*- End of function --------------------------------------------------------*/
1553
1554 static int set_next_tx_type(t31_state_t *s)
1555 {
1556 if (s->next_tx_handler)
1557 {
1558 s->tx_handler = s->next_tx_handler;
1559 s->tx_user_data = s->next_tx_user_data;
1560 s->next_tx_handler = NULL;
1561 return 0;
1562 }
1563 /* If there is nothing else to change to, so use zero length silence */
1564 silence_gen_alter(&(s->silence_gen), 0);
1565 s->tx_handler = (span_tx_handler_t *) &silence_gen;
1566 s->tx_user_data = &(s->silence_gen);
1567 s->next_tx_handler = NULL;
1568 return -1;
1569 }
1570 /*- End of function --------------------------------------------------------*/
1571
1572 int t31_tx(t31_state_t *s, int16_t amp[], int max_len)
1573 {
1574 int len;
1575
1576 len = 0;
1577 if (s->at_state.transmit)
1578 {
1579 if ((len = s->tx_handler(s->tx_user_data, amp, max_len)) < max_len)
1580 {
1581 /* Allow for one change of tx handler within a block */
1582 set_next_tx_type(s);
1583 if ((len += s->tx_handler(s->tx_user_data, amp + len, max_len - len)) < max_len)
1584 {
1585 switch (s->modem)
1586 {
1587 case T31_SILENCE_TX:
1588 s->modem = -1;
1589 at_put_response_code(&s->at_state, AT_RESPONSE_CODE_OK);
1590 if (s->at_state.do_hangup)
1591 {
1592 at_modem_control(&s->at_state, AT_MODEM_CONTROL_HANGUP, NULL);
1593 t31_set_at_rx_mode(s, AT_MODE_ONHOOK_COMMAND);
1594 s->at_state.do_hangup = FALSE;
1595 }
1596 else
1597 {
1598 t31_set_at_rx_mode(s, AT_MODE_OFFHOOK_COMMAND);
1599 }
1600 break;
1601 case T31_CED_TONE:
1602 /* Go directly to V.21/HDLC transmit. */
1603 s->modem = -1;
1604 restart_modem(s, T31_V21_TX);
1605 t31_set_at_rx_mode(s, AT_MODE_HDLC);
1606 break;
1607 case T31_V21_TX:
1608 #if defined(ENABLE_V17)
1609 case T31_V17_TX:
1610 #endif
1611 case T31_V27TER_TX:
1612 case T31_V29_TX:
1613 s->modem = -1;
1614 at_put_response_code(&s->at_state, AT_RESPONSE_CODE_OK);
1615 t31_set_at_rx_mode(s, AT_MODE_OFFHOOK_COMMAND);
1616 restart_modem(s, T31_SILENCE_TX);
1617 break;
1618 }
1619 }
1620 }
1621 }
1622 if (s->transmit_on_idle)
1623 {
1624 /* Pad to the requested length with silence */
1625 memset(amp, 0, max_len*sizeof(int16_t));
1626 len = max_len;
1627 }
1628 return len;
1629 }
1630 /*- End of function --------------------------------------------------------*/
1631
1632 void t31_set_transmit_on_idle(t31_state_t *s, int transmit_on_idle)
1633 {
1634 s->transmit_on_idle = transmit_on_idle;
1635 }
1636 /*- End of function --------------------------------------------------------*/
1637
1638 t31_state_t *t31_init(t31_state_t *s,
1639 at_tx_handler_t *at_tx_handler,
1640 void *at_tx_user_data,
1641 t31_modem_control_handler_t *modem_control_handler,
1642 void *modem_control_user_data,
1643 t38_tx_packet_handler_t *tx_t38_packet_handler,
1644 void *tx_t38_packet_user_data)
1645 {
1646 if (at_tx_handler == NULL || modem_control_handler == NULL)
1647 return NULL;
1648
1649 memset(s, 0, sizeof(*s));
1650 span_log_init(&s->logging, SPAN_LOG_NONE, NULL);
1651 span_log_set_protocol(&s->logging, "T.31");
1652
1653 s->modem_control_handler = modem_control_handler;
1654 s->modem_control_user_data = modem_control_user_data;
1655 #if defined(ENABLE_V17)
1656 v17_rx_init(&(s->v17rx), 14400, non_ecm_put_bit, s);
1657 v17_tx_init(&(s->v17tx), 14400, FALSE, non_ecm_get_bit, s);
1658 #endif
1659 v29_rx_init(&(s->v29rx), 9600, non_ecm_put_bit, s);
1660 v29_rx_signal_cutoff(&(s->v29rx), -45.5);
1661 v29_tx_init(&(s->v29tx), 9600, FALSE, non_ecm_get_bit, s);
1662 v27ter_rx_init(&(s->v27ter_rx), 4800, non_ecm_put_bit, s);
1663 v27ter_tx_init(&(s->v27ter_tx), 4800, FALSE, non_ecm_get_bit, s);
1664 silence_gen_init(&(s->silence_gen), 0);
1665 power_meter_init(&(s->rx_power), 4);
1666 s->last_sample = 0;
1667 s->silence_threshold_power = power_meter_level_dbm0(-43);
1668 s->at_state.rx_signal_present = FALSE;
1669 s->at_state.rx_trained = FALSE;
1670
1671 s->at_state.do_hangup = FALSE;
1672 s->at_state.line_ptr = 0;
1673 s->silence_heard = 0;
1674 s->silence_awaited = 0;
1675 s->call_samples = 0;
1676 s->modem = -1;
1677 s->at_state.transmit = TRUE;
1678 s->rx_handler = dummy_rx;
1679 s->rx_user_data = NULL;
1680 s->tx_handler = (span_tx_handler_t *) &silence_gen;
1681 s->tx_user_data = &(s->silence_gen);
1682
1683 if (queue_create(&(s->rx_queue), 4096, QUEUE_WRITE_ATOMIC | QUEUE_READ_ATOMIC) < 0)
1684 return NULL;
1685 at_init(&s->at_state, at_tx_handler, at_tx_user_data, t31_modem_control_handler, s);
1686 at_set_class1_handler(&s->at_state, process_class1_cmd, s);
1687 s->at_state.dte_inactivity_timeout = DEFAULT_DTE_TIMEOUT;
1688 if (tx_t38_packet_handler)
1689 {
1690 t38_core_init(&s->t38, process_rx_indicator, process_rx_data, process_rx_missing, (void *) s);
1691 s->t38.tx_packet_handler = tx_t38_packet_handler;
1692 s->t38.tx_packet_user_data = tx_t38_packet_user_data;
1693 }
1694 s->t38_mode = FALSE;
1695 return s;
1696 }
1697 /*- End of function --------------------------------------------------------*/
1698
1699 int t31_release(t31_state_t *s)
1700 {
1701 at_reset_call_info(&s->at_state);
1702 free(s);
1703 return 0;
1704 }
1705 /*- End of function --------------------------------------------------------*/
1706 /*- End of file ------------------------------------------------------------*/

Repositories maintained by Peter Meerwald, pmeerw@pmeerw.net.