Metropoli BBS
VIEWER: cct02.c MODE: TEXT (ASCII)
/*
Copyright (C) Magna Carta Software, Inc. 1990-1991.  All Rights Reserved.
CTT02.C -- A slightly more advanced telecommunications program.
CAPABILITY:  CCT01.C plus...
1) Menu control of the data transfer rate;
2) Introduce c_getc() to get a byte from a port with data transformation;
*/

#include <comm.h>

#include <conio.h>
#include <ctype.h>
#include <dos.h>


/* MANIFEST CONSTANTS AND MACROS */
#define MENU            ALT_M       /* key for command summary */


/* FUNCTION PROTOTYPES */
long                do_speed_menu(COMM_PORT * p_port);
short               menu(COMM_PORT *p);
void                term(COMM_PORT *p);



/* GLOBAL VARIABLES */
COMM_PORT   port1;
BYTE        rxbuf[3072];           /* RECEIVE BUFFER */
short       vers = 2;



/* ------------------------ PROGRAM BEGINS HERE --------------------------- */
int main(void)
{
    u8250_init(&port1, COM1, 2400L, DATABITS8, PARITY_NONE, STOPBITS1);

    /* THIS LINE INSTALLS THE INTERRUPT PROCESSING ROUTINE */
    install_ipr(&port1, RECEIVE, NULL, rxbuf, sizeof(rxbuf));

    /* FINALLY, INSTALL THE INTERRUPT SERVICE ROUTINE THAT IS CALLED WHEN AN
    INTERRUPT OCCURS ON THE PORT AND IN TURN CALLS THE "IPR" INSTALLED ABOVE
    */
    install_isr(&port1, 4, NULL);       /* USE IRQ4 */

    printf("CCT-COMM Version %d: Press Alt-M for a list of commands\n", vers);
    term(&port1);
    printf("\nEnd of CCT-COMM%d\n", vers);

    return (0);
}



/*
TERM -- The terminal emulation routine. Simply polls the COM port and the
keyboard alternately for characters.
*/
void term(COMM_PORT *p_port)
{
    int c;              /* must be int to detect a -1 return */

    set_rx_xlat(p_port, LOCAL_ECHO, ON);
    for (;;) {
        /* CHECK SERIAL PORT FOR BYTE */
        c = c_getc(p_port);

        /* CHECK KEYBOARD FOR A KEY PRESS */
        if ((c = inkey()) != 0) {
            if (c == MENU) {
                if (menu(p_port)) break;
            }
            else c_putc(p_port, c);
        }
    }
}


#define DATA_SPEED  'S'                /* key to set speed */
#define EXIT        'Q'                /* key to exit from main */


short menu(COMM_PORT *p_port)
{
    int c, retval = 0;
    static char *menus[] = {
        "\tS.  Data transfer rate."
        "\n\tQ.  EXIT from COMM.",
        NULL                        /* null string terminates list */
    };
    char **p_menu;

    c = !EXIT;
    while (c != EXIT && c != LF) {
        puts("\n\n");
        for (p_menu = menus; *p_menu != NULL; p_menu++) printf("%s\n", *p_menu);
        printf("\n\t\t Enter selection (CR to quit menu) :  ");
        c = getchar();
        c = toupper(c);
        switch (c) {
            case EXIT:
                retval = 1;
                break;
            case DATA_SPEED:
                do_speed_menu(p_port);
                break;
            default:
                break;
        }
    }
    puts("\nExiting menu");

    return (retval);                /* will be zero except if EXIT */
}



/*
DO_SPEED_MENU -- Show a menu for setting the data tranfer rate.
*/
long do_speed_menu(COMM_PORT *p_port)
{
    short key;
    long ret;

    do {
        puts("\nSET THE DATA TRANSFER SPEED");
        printf("\nSpeed:  %ld bits-per-second\n", p_port->speed);
        puts("\nA. Data transfer rate     50    bits-per-second");
        puts("B. Data transfer rate     75    bits-per-second");
        puts("C. Data transfer rate    110    bits-per-second");
        puts("D. Data transfer rate    134.5  bits-per-second");
        puts("E. Data transfer rate    150    bits-per-second");
        puts("F. Data transfer rate    300    bits-per-second");
        puts("G. Data transfer rate    600    bits-per-second");
        puts("H. Data transfer rate   1200    bits-per-second");
        puts("I. Data transfer rate   2400    bits-per-second");
        puts("J. Data transfer rate   4800    bits-per-second");
        puts("K. Data transfer rate   9600    bits-per-second");
        puts("L. Data transfer rate  19200    bits-per-second");
        puts("M. Data transfer rate  38400    bits-per-second");
        puts("N. Data transfer rate  57600    bits-per-second");
        puts("O. Data transfer rate 115200    bits-per-second");
        printf("\n\tNew data transfer rate: ");
        fflush(stdout);
        key = bios_key(0) & 0XFF;
        key = toupper(key);
    } while (key < 'A' || key > 'O');

    switch (key) {
        case 'A':
            ret = 50;
            break;
        case 'B':
            ret = 75;
            break;
        case 'C':
            ret = 110;
            break;
        case 'D':
            ret = 135;
            break;
        case 'E':
            ret = 150;
            break;
        case 'F':
            ret = 300;
            break;
        case 'G':
            ret = 600;
            break;
        case 'H':
            ret = 1200;
            break;
        case 'I':
            ret = 2400;
            break;
        case 'J':
            ret = 4800;
            break;
        case 'K':
            ret = 9600;
            break;
        case 'L':
            ret = 19200;
            break;
        case 'M':
            ret = 38400L;
            break;
        case 'N':
            ret = 57600L;
            break;
        case 'O':
            ret = 115200L;
            break;
        default:
            ret = EOF;
    }
    if (ret != EOF) {
        set_speed(p_port, ret);
        printf("\nSpeed now set to: %ld bits-per-second\n", p_port->speed);
    }
    return ((long) ret);
}
[ RETURN TO DIRECTORY ]