#pragma once #include "ExNiSHMemory.h" #include "ExNiJoints.h" #include "LogWndFrame.h" #include "xtools++.h" #include "WinTools.h" #include "MFCTool.h" #include "anm_data.h" // from Animation Server #define NINET_WM_NETFBPS_UPDATE JBXWL_WM_USER + 100 #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; unsigned long log_ttl_time; unsigned short log_lap_time; 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); void resetLapTimer(void); unsigned long getLapTime(void); public: void sendAnimationLogStart(NiSDK_Lib lib, int joint_num); void sendAnimationLogStop(void); }; ////////////////////////////////////////////////////////////////////////////////////////////////////// // // データ受信 // 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) { // from Data File. state |= NI_SDK_AVATAR_TRAILER; // has other information (trailer data) of avatar } // be processed by ProgcenslExternalAnimation.cpp // for (int j=0; jappParam.outDataPostion) { 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; // if (mode[1]==0) 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_INFO("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); } } template void sendAnimationLog(Vector currentPos, double* jointAngle, 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; int n, sz; // User Name mode = (unsigned short*)datptr; mode[0] = ANM_COM_DATA_NAME; // Buffer buf = make_Buffer(LNAME); copy_ts2Buffer(niNetwork->appParam.userName, &buf); memcpy(&datptr[1], buf.buf, ANM_COM_LEN_NAME+1); // +1 -> '\0' free_Buffer(&buf); // sz = (ANM_COM_LEN_NAME+sizeof(T))/sizeof(T) + 1; datptr += sz; len += sz; mode[1] = (unsigned short)(sz*sizeof(T)); // データ長 num++; // Lap Time unsigned long int laptime = niNetwork->getLapTime(); mode = (unsigned short*)datptr; mode[0] = ANM_COM_DATA_LAPTIME; *((unsigned long int*)(&datptr[1])) = laptime; sz = (sizeof(unsigned long int)+sizeof(T)-1)/sizeof(T) + 1; datptr += sz; len += sz; mode[1] = (unsigned short)(sz*sizeof(T)); // データ長 num++; // Position of PELVIS mode = (unsigned short*)datptr; mode[0] = ANM_COM_DATA_POSITION; mode[1] = 0; datptr[1] = (T)currentPos.x; datptr[2] = (T)currentPos.y; datptr[3] = (T)currentPos.z; datptr += 4; len += 4; num++; // Angle between Joints for (int j=0; j=0) { mode = (unsigned short*)datptr; mode[0] = ANM_COM_DATA_ANGLE; mode[1] = n; datptr[1] = (T)jointAngle[j]*(T)RAD2DEGREE; datptr += 2; len += 2; num++; } } // if (num>2) { udphd->com[0] = ANM_COM_LOG_ANGLE; 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); } }