home *** CD-ROM | disk | FTP | other *** search
/ Jason Aller Floppy Collection / 270.img / FORUM25C.ZIP / WAITCALL.PAS < prev    next >
Pascal/Delphi Source File  |  1989-02-25  |  13KB  |  472 lines

  1. {$R-,S-,I-,V-,B-,N-,L- }
  2. {$O+}
  3.  
  4. unit waitcall;
  5.  
  6.  
  7. {/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\}
  8.  
  9. interface
  10.  
  11. uses Overlay,
  12.      dos,
  13.      crt,
  14.      gentypes,
  15.      statret,
  16.      configrt,
  17.      modem,
  18.      gensubs,
  19.      subs1,
  20.      subs2,
  21.      mailret,
  22.      overret1,
  23.      mainr1,
  24.      mainr2;
  25.  
  26. {/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\}
  27.  
  28.  
  29. Function waitforacall:boolean;
  30.  
  31.  
  32. {/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\}
  33.  
  34. implementation
  35.  
  36. {/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\}
  37.  
  38.  
  39. Function waitforacall:boolean;
  40.  
  41.   VAR wscount:integer;
  42.       mustgetbaud:boolean;
  43.  
  44.   Procedure maybewritestatus;
  45.   begin
  46.     wscount:=wscount+1;
  47.     if wscount>10 then begin
  48.       writestatus;
  49.       wscount:=0
  50.     end
  51.   end;
  52.  
  53.   Function checkforhayesreport:boolean;  { Looks for CONNECT 300 }
  54.   VAR n:longint;
  55.       q:sstr;
  56.       p,b:integer;
  57.       k:char;
  58.       brate:baudratetype;
  59.   const lookfor:sstr=#13#10'CONNECT ';
  60.   begin
  61.     checkforhayesreport:=false;
  62.     if numchars=0 then exit;
  63.     p:=1;
  64.     q:='';
  65.     b:=0;
  66.     repeat
  67.       n:=now;
  68.       repeat until (now>n+1) or (numchars>0);
  69.       if numchars=0 then exit else k:=getchar;
  70.       if (k=#13) and (length(q)>0) then begin
  71.         val (q,b,p);
  72.         brate:=b110;
  73.         while (brate<=b9600) and
  74.               ((b<>baudarray[brate])
  75.                 or (not (brate in supportedrates)))
  76.               do brate:=succ(brate);
  77.         if brate<=b9600 then begin
  78.           parity:=false;
  79.           baudrate:=b;
  80.           checkforhayesreport:=true;
  81.           mustgetbaud:=false;
  82.           n:=now;
  83.           repeat until carrier or (now>n+1)
  84.         end;
  85.         exit
  86.       end;
  87.       if p>length(lookfor) then q:=q+k else begin
  88.         if k=lookfor[p] then p:=p+1 else begin
  89.           b:=b+1;
  90.           if b=2 then exit
  91.         end
  92.       end
  93.     until false
  94.   end;
  95.  
  96.   Procedure receivecall;
  97.   VAR b:byte;
  98.       timeout,autoswitch:integer;
  99.       k:char;
  100.       brate:baudratetype;
  101.  
  102.     Procedure nextrate (VAR b:baudratetype);
  103.     VAR ob:baudratetype;
  104.     begin
  105.       ob:=b;
  106.       repeat
  107.         b:=succ(b);
  108.         if b>b9600 then b:=b110;
  109.         if b=ob then exit
  110.       until b in supportedrates
  111.     end;
  112.  
  113.     Procedure disconnect;
  114.     begin
  115.       if carrier then hangupmodem;
  116.       baudrate:=defbaudrate;
  117.       parity:=false;
  118.       setparam (usecom,baudrate,parity);
  119.       setupmodem
  120.     end;
  121.  
  122.     Function seconds:integer;
  123.     VAR r:registers;
  124.     begin
  125.       r.ah:=$2c;
  126.       intr ($21,r);
  127.       seconds:=r.dh
  128.     end;
  129.  
  130.   label abort,connected;
  131.   begin
  132.     local:=false;
  133.     online:=false;
  134.     textcolor (normbotcolor);
  135.     window (1,1,80,25);
  136.     clrscr;
  137.     window (1,1,80,24);
  138.     if not mustgetbaud then goto connected;
  139.     writeln (usr,'╒═════════════════════════════════════════════════╕');
  140.     writeln (usr,'│               Someone is calling                │');
  141.     writeln (usr,'│    Waiting for the user to press the CR key     │');
  142.     writeln (usr,'│ Press CR yourself to choose displayed BAUD rate │');
  143.     writeln (usr,'│   Press space to advance to the next BAUD rate  │');
  144.     writeln (usr,'│               Press D to disconnect             │');
  145.     writeln (usr,'╘═════════════════════════════════════════════════╛');
  146.     writeln;
  147.     brate:=b110;
  148.     parity:=false;
  149.     timeout:=timer+2;
  150.     repeat
  151.       nextrate (brate);
  152.       baudrate:=baudarray[brate];
  153.       write (usr,^M^J'Trying ',baudrate,' BAUD: ');
  154.       setparam (usecom,baudrate,parity);
  155.       while numchars>0 do k:=getchar;
  156.       autoswitch:=seconds+3;
  157.       if autoswitch>59 then autoswitch:=autoswitch-60;
  158.       repeat until (not carrier) or (numchars>0) or (keyhit) or
  159.                    (timer>=timeout) or (autoswitch=seconds);
  160.       if timer>=timeout then hangupmodem;
  161.       if not carrier then goto abort;
  162.       if keyhit
  163.         then
  164.           begin
  165.             k:=bioskey;
  166.             case upcase(k) of
  167.               #13:goto connected;
  168.               'D':goto abort;
  169.             end
  170.           end
  171.         else
  172.           begin
  173.             if numchars>0 then begin
  174.               b:=ord(getchar);
  175.               write (usr,b,' received.')
  176.             end else b:=0;
  177.             if b<>13
  178.               then if b=141
  179.                 then parity:=true
  180.                 else
  181.                   begin
  182.                     delay (200);
  183.                     while numchars>0 do b:=ord(getchar)
  184.                   end
  185.           end
  186.     until (b=13) or (b=141) or (timer>timeout);
  187.     if timer<=timeout then begin
  188.       connected:
  189.       setparam (usecom,baudrate,parity);
  190.       if parity
  191.         then baudstr:='E,7'
  192.         else baudstr:='N,8';
  193.       baudstr:=strr(baudrate)+','+baudstr+',1';
  194.       online:=true;
  195.       urec.config:=[lowercase,linefeeds,eightycols];
  196.       writestr (^M^M'Connected at '+baudstr+^M^M);
  197.       newcalls:=newcalls+1;
  198.       if carrier then exit
  199.     end;
  200.     abort:
  201.     disconnect
  202.   end;
  203.  
  204.   Procedure exitprog;
  205.   begin
  206.     dontanswer;
  207.     window (1,1,80,25);
  208.     textcolor (normtopcolor);
  209.     textbackground (0);
  210.     clrscr;
  211.     gotoxy (30,24);
  212.     writeln (usr,'Use FORUM-PC again!');
  213.     ensureclosed;
  214.     halt(4)
  215.   end;
  216.  
  217.   Procedure checkday;
  218.   begin
  219.     if lastdayup<>datestr(now) then begin
  220.       lastdayup:=datestr(now);
  221.       numdaysup:=numdaysup+1;
  222.       callstoday:=0;
  223.       writestatus
  224.     end
  225.   end;
  226.  
  227.   Procedure dotimedevent;
  228.   VAR tf:text;
  229.   begin
  230.     window (1,1,80,25);
  231.     clrscr;
  232.     writeln (usr,'Executing timed event: ',eventbatch);
  233.     writeln (usr);
  234.     assign (tf,'Door.bat');
  235.     rewrite (tf);
  236.     writeln (tf,eventbatch);
  237.     textclose (tf);
  238.     timedeventdate:=datestr(now);
  239.     ensureclosed;
  240.     halt (3)
  241.   end;
  242.  
  243.   Function statusscreen:char;
  244.   const statwindx=5;
  245.         statwindy=1;
  246.         firstcolx=15;
  247.         firstline=5;
  248.         secondcolx=54;
  249.  
  250.     Procedure col1;
  251.     begin
  252.       window (statwindx+firstcolx,statwindy+firstline,80,25);
  253.     end;
  254.  
  255.     Procedure col2;
  256.     begin
  257.       window (statwindx+secondcolx,statwindy+firstline,80,25);
  258.     end;
  259.  
  260.     Procedure percent (r1,r2:real);
  261.     begin
  262.       if (r2<1) then exit;
  263.       r2:=round((r1/r2)*1000)/10;
  264.       writeln (usr,r2:0:1,'%')
  265.     end;
  266.  
  267.     Procedure drawstatus;
  268.     VAR totalidle,totalup,totalmins,r:real;
  269.         tmp:integer;
  270.     begin
  271.       col1;
  272.       tmp:=timetillevent;
  273.       if tmp<=30 then begin
  274.         gotoxy (1,0);
  275.         write (usr,'Timed event scheduled in ',tmp,' minutes!  ');
  276.         if tmp<=5 then begin
  277.           dontanswer;
  278.           if tmp<=1 then dotimedevent
  279.         end
  280.       end;
  281.       if carrier or keyhit then exit;
  282.       gotoxy (1,2);
  283.       writeln (usr,callstoday);
  284.       tmp:=elapsedtime (numminsidle);
  285.       write (usr,tmp);
  286.       gotoxy (1,6);
  287.       writeln (usr,numdaysup);
  288.       r:=round(10*numcallers/numdaysup)/10;
  289.       writeln (usr,r:0:1);
  290.       writeln (usr,timestr(now),' ');
  291.       write (usr,datestr(now),'  ');
  292.       col2;
  293.       gotoxy (1,3);
  294.       totalidle:=numminsidle.total+elapsedtime(numminsidle);
  295.       writeln (usr,totalidle:0:0);
  296.       totalup:=totalidle+numminsused.total;
  297.       writeln (usr,totalup:0:0);
  298.       totalmins:=1440.0*(numdaysup-1.0)+timer;
  299.       if (totalup<1) or (totalmins<1) then exit;
  300.       percent (numminsused.total,totalmins);
  301.       percent (numminsxfer.total,totalmins);
  302.       percent (totalidle,totalmins);
  303.       percent (totalup,totalmins);
  304.       percent (totalmins-totalup,totalmins);
  305.       col1;
  306.       gotoxy (1,1);
  307.       maybewritestatus
  308.     end;
  309.  
  310.     Procedure writeavail;
  311.     VAR m:sstr;
  312.     begin
  313.       gotoxy (1,12);
  314.       m:=sysopavailstr;
  315.       while length(m)<15 do m:=m+' ';
  316.       write (usr,m);
  317.       gotoxy (1,1)
  318.     end;
  319.  
  320.   VAR cnt,numsmail:integer;
  321.       k:char;
  322.       tmp:mstr;
  323.       b:byte;
  324.       done:boolean;
  325.  
  326.     Function shouldexit:boolean;
  327.     begin
  328.       shouldexit:=done or carrier
  329.     end;
  330.  
  331.     Procedure handlekey (k:char; beforeabout:boolean);
  332.     begin
  333.       b:=ord(k)-128;
  334.       case b of
  335.         availtogglechar:begin
  336.           toggleavail;
  337.           if not beforeabout then writeavail
  338.         end;
  339.         59,60,68:begin
  340.           done:=true;
  341.           statusscreen:=k
  342.         end
  343.       end
  344.     end;
  345.  
  346.     Function interrupted (beforeabout:boolean):boolean;
  347.     begin
  348.       if keyhit then begin
  349.         k:=bioskey;
  350.         handlekey (k,beforeabout)
  351.       end;
  352.       done:=done or carrier;
  353.       interrupted:=done
  354.     end;
  355.  
  356.   begin
  357.     statusscreen:=#0;
  358.     done:=false;
  359.     window (1,1,80,25);
  360.     textcolor (normbotcolor);
  361.     clrscr;
  362.     window (statwindx,statwindy,80,25);
  363.     gotoxy (1,1);
  364.     if interrupted (true) then exit;
  365. writeln (usr,'                       ╒═══════════════════╕');
  366. writeln (usr,'                       │   ',versionnum,'   │');
  367. writeln (usr,'╒══════════════════════╡ Waiting for calls ╞═══════════════════════╕');
  368. writeln (usr,'│                      ╘═══════════════════╛                       │');
  369. writeln (usr,'│                                                                  │');
  370.     if interrupted (true) then exit;
  371. writeln (usr,'│ Last caller:                      Total mins used:               │');
  372. writeln (usr,'│ Calls today:                      Used by transfer:              │');
  373. writeln (usr,'│ Mins idle:                        Total mins idle:               │');
  374.     if interrupted (true) then exit;
  375. writeln (usr,'│ Sysop mail:                       Total mins up:                 │');
  376. writeln (usr,'│ Total calls:                      Percent used:                  │');
  377. writeln (usr,'│ Total days:                       Percent xfer:                  │');
  378.     if interrupted (true) then exit;
  379. writeln (usr,'│ Calls/day:                        Percent idle:                  │');
  380. writeln (usr,'│ Time:                             Percent up:                    │');
  381. writeln (usr,'│ Date:                             Percent down:                  │');
  382.     if interrupted (true) then exit;
  383. writeln (usr,'│ Recent calls:                     Recent uploads:                │');
  384. writeln (usr,'│ Recent posts:                     Recent feedback:               │');
  385. writeln (usr,'│ Available:                        Recent mail:                   │');
  386. writeln (usr,'│                                                                  │');
  387. writeln (usr,'╘══════════════════════════════════════════════════════════════════╛');
  388.     if interrupted (true) then exit;
  389.     window (1,1,80,25);
  390.     gotoxy (1,24);
  391.     writeln (usr,'Commands:       F1: Forum-Term        F2: Exit Forum-PC');
  392.       write (usr,'                F10: Sign on local    Alt-A: Toggle chat availability');
  393.     if interrupted (true) then exit;
  394.     numsmail:=getnummail(1)+numfeedback;
  395.     tmp:=getlastcaller;
  396.     col1;
  397.     gotoxy (1,1);
  398.     textcolor (normtopcolor);
  399.     write (usr,copy(tmp,1,20));
  400.     gotoxy (1,4);
  401.     writeln (usr,numsmail);
  402.     write (usr,numcallers:0:0);
  403.     gotoxy (1,10);
  404.     writeln (usr,newcalls);
  405.     write (usr,newposts);
  406.     writeavail;
  407.     col2;
  408.     gotoxy (1,1);
  409.     writeln (usr,numminsused.total:0:0);
  410.     write (usr,numminsxfer.total:0:0);
  411.     gotoxy (1,10);
  412.     writeln (usr,newuploads);
  413.     writeln (usr,newfeedback);
  414.     write (usr,newmail);
  415.     repeat
  416.       checkday;
  417.       drawstatus;
  418.       cnt:=0;
  419.       repeat
  420.         delay (250);
  421.         cnt:=cnt+1;
  422.         done:=done or checkforhayesreport
  423.       until (cnt>=240) or interrupted (false) or done
  424.     until done
  425.   end;
  426.  
  427. VAR k:char;
  428. label exit;
  429. begin
  430.   waitforacall:=false;
  431.   starttimer (numminsidle);
  432.   wscount:=0;
  433.   clrscr;
  434.   repeat
  435.     doanswer;
  436.     mustgetbaud:=true;
  437.     k:=statusscreen;
  438.     if carrier then begin
  439.       receivecall;
  440.       if carrier then goto exit;
  441.     end;
  442.     case ord(k)-128 of
  443.       59:begin
  444.            local:=false;
  445.            online:=false;
  446.            writestatus;
  447.            waitforacall:=true;
  448.            goto exit
  449.          end;
  450.       60:exitprog;
  451.       68:begin
  452.            dontanswer;
  453.            local:=true;
  454.            online:=false;
  455.            newfeedback:=0;
  456.            newuploads:=0;
  457.            newcalls:=0;
  458.            newposts:=0;
  459.            newmail:=0;
  460.            writestatus;
  461.            goto exit
  462.          end
  463.     end
  464.   until 0=1;
  465.   exit:
  466.   textcolor (normbotcolor);
  467.   window (1,1,80,25);
  468.   clrscr
  469. end;
  470.  
  471. end.
  472.