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