#include "StdAfx.h" #include "eXcomDevice.h" CeXcomDevice::CeXcomDevice(int nNo /*= 0*/) { if (!AfxSocketInit()) { } m_socket = NULL; m_bConnected = FALSE; m_hMutex = NULL; CString strMutex; strMutex.Format(_T("Mutex_eXcom%d"), nNo); m_hMutex = CreateMutex(NULL, FALSE, strMutex); } CeXcomDevice::~CeXcomDevice(void) { Close(); } BOOL CeXcomDevice::Connect(DWORD IPAddress, int nPort) { struct sockaddr_in sin; int rc = 0; CString strTemp; if ( m_bConnected ) return FALSE; Lock(); if ( m_socket==NULL ) { m_socket = new SOCKET; } *m_socket = socket(PF_INET,SOCK_STREAM,0); if( *m_socket == INVALID_SOCKET) { WSACleanup(); Release(); return FALSE; } // Embedded Ethernet's IP address sin.sin_addr.s_impno = (char)(0x000000FF & IPAddress); sin.sin_addr.s_lh = (char)((0x0000FF00 & IPAddress) >> 8); sin.sin_addr.s_host = (char)((0x00FF0000 & IPAddress) >> 16); sin.sin_addr.s_net = (char)((0xFF000000 & IPAddress) >> 24); sin.sin_family = PF_INET; sin.sin_port = htons(nPort); rc = connect(*m_socket,(struct sockaddr*)&sin,sizeof(sin)); if(rc == SOCKET_ERROR) { Release(); return FALSE; } m_bConnected = TRUE; Release(); return TRUE; } void CeXcomDevice::Close() { if ( m_socket!=NULL ) { Lock(); closesocket(*(SOCKET *)m_socket); delete m_socket; m_socket = NULL; m_bConnected = FALSE; Release(); } } BOOL CeXcomDevice::ReadOneData(long nAddress, long &nValue) { DWORD dwStartAddr = nAddress; return GetMemory(dwStartAddr * 4, sizeof(long), &nValue); } BOOL CeXcomDevice::WriteOneData(long nAddress, long nValue) { DWORD dwStartAddr = nAddress; return SetMemory(dwStartAddr * 4, sizeof(long), &nValue); } BOOL CeXcomDevice::ReadMultyData(long nAddress, long *pValue, int nSize) { if(pValue == NULL) return FALSE; DWORD dwStartAddr = nAddress; return GetMemory(dwStartAddr * 4, sizeof(long) * nSize, pValue); } BOOL CeXcomDevice::WriteMultyData(long nAddress, long *pValue, int nSize) { if(pValue == NULL) return FALSE; DWORD dwStartAddr = nAddress; return SetMemory(dwStartAddr * 4, sizeof(long) * nSize, pValue); } BOOL CeXcomDevice::ReadOneData(long nAddress, float &fValue) { DWORD dwStartAddr = nAddress; return GetMemory(dwStartAddr * 4, sizeof(float), &fValue); } BOOL CeXcomDevice::WriteOneData(long nAddress, float fValue) { DWORD dwStartAddr = nAddress; return SetMemory(dwStartAddr * 4, sizeof(float), &fValue); } BOOL CeXcomDevice::ReadMultyData(long nAddress, float *pValue, int nSize) { if(pValue == NULL) return FALSE; DWORD dwStartAddr = nAddress; return GetMemory(dwStartAddr * 4, sizeof(float) * nSize, pValue); } BOOL CeXcomDevice::WriteMultyData(long nAddress, float *pValue, int nSize) { if(pValue == NULL) return FALSE; DWORD dwStartAddr = nAddress; return SetMemory(dwStartAddr * 4, sizeof(float) * nSize, pValue); } ///////////////////////////////////////////////////////////////////////// // DPRAM Memory¿¡ µ¥ÀÌÅ͸¦ ¼³Á¤ÇÏ´Â ÇÔ¼ö.. BOOL CeXcomDevice::SetMemory(DWORD dwStartAddr, DWORD dwLength, PVOID val) { if ( !m_bConnected ) return FALSE; int rc = 0; int nLen = 0, nBufLen = 0; int iTimeout = 100; long nBufRemain = dwLength; long lbufIndex = 0; BYTE *byData = (BYTE *)val; EXCOM_ETH cmdSend, cmdRecv; Lock(); while(nBufRemain>0) { if ( nBufRemain>MAXDATA_LEN ) nBufLen = MAXDATA_LEN; else nBufLen = nBufRemain; nBufRemain -= nBufLen; if ( dwStartAddr+nBufLen > ARRAY_MAX ) { nBufRemain = 0; nBufLen = ARRAY_MAX - dwStartAddr; ASSERT(nBufLen>0); } cmdSend.RequestType = 0x11; // DPRAM Write Command cmdSend.wIndex = (WORD)(dwStartAddr/4); cmdSend.wLength = (WORD)(nBufLen/4); // 4Byte ´ÜÀ§·Î¸¸ Àü¼Û... memcpy(cmdSend.bData, byData+lbufIndex, nBufLen); rc = send(*(SOCKET *)m_socket, (char *)&cmdSend, nBufLen+8, 0); if ( rc==SOCKET_ERROR ) { Release(); return FALSE; } rc = setsockopt(*(SOCKET *)m_socket, SOL_SOCKET, SO_RCVTIMEO, (const char *)&iTimeout, sizeof(int)); rc = recv(*(SOCKET *)m_socket, (char *)&cmdRecv, sizeof(EXCOM_ETH), 0); if ( rc==SOCKET_ERROR ) { Release(); return FALSE; } if (cmdRecv.RequestType==0x15) // NAK received { int nErrorNo = cmdRecv.Request; Release(); return FALSE; } dwStartAddr += nBufLen; lbufIndex += nBufLen; } Release(); return TRUE; } ///////////////////////////////////////////////////////////////////////// // DPRAM Memory¿¡¼­ µ¥ÀÌÅ͸¦ Àоî¿À´Â ÇÔ¼ö.. BOOL CeXcomDevice::GetMemory(DWORD dwStartAddr, DWORD dwLength, PVOID val) { if ( !m_bConnected ) return FALSE; int rc = 0; int nLen = 0, nBufLen = 0; int iTimeout = 100; long nBufRemain = dwLength; long lbufIndex = 0; BYTE *byData = (BYTE *)val; EXCOM_ETH cmdSend, cmdRecv; Lock(); while(nBufRemain>0) { if ( nBufRemain>MAXDATA_LEN ) nBufLen = MAXDATA_LEN; else nBufLen = nBufRemain; nBufRemain -= nBufLen; if ( dwStartAddr+nBufLen > ARRAY_MAX ) { nBufRemain = 0; nBufLen = ARRAY_MAX - dwStartAddr; ASSERT(nBufLen>0); } cmdSend.RequestType = 0x10; // DPRAM Read Command cmdSend.wIndex = (WORD)(dwStartAddr/4); cmdSend.wLength = (WORD)(nBufLen/4); // 4Byte ´ÜÀ§·Î¸¸ Àü¼Û... // memcpy(cmdSend.bData, byData+lbufIndex, nBufLen); rc = send(*(SOCKET *)m_socket, (char *)&cmdSend, nBufLen+8, 0); if ( rc==SOCKET_ERROR ) { Release(); return FALSE; } rc = setsockopt(*(SOCKET *)m_socket, SOL_SOCKET, SO_RCVTIMEO, (const char *)&iTimeout, sizeof(int)); rc = recv(*(SOCKET *)m_socket, (char *)&cmdRecv, sizeof(EXCOM_ETH), 0); if ( rc==SOCKET_ERROR ) { Release(); return FALSE; } if (cmdRecv.RequestType==0x15) // NAK received { int nErrorNo = cmdRecv.Request; Release(); return FALSE; } memcpy(byData+lbufIndex, cmdRecv.bData, nBufLen); dwStartAddr += nBufLen; lbufIndex += nBufLen; } Release(); return TRUE; } //#define EQUARRAY_MAX 120000 //#define MAXDWORD_PACKET 350 // //BOOL CeXcomDevice::SetEQUMem(DWORD dwStartAddr, DWORD dwLength, PVOID val) //{ // if ( !m_bConnected ) // return FALSE; // // int rc = 0; // int nLen = 0, nBufLen = 0; // char sendbuf[256], recvbuf[256]; // // int iTimeout = 100; // long nBufRemain = dwLength; // long lbufIndex = 0; // // memset(recvbuf, '\0', sizeof(BYTE)*256); // // Lock(); // // while(nBufRemain>0) // { // if ( nBufRemain>MAXDWORD_PACKET ) // nBufLen = MAXDWORD_PACKET; // else // nBufLen = nBufRemain; // // nBufRemain -= nBufLen; // // if ( dwStartAddr+nBufLen > EQUARRAY_MAX ) // { // nBufRemain = 0; // nBufLen = EQUARRAY_MAX - dwStartAddr; // } // // sprintf(sendbuf, "DSET%ld,%ld", dwStartAddr, nBufLen); // nLen = strlen(sendbuf); // rc = send(*(SOCKET *)m_socket, sendbuf, nLen, 0); // if ( rc==SOCKET_ERROR ) // { // Release(); // return FALSE; // } // // rc = setsockopt(*(SOCKET *)m_socket, // SOL_SOCKET, // SO_RCVTIMEO, // (const char *)&iTimeout, // sizeof(int)); // // rc = recv(*(SOCKET *)m_socket, recvbuf, 255, 0); // if ( rc==SOCKET_ERROR || recvbuf[0]!='\r' ) // { // Release(); // return FALSE; // } // // rc = send(*(SOCKET *)m_socket, (const char FAR *)((char *)val+lbufIndex*sizeof(long)), nBufLen*sizeof(long), 0); // if ( rc==SOCKET_ERROR ) // { // Release(); // return FALSE; // } // rc = recv(*(SOCKET *)m_socket, recvbuf, 255, 0); // if ( rc==SOCKET_ERROR || recvbuf[0]!='\r' ) // { // Release(); // return FALSE; // } // // dwStartAddr += nBufLen; // lbufIndex += nBufLen; // } // // Release(); // // return TRUE; //} void CeXcomDevice::Lock() { if ( m_hMutex ) WaitForSingleObject(m_hMutex, INFINITE); } void CeXcomDevice::Release() { if ( m_hMutex ) ReleaseMutex(m_hMutex); }