Metropoli BBS
VIEWER: cct03.c MODE: TEXT (ASCII)
/*
Copyright (C) Magna Carta Software, Inc. 1990, 1991.  All Rights Reserved
CCT03.C -- Same as CCT02.C, plus...
1) Data format can be adjusted at run time.
*/

#include <comm.h>

#include <conio.h>
#include <stdlib.h>
#include <dos.h>
#if !defined(MSC)
    #include <ctype.h>
#else
    #include <stdlib.h>
#endif



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



/* FUNCTION PROTOTYPES */
void                do_data_menu(COMM_PORT * p_port);
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[2048];                /* RECEIVE BUFFER */
int     vers = 3;


/* ------------------------ PROGRAM BEGINS HERE --------------------------- */
int main(void)
{
    u8250_init(&port1, COM1, 2400L, DATABITS8, PARITY_NONE, STOPBITS1);
    install_ipr(&port1, RECEIVE, NULL, rxbuf, sizeof(rxbuf));
    install_isr(&port1, 4, NULL);

    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)
{
    short c;              /* must be int to detect a -1 return */

    for (;;) {
        /* CHECK SERIAL PORT FOR BYTE */
        if ((c = c_inchar(p_port)) != EOF) {
            putchar(c);
            fflush(stdout);
        }

        /* 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_FORMAT 'D'                /* key to set speed */
#define DATA_SPEED  'S'                /* key to set speed */
#define EXIT        'Q'                /* key to exit from main */


short menu(COMM_PORT *p_port)
{
    short c, retval = 0, DONE = FALSE;
    static char *menus[] = {
        "\tD.  Data Format",
        "\tS.  Data Transfer Rate.",
        "\tQ.  EXIT from COMM.",
        NULL                        /* null string terminates list */
    };
    char **p_menu;

    c = !EXIT;
    while (!DONE) {
        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;
                DONE = TRUE;
                break;

            case DATA_FORMAT:
                do_data_menu(p_port);
                break;

            case DATA_SPEED:
                do_speed_menu(p_port);
                break;

            default:
                DONE = TRUE;
                break;
        }
    }
    puts("\nExiting menu");

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


char *parity_strings[] = {"NONE","ODD","", "EVEN","", "MARK","", "SPACE"};

/*
DO_DATA_MENU -- Show a menu for setting the data tranfer rate and format.
*/
void do_data_menu(COMM_PORT * p_port)
{
    short key, DONE = FALSE;

    do {
        puts("\nSET THE DATA FORMAT");
        printf("\nFormat: %d Data bits, %s Parity, %d Stopbits\n",
            p_port->rxdatabits,
            parity_strings[p_port->parity],
            p_port->stopbits
            );
        puts("A. Set number of databits");
        puts("B. Set number of stopbits");
        puts("C. Set parity");
        puts("\nAny other key exits\n");
        key = bios_key(0) & 0XFF;
        switch (toupper(key)) {
            case 'A':
                puts("\nEnter databits (5, 6, 7 or 8): ");
                key = bios_key(0) & 0XF;
                set_databits(p_port, key);
                break;

            case 'B':
                puts("\nEnter stopbits (1 or 2): ");
                key = bios_key(0) & 0XF;
                set_stopbits(p_port, key);
                break;

            case 'C':
                puts("\nEnter parity ('N' for none, 'E' for even, etc.): ");
                key = bios_key(0) & 0XFF;
                key = toupper(key);
                if (key == 'N') set_parity(p_port, PARITY_NONE);
                else if (key == 'E') set_parity(p_port, PARITY_EVEN);
                else if (key == 'O') set_parity(p_port, PARITY_ODD);
                else if (key == 'M') set_parity(p_port, PARITY_MARK);
                else if (key == 'S') set_parity(p_port, PARITY_SPACE);
                else puts("\nNot recognized.  Use 'N', 'E', 'O', 'M' or 'S'");
                break;

            default:
                DONE = TRUE;
                break;
        }
    } while (!DONE);

    printf("\nFormat now : %d Data bits, %s Parity, %d Stopbits\n",
            p_port->rxdatabits,
            parity_strings[p_port->parity],
            p_port->stopbits
            );
}



/*
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("A. 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':
            puts("\nSorry, that data transfer rate not supported");
            ret = EOF;
            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 ]