Mercurial > hg > audiostuff
comparison spandsp-0.0.6pre17/tests/adsi_tests.c @ 4:26cd8f1ef0b1
import spandsp-0.0.6pre17
| author | Peter Meerwald <pmeerw@cosy.sbg.ac.at> |
|---|---|
| date | Fri, 25 Jun 2010 15:50:58 +0200 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| 3:c6c5a16ce2f2 | 4:26cd8f1ef0b1 |
|---|---|
| 1 /* | |
| 2 * SpanDSP - a series of DSP components for telephony | |
| 3 * | |
| 4 * adsi_tests.c - tests for analogue display service handling. | |
| 5 * | |
| 6 * Written by Steve Underwood <steveu@coppice.org> | |
| 7 * | |
| 8 * Copyright (C) 2003 Steve Underwood | |
| 9 * | |
| 10 * All rights reserved. | |
| 11 * | |
| 12 * This program is free software; you can redistribute it and/or modify | |
| 13 * it under the terms of the GNU General Public License version 2, as | |
| 14 * published by the Free Software Foundation. | |
| 15 * | |
| 16 * This program is distributed in the hope that it will be useful, | |
| 17 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| 19 * GNU General Public License for more details. | |
| 20 * | |
| 21 * You should have received a copy of the GNU General Public License | |
| 22 * along with this program; if not, write to the Free Software | |
| 23 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |
| 24 * | |
| 25 * $Id: adsi_tests.c,v 1.57 2009/05/30 15:23:13 steveu Exp $ | |
| 26 */ | |
| 27 | |
| 28 /*! \page adsi_tests_page ADSI tests | |
| 29 \section adsi_tests_page_sec_1 What does it do? | |
| 30 These tests exercise the ADSI module, for all supported standards. A transmit | |
| 31 and a receive instance of the ADSI module are connected together. A quantity | |
| 32 of messages is passed between these instances, and checked for accuracy at | |
| 33 the receiver. Since the FSK modems used for this are exercised fully by other | |
| 34 tests, these tests do not include line modelling. | |
| 35 | |
| 36 \section adsi_tests_page_sec_2 How does it work? | |
| 37 */ | |
| 38 | |
| 39 /* Enable the following definition to enable direct probing into the FAX structures */ | |
| 40 //#define WITH_SPANDSP_INTERNALS | |
| 41 | |
| 42 #if defined(HAVE_CONFIG_H) | |
| 43 #include "config.h" | |
| 44 #endif | |
| 45 | |
| 46 #include <unistd.h> | |
| 47 #include <stdlib.h> | |
| 48 #include <stdio.h> | |
| 49 #include <string.h> | |
| 50 #include <assert.h> | |
| 51 #include <sndfile.h> | |
| 52 | |
| 53 //#if defined(WITH_SPANDSP_INTERNALS) | |
| 54 #define SPANDSP_EXPOSE_INTERNAL_STRUCTURES | |
| 55 //#endif | |
| 56 | |
| 57 #include "spandsp.h" | |
| 58 #include "spandsp-sim.h" | |
| 59 | |
| 60 #define OUTPUT_FILE_NAME "adsi.wav" | |
| 61 | |
| 62 #define BLOCK_LEN 160 | |
| 63 | |
| 64 #define MITEL_DIR "../test-data/mitel/" | |
| 65 #define BELLCORE_DIR "../test-data/bellcore/" | |
| 66 | |
| 67 const char *bellcore_files[] = | |
| 68 { | |
| 69 MITEL_DIR "mitel-cm7291-talkoff.wav", | |
| 70 BELLCORE_DIR "tr-tsy-00763-1.wav", | |
| 71 BELLCORE_DIR "tr-tsy-00763-2.wav", | |
| 72 BELLCORE_DIR "tr-tsy-00763-3.wav", | |
| 73 BELLCORE_DIR "tr-tsy-00763-4.wav", | |
| 74 BELLCORE_DIR "tr-tsy-00763-5.wav", | |
| 75 BELLCORE_DIR "tr-tsy-00763-6.wav", | |
| 76 "" | |
| 77 }; | |
| 78 | |
| 79 char *decode_test_file = NULL; | |
| 80 | |
| 81 int errors = 0; | |
| 82 int basic_testing = FALSE; | |
| 83 | |
| 84 adsi_rx_state_t *rx_adsi; | |
| 85 adsi_tx_state_t *tx_adsi; | |
| 86 | |
| 87 int current_standard = 0; | |
| 88 int good_message_received; | |
| 89 int log_audio = FALSE; | |
| 90 SNDFILE *outhandle = NULL; | |
| 91 int short_preamble = FALSE; | |
| 92 | |
| 93 static int adsi_create_message(adsi_tx_state_t *s, uint8_t *msg) | |
| 94 { | |
| 95 const char *t; | |
| 96 int len; | |
| 97 static int cycle = 0; | |
| 98 | |
| 99 len = 0; | |
| 100 switch (current_standard) | |
| 101 { | |
| 102 case ADSI_STANDARD_CLASS: | |
| 103 if (cycle > 3) | |
| 104 cycle = 0; | |
| 105 switch (cycle) | |
| 106 { | |
| 107 case 0: | |
| 108 len = adsi_add_field(s, msg, -1, CLASS_MDMF_CALLERID, NULL, 0); | |
| 109 /* Date and time as MMDDHHMM */ | |
| 110 len = adsi_add_field(s, msg, len, MCLASS_DATETIME, (uint8_t *) "10011750", 8); | |
| 111 len = adsi_add_field(s, msg, len, MCLASS_CALLER_NUMBER, (uint8_t *) "12345678", 8); | |
| 112 len = adsi_add_field(s, msg, len, MCLASS_DIALED_NUMBER, (uint8_t *) "87654321", 8); | |
| 113 len = adsi_add_field(s, msg, len, MCLASS_CALLER_NAME, (uint8_t *) "Chan Dai Man", 15); | |
| 114 break; | |
| 115 case 1: | |
| 116 len = adsi_add_field(s, msg, -1, CLASS_SDMF_MSG_WAITING, NULL, 0); | |
| 117 /* Active */ | |
| 118 len = adsi_add_field(s, msg, len, 0, (uint8_t *) "\x42", 1); | |
| 119 len = adsi_add_field(s, msg, len, 0, (uint8_t *) "\x42", 1); | |
| 120 len = adsi_add_field(s, msg, len, 0, (uint8_t *) "\x42", 1); | |
| 121 break; | |
| 122 case 2: | |
| 123 len = adsi_add_field(s, msg, -1, CLASS_SDMF_MSG_WAITING, NULL, 0); | |
| 124 /* Inactive */ | |
| 125 len = adsi_add_field(s, msg, len, 0, (uint8_t *) "\x6F", 1); | |
| 126 len = adsi_add_field(s, msg, len, 0, (uint8_t *) "\x6F", 1); | |
| 127 len = adsi_add_field(s, msg, len, 0, (uint8_t *) "\x6F", 1); | |
| 128 break; | |
| 129 case 3: | |
| 130 len = adsi_add_field(s, msg, -1, CLASS_SDMF_CALLERID, NULL, 0); | |
| 131 /* Date and time as MMDDHHMM */ | |
| 132 len = adsi_add_field(s, msg, len, 0, (uint8_t *) "10011750", 8); | |
| 133 len = adsi_add_field(s, msg, len, 0, (uint8_t *) "6095551212", 10); | |
| 134 break; | |
| 135 } | |
| 136 break; | |
| 137 case ADSI_STANDARD_CLIP: | |
| 138 if (cycle > 4) | |
| 139 cycle = 0; | |
| 140 switch (cycle) | |
| 141 { | |
| 142 case 0: | |
| 143 len = adsi_add_field(s, msg, -1, CLIP_MDMF_CALLERID, NULL, 0); | |
| 144 len = adsi_add_field(s, msg, len, CLIP_CALLTYPE, (uint8_t *) "\x81", 1); | |
| 145 /* Date and time as MMDDHHMM */ | |
| 146 len = adsi_add_field(s, msg, len, CLIP_DATETIME, (uint8_t *) "10011750", 8); | |
| 147 len = adsi_add_field(s, msg, len, CLIP_DIALED_NUMBER, (uint8_t *) "12345678", 8); | |
| 148 len = adsi_add_field(s, msg, len, CLIP_CALLER_NUMBER, (uint8_t *) "87654321", 8); | |
| 149 len = adsi_add_field(s, msg, len, CLIP_CALLER_NAME, (uint8_t *) "Chan Dai Man", 15); | |
| 150 break; | |
| 151 case 1: | |
| 152 len = adsi_add_field(s, msg, -1, CLIP_MDMF_MSG_WAITING, NULL, 0); | |
| 153 /* Inactive */ | |
| 154 len = adsi_add_field(s, msg, len, CLIP_VISUAL_INDICATOR, (uint8_t *) "\x00", 1); | |
| 155 break; | |
| 156 case 2: | |
| 157 len = adsi_add_field(s, msg, -1, CLIP_MDMF_MSG_WAITING, NULL, 0); | |
| 158 /* Active */ | |
| 159 len = adsi_add_field(s, msg, len, CLIP_VISUAL_INDICATOR, (uint8_t *) "\xFF", 1); | |
| 160 len = adsi_add_field(s, msg, len, CLIP_NUM_MSG, (uint8_t *) "\x05", 1); | |
| 161 break; | |
| 162 case 3: | |
| 163 len = adsi_add_field(s, msg, -1, CLIP_MDMF_SMS, NULL, 0); | |
| 164 /* Active */ | |
| 165 len = adsi_add_field(s, msg, len, CLIP_DISPLAY_INFO, (uint8_t *) "\x00" "ABC", 4); | |
| 166 break; | |
| 167 case 4: | |
| 168 len = adsi_add_field(s, msg, -1, CLIP_MDMF_CALLERID, NULL, 0); | |
| 169 len = adsi_add_field(s, msg, len, CLIP_NUM_MSG, (uint8_t *) "\x03", 1); | |
| 170 break; | |
| 171 } | |
| 172 break; | |
| 173 case ADSI_STANDARD_ACLIP: | |
| 174 if (cycle > 0) | |
| 175 cycle = 0; | |
| 176 switch (cycle) | |
| 177 { | |
| 178 case 0: | |
| 179 len = adsi_add_field(s, msg, -1, ACLIP_MDMF_CALLERID, NULL, 0); | |
| 180 /* Date and time as MMDDHHMM */ | |
| 181 len = adsi_add_field(s, msg, len, ACLIP_DATETIME, (uint8_t *) "10011750", 8); | |
| 182 len = adsi_add_field(s, msg, len, ACLIP_DIALED_NUMBER, (uint8_t *) "12345678", 8); | |
| 183 len = adsi_add_field(s, msg, len, ACLIP_CALLER_NUMBER, (uint8_t *) "87654321", 8); | |
| 184 len = adsi_add_field(s, msg, len, ACLIP_CALLER_NAME, (uint8_t *) "Chan Dai Man", 15); | |
| 185 break; | |
| 186 } | |
| 187 break; | |
| 188 case ADSI_STANDARD_JCLIP: | |
| 189 len = adsi_add_field(s, msg, -1, JCLIP_MDMF_CALLERID, NULL, 0); | |
| 190 len = adsi_add_field(s, msg, len, JCLIP_CALLER_NUMBER, (uint8_t *) "12345678", 8); | |
| 191 len = adsi_add_field(s, msg, len, JCLIP_CALLER_NUM_DES, (uint8_t *) "215", 3); | |
| 192 len = adsi_add_field(s, msg, len, JCLIP_DIALED_NUMBER, (uint8_t *) "87654321", 8); | |
| 193 len = adsi_add_field(s, msg, len, JCLIP_DIALED_NUM_DES, (uint8_t *) "215", 3); | |
| 194 break; | |
| 195 case ADSI_STANDARD_CLIP_DTMF: | |
| 196 if (cycle > 4) | |
| 197 cycle = 0; | |
| 198 switch (cycle) | |
| 199 { | |
| 200 case 0: | |
| 201 len = adsi_add_field(s, msg, -1, CLIP_DTMF_C_TERMINATED, NULL, 0); | |
| 202 len = adsi_add_field(s, msg, len, CLIP_DTMF_C_CALLER_NUMBER, (uint8_t *) "12345678", 8); | |
| 203 len = adsi_add_field(s, msg, len, CLIP_DTMF_C_ABSENCE, (uint8_t *) "10", 2); | |
| 204 len = adsi_add_field(s, msg, len, CLIP_DTMF_C_REDIRECT_NUMBER, (uint8_t *) "87654321", 8); | |
| 205 break; | |
| 206 case 1: | |
| 207 len = adsi_add_field(s, msg, -1, CLIP_DTMF_HASH_TERMINATED, NULL, 0); | |
| 208 len = adsi_add_field(s, msg, len, CLIP_DTMF_HASH_CALLER_NUMBER, (uint8_t *) "12345678", 8); | |
| 209 break; | |
| 210 case 2: | |
| 211 len = adsi_add_field(s, msg, -1, CLIP_DTMF_HASH_TERMINATED, NULL, 0); | |
| 212 len = adsi_add_field(s, msg, len, CLIP_DTMF_HASH_ABSENCE, (uint8_t *) "1", 1); | |
| 213 break; | |
| 214 case 3: | |
| 215 /* Test the D<number>C format, used in Taiwan and Kuwait */ | |
| 216 len = adsi_add_field(s, msg, -1, CLIP_DTMF_HASH_TERMINATED, NULL, 0); | |
| 217 len = adsi_add_field(s, msg, len, CLIP_DTMF_HASH_ABSENCE, (uint8_t *) "12345678", 8); | |
| 218 break; | |
| 219 case 4: | |
| 220 /* Test the <number># format, with no header */ | |
| 221 len = adsi_add_field(s, msg, -1, CLIP_DTMF_HASH_TERMINATED, NULL, 0); | |
| 222 len = adsi_add_field(s, msg, len, CLIP_DTMF_HASH_UNSPECIFIED, (uint8_t *) "12345678", 8); | |
| 223 break; | |
| 224 } | |
| 225 break; | |
| 226 case ADSI_STANDARD_TDD: | |
| 227 t = "The quick Brown Fox Jumps Over The Lazy dog 0123456789!@#$%^&*()"; | |
| 228 len = adsi_add_field(s, msg, -1, 0, (uint8_t *) t, strlen(t)); | |
| 229 break; | |
| 230 } | |
| 231 cycle++; | |
| 232 return len; | |
| 233 } | |
| 234 /*- End of function --------------------------------------------------------*/ | |
| 235 | |
| 236 static void put_adsi_msg(void *user_data, const uint8_t *msg, int len) | |
| 237 { | |
| 238 int i; | |
| 239 int l; | |
| 240 uint8_t field_type; | |
| 241 const uint8_t *field_body; | |
| 242 int field_len; | |
| 243 int message_type; | |
| 244 uint8_t body[256]; | |
| 245 | |
| 246 printf("Good message received (%d bytes)\n", len); | |
| 247 good_message_received = TRUE; | |
| 248 for (i = 0; i < len; i++) | |
| 249 { | |
| 250 printf("%02x ", msg[i]); | |
| 251 if ((i & 0xF) == 0xF) | |
| 252 printf("\n"); | |
| 253 } | |
| 254 printf("\n"); | |
| 255 l = -1; | |
| 256 message_type = -1; | |
| 257 printf("Message breakdown\n"); | |
| 258 do | |
| 259 { | |
| 260 l = adsi_next_field(rx_adsi, msg, len, l, &field_type, &field_body, &field_len); | |
| 261 if (l > 0) | |
| 262 { | |
| 263 if (field_body) | |
| 264 { | |
| 265 memcpy(body, field_body, field_len); | |
| 266 body[field_len] = '\0'; | |
| 267 printf("Field type 0x%x, len %d, '%s' - ", field_type, field_len, body); | |
| 268 switch (current_standard) | |
| 269 { | |
| 270 case ADSI_STANDARD_CLASS: | |
| 271 switch (message_type) | |
| 272 { | |
| 273 case CLASS_SDMF_CALLERID: | |
| 274 break; | |
| 275 case CLASS_MDMF_CALLERID: | |
| 276 switch (field_type) | |
| 277 { | |
| 278 case MCLASS_DATETIME: | |
| 279 printf("Date and time (MMDDHHMM)"); | |
| 280 break; | |
| 281 case MCLASS_CALLER_NUMBER: | |
| 282 printf("Caller's number"); | |
| 283 break; | |
| 284 case MCLASS_DIALED_NUMBER: | |
| 285 printf("Dialed number"); | |
| 286 break; | |
| 287 case MCLASS_ABSENCE1: | |
| 288 printf("Caller's number absent: 'O' or 'P'"); | |
| 289 break; | |
| 290 case MCLASS_REDIRECT: | |
| 291 printf("Call forward: universal ('0'), on busy ('1'), or on unanswered ('2')"); | |
| 292 break; | |
| 293 case MCLASS_QUALIFIER: | |
| 294 printf("Long distance: 'L'"); | |
| 295 break; | |
| 296 case MCLASS_CALLER_NAME: | |
| 297 printf("Caller's name"); | |
| 298 break; | |
| 299 case MCLASS_ABSENCE2: | |
| 300 printf("Caller's name absent: 'O' or 'P'"); | |
| 301 break; | |
| 302 } | |
| 303 break; | |
| 304 case CLASS_SDMF_MSG_WAITING: | |
| 305 break; | |
| 306 case CLASS_MDMF_MSG_WAITING: | |
| 307 switch (field_type) | |
| 308 { | |
| 309 case MCLASS_VISUAL_INDICATOR: | |
| 310 printf("Message waiting/not waiting"); | |
| 311 break; | |
| 312 } | |
| 313 break; | |
| 314 } | |
| 315 break; | |
| 316 case ADSI_STANDARD_CLIP: | |
| 317 switch (message_type) | |
| 318 { | |
| 319 case CLIP_MDMF_CALLERID: | |
| 320 case CLIP_MDMF_MSG_WAITING: | |
| 321 case CLIP_MDMF_CHARGE_INFO: | |
| 322 case CLIP_MDMF_SMS: | |
| 323 switch (field_type) | |
| 324 { | |
| 325 case CLIP_DATETIME: | |
| 326 printf("Date and time (MMDDHHMM)"); | |
| 327 break; | |
| 328 case CLIP_CALLER_NUMBER: | |
| 329 printf("Caller's number"); | |
| 330 break; | |
| 331 case CLIP_DIALED_NUMBER: | |
| 332 printf("Dialed number"); | |
| 333 break; | |
| 334 case CLIP_ABSENCE1: | |
| 335 printf("Caller's number absent"); | |
| 336 break; | |
| 337 case CLIP_CALLER_NAME: | |
| 338 printf("Caller's name"); | |
| 339 break; | |
| 340 case CLIP_ABSENCE2: | |
| 341 printf("Caller's name absent"); | |
| 342 break; | |
| 343 case CLIP_VISUAL_INDICATOR: | |
| 344 printf("Visual indicator"); | |
| 345 break; | |
| 346 case CLIP_MESSAGE_ID: | |
| 347 printf("Message ID"); | |
| 348 break; | |
| 349 case CLIP_CALLTYPE: | |
| 350 printf("Voice call, ring-back-when-free call, or msg waiting call"); | |
| 351 break; | |
| 352 case CLIP_NUM_MSG: | |
| 353 printf("Number of messages"); | |
| 354 break; | |
| 355 #if 0 | |
| 356 case CLIP_REDIR_NUMBER: | |
| 357 printf("Redirecting number"); | |
| 358 break; | |
| 359 #endif | |
| 360 case CLIP_CHARGE: | |
| 361 printf("Charge"); | |
| 362 break; | |
| 363 case CLIP_DURATION: | |
| 364 printf("Duration of the call"); | |
| 365 break; | |
| 366 case CLIP_ADD_CHARGE: | |
| 367 printf("Additional charge"); | |
| 368 break; | |
| 369 case CLIP_DISPLAY_INFO: | |
| 370 printf("Display information"); | |
| 371 break; | |
| 372 case CLIP_SERVICE_INFO: | |
| 373 printf("Service information"); | |
| 374 break; | |
| 375 } | |
| 376 break; | |
| 377 } | |
| 378 break; | |
| 379 case ADSI_STANDARD_ACLIP: | |
| 380 switch (message_type) | |
| 381 { | |
| 382 case ACLIP_SDMF_CALLERID: | |
| 383 break; | |
| 384 case ACLIP_MDMF_CALLERID: | |
| 385 switch (field_type) | |
| 386 { | |
| 387 case ACLIP_DATETIME: | |
| 388 printf("Date and time (MMDDHHMM)"); | |
| 389 break; | |
| 390 case ACLIP_CALLER_NUMBER: | |
| 391 printf("Caller's number"); | |
| 392 break; | |
| 393 case ACLIP_DIALED_NUMBER: | |
| 394 printf("Dialed number"); | |
| 395 break; | |
| 396 case ACLIP_NUMBER_ABSENCE: | |
| 397 printf("Caller's number absent: 'O' or 'P'"); | |
| 398 break; | |
| 399 case ACLIP_REDIRECT: | |
| 400 printf("Call forward: universal, on busy, or on unanswered"); | |
| 401 break; | |
| 402 case ACLIP_QUALIFIER: | |
| 403 printf("Long distance call: 'L'"); | |
| 404 break; | |
| 405 case ACLIP_CALLER_NAME: | |
| 406 printf("Caller's name"); | |
| 407 break; | |
| 408 case ACLIP_NAME_ABSENCE: | |
| 409 printf("Caller's name absent: 'O' or 'P'"); | |
| 410 break; | |
| 411 } | |
| 412 break; | |
| 413 } | |
| 414 break; | |
| 415 case ADSI_STANDARD_JCLIP: | |
| 416 switch (message_type) | |
| 417 { | |
| 418 case JCLIP_MDMF_CALLERID: | |
| 419 switch (field_type) | |
| 420 { | |
| 421 case JCLIP_CALLER_NUMBER: | |
| 422 printf("Caller's number"); | |
| 423 break; | |
| 424 case JCLIP_CALLER_NUM_DES: | |
| 425 printf("Caller's number data extension signal"); | |
| 426 break; | |
| 427 case JCLIP_DIALED_NUMBER: | |
| 428 printf("Dialed number"); | |
| 429 break; | |
| 430 case JCLIP_DIALED_NUM_DES: | |
| 431 printf("Dialed number data extension signal"); | |
| 432 break; | |
| 433 case JCLIP_ABSENCE: | |
| 434 printf("Caller's number absent: 'C', 'O', 'P' or 'S'"); | |
| 435 break; | |
| 436 } | |
| 437 break; | |
| 438 } | |
| 439 break; | |
| 440 case ADSI_STANDARD_CLIP_DTMF: | |
| 441 switch (message_type) | |
| 442 { | |
| 443 case CLIP_DTMF_HASH_TERMINATED: | |
| 444 switch (field_type) | |
| 445 { | |
| 446 case CLIP_DTMF_HASH_CALLER_NUMBER: | |
| 447 printf("Caller's number"); | |
| 448 break; | |
| 449 case CLIP_DTMF_HASH_ABSENCE: | |
| 450 printf("Caller's number absent: private (1), overseas (2) or not available (3)"); | |
| 451 break; | |
| 452 case CLIP_DTMF_HASH_UNSPECIFIED: | |
| 453 printf("Unspecified"); | |
| 454 break; | |
| 455 } | |
| 456 break; | |
| 457 case CLIP_DTMF_C_TERMINATED: | |
| 458 switch (field_type) | |
| 459 { | |
| 460 case CLIP_DTMF_C_CALLER_NUMBER: | |
| 461 printf("Caller's number"); | |
| 462 break; | |
| 463 case CLIP_DTMF_C_REDIRECT_NUMBER: | |
| 464 printf("Redirect number"); | |
| 465 break; | |
| 466 case CLIP_DTMF_C_ABSENCE: | |
| 467 printf("Caller's number absent"); | |
| 468 break; | |
| 469 } | |
| 470 break; | |
| 471 } | |
| 472 break; | |
| 473 case ADSI_STANDARD_TDD: | |
| 474 if (basic_testing) | |
| 475 { | |
| 476 if (len != 59 | |
| 477 || | |
| 478 memcmp(msg, "THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG 0123456789#$*()", 59)) | |
| 479 { | |
| 480 printf("\n"); | |
| 481 printf("String error\n"); | |
| 482 exit(2); | |
| 483 } | |
| 484 } | |
| 485 break; | |
| 486 } | |
| 487 } | |
| 488 else | |
| 489 { | |
| 490 printf("Message type 0x%x - ", field_type); | |
| 491 message_type = field_type; | |
| 492 switch (current_standard) | |
| 493 { | |
| 494 case ADSI_STANDARD_CLASS: | |
| 495 switch (message_type) | |
| 496 { | |
| 497 case CLASS_SDMF_CALLERID: | |
| 498 printf("Single data message caller ID"); | |
| 499 break; | |
| 500 case CLASS_MDMF_CALLERID: | |
| 501 printf("Multiple data message caller ID"); | |
| 502 break; | |
| 503 case CLASS_SDMF_MSG_WAITING: | |
| 504 printf("Single data message message waiting"); | |
| 505 break; | |
| 506 case CLASS_MDMF_MSG_WAITING: | |
| 507 printf("Multiple data message message waiting"); | |
| 508 break; | |
| 509 default: | |
| 510 printf("Unknown"); | |
| 511 break; | |
| 512 } | |
| 513 break; | |
| 514 case ADSI_STANDARD_CLIP: | |
| 515 switch (message_type) | |
| 516 { | |
| 517 case CLIP_MDMF_CALLERID: | |
| 518 printf("Multiple data message caller ID"); | |
| 519 break; | |
| 520 case CLIP_MDMF_MSG_WAITING: | |
| 521 printf("Multiple data message message waiting"); | |
| 522 break; | |
| 523 case CLIP_MDMF_CHARGE_INFO: | |
| 524 printf("Multiple data message charge info"); | |
| 525 break; | |
| 526 case CLIP_MDMF_SMS: | |
| 527 printf("Multiple data message SMS"); | |
| 528 break; | |
| 529 default: | |
| 530 printf("Unknown"); | |
| 531 break; | |
| 532 } | |
| 533 break; | |
| 534 case ADSI_STANDARD_ACLIP: | |
| 535 switch (message_type) | |
| 536 { | |
| 537 case ACLIP_SDMF_CALLERID: | |
| 538 printf("Single data message caller ID frame"); | |
| 539 break; | |
| 540 case ACLIP_MDMF_CALLERID: | |
| 541 printf("Multiple data message caller ID frame"); | |
| 542 break; | |
| 543 default: | |
| 544 printf("Unknown"); | |
| 545 break; | |
| 546 } | |
| 547 break; | |
| 548 case ADSI_STANDARD_JCLIP: | |
| 549 switch (message_type) | |
| 550 { | |
| 551 case JCLIP_MDMF_CALLERID: | |
| 552 printf("Multiple data message caller ID frame"); | |
| 553 break; | |
| 554 default: | |
| 555 printf("Unknown"); | |
| 556 break; | |
| 557 } | |
| 558 break; | |
| 559 case ADSI_STANDARD_CLIP_DTMF: | |
| 560 switch (message_type) | |
| 561 { | |
| 562 case CLIP_DTMF_HASH_TERMINATED: | |
| 563 printf("# terminated"); | |
| 564 break; | |
| 565 case CLIP_DTMF_C_TERMINATED: | |
| 566 printf("C terminated"); | |
| 567 break; | |
| 568 default: | |
| 569 printf("Unknown"); | |
| 570 break; | |
| 571 } | |
| 572 break; | |
| 573 case ADSI_STANDARD_TDD: | |
| 574 printf("Unknown"); | |
| 575 break; | |
| 576 } | |
| 577 } | |
| 578 printf("\n"); | |
| 579 } | |
| 580 } | |
| 581 while (l > 0); | |
| 582 if (l < -1) | |
| 583 { | |
| 584 /* This message appears corrupt */ | |
| 585 printf("Bad message contents\n"); | |
| 586 exit(2); | |
| 587 } | |
| 588 printf("\n"); | |
| 589 } | |
| 590 /*- End of function --------------------------------------------------------*/ | |
| 591 | |
| 592 static void tdd_character_set_tests(void) | |
| 593 { | |
| 594 #if 0 | |
| 595 char *s; | |
| 596 int ch; | |
| 597 int xx; | |
| 598 int yy; | |
| 599 | |
| 600 /* This part tests internal static routines in the ADSI module. It can | |
| 601 only be run with a modified version of the ADSI module, which makes | |
| 602 the routines visible. */ | |
| 603 /* Check the character encode/decode cycle */ | |
| 604 tx_adsi = adsi_tx_init(NULL, ADSI_STANDARD_TDD); | |
| 605 rx_adsi = adsi_rx_init(NULL, ADSI_STANDARD_TDD, put_adsi_msg, NULL); | |
| 606 s = "The quick Brown Fox Jumps Over The Lazy dog 0123456789!@#$%^&*()"; | |
| 607 while ((ch = *s++)) | |
| 608 { | |
| 609 xx = adsi_encode_baudot(tx_adsi, ch); | |
| 610 if ((xx & 0x3E0)) | |
| 611 { | |
| 612 yy = adsi_decode_baudot(rx_adsi, (xx >> 5) & 0x1F); | |
| 613 if (yy) | |
| 614 printf("%c", yy); | |
| 615 } | |
| 616 yy = adsi_decode_baudot(rx_adsi, xx & 0x1F); | |
| 617 if (yy) | |
| 618 printf("%c", yy); | |
| 619 } | |
| 620 adsi_tx_free(tx_adsi); | |
| 621 adsi_rx_free(rx_adsi); | |
| 622 printf("\n"); | |
| 623 #endif | |
| 624 } | |
| 625 /*- End of function --------------------------------------------------------*/ | |
| 626 | |
| 627 static void basic_tests(int standard) | |
| 628 { | |
| 629 int16_t amp[BLOCK_LEN]; | |
| 630 uint8_t adsi_msg[256 + 42]; | |
| 631 int outframes; | |
| 632 int len; | |
| 633 int adsi_msg_len; | |
| 634 int push; | |
| 635 int i; | |
| 636 | |
| 637 basic_testing = TRUE; | |
| 638 printf("Testing %s\n", adsi_standard_to_str(standard)); | |
| 639 tx_adsi = adsi_tx_init(NULL, standard); | |
| 640 if (short_preamble) | |
| 641 adsi_tx_set_preamble(tx_adsi, 50, 20, 5, -1); | |
| 642 rx_adsi = adsi_rx_init(NULL, standard, put_adsi_msg, NULL); | |
| 643 | |
| 644 /* Fake an OK condition for the first message test */ | |
| 645 good_message_received = TRUE; | |
| 646 push = 0; | |
| 647 for (i = 0; i < 100000; i++) | |
| 648 { | |
| 649 if (push == 0) | |
| 650 { | |
| 651 if ((len = adsi_tx(tx_adsi, amp, BLOCK_LEN)) == 0) | |
| 652 push = 10; | |
| 653 } | |
| 654 else | |
| 655 { | |
| 656 len = 0; | |
| 657 /* Push a little silence through, to flush things out */ | |
| 658 if (--push == 0) | |
| 659 { | |
| 660 if (!good_message_received) | |
| 661 { | |
| 662 printf("No message received %s (%d)\n", adsi_standard_to_str(standard), i); | |
| 663 exit(2); | |
| 664 } | |
| 665 good_message_received = FALSE; | |
| 666 adsi_msg_len = adsi_create_message(tx_adsi, adsi_msg); | |
| 667 adsi_msg_len = adsi_tx_put_message(tx_adsi, adsi_msg, adsi_msg_len); | |
| 668 } | |
| 669 } | |
| 670 if (len < BLOCK_LEN) | |
| 671 { | |
| 672 memset(&[len], 0, sizeof(int16_t)*(BLOCK_LEN - len)); | |
| 673 len = BLOCK_LEN; | |
| 674 } | |
| 675 if (log_audio) | |
| 676 { | |
| 677 outframes = sf_writef_short(outhandle, | |
| 678 amp, | |
| 679 len); | |
| 680 if (outframes != len) | |
| 681 { | |
| 682 fprintf(stderr, " Error writing audio file\n"); | |
| 683 exit(2); | |
| 684 } | |
| 685 } | |
| 686 adsi_rx(rx_adsi, amp, len); | |
| 687 } | |
| 688 adsi_rx_free(rx_adsi); | |
| 689 adsi_tx_free(tx_adsi); | |
| 690 basic_testing = FALSE; | |
| 691 } | |
| 692 /*- End of function --------------------------------------------------------*/ | |
| 693 | |
| 694 static void mitel_cm7291_side_2_and_bellcore_tests(int standard) | |
| 695 { | |
| 696 int j; | |
| 697 int16_t amp[BLOCK_LEN]; | |
| 698 SNDFILE *inhandle; | |
| 699 int frames; | |
| 700 | |
| 701 /* The remainder of the Mitel tape is the talk-off test */ | |
| 702 /* Here we use the Bellcore test tapes (much tougher), in six | |
| 703 files - 1 from each side of the original 3 cassette tapes */ | |
| 704 printf("Talk-off tests for %s\n", adsi_standard_to_str(standard)); | |
| 705 rx_adsi = adsi_rx_init(NULL, standard, put_adsi_msg, NULL); | |
| 706 for (j = 0; bellcore_files[j][0]; j++) | |
| 707 { | |
| 708 printf("Testing with %s\n", bellcore_files[j]); | |
| 709 if ((inhandle = sf_open_telephony_read(bellcore_files[j], 1)) == NULL) | |
| 710 { | |
| 711 printf(" Cannot open speech file '%s'\n", bellcore_files[j]); | |
| 712 exit(2); | |
| 713 } | |
| 714 while ((frames = sf_readf_short(inhandle, amp, BLOCK_LEN))) | |
| 715 { | |
| 716 adsi_rx(rx_adsi, amp, frames); | |
| 717 } | |
| 718 if (sf_close(inhandle) != 0) | |
| 719 { | |
| 720 printf(" Cannot close speech file '%s'\n", bellcore_files[j]); | |
| 721 exit(2); | |
| 722 } | |
| 723 } | |
| 724 adsi_rx_free(rx_adsi); | |
| 725 if (j > 470) | |
| 726 { | |
| 727 printf(" Failed\n"); | |
| 728 exit(2); | |
| 729 } | |
| 730 printf(" Passed\n"); | |
| 731 } | |
| 732 /*- End of function --------------------------------------------------------*/ | |
| 733 | |
| 734 int main(int argc, char *argv[]) | |
| 735 { | |
| 736 int16_t amp[BLOCK_LEN]; | |
| 737 SNDFILE *inhandle; | |
| 738 int len; | |
| 739 int test_standard; | |
| 740 int first_standard; | |
| 741 int last_standard; | |
| 742 int opt; | |
| 743 int enable_basic_tests; | |
| 744 int enable_talkoff_tests; | |
| 745 | |
| 746 log_audio = FALSE; | |
| 747 decode_test_file = NULL; | |
| 748 test_standard = -1; | |
| 749 short_preamble = FALSE; | |
| 750 enable_basic_tests = TRUE; | |
| 751 enable_talkoff_tests = FALSE; | |
| 752 while ((opt = getopt(argc, argv, "bd:lps:t")) != -1) | |
| 753 { | |
| 754 switch (opt) | |
| 755 { | |
| 756 case 'b': | |
| 757 enable_basic_tests = TRUE; | |
| 758 enable_talkoff_tests = FALSE; | |
| 759 break; | |
| 760 case 'd': | |
| 761 decode_test_file = optarg; | |
| 762 break; | |
| 763 case 'l': | |
| 764 log_audio = TRUE; | |
| 765 break; | |
| 766 case 'p': | |
| 767 short_preamble = TRUE; | |
| 768 break; | |
| 769 case 's': | |
| 770 if (strcasecmp("CLASS", optarg) == 0) | |
| 771 test_standard = ADSI_STANDARD_CLASS; | |
| 772 else if (strcasecmp("CLIP", optarg) == 0) | |
| 773 test_standard = ADSI_STANDARD_CLIP; | |
| 774 else if (strcasecmp("A-CLIP", optarg) == 0) | |
| 775 test_standard = ADSI_STANDARD_ACLIP; | |
| 776 else if (strcasecmp("J-CLIP", optarg) == 0) | |
| 777 test_standard = ADSI_STANDARD_JCLIP; | |
| 778 else if (strcasecmp("CLIP-DTMF", optarg) == 0) | |
| 779 test_standard = ADSI_STANDARD_CLIP_DTMF; | |
| 780 else if (strcasecmp("TDD", optarg) == 0) | |
| 781 test_standard = ADSI_STANDARD_TDD; | |
| 782 else | |
| 783 test_standard = atoi(optarg); | |
| 784 break; | |
| 785 case 't': | |
| 786 enable_basic_tests = FALSE; | |
| 787 enable_talkoff_tests = TRUE; | |
| 788 break; | |
| 789 default: | |
| 790 //usage(); | |
| 791 exit(2); | |
| 792 break; | |
| 793 } | |
| 794 } | |
| 795 outhandle = NULL; | |
| 796 | |
| 797 tdd_character_set_tests(); | |
| 798 | |
| 799 if (decode_test_file) | |
| 800 { | |
| 801 /* We will decode the audio from a file. */ | |
| 802 if ((inhandle = sf_open_telephony_read(decode_test_file, 1)) == NULL) | |
| 803 { | |
| 804 fprintf(stderr, " Cannot open audio file '%s'\n", decode_test_file); | |
| 805 exit(2); | |
| 806 } | |
| 807 if (test_standard < 0) | |
| 808 current_standard = ADSI_STANDARD_CLASS; | |
| 809 else | |
| 810 current_standard = test_standard; | |
| 811 | |
| 812 rx_adsi = adsi_rx_init(NULL, current_standard, put_adsi_msg, NULL); | |
| 813 #if 0 | |
| 814 span_log_set_level(rx_adsi.logging, SPAN_LOG_SHOW_SEVERITY | SPAN_LOG_SHOW_PROTOCOL | SPAN_LOG_FLOW); | |
| 815 span_log_set_tag(rx_adsi.logging, "ADSI"); | |
| 816 #endif | |
| 817 for (;;) | |
| 818 { | |
| 819 len = sf_readf_short(inhandle, amp, BLOCK_LEN); | |
| 820 if (len == 0) | |
| 821 break; | |
| 822 adsi_rx(rx_adsi, amp, len); | |
| 823 } | |
| 824 if (sf_close(inhandle) != 0) | |
| 825 { | |
| 826 fprintf(stderr, " Cannot close audio file '%s'\n", decode_test_file); | |
| 827 exit(2); | |
| 828 } | |
| 829 adsi_rx_free(rx_adsi); | |
| 830 } | |
| 831 else | |
| 832 { | |
| 833 if (log_audio) | |
| 834 { | |
| 835 if ((outhandle = sf_open_telephony_write(OUTPUT_FILE_NAME, 1)) == NULL) | |
| 836 { | |
| 837 fprintf(stderr, " Cannot create audio file '%s'\n", OUTPUT_FILE_NAME); | |
| 838 exit(2); | |
| 839 } | |
| 840 } | |
| 841 /* Go through all the standards */ | |
| 842 /* This assumes standard 0 is NULL, and TDD is the last in the list */ | |
| 843 if (test_standard < 0) | |
| 844 { | |
| 845 first_standard = ADSI_STANDARD_CLASS; | |
| 846 last_standard = ADSI_STANDARD_TDD; | |
| 847 } | |
| 848 else | |
| 849 { | |
| 850 first_standard = | |
| 851 last_standard = test_standard; | |
| 852 } | |
| 853 for (current_standard = first_standard; current_standard <= last_standard; current_standard++) | |
| 854 { | |
| 855 if (enable_basic_tests) | |
| 856 basic_tests(current_standard); | |
| 857 if (enable_talkoff_tests) | |
| 858 mitel_cm7291_side_2_and_bellcore_tests(current_standard); | |
| 859 } | |
| 860 if (log_audio) | |
| 861 { | |
| 862 if (sf_close(outhandle) != 0) | |
| 863 { | |
| 864 fprintf(stderr, " Cannot close audio file '%s'\n", OUTPUT_FILE_NAME); | |
| 865 exit(2); | |
| 866 } | |
| 867 } | |
| 868 printf("Tests passed.\n"); | |
| 869 } | |
| 870 | |
| 871 return 0; | |
| 872 } | |
| 873 /*- End of function --------------------------------------------------------*/ | |
| 874 /*- End of file ------------------------------------------------------------*/ |
