Metropoli BBS
VIEWER: cct15.c MODE: TEXT (ASCII)
/*
Copyright (C) Magna Carta Software, Inc. 1988-1991.  All Rights Reserved.

CCT15.C
CAPABILITY:
1)  Uses interrupt driven reception.
2)  Data transfer rate can be set at run time;
3)  Data format can be adjusted at run time;
6)  Direct control over the modem;
NEW:
    Use two ports with two modems.
*/

#include <comm.h>
#include <modem.h>
#include <xfer.h>

#include <conio.h>
#include <ctype.h>
#include <dos.h>
#include <stdlib.h>
#if defined(__WATCOMC__)
    #include <direct.h>
#endif

/* MANIFEST CONSTANTS AND MACROS */
#define DO_MENU         ALT_M       /* key for command summary */
#define COMx            0X3E8


/* FUNCTION PROTOTYPES */
void    do_data_menu(COMM_PORT * p);
short   do_modem_menu(COMM_PORT *p);
short   do_txfile_menu(COMM_PORT *p);
long    do_speed_menu(COMM_PORT * p);
short   menu(COMM_PORT *p);
void    term(void);
short   transfer_progress(COMM_PORT *p, short status, unsigned long parm);


/* GLOBAL VARIABLES */
BYTE        rxbuf1[2048];               /* RECEIVE BUFFER (PORT 1) */
BYTE        rxbuf2[2048];               /* RECEIVE BUFFER (PORT 2) */
int         vers = 16;
XFER        x;
COMM_PORT   port1, port2, *p1;


#include "menus.c"
#include "xfermsg.c"

/* ------------------------ PROGRAM BEGINS HERE --------------------------- */
int main(void)
{
    init_port(&port1, COM1, 2400L, DATABITS8, PARITY_NONE, STOPBITS1);
    init_port(&port2, COMx, 2400L, DATABITS8, PARITY_NONE, STOPBITS1);
    install_ipr(&port1, RECEIVE, NULL, rxbuf1, sizeof(rxbuf1));
    install_ipr(&port2, RECEIVE, NULL, rxbuf2, sizeof(rxbuf2));
    install_isr(&port1, 4, NULL);
    install_isr(&port2, 5, NULL);

    modem_init(&port1, modem_type(&port1));
    modem_init(&port2, modem_type(&port2));
    printf("CCT-COMM Version %d: Press Alt-M for a list of commands\n", vers);
    set_rx_xlat(&port1, LOCAL_ECHO, TRUE);
    set_rx_xlat(&port2, LOCAL_ECHO, TRUE);

    p1 = &port1;
    term();
    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(void)
{
    short c;              /* must be int to detect a -1 return */

    for (;;) {
        /* CHECK SERIAL PORT FOR BYTE */
        c = c_getc(p1);

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


#define DATA_FORMAT 'D'                 /* key to set speed */
#define SFILE_MENU  'F'                 /* key to send files */
#define DATA_SPEED  'S'                 /* key to set speed */
#define MODEM_MENU  'M'                 /* key to send modem commands */
#define EXIT        'Q'                 /* key to exit from main */


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

    /* SELECT THE PORT */
    printf("\nPress \'1\' for port 1, \'3\' for port 3: ");
    c = getch();
    p = p1 = (c == '3') ? &port2 : &port1;
    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 SFILE_MENU:
                DONE = do_txfile_menu(p);
                if (DONE == -6)
                    puts("\nFile transfer still in progress under interrupt control");
                break;

            case DATA_FORMAT:
                do_data_menu(p);
                break;

            case DATA_SPEED:
                do_speed_menu(p);
                break;

            case MODEM_MENU:
                do_modem_menu(p);
                break;

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

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



/*
DO_TXFILE_MENU -- Send a file to a remote system using ASCII.
*/
short do_txfile_menu(COMM_PORT *p)
{
    short ret = 0;
    char filename[80];
    struct ffblk fb;

    /* SELECT THE FILE TO SEND */
    filename[0] = '\0';
    puts("\nSEND A FILE TO A REMOTE SYSTEM USING ASCII");
    puts("\nEnter file name (ENTER to exit):");
    scanf("%s", filename);
    if (filename[0] == CR) return (0);
    ret = findfirst(filename, &fb, FA_ARCH);
    if (ret == EOF) return (EOF);

    fqueue(&x, fb.ff_name);
    ret = fsend(p, &x, ASCII, 24*1024, xfer_progress);       /* send the file */

    return (ret);
}



/*
DO_MODEM_MENU -- Send commands to the modem.
*/
short do_modem_menu(COMM_PORT *p)
{
    short key;
    short DONE=FALSE, ret = 0;

    do {
        puts("\nSEND COMMANDS TO THE MODEM");
        puts("\nD. Dial");
        puts("H. Hangup");
        puts("I. Initialize");
        puts("O. Go Offline");
        puts("R. Reset\n");
        puts("\nAny other key exits");
        key = bios_key(0) & 0XFF;
        switch (toupper(key)) {
            case 'D':
                modem_dial(p, "226-8088");
                ret = 1;
                DONE = TRUE;
                break;

            case 'H':
                modem_hangup(p);
                break;

            case 'I':
                modem_init(p, modem_type(p));
                set_dtr(p, HIGH);
                break;

            case 'O':
                modem_go_cmd(p, (short) atoi(&((MODEM *)p->modem)->escape[3]));
                break;

            case 'R':
                modem_reset(p);
                break;

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

    return (ret);
}
[ RETURN TO DIRECTORY ]