wincomm.cpp

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

CPP
1,963
字号
#include <windowsx.h>
#include <windows.h>
#include <owl.h>
#include <stdio.h>
#include <string.h>
#include <Dialog.h>
#include <commdlg.h>
#include "comm.h"
#include "tcp_win.h"//wyy++ for TCP_IP
#include "db.h"
#include "dbfile.h"
#include "def.h"
#include "wincomm.h"
//#include "cmdefs.h"
#include "ctkdll.h"
#include "commdlg.h"
#include "novell.h"
extern char Text[9];
char Pass[9];
static int AdjClkF;
#ifdef __cplusplus

   int min (int value1, int value2);
   int max (int value1, int value2);

   int min(int value1, int value2)
   {
      return ( (value1 < value2) ? value1 : value2);
   }

   int max(int value1, int value2)
   {
      return ( (value1 > value2) ? value1 : value2);
   }

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

typedef struct {
WORD    year;
WORD    month;
WORD    day;
WORD    hour;
WORD    min;
WORD    sec;
}Group;
// -------------------------------------
BYTE FAR PASCAL _export ByteRotate(BYTE srcbyte);
extern void         ProRcvData ();
//extern void         AddHostNode (BYTE);
extern void         DelHostNode (BYTE);
extern              ChangeHost ();
extern void         ReadScadaInf ();
extern int          AddClientName ();
extern void         DeletClientName ();
extern void         RcvDataGram (BYTE no);
extern void         SendFlag ();
void                InitNet ();
extern BYTE         GetMainHostName ();
extern BYTE         GetThisHostName ();
void                CancelNode (BYTE);
extern float FAR PASCAL _export       GetCoe(WORD,WORD,WORD);
extern void FAR PASCAL _export ZfProc();
extern void FAR PASCAL _export Calculate();
extern int FAR PASCAL _export GetSStation(WORD,BYTE);
extern int FAR PASCAL _export GetDStation(WORD,BYTE);
extern int FAR PASCAL _export GetSOrder(WORD,BYTE);
extern int FAR PASCAL _export GetDOrder(WORD,BYTE);
extern BYTE FAR PASCAL _export GetSymbol(WORD,BYTE);
extern BOOL InitAllComm();
extern BOOL InitAllModem();
extern BOOL InitOneComm(BYTE);
extern BOOL InitOneModem(BYTE);
extern HGLOBAL  InputCommMem[80];
extern HGLOBAL  OutputCommMem[80];
extern DWORD CommCount[80];
extern BYTE CalChNum(BYTE CommNo);
DWORD calsec(struct date,struct time);
DWORD    DayPeYear(DWORD);
DWORD    DayPeMonth(DWORD,DWORD);
Group Current(DWORD);
//extern float FAR PASCAL _export       GetYcLineCoe(WORD,WORD,WORD);
int QUIT = 0;
BYTE NetFlag=1;
int	idComDev[80];
COMMPARA   CommPara [80];
//-------------------------------------------------------------
// ------------------------------------------------------------------------
BYTE NetTestFlag=0,NetTestCount,OdsFlag=0;
extern void FAR PASCAL _export   SendPara(int);
HINSTANCE hInst;
HMENU     hMainMenu;
HWND      hMainWindow;
HBRUSH    hBackgroundBrush;

WORD TotalChNum, TotalProtoNum, TotalStaNum;
HGLOBAL   hCTKSIOMem = NULL, hChannelParamMem = NULL, hStaParamMem = NULL;
CHANNELPARAM FAR *lpChannelParam = NULL;
STATIONPARAM FAR *lpStaParam = NULL;

HGLOBAL   hMsgDataMem = NULL;
char FAR *lpMsgBuf = NULL;

int cnt3=0, cnt5=0;
WORD Freq;

int HardwareInstallFlag[HARDWAREMAXNUM]={0, 0, 0, 0};
PROTOCAL Protocal[PROTOMAXNUM];

static COLORREF crTemp[16];
COLORREF BackColor;

TSystemCfg *syscfg;
WORD hRdSysEvent;
WORD hRdSysCmd;

int CXScreen, CYScreen, ResolutionMode = 0;
PNodeStatusWindow  pStatusWin;
HWND            hNodeWnd;

void DrawStatusLine (LPSTR, LPSTR, RECT &);
void DispDIBitmap (HDC hDC, int X, int Y, LPSTR lpFileName);
void ChkChStatus(void);
//------------------------------------------------------------------------//
TMainWindow::TMainWindow ()
           : TMDIFrame ("TCZ通信处理系统", NULL)
{
    HDC hDC;
    int w, h;

    // 设置主窗口尺寸
    hDC = GetDC (HWindow);
    w = GetDeviceCaps (hDC, HORZRES);
    h = GetDeviceCaps (hDC, VERTRES);// - 30;
    ReleaseDC (HWindow, hDC);
//    Attr.X = 10;
//    Attr.Y = 30;
//    Attr.W = w - 20;
//    Attr.H = (17*Attr.W)/25;
//    Attr.H = Attr.H<h ? Attr.H:h;
    Attr.X = 0;
    Attr.Y = 0;
    Attr.W = 800;//w;
	Attr.H = 600;//h;
    Attr.Style |= WS_CLIPCHILDREN;

    hInst = GetApplication()->hInstance;
    hMenu = LoadMenu (hInst, "MainMenu");
    Attr.Id = (int)hMenu;
    hMainMenu = hMenu;

    syscfg = new TSystemCfg();
}

