wincomm.cpp

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

CPP
1,963
字号
         GetApplication()->MakeWindow (DispWindow[RXBUFFWINDOW]);
        }
       else
        {
//         if (lstrcmpi (GrName, DispWindow[RXBUFFWINDOW]->GraphName) != 0)
//             DispWindow[RXBUFFWINDOW]->ReplaceGraph (Text, GrName);
//           else if (Flag==2) DispWindow[RXBUFFWINDOW]->ReplaceGraph (Text, GrName);
//           else
            {
             if (IsIconic (DispWindow[RXBUFFWINDOW]->HWindow) != 0)
                 ShowWindow (DispWindow[RXBUFFWINDOW]->HWindow, SW_RESTORE);
             BringWindowToTop (DispWindow[RXBUFFWINDOW]->HWindow);
            }
        }
    }
 return TRUE;
}

// 菜单响应函数, 设置窗口背景颜色
void TMainWindow::CMUColor (RTMessage)
{
    CHOOSECOLOR ccTemp;

    ccTemp.lStructSize = sizeof (CHOOSECOLOR);
    ccTemp.hwndOwner = HWindow;
    ccTemp.hInstance = 0;
    ccTemp.rgbResult = BackColor;    // CC_RGBINIT flag makes this the default color
    ccTemp.lpCustColors = crTemp;
    ccTemp.Flags = CC_RGBINIT;
    ccTemp.lCustData = 0L;
    ccTemp.lpfnHook = NULL;
    ccTemp.lpTemplateName = NULL;

    if (ChooseColor (&ccTemp) == TRUE)
       {
        BackColor = ccTemp.rgbResult;

        // 刷新所有已存在的子窗口
        if (GetLastChild () != NULL)
           {
            PTWindowsObject CurrentIndex = GetFirstChild();
            if (CurrentIndex != NULL)
               {
                do
                 {
                  InvalidateRect (CurrentIndex->HWindow, NULL, TRUE);
                  CurrentIndex = CurrentIndex->Next ();
                 } while (CurrentIndex != GetLastChild());
                InvalidateRect (CurrentIndex->HWindow, NULL, TRUE);
               }
           }
       }
}

//======================================================================

void TMainWindow::WMLButtonDblClk (RTMessage)
{
/*
    if (pStatusWin)
       {
        BringWindowToTop (pStatusWin->HWindow);
	    ShowWindow (pStatusWin->HWindow, SW_RESTORE);
       }
      else
       {
        pStatusWin = new NodeStatusWindow (NULL, "Node Status");
        GetApplication ()->MakeWindow (pStatusWin);
        InvalidateRect (hNodeWnd, NULL, TRUE);
       }
*/
}

//------------------------------------------------------------------------------//
//定义状态行显示参数

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)};

void TMainWindow::Paint (HDC, PAINTSTRUCT&)
{
    if (IsIconic (HWindow) != 0)    return;

    HDC hDC = GetDC (HWindow);
    RECT rect;
    HBRUSH BkBrush[5];
    HBRUSH hOldBrush;

    hOldBrush = (HBRUSH)SelectObject (hDC, (HBRUSH)GetStockObject(LTGRAY_BRUSH));
    LOGPEN lpPen = {PS_SOLID, {1, 1}, RGB(128, 128, 128)};
    HPEN hGrayPen = CreatePenIndirect (&lpPen);
    HPEN hOldPen = (HPEN)SelectObject (hDC, hGrayPen);
    for (int i=0; i<5; i++) BkBrush[i] = CreateSolidBrush (StatusLineC[i]);

    Rectangle (hDC, MRect.left, MRect.top, MRect.right, MRect.bottom);

    SelectObject (hDC, (HPEN)GetStockObject(WHITE_PEN));
    MoveTo (hDC, MRect.left, MRect.top);
    LineTo (hDC, MRect.right, MRect.top);

    rect.left = 0;           rect.right = 0;
    rect.top = MRect.top+3;  rect.bottom = MRect.bottom-2;
    for (i=0; i<5; i++)
        {
         SelectObject(hDC, (HPEN)GetStockObject(BLACK_PEN));
         rect.left = rect.right+3;
         rect.right += StatusBarW[i];
         MoveTo (hDC, rect.right, rect.top);
         LineTo (hDC, rect.left, rect.top);
         LineTo (hDC, rect.left, rect.bottom-1);
         SelectObject(hDC, (HPEN)GetStockObject(WHITE_PEN));
         LineTo (hDC, rect.right, rect.bottom-1);
         LineTo (hDC, rect.right, rect.top-1);
//         SelectObject (hDC, hGrayPen);
         SelectObject (hDC, BkBrush[i]);
         Rectangle (hDC, rect.left+1, rect.top+1, rect.right, rect.bottom-1);
        }
    DrawStatusLine("", 0, MRect);

    for (i=0; i<5; i++) DeleteObject (BkBrush[i]);
    DeleteObject (hGrayPen);
    ReleaseDC (HWindow, hDC);

//    InvalidateRect (ClientWnd->HWindow, NULL, TRUE);
}

