Mon Mar 10 07:00:00 CET 2003
[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)(void);
44         void (*decusecnt)(void);
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         /*! Multiple Subscriber Number we listen to (; seperated list) */
111         char incomingmsn[AST_MAX_EXTENSION];    
112         /*! Group(s) we belong to if available */
113         unsigned int group;
114         /*! Caller ID if available */
115         char cid[AST_MAX_EXTENSION];    
116         /*! Dialed Number if available */
117         char dnid[AST_MAX_EXTENSION];   
118         /*! Modem initialization String */
119         char initstr[AST_MAX_INIT_STR]; 
120         /*! default language */
121         char language[MAX_LANGUAGE];    
122         /*! Static response buffer */
123         char response[256];                             
124         /*! Modem Capability */
125         struct ast_modem_driver *mc;    
126         /*! Next channel in list */
127         struct ast_modem_pvt *next;                     
128 };
129
130
131 //! Register a modem driver
132 /*! Register a driver */
133 extern int ast_register_modem_driver(struct ast_modem_driver *mc);
134
135 //! Unregisters a modem driver
136 /*! Unregister a driver */
137 extern int ast_unregister_modem_driver(struct ast_modem_driver *mc);
138
139 //! Sends command
140 /*! Send the command cmd (length len, or 0 if pure ascii) on modem */
141 extern int ast_modem_send(struct ast_modem_pvt *p, char *cmd, int len);
142
143 //! Waits for result
144 /*! Wait for result to occur.  Return non-zero if times out or error, last
145    response is stored in p->response  */
146 extern int ast_modem_expect(struct ast_modem_pvt *p,  char *result, int timeout);
147
148 //! Waits for result
149 /*! Wait for result to occur.    response is stored in p->response  */
150 extern int ast_modem_read_response(struct ast_modem_pvt *p,  int timeout);
151
152 //! Used to start up the PBX on a RING
153 /*! Used by modem drivers to start up the PBX on a RING */
154 extern struct ast_channel *ast_modem_new(struct ast_modem_pvt *i, int state);
155
156 //! Trim string of trailing stuff
157 /*! Trim off trailing mess */
158 extern void ast_modem_trim(char *s);
159 #endif