#pragma once #include "NITools/NiSMemory.h" #include "NiToolWin.h" #include "LogWndFrame.h" #include "xtools++.h" #include "Rotation.h" #include "WinTools.h" #include "ParameterSet.h" #include "anm_data.h" // from Animation Server #define NINET_DEFAULT_GROUP "NSL_TEST" #define NINET_DEFAULT_SERVER "silver-star.nsl.tuis.ac.jp" #define NINET_UDP_SLPORT ANM_SERVER_PORT #define NINET_UDP_CLPORT 8200 #define NINET_UDP_TIMEOUT 10 // sec #define NINET_BUFFER_LEN 1600 // 1500 + 100 #define NINET_FRM_RATE_INTVL 5 // interval of packet check (sec) #define NINET_KEEP_ALIVE 3 // min #define NINET_REGIST_WAIT_TIME 500 // ms using namespace jbxl; using namespace jbxwl; class CNiNetwork { public: CNiNetwork(void); ~CNiNetwork(void); public: CParameterSet appParam; int recvSocket; int sendSocket; struct sockaddr_in serverDataAddr; Buffer recvBuffer; Buffer sendBuffer; char recvKey[ANM_COM_LEN_IDKEY]; CNiSMemory* sharedMem; CLogWndDoc* pLogDoc; int keepAliveTime; public: void setParameter(CParameterSet param) { appParam = param;} void setSharedMem(CNiSMemory* mem) { sharedMem = mem;} void closeRecvSocket(void); void closeSendSocket(void); char serverLogin(CString server, unsigned short sport, CString groupid); void serverLogout(void); void openRecvSocket(void); void openSendSocket(void); }; ////////////////////////////////////////////////////////////////////////////////////////////////////// // // データ受信 & Keep Alive // UINT niNetworkRecieveLoop(LPVOID pParam); UINT niNetworkKeepAlive(LPVOID pParam); ///////////////////////////////////////////////////////////////////////////// // // データ送信 // template void sendAnimationData(Vector* posVect, Quaternion* rotQuat, CNiNetwork* niNetwork, NiSDK_Lib lib, int joints_num) { clear_Buffer(&niNetwork->sendBuffer); udp_header* udphd = (udp_header*)niNetwork->sendBuffer.buf; T* datptr = (T*)(niNetwork->sendBuffer.buf+sizeof(udp_header)); int* intptr = (int*)datptr; /* *intptr = 0; if (posVect[0].c>=0.0) { datptr[1] = (T)posVect[0].x; datptr[2] = (T)posVect[0].y; datptr[3] = (T)posVect[0].z; } if (rotQuat[0].c>=0.0) { datptr[4] = (T)rotQuat[0].x; datptr[5] = (T)rotQuat[0].y; datptr[6] = (T)rotQuat[0].z; datptr[7] = (T)rotQuat[0].s; } datptr += ANM_COM_NUM_DATA; intptr = (int*)datptr; int num = 1; for (int i=1; i=0) { *intptr = n; if (rotQuat[i].c>=0.0) { datptr[4] = (T)rotQuat[i].x; datptr[5] = (T)rotQuat[i].y; datptr[6] = (T)rotQuat[i].z; datptr[7] = (T)rotQuat[i].s; } num++; datptr += ANM_COM_NUM_DATA; intptr = (int*)datptr; } } */ *intptr = 0; if (posVect[0].c>=0.0) { datptr[1] = (T)posVect[0].x; datptr[2] = (T)posVect[0].y; datptr[3] = (T)posVect[0].z; } int num = 0; for (int i=0; iappParam.outSMemoryCord && i>0) { m = NiSDK2SLPosJointNum(i, lib); if (m>=0) { *intptr = m; if (posVect[i].c>=0.0) { datptr[1] = (T)posVect[i].x; datptr[2] = (T)posVect[i].y; datptr[3] = (T)posVect[i].z; } //num++; //datptr += ANM_COM_NUM_DATA; //intptr = (int*)datptr; } } if (niNetwork->appParam.outSMemoryQuat) { n = NiSDK2SLRotJointNum(i, lib); if (n>=0) { *intptr = n; if (rotQuat[i].c>=0.0) { datptr[4] = (T)rotQuat[i].x; datptr[5] = (T)rotQuat[i].y; datptr[6] = (T)rotQuat[i].z; datptr[7] = (T)rotQuat[i].s; } } //num++; //datptr += ANM_COM_NUM_DATA; //intptr = (int*)datptr; } if (m>=0 || n>=0) { num++; datptr += ANM_COM_NUM_DATA; intptr = (int*)datptr; } } udphd->com[0] = ANM_COM_REQ_TRANSFER; memcpy(udphd->key, niNetwork->recvKey, ANM_COM_LEN_IDKEY); memcpy(udphd->uuid, (char*)(LPCSTR)niNetwork->appParam.animationUUID, ANM_COM_LEN_UUID); udphd->port = htons((unsigned short)niNetwork->appParam.clientPort); udphd->num = htons((unsigned short)num); udphd->sz = htons((unsigned short)sizeof(T)); unsigned short* ptm = (unsigned short*)&(udphd->com[2]); *ptm = htons(GetMsecondsTimer()); niNetwork->sendBuffer.vldsz = sizeof(udp_header) + num*ANM_COM_NUM_DATA*sizeof(T); udp_send_Buffer(niNetwork->sendSocket, &niNetwork->sendBuffer, &niNetwork->serverDataAddr); }