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