ohmdq* ohmdq_create(ohmd_context* ctx, unsigned elem_size, unsigned max) { ohmdq* me = ohmd_alloc(ctx, sizeof(ohmdq)); me->elems = ohmd_alloc(ctx, elem_size * max); me->max = max; me->elem_size = elem_size; me->read_pos = 0; me->write_pos = 0; me->size = 0; me->mutex = ohmd_create_mutex(ctx); return me; }
ohmd_driver* ohmd_create_oculus_rift_drv(ohmd_context* ctx) { ohmd_driver* drv = ohmd_alloc(ctx, sizeof(ohmd_driver)); if(drv == NULL) return NULL; drv->get_device_list = get_device_list; drv->open_device = open_device; drv->ctx = ctx; drv->get_device_list = get_device_list; drv->open_device = open_device; drv->destroy = destroy_driver; return drv; }
ohmd_mutex* ohmd_create_mutex(ohmd_context* ctx) { pthread_mutex_t* mutex = ohmd_alloc(ctx, sizeof(pthread_mutex_t)); if(mutex == NULL) return NULL; int ret = pthread_mutex_init(mutex, NULL); if(ret != 0){ free(mutex); mutex = NULL; } return (ohmd_mutex*)mutex; }
ohmd_thread* ohmd_create_thread(ohmd_context* ctx, unsigned int (*routine)(void* arg), void* arg) { ohmd_thread* thread = ohmd_alloc(ctx, sizeof(ohmd_thread)); if(thread == NULL) return NULL; thread->arg = arg; thread->routine = routine; int ret = pthread_create(&thread->thread, NULL, pthread_wrapper, thread); if(ret != 0){ free(thread); thread = NULL; } return thread; }
static ohmd_device* open_device(ohmd_driver* driver, ohmd_device_desc* desc) { rift_priv* priv = ohmd_alloc(driver->ctx, sizeof(rift_priv)); if(!priv) goto cleanup; priv->base.ctx = driver->ctx; // Open the HID device priv->handle = hid_open_path(desc->path); if(!priv->handle) goto cleanup; if(hid_set_nonblocking(priv->handle, 1) == -1){ ohmd_set_error(driver->ctx, "failed to set non-blocking on device"); goto cleanup; } unsigned char buf[FEATURE_BUFFER_SIZE]; int size; // Read and decode the sensor range size = get_feature_report(priv, RIFT_CMD_RANGE, buf); decode_sensor_range(&priv->sensor_range, buf, size); dump_packet_sensor_range(&priv->sensor_range); // Read and decode display information size = get_feature_report(priv, RIFT_CMD_DISPLAY_INFO, buf); decode_sensor_display_info(&priv->display_info, buf, size); dump_packet_sensor_display_info(&priv->display_info); // Read and decode the sensor config size = get_feature_report(priv, RIFT_CMD_SENSOR_CONFIG, buf); decode_sensor_config(&priv->sensor_config, buf, size); dump_packet_sensor_config(&priv->sensor_config); // if the sensor has display info data, use HMD coordinate frame priv->coordinate_frame = priv->display_info.distortion_type != RIFT_DT_NONE ? RIFT_CF_HMD : RIFT_CF_SENSOR; // apply sensor config set_coordinate_frame(priv, priv->coordinate_frame); // set keep alive interval to n seconds pkt_keep_alive keep_alive = { 0, KEEP_ALIVE_VALUE }; size = encode_keep_alive(buf, &keep_alive); send_feature_report(priv, buf, size); // Update the time of the last keep alive we have sent. priv->last_keep_alive = ohmd_get_tick(); // update sensor settings with new keep alive value // (which will have been ignored in favor of the default 1000 ms one) size = get_feature_report(priv, RIFT_CMD_SENSOR_CONFIG, buf); decode_sensor_config(&priv->sensor_config, buf, size); dump_packet_sensor_config(&priv->sensor_config); // Set default device properties ohmd_set_default_device_properties(&priv->base.properties); // Set device properties priv->base.properties.hsize = priv->display_info.h_screen_size; priv->base.properties.vsize = priv->display_info.v_screen_size; priv->base.properties.hres = priv->display_info.h_resolution; priv->base.properties.vres = priv->display_info.v_resolution; priv->base.properties.lens_sep = priv->display_info.lens_separation; priv->base.properties.lens_vpos = priv->display_info.v_center; priv->base.properties.fov = DEG_TO_RAD(125.5144f); // TODO calculate. priv->base.properties.ratio = ((float)priv->display_info.h_resolution / (float)priv->display_info.v_resolution) / 2.0f; // calculate projection eye projection matrices from the device properties ohmd_calc_default_proj_matrices(&priv->base.properties); // set up device callbacks priv->base.update = update_device; priv->base.close = close_device; priv->base.getf = getf; // initialize sensor fusion ofusion_init(&priv->sensor_fusion); return &priv->base; cleanup: if(priv) free(priv); return NULL; }
static ohmd_device* open_device(ohmd_driver* driver, ohmd_device_desc* desc) { rift_priv* priv = ohmd_alloc(driver->ctx, sizeof(rift_priv)); if(!priv) goto cleanup; priv->base.ctx = driver->ctx; // Open the HID device priv->handle = hid_open_path(desc->path); if(!priv->handle) { char* path = _hid_to_unix_path(desc->path); ohmd_set_error(driver->ctx, "Could not open %s. " "Check your rights.", path); free(path); goto cleanup; } if(hid_set_nonblocking(priv->handle, 1) == -1){ ohmd_set_error(driver->ctx, "failed to set non-blocking on device"); goto cleanup; } unsigned char buf[FEATURE_BUFFER_SIZE]; int size; // if the sensor has display info data, use HMD coordinate frame priv->coordinate_frame = priv->display_info.distortion_type != RIFT_DT_NONE ? RIFT_CF_HMD : RIFT_CF_SENSOR; // enable calibration SETFLAG(priv->sensor_config.flags, RIFT_SCF_USE_CALIBRATION, 1); SETFLAG(priv->sensor_config.flags, RIFT_SCF_AUTO_CALIBRATION, 1); // apply sensor config set_coordinate_frame(priv, priv->coordinate_frame); // set keep alive interval to n seconds pkt_keep_alive keep_alive = { 0, KEEP_ALIVE_VALUE }; size = dp_encode_keep_alive(buf, &keep_alive); send_feature_report(priv, buf, size); // Update the time of the last keep alive we have sent. priv->last_keep_alive = ohmd_get_tick(); // Set default device properties ohmd_set_default_device_properties(&priv->base.properties); // Set device properties //NOTE: These values are estimations, no one has taken one appart to check priv->base.properties.hsize = 0.1698f; priv->base.properties.vsize = 0.0936f; priv->base.properties.hres = 1920; priv->base.properties.vres = 1080; priv->base.properties.lens_sep = 0.0849f; priv->base.properties.lens_vpos = 0.0468f;; priv->base.properties.fov = DEG_TO_RAD(110.0); // TODO calculate. priv->base.properties.ratio = ((float)1920 / (float)1080) / 2.0f; // calculate projection eye projection matrices from the device properties ohmd_calc_default_proj_matrices(&priv->base.properties); // set up device callbacks priv->base.update = update_device; priv->base.close = close_device; priv->base.getf = getf; // initialize sensor fusion ofusion_init(&priv->sensor_fusion); return &priv->base; cleanup: if(priv) free(priv); return NULL; }
static ohmd_device* open_device(ohmd_driver* driver, ohmd_device_desc* desc) { rift_priv* priv = ohmd_alloc(driver->ctx, sizeof(rift_priv)); if(!priv) goto cleanup; priv->base.ctx = driver->ctx; // Open the HID device priv->handle = hid_open_path(desc->path); if(!priv->handle) goto cleanup; if(hid_set_nonblocking(priv->handle, 1) == -1){ ohmd_set_error(driver->ctx, "failed to set non-blocking on device"); goto cleanup; } unsigned char buf[FEATURE_BUFFER_SIZE]; int size; // Set default values. ohmd_set_default_device_properties(&priv->base); // Read and decode the sensor range size = get_feature_report(priv, RIFT_CMD_RANGE, buf); decode_sensor_range(&priv->sensor_range, buf, size); dump_packet_sensor_range(&priv->sensor_range); // Read and decode display information size = get_feature_report(priv, RIFT_CMD_DISPLAY_INFO, buf); decode_sensor_display_info(&priv->display_info, buf, size); dump_packet_sensor_display_info(&priv->display_info); // Read and decode the sensor config size = get_feature_report(priv, RIFT_CMD_SENSOR_CONFIG, buf); decode_sensor_config(&priv->sensor_config, buf, size); dump_packet_sensor_config(&priv->sensor_config); // if the sensor has display info data, use HMD coordinate frame priv->coordinate_frame = priv->display_info.distortion_type != RIFT_DT_NONE ? RIFT_CF_HMD : RIFT_CF_SENSOR; // apply sensor config set_coordinate_frame(priv, priv->coordinate_frame); // set keep alive interval to n seconds pkt_keep_alive keep_alive = { 0, KEEP_ALIVE_VALUE }; size = encode_keep_alive(buf, &keep_alive); send_feature_report(priv, buf, size); // Update the time of the last keep alive we have sent. priv->last_keep_alive = ohmd_get_tick(); // update sensor settings with new keep alive value // (which will have been ignored in favor of the default 1000 ms one) size = get_feature_report(priv, RIFT_CMD_SENSOR_CONFIG, buf); decode_sensor_config(&priv->sensor_config, buf, size); dump_packet_sensor_config(&priv->sensor_config); // Also sets the exported values. calc_derived_values(priv); priv->base.update = update_device; priv->base.close = close_device; priv->base.getf = getf; ofusion_init(&priv->sensor_fusion); return &priv->base; cleanup: if(priv) free(priv); return NULL; }