//-----------------------------------------------
void TMainWindow::WMCommand (RTMessage Msg)
{
    TMDIFrame::WMCommand (Msg);

    BOOL Flag = 0;
    switch (Msg.WParam)
      {
	  case 555:
		   Freq = GetFrequency()-1;
           WORD k, protono;
           for (int i=0; i<TotalChNum; i++)  
			   {
				if ((lpChannelParam+i)->CHValidFlag)
				{
/*
				if ((lpChannelParam+i)->MultiStation==88)	//一站多址
					{
						for (BYTE j=0;j<TotalStaNum;j++)
							{
								if ((lpStaParam+j)->PollCdt && (lpStaParam+j)->CurrUsedCh == i)
									{
										protono=(lpStaParam+j)->ProtoType;
										if (Protocal[protono].RxProc!=NULL)
											{
											(lpChannelParam+i)->StaNo=j;
											Protocal[protono].RxProc(HWindow, i, lpChannelParam, lpStaParam);
                                            }
									}
                            }

                    }
				else
*/
					{
						k=(lpChannelParam+i)->StaNo;
						if (k<TotalStaNum  &&  (lpStaParam+k)->CurrUsedCh == i && (lpChannelParam+i)->CHValidFlag)
                   			{
								protono=(lpStaParam+k)->ProtoType;
								if (Protocal[protono].RxProc!=NULL)
								Protocal[protono].RxProc(HWindow, i, lpChannelParam, lpStaParam);
				   			}
					}
				 }
                }
				WORD currentch;
           		if (ThisNodeName == MainFertName)  //如果本机是主机,则发送
              		{
               			for (i=0; i<TotalStaNum; i++)
                   			{
                    			currentch = (lpStaParam+i)->CurrUsedCh;
		    					if ((currentch != 0xffff) && (currentch<TotalChNum) && (lpChannelParam+currentch)->CHValidFlag)
                       				{
                        				protono=(lpStaParam+i)->ProtoType;
                        				if (Protocal[protono].TxProc!=NULL  && (lpChannelParam+currentch)->StaNo==i)
                            				{
                                                if (OdsFlag!=0)
                            					Protocal[protono].TxProc(HWindow, lpChannelParam+currentch, lpStaParam+i,i|0x80);
                            					else Protocal[protono].TxProc(HWindow, lpChannelParam+currentch, lpStaParam+i,i);
                            				}
                       				}
                   			} // end for 
               		} //end if 
		  break;
	  }
}

