Metropoli BBS
VIEWER: cct04.c MODE: TEXT (ASCII)
/*
Copyright (C) Magna Carta Software, Inc. 1990, 1991.  All Rights Reserved
CCT04.C -- Same as CCT03.C, plus...
1) Uses received data transformation;
*/

#include <comm.h>
#include <conio.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 */
short               menu(COMM_PORT *p);
void                term(COMM_PORT *p);


/* GLOBAL VARIABLES */
COMM_PORT   port1;
BYTE        rxbuf[2048];                /* RECEIVE BUFFER */
int         vers = 4;


#include "menus.c"      /* COMMON MENUS ARE PLACED IN MENUS.C FROM NOW ON */

/* ------------------------ PROGRAM BEGINS HERE --------------------------- */
int main(void)
{
    /* IN THIS EXAMPLE, WE SELECT COM2 (YOU CAN CHANGE THIS) */
    u8250_init(&port1, COM2, 2400L, DATABITS8, PARITY_NONE, STOPBITS1);
    install_ipr(&port1, RECEIVE, NULL, rxbuf, sizeof(rxbuf));
    /* NOTE THAT COM2 IS ON IRQ3, SO WE CHANGE THE SECOND PARAMETER BELOW */
    install_isr(&port1, 3, 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 */

    /* THESE LINES CONTROL THE RECEIVED DATA FORMAT */
    set_rx_xlat(p_port, EOL, CR2CRLF);
    set_rx_xlat(p_port, LOCAL_ECHO, ON);
    set_rx_xlat(p_port, CASE, UPPER);

    for (;;) {
        /* CHECK SERIAL PORT FOR BYTE */
        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_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;

            case LF:
                DONE = TRUE;
                break;

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

    return (retval);                /* will be zero except if EXIT */
}
[ RETURN TO DIRECTORY ]