aboutsummaryrefslogtreecommitdiffstats
path: root/include/asterisk/vmodem.h
blob: 2d80a14400c95a5ac7405adbcdacec3ed48ba040 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
/*
 * Asterisk -- A telephony toolkit for Linux.
 *
 * Voice Modem Definitions
 * 
 * Copyright (C) 1999, Mark Spencer
 *
 * Mark Spencer <markster@linux-support.net>
 *
 * This program is free software, distributed under the terms of
 * the GNU General Public License
 */

#ifndef _ASTERISK_VMODEM_H
#define _ASTERISK_VMODEM_H

#include <asterisk/frame.h>
#include <asterisk/channel.h>
#include <asterisk/channel_pvt.h>

#define CHAR_DLE		0x10
#define CHAR_ETX		0x03
#define CHAR_DC4		0x14

#define MODEM_DEV_TELCO		0
#define MODEM_DEV_TELCO_SPK	4
#define MODEM_DEV_SPKRPHONE	6
#define MODEM_DEV_HANDSET	9

/* Thirty millisecond sections */
#define MODEM_MAX_LEN 30
#define MODEM_MAX_BUF MODEM_MAX_LEN * 16

#define AST_MAX_INIT_STR	256

struct ast_modem_pvt;

struct ast_modem_driver {
	char *name;
	char **idents;
	int formats;
	int fullduplex;
	void (*incusecnt)(void);
	void (*decusecnt)(void);
	char * (*identify)(struct ast_modem_pvt *);
	int (*init)(struct ast_modem_pvt *);
	int (*setdev)(struct ast_modem_pvt *, int dev);
	struct ast_frame * (*read)(struct ast_modem_pvt *);
	int (*write)(struct ast_modem_pvt *, struct ast_frame *fr);
	int (*dial)(struct ast_modem_pvt *, char *);
	int (*answer)(struct ast_modem_pvt *);
	int (*hangup)(struct ast_modem_pvt *);
	int (*startrec)(struct ast_modem_pvt *);
	int (*stoprec)(struct ast_modem_pvt *);
	int (*startpb)(struct ast_modem_pvt *);
	int (*stoppb)(struct ast_modem_pvt *);
	int (*setsilence)(struct ast_modem_pvt *, int onoff);
	int (*dialdigit)(struct ast_modem_pvt *, char digit);
	struct ast_modem_driver *next;
};

#define MODEM_MODE_IMMEDIATE 		0
#define MODEM_MODE_WAIT_RING		1
#define MODEM_MODE_WAIT_ANSWER		2

//! Private data that needs to be filled by modem driver
struct ast_modem_pvt {
	/*! Raw file descriptor for this device */
	int fd;							
	/*! FILE * representation of device */
	FILE *f;						
	/*! Channel we belong to, possibly NULL */
	struct ast_channel *owner;		
	/* Device name */
	char dev[256];					
	/*! Frame */
	struct ast_frame fr;			
	
	char offset[AST_FRIENDLY_OFFSET];
	/*! Outgoing buffer */
	char obuf[MODEM_MAX_BUF];		
	
	int tail;
	/*! Pulse or tone dialling */
	char dialtype;					
	/*! Time to wait for dial timeout */
	char dialtimeout;				
	
	int obuflen;
	/*! Immediate, or wait for an answer */
	int mode;						
	/*! State of modem in miniature */
	int ministate;					
	/*! Digits to strip on outgoing numbers */
	int stripmsd;					
	/*! Is the last thing we saw an escape */
	int escape;					
	/*! flag to say if has caller*id yet*/
	int gotclid;				
	/*! ringer timeout */
	int ringt;				
	/*! actual time of last ring */
	time_t lastring;			
	/*! dtmf receive state/data */
	char dtmfrx;				
	
	char context[AST_MAX_EXTENSION];
	/*! Multiple Subscriber Number */
	char msn[AST_MAX_EXTENSION];	
	/*! Multiple Subscriber Number we listen to (; seperated list) */
	char incomingmsn[AST_MAX_EXTENSION];	
	/*! Group(s) we belong to if available */
	unsigned int group;
	/*! Caller ID if available */
	char cid[AST_MAX_EXTENSION];	
	/*! Dialed Number if available */
	char dnid[AST_MAX_EXTENSION];	
	/*! Modem initialization String */
	char initstr[AST_MAX_INIT_STR];	
	/*! default language */
	char language[MAX_LANGUAGE];	
	/*! Static response buffer */
	char response[256];				
	/*! Modem Capability */
	struct ast_modem_driver *mc;	
	/*! Next channel in list */
	struct ast_modem_pvt *next;			
};


//! Register a modem driver
/*! Register a driver */
extern int ast_register_modem_driver(struct ast_modem_driver *mc);

//! Unregisters a modem driver
/*! Unregister a driver */
extern int ast_unregister_modem_driver(struct ast_modem_driver *mc);

//! Sends command
/*! Send the command cmd (length len, or 0 if pure ascii) on modem */
extern int ast_modem_send(struct ast_modem_pvt *p, char *cmd, int len);

//! Waits for result
/*! Wait for result to occur.  Return non-zero if times out or error, last
   response is stored in p->response  */
extern int ast_modem_expect(struct ast_modem_pvt *p,  char *result, int timeout);

//! Waits for result
/*! Wait for result to occur.    response is stored in p->response  */
extern int ast_modem_read_response(struct ast_modem_pvt *p,  int timeout);

//! Used to start up the PBX on a RING
/*! Used by modem drivers to start up the PBX on a RING */
extern struct ast_channel *ast_modem_new(struct ast_modem_pvt *i, int state);

//! Trim string of trailing stuff
/*! Trim off trailing mess */
extern void ast_modem_trim(char *s);
#endif