home *** CD-ROM | disk | FTP | other *** search
/ Stars of Shareware: DFÜ und Kommunikation / SOS-DFUE.ISO / programm / dos / utility / pccp076 / voicetx.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-12-03  |  4.7 KB  |  247 lines

  1. /* Copyright (C) 1993 Peter Edward Cann */
  2.  
  3. #include<stdio.h>
  4. #include<fcntl.h>
  5. #include<time.h>
  6. #include<signal.h>
  7. #include<bios.h>
  8. #include"port.h"
  9.  
  10.  
  11. sendchar(c)
  12.     unsigned char c;
  13.     {
  14.     while(!((inp(basereg+STATREG)&TXMTMASK)&&(inp(basereg+MSTATREG)&CTSMASK)));
  15.     outp(basereg, c);
  16.     }
  17.  
  18. int follow;
  19.  
  20. quit()
  21.     {
  22.     cleanup(0);
  23.     exit(129);
  24.     }
  25.  
  26. sendstr(str)
  27.     char *str;
  28.     {
  29.     int i;
  30.     for(i=0;str[i]!='\0';++i)
  31.         sendchar(str[i]);
  32.     }
  33.  
  34. #define NSCANS 3
  35. unsigned char scans[NSCANS][16]={"CONNECT\r\n", "ERROR\r\n", "VCON\r\n"};
  36. #define SCANTIMEOUT 8
  37.  
  38. int scan()
  39.     {
  40.     time_t timestamp;
  41.     int i, j, scani[NSCANS];
  42.     timestamp=time(NULL);
  43.     for(i=0;i<NSCANS;++i)
  44.         scani[i]=0;
  45.     while(1)
  46.         {
  47.         while(follow==index)
  48.             {
  49.             if(kbhit())
  50.                 getch();
  51.             if((time(NULL)-timestamp)>SCANTIMEOUT)
  52.                 {
  53.                 for(j=0;j<NSCANS;j++)
  54.                     scani[j]=0;
  55.                 return(-1);
  56.                 }
  57.             }
  58.         putch(buf[follow]);
  59.         for(i=0;i<NSCANS;i++)
  60.             if(scans[i][scani[i]]==buf[follow])
  61.                 {
  62.                 scani[i]++;
  63.                 if(scans[i][scani[i]]=='\0')
  64.                     {
  65.                     for(j=0;j<NSCANS;j++)
  66.                         scani[j]=0;
  67.                     follow++;
  68.                     follow%=TBUFSIZ;
  69.                     return(i);
  70.                     }
  71.                 }
  72.             else
  73.                 scani[i]=0;
  74.         follow++;
  75.         follow%=TBUFSIZ;
  76.         }
  77.     }
  78.  
  79. #define VBUFSIZ 4096
  80.  
  81. unsigned char vbuf[VBUFSIZ];
  82. int fd, vbufi, vbufn;
  83.  
  84. int getbyte()
  85.     {
  86.     if(vbufi>=vbufn)
  87.         if((vbufn=read(fd, vbuf, VBUFSIZ))<=0)
  88.             {
  89.             printf("End of disk file without endcode.\n");
  90.             sendchar(0x00); /* Kill possible pending DLE */
  91.             sendchar(0x10);
  92.             sendchar(0x03);
  93.             while(!(inp(basereg+STATREG)&TXSHMTMASK));
  94.             scan(); /* Makes life easier for scripts */
  95.             cleanup(0);
  96.             exit(138);
  97.             }
  98.         else
  99.             vbufi=0;
  100.     return(vbuf[vbufi++]);
  101.     }
  102.  
  103. #define MAXCHECKS 64
  104. unsigned char checks[MAXCHECKS];
  105. int nchecks;
  106.  
  107. main(argc, argv)
  108.     int argc;
  109.     char **argv;
  110.     {
  111.     int dleflag, rdleflag, i, tmpi;
  112.     unsigned kc;
  113.     unsigned char c;
  114.     if(argc<4)
  115.         {
  116.         printf("USAGE: voicetx <comnum> <speed> <file> [endcode] ...\n");
  117.         printf("Endcodes are shielded codes, reported as exit codes starting with 0 (first).\n");
  118.         printf("Real live errors are >128, which is play completed.\n");
  119.         printf("Multi-char args are assumed hex.\n");
  120.         exit(140);
  121.         }
  122.     if((fd=open(argv[3], O_RDONLY|O_BINARY))==-1)
  123.         {
  124.         printf("Unable to open voice file %s for read.\n", argv[3]);
  125.         exit(150);
  126.         }
  127.     nchecks=0;
  128.     while(1)
  129.         {
  130.         if(nchecks>=MAXCHECKS)
  131.             {
  132.             printf("Too many endcodes for this compile.\n");
  133.             exit(145);
  134.             }
  135.         if(nchecks>=(argc-4)) /* Waste a few usec; who cares? */
  136.             break;
  137.         if(!argv[nchecks+4][0])
  138.             {
  139.             printf("Endcode %d null; exiting.\n", nchecks);
  140.             exit(141);
  141.             }
  142.         if(!argv[nchecks+4][1])
  143.             checks[nchecks]=argv[nchecks+4][0];
  144.         else
  145.             if(sscanf(argv[nchecks+4], "%x", &tmpi)!=1)
  146.                 {
  147.                 printf("Bad endcode scan %d; exiting.\n", nchecks);
  148.                 exit(142);
  149.                 }
  150.             else
  151.                 checks[nchecks]=tmpi;
  152.         nchecks++;
  153.         }
  154.     vbufi=vbufn=0;
  155.     comnum=atoi(argv[1])-1;
  156.     speed=atoi(argv[2]);
  157.     databits='8';
  158.     parity='n';
  159.     stopbits='1';
  160.     setport();
  161.     readset();
  162.     follow=index=0;
  163.     setup();
  164.     signal(SIGINT, quit);
  165.     printf("Transmitting voice. Control-D to end, Control-C to nuke.\n");
  166.     sendstr("AT#VTX\r");
  167.     switch(scan())
  168.         {
  169.         case -1:
  170.             cleanup(0);
  171.             printf("Timeout waiting for CONNECT.\n");
  172.             exit(130);
  173.             break;
  174.         case 0:
  175.             break;
  176.         case 1:
  177.             cleanup(0);
  178.             printf("Modem rejected play command.\n");
  179.             exit(131);
  180.             break;
  181.         default:
  182.             cleanup(0);
  183.             printf("Strange scan() return.\n");
  184.             exit(132);
  185.             break;
  186.         }
  187.     dleflag=rdleflag=0;
  188.     while(1)
  189.         {
  190.         if(_bios_keybrd(_KEYBRD_READY))
  191.             {
  192.             kc=_bios_keybrd(_KEYBRD_READ);
  193.             if((kc&0xff)==('C'&31))
  194.                 quit();
  195.             else if((kc&0xff)==('D'&31))
  196.                 {
  197.                 printf("^D");
  198.                 if(!dleflag)
  199.                     sendchar(0x10);
  200.                 sendchar(0x03);
  201.                 while(!(inp(basereg+STATREG)&TXSHMTMASK));
  202.                 scan(); /* Eat whatever, maybe */
  203.                 cleanup(0);
  204.                 exit(128); /* at least it matches VOICERX */
  205.                 }
  206.             }
  207.         sendchar(c=getbyte());
  208.         if(c==0x10)
  209.             dleflag=!dleflag;
  210.         else if(dleflag&(c==0x03))
  211.             break;
  212.         else
  213.             dleflag=0;
  214.         if(follow!=index)
  215.             {
  216.             c=buf[follow++];
  217.             if(follow>=TBUFSIZ)
  218.                 follow=0;
  219.             if(c==0x10)
  220.                 rdleflag=1;
  221.             else if(rdleflag)
  222.                 {
  223.                 putch(c);
  224.                 rdleflag=0;
  225.                 for(i=0;i<nchecks;i++)
  226.                     if(c==checks[i])
  227.                         {
  228.                         sendchar(0x00);
  229.                         sendchar(0x10);
  230.                         sendchar(0x18);
  231.                         scan();
  232.                         while(!(inp(basereg+STATREG)&TXSHMTMASK));
  233.                         cleanup(0);
  234.                         exit(i);
  235.                         }
  236.                 }
  237.             }
  238.         }
  239.     sendchar(0x00);
  240.     sendchar(0x10);
  241.     sendchar(0x03);
  242.     while(!(inp(basereg+STATREG)&TXSHMTMASK));
  243.     scan(); /* Wait for VCON or whatever */
  244.     cleanup(0);
  245.     exit(128);
  246.     }
  247.