#pragma once #include "ExNiSHMemory.h" #include "LogWndFrame.h" #include "xtools++.h" #include "WinTools.h" #include "MFCTool.h" #include "anm_data.h" // from Animation Server #define WM_USER_NETFBPS_UPDATE WM_USER + 100 #define WM_USER_NET_CLOSE WM_USER + 101 #define NINET_DEFAULT_KBPF 3 // k bits/frame. For smallest size with Kinect SDK #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 8100 #define NINET_UDP_TIMEOUT 5 // sec #define NINET_BUFFER_LEN 1600 // 最低 24(64bit)/48(32bit)個のジョイントデータを転送可能 // OpenNI:11joints, Kinect SDK:15joints #define NINET_FRM_RATE_INTVL 1 // interval of packet check (sec) #define NINET_KEEP_ALIVE 3 // min #define NINET_REGIST_WAIT_TIME 500 // ms #define NINET_WAIT_TIME 200 using namespace jbxl; using namespace jbxwl; class CExNiNetwork { public: CExNiNetwork(void); virtual ~CExNiNetwork(void); public: CParameterSet appParam; char* m_str_server; char* m_str_groupid; char* m_str_animid; BOOL locked_reciever; int recvSocket; int sendSocket; unsigned short portNAPT; struct sockaddr_in serverDataAddr; Buffer recvBuffer; Buffer sendBuffer; char recvKey[ANM_COM_LEN_IDKEY]; CExNiSHMemory* sharedMem; CLogWndDoc* pLogDoc; int keepAliveTime; float recvBps; float frameRate; int packetDelay; public: void setParameter(CParameterSet param); void setSharedMem(CExNiSHMemory* mem) { sharedMem = mem;} float getNetFPS(void) { return frameRate;} float getNetBPS(void) { return recvBps;} void clearNetFBPS(void); void openRecvSocket(void); void openSendSocket(void); void closeNetwork(void); void closeRecvSocket(void); void closeSendSocket(void); unsigned char serverLogin(void); int serverRegist(int sock, struct sockaddr_in sv_addr, udp_header* udphd); void serverLogout(void); void printNetInfo(udp_header* udphd); }; ////////////////////////////////////////////////////////////////////////////////////////////////////// // // データ受信 // UINT niNetworkRecieveLoop(LPVOID pParam); ///////////////////////////////////////////////////////////////////////////// // // データ送信 // template void sendAnimationData(Vector* posVect, Quaternion* rotQuat, CExNiNetwork* 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)); unsigned short* mode = NULL; int num = 0; int len = 0; // unsigned short state = 0; if (niNetwork->appParam.detectParts==NI_PROFILE_UPPER) { state |= NI_SDK_PROFILE_UPPER; } if (niNetwork->sharedMem->isTracking) { state |= NI_SDK_IS_TRACKING; } if (lib==NiSDK_None) { state |= NI_SDK_AVATAR_TRAILER; // has other information of avatar } // for (int j=0; jappParam.outDataCoord) { int n = NiSDK2SHMPosJointNum(j, lib); if (n>=0 && posVect[j].c>=0.0) { mode[0] = state | ANM_COM_DATA_POSITION; mode[1] = n; datptr[1] = (T)posVect[j].x; datptr[2] = (T)posVect[j].y; datptr[3] = (T)posVect[j].z; datptr += 3; len += 3; } } else if (j==0 && niNetwork->appParam.outDataQuate) { int n = NiSDK2SHMPosJointNum(0, lib); if (n>=0 && posVect[0].c>=0.0) { mode[0] = state | ANM_COM_DATA_POSITION; mode[1] = n; datptr[1] = (T)posVect[0].x; datptr[2] = (T)posVect[0].y; datptr[3] = (T)posVect[0].z; datptr += 3; len += 3; } } // Rotation if (niNetwork->appParam.outDataQuate) { int n = NiSDK2SHMRotJointNum(j, lib); if (n>=0 && rotQuat[j].c>=0.0) { mode[0]|= state | ANM_COM_DATA_ROTATION; mode[1] = n; datptr[1] = (T)rotQuat[j].x; datptr[2] = (T)rotQuat[j].y; datptr[3] = (T)rotQuat[j].z; datptr[4] = (T)rotQuat[j].s; datptr += 4; len += 4; } } if ((mode[0]&0x00ff)!=0x0000) { num++; datptr++; len++; //DEBUG_ERR("NET = %d: %s", j, NiSDK2JointName(j, NiSDK_None).c_str()); } } // if (num>0) { udphd->com[0] = ANM_COM_REQ_TRANSFER; memcpy(udphd->key, niNetwork->recvKey, ANM_COM_LEN_IDKEY); memcpy(udphd->uuid, niNetwork->m_str_animid, ANM_COM_LEN_UUID); udphd->port = htons(niNetwork->portNAPT); 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) + len*sizeof(T); udp_send_Buffer(niNetwork->sendSocket, &niNetwork->sendBuffer, &niNetwork->serverDataAddr); } }