📄 dkcj.c
字号:
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <stdarg.h>
#include <time.h>
#include <string.h>
/*Dialogic includes*/
#include "srllib.h"
#include "dxxxlib.h"
#include "sctools.h"
#include "dkcj.h"
#include <unistd.h>
#include <sys/types.h>
#include <signal.h>
void time_out();
void intr_hdlr();
void Init_dbf();
void Init_sys();
void Sys_exit(int filenumber,int channum);
void Startzdsl();
int cjtime();
int cj_count();
void get_number();
int channal_work();
int Process(int eventdev,int event);
int dial_telephone(int channum);
int get_header();
int get_record(int channum);
void Play_value(char *sj_value,char *dkbj_value,char *dklx_value,char *hjje_value,int filenum,DX_IOTT *iott_value,int channum);
int Index_sj(char* sj_value,DX_IOTT *iott_time,int filenum);
int Index_value(char *sz_value,DX_IOTT *iott_value,int filenum);
void Index_sz(char* sj_value,char* dkbj_value,char* dklx_value,char* hjje_value,DX_IOTT* iott_value);
int Index_yf(char *sz_value,DX_IOTT *iott_value,int filenum);
int myitoa(int myi,char* mya,int length);
int myltoa(long myl,char* mya,int length);
int writelog();
void main(int argc,char* argv[])
{
pid_t pid;
char* prgnamep;
prgnamep=argv[0];
if (argc < 2) {
printf(" Usage: %s [device name list]\n the device name is: C1, C2, C3 or C4\n", prgnamep);
exit(1);
}
if (argc > 5) {
printf(" The number of device name must be equal or less than 4\n");
exit(1);
}
for(argnum=1;argnum<argc;argnum++) {
if((strcmp(argv[argnum],"C1")!=0)&&(strcmp(argv[argnum],"C2")!=0)&&(strcmp(argv[argnum],"C3")!=0)&&(strcmp(argv[argnum],"C4")!=0)) {
printf(" The device name must be C1, C2, C3 or C4\n");
exit(1);
}
strcpy(argnames[argnum-1],"dxxxB1");
strcat(argnames[argnum-1],argv[argnum]);
}
argnum=argc-1;
printf("\n The Hasten Pay For Housing Of Loan v1.0\n Copyright (c) 1999 QiYan\n");
if ((pid = fork()) > 0) {
//父进程
//sleep(3);
exit(0);
}
else if (pid==0) {
sigset( SIGHUP, (void (*)()) intr_hdlr );
sigset( SIGINT, (void (*)()) intr_hdlr );
sigset( SIGQUIT, (void (*)()) intr_hdlr );
sigset( SIGTERM, (void (*)()) intr_hdlr );
Init_dbf();
Init_sys();
//signal(SIGALRM,(void (*)()) time_out);
//alarm(1);
Startzdsl();
exit(0);
}
else
{
printf(" Error forking child process.");
exit(1);
}
}
void intr_hdlr()
{
int channum;
int filenum;
long hookst;
for(channum=0;channum<argnum;channum++){
if ( ATDX_STATE( dxinfo[channum].chdev ) != CS_IDLE ) {
dx_stopch( dxinfo[channum].chdev , EV_SYNC );
while ( ATDX_STATE( dxinfo[channum].chdev ) != CS_IDLE );
}
if((hookst = ATDX_HOOKST(dxinfo[channum].chdev)) == AT_FAILURE) {
printf(" Get Hook state error in channal %s\n",argnames[channum]);
}
if(hookst == DX_OFFHOOK) {
if(dx_sethook(dxinfo[channum].chdev,DX_ONHOOK,EV_SYNC)==-1){
printf(" Set OnHook error in channal %s\n",argnames[channum]);
}
}
dx_close(dxinfo[channum].chdev);
}
for(filenum=0;filenum<MAXFILE;filenum++){
if(close(szfile[filenum].filehandle)==-1){
printf(" Close file %s error.\n",szfile[filenum].filename);
}
}
printf(" End The Hasten Pay For Housing Of Loan!\n If You Have Any Problem, Please Mail Qi_Yan@Hotmail.Com!\n");
exit(0);
}
void Init_dbf()
{
FILE* handle;
unsigned char header[32];
if((handle=fopen(szdbffile,"rb"))==NULL) {
printf(" can't open %s file \n",szdbffile);
exit(1);
}
if(fread(header,32,1,handle)==0) {
printf(" read %s file's header error \n",szdbffile);
fclose(handle);
exit(0);
}
if(header[1]<70) {
headermessage.year=2000+header[1];
}
else
{
headermessage.year=1900+header[1];
}
headermessage.month=header[2];
headermessage.day=header[3];
headermessage.wjrql=headermessage.year*10000+headermessage.month*100+headermessage.day;
myltoa(headermessage.wjrql,headermessage.wjrqc,sizeof(headermessage.wjrqc));
headermessage.record_number=header[4]+header[5]*256+header[6]*256*256+header[7]*256*256*256;
headermessage.header_length=header[8]+header[9]*256;
headermessage.record_length=header[10]+header[11]*256;
headermessage.szdbffile=szdbffile;
fclose(handle);
}
void Init_sys()
{
int channum;
int filenumber;
char channame[20];
int mode;
int index;
telecount.all_count=0;
telecount.success_count=0;
telecount.failure_count=0;
telecount.success_flag=0;
cjstate.time_state=TIME_U;
cjstate.time_oldstate=TIME_U;
printf(" Open The Vox File...\n");
for(filenumber=0;filenumber<MAXFILE;filenumber++){
strcpy(szfile[filenumber].filename,"./vox/");
strcat(szfile[filenumber].filename,szfilename[filenumber]);
}
for(filenumber=0;filenumber<MAXFILE;filenumber++){
if (( szfile[filenumber].filehandle= open(szfile[filenumber].filename,O_RDONLY)) == -1) {
printf(" open %s error.\n",szfile[filenumber].filename);
Sys_exit(filenumber,0);
}
}
printf(" Initializing Dialogic ...\n");
mode = SR_POLLMODE;
if ( sr_setparm( SRL_DEVICE, SR_MODEID, &mode ) == -1 ) {
printf( " Unable to set to Polled Mode" );
Sys_exit( MAXFILE,0 );
}
for(channum=0;channum<argnum;channum++){
if((dxinfo[channum].chdev=dx_open(argnames[channum],NULL))== -1){
printf(" Can't opened channal %s\n",argnames[channum]);
Sys_exit(MAXFILE,channum);
}
dxinfo[channum].chdevzt=CHDEVZT_A;
strcpy(teleinfo[channum].dkbj,"");
strcpy(teleinfo[channum].dklx,"");
strcpy(teleinfo[channum].hjje,"");
strcpy(teleinfo[channum].zzrq,"");
strcpy(teleinfo[channum].telephone,"");
if ( ATDX_STATE( dxinfo[channum].chdev ) != CS_IDLE ) {
dx_stopch( dxinfo[channum].chdev, EV_ASYNC );
while ( ATDX_STATE( dxinfo[channum].chdev ) != CS_IDLE );
}
if(dx_sethook(dxinfo[channum].chdev,DX_ONHOOK,EV_SYNC)==-1){
printf(" error set onhook in channal %s\n",argnames[channum]);
Sys_exit(MAXFILE,channum+1);
}
if (dx_setevtmsk(dxinfo[channum].chdev, DM_LCREV) == -1) {
printf(" error enable ring detection of DM_LCREV in channal %s\n",argnames[channum]);
Sys_exit(MAXFILE,channum+1);
}
for (index=0; index<MAX_TONES; index++) {
dxinfo[channum].tmplts[index] = DefaultTones[index];
}
dxinfo[channum].callp = capDflt;
// initialize tones for PerfectCall
for (index = 0; index < MAX_TONES; index++) {
dx_chgfreq(dxinfo[channum].tmplts[index].tid,
dxinfo[channum].tmplts[index].freq1.freq,
dxinfo[channum].tmplts[index].freq1.deviation,
dxinfo[channum].tmplts[index].freq2.freq,
dxinfo[channum].tmplts[index].freq2.deviation);
dx_chgdur(dxinfo[channum].tmplts[index].tid,
dxinfo[channum].tmplts[index].on.time,
dxinfo[channum].tmplts[index].on.deviation,
dxinfo[channum].tmplts[index].off.time,
dxinfo[channum].tmplts[index].off.deviation);
dx_chgrepcnt(dxinfo[channum].tmplts[index].tid,
dxinfo[channum].tmplts[index].repcnt);
}
if (dx_deltones(dxinfo[channum].chdev) == -1) {
printf(" error delete tones in channal %s\n",argnames[channum]);
Sys_exit(MAXFILE,channum+1);
}
if (dx_initcallp(dxinfo[channum].chdev) == -1) {
printf(" error init callp in channal %s\n",argnames[channum]);
Sys_exit(MAXFILE,channum+1);
}
}
}
void Sys_exit(int filenumber,int channum)
{
int file_count;
int chan_count;
if (filenumber>0) {
for(file_count=0;file_count<filenumber;file_count++) {
close(szfile[file_count].filehandle);
}
}
if (channum>0) {
for(chan_count=0;chan_count<channum;chan_count++) {
dx_close(dxinfo[chan_count].chdev);
}
}
exit(1);
}
void Startzdsl()
{
int channum;
int evtdev,evttype;
while(1){
while(!cjtime()){
for(channum=0;channum<argnum;channum++) {
if ( ATDX_STATE( dxinfo[channum].chdev ) != CS_IDLE ) {
dx_stopch( dxinfo[channum].chdev, EV_SYNC );
while ( ATDX_STATE( dxinfo[channum].chdev ) != CS_IDLE );
if(dx_sethook(dxinfo[channum].chdev,DX_ONHOOK,EV_SYNC)==-1){
printf(" error set onhook in channal %s\n", argnames[channum]);
}
}
}
printf(" The Hasten Pay Program Is Sleeping \n");
/*printf("the success cuijiao number is %ld , the all cuijiao number is %ld in period of %s"\n,
telecount.success_count,telecount.all_count,period[cjstate.time_oldstate-1]);*/
sleep(20);
}
printf(" The Hasten Pay Program Is Starting \n");
while(!get_header()) {
printf(" The Hasten Pay Program Is Stoping \n");
sleep(60);
}
for(channum=0;channum<argnum;channum++) {
get_number();
if(cjstate.current_number>headermessage.record_number) {
break;
}
if(get_record(channum) == -1) { //取得记录数据
printf(" Get the number %ld of record error in channal %s \n", cjstate.current_number, argnames[channum]);
break;
}
if(dx_sethook(dxinfo[channum].chdev,DX_OFFHOOK,EV_SYNC)==-1){
printf(" Error set offhook in channal %s \n", argnames[channum]);
break;
}
telecount.all_count=telecount.all_count+1;
if(dial_telephone(channum) == -1) { //拨号
if(dx_sethook(dxinfo[channum].chdev,DX_ONHOOK,EV_SYNC)==-1){
printf(" error set onhook in channal %s\n", argnames[channum]);
}
continue;
}
dxinfo[channum].idlework = ID_WORK;
dxinfo[channum].chtime = 0;
}
if(!channal_work()) {
printf(" The Hasten Pay Program Isn't Starting \n");
sleep(60);
continue;
}
while(1) {
if((!cjtime())&&(!channal_work())) {
printf(" The Hasten Pay Program Is Stoping \n");
break;
}
if( sr_waitevt(-1) == -1) {
printf(" Get evt error \n The Hasten Pay Program Is Stoping \n");
break;
}
evtdev = sr_getevtdev();
evttype = sr_getevttype();
if(Process(evtdev,evttype)!=0) {
printf(" The Hasten Pay Program Is Stoping \n");
break;
}
}
writelog();
//cjstate.time_oldstate=cjstate.time_state;
}
}
int writelog()
{
FILE* filelog;
char* ls_date;
char* lp_date;
time_t ls_t;
int li_day;
time(&ls_t);
ls_date = ctime(&ls_t);
lp_date = ls_date+8;
ls_date[10] = '\0';
li_day = atoi(lp_date);
if((li_day=7)||(li_day=14)||(li_day=20)) {
if((filelog=fopen(logfile,"at"))==NULL) {
printf(" can't open %s file \n",logfile);
return(-1);
}
fprintf(filelog,"The %s period of success cuijiao number is %ld, the %s period of all cuijiao number is %ld.\n",
period[cjstate.time_state-1],telecount.success_count,period[cjstate.time_state-1],telecount.all_count);
fclose(filelog);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -