From b94f3d2cf3134a7fbcf41e7348fdf9d8c993da52 Mon Sep 17 00:00:00 2001 From: TAO Cheng Date: Tue, 11 Nov 2014 20:02:14 +0800 Subject: [PATCH] TCPIP SERVER --- .hgignore | 1 + .../Msi/Hsi/STIL/STIL_CCS_PRIMA_Laser.cpp | 16 +-- .../Interfac/Msi/Hsi/SevenOcean/So7_TCPIP.cpp | 13 ++- .../Msi/Hsi/SevenOcean/So7_TCPIP_Server.cpp | 50 +++++++--- .../Msi/Hsi/SevenOcean/So7_TCPIP_Server.h | 17 +++- .../Hsi/Tools/UsbUtility/UsbUtil/Mv_Util.rc | 42 ++++---- .../UsbUtility/UsbUtil/So7_Util_PLC_TCPIP.cpp | 62 ++++++++++-- .../UsbUtility/UsbUtil/So7_Util_PLC_TCPIP.h | 2 + .../UsbUtil/So7_Util_PLC_TCPIP_SERVER.cpp | 81 +++++++++++++--- .../UsbUtil/So7_Util_PLC_TCPIP_SERVER.h | 3 +- .../Tools/UsbUtility/UsbUtil/Usb_Util.vcxproj | 91 ++++++++++++++++++ .../Hsi/Tools/UsbUtility/UsbUtil/resource.h | 5 +- .../Hsi/Tools/UsbUtility/UsbUtil_VS2010.sln | 29 ++++++ .../Hsi/Tools/UsbUtility/UsbUtil_VS2010.suo | Bin 159744 -> 159744 bytes 14 files changed, 345 insertions(+), 67 deletions(-) diff --git a/.hgignore b/.hgignore index c2d4e26..937f4dd 100644 --- a/.hgignore +++ b/.hgignore @@ -42,3 +42,4 @@ PcDmis/Base/Interfac/Msi/Hsi/Videocard/TC4000/V6.0 PcDmis/Base/Interfac/Msi/Hsi/Videocard/TC4000/V7.5 PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/ConsoleTestDll/bin PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/ConsoleTestDll/obj +PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/DebugS07/ diff --git a/PcDmis/Base/Interfac/Msi/Hsi/STIL/STIL_CCS_PRIMA_Laser.cpp b/PcDmis/Base/Interfac/Msi/Hsi/STIL/STIL_CCS_PRIMA_Laser.cpp index 74fddb4..481ad3b 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/STIL/STIL_CCS_PRIMA_Laser.cpp +++ b/PcDmis/Base/Interfac/Msi/Hsi/STIL/STIL_CCS_PRIMA_Laser.cpp @@ -4,14 +4,14 @@ CSTIL_CCS_PRIMA_Laser::CSTIL_CCS_PRIMA_Laser() { -#ifdef _DEBUG +#ifdef _RELEASE_FULL_VERSION ResetParam(); #endif //_DEBUG } CSTIL_CCS_PRIMA_Laser::~CSTIL_CCS_PRIMA_Laser(void) { -#ifdef _DEBUG +#ifdef _RELEASE_FULL_VERSION if (m_SensorId != 0) { CloseCom (); @@ -23,7 +23,7 @@ CSTIL_CCS_PRIMA_Laser::~CSTIL_CCS_PRIMA_Laser(void) BOOL CSTIL_CCS_PRIMA_Laser::Init(int _Mode) { BOOL bStatus(FALSE); -#ifdef _DEBUG +#ifdef _RELEASE_FULL_VERSION ResetParam(); switch(_Mode) { @@ -52,7 +52,7 @@ BOOL CSTIL_CCS_PRIMA_Laser::Init(int _Mode) BOOL CSTIL_CCS_PRIMA_Laser::Exit() { BOOL bStatus(FALSE); -#ifdef _DEBUG +#ifdef _RELEASE_FULL_VERSION bStatus=ReleaseAcquisition(); if (m_SensorId != 0) { @@ -69,7 +69,7 @@ BOOL CSTIL_CCS_PRIMA_Laser::SetMeasureMode(int _MeasureMode) { case 0: { -#ifdef _DEBUG +#ifdef _RELEASE_FULL_VERSION double refractiveIndex = 1.5120; SetRefractiveIndex (refractiveIndex); int numberOfPointTRE(1); @@ -88,7 +88,7 @@ BOOL CSTIL_CCS_PRIMA_Laser::SetMeasureMode(int _MeasureMode) BOOL CSTIL_CCS_PRIMA_Laser::GetDistance(double &_dDis1, double &_dDis2) { BOOL bStatus(FALSE); -#ifdef _DEBUG +#ifdef _RELEASE_FULL_VERSION double dbThickness(0.0),dblDistance1(0.0),dblDistance2(0.0),dblIntensity1(0.0),dblIntensity2(0.0); bool bSoftTrigger(true); bStatus=GetThicknessValue(dbThickness,dblDistance1,dblDistance2,dblIntensity1,dblIntensity2,bSoftTrigger); @@ -104,7 +104,7 @@ BOOL CSTIL_CCS_PRIMA_Laser::GetDistance(double &_dDis1, double &_dDis2) BOOL CSTIL_CCS_PRIMA_Laser::GetThicknessAllData(double &dbThickness, double &dblDistance1, double &dblDistance2, double &dblIntensity1, double &dblIntensity2) { BOOL bStatus(FALSE); -#ifdef _DEBUG +#ifdef _RELEASE_FULL_VERSION bool bSoftTrigger(true); bStatus=GetThicknessValue(dbThickness,dblDistance1,dblDistance2,dblIntensity1,dblIntensity2,bSoftTrigger); #else @@ -116,7 +116,7 @@ BOOL CSTIL_CCS_PRIMA_Laser::GetThicknessAllData(double &dbThickness, double &dbl #endif //_DEBUG return bStatus; } -#ifdef _DEBUG +#ifdef _RELEASE_FULL_VERSION //================================================================ void CSTIL_CCS_PRIMA_Laser::ResetParam() { diff --git a/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/So7_TCPIP.cpp b/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/So7_TCPIP.cpp index 9a0f724..6913b2a 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/So7_TCPIP.cpp +++ b/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/So7_TCPIP.cpp @@ -499,16 +499,21 @@ void CSo7_TCPIP::m_ProcessSocketReadEvent(SOCKET s) { int _BufferSize(0); BYTE _bData[4]={0,0,0,0}; + _bData[0]=static_cast(m_TCPIPBuf[CH_RECV]._buffer[DRW_RSDataIndexBufSize1]); + _bData[1]=static_cast(m_TCPIPBuf[CH_RECV]._buffer[DRW_RSDataIndexBufSize2]); - _BufferSize=static_cast(static_cast(m_TCPIPBuf[CH_RECV]._buffer[DRW_RSDataIndexBufSize2])); + _BufferSize=static_cast((_bData[0]<<8)+_bData[1]); _BufferSize-=DRW_RDataCCLen; m_TCPIPData.s_recv_data._DataSize=0; - for (int i=0;i<_BufferSize;i+=4) + for (int i=0;i<_BufferSize;i+=2) { _bData[0]=static_cast(m_TCPIPBuf[CH_RECV]._buffer[DRW_RDataIndexData+i]); _bData[1]=static_cast(m_TCPIPBuf[CH_RECV]._buffer[DRW_RDataIndexData+i+1]); - _bData[2]=static_cast(m_TCPIPBuf[CH_RECV]._buffer[DRW_RDataIndexData+i+2]); - _bData[3]=static_cast(m_TCPIPBuf[CH_RECV]._buffer[DRW_RDataIndexData+i+3]); + //_bData[2]=static_cast(m_TCPIPBuf[CH_RECV]._buffer[DRW_RDataIndexData+i+2]); + //_bData[3]=static_cast(m_TCPIPBuf[CH_RECV]._buffer[DRW_RDataIndexData+i+3]); + + _bData[2]=0; + _bData[3]=0; m_TCPIPData.s_recv_data._lData[m_TCPIPData.s_recv_data._DataSize]=static_cast(+(_bData[2]<<24)+(_bData[3]<<16)+(_bData[0]<<8)+(_bData[1])); m_TCPIPData.s_recv_data._DataSize++; } diff --git a/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/So7_TCPIP_Server.cpp b/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/So7_TCPIP_Server.cpp index 4f935af..5e2f1a0 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/So7_TCPIP_Server.cpp +++ b/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/So7_TCPIP_Server.cpp @@ -33,12 +33,14 @@ const int DRW_RSDataIndexBufSize2=7; struct_so7_tcpip_buff CSo7_TCPIP_Server::m_TCPIPBuf[lChannelSize]; +s_tcpip_state CSo7_TCPIP_Server::m_TCPIPServerState; //================================================================ CSo7_TCPIP_Server::CSo7_TCPIP_Server() { m_hMsgWnd=NULL; + m_ServerStarted=FALSE; m_Socket=INVALID_SOCKET; m_SreverIPAddress; m_iServerPortNumber=static_cast(0); @@ -93,6 +95,10 @@ int CSo7_TCPIP_Server::Init_Winsock() //================================================================ BOOL CSo7_TCPIP_Server::StartServer(HWND _hWnd,short _nPort) { + if (m_ServerStarted) + { + return FALSE; + } int retVal=Init_Winsock(); retVal=Init_Winsock(); if(!retVal) @@ -102,7 +108,10 @@ BOOL CSo7_TCPIP_Server::StartServer(HWND _hWnd,short _nPort) m_iServerPortNumber=_nPort; GetHostIPAddr(m_SreverIPAddress); m_hMsgWnd=_hWnd; - CreateAndListen(); + if (CreateAndListen()) + { + m_ServerStarted=TRUE; + } return TRUE; } //================================================================ @@ -112,9 +121,13 @@ BOOL CSo7_TCPIP_Server::StopServer() { return TCPIP_INVAILD_SOCKET; } - closesocket(m_Socket); - m_Socket = INVALID_SOCKET; - return TCPIP_CONNECT_OK; + if (m_ServerStarted) + { + CloseAllSocket(); + closesocket(m_Socket); + m_Socket = INVALID_SOCKET; + } + return TRUE; } //================================================================ BOOL CSo7_TCPIP_Server::GetHostIPAddr(in_addr& _IPAddress) @@ -135,7 +148,7 @@ BOOL CSo7_TCPIP_Server::GetHostIPAddr(in_addr& _IPAddress) first = FALSE; } _IPAddress=m_SreverIPAddress; - return TCPIP_CONNECT_OK; + return TRUE; } //================================================================ BOOL CSo7_TCPIP_Server::CreateAndListen() @@ -246,6 +259,7 @@ BOOL CSo7_TCPIP_Server::Response_Handshake() } m_ClearSendBuf(); memcpy(m_TCPIPBuf[CH_SEND]._buffer,HandShaking,sizeof(HandShaking)); + m_TCPIPBuf[CH_SEND]._size=sizeof(HandShaking); SendBuffer(); return TRUE; } @@ -266,6 +280,7 @@ BOOL CSo7_TCPIP_Server::Response_PLC_State(short _datasize) m_TCPIPBuf[CH_SEND]._buffer[DRW_SDataIndexData+2*i+1]=iData & 0x0ff; } m_TCPIPBuf[CH_SEND]._buffer[DRW_SDataIndexDataSize]=static_cast(DRW_SDataIndexData+2*_datasize); + m_TCPIPBuf[CH_SEND]._size=sizeof(HandShaking); SendBuffer(); @@ -286,6 +301,8 @@ BOOL CSo7_TCPIP_Server::Response_Sensor_State(short _datasize) m_TCPIPBuf[CH_SEND]._buffer[DRW_SDataIndexData+i]=m_TCPIPServerState._PLCSensorState[i]; } m_TCPIPBuf[CH_SEND]._buffer[DRW_SDataIndexDataSize]=static_cast(DRW_SDataIndexData+2*_datasize); + m_TCPIPBuf[CH_SEND]._size=DRW_SDataIndexData+2*_datasize; + SendBuffer(); return TRUE; @@ -309,6 +326,8 @@ BOOL CSo7_TCPIP_Server::Response_CCD_DATA(short _Addr,short _datasize) } m_TCPIPBuf[CH_SEND]._buffer[DRW_SDataIndexDataSize]=static_cast(DRW_SDataIndexData+2*_datasize); + m_TCPIPBuf[CH_SEND]._size=DRW_SDataIndexData+2*_datasize; + SendBuffer(); return TRUE; @@ -321,6 +340,7 @@ BOOL CSo7_TCPIP_Server::_Send_Cmd_Write_State() return FALSE; } m_ClearSendBuf(); + m_TCPIPBuf[CH_SEND]._size=0; SendBuffer(); @@ -488,11 +508,14 @@ void CSo7_TCPIP_Server::m_ProcessSocketReadEvent(SOCKET s) } m_TCPIPBuf[CH_RECV]._CompletedSize += bytesReceived; m_TCPIPBuf[CH_RECV]._size = m_TCPIPBuf[CH_RECV]._CompletedSize; + int iPara(0); + if (strstr(m_TCPIPBuf[CH_RECV]._buffer, "FINS")) { if (m_TCPIPBuf[CH_RECV]._buffer[7]==0x0C)//handshake { Response_Handshake(); + iPara=RESPONSE_HANDSHAKE; } else if (m_TCPIPBuf[CH_RECV]._buffer[DRW_RDataIndexCMD1]==0x01 &&m_TCPIPBuf[CH_RECV]._buffer[DRW_RDataIndexCMD2]==0x01) @@ -501,29 +524,30 @@ void CSo7_TCPIP_Server::m_ProcessSocketReadEvent(SOCKET s) short iDataSize=(m_TCPIPBuf[CH_RECV]._buffer[DRW_RDataIndexCh1]<<8)+m_TCPIPBuf[CH_RECV]._buffer[DRW_RDataIndexCh2]; if (iAddr>=20000) { - ;//errcode + iPara=RESPONSE_READ_ERRCODE; } else if (iAddr>=10000) { - Response_CCD_DATA((iAddr-10060),iDataSize);//ccd data + Response_CCD_DATA((iAddr-10060),iDataSize); + iPara=RESPONSE_READ_CCD_DATA; } else if (iAddr>=8000) - { - Response_PLC_State(1);//WRITE PLC STATE + { + iPara=RESPONSE_WRITE_PLC_STATE; } else if (iAddr>=5000) { - ;//READ PLC STATE - + Response_PLC_State(1); + iPara=RESPONSE_READ_PLC_STATE; } else { - ; + iPara=RESPONSE_UNKNOWN; } } } m_TCPIPBuf[CH_RECV]._CompletedSize = 0; m_TCPIPBuf[CH_RECV]._hProtoPending=FALSE; - ::PostMessage(m_hMsgWnd,WM_TCPIP_MSG,FD_READ,0); + ::PostMessage(m_hMsgWnd,WM_TCPIP_MSG,FD_READ,iPara); } diff --git a/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/So7_TCPIP_Server.h b/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/So7_TCPIP_Server.h index 9d8293e..ed24d31 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/So7_TCPIP_Server.h +++ b/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/So7_TCPIP_Server.h @@ -40,6 +40,19 @@ enum OMRON_PLC_SENSOR OMRON_PLC_LASER5_HEADB, OMRON_PLC_SENSOR_TOTAL=PLC_MAX_SENSOR_STATE }; + +enum TCPIP_RESPONSE_RESULT +{ + RESPONSE_UNKNOWN=0, + RESPONSE_HANDSHAKE, + RESPONSE_READ_PLC_STATE, + RESPONSE_WRITE_PLC_STATE, + RESPONSE_READ_SENSOR_STATE, + RESPONSE_READ_CCD_DATA, + RESPONSE_READ_ERRCODE, + RESPONSE_RESULT +}; + struct s_tcpip_state { TCPIP_RETURN_CODE _SendReturnCode; @@ -79,7 +92,7 @@ public: virtual ~CSo7_TCPIP_Server(); static struct_so7_tcpip_buff m_TCPIPBuf[lChannelSize]; - s_tcpip_state m_TCPIPServerState; + static s_tcpip_state m_TCPIPServerState; int m_CCDData[MAX_CCD_ADDR]; BOOL StartServer(HWND _hWnd,short _nPort); @@ -94,7 +107,7 @@ public: LRESULT OnSocket(WPARAM wParam, LPARAM lParam); private: HWND m_hMsgWnd; - + BOOL m_ServerStarted; SOCKET m_Socket; SOCKET m_ClientSocket[MAX_SOCKET]; int m_nClients; diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Mv_Util.rc b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Mv_Util.rc index 8797031..8267414 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Mv_Util.rc +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Mv_Util.rc @@ -1038,27 +1038,31 @@ BEGIN PUSHBUTTON "ĬÈϲÎÊý",IDC_BUTTON_MV900_DEFAULT_PARA,520,130,53,14 END -IDD_SO7_UTIL_PLC_TCPIP DIALOGEX 0, 0, 338, 251 +IDD_SO7_UTIL_PLC_TCPIP DIALOGEX 0, 0, 432, 269 STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "PLC TCP/IP " FONT 8, "MS Shell Dlg", 400, 0, 0x1 BEGIN - PUSHBUTTON "Exit",IDCANCEL,292,230,39,14 - GROUPBOX "TCP/IP Control",IDC_STATIC,17,12,87,81 - PUSHBUTTON "Connect",IDC_BUTTON_PLC_TCPIP_CONNECT,28,28,63,18 - PUSHBUTTON "Disconnect",IDC_BUTTON_PLC_TCPIP_DISCONNECT,28,70,63,18 - EDITTEXT IDC_EDIT_MSG,19,97,265,130,ES_MULTILINE | ES_AUTOVSCROLL | ES_WANTRETURN | WS_VSCROLL - PUSHBUTTON "Clear",IDC_BUTTON_PLC_TCPIP_CLEAR_MSG,289,156,39,14 - PUSHBUTTON "Read Data",IDC_BUTTON_PLC_TCPIP_READ,203,30,63,18 - PUSHBUTTON "Write Data",IDC_BUTTON_PLC_TCPIP_WRITE,203,62,63,18 - GROUPBOX "TCP/IP Control",IDC_STATIC,110,12,174,81 - EDITTEXT IDC_EDIT_PLC_TCPIP_ADDR,144,28,40,14,ES_AUTOHSCROLL - LTEXT "Addr",IDC_STATIC,120,30,16,8 - EDITTEXT IDC_EDIT_PLC_TCPIP_Data,144,74,40,14,ES_AUTOHSCROLL - LTEXT "Data",IDC_STATIC,120,76,16,8 - PUSHBUTTON "Handshaking",IDC_BUTTON_PLC_TCPIP_HANDSHAKING,28,49,63,18 - EDITTEXT IDC_EDIT_PLC_TCPIP_DATA_SIZE,144,51,40,14,ES_AUTOHSCROLL - LTEXT "Size",IDC_STATIC,120,53,14,8 + PUSHBUTTON "Exit",IDCANCEL,386,248,39,14 + GROUPBOX "TCP/IP Control",IDC_STATIC,20,14,153,95 + PUSHBUTTON "Connect",IDC_BUTTON_PLC_TCPIP_CONNECT,30,68,63,18 + PUSHBUTTON "Disconnect",IDC_BUTTON_PLC_TCPIP_DISCONNECT,30,88,63,18 + EDITTEXT IDC_EDIT_MSG,19,116,333,130,ES_MULTILINE | ES_AUTOVSCROLL | ES_WANTRETURN | WS_VSCROLL + PUSHBUTTON "Clear",IDC_BUTTON_PLC_TCPIP_CLEAR_MSG,358,158,39,14 + PUSHBUTTON "Read Data",IDC_BUTTON_PLC_TCPIP_READ,272,32,63,18 + PUSHBUTTON "Write Data",IDC_BUTTON_PLC_TCPIP_WRITE,272,64,63,18 + GROUPBOX "TCP/IP Data",IDC_STATIC,179,14,174,81 + EDITTEXT IDC_EDIT_PLC_TCPIP_ADDR,213,30,40,14,ES_AUTOHSCROLL + LTEXT "Addr",IDC_STATIC,189,32,16,8 + EDITTEXT IDC_EDIT_PLC_TCPIP_Data,213,76,40,14,ES_AUTOHSCROLL + LTEXT "Data",IDC_STATIC,189,78,16,8 + PUSHBUTTON "Handshaking",IDC_BUTTON_PLC_TCPIP_HANDSHAKING,105,78,63,18 + EDITTEXT IDC_EDIT_PLC_TCPIP_DATA_SIZE,213,53,40,14,ES_AUTOHSCROLL + LTEXT "Size",IDC_STATIC,189,55,14,8 + CONTROL "",IDC_IPADDRESS_PLC_TCPIP,"SysIPAddress32",WS_TABSTOP,69,27,100,15 + EDITTEXT IDC_EDIT__PLC_TCPIP_PORTNUMBER,69,48,40,14,ES_AUTOHSCROLL + LTEXT "Server Port",IDC_STATIC,27,51,38,8 + LTEXT "Server IP",IDC_STATIC,27,31,31,8 END IDD_SO7_UTIL_PLC_TCPIP_SERVER DIALOGEX 0, 0, 558, 326 @@ -1273,9 +1277,9 @@ BEGIN IDD_SO7_UTIL_PLC_TCPIP, DIALOG BEGIN LEFTMARGIN, 7 - RIGHTMARGIN, 331 + RIGHTMARGIN, 425 TOPMARGIN, 7 - BOTTOMMARGIN, 244 + BOTTOMMARGIN, 262 END IDD_SO7_UTIL_PLC_TCPIP_SERVER, DIALOG diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/So7_Util_PLC_TCPIP.cpp b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/So7_Util_PLC_TCPIP.cpp index 087f04d..db6c3e8 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/So7_Util_PLC_TCPIP.cpp +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/So7_Util_PLC_TCPIP.cpp @@ -27,6 +27,7 @@ void CSo7_Util_PLC_TCPIP::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); DDX_Control(pDX, IDC_EDIT_MSG, m_edMSG); + DDX_Control(pDX, IDC_IPADDRESS_PLC_TCPIP, m_IPAddress); } @@ -47,13 +48,56 @@ END_MESSAGE_MAP() // CSo7_Util_PLC_TCPIP ÏûÏ¢´¦Àí³ÌÐò +BOOL CSo7_Util_PLC_TCPIP::OnInitDialog() +{ + CDialog::OnInitDialog(); + + // Add "About..." menu item to system menu. + + // IDM_ABOUTBOX must be in the system command range. + ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); + ASSERT(IDM_ABOUTBOX < 0xF000); + + CMenu* pSysMenu = GetSystemMenu(FALSE); + if (pSysMenu != NULL) + { + BOOL bNameValid; + CString strAboutMenu; + bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX); + ASSERT(bNameValid); + if (!strAboutMenu.IsEmpty()) + { + pSysMenu->AppendMenu(MF_SEPARATOR); + pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); + } + } + + m_IPAddress.SetAddress(192,168,0,5); + GetDlgItem(IDC_EDIT__PLC_TCPIP_PORTNUMBER)->SetWindowText(_T("9600")); + + UpdateData(FALSE); + + return TRUE; // return TRUE unless you set the focus to a control +} + void CSo7_Util_PLC_TCPIP::OnBnClickedButtonPlcTcpipConnect() { + CString str; + UpdateData(TRUE); + USES_CONVERSION; + GetDlgItem(IDC_EDIT__PLC_TCPIP_PORTNUMBER)->GetWindowText(str); + const char* cTempValue=T2A(str); + short sPortNumber=static_cast(atoi(cTempValue)); in_addr IPAddress; - IPAddress.S_un.S_addr=inet_addr("192.168.0.5"); - TCPIP_RETURN_CODE rCode=g_pSo7_TCPIP->Connect(m_hWnd,IPAddress,9600); - m_csMSG.Format(_T("Server:192.168.0.5[9600] Connect ReturnCode:%d."),rCode); + m_IPAddress.GetAddress(IPAddress.S_un.S_un_b.s_b1,IPAddress.S_un.S_un_b.s_b2,IPAddress.S_un.S_un_b.s_b3,IPAddress.S_un.S_un_b.s_b4); + + TCPIP_RETURN_CODE rCode=g_pSo7_TCPIP->Connect(m_hWnd,IPAddress,sPortNumber); + m_csMSG.Format(_T("Server:%d.%d.%d.%d[%d] Connect ReturnCode:%d."), + IPAddress.S_un.S_un_b.s_b1,IPAddress.S_un.S_un_b.s_b2, + IPAddress.S_un.S_un_b.s_b3,IPAddress.S_un.S_un_b.s_b4, + sPortNumber, + rCode); OutputWithScroll(m_csMSG,m_edMSG); rCode=g_pSo7_TCPIP->GetHostIPAddr(IPAddress); m_csMSG.Format(_T("Client:%d.%d.%d.%d ReturnCode:%d."), @@ -187,12 +231,14 @@ LRESULT CSo7_Util_PLC_TCPIP::OnTCPIPRecv(WPARAM w, LPARAM p) { CString csTmp; m_csMSG=_T(""); - m_csMSG.Format(_T("<< Read status:%d;Data:"),g_pSo7_TCPIP->m_TCPIPData.s_status._ReadDataCompleted); - double dTmp(0.0); - for (int i=0;im_TCPIPData.s_recv_data._DataSize;i++) + int iDataSize(0); + iDataSize=g_pSo7_TCPIP->m_TCPIPData.s_recv_data._DataSize; + m_csMSG.Format(_T("<< Read status:%d;DataSize:%d;Data:"),g_pSo7_TCPIP->m_TCPIPData.s_status._ReadDataCompleted,iDataSize); + int iTmp(0); + for (int i=0;im_TCPIPData.s_recv_data._lData[i]*0.001; - csTmp.Format(_T("%.4f,"),dTmp); + iTmp=static_cast(g_pSo7_TCPIP->m_TCPIPData.s_recv_data._lData[i]); + csTmp.Format(_T("%d,"),iTmp); m_csMSG+=csTmp; } OutputWithScroll(m_csMSG,m_edMSG); diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/So7_Util_PLC_TCPIP.h b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/So7_Util_PLC_TCPIP.h index f5b3920..5c551e3 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/So7_Util_PLC_TCPIP.h +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/So7_Util_PLC_TCPIP.h @@ -17,8 +17,10 @@ public: protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV Ö§³Ö void OutputWithScroll(const CString &strNewText,CEdit &edtOutput); + virtual BOOL OnInitDialog(); DECLARE_MESSAGE_MAP() public: + CIPAddressCtrl m_IPAddress; CString m_csMSG; CEdit m_edMSG; afx_msg void OnBnClickedButtonPlcTcpipConnect(); diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/So7_Util_PLC_TCPIP_SERVER.cpp b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/So7_Util_PLC_TCPIP_SERVER.cpp index de80d2e..5c8f51a 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/So7_Util_PLC_TCPIP_SERVER.cpp +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/So7_Util_PLC_TCPIP_SERVER.cpp @@ -33,8 +33,10 @@ CSo7_Util_PLC_TCPIP_SERVER::~CSo7_Util_PLC_TCPIP_SERVER() void CSo7_Util_PLC_TCPIP_SERVER::DoDataExchange(CDataExchange* pDX) { - DDX_Control(pDX, IDC_LIST_PLC_TCPIP_SERVER_CCDDATA, m_DataList); CDialog::DoDataExchange(pDX); + DDX_Control(pDX, IDC_EDIT_MSG, m_edMSG); + DDX_Control(pDX, IDC_LIST_PLC_TCPIP_SERVER_CCDDATA, m_DataList); + } @@ -87,6 +89,7 @@ BOOL CSo7_Util_PLC_TCPIP_SERVER::OnInitDialog() GetDlgItem(IDC_EDIT_PLC_TCPIP_SERVER_STATE_LASER2)->SetWindowTextW(str); str.Format(_T("%d"),g_pSo7_TCPIP_Server->m_TCPIPServerState._PLCRunningState); GetDlgItem(IDC_EDIT_PLC_TCPIP_SERVER_PLC_STATE)->SetWindowTextW(str); + m_UpdateListControl(E_LISTCTRL_TITLE); UpdateData(FALSE); @@ -96,13 +99,23 @@ BOOL CSo7_Util_PLC_TCPIP_SERVER::OnInitDialog() void CSo7_Util_PLC_TCPIP_SERVER::OnBnClickedButtonPlcTcpipServerStart() { - ;// TODO: Add your control notification handler code here + if (g_pSo7_TCPIP_Server) + { + g_pSo7_TCPIP_Server->StartServer(m_hWnd,9600); + m_csMSG=_T(" ok."); + OutputWithScroll(m_csMSG,m_edMSG); + } } void CSo7_Util_PLC_TCPIP_SERVER::OnBnClickedButtonPlcTcpipServerStop() { - ;// TODO: Add your control notification handler code here + if (g_pSo7_TCPIP_Server) + { + g_pSo7_TCPIP_Server->StopServer(); + m_csMSG=_T(" ok."); + OutputWithScroll(m_csMSG,m_edMSG); + } } @@ -234,38 +247,84 @@ LRESULT CSo7_Util_PLC_TCPIP_SERVER::OnSocket(WPARAM w, LPARAM p) //===================================================================================== LRESULT CSo7_Util_PLC_TCPIP_SERVER::OnTCPIPMsg(WPARAM w, LPARAM p) { - UNREFERENCED_PARAMETER(p); LRESULT lResult=0; + int lPara=static_cast(p); switch(w) { case FD_ACCEPT: { - m_csMSG=_T("FD_ACCEPT"); + m_csMSG=_T(" FD_ACCEPT"); break; } case FD_READ: { - m_csMSG=_T("FD_READ"); + m_csMSG=_T(" FD_READ ")+TCPIPMsg(lPara); break; } case FD_WRITE: { - m_csMSG=_T("FD_WRITE"); + m_csMSG=_T(" FD_WRITE"); break; } case FD_CLOSE: { - m_csMSG=_T("FD_CLOSE"); + m_csMSG=_T(" FD_CLOSE"); break; } default: { - m_csMSG=_T("[Unknown]"); + m_csMSG=_T(" [Unknown]"); break; } } - m_csMSG+=_T("."); OutputWithScroll(m_csMSG,m_edMSG); return( lResult ); } - +//===================================================================================== +CString CSo7_Util_PLC_TCPIP_SERVER::TCPIPMsg(int _Type) +{ + CString cStr(""); + switch(_Type) + { + case RESPONSE_UNKNOWN: + { + cStr=_T("RESPONSE_UNKNOWN"); + break; + } + case RESPONSE_HANDSHAKE: + { + cStr=_T("RESPONSE_HANDSHAKE"); + break; + } + case RESPONSE_READ_PLC_STATE: + { + cStr=_T("RESPONSE_READ_PLC_STATE"); + break; + } + case RESPONSE_WRITE_PLC_STATE: + { + cStr=_T("RESPONSE_WRITE_PLC_STATE"); + break; + } + case RESPONSE_READ_SENSOR_STATE: + { + cStr=_T("RESPONSE_READ_SENSOR_STATE"); + break; + } + case RESPONSE_READ_CCD_DATA: + { + cStr=_T("RESPONSE_READ_CCD_DATA"); + break; + } + case RESPONSE_READ_ERRCODE: + { + cStr=_T("RESPONSE_READ_ERRCODE"); + break; + } + default: + { + break; + } + } + return cStr; +} diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/So7_Util_PLC_TCPIP_SERVER.h b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/So7_Util_PLC_TCPIP_SERVER.h index 10204ad..ad475a5 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/So7_Util_PLC_TCPIP_SERVER.h +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/So7_Util_PLC_TCPIP_SERVER.h @@ -14,9 +14,9 @@ public: // Dialog Data enum { IDD = IDD_SO7_UTIL_PLC_TCPIP_SERVER }; -protected: CString m_csMSG; CEdit m_edMSG; +protected: CEditableListCtrl m_DataList; void OutputWithScroll(const CString &strNewText,CEdit &edtOutput); @@ -36,5 +36,6 @@ public: LRESULT OnTCPIPMsg(WPARAM w, LPARAM p); afx_msg void OnBnClickedButtonPlcTcpipServerUpdatedata(); void m_UpdateListControl(int _type); + CString TCPIPMsg(int _Type); }; diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Usb_Util.vcxproj b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Usb_Util.vcxproj index e7cc54e..4cd7d1d 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Usb_Util.vcxproj +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Usb_Util.vcxproj @@ -1,6 +1,14 @@  + + DebugS07 + Win32 + + + DebugS07 + x64 + Debug Win32 @@ -70,11 +78,21 @@ Dynamic Unicode + + Application + Dynamic + Unicode + Application Dynamic Unicode + + Application + Dynamic + Unicode + @@ -93,18 +111,30 @@ + + + + + + <_ProjectFileVersion>10.0.30319.1 $(SolutionDir)$(Configuration)\ + $(SolutionDir)$(Configuration)\ $(SolutionDir)$(Configuration)\ + $(SolutionDir)$(Configuration)\ $(Configuration)\ + $(Configuration)\ $(Configuration)\ + $(Configuration)\ true + true true + true $(SolutionDir)$(Configuration)\ $(SolutionDir)$(Configuration)\ $(SolutionDir)$(Configuration)\ @@ -119,7 +149,9 @@ false Utility for So7 Controller true + true true + true @@ -151,6 +183,36 @@ MachineX86 + + + _DEBUG;%(PreprocessorDefinitions) + false + true + + + Disabled + WIN32;_WINDOWS;_CRT_SECURE_NO_WARNINGS;_RELEASE_SO7_CONTROLER_ONLY;_REMOVE_DLLCHR;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Use + Level4 + EditAndContinue + true + $(IntDir)vc$(ProjectName).pdb + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + $(IntDir);%(AdditionalIncludeDirectories) + + + ..\..\..\..\..\..\..\ThirdParty\UsbSupport\LibUsb_Win\Lib\Msvc\libusb.lib;%(AdditionalDependencies) + true + Windows + MachineX86 + + _DEBUG;%(PreprocessorDefinitions) @@ -177,6 +239,32 @@ Windows + + + _DEBUG;%(PreprocessorDefinitions) + false + + + Disabled + WIN32;_WINDOWS;_DEBUG;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebugDLL + Use + Level4 + ProgramDatabase + true + + + _DEBUG;%(PreprocessorDefinitions) + 0x0409 + $(IntDir);%(AdditionalIncludeDirectories) + + + ..\..\LibUsb_Win\Lib\Msvc\libusb.lib;%(AdditionalDependencies) + true + Windows + + NDEBUG;%(PreprocessorDefinitions) @@ -310,6 +398,7 @@ ..\..\..\..\..\ThirdParty\UsbSupport\LibUsb_Win\Include + ..\..\..\..\..\ThirdParty\UsbSupport\LibUsb_Win\Include @@ -376,7 +465,9 @@ Create + Create Create + Create Create Create Create diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/resource.h b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/resource.h index ad71e99..dd83e23 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/resource.h +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/resource.h @@ -1062,6 +1062,8 @@ #define IDC_EDIT_PLC_TCPIP_ADDR2 1891 #define IDC_EDIT_PLC_TCPIP_DATA_SIZE 1891 #define IDC_EDIT_PLC_TCPIP_SERVER_STATE_CCD1 1892 +#define IDC_EDIT_PLC_TCPIP_ADDR3 1892 +#define IDC_EDIT__PLC_TCPIP_PORTNUMBER 1892 #define IDC_EDIT_PLC_TCPIP_SERVER_STATE_LASER2 1893 #define IDC_EDIT_PLC_TCPIP_SERVER_STATE_CCD2 1894 #define IDC_BUTTON_PLC_TCPIP_SERVER_START 1895 @@ -1072,6 +1074,7 @@ #define IDC_BUTTON_PLC_TCPIP_SERVER_UPDATESTATE2 1900 #define IDC_BUTTON_PLC_TCPIP_SERVER_UPDATEDATA 1900 #define IDC_LIST_PLC_TCPIP_SERVER_CCDDATA 1902 +#define IDC_IPADDRESS_PLC_TCPIP 1903 #define IDC_BUTTON_DIY_EXIT_BUTTON 32740 #define ID_EDIT_SO7_CONFIG_MOTION 32741 @@ -1081,7 +1084,7 @@ #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 193 #define _APS_NEXT_COMMAND_VALUE 32771 -#define _APS_NEXT_CONTROL_VALUE 1903 +#define _APS_NEXT_CONTROL_VALUE 1904 #define _APS_NEXT_SYMED_VALUE 104 #endif #endif diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil_VS2010.sln b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil_VS2010.sln index 57df6ab..3fb4dce 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil_VS2010.sln +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil_VS2010.sln @@ -21,6 +21,10 @@ Global Debug|Win32 = Debug|Win32 Debug|x64 = Debug|x64 Debug|x86 = Debug|x86 + DebugS07|Mixed Platforms = DebugS07|Mixed Platforms + DebugS07|Win32 = DebugS07|Win32 + DebugS07|x64 = DebugS07|x64 + DebugS07|x86 = DebugS07|x86 Release|Mixed Platforms = Release|Mixed Platforms Release|Win32 = Release|Win32 Release|x64 = Release|x64 @@ -42,6 +46,13 @@ Global {50B21A79-C887-4F7E-8911-7E3A685BFA25}.Debug|x64.ActiveCfg = Debug|x64 {50B21A79-C887-4F7E-8911-7E3A685BFA25}.Debug|x64.Build.0 = Debug|x64 {50B21A79-C887-4F7E-8911-7E3A685BFA25}.Debug|x86.ActiveCfg = Debug|x64 + {50B21A79-C887-4F7E-8911-7E3A685BFA25}.DebugS07|Mixed Platforms.ActiveCfg = DebugS07|x64 + {50B21A79-C887-4F7E-8911-7E3A685BFA25}.DebugS07|Mixed Platforms.Build.0 = DebugS07|x64 + {50B21A79-C887-4F7E-8911-7E3A685BFA25}.DebugS07|Win32.ActiveCfg = DebugS07|Win32 + {50B21A79-C887-4F7E-8911-7E3A685BFA25}.DebugS07|Win32.Build.0 = DebugS07|Win32 + {50B21A79-C887-4F7E-8911-7E3A685BFA25}.DebugS07|x64.ActiveCfg = DebugS07|x64 + {50B21A79-C887-4F7E-8911-7E3A685BFA25}.DebugS07|x64.Build.0 = DebugS07|x64 + {50B21A79-C887-4F7E-8911-7E3A685BFA25}.DebugS07|x86.ActiveCfg = DebugS07|x64 {50B21A79-C887-4F7E-8911-7E3A685BFA25}.Release|Mixed Platforms.ActiveCfg = Release|x64 {50B21A79-C887-4F7E-8911-7E3A685BFA25}.Release|Mixed Platforms.Build.0 = Release|x64 {50B21A79-C887-4F7E-8911-7E3A685BFA25}.Release|Win32.ActiveCfg = Release|Win32 @@ -69,6 +80,12 @@ Global {A945B062-6081-49F0-992D-D14769C4C7D4}.Debug|Win32.Build.0 = Debug|Win32 {A945B062-6081-49F0-992D-D14769C4C7D4}.Debug|x64.ActiveCfg = Debug|Win32 {A945B062-6081-49F0-992D-D14769C4C7D4}.Debug|x86.ActiveCfg = Debug|Win32 + {A945B062-6081-49F0-992D-D14769C4C7D4}.DebugS07|Mixed Platforms.ActiveCfg = Debug|Win32 + {A945B062-6081-49F0-992D-D14769C4C7D4}.DebugS07|Mixed Platforms.Build.0 = Debug|Win32 + {A945B062-6081-49F0-992D-D14769C4C7D4}.DebugS07|Win32.ActiveCfg = Debug|Win32 + {A945B062-6081-49F0-992D-D14769C4C7D4}.DebugS07|Win32.Build.0 = Debug|Win32 + {A945B062-6081-49F0-992D-D14769C4C7D4}.DebugS07|x64.ActiveCfg = Debug|Win32 + {A945B062-6081-49F0-992D-D14769C4C7D4}.DebugS07|x86.ActiveCfg = Debug|Win32 {A945B062-6081-49F0-992D-D14769C4C7D4}.Release|Mixed Platforms.ActiveCfg = Release|Win32 {A945B062-6081-49F0-992D-D14769C4C7D4}.Release|Mixed Platforms.Build.0 = Release|Win32 {A945B062-6081-49F0-992D-D14769C4C7D4}.Release|Win32.ActiveCfg = Release|Win32 @@ -93,6 +110,12 @@ Global {BF02B850-BB32-4635-9E53-8583C474884D}.Debug|Win32.Build.0 = Debug|Win32 {BF02B850-BB32-4635-9E53-8583C474884D}.Debug|x64.ActiveCfg = Debug|Win32 {BF02B850-BB32-4635-9E53-8583C474884D}.Debug|x86.ActiveCfg = Debug|Win32 + {BF02B850-BB32-4635-9E53-8583C474884D}.DebugS07|Mixed Platforms.ActiveCfg = Debug|Win32 + {BF02B850-BB32-4635-9E53-8583C474884D}.DebugS07|Mixed Platforms.Build.0 = Debug|Win32 + {BF02B850-BB32-4635-9E53-8583C474884D}.DebugS07|Win32.ActiveCfg = Debug|Win32 + {BF02B850-BB32-4635-9E53-8583C474884D}.DebugS07|Win32.Build.0 = Debug|Win32 + {BF02B850-BB32-4635-9E53-8583C474884D}.DebugS07|x64.ActiveCfg = Debug|Win32 + {BF02B850-BB32-4635-9E53-8583C474884D}.DebugS07|x86.ActiveCfg = Debug|Win32 {BF02B850-BB32-4635-9E53-8583C474884D}.Release|Mixed Platforms.ActiveCfg = Release|Win32 {BF02B850-BB32-4635-9E53-8583C474884D}.Release|Mixed Platforms.Build.0 = Release|Win32 {BF02B850-BB32-4635-9E53-8583C474884D}.Release|Win32.ActiveCfg = Release|Win32 @@ -117,6 +140,12 @@ Global {5E3B7ED1-B324-4966-8527-D29873AC3815}.Debug|x64.ActiveCfg = Debug|x86 {5E3B7ED1-B324-4966-8527-D29873AC3815}.Debug|x86.ActiveCfg = Debug|x86 {5E3B7ED1-B324-4966-8527-D29873AC3815}.Debug|x86.Build.0 = Debug|x86 + {5E3B7ED1-B324-4966-8527-D29873AC3815}.DebugS07|Mixed Platforms.ActiveCfg = Debug|x86 + {5E3B7ED1-B324-4966-8527-D29873AC3815}.DebugS07|Mixed Platforms.Build.0 = Debug|x86 + {5E3B7ED1-B324-4966-8527-D29873AC3815}.DebugS07|Win32.ActiveCfg = Debug|x86 + {5E3B7ED1-B324-4966-8527-D29873AC3815}.DebugS07|x64.ActiveCfg = Debug|x86 + {5E3B7ED1-B324-4966-8527-D29873AC3815}.DebugS07|x86.ActiveCfg = Debug|x86 + {5E3B7ED1-B324-4966-8527-D29873AC3815}.DebugS07|x86.Build.0 = Debug|x86 {5E3B7ED1-B324-4966-8527-D29873AC3815}.Release|Mixed Platforms.ActiveCfg = Release|x86 {5E3B7ED1-B324-4966-8527-D29873AC3815}.Release|Mixed Platforms.Build.0 = Release|x86 {5E3B7ED1-B324-4966-8527-D29873AC3815}.Release|Win32.ActiveCfg = Release|x86 diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil_VS2010.suo b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil_VS2010.suo index 7697f6c7b8fcddd663a6b13d0e92f1c89c24900b..d05cb0fd5458e66c2d134d323ab533c889784812 100644 GIT binary patch delta 4935 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 delta 5010 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 c_Wwuz%