/* Copyright (C) Magna Carta Software, Inc. 1990, 1991. All Rights Reserved CCT03.C -- Same as CCT02.C, plus... 1) Data format can be adjusted at run time. */ #include #include #include #include #if !defined(MSC) #include #else #include #endif /* MANIFEST CONSTANTS AND MACROS */ #define MENU ALT_M /* key for command summary */ /* FUNCTION PROTOTYPES */ void do_data_menu(COMM_PORT * p_port); 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[2048]; /* RECEIVE BUFFER */ int vers = 3; /* ------------------------ PROGRAM BEGINS HERE --------------------------- */ int main(void) { u8250_init(&port1, COM1, 2400L, DATABITS8, PARITY_NONE, STOPBITS1); install_ipr(&port1, RECEIVE, NULL, rxbuf, sizeof(rxbuf)); install_isr(&port1, 4, 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 */ for (;;) { /* CHECK SERIAL PORT FOR BYTE */ if ((c = c_inchar(p_port)) != EOF) { putchar(c); fflush(stdout); } /* 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; default: DONE = TRUE; break; } } puts("\nExiting menu"); return (retval); /* will be zero except if EXIT */ } char *parity_strings[] = {"NONE","ODD","", "EVEN","", "MARK","", "SPACE"}; /* DO_DATA_MENU -- Show a menu for setting the data tranfer rate and format. */ void do_data_menu(COMM_PORT * p_port) { short key, DONE = FALSE; do { puts("\nSET THE DATA FORMAT"); printf("\nFormat: %d Data bits, %s Parity, %d Stopbits\n", p_port->rxdatabits, parity_strings[p_port->parity], p_port->stopbits ); puts("A. Set number of databits"); puts("B. Set number of stopbits"); puts("C. Set parity"); puts("\nAny other key exits\n"); key = bios_key(0) & 0XFF; switch (toupper(key)) { case 'A': puts("\nEnter databits (5, 6, 7 or 8): "); key = bios_key(0) & 0XF; set_databits(p_port, key); break; case 'B': puts("\nEnter stopbits (1 or 2): "); key = bios_key(0) & 0XF; set_stopbits(p_port, key); break; case 'C': puts("\nEnter parity ('N' for none, 'E' for even, etc.): "); key = bios_key(0) & 0XFF; key = toupper(key); if (key == 'N') set_parity(p_port, PARITY_NONE); else if (key == 'E') set_parity(p_port, PARITY_EVEN); else if (key == 'O') set_parity(p_port, PARITY_ODD); else if (key == 'M') set_parity(p_port, PARITY_MARK); else if (key == 'S') set_parity(p_port, PARITY_SPACE); else puts("\nNot recognized. Use 'N', 'E', 'O', 'M' or 'S'"); break; default: DONE = TRUE; break; } } while (!DONE); printf("\nFormat now : %d Data bits, %s Parity, %d Stopbits\n", p_port->rxdatabits, parity_strings[p_port->parity], p_port->stopbits ); } /* 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("A. 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': puts("\nSorry, that data transfer rate not supported"); ret = EOF; 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); }