home *** CD-ROM | disk | FTP | other *** search
/ DP Tool Club 16 / CD_ASCQ_16_0994.iso / news / 4608 / en160 / com_demo.c next >
Text File  |  1994-04-01  |  25KB  |  708 lines

  1. /****************************************************************************/
  2. /* COM_DEMO.C                                                               */
  3. /*                                                                          */
  4. /*       This demo shows the use of most of EnCom's functions and can       */
  5. /*       be compiled in small model using the EnCom library and EnQue's     */
  6. /*       UltraWin text window library, also available on most online        */
  7. /*       services and our 24 hour BBS. (1-816-353-0991   9600,N,8,1)        */
  8. /*                                                        EnQue Software    */
  9. /****************************************************************************/
  10. #include <stdlib.h>
  11. #include <stdio.h>
  12. #include <time.h>
  13. #include "uw.h"
  14. #include "uw_globx.h"
  15. #include "uw_keys.h"
  16. #include "encom.h"
  17.  
  18. #define QUE_SIZE 2048
  19.  
  20. void wn_ch_ctrl(char c, WINDOW *wnp );
  21. void test_output(WINDOW *wnp, PORT *cp);
  22. void disp_rx_stats( WINDOW *wnp, PORT *cp );
  23. void disp_tx_stats( WINDOW *wnp, PORT *cp );
  24. void disp_232_stats( WINDOW *wnp, PORT *cp );
  25. void disp_232_stats2( WINDOW *wnp, PORT *cp );
  26. void disp_232_stats3( int mask, WINDOW *wnp );
  27. void get_baud(WINDOW *wnp, PORT *cp);
  28. void get_water(WINDOW *wnp, PORT *cp);
  29. void performance_test(WINDOW *wnp, PORT *cp);
  30. void gets_test(WINDOW *wnp, PORT *cp);
  31. void test_crc(WINDOW *wnp, PORT *cp);
  32. void test_modem_cmd( WINDOW *wnp, PORT *cp );
  33. void display_help( void );
  34. void dump_regs( WINDOW *wnp, PORT *cp );
  35.  
  36. PORT Port;
  37. WINDOW Stat_wn, Tx_wn, Tx_stat_wn, Rx_wn, Rx_stat_wn;
  38. extern ulong Interrupts, Bad_irqs;
  39. char *Uart_strs[4] = { "No Uart", "8250", "16450", "16550" };
  40. char *Rts_strs[3]  = { "RTS/CTS  OFF", "RTS/CTS  ON ", "RTS/CTS  HS " };
  41.  
  42. /*********/
  43. /* ~main */
  44. /*       ********************************************************************/
  45. /****************************************************************************/
  46. main( int argc, char *argv[] )
  47. {
  48.   int port = COM2;
  49.   long baud = 2400L;
  50.   int c, end_flag = 0, val;
  51.   int dtr = 1, rts = 1, out1 = 0, out2 = 1, loop = 0;
  52.  
  53.   if( argc >= 2 )
  54.   {
  55.     switch(argv[1][0])
  56.     {
  57.       case '1': port = COM1; break;
  58.       case '2': port = COM2; break;
  59.       case '3': port = COM3; break;
  60.       case '4': port = COM4; break;
  61.     }
  62.   }
  63.   if( argc >= 3 )
  64.     baud = atol(argv[2]);
  65.  
  66.   init_video(80, 25);
  67.   init_clock(0x3333);
  68.  
  69.   wn_create( 0, 0, V_cols-1, V_rows-1, NO_BDR, WN_NORMAL, &Stat_wn );
  70.   wn_color( YELLOW, BLACK, &Stat_wn );
  71.   add_window(&Stat_wn);
  72.  
  73.   wn_create( 0, 0, V_cols-24, V_rows/2-3, SGL_BDR, WN_NORMAL, &Tx_wn );
  74.   wn_color( YELLOW, BLUE, &Tx_wn );
  75.   wn_bdr_color( YELLOW, BLUE, &Tx_wn );
  76.   wn_name("Transmit Window", &Tx_wn);
  77.   add_window(&Tx_wn);
  78.   wn_init_tabs(8,&Tx_wn);
  79.   wn_set_cr_flag(ON, &Tx_wn);
  80.   wn_set_lf_flag(ON, &Tx_wn);
  81.   wn_set_eol_wrap(ON, &Tx_wn);
  82.  
  83.   wn_create( V_cols-22, 0, V_cols, V_rows/2-2, NO_BDR, WN_NORMAL, &Tx_stat_wn );
  84.   wn_color( YELLOW, BLACK, &Tx_stat_wn );
  85.   add_window(&Tx_stat_wn);
  86.  
  87.   wn_create( 0, V_rows/2, V_cols-24, V_rows-3, SGL_BDR, WN_NORMAL, &Rx_wn );
  88.   wn_color( YELLOW, RED, &Rx_wn );
  89.   wn_bdr_color( YELLOW, RED, &Rx_wn );
  90.   wn_name("Receive Window", &Rx_wn);
  91.   add_window(&Rx_wn);
  92.   wn_init_tabs(8,&Rx_wn);
  93.   wn_set_cr_flag(ON, &Rx_wn);
  94.   wn_set_lf_flag(ON, &Rx_wn);
  95.   wn_set_eol_wrap(ON, &Rx_wn);
  96.  
  97.   wn_create( V_cols-22, V_rows/2, V_cols, V_rows-3, NO_BDR, WN_NORMAL, &Rx_stat_wn );
  98.   wn_color( RED, BLACK, &Rx_stat_wn );
  99.   add_window(&Rx_stat_wn);
  100.  
  101.   if( (val = com_port_create(port, baud,'N',8,1,QUE_SIZE,QUE_SIZE,&Port)) < 0)
  102.   {
  103.     wn_printf(&Tx_wn, "Cannot create com port - error %d", val);
  104.     get_key();
  105.     goto end1;
  106.   }
  107.   com_232_ctrl(ON, DTR | RTS | OUT2, &Port);
  108.   disp_232_stats(&Stat_wn, &Port);
  109.   wn_plst( 0, 11, "Press Alt-H for help", &Stat_wn );
  110.   mv_cs( 30, 11, &Stat_wn );
  111.   wn_printf(&Stat_wn, "Lowwater:%5d  Highwater%5d",
  112.     get_lowwater(&Port), get_highwater(&Port) );
  113.  
  114.   wn_plst(0,6, loop               ? "LOOPBACK ON " : "LOOPBACK OFF", &Tx_stat_wn);
  115.   wn_plst(0,7, Rts_strs[is_cts_flow(&Port)], &Tx_stat_wn);
  116.   wn_plst(0,8, is_xon_flow(&Port) ? "XON/XOFF ON " : "XON/XOFF OFF", &Tx_stat_wn);
  117.   wn_plst(0,9, is_dcd_flow(&Port) ? "DCD      ON " : "DCD      OFF", &Tx_stat_wn);
  118.   wn_plst(0,10,is_dsr_flow(&Port) ? "DSR      ON " : "DSR      OFF", &Tx_stat_wn);
  119.  
  120.   while( !end_flag )
  121.   {
  122.     while( (c = com_getc(&Port)) != -1 )
  123.     {
  124.       wn_ch_ctrl((char) c, &Rx_wn);
  125.       if( is_que_status(&Port) )
  126.       {
  127.         wn_ch( (uchar) (c >> 8), &Rx_wn);
  128.         disp_232_stats3(c>>8,&Stat_wn);
  129.       }
  130.     }
  131.     if( check_key() )
  132.     {
  133.       switch(c = get_key())
  134.       {
  135.         case KEY_ESC: end_flag = 1; break;
  136.         case KEY_ALT_H: display_help(); break;
  137.  
  138. /*-------------------------- regular function keys -------------------------*/
  139.         case KEY_F1:
  140.           dtr = !dtr;
  141.           com_232_ctrl(dtr, DTR, &Port);
  142.           disp_232_stats(&Stat_wn, &Port);
  143.           break;
  144.         case KEY_F2:
  145.           rts = !rts;
  146.           com_232_ctrl(rts, RTS, &Port);
  147.           disp_232_stats(&Stat_wn, &Port);
  148.           break;
  149.         case KEY_F3:
  150.           out1 = !out1;
  151.           com_232_ctrl(out1, OUT1, &Port);
  152.           disp_232_stats(&Stat_wn, &Port);
  153.           break;
  154.         case KEY_F4:
  155.           if( is_loop(&Port) )            /* don't change if not loopback */
  156.           {
  157.             out2 = !out2;
  158.             com_232_ctrl(out2, OUT2, &Port);
  159.             disp_232_stats(&Stat_wn, &Port);
  160.           }
  161.           break;
  162.  
  163.         case KEY_F5:
  164.           loop = !loop;
  165.           com_232_ctrl(loop, LOOP, &Port);
  166.           disp_232_stats(&Stat_wn, &Port);
  167.           wn_plst(0,6, loop ? "LOOPBACK ON " : "LOOPBACK OFF", &Tx_stat_wn);
  168.           break;
  169.  
  170.         case KEY_F6:
  171.           if( is_cts_flow(&Port) == HS_RTS_CTS )
  172.             set_cts_flow(OFF, &Port);
  173.           else if( is_cts_flow(&Port) == OFF )
  174.             set_cts_flow(ON, &Port);
  175.           else
  176.             set_cts_flow(HS_RTS_CTS, &Port);
  177.           wn_plst(0,7, Rts_strs[is_cts_flow(&Port)], &Tx_stat_wn);
  178.           break;
  179.         case KEY_F7:
  180.           if( is_xon_flow(&Port) )
  181.             set_xon_flow(OFF, XON_ANY, XOFF_CHAR, 1800, 200, &Port);
  182.           else
  183.             set_xon_flow(ON, XON_ANY, XOFF_CHAR, 1800, 200, &Port);
  184.           wn_plst(0,8, is_xon_flow(&Port) ? "XON/XOFF ON " : "XON/XOFF OFF", &Tx_stat_wn);
  185.           break;
  186.  
  187.         case KEY_F8:
  188.           mv_cs( 0,11,&Stat_wn),  wn_cleol(&Stat_wn);
  189.           if( is_que_status(&Port) )
  190.           {
  191.             set_que_status(OFF, &Port);
  192.             wn_plst( 0, 11, "Press Alt-H for help", &Stat_wn );
  193.             mv_cs( 30, 11, &Stat_wn );
  194.             wn_printf(&Stat_wn, "Lowwater:%5d  Highwater%5d",
  195.               get_lowwater(&Port), get_highwater(&Port) );
  196.           }else
  197.             set_que_status(ON, &Port);
  198.           break;
  199.  
  200.         case KEY_F9:
  201.           send_break(Tics_per_sec/4,&Port);
  202.           break;
  203.  
  204.         case KEY_F10:
  205.           test_crc(&Tx_wn, &Port);
  206.           break;
  207.  
  208. /*------------------------- alternate function keys ------------------------*/
  209.         case KEY_ALT_F1:
  210.           test_modem_cmd(&Tx_wn, &Port);
  211.           break;
  212.  
  213.         case KEY_ALT_F2:
  214.           wn_clear(&Tx_wn);
  215.           wn_plst(0,0,"Initializing modem...", &Tx_wn);
  216.           wn_st(modem_reset(&Port), &Tx_wn);
  217.           modem_echo(OFF,&Port);
  218.           wn_st("done!", &Tx_wn);
  219.           wn_plst(0,1,"Dialing EnQue BBS...", &Tx_wn);
  220.           wn_st(modem_dial("ATDT18163530991",&Port),&Tx_wn);
  221.           wn_st("done!", &Tx_wn);
  222.  
  223.           break;
  224.         case KEY_ALT_F3:
  225.           wn_plst(0,2,"Hanging up phone...", &Tx_wn);
  226.           wn_st(modem_hangup(&Port), &Tx_wn);
  227.           break;
  228.  
  229.         case KEY_ALT_F4:
  230.           com_clear_que( RX, &Port);
  231.           break;
  232.         case KEY_ALT_F5:
  233.           com_clear_que( TX, &Port);
  234.           break;
  235.         case KEY_ALT_F6:
  236.           performance_test( &Tx_wn, &Port);
  237.           break;
  238.  
  239.         case KEY_ALT_F7:
  240.           dump_regs( &Tx_wn, &Port);
  241.           break;
  242.  
  243.         case KEY_ALT_F8:
  244.           prime_tx(&Port);
  245.           break;
  246.         case KEY_ALT_F9:
  247.           force_tx(0x55,&Port);
  248.           break;
  249.         case KEY_ALT_F10:
  250.           Port.edge_trigger = !Port.edge_trigger;
  251.           break;
  252.  
  253. /*--------------------------- control function keys ------------------------*/
  254.         case KEY_CTRL_F1:
  255.           if( is_dcd_flow(&Port) )
  256.             set_dcd_flow(OFF, &Port);
  257.           else
  258.             set_dcd_flow(ON, &Port);
  259.           wn_plst(0,9, is_dcd_flow(&Port) ? "DCD      ON " : "DCD      OFF", &Tx_stat_wn);
  260.           break;
  261.         case KEY_CTRL_F2:
  262.           if( is_dsr_flow(&Port) )
  263.             set_dsr_flow(OFF, &Port);
  264.           else
  265.             set_dsr_flow(ON, &Port);
  266.           wn_plst(0,10,is_dsr_flow(&Port) ? "DSR      ON " : "DSR      OFF", &Tx_stat_wn);
  267.           break;
  268.  
  269.  
  270.         case KEY_CTRL_F3:
  271.           com_clear_que(TX | RX, &Port);
  272.           Port.tx_chars = Port.rx_chars = 0;
  273.           Port.parity_errs = Port.framing_errs = Port.overrun_errs = 0;
  274.           Port.break_cnt = Port.msg_cnt = Port.tx_overflow = Port.rx_overflow = 0;
  275.           Interrupts = Bad_irqs = 0;
  276.           break;
  277.  
  278.         case KEY_CTRL_F4:
  279.           get_baud(&Tx_wn, &Port);
  280.           break;
  281.  
  282.         case KEY_CTRL_F5:
  283.           fifo_rx_reset(&Port);
  284.           fifo_tx_reset(&Port);
  285.           if( Port.uart_type == ID_16550 )
  286.           {
  287.             if( is_fifo_enabled(&Port) )
  288.               fifo_disable(&Port);
  289.             else
  290.               fifo_enable(&Port);
  291.           }
  292.           break;
  293.         case KEY_CTRL_F6:
  294.           com_fifo_trigger(RX_TRIG_1,&Port);
  295.           break;
  296.         case KEY_CTRL_F7:
  297.           com_fifo_trigger(RX_TRIG_4,&Port);
  298.           break;
  299.         case KEY_CTRL_F8:
  300.           com_fifo_trigger(RX_TRIG_8,&Port);
  301.           break;
  302.         case KEY_CTRL_F9:
  303.           com_fifo_trigger(RX_TRIG_14,&Port);
  304.           break;
  305.         case KEY_CTRL_F10:
  306.           get_water(&Tx_wn,&Port);
  307.           mv_cs( 30, 11, &Stat_wn );
  308.           wn_printf(&Stat_wn, "Lowwater:%5d  Highwater%5d",
  309.             get_lowwater(&Port), get_highwater(&Port) );
  310.           break;
  311.  
  312.         default:
  313.           wn_ch_ctrl((char) c, &Tx_wn);
  314.           if( com_putc(c, &Port) == -1 )
  315.             wn_plst(40,10,"put error",&Tx_wn);
  316.           break;
  317.       }
  318.     }else{
  319.       disp_rx_stats(&Rx_stat_wn, &Port);
  320.       disp_tx_stats(&Tx_stat_wn, &Port);
  321.       disp_232_stats2(&Stat_wn, &Port);
  322.       mv_cs(0,10,&Stat_wn), wn_printf(&Stat_wn, "Port:%d Uart:%s Baud:%-6ld [%d]",
  323.         Port.chan + 1, Uart_strs[Port.uart_type], Port.baud, Port.edge_trigger);
  324.       if( Port.uart_type == ID_16550 )
  325.         wn_printf(&Stat_wn, "FIFO:%s  TRIGGER:%2d",
  326.           is_fifo_enabled(&Port) ? "ON " : "OFF", get_trigger_level(&Port));
  327.     }
  328.   }
  329.   com_port_destroy(&Port);
  330. end1:
  331.   remove_window(&Stat_wn);
  332.   remove_window(&Tx_wn);
  333.   remove_window(&Tx_stat_wn);
  334.   remove_window(&Rx_wn);
  335.   remove_window(&Rx_stat_wn);
  336.   end_clock();
  337.   end_video();
  338.   return(1);
  339. }
  340. /*** end of main ***/
  341.  
  342. /***************/
  343. /* ~wn_ch_ctrl */
  344. /*             ***************************************************************/
  345. /*****************************************************************************/
  346. void wn_ch_ctrl(char c, WINDOW *wnp )
  347. {
  348.   switch( c )
  349.   {
  350.     case 0x07: tone(1024,10);       break;
  351.     case '\r': wnp->csr_x = 0;      if( !wnp->cr_flag ) break;
  352.     case '\n': wn_csr_dn(1,wnp);    break;
  353.     case '\t': wn_tab_right(1,wnp); break;
  354.     case '\b': wn_csr_left(1,wnp), wn_ch(' ', wnp), wn_csr_left(1,wnp); break;
  355.     default  : wn_ch(c, wnp);       break;
  356.   }
  357. }
  358. /*** end of wn_ch_ctrl ***/
  359.  
  360.  
  361. /******************/
  362. /* ~disp_rx_stats */
  363. /*                ************************************************************/
  364. /*****************************************************************************/
  365. void disp_rx_stats( WINDOW *wnp, PORT *cp )
  366. {
  367.   mv_cs(0,0,wnp), wn_printf(wnp, "Rx chars:%8lu", cp->rx_chars    );
  368.   mv_cs(0,1,wnp), wn_printf(wnp, "Rx read :%8u",  cp->rx_read     );
  369.   mv_cs(0,2,wnp), wn_printf(wnp, "Rx write:%8u",  cp->rx_write    );
  370.   mv_cs(0,3,wnp), wn_printf(wnp, "Rx cnt  :%8u",  cp->rx_cnt      );
  371.   mv_cs(0,4,wnp), wn_printf(wnp, "Rx oflow:%8u",  cp->rx_overflow );
  372.   mv_cs(0,5,wnp), wn_printf(wnp, "Parity  :%8u",  cp->parity_errs );
  373.   mv_cs(0,6,wnp), wn_printf(wnp, "Framing :%8u",  cp->framing_errs);
  374.   mv_cs(0,7,wnp), wn_printf(wnp, "Overrun :%8u",  cp->overrun_errs);
  375.   mv_cs(0,8,wnp), wn_printf(wnp, "Breaks  :%8u",  cp->break_cnt   );
  376.   mv_cs(0,9,wnp), wn_printf(wnp, "Msg Cnt :%8u",  cp->msg_cnt     );
  377.   mv_cs(0,10,wnp),wn_printf(wnp, "Bad Irqs:%8lu", Bad_irqs        );
  378. }
  379. /*** end of disp_rx_stats ***/
  380.  
  381. /******************/
  382. /* ~disp_tx_stats */
  383. /*                ************************************************************/
  384. /*****************************************************************************/
  385. void disp_tx_stats( WINDOW *wnp, PORT *cp )
  386. {
  387.   mv_cs(0,0,wnp), wn_printf(wnp, "Tx chars:%8lu", cp->tx_chars);
  388.   mv_cs(0,1,wnp), wn_printf(wnp, "Tx read :%8u",  cp->tx_read );
  389.   mv_cs(0,2,wnp), wn_printf(wnp, "Tx write:%8u",  cp->tx_write);
  390.   mv_cs(0,3,wnp), wn_printf(wnp, "Tx cnt  :%8u",  cp->tx_cnt  );
  391.   mv_cs(0,4,wnp), wn_printf(wnp, "Tx on   :%8u",  cp->tx_on   );
  392.   mv_cs(0,5,wnp), wn_printf(wnp, "Irqs    :%8lu",  Interrupts  );
  393. }
  394. /*** end of disp_rx_stats ***/
  395.  
  396. /*******************/
  397. /* ~disp_232_stats */
  398. /*                 ***********************************************************/
  399. /*****************************************************************************/
  400. void disp_232_stats( WINDOW *wnp, PORT *cp )
  401. {
  402.   wn_plst( 0, 23, is_dtr(cp)  ? "DTR : 1" : "DTR : 0", wnp );
  403.   wn_plst(10, 23, is_rts(cp)  ? "RTS : 1" : "RTS : 0", wnp );
  404.   wn_plst(20, 23, is_out1(cp) ? "OUT1: 1" : "OUT1: 0", wnp );
  405.   wn_plst(30, 23, is_out2(cp) ? "OUT2: 1" : "OUT2: 0", wnp );
  406. }
  407. /*** end of disp_232_stats ***/
  408.  
  409. /********************/
  410. /* ~disp_232_stats2 */
  411. /*                  **********************************************************/
  412. /*****************************************************************************/
  413. void disp_232_stats2( WINDOW *wnp, PORT *cp )
  414. {
  415.   wn_plst(40, 23, is_dsr(cp)  ? "DSR : 1" : "DSR : 0", wnp );
  416.   wn_plst(50, 23, is_cts(cp)  ? "CTS : 1" : "CTS : 0", wnp );
  417.   wn_plst(60, 23, is_dcd(cp)  ? "DCD : 1" : "DCD : 0", wnp );
  418.   wn_plst(70, 23, is_ri(cp)   ? "RI  : 1" : "RI  : 0", wnp );
  419.  
  420.   wn_plst(78, 23, cp->rx_xstate ? "1" : "0", wnp );
  421.   wn_plst(79, 23, cp->tx_xstate ? "1" : "0", wnp );
  422. }
  423. /*** end of disp_232_stats2 ***/
  424.  
  425. /********************/
  426. /* ~disp_232_stats3 */
  427. /*                  **********************************************************/
  428. /*****************************************************************************/
  429. void disp_232_stats3( int mask, WINDOW *wnp )
  430. {
  431.   mv_cs( 0,11,wnp), wn_printf(wnp, "Parity :%1d", mask & (PE >> 1));
  432.   mv_cs(10,11,wnp), wn_printf(wnp, "Framing:%1d", mask & (FE >> 1));
  433.   mv_cs(20,11,wnp), wn_printf(wnp, "Overrun:%1d", mask & (OE >> 1));
  434.   mv_cs(30,11,wnp), wn_printf(wnp, "Break  :%1d", mask & (BI >> 1));
  435.   wn_plst(40, 11, (mask & DSR) ? "DSR : 1" : "DSR : 0", wnp );
  436.   wn_plst(50, 11, (mask & CTS) ? "CTS : 1" : "CTS : 0", wnp );
  437.   wn_plst(60, 11, (mask & DCD) ? "DCD : 1" : "DCD : 0", wnp );
  438.   wn_plst(70, 11, (mask & RI ) ? "RI  : 1" : "RI  : 0", wnp );
  439. }
  440. /*** end of disp_232_stats3 ***/
  441.  
  442. /*************/
  443. /* ~get_baud */
  444. /*           ****************************************************************/
  445. /****************************************************************************/
  446. void get_baud(WINDOW *wnp, PORT *cp)
  447. {
  448.   char msg[8];
  449.   long baud;
  450.  
  451.   setmem(msg,8,0);
  452.   wn_clear(wnp);
  453.   mv_cs( 0, 4, wnp );
  454.   wn_printf(wnp, "Please enter new baud rate (1-115000):" );
  455.   wn_gets(msg, "______", "######", wnp->att, STRIP_ON, wnp);
  456.   baud = atol(msg);
  457.   if( range(1,baud,115000L) )
  458.     com_port_init(baud, 'N', 8, 1, cp);
  459.   wn_clear(wnp);
  460. }
  461. /*** end of get_baud ***/
  462.  
  463. /**************/
  464. /* ~get_water */
  465. /*            ***************************************************************/
  466. /****************************************************************************/
  467. void get_water(WINDOW *wnp, PORT *cp)
  468. {
  469.   char  msg[8];
  470.   uint  lowwater, highwater;
  471.  
  472.   setmem(msg,8,0);
  473.   wn_clear(wnp);
  474.   mv_cs( 0, 4, wnp );
  475.   wn_printf(wnp, "Please enter new lowwater mark (10-2000):" );
  476.   wn_gets(msg, "____", "####", wnp->att, STRIP_ON, wnp);
  477.   lowwater = atoi(msg);
  478.   if( range(10,lowwater,2000) )
  479.     set_lowwater(lowwater, cp);
  480.  
  481.   mv_cs( 0, 6, wnp );
  482.   wn_printf(wnp, "Please enter new highwater mark (10-2000):" );
  483.   wn_gets(msg, "____", "####", wnp->att, STRIP_ON, wnp);
  484.   highwater = atoi(msg);
  485.   if( range(lowwater + 1,highwater,2000) )
  486.     set_highwater(highwater, cp);
  487.   wn_clear(wnp);
  488. }
  489. /*** end of get_water ***/
  490.  
  491. /*************/
  492. /* ~test_crc */
  493. /*           ****************************************************************/
  494. /****************************************************************************/
  495. void test_crc(WINDOW *wnp, PORT *cp)
  496. {
  497.   char  msg[129], fmt[129], defmt[129], tmp[129], mask[129];
  498.   uint  i, len, r = 0;
  499.  
  500.   setmem(msg,128,0);
  501.   setmem(tmp,32,'*'), tmp[32] = '\0';
  502.   setmem(mask,32,'_'), mask[32] = '\0';
  503.  
  504.   mk_crc_tbl( 0xffff, CRCCITT_REV, gen_crc_rev );
  505.   set_encrypt(0x12, cp);
  506.   set_match(0x03, cp);
  507.   init_msg(cp);                 /* tells msg formatting routines about above*/
  508.  
  509.   mv_cs( 0, r++, wnp );
  510.   wn_printf(wnp, "Please type some characters, <Enter> when finished");
  511.   mv_cs( 0, r++, wnp );
  512.   wn_gets(msg, mask, tmp, wnp->att, STRIP_ON, wnp);
  513.  
  514.   len = fmt_msg( (uchar *) msg, (uchar *) fmt, strlen(msg));
  515.   mv_cs( 0, r++, wnp );
  516.   wn_printf(wnp, "Your quoted, encrypted and CRC'd message:");
  517.   mv_cs( 0, r++, wnp );
  518.   for (i=0; i<len; i++)
  519.     wn_ch(fmt[i],wnp);
  520.  
  521.   len = defmt_msg((uchar *) fmt, (uchar *) defmt);
  522.  
  523.   mv_cs( 0, r++, wnp );
  524.   wn_printf(wnp, "And back to normal:");
  525.   mv_cs( 0, r++, wnp );
  526.   for (i=0; i<len; i++)
  527.     wn_ch(defmt[i], wnp);
  528.   get_key();
  529.   wn_clear(wnp);
  530. }
  531. /*** end of test_crc ***/
  532.  
  533. /*******************/
  534. /* ~test_modem_cmd */
  535. /*                 **********************************************************/
  536. /****************************************************************************/
  537. void test_modem_cmd( WINDOW *wnp, PORT *cp )
  538. {
  539.   int   r = 0;
  540.   char  msg[129], tmp[129], mask[129];
  541.  
  542.   wn_clear(wnp);
  543.   setmem(msg,128,0);
  544.   setmem(tmp,32,'*'), tmp[32] = '\0';
  545.   setmem(mask,32,'_'), mask[32] = '\0';
  546.   mv_cs( 0, r++, wnp );
  547.   wn_printf(wnp, "Please type a modem string, <Enter> when finished");
  548.   mv_cs( 0, r++, wnp );
  549.   wn_gets(msg, mask, tmp, wnp->att, STRIP_ON, wnp);
  550.   wn_plst(0, r++, "Reply:", wnp );
  551.   wn_st(modem_cmd(msg,-1,5,cp), wnp);
  552. }
  553. /*** test_modem_cmd ***/
  554.  
  555. /*********************/
  556. /* ~performance_test */
  557. /*                   *********************************************************/
  558. /*****************************************************************************/
  559. uchar Tmp_tx[QUE_SIZE];
  560. void performance_test(WINDOW *wnp, PORT *cp)
  561. {
  562.   int i, end_flag, r;
  563.   long loops, save_loops;
  564.  
  565.   wn_clear(wnp);
  566.   for( i = 0; i < 1024; i++ )
  567.     Tmp_tx[i] = (uchar) (i % ('~'-' ')) + ' ';
  568.   com_irq_ctrl(OFF, DR_IRQ | THRE_IRQ | RLS_IRQ | MS_IRQ, cp);
  569.   com_irq_ctrl(ON,  MS_IRQ, cp);
  570.   wn_plst( CENTERED, 0, "<Hit any key to abort test>", wnp );
  571.   wn_plst( CENTERED, 1, "-- This tests performance using transmit interrupts --", wnp );
  572.   for( i = 0; i < 2 && !check_key(); i++ )
  573.   {
  574.     r = 2;
  575.     end_flag = 0;
  576.     loops = 0;
  577.     if( !i )
  578.       wn_plst( 0, r++, "Analyzing system speed - please wait 10 seconds...", wnp );
  579.     else
  580.       wn_plst( 0, r++, "Transmitting test data - please wait 10 seconds...", wnp );
  581.     cp->tx_chars = 0;
  582.     Uw_timers[3] = 0;
  583.     while( (end_flag <= 10) && !check_key() )       /* loop for 10 seconds  */
  584.     {
  585.       if( !Uw_timers[3] )                           /* display stats 1/sec  */
  586.       {
  587.         disp_tx_stats(&Tx_stat_wn,cp);
  588.         Uw_timers[3] = Tics_per_sec;
  589.         end_flag++;                                 /* bump one a second    */
  590.       }
  591.       if( i )
  592.         if( com_tx_free(cp) > 1000 )
  593.         {
  594.           disable();
  595.           com_putc_qty( Tmp_tx, 1000, cp );         /* send 1000 bytes      */
  596.           enable();
  597.         }
  598.       loops++;
  599.     }
  600.     com_clear_que(TX,cp);
  601.     if( !i )                                        /* save loop overhead   */
  602.     {
  603.       save_loops = loops;
  604.       cp->tx_chars = 0;
  605.     }
  606.   }
  607. /*------------------------- analyze statistics -----------------------------*/
  608.   if( !check_key() )
  609.   {
  610.     r = 0;
  611.     wn_clear(wnp);
  612.     mv_cs(0,r++,wnp);
  613.     wn_printf(wnp, "At %ld bps, sent %ld chars in 10s (%d cps).",
  614.       cp->baud, cp->tx_chars, (int) (cp->tx_chars / 10L) );
  615.     mv_cs(0,r++,wnp);
  616.     wn_printf(wnp, "This is %ld%% of ideal for this baud rate.",
  617.       (cp->tx_chars * 100L) / cp->baud );
  618.     mv_cs(0,r++,wnp);
  619.     wn_printf(wnp, "CPU overhead was %ld%%.",
  620.       100L - ((loops * 100L) / save_loops) );
  621.     r++;
  622.     wn_plst(0,r++,"These results have a slight error due to imperfect", wnp);
  623.     wn_plst(0,r++,"timing characteristics of the PC.", wnp);
  624.     r++;
  625.     wn_plst(0,r++,"Feel free to repeat this test at different baud rates.",wnp);
  626.   }else{
  627.     get_key();
  628.     wn_clear(wnp);
  629.     wn_plst( CENTERED, 4, "Performance Test Aborted!", wnp );
  630.   }
  631.   com_irq_ctrl(ON, DR_IRQ | RLS_IRQ | MS_IRQ, cp);
  632. }
  633. /*** end of performance_test ***/
  634.  
  635. /*****************/
  636. /* ~display_help */
  637. /*               ************************************************************/
  638. /****************************************************************************/
  639. void display_help( void )
  640. {
  641.   int r = 0;
  642.   WINDOW wn;
  643.  
  644.   wn_create( 0, 0, V_cols-1, V_rows-1, SGL_BDR, WN_NORMAL, &wn );
  645.   wn_color( LIGHTGRAY, RED, &wn );
  646.   add_window(&wn);
  647.  
  648.   wn_plst(0, r++, "F1 - Toggle DTR                          ", &wn);
  649.   wn_plst(0, r++, "F2 - Toggle RTS                          ", &wn);
  650.   wn_plst(0, r++, "F3 - Toggle OUT1                         ", &wn);
  651.   wn_plst(0, r++, "F4 - Toggle OUT2                         ", &wn);
  652.   wn_plst(0, r++, "F5 - Toggle LOOPBACK mode                ", &wn);
  653.   wn_plst(0, r++, "F6 - Toggle RTS/CTS  Handshake mode      ", &wn);
  654.   wn_plst(0, r++, "F7 - Toggle XON/XOFF Handshake mode      ", &wn);
  655.   wn_plst(0, r++, "F8 - Toggle <queue status> mode          ", &wn);
  656.   wn_plst(0, r++, "F9 - Send 1/4 second Break               ", &wn);
  657.   wn_plst(0, r++, "F10- Test CRC/Msg formatting routines    ", &wn);
  658.   r++;
  659.   wn_plst(0, r++, "Alt F1 - Test modem commands             ", &wn);
  660.   wn_plst(0, r++, "Alt F2 - Dial EnQue BBS                  ", &wn);
  661.   wn_plst(0, r++, "Alt F3 - Hangup the phone                ", &wn);
  662.   wn_plst(0, r++, "Alt F4 - Clear RX Queue                  ", &wn);
  663.   wn_plst(0, r++, "Alt F5 - Clear TX Queue                  ", &wn);
  664.   wn_plst(0, r++, "Alt F6 - Do Performance Test             ", &wn);
  665.   wn_plst(0, r++, "Alt F7 - Dump Uart registers             ", &wn);
  666.   wn_plst(0, r++, "Alt F8 - Kickstart transmitter           ", &wn);
  667.   wn_plst(0, r++, "Alt F9 - Force transmission of hex 55    ", &wn);
  668.   wn_plst(0, r++, "Alt F10- Toggle edge triggered interrupts", &wn);
  669.  
  670.   r = 0;
  671.   wn_plst(40,r++, "Ctl F1 - toggle DCD handshaking ", &wn);
  672.   wn_plst(40,r++, "Ctl F2 - toggle DSR handshaking ", &wn);
  673.   wn_plst(40,r++, "Ctl F3 - Clear statistics ", &wn);
  674.   wn_plst(40,r++, "Ctl F4 - Change baud rate ", &wn);
  675.   wn_plst(40,r++, "Ctl F5 - Toggle 16550 FIFO mode ", &wn);
  676.   wn_plst(40,r++, "Ctl F6 - Set 16550 FIFO trigger to 1 ", &wn);
  677.   wn_plst(40,r++, "Ctl F7 - Set 16550 FIFO trigger to 4 ", &wn);
  678.   wn_plst(40,r++, "Ctl F8 - Set 16550 FIFO trigger to 8 ", &wn);
  679.   wn_plst(40,r++, "Ctl F10- Set low & highwater marks", &wn);
  680.  
  681.   get_key();
  682.  
  683.   remove_window(&wn);
  684. }
  685. /*** end of display_help ***/
  686.  
  687. /**************/
  688. /* ~dump_regs */
  689. /*            ***************************************************************/
  690. /****************************************************************************/
  691. void dump_regs( WINDOW *wnp, PORT *cp )
  692. {
  693.   int r = 0, fmt;
  694.  
  695.   mv_cs(0, r++, wnp); wn_printf(wnp, "IER :%04x", inbyte(cp->uart[IER]) );
  696.   mv_cs(0, r++, wnp); wn_printf(wnp, "IIR :%04x", inbyte(cp->uart[IIR]) );
  697.   mv_cs(0, r++, wnp); wn_printf(wnp, "LCR :%04x", fmt = inbyte(cp->uart[LCR]) );
  698.   mv_cs(0, r++, wnp); wn_printf(wnp, "MCR :%04x", inbyte(cp->uart[MCR]) );
  699.   mv_cs(0, r++, wnp); wn_printf(wnp, "LSR :%04x", inbyte(cp->uart[LSR]) );
  700.   mv_cs(0, r++, wnp); wn_printf(wnp, "MSR :%04x", inbyte(cp->uart[MSR]) );
  701.   outbyte(cp->uart[LCR], fmt | DLAB);
  702.   mv_cs(0, r++, wnp); wn_printf(wnp, "DLL :%04x", inbyte(cp->uart[DLL]) );
  703.   mv_cs(0, r++, wnp); wn_printf(wnp, "DLH :%04x", inbyte(cp->uart[DLH]) );
  704.   outbyte(cp->uart[LCR], fmt);
  705. }
  706. /*** end of dump_regs ***/
  707.  
  708. /**** END OF FILE ****/