home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The C Users' Group Library 1994 August
/
wc-cdrom-cusersgrouplibrary-1994-08.iso
/
listings
/
v_10_06
/
1006048a
< prev
next >
Wrap
Text File
|
1991-11-07
|
5KB
|
205 lines
LISTING THREE
#include "channel.hpp"
int CHANNEL::wait_for_ring()
{
printf("Waiting For Ring On: %d\n", lineno);
clrdtmf(lineno);
return 0;
}
void CHANNEL::wait_complete(int evtcode)
{
// if a call detected, set state to go off hook
if (evtcode == T_RING) {
printf("Ring Detected on: %d\n", lineno);
begin_func = CHANNEL::offhook;
end_func = CHANNEL::offhook_cmplt;
}
}
int CHANNEL::offhook()
{
// call Dialogic library function to go off hook
return(sethook(lineno, H_OFFH));
}
void CHANNEL::offhook_cmplt(int evtcode)
{
// if event was the termination of going
// off-hook, go to "hello" state
if (evtcode == T_OFFH) {
begin_func = CHANNEL::hello;
end_func = CHANNEL::hello_cmplt;
}
else { // otherwise go back on hook
begin_func = CHANNEL::onhook;
end_func = CHANNEL::onhook_cmplt;
}
}
// set phone back on hook
int CHANNEL::onhook()
{
// call Dialogic library function to go off hook
return (sethook(lineno, H_ONH));
}
void CHANNEL::onhook_cmplt(int evtcode)
{
// go back to waiting for a ring
begin_func = CHANNEL::wait_for_ring;
end_func = CHANNEL::wait_complete;
}
int CHANNEL::hello()
{
strcpy(msgname, "hello"); // play "hello" msg
return play();
}
void CHANNEL::hello_cmplt(int evtcode)
{
close(rwb.filehndl);
// if message reached EOF, get digits from caller
if (evtcode == T_EOF) {
begin_func = CHANNEL::get_digits;
end_func = CHANNEL::get_digits_cmplt;
}
else { // on error, reset phone line
begin_func = CHANNEL::onhook;
end_func = CHANNEL::onhook_cmplt;
}
}
int CHANNEL::get_digits()
{
printf("Getting Digits On: %d\n", lineno);
clrrwb(&rwb); // clear the read-write block
// store segment & offset of buffer in the rwb
rwb.xferoff = FP_OFF(digits);
rwb.xferseg = FP_SEG(digits);
rwb.maxdtmf = 2; // request 2 keypad digits
rwb.maxsec = 10; // wait 10 seconds
rwb.loopsig = 1; // terminate on loop signal
// call Dialogic library function to get digits
return (getdtmfs(lineno, &rwb));
}
void CHANNEL::get_digits_cmplt(int evtcode)
{
// check for maximum dtmf or timeout event
if (evtcode == T_MAXDT || evtcode == T_TIME) {
if(!strcmp((char *)digits, "11")) {
begin_func = CHANNEL::product_info;
end_func = CHANNEL::product_info_cmplt;
return;
}
else if(!strcmp((char *)digits, "22")) {
begin_func = CHANNEL::playback;
end_func = CHANNEL::playback_cmplt;
return;
}
else if(!strcmp((char *)digits, "33")) {
begin_func = CHANNEL::rec_msg;
end_func = CHANNEL::rec_msg_cmplt;
return;
}
}
begin_func = CHANNEL::invalid;
end_func = CHANNEL::invalid_cmplt;
}
int CHANNEL::product_info()
{
strcpy(msgname, "PRODUCTS");
return play();
}
void CHANNEL::product_info_cmplt(int evtcode)
{
close(rwb.filehndl);
begin_func = CHANNEL::goodbye;
end_func = CHANNEL::goodbye_cmplt;
}
int CHANNEL::playback()
{
// play back the message which was recorded
strcpy(msgname, RECORD_FNAME);
return play();
}
void CHANNEL::playback_cmplt(int evtcode)
{
close(rwb.filehndl);
begin_func = CHANNEL::goodbye;
end_func = CHANNEL::goodbye_cmplt;
}
int CHANNEL::goodbye()
{
strcpy(msgname, "goodbye");
return play();
}
void CHANNEL::goodbye_cmplt(int evtcode)
{
close(rwb.filehndl);
begin_func = CHANNEL::onhook;
end_func = CHANNEL::onhook_cmplt;
}
int CHANNEL::invalid()
{
strcpy(msgname, "invalid");
return play();
}
void CHANNEL::invalid_cmplt(int evtcode)
{
close(rwb.filehndl);
begin_func = CHANNEL::onhook;
end_func = CHANNEL::onhook_cmplt;
}
int CHANNEL::rec_msg()
{
char fname[13];
sprintf(fname, "%s%s", RECORD_FNAME, SPEECH_EXT);
clrrwb(&rwb); // clear the read/write block
rwb.filehndl = open(fname, O_WRONLY | O_BINARY |
O_CREAT | O_TRUNC, S_IWRITE | S_IREAD);
rwb.maxsec = 20; // maximum recording length
rwb.termdtmf= '@'; // stop on any touch tone
rwb.maxsil = 5; // stop if 5 seconds of silence
rwb.loopsig = 1; // stop if loop signal
rwb.rwbflags= 0x02;// beep before starting record
rwb.rwbdata1= 3; // beep for .6 second
// call Dialogic library to start recording
return (recfile(lineno, &rwb, RM_NORM));
}
void CHANNEL::rec_msg_cmplt(int evtcode)
{
// clear any touch tone used to stop recording
close(rwb.filehndl);
clrdtmf(lineno);
// set to now play goodbye message
begin_func = CHANNEL::goodbye;
end_func = CHANNEL::goodbye_cmplt;
}