19 #if defined(_WIN32) && defined(VRPN_USE_DIRECTINPUT) && defined(VRPN_HAVE_ATLBASE) 24 short FromTwos(
unsigned short x) {
39 vrpn_Tracker_zSight::vrpn_Tracker_zSight(
const char* name,
vrpn_Connection* c) :
43 hWnd = CreateWindow(
"STATIC",
"zSightWindow", WS_ICONIC, 0, 0, 10, 10, NULL, NULL, NULL, NULL);
46 if (FAILED(InitDevice())) {
47 fprintf(stderr,
"vrpn_Tracker_zSight::vrpn_Tracker_zSight(): Failed to open device\n");
56 vrpn_Tracker_zSight::~vrpn_Tracker_zSight()
64 void vrpn_Tracker_zSight::mainloop()
73 void vrpn_Tracker_zSight::get_report()
81 if (FAILED(hr = sensics->GetDeviceState(
sizeof(DIJOYSTATE2), &js))) {
82 fprintf(stderr,
"vrpn_Tracker_zSight::get_report(): Can't read tracker\n");
89 float w = FromTwos((
unsigned short) js.lRx) / 32768.0f;
90 float x = FromTwos((
unsigned short) js.lRy) / 32768.0f;
91 float y = FromTwos((
unsigned short) js.lX) / 32768.0f;
92 float z = FromTwos((
unsigned short) js.lY) / 32768.0f;
93 float mag = sqrt(w*w + x*x + y*y + z*z);
106 void vrpn_Tracker_zSight::send_report()
110 int len = encode_to(msgbuf);
111 if (d_connection->pack_message(len, timestamp, position_m_id, d_sender_id, msgbuf,
113 fprintf(stderr,
"vrpn_Tracker_zSight: cannot write message: tossing\n");
118 HRESULT vrpn_Tracker_zSight::InitDevice()
123 if (FAILED(hr = DirectInput8Create(GetModuleHandle(NULL),
126 (
void**)&directInput, NULL))) {
127 fprintf(stderr,
"vrpn_Tracker_zSight::InitDevice(): Cannot open DirectInput\n");
132 if (FAILED(hr = directInput->EnumDevices(DI8DEVCLASS_GAMECTRL, EnumSensicsCallback,
this, DIEDFL_ATTACHEDONLY))) {
133 fprintf(stderr,
"vrpn_Tracker_zSight::InitDevice(): Cannot enumerate device\n");
138 if (sensics == NULL) {
139 fprintf(stderr,
"vrpn_Tracker_zSight::InitDevice(): No Sensics zSight device found\n");
144 if (FAILED(hr = sensics->SetDataFormat(&c_dfDIJoystick2)))
146 fprintf(stderr,
"vrpn_Tracker_zSight::InitDevice(): Cannot set data format\n");
147 sensics->Unacquire();
152 if (FAILED(hr = sensics->SetCooperativeLevel(hWnd, DISCL_EXCLUSIVE | DISCL_BACKGROUND))) {
153 fprintf(stderr,
"vrpn_Tracker_zSight::InitDevice(): Cannot set cooperative level\n");
154 sensics->Unacquire();
159 if (FAILED(hr = sensics->EnumObjects(EnumObjectsCallback,
this, DIDFT_AXIS))) {
160 fprintf(stderr,
"vrpn_Tracker_zSight::InitDevice(): Cannot enumerate objects\n");
161 sensics->Unacquire();
166 if (FAILED(hr = sensics->Acquire())) {
171 case DIERR_INVALIDPARAM:
172 reason =
"Invalid parameter";
175 case DIERR_NOTINITIALIZED:
176 reason =
"Not initialized";
179 case DIERR_OTHERAPPHASPRIO:
180 reason =
"Another application has priority";
187 fprintf(stderr,
"vrpn_Tracker_zSight::InitDevice(): Cannot acquire device because %s\n", reason);
188 sensics->Unacquire();
195 BOOL CALLBACK vrpn_Tracker_zSight::EnumSensicsCallback(
const DIDEVICEINSTANCE* pdidInstance, VOID* selfPtr)
197 vrpn_Tracker_zSight* me = (vrpn_Tracker_zSight*)(selfPtr);
201 hr = me->directInput->CreateDevice(pdidInstance->guidInstance, &me->sensics, NULL);
204 if (SUCCEEDED(hr) == TRUE) {
205 if (strcmp(pdidInstance->tszProductName,
"Sensics zSight HMD") != 0) {
206 me->sensics->Unacquire();
213 return DIENUM_CONTINUE;
216 BOOL CALLBACK vrpn_Tracker_zSight::EnumObjectsCallback(
const DIDEVICEOBJECTINSTANCE* pdidoi, VOID* selfPtr)
218 vrpn_Tracker_zSight* me = (vrpn_Tracker_zSight*)(selfPtr);
220 if (pdidoi->dwType & DIDFT_AXIS) {
222 ::memset(&diprg, 0,
sizeof(DIPROPRANGE));
223 diprg.diph.dwSize =
sizeof(DIPROPRANGE);
224 diprg.diph.dwHeaderSize =
sizeof(DIPROPHEADER);
225 diprg.diph.dwHow = DIPH_BYID;
226 diprg.diph.dwObj = pdidoi->dwType;
231 if (FAILED(me->sensics->SetProperty(DIPROP_RANGE, &diprg.diph))) {
232 fprintf(stderr,
"vrpn_Tracker_zSight::vrpn_Tracker_zSight(): Cannot set data range\n");
237 return DIENUM_CONTINUE;
const vrpn_uint32 vrpn_CONNECTION_LOW_LATENCY
int register_server_handlers(void)
Generic connection class not specific to the transport mechanism.
#define vrpn_gettimeofday