#pragma once #include "NiObjects/NiSMemory.h" #include "NiToolWin.h" #include "LogWndFrame.h" #include "xtools++.h" #include "Rotation.h" #include "WinTools.h" #include "MainFrm.h" #include "ParameterSet.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 // 1500 + 100 #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 CNiNetwork { public: CNiNetwork(void); ~CNiNetwork(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]; CNiSMemory* sharedMem; CLogWndDoc* pLogDoc; int keepAliveTime; float recvBps; float frameRate; int packetDelay; public: void setParameter(CParameterSet param); void setSharedMem(CNiSMemory* 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, 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)); unsigned short* mode = NULL; int num = 0; int len = 0; // for (int j=0; jappParam.outDataCoord) { int n = NiSDK2SLPosJointNum(j, lib); if (n>=0) { mode[0] = ANM_COM_DATA_POSITION; mode[1] = n; if (posVect[j].c>=0.0) { 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 = NiSDK2SLPosJointNum(0, lib); if (n>=0) { mode[0] = ANM_COM_DATA_POSITION; mode[1] = n; if (posVect[0].c>=0.0) { 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 = NiSDK2SLRotJointNum(j, lib); if (n>=0) { mode[0]|= ANM_COM_DATA_ROTATION; mode[1] = n; if (rotQuat[j].c>=0.0) { 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]!=0x00) { num++; datptr++; len++; } } // 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); } }