Mercurial > hg > audiostuff
diff spandsp-0.0.3/spandsp-0.0.3/src/spandsp/adsi.h @ 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 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/spandsp-0.0.3/spandsp-0.0.3/src/spandsp/adsi.h Fri Jun 25 16:00:21 2010 +0200 @@ -0,0 +1,407 @@ +/* + * SpanDSP - a series of DSP components for telephony + * + * adsi.h - Analogue display services interface and other call ID related handling. + * + * Written by Steve Underwood <steveu@coppice.org> + * + * Copyright (C) 2003 Steve Underwood + * + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2, as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + * $Id: adsi.h,v 1.15 2006/10/24 13:22:01 steveu Exp $ + */ + +/*! \file */ + +#if !defined(_ADSI_H_) +#define _ADSI_H_ + +/*! \page adsi_page ADSI transmission and reception +\section adsi_page_sec_1 What does it do? +Although ADSI has a specific meaning in some places, the term is used here to indicate +any form of Analogue Display Service Interface, which includes caller ID, SMS, and others. + +The ADSI module provides for the transmission and reception of ADSI messages +in various formats. Currently, the supported formats are: + - CLASS (Custom Local Area Signaling Services) standard, published by Bellcore: + + - ACLIP (Analog Calling Line Identity Presentation) standard, published by the + Telecommunications Authority of Singapore: + + - CLIP (Calling Line Identity Presentation) standard, published by ETSI. + + - JCLIP (Japanese Calling Line Identity Presentation) standard, published by NTT. + + - TDD (Telecommunications Device for the Deaf). + +\section adsi_page_sec_2 How does it work? + +\section adsi_page_sec_2a The Bellcore CLASS specification +Most FSK based CLI formats are similar to the US CLASS one, which is as follows: + +The alert tone for CLI during a call is at least 100ms of silence, then +2130Hz + 2750Hz for 88ms to 110ms. When CLI is presented at ringing time, +this tone is not sent. In the US, CLI is usually sent between the first +two rings. This silence period is long in the US, so the message fits easily. +In other places, where the standard ring tone has much smaller silences, +a line voltage reversal is used to wake up a power saving receiver, then the +message is sent, then the phone begins to ring. + +The message is sent using a Bell 202 FSK modem. The data rate is 1200 bits +per second. The message protocol uses 8-bit data words (bytes), each bounded +by a start bit and a stop bit. + +Channel Carrier Message Message Data Checksum +Seizure Signal Type Length Word(s) Word +Signal Word Word + +\section adsi_page_sec_2a1 CHANNEL SEIZURE SIGNAL +The channel seizure is 30 continuous bytes of 55h (01010101), including +the start and stop bits (i.e. 300 bits of alternations in total). +This provides a detectable alternating function to the CPE (i.e. the +modem data pump). + +\section adsi_page_sec_2a2 CARRIER SIGNAL +The carrier signal consists of 180 bits of 1s. This may be reduced to 80 +bits of 1s for caller ID on call waiting. + +\section adsi_page_sec_2a3 MESSAGE TYPE WORD +Various message types are defined. The common ones for the US CLASS +standard are: + - Type 0x04 (SDMF) - single data message. Simple caller ID (CND) + - Type 0x80 (MDMF) - multiple data message. A more flexible caller ID, + with extra information. + +\section adsi_page_sec_2a4 MESSAGE LENGTH WORD +The message length word specifies the total number of data words +to follow. + +\section adsi_page_sec_2a5 DATA WORDS +The data words contain the actual message. + +\section adsi_page_sec_2a6 CHECKSUM WORD +The Checksum Word contains the twos complement of the modulo 256 +sum of the other words in the data message (i.e., message type, +message length, and data words). The receiving equipment may +calculate the modulo 256 sum of the received words and add this +sum to the received checksum word. A result of zero generally +indicates that the message was correctly received. Message +retransmission is not supported. The sumcheck word should be followed +by a minimum of two stop bits. + +\section adsi_page_sec_2b The ETSI CLIP specification +The ETSI CLIP specification uses similar messages to the Bellcore specification. +They are not, however, identical. First, ETSI use the V.23 modem standard, rather +than Bell 202. Second, different fields, and different message types are available. + +\section adsi_page_sec_2e The ETSI caller ID by DTMF specification +CLI by DTMF is usually sent in a very simple way. The exchange does not give +any prior warning (no reversal, or ring) to wake up the receiver. It just +sends one of the following DTMF strings: + + - A<phone number># + - D1# Number not available because the caller has restricted it. + - D2# Number not available because the call is international. + - D3# Number not available due to technical reasons. +*/ + +enum +{ + ADSI_STANDARD_NONE = 0, + ADSI_STANDARD_CLASS = 1, + ADSI_STANDARD_CLIP = 2, + ADSI_STANDARD_ACLIP = 3, + ADSI_STANDARD_JCLIP = 4, + ADSI_STANDARD_CLIP_DTMF = 5, + ADSI_STANDARD_TDD = 6 +}; + +/* In some of the messages code characters are used, as follows: + 'C' for public callbox + 'L' for long distance + 'O' for overseas + 'P' for private + 'S' for service conflict */ + +/*! Definitions for generic caller ID message type IDs */ +/*! Complete caller ID message */ +#define CLIDINFO_CMPLT 0x100 +/*! Date, time, phone #, name */ +#define CLIDINFO_GENERAL 0x101 +/*! Caller ID */ +#define CLIDINFO_CALLID 0x102 +/*! See frame type equates */ +#define CLIDINFO_FRAMETYPE 0x103 + +/*! Definitions for CLASS (Custom Local Area Signaling Services) */ +/*! Single data message caller ID */ +#define CLASS_SDMF_CALLERID 0x04 +/*! Multiple data message caller ID */ +#define CLASS_MDMF_CALLERID 0x80 +/*! Single data message message waiting */ +#define CLASS_SDMF_MSG_WAITING 0x06 +/*! Multiple data message message waiting */ +#define CLASS_MDMF_MSG_WAITING 0x82 + +/*! CLASS MDMF message IDs */ +/*! Date and time (MMDDHHMM) */ +#define MCLASS_DATETIME 0x01 +/*! Caller number */ +#define MCLASS_CALLER_NUMBER 0x02 +/*! Dialed number */ +#define MCLASS_DIALED_NUMBER 0x03 +/*! Caller number absent: 'O' or 'P' */ +#define MCLASS_ABSENCE1 0x04 +/*! Call forward: universal ('0'), on busy ('1'), or on unanswered ('2') */ +#define MCLASS_REDIRECT 0x05 +/*! Long distance: 'L' */ +#define MCLASS_QUALIFIER 0x06 +/*! Caller's name */ +#define MCLASS_CALLER_NAME 0x07 +/*! Caller's name absent: 'O' or 'P' */ +#define MCLASS_ABSENCE2 0x08 + +/*! CLASS MDMF message waiting message IDs */ +/*! Message waiting/not waiting */ +#define MCLASS_VISUAL_INDICATOR 0x0B + +/*! Definitions for CLIP (Calling Line Identity Presentation) */ +/*! Multiple data message caller ID */ +#define CLIP_MDMF_CALLERID 0x80 +/*! Multiple data message message waiting */ +#define CLIP_MDMF_MSG_WAITING 0x82 +/*! Multiple data message charge information */ +#define CLIP_MDMF_CHARGE_INFO 0x86 +/*! Multiple data message SMS */ +#define CLIP_MDMF_SMS 0x89 + +/*! CLIP message IDs */ +/*! Date and time (MMDDHHMM) */ +#define CLIP_DATETIME 0x01 +/*! Caller number */ +#define CLIP_CALLER_NUMBER 0x02 +/*! Dialed number */ +#define CLIP_DIALED_NUMBER 0x03 +/*! Caller number absent: 'O' or 'P' */ +#define CLIP_ABSENCE1 0x04 +/*! Caller's name */ +#define CLIP_CALLER_NAME 0x07 +/*! Caller's name absent: 'O' or 'P' */ +#define CLIP_ABSENCE2 0x08 +/*! Visual indicator */ +#define CLIP_VISUAL_INDICATOR 0x0B +/*! Message ID */ +#define CLIP_MESSAGE_ID 0x0D +/*! Voice call, ring-back-when-free call, or msg waiting call */ +#define CLIP_CALLTYPE 0x11 +/*! Number of messages */ +#define CLIP_NUM_MSG 0x13 +/*! Redirecting number */ +#define CLIP_REDIR_NUMBER 0x03 +/*! Charge */ +#define CLIP_CHARGE 0x20 +/*! Duration of the call */ +#define CLIP_DURATION 0x23 +/*! Additional charge */ +#define CLIP_ADD_CHARGE 0x21 +/*! Display information */ +#define CLIP_DISPLAY_INFO 0x50 +/*! Service information */ +#define CLIP_SERVICE_INFO 0x55 + +/*! Definitions for A-CLIP (Analog Calling Line Identity Presentation) */ +/*! Single data message caller ID frame */ +#define ACLIP_SDMF_CALLERID 0x04 +/*! Multiple data message caller ID frame */ +#define ACLIP_MDMF_CALLERID 0x80 + +/*! A-CLIP MDM message IDs */ +/*! Date and time (MMDDHHMM) */ +#define ACLIP_DATETIME 0x01 +/*! Caller number */ +#define ACLIP_CALLER_NUMBER 0x02 +/*! Dialed number */ +#define ACLIP_DIALED_NUMBER 0x03 +/*! Caller number absent: 'O' or 'P' */ +#define ACLIP_ABSENCE1 0x04 +/*! Call forward: universal, on busy, or on unanswered */ +#define ACLIP_REDIRECT 0x05 +/*! Long distance call: 'L' */ +#define ACLIP_QUALIFIER 0x06 +/*! Caller's name */ +#define ACLIP_CALLER_NAME 0x07 +/*! Caller's name absent: 'O' or 'P' */ +#define ACLIP_ABSENCE2 0x08 + +/*! Definitions for J-CLIP (Japan Calling Line Identity Presentation) */ +/*! Multiple data message caller ID frame */ +#define JCLIP_MDMF_CALLERID 0x40 + +/*! J-CLIP MDM message IDs */ +/*! Caller number */ +#define JCLIP_CALLER_NUMBER 0x02 +/*! Caller number data extension signal */ +#define JCLIP_CALLER_NUM_DES 0x21 +/*! Dialed number */ +#define JCLIP_DIALED_NUMBER 0x09 +/*! Dialed number data extension signal */ +#define JCLIP_DIALED_NUM_DES 0x22 +/*! Caller number absent: 'C', 'O', 'P' or 'S' */ +#define JCLIP_ABSENCE 0x04 + +/*! Definitions for CLIP-DTMF */ +/*! Caller number */ +#define CLIP_DTMF_CALLER_NUMBER 'A' +/*! Caller number absent: private (1), overseas (2) or not available (3) */ +#define CLIP_DTMF_ABSENCE1 'D' + +/*! + ADSI transmitter descriptor. This contains all the state information for an ADSI + (caller ID, CLASS, CLIP, ACLIP) transmit channel. + */ +typedef struct +{ + int standard; + + tone_gen_descriptor_t alert_tone_desc; + tone_gen_state_t alert_tone_gen; + fsk_tx_state_t fsktx; + dtmf_tx_state_t dtmftx; + async_tx_state_t asynctx; + + int tx_signal_on; + + int byteno; + int bitpos; + int bitno; + uint8_t msg[256]; + int msg_len; + int ones_len; + int baudot_shift; + + logging_state_t logging; +} adsi_tx_state_t; + +/*! + ADSI receiver descriptor. This contains all the state information for an ADSI + (caller ID, CLASS, CLIP, ACLIP) receive channel. + */ +typedef struct +{ + put_msg_func_t put_msg; + void *user_data; + int standard; + + fsk_rx_state_t fskrx; + dtmf_rx_state_t dtmfrx; + async_rx_state_t asyncrx; + + int consecutive_ones; + int bitpos; + int in_progress; + uint8_t msg[256]; + int msg_len; + int baudot_shift; + + /*! A count of the framing errors. */ + int framing_errors; + + logging_state_t logging; +} adsi_rx_state_t; + +#ifdef __cplusplus +extern "C" { +#endif + +/*! \brief Initialise an ADSI receive context. + \param s The ADSI receive context. + \param standard The code for the ADSI standard to be used. + \param put_msg A callback routine called to deliver the received messages + to the application. + \param user_data An opaque pointer for the callback routine. +*/ +void adsi_rx_init(adsi_rx_state_t *s, int standard, put_msg_func_t put_msg, void *user_data); + +/*! \brief Receive a chunk of ADSI audio. + \param s The ADSI receive context. + \param amp The audio sample buffer. + \param len The number of samples in the buffer. +*/ +void adsi_rx(adsi_rx_state_t *s, const int16_t *amp, int len); + +/*! \brief Initialise an ADSI transmit context. + \param s The ADSI transmit context. + \param standard The code for the ADSI standard to be used. +*/ +void adsi_tx_init(adsi_tx_state_t *s, int standard); + +/*! \brief Generate a block of ADSI audio samples. + \param s The ADSI transmit context. + \param amp The audio sample buffer. + \param max_len The number of samples to be generated. + \return The number of samples actually generated. +*/ +int adsi_tx(adsi_tx_state_t *s, int16_t *amp, int max_len); + +/*! \brief Request generation of an ADSI alert tone. + \param s The ADSI transmit context. +*/ +void adsi_send_alert_tone(adsi_tx_state_t *s); + +/*! \brief Put a message into the input buffer of an ADSI transmit context. + \param s The ADSI transmit context. + \param msg The message. + \param len The length of the message. + \return The length actually added. If a message is already in progress + in the transmitter, this function will return zero, as it will + not successfully add the message to the buffer. +*/ +int adsi_put_message(adsi_tx_state_t *s, uint8_t *msg, int len); + +/*! \brief Get a field from an ADSI message. + \param s The ADSI receive context. + \param msg The message buffer. + \param msg_len The length of the message. + \param pos Current position within the message. Set to -1 when starting a message. + \param field_type The type code for the field. + \param field_body Pointer to the body of the field. + \param field_len The length of the field, or -1 for no more fields, or -2 for message structure corrupt. +*/ +int adsi_next_field(adsi_rx_state_t *s, const uint8_t *msg, int msg_len, int pos, uint8_t *field_type, uint8_t const **field_body, int *field_len); + +/*! \brief Insert the header or a field into an ADSI message. + \param s The ADSI transmit context. + \param msg The message buffer. + \param len The current length of the message. + \param field_type The type code for the new field. + \param field_body Pointer to the body of the new field. + \param field_len The length of the new field. +*/ +int adsi_add_field(adsi_tx_state_t *s, uint8_t *msg, int len, uint8_t field_type, uint8_t const *field_body, int field_len); + +/*! \brief Return a short name for an ADSI standard + \param standard The code for the standard. + \return A pointer to the name. +*/ +const char *adsi_standard_to_str(int standard); + +#ifdef __cplusplus +} +#endif + +#endif +/*- End of file ------------------------------------------------------------*/