// 主窗口析构函数

TMainWindow::~TMainWindow()
{
  CancelNode (ThisNodeName);
	DeletClientName ();

	if (HardwareInstallFlag[CTKBOARD]) StopCTK();

    FreeSystemPara ();
    FreeReadHandle(EVENTDB, hRdSysEvent);
    FreeReadHandle(COMMANDDB, hRdSysCmd);
    delete (syscfg);
    KillTimer (HWindow, 1);
    KillTimer (HWindow, 2);
    KillTimer (HWindow, 3);
	KillTimer (HWindow, 4);
	KillTimer (HWindow, 5);
    for (int i=0;i<80;i++)
	    {
            CloseComm(idComDev[i]);
            if (InputCommMem[i]) GlobalFree(InputCommMem[i]);
            if (OutputCommMem[i]) GlobalFree(OutputCommMem[i]);
        }

}  

//----------------------------------------------------------------//
void TMainWindow::GetWindowClass (WNDCLASS _FAR & AWndClass)
{
    TWindow::GetWindowClass (AWndClass);
	AWndClass.hIcon = LoadIcon (GetApplication ()->hInstance, "COMMWIN");
    AWndClass.style|=CS_DBLCLKS;
}

//----------------------------------------------------------------//
BOOL TMainWindow::CanClose ()
{
  NetFlag=0;
  if (MessageBox(HWindow,"您想退出通讯处理系统吗?","信息提示",MB_YESNO|MB_ICONQUESTION|MB_DEFBUTTON2)==IDYES)
	 {//注意:请不要删除下一行BOX,因为她有特殊用用途  终止网络用来
        if (MessageBox(HWindow,"如果真的要退出,请您再选择一次 YES!","谢谢合作",MB_YESNO|MB_DEFBUTTON2|MB_ICONEXCLAMATION)==IDYES)
           return TRUE;
        else {NetFlag=1;return 0;}
     }
  else
     {
        NetFlag=1;
        return 0;
     }
}

void TMainWindow::SetupWindow ()
{
    TMDIFrame::SetupWindow ();

    // 显示提头对话框
//    TAboutWnd *HeadWindow = new TAboutWnd (this, 0);
//    HeadWindow->EnableAutoCreate ();
//    GetApplication()->MakeWindow (HeadWindow);
//    HeadWindow->Show (SW_SHOW);

//    BarWindow = HWindow;

    // 装入提示杆点位图
//    bmpStatusBar = LoadBitmap (GetApplication()->hInstance, MAKEINTRESOURCE(BMP_STATUS_BAR));

    hMainWindow = HWindow;

    for (int i=0; i<16; i++)    crTemp[i] = RGB (255, 255, 255);
    BackColor = RGB(192,192,192);//RGB (113, 158, 170);

    for (i=0; i<WNDTYPEMAXNUM; i++) DispWindow[i]=0;
    MultiWindowFlag = 1;

    MakeSystemPara ();
    hRdSysEvent = GetReadHandle(EVENTDB);
    hRdSysCmd = GetReadHandle(COMMANDDB);

	HFILE hFile;
	OFSTRUCT ofstruct;
	if((hFile=OpenFile("c:\\tcz\\pass.dat",&ofstruct,OF_READ))==HFILE_ERROR)   
	  {
       strcpy(Pass,"TCZ");
      }
	 else
     {
	 _lread(hFile,Pass,9);
     Pass[8]=0;
     _lclose(hFile);
     }
	if (!SetTimer (HWindow, 1, 500U, NULL))
        MessageBox (HWindow, "设置系统定时器错误!", "系统警告", MB_OK|MB_ICONSTOP);

    ThisNodeName='A'+syscfg->GetNode();  //ThisNodeName;
    InitNet() ; 
//start net
//wyy++ for tcp_ip protocl
if(syscfg->GetNetProto()==0){
 //++wyy
                            
	DeletClientName ();     
    if (!AddClientName ())
        MessageBox (HWindow, "Add Client Name Error!", "Netbios", MB_ICONEXCLAMATION | MB_OK);
      else
       {
        for (int i=0; i<6; i++)  RcvDataGram (i);
       }
   if (ThisNodeName=='A')
       {
        SwitchToMain();
        SendFlag();
	   }
}

//wyy++ for tcp_ip protocl

  else if(syscfg->GetNetProto()==1)
       {
         if (ThisNodeName=='A')
           {
            SwitchToMain();
            SendFlag();
	       }

       }
//++wyy
InitTcpWin(this);
if(syscfg->GetNetProto()!=1) ShowWindow(pTcpWin->HWindow,SW_HIDE);
else ShowWindow(pTcpWin->HWindow,SW_MINIMIZE);

    if (!SetTimer (HWindow, 2, 55U, NULL))
		MessageBox (HWindow, "Too Many Timers", "NOVELL", MB_ICONEXCLAMATION | MB_OK);
    if (!SetTimer (HWindow, 3, 2000U, NULL))
        MessageBox (HWindow, "Too Many Timers", "NOVELL", MB_ICONEXCLAMATION | MB_OK);
	if (!SetTimer (HWindow, 4, 200U, NULL))
        MessageBox (HWindow, "Too Many Timers", "NOVELL", MB_ICONEXCLAMATION | MB_OK);
    if (syscfg->GetYcSelect()&0xf ==0)
       {
           if (!SetTimer (HWindow, 5,100U, NULL))
               MessageBox (HWindow, "Too Many Timers", "NOVELL", MB_ICONEXCLAMATION | MB_OK);
       }

//1997.9.19
	CXScreen = GetSystemMetrics (SM_CXSCREEN);
	CYScreen = GetSystemMetrics (SM_CYSCREEN);
/*tzm
    pStatusWin = new NodeStatusWindow (NULL, "Node Status");
	if (pStatusWin) {
		GetApplication ()->MakeWindow (pStatusWin);
        InvalidateRect (hNodeWnd, NULL, TRUE);
    }
	else MessageBox (HWindow, "creat Node Status error", "error", MB_OK);
	BringWindowToTop (HWindow);
*/
//1997.9.19
    //发对钟命令
	//PostMessage (HWindow, WM_ADJUSTCLOCK, 0, 0L);
    
	ShowWindow (HWindow, SW_SHOW);

    InitAllComm();
    GetApplication()->MakeWindow(new TCommWindow(NULL));
    InitAllModem();
	for (int ii=0;ii<TotalChNum;ii++)    InitOneModem(ii);
	//AdjClkF=1;
	PostMessage (HWindow, WM_COMMAND, IDM_SETTIME, 0L);
}

