async.h

Go to the documentation of this file.
00001 /*
00002  * SpanDSP - a series of DSP components for telephony
00003  *
00004  * async.h - Asynchronous serial bit stream encoding and decoding
00005  *
00006  * Written by Steve Underwood <steveu@coppice.org>
00007  *
00008  * Copyright (C) 2003 Steve Underwood
00009  *
00010  * All rights reserved.
00011  *
00012  * This program is free software; you can redistribute it and/or modify
00013  * it under the terms of the GNU General Public License version 2, as
00014  * published by the Free Software Foundation.
00015  *
00016  * This program is distributed in the hope that it will be useful,
00017  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00018  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00019  * GNU General Public License for more details.
00020  *
00021  * You should have received a copy of the GNU General Public License
00022  * along with this program; if not, write to the Free Software
00023  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
00024  *
00025  * $Id: async.h,v 1.9 2007/04/08 08:16:17 steveu Exp $
00026  */
00027 
00028 /*! \file */
00029 
00030 /*! \page async_page Asynchronous bit stream processing
00031 \section async_page_sec_1 What does it do?
00032 The asynchronous serial bit stream processing module provides
00033 generation and decoding facilities for most asynchronous data
00034 formats. It supports:
00035  - 1 or 2 stop bits.
00036  - Odd, even or no parity.
00037  - 5, 6, 7, or 8 bit characters.
00038  - V.14 rate adaption.
00039 The input to this module is a bit stream. This means any symbol synchronisation
00040 and decoding must occur before data is fed to this module.
00041 
00042 \section async_page_sec_2 The transmitter
00043 ???.
00044 
00045 \section async_page_sec_3 The receiver
00046 ???.
00047 */
00048 
00049 #if !defined(_SPANDSP_ASYNC_H_)
00050 #define _SPANDSP_ASYNC_H_
00051 
00052 /* Special "bit" values for the put and get bit functions */
00053 enum
00054 {
00055     /*! \brief The carrier signal has dropped. */
00056     PUTBIT_CARRIER_DOWN = -1,
00057     /*! \brief The carrier signal is up. This merely indicates that carrier
00058          energy has been seen. It is not an indication that the carrier is either
00059          valid, or of the expected type. */
00060     PUTBIT_CARRIER_UP = -2,
00061     /*! \brief The modem is training. This is an early indication that the
00062         signal seems to be of the right type. This may be needed in time critical
00063         applications, like T.38, to forward an early indication of what is happening
00064         on the wire. */
00065     PUTBIT_TRAINING_IN_PROGRESS = -3,
00066     /*! \brief The modem has trained, and is ready for data exchange. */
00067     PUTBIT_TRAINING_SUCCEEDED = -4,
00068     /*! \brief The modem has failed to train. */
00069     PUTBIT_TRAINING_FAILED = -5,
00070     /*! \brief Packet framing (e.g. HDLC framing) is OK. */
00071     PUTBIT_FRAMING_OK = -6,
00072     /*! \brief The data stream has ended. */
00073     PUTBIT_END_OF_DATA = -7,
00074     /*! \brief An abort signal (e.g. an HDLC abort) has been received. */
00075     PUTBIT_ABORT = -8,
00076     /*! \brief A break signal (e.g. an async break) has been received. */
00077     PUTBIT_BREAK = -9
00078 };
00079 
00080 /*! Message put function for data pumps */
00081 typedef void (*put_msg_func_t)(void *user_data, const uint8_t *msg, int len);
00082 
00083 /*! Message get function for data pumps */
00084 typedef int (*get_msg_func_t)(void *user_data, uint8_t *msg, int max_len);
00085 
00086 /*! Byte put function for data pumps */
00087 typedef void (*put_byte_func_t)(void *user_data, int byte);
00088 
00089 /*! Byte get function for data pumps */
00090 typedef int (*get_byte_func_t)(void *user_data);
00091 
00092 /*! Bit put function for data pumps */
00093 typedef void (*put_bit_func_t)(void *user_data, int bit);
00094 
00095 /*! Bit get function for data pumps */
00096 typedef int (*get_bit_func_t)(void *user_data);
00097 
00098 /*! No parity bit should be used */
00099 #define ASYNC_PARITY_NONE   0
00100 /*! An even parity bit will exist, after the data bits */
00101 #define ASYNC_PARITY_EVEN   1
00102 /*! An odd parity bit will exist, after the data bits */
00103 #define ASYNC_PARITY_ODD    2
00104 
00105 /*!
00106     Asynchronous data transmit descriptor. This defines the state of a single
00107     working instance of a byte to asynchronous serial converter, for use
00108     in FSK modems.
00109 */
00110 typedef struct
00111 {
00112     /*! \brief The number of data bits per character. */
00113     int data_bits;
00114     /*! \brief The type of parity. */
00115     int parity;
00116     /*! \brief The number of stop bits per character. */
00117     int stop_bits;
00118     /*! \brief A pointer to the callback routine used to get characters to be transmitted. */
00119     get_byte_func_t get_byte;
00120     /*! \brief An opaque pointer passed when calling get_byte. */
00121     void *user_data;
00122 
00123     /*! \brief A current, partially transmitted, character. */
00124     int byte_in_progress;
00125     /*! \brief The current bit position within a partially transmitted character. */
00126     int bitpos;
00127     int parity_bit;
00128 } async_tx_state_t;
00129 
00130 /*!
00131     Asynchronous data receive descriptor. This defines the state of a single
00132     working instance of an asynchronous serial to byte converter, for use
00133     in FSK modems.
00134 */
00135 typedef struct
00136 {
00137     /*! \brief The number of data bits per character. */
00138     int data_bits;
00139     /*! \brief The type of parity. */
00140     int parity;
00141     /*! \brief The number of stop bits per character. */
00142     int stop_bits;
00143     /*! \brief TRUE if V.14 rate adaption processing should be performed. */
00144     int use_v14;
00145     /*! \brief A pointer to the callback routine used to handle received characters. */
00146     put_byte_func_t put_byte;
00147     /*! \brief An opaque pointer passed when calling put_byte. */
00148     void *user_data;
00149 
00150     /*! \brief A current, partially complete, character. */
00151     int byte_in_progress;
00152     /*! \brief The current bit position within a partially complete character. */
00153     int bitpos;
00154     int parity_bit;
00155 
00156     int parity_errors;
00157     int framing_errors;
00158 } async_rx_state_t;
00159 
00160 #if defined(__cplusplus)
00161 extern "C"
00162 {
00163 #endif
00164 
00165 /*! Initialise an asynchronous data transmit context.
00166     \brief Initialise an asynchronous data transmit context.
00167     \param s The transmitter context.
00168     \param data_bits The number of data bit.
00169     \param parity_bits The type of parity.
00170     \param stop_bits The number of stop bits.
00171     \param use_v14 TRUE if V.14 rate adaption processing should be used.
00172     \param get_byte The callback routine used to get the data to be transmitted.
00173     \param user_data An opaque pointer. */
00174 void async_tx_init(async_tx_state_t *s,
00175                    int data_bits,
00176                    int parity_bits,
00177                    int stop_bits,
00178                    int use_v14,
00179                    get_byte_func_t get_byte,
00180                    void *user_data);
00181 
00182 /*! Get the next bit of a transmitted serial bit stream.
00183     \brief Get the next bit of a transmitted serial bit stream.
00184     \param user_data An opaque point which must point to a transmitter context.
00185     \return the next bit, or PUTBIT_END_OF_DATA to indicate the data stream has ended. */
00186 int async_tx_get_bit(void *user_data);
00187 
00188 /*! Initialise an asynchronous data receiver context.
00189     \brief Initialise an asynchronous data receiver context.
00190     \param s The receiver context.
00191     \param data_bits The number of data bits.
00192     \param parity_bits The type of parity.
00193     \param stop_bits The number of stop bits.
00194     \param use_v14 TRUE if V.14 rate adaption processing should be used.
00195     \param put_byte The callback routine used to put the received data.
00196     \param user_data An opaque pointer. */
00197 void async_rx_init(async_rx_state_t *s,
00198                    int data_bits,
00199                    int parity_bits,
00200                    int stop_bits,
00201                    int use_v14,
00202                    put_byte_func_t put_byte,
00203                    void *user_data);
00204 
00205 /*! Accept a bit from a received serial bit stream
00206     \brief Accept a bit from a received serial bit stream
00207     \param user_data An opaque point which must point to a receiver context.
00208     \param bit The new bit. Some special values are supported for this field.
00209         - PUTBIT_CARRIER_UP
00210         - PUTBIT_CARRIER_DOWN
00211         - PUTBIT_TRAINING_SUCCEEDED
00212         - PUTBIT_TRAINING_FAILED
00213         - PUTBIT_END_OF_DATA */
00214 void async_rx_put_bit(void *user_data, int bit);
00215 
00216 #if defined(__cplusplus)
00217 }
00218 #endif
00219 
00220 #endif
00221 /*- End of file ------------------------------------------------------------*/

Generated on Tue Jul 24 11:29:28 2007 for libspandsp by  doxygen 1.5.2