www.pudn.com > wsc4c30.zip > MODEM.C


/* 
**  MODEM.C 
** 
**  Serial Device (modem, etc.) exerciser example program. 
** 
**  Note that flow control type must match between this program 
**  and the serial device. 
** 
*/ 
 
#define USECOMM 
 
#include  
 
#ifdef WIN32 
#define USE_INS HINSTANCE 
#define USE_PTR PSTR 
#else 
#define USE_INS HANDLE 
#define USE_PTR LPSTR 
#endif 
 
#include "modem.h" 
#include "message.h" 
#include "wsc.h" 
#include "ascii.h" 
#include "config.h" 
#include "paint.h" 
#include "line.h" 
#include "menu.h" 
#include "about.h" 
#include "sioerror.h" 
 
#define MENU_BAR_CHANGE 1 
 
/* public globals */ 
HWND hMainWnd;            /* main window handle */ 
HWND hInfoWnd;            /* popup handle */ 
USE_INS hInstance;         /* program instance */ 
int OnLineFlag = FALSE;   /* TRUE: online */ 
int FatalFlag = FALSE;    /* TRUE: fatal error */ 
char *Alpha = "TestABCDEFGHIJKLMNOPQRSTUVWXYZ\r\n"; 
char Temp[1024]; 
 
/* private globals */ 
 
static int WinWidth = 8 * NCOLS; 
static int WinHeight = 12 * NROWS + 48; 
 
/* miscellaneous functions */ 
 
void ErrorCheck(int); 
void ErrorMessage(char *); 
 
#ifdef WIN32 
int WINAPI 
#else 
int PASCAL 
#endif 
WinMain(USE_INS hInst,USE_INS hPrevInstance,USE_PTR lpCmdLine,int nCmdShow) 
{WNDCLASS  wc; 
 MSG msg; 
 BOOL Result; 
 if(!hPrevInstance) 
   {/* register main window class */ 
    wc.style = CS_HREDRAW | CS_VREDRAW; 
    wc.lpfnWndProc = MainWndProc; 
    wc.cbClsExtra = 0; 
    wc.cbWndExtra = 0; 
    wc.hInstance = hInst; 
    wc.hIcon = LoadIcon(hInst, "ModemIcon"); 
    wc.hCursor = LoadCursor(NULL, IDC_ARROW); 
    wc.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH); 
    wc.lpszMenuName =  "ModemMenu"; 
    wc.lpszClassName = "ModemWClass"; 
    Result = RegisterClass(&wc); 
    if(!Result) return FALSE; 
   } 
 
 /* create main window */ 
 hInstance = hInst; 
 hMainWnd = CreateWindow( 
        "ModemWClass",   "Modem",       WS_OVERLAPPEDWINDOW, 
        CW_USEDEFAULT,    CW_USEDEFAULT, 
        WinWidth,         WinHeight, 
        NULL,             NULL, 
        hInstance,        NULL); 
 ShowWindow(hMainWnd, nCmdShow); 
 UpdateWindow(hMainWnd); 
 
 /* window control loop */ 
 
 while(GetMessage(&msg,NULL,0,0)) 
   { 
    TranslateMessage(&msg); 
    DispatchMessage(&msg); 
   } 
 return (msg.wParam); 
} /* end WinMain */ 
 
#ifdef WIN32 
LRESULT CALLBACK 
#else 
long FAR PASCAL 
#endif 
MainWndProc(HWND hWindow,UINT iMsg,WPARAM wParam,LPARAM lParam) 
{int  i, n; 
 int  Count; 
 int  StatusWord; 
 HDC  hDC; 
 UINT idTimer; 
 PAINTSTRUCT ps; 
#ifdef WIN32 
#else 
 static FARPROC lpfnAboutDlgProc; 
#endif 
 static int ThePort; 
 
 hMainWnd = hWindow; 
 switch (iMsg) 
    {case WM_COMMAND: 
       switch(wParam) 
          {case MSG_ABOUT: 
#ifdef WIN32 
              DialogBox(hInstance,"AboutBox",hMainWnd,AboutDlgProc); 
#else 
              DialogBox(hInstance,"AboutBox",hMainWnd,lpfnAboutDlgProc); 
#endif 
              break; 
 
            case MSG_DEBUG: 
 
              break; 
 
            case MSG_TEST: 
              DisplayLine("Sending test string 'TestABCD...XYZ' 16 times"); 
              for(i=0;i<16;i++) SioPuts(ThePort,Alpha,32); 
              break; 
 
            case MSG_ONLINE: 
              if(FatalFlag) ErrorMessage("Fatal Error"); 
              else 
                {/* try to go on-line */ 
                 ThePort = GetPort(); 
                 GoOnLine(ThePort,GetBaud(),2048,512); 
                 SetTitle(); 
                 /* update menu settings */ 
                 CheckTheMenu(MSG_DTR_SET); 
                 CheckTheMenu(MSG_RTS_SET); 
                 UncheckTheMenu(MSG_HW_FLOW); 
                 UncheckTheMenu(MSG_SW_FLOW); 
                 CheckTheMenu(MSG_NO_FLOW); 
                 CheckTheMenu(MSG_ONLINE); 
                 UncheckTheMenu(MSG_OFFLINE); 
                 EnableTheMenu(MSG_OFFLINE); 
                 DisableTheMenu(MSG_ONLINE); 
                 DisableMenuBarItem(MENU_BAR_CHANGE); 
                 for(i=2;i<=5;i++) EnableMenuBarItem(i); 
                 DrawMenuBar(hMainWnd); 
                 if(!OnLineFlag) break; 
                } 
              break; 
 
            case MSG_OFFLINE: 
              GoOffLine(ThePort); 
              SetTitle(); 
              /* update menu settings */ 
              CheckTheMenu(MSG_OFFLINE); 
              UncheckTheMenu(MSG_ONLINE); 
              EnableTheMenu(MSG_ONLINE); 
              DisableTheMenu(MSG_OFFLINE); 
              EnableMenuBarItem(MENU_BAR_CHANGE); 
              for(i=2;i<=5;i++) DisableMenuBarItem(i); 
              DrawMenuBar(hMainWnd); 
              break; 
 
            case MSG_EXIT: 
              GoOffLine(ThePort); 
              KillTimer(hMainWnd,idTimer); 
              PostQuitMessage(0); 
              break; 
 
            case MSG_110: 
              SetBaud(WSC_Baud110); 
              break; 
 
            case MSG_300: 
              SetBaud(WSC_Baud300); 
              break; 
 
            case MSG_1200: 
              SetBaud(WSC_Baud1200); 
              break; 
 
            case MSG_2400: 
              SetBaud(WSC_Baud2400); 
              break; 
 
            case MSG_4800: 
              SetBaud(WSC_Baud4800); 
              break; 
 
            case MSG_9600: 
              SetBaud(WSC_Baud9600); 
              break; 
 
            case MSG_19200: 
              SetBaud(WSC_Baud19200); 
              break; 
 
            case MSG_38400: 
              SetBaud(WSC_Baud38400); 
              break; 
 
            case MSG_57600: 
              SetBaud(WSC_Baud57600); 
              break; 
 
            case MSG_COM1: 
              SetThePort(COM1); 
              break; 
 
            case MSG_COM2: 
              SetThePort(COM2); 
              break; 
 
            case MSG_COM3: 
              SetThePort(COM3); 
              break; 
 
            case MSG_COM4: 
              SetThePort(COM4); 
              break; 
 
            case MSG_NONE: 
              SetParity(WSC_NoParity); 
              break; 
 
            case MSG_EVEN: 
              SetParity(WSC_EvenParity); 
              break; 
 
            case MSG_ODD: 
              SetParity(WSC_OddParity); 
              break; 
 
            case MSG_1_SB: 
              SetStopBits(WSC_OneStopBit); 
              break; 
 
            case MSG_2_SB: 
              SetStopBits(WSC_TwoStopBits); 
              break; 
 
            case MSG_7_DB: 
              SetWordLength(WSC_WordLength7); 
              break; 
 
            case MSG_8_DB: 
              SetWordLength(WSC_WordLength8); 
              break; 
 
            case MSG_DTR_SET: 
              SioDTR(ThePort,'S'); 
              CheckTheMenu(MSG_DTR_SET); 
              UncheckTheMenu(MSG_DTR_CLR); 
              break; 
 
            case MSG_DTR_CLR: 
              SioDTR(ThePort,'C'); 
              CheckTheMenu(MSG_DTR_CLR); 
              UncheckTheMenu(MSG_DTR_SET); 
              break; 
 
            case MSG_RTS_SET: 
              SioRTS(ThePort,'S'); 
              CheckTheMenu(MSG_RTS_SET); 
              UncheckTheMenu(MSG_RTS_CLR); 
              break; 
 
            case MSG_RTS_CLR: 
              SioRTS(ThePort,'C'); 
              CheckTheMenu(MSG_RTS_CLR); 
              UncheckTheMenu(MSG_RTS_SET); 
              break; 
 
            case MSG_HW_FLOW: 
              SioFlow(ThePort,'H'); 
              CheckTheMenu(MSG_HW_FLOW); 
              UncheckTheMenu(MSG_SW_FLOW); 
              UncheckTheMenu(MSG_NO_FLOW); 
              DisplayLine("[Set serial device for HW flow control]"); 
              break; 
 
            case MSG_SW_FLOW: 
              SioFlow(ThePort,'S'); 
              CheckTheMenu(MSG_SW_FLOW); 
              UncheckTheMenu(MSG_HW_FLOW); 
              UncheckTheMenu(MSG_NO_FLOW); 
              DisplayLine("[Set serial device for SW flow control]"); 
              break; 
 
            case MSG_NO_FLOW: 
              SioFlow(ThePort,'N'); 
              CheckTheMenu(MSG_NO_FLOW); 
              UncheckTheMenu(MSG_HW_FLOW); 
              UncheckTheMenu(MSG_SW_FLOW); 
              break; 
 
            case MSG_STATUS: 
 
              StatusWord = SioStatus(ThePort, 0x0FFFF); 
#if 0 
              wsprintf((LPSTR)Temp,"Status = %xH", StatusWord); 
              DisplayLine(Temp); 
#endif 
              /* RX overflow ? */ 
              if((WSC_RXOVER & StatusWord) != 0) 
                DisplayLine("[Receive queue overflow]"); 
              /* TX overflow */ 
              if((WSC_TXFULL & StatusWord) != 0) 
                DisplayLine("[Transmit queue overflow]"); 
              /* Show RX queue size */ 
              n = SioRxQue(ThePort); 
              if(n>0) 
                {wsprintf((LPSTR)Temp,"[%d bytes in RX queue]",n); 
                 DisplayLine(Temp); 
                } 
              /* Show TX queue size */ 
              n = SioTxQue(ThePort); 
              if(n>0) 
                {wsprintf((LPSTR)Temp,"[%d bytes in TX queue size]",n); 
                 DisplayLine(Temp); 
                } 
              /* BREAK signal status */ 
              if(SioBrkSig(ThePort, 'D') > 0) DisplayLine("[BREAK detected]"); 
              /* DSR status */ 
              if(SioDSR(ThePort) > 0) DisplayLine("[DSR set]"); 
              else DisplayLine("[DSR clear]"); 
              /* CTS status */ 
              if(SioCTS(ThePort) > 0) DisplayLine("[CTS set]"); 
              else DisplayLine("[CTS clear]"); 
              /* DCD (Data Carrier Detect) status */ 
              if(SioDCD(ThePort) > 0) DisplayLine("[DCD set]"); 
              else DisplayLine("[DCD clear]"); 
 
              /*** This block is NOT for Win32 running under Windows NT ***/ 
#if 0 
              /* read all ports */ 
              for(i=0;i<7;i++) 
                {n = SioRead(ThePort,i); 
                 wsprintf((LPSTR)Temp,"Reg[%d] = 0x%x", i,n); 
                 DisplayLine((LPSTR)Temp); 
                } 
#endif 
              break; 
 
            default: 
              return (DefWindowProc(hMainWnd, iMsg, wParam, lParam)); 
           } 
         break; 
 
    case WM_CREATE: 
 
      /* check "OFFLINE" menu item */ 
      CheckTheMenu(MSG_OFFLINE); 
      DisableTheMenu(MSG_OFFLINE); 
      /* disable all but LINE & CHANGE */ 
      for(i=2;i<=5;i++) DisableMenuBarItem(i); 
#ifdef WIN32 
#else 
      /* create AboutDlgProc() thunk */ 
      lpfnAboutDlgProc = MakeProcInstance(AboutDlgProc, hInstance); 
#endif 
      /* initialize paint module */ 
      PaintInit(); 
      /* init configuration */ 
      CheckAll(); 
      CheckTheMenu(MSG_NO_FLOW); 
      UncheckTheMenu(MSG_HW_FLOW); 
      UncheckTheMenu(MSG_SW_FLOW); 
      SetText((LPSTR)"MODEM"); 
      SetTitle(); 
      /* start timer */ 
      idTimer = SetTimer(hMainWnd,1,125,NULL); 
      if(idTimer==0) 
         {ErrorMessage("No timers remaining !"); 
          FatalFlag = TRUE; 
         } 
      break; 
 
    case WM_CHAR: 
      SioPutc(ThePort, (char)wParam ); 
      break; 
 
    case WM_TIMER: 
      /* fatal error ? */ 
      if(FatalFlag) break; 
      if(!OnLineFlag) break; 
      /* fetch up to 1024 chars */ 
      Count = SioGets(ThePort,Temp,1024); 
      if(Count>0) WriteTheString(Temp,Count); 
      break; 
 
    case WM_SETFOCUS: 
      /* create client area caret */ 
      CreateCaret(hMainWnd,NULL,3,10); 
      SetCaretPos(PaintGetColPos(),PaintGetRowPos()); 
      ShowCaret(hMainWnd); 
      break; 
 
    case WM_KILLFOCUS: 
      DestroyCaret(); 
      break; 
 
    case WM_PAINT: 
      HideCaret(hMainWnd); 
      hDC = BeginPaint(hMainWnd, &ps); 
      SetMapMode(hDC,MM_ANISOTROPIC); 
      SelectObject(hDC, GetStockObject(OEM_FIXED_FONT) ); 
      PaintMain(hDC,&ps); 
      EndPaint(hMainWnd,&ps); 
      SetCaretPos(PaintGetColPos(),PaintGetRowPos()); 
      ShowCaret(hMainWnd); 
      break; 
 
    case WM_DESTROY: 
      GoOffLine(ThePort); 
      if(idTimer) KillTimer(hMainWnd,idTimer); 
      PostQuitMessage(0); 
      break; 
 
    default: 
      return (DefWindowProc(hMainWnd, iMsg, wParam, lParam)); 
   } 
 return 0; 
} /* end MainWndProc */ 
 
void ErrorCheck(int Code) 
{/* trap PCL error codes */ 
 if(Code<0) 
    {SioError(Code,"Sio Error"); 
     SioDone(GetPort()); 
     FatalFlag = TRUE; 
    } 
} 
 
void ErrorMessage(char *MsgPtr) 
{ 
 MessageBox(hMainWnd,MsgPtr,"ERROR",MB_ICONEXCLAMATION | MB_OK); 
}