Version 0.2.0 from FTP
[asterisk/asterisk.git] / include / asterisk / vmodem.h
1 /*
2  * Asterisk -- A telephony toolkit for Linux.
3  *
4  * Voice Modem Definitions
5  * 
6  * Copyright (C) 1999, Mark Spencer
7  *
8  * Mark Spencer <markster@linux-support.net>
9  *
10  * This program is free software, distributed under the terms of
11  * the GNU General Public License
12  */
13
14 #ifndef _ASTERISK_VMODEM_H
15 #define _ASTERISK_VMODEM_H
16
17 #include <asterisk/frame.h>
18 #include <asterisk/channel.h>
19 #include <asterisk/channel_pvt.h>
20
21 #define CHAR_DLE                0x10
22 #define CHAR_ETX                0x03
23 #define CHAR_DC4                0x14
24
25 #define MODEM_DEV_TELCO         0
26 #define MODEM_DEV_TELCO_SPK     4
27 #define MODEM_DEV_SPKRPHONE     6
28 #define MODEM_DEV_HANDSET       9
29
30 /* Thirty millisecond sections */
31 #define MODEM_MAX_LEN 30
32 #define MODEM_MAX_BUF MODEM_MAX_LEN * 16
33
34 #define AST_MAX_INIT_STR        256
35
36 struct ast_modem_pvt;
37
38 struct ast_modem_driver {
39         char *name;
40         char **idents;
41         int formats;
42         int fullduplex;
43         void (*incusecnt)();
44         void (*decusecnt)();
45         char * (*identify)(struct ast_modem_pvt *);
46         int (*init)(struct ast_modem_pvt *);
47         int (*setdev)(struct ast_modem_pvt *, int dev);
48         struct ast_frame * (*read)(struct ast_modem_pvt *);
49         int (*write)(struct ast_modem_pvt *, struct ast_frame *fr);
50         int (*dial)(struct ast_modem_pvt *, char *);
51         int (*answer)(struct ast_modem_pvt *);
52         int (*hangup)(struct ast_modem_pvt *);
53         int (*startrec)(struct ast_modem_pvt *);
54         int (*stoprec)(struct ast_modem_pvt *);
55         int (*startpb)(struct ast_modem_pvt *);
56         int (*stoppb)(struct ast_modem_pvt *);
57         int (*setsilence)(struct ast_modem_pvt *, int onoff);
58         int (*dialdigit)(struct ast_modem_pvt *, char digit);
59         struct ast_modem_driver *next;
60 };
61
62 #define MODEM_MODE_IMMEDIATE            0
63 #define MODEM_MODE_WAIT_RING            1
64 #define MODEM_MODE_WAIT_ANSWER          2
65
66 //! Private data that needs to be filled by modem driver
67 struct ast_modem_pvt {
68         /*! Raw file descriptor for this device */
69         int fd;                                                 
70         /*! FILE * representation of device */
71         FILE *f;                                                
72         /*! Channel we belong to, possibly NULL */
73         struct ast_channel *owner;              
74         /* Device name */
75         char dev[256];                                  
76         /*! Frame */
77         struct ast_frame fr;                    
78         
79         char offset[AST_FRIENDLY_OFFSET];
80         /*! Outgoing buffer */
81         char obuf[MODEM_MAX_BUF];               
82         
83         int tail;
84         /*! Pulse or tone dialling */
85         char dialtype;                                  
86         /*! Time to wait for dial timeout */
87         char dialtimeout;                               
88         
89         int obuflen;
90         /*! Immediate, or wait for an answer */
91         int mode;                                               
92         /*! State of modem in miniature */
93         int ministate;                                  
94         /*! Digits to strip on outgoing numbers */
95         int stripmsd;                                   
96         /*! Is the last thing we saw an escape */
97         int escape;                                     
98         /*! flag to say if has caller*id yet*/
99         int gotclid;                            
100         /*! ringer timeout */
101         int ringt;                              
102         /*! actual time of last ring */
103         time_t lastring;                        
104         /*! dtmf receive state/data */
105         char dtmfrx;                            
106         
107         char context[AST_MAX_EXTENSION];
108         /*! Multiple Subscriber Number */
109         char msn[AST_MAX_EXTENSION];    
110         /*! Caller ID if available */
111         char cid[AST_MAX_EXTENSION];    
112         /*! Dialed Number if available */
113         char dnid[AST_MAX_EXTENSION];   
114         /*! Modem initialization String */
115         char initstr[AST_MAX_INIT_STR]; 
116         /*! default language */
117         char language[MAX_LANGUAGE];    
118         /*! Static response buffer */
119         char response[256];                             
120         /*! Modem Capability */
121         struct ast_modem_driver *mc;    
122         /*! Next channel in list */
123         struct ast_modem_pvt *next;                     
124 };
125
126
127 //! Register a modem driver
128 /*! Register a driver */
129 extern int ast_register_modem_driver(struct ast_modem_driver *mc);
130
131 //! Unregisters a modem driver
132 /*! Unregister a driver */
133 extern int ast_unregister_modem_driver(struct ast_modem_driver *mc);
134
135 //! Sends command
136 /*! Send the command cmd (length len, or 0 if pure ascii) on modem */
137 extern int ast_modem_send(struct ast_modem_pvt *p, char *cmd, int len);
138
139 //! Waits for result
140 /*! Wait for result to occur.  Return non-zero if times out or error, last
141    response is stored in p->response  */
142 extern int ast_modem_expect(struct ast_modem_pvt *p,  char *result, int timeout);
143
144 //! Waits for result
145 /*! Wait for result to occur.    response is stored in p->response  */
146 extern int ast_modem_read_response(struct ast_modem_pvt *p,  int timeout);
147
148 //! Used to start up the PBX on a RING
149 /*! Used by modem drivers to start up the PBX on a RING */
150 extern struct ast_channel *ast_modem_new(struct ast_modem_pvt *i, int state);
151
152 //! Trim string of trailing stuff
153 /*! Trim off trailing mess */
154 extern void ast_modem_trim(char *s);
155 #endif