wincomm.cpp

来自「这是一个在正实际应用当中运行的电力监控系统软件源代码」· C++ 代码 · 共 1,963 行 · 第 1/5 页

CPP
1,963
字号
		 }
     }
}

void TMainWindow::MakeSystemPara ()
{
    WORD         i;
    LPBYTE       lb;
    HGLOBAL      hLogPal;
    HMENU        hMenu1;
    HRSRC        hRes;
    HFILE        hf;
    OFSTRUCT     OfS;

//    hChannelParamMem = GlobalAlloc (GMEM_NODISCARD|GMEM_MOVEABLE|GMEM_ZEROINIT, sizeof(CHANNELPARAM)*CHANNELMAXNUM);
    hChannelParamMem = GlobalAlloc (GMEM_NODISCARD|GMEM_MOVEABLE|GMEM_SHARE|GMEM_ZEROINIT, (DWORD)sizeof(CHANNELPARAM)*(CHANNELMAXNUM+1));
    if (!hChannelParamMem) MessageBox (HWindow, "", "Alloc Error", MB_OK);
//    hCTKSIOMem = GlobalAlloc (GMEM_NODISCARD|GMEM_MOVEABLE|GMEM_ZEROINIT, sizeof(CTKSIO));
    hCTKSIOMem = GlobalAlloc (GMEM_NODISCARD|GMEM_MOVEABLE|GMEM_SHARE|GMEM_ZEROINIT, sizeof(CTKSIO));
    if (!hCTKSIOMem) MessageBox (HWindow, "", "Alloc Error", MB_OK);
//    hMsgDataMem = GlobalAlloc (GMEM_SHARE|GMEM_NODISCARD|GMEM_MOVEABLE|GMEM_ZEROINIT, RDBMSGDATAMAXLEN);
    hMsgDataMem = GlobalAlloc (GMEM_NODISCARD|GMEM_MOVEABLE|GMEM_SHARE|GMEM_ZEROINIT, RDBMSGDATAMAXLEN);
	if (!hMsgDataMem) MessageBox (HWindow, "", "Alloc Error", MB_OK);
    lpMsgBuf = (char FAR *)GlobalLock(hMsgDataMem);

//    GlobalUnlock(hChannelParamMem);  //tzc--

    TotalStaNum = GetRcdNum(RTUDB, 0); 
//    hStaParamMem = GlobalAlloc (GMEM_NODISCARD|GMEM_MOVEABLE|GMEM_ZEROINIT, sizeof(STATIONPARAM)*TotalStaNum);
	hStaParamMem = GlobalAlloc (GMEM_NODISCARD|GMEM_MOVEABLE|GMEM_SHARE|GMEM_ZEROINIT, (DWORD)sizeof(STATIONPARAM)*TotalStaNum);
    if (!hStaParamMem)MessageBox (HWindow, "", "Alloc Error", MB_OK);
	lpStaParam = (STATIONPARAM FAR *)GlobalLock(hStaParamMem);
	for (int PARA=0;PARA<TotalStaNum;PARA++)
		{
			(lpStaParam+PARA)->SoeNum=0;
			(lpStaParam+PARA)->Soe[0].DATE=0;
			(lpStaParam+PARA)->Soe[1].DATE=1;
			(lpStaParam+PARA)->Soe[2].DATE=2;
        }
    syscfg->ReadData();
//读多串口卡参数
    FILE *f=fopen("c:\\tcz\\commcard.dat","rt");
    if (f!=NULL) fread(&CommPara[0],1,sizeof(COMMPARA)*80,f);
    else  for (int o=0;o<80;o++)
         {
            CommPara[o].COMMBAUD=3;
            CommPara[o].Used=FALSE;
            CommPara[o].CHANEL1=0;
            CommPara[o].CHANEL2=1;
         }
//  读CTK板初始化参数
    CTKSIO FAR *lpCtkSioParam = (CTKSIO FAR *)GlobalLock(hCTKSIOMem);
	hf = OpenFile ((LPSTR)"c:\\TCZ\\CTKSIO.dat", (LPOFSTRUCT)&OfS, OF_READ);

    if (hf != HFILE_ERROR)
       {
        _lread(hf, lpCtkSioParam, sizeof(CTKSIO));
        _lclose(hf);
       }
      else  
       {
        lpCtkSioParam->SIONum = 64;
        lpCtkSioParam->DataRSIrqNo = IRQ3;
        lpCtkSioParam->IntTimer1 = 2000;
        lpCtkSioParam->DataProcIrqNo = IRQ5;
        lpCtkSioParam->IntTimer2 = 33000l;
        for (int i=0; i<64; i++)
            {
             lpCtkSioParam->BaudRate[i] = 3072;
             lpCtkSioParam->SIOWriteReg[i][0] = 0x1818;
             lpCtkSioParam->SIOWriteReg[i][1] = 0x0104;
             lpCtkSioParam->SIOWriteReg[i][2] = 0x0200;
             lpCtkSioParam->SIOWriteReg[i][3] = 0x13d1;
             lpCtkSioParam->SIOWriteReg[i][4] = 0x0410;
             lpCtkSioParam->SIOWriteReg[i][5] = 0x15e8;
             lpCtkSioParam->SIOWriteReg[i][6] = 0x46eb;
             lpCtkSioParam->SIOWriteReg[i][7] = 0x8790;
            }
       }

// 读规约参数

    for (i=0; i<PROTOMAXNUM; i++)
        {
         Protocal[i].ProtoName[0] = '\0';
         Protocal[i].DllName[0] = '\0';
		 Protocal[i].hDLLInst = NULL;
         Protocal[i].RxProc = NULL;
         Protocal[i].TxProc = NULL;
        }
    FILE *fp = fopen((LPSTR)"c:\\TCZ\\PROTOCAL.dat", "rt");
    if (fp != NULL)
       {
        char EquName[50];
        do {
            fscanf (fp, "%s", EquName);
            if (strcmpi (EquName, "规约数:")==0 || strcmpi (EquName, "规约数:")==0)
               {
                fscanf (fp, "%d\n", &TotalProtoNum);
                break;
               }
              else TotalProtoNum=0;
           } while (!feof (fp));
        if (feof(fp) || !TotalProtoNum) fclose (fp);
          else
           {
            for (int i=0; i<TotalProtoNum; i++)
                {
		         char topchar[100];
        	     do {
		             fscanf (fp, "%s", topchar);
                    }while (topchar[0]!='@' && !feof(fp));
        		 fscanf (fp, "%s %s\n",  Protocal[i].ProtoName, Protocal[i].DllName);
                } /* end for */
            fclose (fp);
           } /* end else */
       }
      else  
        TotalProtoNum = 0;

// 读通道参数,并对通道进行初始化
       
    lpChannelParam = (CHANNELPARAM FAR *)GlobalLock(hChannelParamMem);
    hf = OpenFile ((LPSTR)"c:\\TCZ\\COMM.dat", (LPOFSTRUCT)&OfS, OF_READ);
    if (hf != HFILE_ERROR)
       {
        _lread(hf, (LPSTR)&TotalChNum, sizeof(WORD));
        if (TotalChNum>CHANNELMAXNUM) TotalChNum = CHANNELMAXNUM;
        _lread(hf, lpChannelParam, sizeof(CHANNELPARAM)*TotalChNum);
        _lclose(hf);
       }
      else
       {
        TotalChNum = CHANNELMAXNUM;
        for (int i=0; i<TotalChNum; i++)
            {
             (lpChannelParam+i)->CHValidFlag = 0;
             (lpChannelParam+i)->CHCheckFlag = 1;
             (lpChannelParam+i)->CHType = CTKBOARD;
             (lpChannelParam+i)->SIOOrd = i;
			 (lpChannelParam+i)->StaNo =0xffff;
			 (lpChannelParam+i)->RxBuffLen = 256; //jgx 256
			 (lpChannelParam+i)->TxBuffLen = 256; //jgx 256
             (lpChannelParam+i)->SyncWord[0] = 0xeb;
             (lpChannelParam+i)->SyncWord[1] = 0x90;
            }
       }
    int k;

typedef struct
{
BYTE SSTFlag,Retry,RepTimes,RANDOM0,RANDOM1,RANDOM2,Poll,PAFFLAG,TIME,SDBB,DRFTIME;
WORD PollOver;
}Flag;

    Flag *FLAG;

    for (i=0; i<TotalChNum; i++)
        {
         (lpChannelParam+i)->CHStatus = 0l|ChOpen;
         (lpChannelParam+i)->CHProcessFlag = 0l;
	     (lpChannelParam+i)->DownCmdSta = 0;
		 (lpChannelParam+i)->RxReadP = 0;
         (lpChannelParam+i)->RxWriteP = 0;
         (lpChannelParam+i)->hChRxBuff = NULL;
         (lpChannelParam+i)->RecBuff = NULL;
         (lpChannelParam+i)->TxReadP = 0;
         (lpChannelParam+i)->TxWriteP = 0;
         (lpChannelParam+i)->hChTxBuff = NULL;
		 (lpChannelParam+i)->SendBuff = NULL;
		 (lpChannelParam+i)->ErrDataNum=0;
         for (int j=0; j<256; j++) (lpChannelParam+i)->Reserved[j]=0;
         (lpChannelParam+i)->Reserved[92]=0x80;
         Flag *FLAG=(Flag *)((lpChannelParam+i)->Reserved+80);

         FLAG->PollOver=0x8000;

//            (lpChannelParam+i)->StaNo =0;
         if ((lpChannelParam+i)->CHValidFlag)
            {
//             (lpChannelParam+i)->hChRxBuff = GlobalAlloc (GMEM_NODISCARD|GMEM_MOVEABLE|GMEM_ZEROINIT,
//                                                          (lpChannelParam+i)->RxBuffLen);
             (lpChannelParam+i)->hChRxBuff = GlobalAlloc (GMEM_NODISCARD|GMEM_MOVEABLE|GMEM_SHARE|GMEM_ZEROINIT,
														  (lpChannelParam+i)->RxBuffLen);
//             (lpChannelParam+i)->hChTxBuff = GlobalAlloc (GMEM_NODISCARD|GMEM_MOVEABLE|GMEM_ZEROINIT,
//                                                          (lpChannelParam+i)->TxBuffLen);
             (lpChannelParam+i)->hChTxBuff = GlobalAlloc (GMEM_NODISCARD|GMEM_MOVEABLE|GMEM_SHARE|GMEM_ZEROINIT,
                                                          (lpChannelParam+i)->TxBuffLen);
             (lpChannelParam+i)->RecBuff = (BYTE FAR *)GlobalLock((lpChannelParam+i)->hChRxBuff);
             (lpChannelParam+i)->SendBuff = (BYTE FAR *)GlobalLock((lpChannelParam+i)->hChTxBuff);
            }
        }

// 站参数设置
    for (i=0; i<TotalStaNum; i++)
        {
         (lpStaParam+i)->BackCh[0] = -1;
         (lpStaParam+i)->CurrUsedCh = (lpStaParam+i)->BackCh[0];
         (lpStaParam+i)->BackCh[1] = -1;
         (lpStaParam+i)->ProtoType = 0;
         (lpStaParam+i)->DownCmdRP = 0;
         (lpStaParam+i)->DownCmdWP = 0;
        }
    hf = OpenFile ((LPSTR)"c:\\TCZ\\STADEF.dat", (LPOFSTRUCT)&OfS, OF_READ);
    if (hf != HFILE_ERROR)
       {
        _lread(hf, lpStaParam, sizeof(STATIONPARAM)*TotalStaNum);
        _lclose(hf);
       }
    for (i=0; i<TotalStaNum; i++)
        {
         (lpStaParam+i)->DownCmdRP = 0;
         (lpStaParam+i)->DownCmdWP = 0;
        }

    //将使用到的规约调入
	for (i=0; i<TotalStaNum; i++)
        {
         k=(lpStaParam+i)->ProtoType;
         if ((Protocal[k].hDLLInst==NULL))// && ((lpStaParam+i)->CurrUsedCh!=0xff))
            {
             Protocal[k].hDLLInst = LoadLibrary(Protocal[k].DllName);
			 if ((UINT)Protocal[k].hDLLInst >= 32)
                {
                 Protocal[k].RxProc=(RXPROC)GetProcAddress(Protocal[k].hDLLInst,"RxProc");
				 Protocal[k].TxProc=(TXPROC)GetProcAddress(Protocal[k].hDLLInst,"TxProc");
                }
            }
        }
	//将使用到的硬件串行口初始化
    for (i=0; i<TotalChNum; i++)
        {
         k=(lpChannelParam+i)->CHType;
         if (!HardwareInstallFlag[k])
            {
             switch (k)
              {
               case CTKBOARD:
					HardwareInstallFlag[k]=InitialCTK(HWindow, lpChannelParam, lpCtkSioParam);
                    break;
               case STANDRS232:
                    break;
               case MULTIRS232:
                    break;
               case OTHERSIO:
                    break;
              }
            }
        }
	GlobalUnlock(hCTKSIOMem);
}
void TMainWindow::FreeSystemPara ()
{
    WORD    i;

    for (i=0; i<TotalChNum; i++)
        {
         if ((lpChannelParam+i)->hChRxBuff) GlobalFree((lpChannelParam+i)->hChRxBuff);
         if ((lpChannelParam+i)->hChTxBuff) GlobalFree((lpChannelParam+i)->hChTxBuff);
        }
    while (GlobalFlags (hChannelParamMem)&GMEM_LOCKCOUNT) GlobalUnlock (hChannelParamMem);
    GlobalFree (hChannelParamMem);
    while (GlobalFlags (hCTKSIOMem)&GMEM_LOCKCOUNT) GlobalUnlock (hCTKSIOMem);
    GlobalFree (hCTKSIOMem);
    while (GlobalFlags (hStaParamMem)&GMEM_LOCKCOUNT) GlobalUnlock (hStaParamMem);
    GlobalFree (hStaParamMem);
    while (GlobalFlags (hMsgDataMem)&GMEM_LOCKCOUNT) GlobalUnlock (hMsgDataMem);
    GlobalFree (hMsgDataMem);

    for (i=0; i<PROTOMAXNUM; i++)
        {
         if ((UINT)Protocal[i].hDLLInst >= 32)
             FreeLibrary(Protocal[i].hDLLInst);
        }
}

//--------------------------------------------------------------------------
TTczApp::TTczApp (LPSTR AName, HINSTANCE hInstance, HINSTANCE hPrevInstance,
                  LPSTR lpCmdLine, int nCmdShow)
       : TApplication (AName, hInstance, hPrevInstance, lpCmdLine,
                        nCmdShow)
{
 //   hBlueBrush = CreateSolidBrush (GetSysColor (COLOR_ACTIVECAPTION));
//    hBlackBrush = CreateSolidBrush (RGB (0, 0, 0));
}



void TTczApp::InitInstance ()
{
    if (!hPrevInstance) {
        TApplication::InitInstance ();

        // 装入加速健表
//        HAccTable = LoadAccelerators (hInstance, "ACCELERATORS_1");
    }
}

void TTczApp::InitMainWindow ()
{
    MainWindow = new TMainWindow ();
}

void TTczApp::MessageLoop()
{
MSG msg;
while (GetMessage(&msg,NULL,NULL,NULL))
      {
      TranslateMessage(&msg);
      DispatchMessage(&msg);
      }
}

//extern char WndTitle[100];

int PASCAL WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    LPSTR lpCmdLine, int nCmdShow)
{
    if (!hPrevInstance) {
        while (SetMessageQueue (30) == 0) ;

        TTczApp MyApp ("通信处理系统", hInstance, hPrevInstance, lpCmdLine, nCmdShow);

        HINSTANCE hLib;
		hLib = LoadLibrary ("BWCC.DLL");
        if (hLib < (HINSTANCE)32)  return 0;

        // 生成窗口背景逻辑刷子
        HRSRC hrsrc = FindResource (hInstance, "BITMAP1", RT_BITMAP);
        HGLOBAL hglbl = LoadResource (hInstance, hrsrc);
        LockResource (hglbl);
        hBackgroundBrush = CreateDIBPatternBrush (hglbl, DIB_RGB_COLORS);

        MyApp.Run ();

        UnlockResource (hglbl);         // 删除窗口背景逻辑刷子
        DeleteObject (hBackgroundBrush);
        FreeLibrary (hLib);
        return (MyApp.Status);
    }
    else {
//        HWND hwnd = FindWindow ("MainWC", WndTitle);
//        BringWindowToTop (hwnd);
//        ShowWindow (hwnd, SW_RESTORE);
        return (0);
    }
}

//------------------------------------------------------------------//
void TSystemCfg::ReadData()
{
    BYTE nodeno;
    OFSTRUCT     OfS;

    HFILE hf = OpenFile ((LPSTR)"c:\\TCZ\\COMMCFG.dat", (LPOFSTRUCT)&OfS, OF_READ);
    if (hf != HFILE_ERROR)
       {
        _lread(hf, (LPSTR)syscfg, sizeof(TSystemCfg));
        _lclose(hf);
       }
      else
       {
        SetNode(0);
        SetNetProto(0);
        SetSysProto(1);
       }
}

void TSystemCfg::SaveData()
{
    BYTE nodeno;
    OFSTRUCT     OfS;

    HFILE hf = OpenFile ((LPSTR)"c:\\TCZ\\COMMCFG.dat", (LPOFSTRUCT)&OfS, OF_CREATE);
    if (hf != HFILE_ERROR)
       {
        _lwrite(hf, (LPSTR)syscfg, sizeof(TSystemCfg));
        _lclose(hf);
       }
}
//------------------------------------------------------------------//
void DrawStatusLine (LPSTR Str, LPSTR TypeName, RECT &rect)
{
	int StatusBarW[5]={100, 110, 90, 360, 137};
	COLORREF StatusLineC[5]={RGB(128,0,0), RGB(0,128,128), RGB(128,128,64), RGB(0,0,128),RGB(0,128,64)};
	char *myweek[7] ={"日","一","二","三","四","五","六"};
    char text[64];
    RECT r;
    struct dosdate_t d;
    struct dostime_t t;
    r=rect;
    HDC DC = GetDC (hMainWindow);
    r.top += 6;

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?