/* 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 #include #include #include #include #include #include #if defined(__WATCOMC__) #include #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); }