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