/*
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);
}