home *** CD-ROM | disk | FTP | other *** search
/ The Devil's Doorknob BBS Capture (1996-2003) / devilsdoorknobbbscapture1996-2003.iso / W / DEVBBS.ZIP / MODEM.C < prev    next >
C/C++ Source or Header  |  1992-07-20  |  4KB  |  216 lines

  1. /*****************************************************************************
  2.  
  3.                 WWIV Version 4
  4.                     Copyright (C) 1988-1991 by Wayne Bell
  5.  
  6. *****************************************************************************/
  7.  
  8. #include "vars.h"
  9. #pragma hdrstop
  10. #include <math.h>
  11. #define modem_time 3.5
  12.  
  13. void pr1(unsigned char *s)
  14. /* This function ouputs a string to the com port.  This is mainly used
  15.  * for modem commands
  16.  */
  17. {
  18.   int i;
  19.  
  20.   for (i = 0; s[i] > 0; i++)
  21.     if (s[i] == 255)
  22.       wait1(9);
  23.     else
  24.       outcomch(s[i]);
  25. }
  26.  
  27. void get_modem_line(char *s, double d, int allowa)
  28. {
  29.   int i=0;
  30.   char ch=0, ch1;
  31.   double t;
  32.  
  33.   t = timer();
  34.   do {
  35.     ch = get1c();
  36.     if (kbhitb() && allowa) {
  37.       ch1 = getchd();
  38.       if (upcase(ch1) == 'H') {
  39.         ch = 13;
  40.         s[0] = i = 1;
  41.       }
  42.     }
  43.     if (ch >= 32)
  44.       s[i++] = upcase(ch);
  45.   } while ((ch != 13) && (fabs(timer() - t) < d) && (i<=40));
  46.   s[i] = 0;
  47. }
  48.  
  49. void do_result(result_info *ri)
  50. {
  51.   if (ri->description[0])
  52.     if (ri->flag_value & flag_append)
  53.       strcat(curspeed, ri->description);
  54.     else
  55.       strcpy(curspeed, ri->description);
  56.   if (ri->main_mode)
  57.     modem_mode = ri->main_mode;
  58.   /* ignore the ringing mode */
  59.   if (modem_mode == mode_ringing)
  60.     modem_mode=0;
  61.   modem_flag = (modem_flag & ri->flag_mask) | ri->flag_value;
  62.   if (modem_flag & flag_fc)
  63.     flow_control = 1;
  64.   if (ri->com_speed) {
  65.     com_speed = ri->com_speed;
  66.     set_baud(com_speed);
  67.   }
  68.   if (ri->modem_speed)
  69.     modem_speed = ri->modem_speed;
  70. }
  71.  
  72. void process_full_result(char *s)
  73. {
  74.   char *ss;
  75.   int i;
  76.  
  77.   ss=strtok(s,modem_i->sepr);
  78.   while (ss) {
  79.     for (i=0; i<modem_i->num_resl; i++) {
  80.       if (strcmp(modem_i->resl[i].result,ss)==0) {
  81.         do_result(&(modem_i->resl[i]));
  82.         break;
  83.       }
  84.     }
  85.     ss=strtok(NULL,modem_i->sepr);
  86.   }
  87. }
  88.  
  89. int mode_switch(double d, int allowa)
  90. {
  91.   double t;
  92.   char s[81];
  93.   int abort=0;
  94.  
  95.   t=timer();
  96.   modem_mode = 0;
  97.   while ((modem_mode==0) && (fabs(timer()-t)<d) && (!abort)) {
  98.     get_modem_line(s,d+t-timer(), allowa);
  99.     if (s[0]==1)
  100.       abort=1;
  101.     else if (s[0])
  102.       process_full_result(s);
  103.   }
  104.   return(modem_mode);
  105. }
  106.  
  107. void holdphone(int d)
  108. {
  109.   if (!ok_modem_stuff)
  110.     return;
  111.   if (no_hangup)
  112.     return;
  113.   if ((!(modem_i->pick)) || (!(modem_i->hang)))
  114.     return;
  115.   if (d) {
  116.     if (!global_xx) {
  117.       if (syscfg.sysconfig & sysconfig_off_hook) {
  118.         do_result(&(modem_i->defl));
  119.         pr1(modem_i->pick);
  120.         xtime=timer();
  121.         global_xx=1;
  122.       }
  123.     }
  124.   } else {
  125.     if (syscfg.sysconfig & sysconfig_off_hook) {
  126.       if (global_xx) {
  127.         dtr(1);
  128.         if (fabs(xtime-timer())<modem_time)
  129.           outs("\r\n\r\nWaiting for modem...");
  130.         while (fabs(xtime-timer())<modem_time)
  131.           ;
  132.         pr1(modem_i->hang);
  133.         imodem(0);
  134.         global_xx=0;
  135.       }
  136.     }
  137.   }
  138. }
  139.  
  140. void imodem(int x)
  141. {
  142.   int i,done;
  143.   double d;
  144.   char *is;
  145.   char s[81];
  146.  
  147.   if (x)
  148.     is=modem_i->setu;
  149.   else
  150.     is=modem_i->init;
  151.   if (!(*is))
  152.     return;
  153.   if (!ok_modem_stuff) {
  154.     outs("\x0c");
  155.     return;
  156.   }
  157.   outs("\x0cWaiting...");
  158.   rts(1);
  159.   dtr(1);
  160.   do_result(&(modem_i->defl));
  161.   i=0;
  162.   done=0;
  163.   wait1(9);
  164.   while (!done) {
  165.     initport(syscfg.primaryport);
  166.     pr1(is);
  167.     dump();
  168.     if (mode_switch(10.0,0)==mode_norm) {
  169.       done=1;
  170.     } else {
  171.       ++i;
  172.       sprintf(s,"(%d)...",modem_mode);
  173.       outs(s);
  174.     }
  175.     if (i>5)
  176.       done=1;
  177.   }
  178.   outs("\x0c");
  179. }
  180.  
  181. void answer_phone()
  182. {
  183.   char ch,s[81],s1[81];
  184.   int i,i1;
  185.   double d;
  186.  
  187.   outs("Answering phone, press 'H' to cut the bastard off\r\n");
  188.   do_result(&(modem_i->defl));
  189.   pr1(modem_i->ansr);
  190.   d=timer();
  191.   rts(1);
  192.   if ((mode_switch(45.0,1)!=mode_con) && (modem_mode!=mode_fax)) {
  193.     if (modem_mode == 0) {
  194.       outcomch(' ');
  195.       wait1(18);
  196.       if (fabs(timer()-d)<modem_time) {
  197.         outs("\r\nWaiting for modem...");
  198.         while (fabs(timer()-d)<modem_time)
  199.           ;
  200.       }
  201.       imodem(0);
  202.       imodem(0);
  203.     } else {
  204.       outs(curspeed);
  205.       imodem(0);
  206.       imodem(0);
  207.     }
  208.   } else {
  209.     incom=outcom=1;
  210.     if (!(modem_flag & flag_ec))
  211.       wait1(45);
  212.     else
  213.       wait1(2);
  214.   }
  215. }
  216.