home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / BEEHIVE / COMMS / YAMBEE.ARC / BYAM5.C < prev    next >
Text File  |  1990-09-20  |  6KB  |  295 lines

  1. /*
  2. >>:yam5.c 02-Jun-83
  3. *
  4. Customised by Bob Logan 12-Feb-85 for the Microbee & auto dialling modems.
  5.  
  6. For automatic dialling function, define AUTODIAL
  7.  
  8. Automatic dialling for ETI 644a modem implimented by using the PIO A port
  9. DTR is controlled by pin 24 on RS232 socket of bee (relay 1 in modem)
  10. The modem uses bits 0 to 3 of the A port for modem control.
  11. Bit 0 = relay 1   Bit 1 = relay 2   Bit 2 = relay 3   Bit 3 = TX on/off
  12. The Yamphone.t file must not contain numbers before the start of the phone no.
  13. eg.    tesseract        (02)-651-1404        b300
  14. The only legal characters in the phone no are '(' ')' & '-'  All the rest must
  15. be numbers.
  16. */
  17.  
  18. #include "yam.h"
  19.  
  20. setbaud(nbaud)
  21. unsigned nbaud;
  22. {
  23.     if (nbaud == 1200) {
  24.         hibaud();        /* Rset$1200 */
  25.         Baudrate = 1200;
  26.         return(FALSE);
  27.     }
  28.     else if (nbaud == 300) {
  29.         lobaud();        /* Rset$300 */
  30.         Baudrate = 300;
  31.         return(FALSE);
  32.     }
  33.     return(TRUE);        /* to indicate invalid baudrate */
  34. }
  35.  
  36. readbaud()
  37. {
  38.     Baudrate=DEFBAUD;
  39. }
  40.  
  41. onhook()            /* DTR line pin 24 on RS232 socket */ 
  42. {
  43.     offbee();        /* set DTR line low (turn modem off line) */
  44.     outp(dial_port,0x0D);      /* close 2 & 4, open 3 */
  45.                 /* (bit 3 turns transmitter off) */
  46. }
  47.  
  48. online()
  49. {
  50.     onbee();        /* set DTR line high (turn modem on line) */
  51.     outp(dial_port,0x05);      /* close 2 & 4, open 3. Turn on TX*/
  52. }
  53.  
  54. bye()                /* turn modem off then on to clear line */
  55. {
  56.     offbee();
  57.     milibee(1600);        /* 1.6 second delay on bee */
  58.     onbee();
  59. }
  60.  
  61. #ifdef    AUTODIAL
  62.  
  63. userinit()
  64. {
  65.     offbee();            /* just to make sure */
  66. }
  67.  
  68. dial(name)
  69. char *name;
  70. {
  71.     int pulse_count;
  72.     char *s;
  73.  
  74.     while (1)                 /* loop for redial */
  75.     {
  76.     printf("Calling  %s",name);
  77.     bye();                /* off/on line (open/close relay 1) */
  78.     outp(dial_port,0x0D)╗        /¬ closσ relay≤ 2 ª 4,  */
  79.     milibee(1800);            /* 1.8 sec delay for dialtone */
  80.     outp(dial_port,0x0E)╗        /¬ closσ relay≤ │ ª 4,  */
  81.                     /* open 2 (dialling mode) */
  82.     milibee(1000);            /* 1 sec delay for settling time */
  83.  
  84. /* find start of phone number retrived from yamphone.t */
  85.     s = name;
  86.     while(!isdigit(*s))        /* search for start of phone no */
  87.         ++s;
  88.  
  89.     printf("Now dialling  ");
  90.  
  91. /* dial each digit in phone number, skipping '(', ')' & '-' */
  92.     while( (isdigit(*s)) || (*s == 40) || (*s == 41) || (*s == 45) ) {
  93.         if((*s == 40) || (*s == 41) || (*s == 45))
  94.             goto skip_dash;
  95.         if(*s == 48) {             /* looking for decimal 0 */
  96.             pulse_count = -9;    /* want 10 pulses for 0 */
  97.         }else{
  98.             pulse_count = 1;
  99.         }
  100.         /* output to port, number of pulses indicated by phone digit */
  101.         /* abort if key is pressed while dialling */
  102.         while(pulse_count++ <= (*s - 48)) {
  103.             if(kbhit()) {        /* if key pressed */
  104.                 onhook();    /* disconnect modem and */
  105.                 printf("\n");
  106.                 return OK;    /* return to menu */
  107.             }
  108.             outp(dial_port,0x0A);    /* open dialling relay */
  109.             milibee(60);        /* wait 60 m/s */
  110.             outp(dial_port,0x0E);    /* close dialling relay */
  111.             milibee(40);        /* wait 40 m/s */
  112.         }
  113.         printf("%d ",(pulse_count - 2));/* show what we dialled */
  114.         milibee(1000);            /* 1000 m/s interdigit delay */
  115. skip_dash:
  116.         ++s;                /* move to next digit */
  117.     }
  118.  
  119. /* set baud rate as per file */
  120.     if((s=cisubstr(name, "\tb")))
  121.         if(!setbaud(atoi(s+2)))
  122.             printf(" Baudrate set to %u: ", Baudrate);
  123.  
  124.     printf("\n\nHit space to stop auto-dialling & enter option.%c\n",BELL);
  125.     outp(dial_port,0x0D);            /* put modem on line */
  126.  
  127. /* wait 8 seconds for key press then redial number if no key hit */
  128.     while (pulse_count++ < (1000 * 8)) {
  129.         if(kbhit()) {            /* get answer */
  130.             if(!ask()) {
  131.                 printf("\n");
  132.                 return OK;
  133.             }else{
  134.                 break;        /* repeat dialling */
  135.             }
  136.         }
  137.           milibee(1);
  138.     }
  139.     }                        /* repeat dialling */
  140. }
  141.  
  142. /* function to decide what now ? */
  143. ask()
  144. {
  145.     char inkey;
  146.  
  147.     while (1) {            /* loop until correct response entered */
  148.     printf("\nEnter option: (Answer line.  Hold dialling.  Quit) .\b");
  149.     inkey = (tolower(getchar()));
  150.  
  151.     switch(inkey) {
  152.            case 'q':
  153.         onhook();        /* disconnect modem & return */
  154.         return OK;
  155.        case 'a':
  156.         outp(dial_port,0x05);    /* turn transmitter on */
  157.         printf("\n");
  158.         term();            /* enter terminal mode */
  159.         return OK;
  160.        case 'h':
  161.         onhook();
  162.         printf("\nHolding for redial. Hit space key to continue.");
  163.  
  164.         while (inkey = (getchar()) != ' ')
  165.             ;
  166.         printf("\n\n");
  167.         return (ERROR);        /* repeat dialling */
  168.     }
  169.     }
  170. }
  171.  
  172. #endif  /* autodial */
  173.  
  174. #ifndef READLINE
  175. readline(decisecs)
  176.  
  177. int decisecs;
  178.  
  179. {
  180.     MODEMON
  181.     if(MIREADY)
  182.         return MICHAR;
  183.     while(--decisecs>=0) {
  184.         if(MIREADY)
  185.             return MICHAR;
  186.         CONSOLON
  187.         if(CIREADY) {
  188.             CICHAR;        /* dismiss character */
  189.             return TIMEOUT;
  190.         }
  191.  
  192.         MODEMON
  193.         if(MIREADY)
  194.             return MICHAR;
  195.         for(Timeout=T1pause; --Timeout; )
  196.             if(MIREADY)
  197.                 return MICHAR;
  198.     }
  199.     return TIMEOUT;
  200. }
  201. #endif /* !READLINE */
  202.  
  203. sendline(data)
  204. char data;
  205.  
  206. {
  207.     int    n;
  208.     n = Tpause;        /* don't wait all day, 0.5 sec will do */
  209.  
  210.     MODEMON
  211.     while(!MOREADY && n--)
  212.         ;
  213.     MODATA(data);
  214. }
  215.  
  216. purgeline()
  217.  
  218. {
  219.     MODEMON
  220.     while(MIREADY)
  221.         MICHAR;
  222. }
  223.  
  224. /* default "autodial" routine */
  225. #ifndef AUTODIAL
  226. dial(name)
  227. char *name;
  228.  
  229. {
  230.     char *s;
  231.     if((s=cisubstr(name, "\tb")))
  232.         if(!setbaud(atoi(s+2)))
  233.             printf("Baudrate set to %u: ", Baudrate);
  234.     printf("%s\n", name);
  235.     return OK;
  236. }
  237. #endif /* !AUTODIAL */
  238.  
  239.  
  240. linetest (n)
  241. int n;
  242.  
  243. {
  244.     int x,e;
  245.     int c;
  246.     char lstc;
  247.  
  248.     srand(n);
  249.     printf(" Line test at %d Baud\n",Baudrate);
  250.     CONSOLON
  251.     while (CIREADY)
  252.         CICHAR;
  253.     purgeline();
  254.     for (e=0;--n;) {
  255.         if (moment(KTIME))
  256.             break;
  257.         lstc = rand();
  258.         sendline(lstc);
  259.         c = readline(10);
  260.  
  261.         if (c == TIMEOUT)
  262.             printf("\nTimeout error");
  263.         else {
  264.             if (c==lstc)
  265.                 putchar('.');
  266.             else {
  267.                 e++;
  268.                 putchar('*');
  269.                 readline(10);
  270.             }
  271.  
  272.             if (!(n&63))
  273.             putchar('\n');
  274.         }
  275.     }
  276.     printf("\n %d Errors detected\n",e);
  277. }
  278.  
  279. loop (n)    /* loop back mode for doing line tests */
  280. int n;
  281.  
  282. {
  283.     CONSOLON
  284.     while (CIREADY)
  285.         CICHAR;
  286.     printf("Line looped, Hit any key to exit\n");
  287.     while (!moment(KTIME) && --n) {
  288.         sendline( readline(10));
  289.         (n&63) ? putchar('.') : putchar('\n');
  290.     }
  291.     putch('\n');
  292. }
  293.  
  294. /* end of YAM5.C  */
  295.