diff spandsp-0.0.6pre17/src/spandsp/adsi.h @ 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
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/spandsp-0.0.6pre17/src/spandsp/adsi.h	Fri Jun 25 15:50:58 2010 +0200
@@ -0,0 +1,516 @@
+/*
+ * 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 Lesser General Public License version 2.1,
+ * 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser 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.40 2009/05/22 16:39:01 steveu Exp $
+ */
+
+/*! \file */
+
+#if !defined(_SPANDSP_ADSI_H_)
+#define _SPANDSP_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:
+
+    - Bellcore/Telcordia GR-30 CORE CLASS (Custom Local Area Signaling Services) standard
+      (North America, Australia, China, Taiwan, and Hong Kong).
+
+    - ETSI ETS 300 648, ETS 300 659-1 CLIP (Calling Line Identity Presentation) FSK standard
+      (France, Germany, Norway, Italy, Spain, South Africa, Turkey, and the UK).
+
+    - ETSI Caller-ID support for the UK, British Telecom SIN227 and SIN242.
+
+    - ETSI ETS 300 648, ETS 300 659-1 CLIP (Calling Line Identity Presentation) DTMF standard
+      variant 1 (Belgium, Brazil, Denmark, Finland, Iceland, India, Netherlands, Saudi Arabia,
+      Sweden and Uruguay).
+    
+    - ETSI ETS 300 648, ETS 300 659-1 CLIP (Calling Line Identity Presentation) DTMF standard
+      variant 2 (Denmark and Holland).
+    
+    - ETSI ETS 300 648, ETS 300 659-1 CLIP (Calling Line Identity Presentation) DTMF standard
+      variant 3.
+    
+    - ETSI ETS 300 648, ETS 300 659-1 CLIP (Calling Line Identity Presentation) DTMF standard
+      variant 4. (Taiwan and Kuwait).
+    
+    - ETSI Caller-ID support in UK (British Telecom), British Telecomm SIN227, SIN242.
+
+    - Nippon Telegraph & Telephone Corporation JCLIP (Japanese Calling Line Identity
+      Presentation) standard.
+
+    - Telecommunications Authority of Singapore ACLIP (Analog Calling Line Identity
+      Presentation) standard.
+
+    - 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 commonest 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.
+
+Other messages support message waiting, for voice mail, and other display features. 
+
+\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.
+
+The wake up indication generally differs from the Bellcore specification, to
+accomodate differences in European ring cadences.
+
+\section adsi_page_sec_2c 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 a string of DTMF digits. Around the world several variants of this
+basic scheme are used.
+
+One variant of the digit string is used in Belgium, Brazil, Denmark, Finland, Iceland,
+India, Netherlands, Saudi Arabia, Sweden and Uruguay:
+
+    - A<caller's phone number>D<redirected number>B<special information>C
+
+Each of these fields may be omitted. The following special information codes are defined
+
+    - "00" indicates the calling party number is not available.
+    - "10" indicates that the presentation of the calling party number is restricted.
+
+A second variant of the digit string is one of the following:
+
+    - A<caller's 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.
+
+A third variant of the digit string is used in Taiwan and Kuwait:
+
+    - D<caller's phone number>C
+
+A forth variant of the digit string is used in Denmark and Holland:
+
+    - <caller's phone number>#
+
+There is no distinctive start marker in this format.
+
+\section adsi_page_sec_2d The Japanese specification from NTT
+
+The Japanese caller ID specification is considerably different from any of the others. It
+uses V.23 modem signals, but the message structure is uniqeue. Also, the message is delivered
+while off hook. This results in a sequence
+
+    - The phone line rings
+    - CPE answers and waits for the caller ID message
+    - CPE hangs up on receipt of the caller ID message
+    - The phone line rings a second time
+    - The CPE answers a second time, connecting the called party with the caller.
+    
+Timeouts are, obviously, required to ensure this system behaves well when the caller ID message
+or the second ring are missing.
+*/
+
+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
+
+    Taiwan and Kuwait change this pattern to:
+        'C' for coin/public callbox
+        'I' for international call
+        'O' for out of area call
+        'P' for private
+ */
+
+/*! Definitions for CLASS (Custom Local Area Signaling Services) */
+enum
+{
+    /*! Single data message caller ID */
+    CLASS_SDMF_CALLERID =               0x04,
+    /*! Multiple data message caller ID */
+    CLASS_MDMF_CALLERID =               0x80,
+    /*! Single data message message waiting */
+    CLASS_SDMF_MSG_WAITING =            0x06,
+    /*! Multiple data message message waiting */
+    CLASS_MDMF_MSG_WAITING =            0x82
+};
+
+/*! CLASS MDMF message IDs */
+enum
+{
+    /*! Date and time (MMDDHHMM) */
+    MCLASS_DATETIME =                   0x01,
+    /*! Caller number */
+    MCLASS_CALLER_NUMBER =              0x02,
+    /*! Dialed number */
+    MCLASS_DIALED_NUMBER =              0x03,
+    /*! Caller number absent: 'O' or 'P' */
+    MCLASS_ABSENCE1 =                   0x04,
+    /*! Call forward: universal ('0'), on busy ('1'), or on unanswered ('2') */
+    MCLASS_REDIRECT =                   0x05,
+    /*! Long distance: 'L' */
+    MCLASS_QUALIFIER =                  0x06,
+    /*! Caller's name */
+    MCLASS_CALLER_NAME =                0x07,
+    /*! Caller's name absent: 'O' or 'P' */
+    MCLASS_ABSENCE2 =                   0x08,
+    /*! Alternate route */
+    MCLASS_ALT_ROUTE =                  0x09
+};
+
+/*! CLASS MDMF message waiting message IDs */
+/*! Message waiting/not waiting */
+#define MCLASS_VISUAL_INDICATOR         0x0B
+
+/*! Definitions for CLIP (Calling Line Identity Presentation) (from ETS 300 659-1) */
+enum
+{
+    /*! Multiple data message caller ID */
+    CLIP_MDMF_CALLERID =                0x80,
+    /*! Multiple data message message waiting */
+    CLIP_MDMF_MSG_WAITING =             0x82,
+    /*! Multiple data message charge information */
+    CLIP_MDMF_CHARGE_INFO =             0x86,
+    /*! Multiple data message SMS */
+    CLIP_MDMF_SMS =                     0x89
+};
+
+/*! CLIP message IDs (from ETS 300 659-1) */
+enum
+{
+    /*! Date and time (MMDDHHMM) */
+    CLIP_DATETIME =                     0x01,
+    /*! Caller number (AKA calling line identity) */
+    CLIP_CALLER_NUMBER =                0x02,
+    /*! Dialed number (AKA called line identity) */
+    CLIP_DIALED_NUMBER =                0x03,
+    /*! Caller number absent: 'O' or 'P' (AKA reason for absence of calling line identity) */
+    CLIP_ABSENCE1 =                     0x04,
+    /*! Caller's name (AKA calling party name) */
+    CLIP_CALLER_NAME =                  0x07,
+    /*! Caller's name absent: 'O' or 'P' (AKA reason for absence of calling party name) */
+    CLIP_ABSENCE2 =                     0x08,
+    /*! Visual indicator */
+    CLIP_VISUAL_INDICATOR =             0x0B,
+    /*! Message ID */
+    CLIP_MESSAGE_ID =                   0x0D,
+    /*! Complementary calling line identity */
+    CLIP_COMPLEMENTARY_CALLER_NUMBER =  0x10,
+    /*! Call type - voice call (1), ring-back-when-free call (2), calling name delivery (3) or msg waiting call(0x81) */
+    CLIP_CALLTYPE =                     0x11,
+    /*! Number of messages */
+    CLIP_NUM_MSG =                      0x13,
+    /*! Type of forwarded call */
+    CLIP_TYPE_OF_FORWARDED_CALL =       0x15,
+    /*! Type of calling user */
+    CLIP_TYPE_OF_CALLING_USER =         0x16,
+    /*! Redirecting number */
+    CLIP_REDIR_NUMBER =                 0x1A,
+    /*! Charge */
+    CLIP_CHARGE =                       0x20,
+    /*! Duration of the call */
+    CLIP_DURATION =                     0x23,
+    /*! Additional charge */
+    CLIP_ADD_CHARGE =                   0x21,
+    /*! Display information */
+    CLIP_DISPLAY_INFO =                 0x50,
+    /*! Service information */
+    CLIP_SERVICE_INFO =                 0x55
+};
+
+/*! Definitions for A-CLIP (Analog Calling Line Identity Presentation) */
+enum
+{
+    /*! Single data message caller ID frame */
+    ACLIP_SDMF_CALLERID =               0x04,
+    /*! Multiple data message caller ID frame */
+    ACLIP_MDMF_CALLERID =               0x80
+};
+
+/*! A-CLIP MDM message IDs */
+enum
+{
+    /*! Date and time (MMDDHHMM) */
+    ACLIP_DATETIME =                    0x01,
+    /*! Caller number */
+    ACLIP_CALLER_NUMBER =               0x02,
+    /*! Dialed number */
+    ACLIP_DIALED_NUMBER =               0x03,
+    /*! Caller number absent: 'O' or 'P' */
+    ACLIP_NUMBER_ABSENCE =              0x04,
+    /*! Call forward: universal, on busy, or on unanswered */
+    ACLIP_REDIRECT =                    0x05,
+    /*! Long distance call: 'L' */
+    ACLIP_QUALIFIER =                   0x06,
+    /*! Caller's name */
+    ACLIP_CALLER_NAME =                 0x07,
+    /*! Caller's name absent: 'O' or 'P' */
+    ACLIP_NAME_ABSENCE =                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 */
+enum
+{
+    /*! Caller number */
+    JCLIP_CALLER_NUMBER =               0x02,
+    /*! Caller number data extension signal */
+    JCLIP_CALLER_NUM_DES =              0x21,
+    /*! Dialed number */
+    JCLIP_DIALED_NUMBER =               0x09,
+    /*! Dialed number data extension signal */
+    JCLIP_DIALED_NUM_DES =              0x22,
+    /*! Caller number absent: 'C', 'O', 'P' or 'S' */
+    JCLIP_ABSENCE =                     0x04
+};
+
+/* Definitions for CLIP-DTMF and its variants */
+
+/*! Caller number is '#' terminated DTMF. */
+#define CLIP_DTMF_HASH_TERMINATED       '#'
+/*! Caller number is 'C' terminated DTMF. */
+#define CLIP_DTMF_C_TERMINATED          'C'
+
+/*! Caller number */
+#define CLIP_DTMF_HASH_CALLER_NUMBER    'A'
+/*! Caller number absent: private (1), overseas (2) or not available (3) */
+#define CLIP_DTMF_HASH_ABSENCE          'D'
+/*! Caller ID field with no explicit field type */
+#define CLIP_DTMF_HASH_UNSPECIFIED      0
+
+/*! Caller number */
+#define CLIP_DTMF_C_CALLER_NUMBER       'A'
+/*! Diverting number */
+#define CLIP_DTMF_C_REDIRECT_NUMBER     'D'
+/*! Caller number absent: private/restricted (00) or not available (10) */
+#define CLIP_DTMF_C_ABSENCE             'B'
+
+/*!
+    ADSI transmitter descriptor. This contains all the state information for an ADSI
+    (caller ID, CLASS, CLIP, ACLIP) transmit channel.
+ */
+typedef struct adsi_tx_state_s adsi_tx_state_t;
+
+/*!
+    ADSI receiver descriptor. This contains all the state information for an ADSI
+    (caller ID, CLASS, CLIP, ACLIP, JCLIP) receive channel.
+ */
+typedef struct adsi_rx_state_s adsi_rx_state_t;
+
+#if defined(__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.
+    \return A pointer to the initialised context, or NULL if there was a problem.
+*/
+SPAN_DECLARE(adsi_rx_state_t *) adsi_rx_init(adsi_rx_state_t *s,
+                                             int standard,
+                                             put_msg_func_t put_msg,
+                                             void *user_data);
+
+/*! \brief Release an ADSI receive context.
+    \param s The ADSI receive context.
+    \return 0 for OK.
+*/
+SPAN_DECLARE(int) adsi_rx_release(adsi_rx_state_t *s);
+
+/*! \brief Free the resources of an ADSI receive context.
+    \param s The ADSI receive context.
+    \return 0 for OK.
+*/
+SPAN_DECLARE(int) adsi_rx_free(adsi_rx_state_t *s);
+
+/*! \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.
+    \return The number of samples unprocessed.
+*/
+SPAN_DECLARE(int) 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.
+    \return A pointer to the initialised context, or NULL if there was a problem.
+*/
+SPAN_DECLARE(adsi_tx_state_t *) adsi_tx_init(adsi_tx_state_t *s, int standard);
+
+/*! \brief Release an ADSI transmit context.
+    \param s The ADSI transmit context.
+    \return 0 for OK.
+*/
+SPAN_DECLARE(int) adsi_tx_release(adsi_tx_state_t *s);
+
+/*! \brief Free the resources of an ADSI transmit context.
+    \param s The ADSI transmit context.
+    \return 0 for OK.
+*/
+SPAN_DECLARE(int) adsi_tx_free(adsi_tx_state_t *s);
+
+/*! \brief Adjust the preamble associated with an ADSI transmit context.
+    \param s The ADSI transmit context.
+    \param preamble_len The number of bits of preamble.
+    \param preamble_ones_len The number of bits of continuous one before a message.
+    \param postamble_ones_len The number of bits of continuous one after a message.
+    \param stop_bits The number of stop bits per character.
+*/
+SPAN_DECLARE(void) adsi_tx_set_preamble(adsi_tx_state_t *s,
+                                        int preamble_len,
+                                        int preamble_ones_len,
+                                        int postamble_ones_len,
+                                        int stop_bits);
+
+/*! \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.
+*/
+SPAN_DECLARE(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.
+*/
+SPAN_DECLARE(void) adsi_tx_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. If the message is
+            invalid (e.g. it is too long), this function will return -1.
+*/
+SPAN_DECLARE(int) adsi_tx_put_message(adsi_tx_state_t *s, const 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.
+*/
+SPAN_DECLARE(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.
+*/
+SPAN_DECLARE(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.
+*/
+SPAN_DECLARE(const char *) adsi_standard_to_str(int standard);
+
+#if defined(__cplusplus)
+}
+#endif
+
+#endif
+/*- End of file ------------------------------------------------------------*/

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