void TMainWindow::WMNodeSwitch (RTMessage)
{
 ThisNodeName = 'A' + syscfg->GetNode();
 if (ThisNodeName==MainFertName) SwitchToMain();
}

/*void TMainWindow::WMAdjustClock (RTMessage)
{
 BYTE wp;
 
 if (ThisNodeName == MainFertName)
    {
     for (int i=0; i<TotalStaNum; i++)
         {
          wp = (lpStaParam+i)->DownCmdWP;
          if (((wp+1)&3) != (lpStaParam+i)->DownCmdRP)
             {
              (lpStaParam+i)->DownCmd[wp].Cmd[0] = DCMDSST;
              (lpStaParam+i)->DownCmd[wp].Cmd[1] = i%256;  //rtu号
			  (lpStaParam+i)->DownCmd[wp].Cmd[2] = i/256;  //rtu号
              (lpStaParam+i)->DownCmdWP = (wp+1)&3;
             }
         }
    }
}*/

//tzc add
void TMainWindow::SystemZF (RTMessage Msg)
{
		HWND HWndDBMS1=FindWindow (NULL,"转发管理");
        HWND HWndDBMS=FindWindow (NULL,"数据库管理");
        if (HWndDBMS!=NULL) {MessageBox(0,"数据库管理模块在运行","信息提示",MB_OK);return;}
        if (HWndDBMS1!=NULL)
           {
            BringWindowToTop (HWndDBMS1);
            ShowWindow (HWndDBMS, SW_SHOWMAXIMIZED);
           }
          else if (HWndDBMS1==NULL)
		   WinExec ("c:\\tcz\\dm\\zf.exe",SW_SHOWNORMAL);//SW_SHOWMAXIMIZED);
}
void TMainWindow::SystemPara (RTMessage Msg)
{
        HWND HWndDBMS1=FindWindow(NULL,"转发管理");
		HWND HWndDBMS=FindWindow (NULL,"数据库管理");
        if (HWndDBMS1!=NULL) {MessageBox(0,"转发管理模块在运行","信息提示",MB_OK);return;}
        if (HWndDBMS!=NULL)
           {
            BringWindowToTop (HWndDBMS);
            ShowWindow (HWndDBMS, SW_SHOWMAXIMIZED);
           }
          else if(HWndDBMS==NULL)
		   WinExec ("c:\\tcz\\dm\\xm1.exe",SW_SHOWNORMAL);//SW_SHOWMAXIMIZED);
}
static int AdjustT;
void TMainWindow::WMTimer (RTMessage Msg)
{
  switch (Msg.WParam)
    {
     case 1:  // 1 Second Timer
          DrawStatusLine("", 0, MRect);
          WORD tt;
          for (int i=0; i<TotalStaNum; i++)
              {
               tt=GetTimerValue(RTUDB, i);
               if (tt) SetTimerValue(RTUDB, i, tt-1);
              }

⌨️ 快捷键说明

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