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