int initcount;
void ChkChStatus()
{            
 CHANNELPARAM FAR *chp = lpChannelParam;
 DWORD chst, chst1;
 EVENT eve;
 WORD FLAG;
 struct dosdate_t d;
 struct dostime_t t;
BYTE initflag=0,i,ii;
BYTE CommInitFlag=0;
initcount++;
BYTE cards=syscfg->GetCommCardNums();

for (i=1;i<=cards*8+2;i++)
    {
	    if (NetTestFlag && CommCount[i]>5 ) MessageBeep(0);
        if (CommPara[i-1].Used==0) continue;
        BYTE ChNum=CalChNum(i);
        if (CommCount[i]>30000l && CommPara[i-1].Used!=0 && (chp+ChNum)->CHType==1)
            {
                        if (idComDev[i]>=0) CloseComm(idComDev[i]);
                        if (InputCommMem[i]) GlobalFree(InputCommMem[i]);
                        if (OutputCommMem[i]) GlobalFree(OutputCommMem[i]);
                        InitOneComm(i);
//                        InitAllModem();
//                        for (int ii=0;ii<TotalChNum;ii++)    InitOneModem(ii);
            }
        if (ChNum<TotalChNum)
        if (CommCount[i]>50 && CommPara[i-1].Used!=0 && (chp+ChNum)->CHType==2)
            {
                    {
                        if (idComDev[i]>=0) CloseComm(idComDev[i]);
                        if (InputCommMem[i]) GlobalFree(InputCommMem[i]);
                        if (OutputCommMem[i]) GlobalFree(OutputCommMem[i]);
                        InitOneComm(i);
//                        InitAllModem();
//                        for (int ii=0;ii<TotalChNum;ii++)    InitOneModem(ii);
                    }
            }
    }

for (i=0;i<TotalChNum;i++)
	{
	if ((chp+i)->CHStatus&ChInit&&(initcount >=200)) //jgx 200
		{
			 if (HardwareInstallFlag[CTKBOARD] && initflag==0)
				{
                  initflag=1;                                         
				  CTKSIO FAR *lpCtkSioParam = (CTKSIO FAR *)GlobalLock(hCTKSIOMem);
				  StopCTK();
				  HardwareInstallFlag[CTKBOARD]=NULL;
				  HardwareInstallFlag[CTKBOARD]=InitialCTK(hMainWindow, lpChannelParam, lpCtkSioParam);
				  GlobalUnlock(hCTKSIOMem);
				}
		}
//	(chp+i)->RxWriteP=(chp+i)->RxReadP=0;//jgx //
    (chp+i)->CHStatus&=~ChInit;
	}
if (initflag==1)
	{
		initflag=0;
		initcount=0;
    }
 for (i=0; i<TotalChNum; i++)
     {
	  chst = (chp+i)->CHStatus;
      FLAG=0;
	  if ((chp+i)->ChangFlag&2) FLAG|=CommBreakFlag1;
	  if ((chp+i)->ChangFlag&4) FLAG|=CharInvFlag1;
	  if ((chp+i)->ChangFlag&8) FLAG|=NoSyncFlag1;
	  if ((chp+i)->ChangFlag&0x10) FLAG|=ErrDataFlag1;
	  if ((chp+i)->ChangFlag&0x20) FLAG|=NoTxFlag1;
	  if ((chp+i)->ChangFlag&0x40) FLAG|=OnlySyncFlag1;


/*********************************************************/
	  if ((chp+i)->ErrDataNum>=400)
		{
		  if ((chp+i)->ErrDataNum%400==0)
			{
				(chp+i)->CHStatus|=ErrDataFlag;
				chst|=ErrDataFlag;
				chst|=ChInit;
            }
		  if ((chp+i)->ErrDataNum>=410)
			{
				(chp+i)->ErrDataNum=0;
				(chp+i)->CHStatus&=~ErrDataFlag;
            }
		}
/*********************************************************/
	  (chp+i)->CHStatus &= ~(CommBreakFlag1+CharInvFlag1+NoSyncFlag1+OnlySyncFlag1+ErrDataFlag1+NoTxFlag1);
      if ((chp+i)->CHValidFlag && (chp+i)->CHCheckFlag)
         {
		  if ((chp+i)->CHStatus & CommBreakFlag) (chp+i)->CHStatus |= (CommBreakFlag1);
		  if ((chp+i)->CHStatus & CharInvFlag)   (chp+i)->CHStatus |= CharInvFlag1;
		  if ((chp+i)->CHStatus & NoSyncFlag)    (chp+i)->CHStatus |= (NoSyncFlag1);
		  if ((chp+i)->CHStatus & OnlySyncFlag)  (chp+i)->CHStatus |= OnlySyncFlag1; 
		  if ((chp+i)->CHStatus & ErrDataFlag)   (chp+i)->CHStatus |= ErrDataFlag1;  
		  if ((chp+i)->CHStatus & NoTxFlag)      (chp+i)->CHStatus |= NoTxFlag1;     
		  chst1 = (chp+i)->CHStatus^chst;
		  if (chst1 & (CommBreakFlag1+CharInvFlag1+NoSyncFlag1+OnlySyncFlag1+ErrDataFlag1+NoTxFlag1) & FLAG)
			 {
              chst = (chp+i)->CHStatus;
              eve.EventType = TDEVENT;
              eve.EventAttr = 0;
               if (!(chst & (CommBreakFlag1+CharInvFlag1+NoSyncFlag1+OnlySyncFlag1+ErrDataFlag1+NoTxFlag1) & FLAG))
//			   if (!(chst & CommBreakFlag1))
				 {eve.EventAttr |= TDHF;  goto Out;}  //通道恢复
				else if ((chst&CommBreakFlag1) && (chst1&CommBreakFlag1)) {eve.EventAttr |= TDZD; goto Out;}
				else if ((chst&CharInvFlag1) && (chst1&CharInvFlag1)) {eve.EventAttr |= TDZFWX; goto Out;}
				else if ((chst&NoSyncFlag1) && (chst1&NoSyncFlag1)) {eve.EventAttr |= TDSB;  goto Out;}
				else if ((chst&OnlySyncFlag1) && (chst1&OnlySyncFlag1)){ eve.EventAttr |= TDJTBZ; goto Out;}
				else if ((chst&ErrDataFlag1) && (chst1&ErrDataFlag1)){ eve.EventAttr |= TDWM; goto Out;}
				else if ((chst&NoTxFlag1) && (chst1&NoTxFlag1)) {eve.EventAttr |= TDKF;  goto Out;}
				else eve.EventAttr = 0;

Out:			  eve.Station = (chp+i)->StaNo;
              eve.Order = i;
              _dos_getdate(&d);
              _dos_gettime(&t);
			  eve.Hour = t.hour;
              eve.Min = t.minute;
              eve.Sec = t.second;
			  eve.Ms = 0;
//			  if ((eve.EventAttr&TDZD) || (eve.EventAttr&TDHF) ||(eve.EventAttr&TDSB)){eve.EventAttr=TDZD;WriteAEvent(EVENTDB, &eve);}
			 WriteAEvent(EVENTDB, &eve);
			 }

         }
	 }
	// shy 97.9.28
/*
 WORD stano, yxno;
 BYTE stastatus;
 for (i=0; i<TotalChNum; i++)
     {
      stano = (chp+i)->StaNo;
	  yxno = GetRcdNum(YXDB, stano);

      if ((chp+i)->CHValidFlag)
         {
          if ((chp+i)->CHStatus & (CommBreakFlag1+CharInvFlag1+NoSyncFlag1+OnlySyncFlag1+ErrDataFlag1+NoTxFlag1))
			  stastatus = 0;
            else
              stastatus = 1;
          if (yxno!=0)
             {
			  yxno--;
			  SetValue(YXDB, stano, yxno, (DWORD)stastatus);
             }
         }
     }
*/
 STATIONPARAM FAR *stp = lpStaParam;
 WORD yxno;
 WORD chno, stastatus;
 chp = lpChannelParam;

 for (i=0; i<TotalStaNum-1; i++)
     {
     if (!(stp+i)->DataToHost) continue;
      yxno = GetRcdNum(YXDB, i);
      chno = (stp+i)->CurrUsedCh;
      if (chno==0xffff || chno>TotalChNum) continue;

	  FLAG=0;
	  if ((chp+chno)->ChangFlag&2) FLAG|=CommBreakFlag1;
	  if ((chp+chno)->ChangFlag&4) FLAG|=CharInvFlag1;
	  if ((chp+chno)->ChangFlag&8) FLAG|=NoSyncFlag1;
	  if ((chp+chno)->ChangFlag&0x10) FLAG|=ErrDataFlag1;
	  if ((chp+chno)->ChangFlag&0x20) FLAG|=NoTxFlag1;
	  if ((chp+chno)->ChangFlag&0x40) FLAG|=OnlySyncFlag1;


	  stastatus=1;
	  if ((chno==0xffff) || !(chp+chno)->CHValidFlag)
	  		stastatus = 1;
	  else if ((chp+chno)->CHStatus & (CommBreakFlag1+CharInvFlag1+NoSyncFlag1+OnlySyncFlag1+ErrDataFlag1+NoTxFlag1) & FLAG)
			stastatus = 0;
	  if (yxno!=0 && chno!=0xffff) SetValue(YXDB, i, yxno-1, (DWORD)stastatus);//tzc

	//  if ((chp+chno)->CHStatus & (NoSyncFlag1))   initcount+=100;

	  // 如果当前通道状态是故障
	  if (stastatus==1 && (chp+chno)->CHCheckFlag)
		 {
			  if ( chno==(stp+i)->BackCh[0] ) chno = (stp+i)->BackCh[1];
    	      else chno = (stp+i)->BackCh[0];
			  if (chno!=0xffff && chno<TotalChNum)
				{
//					(chp+(stp+i)->CurrUsedCh)->CHStatus&=~(CommBreakFlag1+CharInvFlag1+NoSyncFlag1+OnlySyncFlag1+ErrDataFlag1+NoTxFlag1);
//					(chp+(stp+i)->CurrUsedCh)->CHStatus&=~(CommBreakFlag+CharInvFlag+NoSyncFlag+OnlySyncFlag+ErrDataFlag+NoTxFlag);
//					(chp+(stp+i)->CurrUsedCh)->CHStatus&=~ChOpen;
					(stp+i)->CurrUsedCh= chno;
					(chp+chno)->CHValidFlag=1;
					(chp+chno)->CHStatus|=ChInit;
					(chp+chno)->CHStatus|=ChOpen;
				}

⌨️ 快捷键说明

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