home *** CD-ROM | disk | FTP | other *** search
/ The Devil's Doorknob BBS Capture (1996-2003) / devilsdoorknobbbscapture1996-2003.iso / UTIL / WWIVE / MYWIVE.ZIP / MODEM.C < prev    next >
C/C++ Source or Header  |  1993-05-06  |  4KB  |  209 lines

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