#ifndef _PIPE_H_ #define _PIPE_H_ #pragma once #include #include #include "OVR_CAPI.h" using namespace std; #define COMMAND_DEVICE_IS_OPEN 1 #define COMMAND_GET_DATA 2 #define COMMAND_DEVICE_CALIBRATION 3 #define COMMAND_DEVICE_GET_PURE_DATA 4 #define COMMAND_DEVICE_ENTER_DFU_MODE 11 #define ENTER_DFU_MODE_SUCCESS 1 #define ENTER_DFU_MODE_FAILED 0 #define CALIBRATION_SUCCESS 1 #define CALIBRATION_FAILED 0 namespace DMPipe{ class PipeHMD { public: PipeHMD() :m_hPipe(INVALID_HANDLE_VALUE){} ~PipeHMD(); PipeHMD(std::string sname); BOOL IsOpen(); ovrSensorState GetSensorData(); SensorPureData GetPureSensorData(); BOOL EnterDFUMode(); BOOL Calibration(); inline LPCTSTR GetName() { return name.c_str(); } void SetName(std::string sname); private: std::string name; unsigned char reciveBuf[512]; unsigned char writeBuf[512]; DWORD readLenth; DWORD writeLenth; HANDLE m_hPipe; BOOL isConnection; inline void Init() { for (;;) { m_hPipe = CreateFile( GetName(), // pipe name GENERIC_READ | // read and write access GENERIC_WRITE, 0, // no sharing NULL, // default security attributes OPEN_EXISTING, // opens existing pipe 0, // default attributes NULL); // no template file // Break if the pipe handle is valid. if (m_hPipe != INVALID_HANDLE_VALUE) { isConnection = TRUE; return; } // Exit if an error other than ERROR_PIPE_BUSY occurs. if (GetLastError() != ERROR_PIPE_BUSY) { //char buf[255] = { 0 }; //printf(TEXT("Could not open pipe. GLE=%d\n"), GetLastError()); //TimeLog(buf); return; } // All pipe instances are busy, so wait for 1 milliseconds. if (!WaitNamedPipe(GetName(), 1)) { //TimeLog("Could not open pipe: 1 millisecond wait timed out."); return; } } } inline void Free() { if (m_hPipe == INVALID_HANDLE_VALUE) { isConnection = FALSE; return; } else { if (CloseHandle(m_hPipe)) { m_hPipe = INVALID_HANDLE_VALUE; isConnection = FALSE; } } } inline void PipeProcess(DWORD sizeofrecive) { this->Init(); if (isConnection) { BOOL fSuccess = FALSE; fSuccess = WriteFile( m_hPipe, // pipe handle writeBuf, // message sizeof(unsigned int) * 3, // message length &writeLenth, // bytes written NULL); // not overlapped if (!fSuccess) { char buf[255] = { 0 }; sprintf(buf, TEXT("WriteFile to pipe failed. GLE=%d\n"), GetLastError()); //TimeLog(buf); goto freepipe; } //printf("\nMessage sent to server, receiving reply as follows:\n"); do { // Read from the pipe. fSuccess = ReadFile( m_hPipe, // pipe handle reciveBuf, // buffer to receive reply sizeofrecive, // size of buffer &readLenth, // number of bytes read NULL); // not overlapped if (!fSuccess && GetLastError() != ERROR_MORE_DATA) break; } while (!fSuccess); // repeat loop if ERROR_MORE_DATA if (!fSuccess) { char buf[255] = { 0 }; sprintf(buf, TEXT("ReadFile from pipe failed. GLE=%d\n"), GetLastError()); //TimeLog(buf); goto freepipe; } freepipe: this->Free(); } } }; } #endif