The open source OpenXR runtime
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

d/wmr: Centralize exposure and gain update logic

Also use the new draggable_u16 UI input for exposure.

authored by

Mateo de Mayo and committed by
Jakob Bornecrantz
84422acd 7d266c76

+49 -35
+43 -35
src/xrt/drivers/wmr/wmr_camera.c
··· 25 25 #include "wmr_protocol.h" 26 26 #include "wmr_camera.h" 27 27 28 + static int 29 + update_expgain(struct wmr_camera *cam); 28 30 29 31 /* 30 32 * ··· 48 50 49 51 #define DEFAULT_EXPOSURE 6000 50 52 #define DEFAULT_GAIN 127 51 - 52 - #define UI_EXPOSURE_STEP_SIZE 200 53 53 54 54 struct wmr_camera_active_cmd 55 55 { ··· 92 92 93 93 struct libusb_transfer *xfers[NUM_XFERS]; 94 94 95 - uint8_t last_gain, debug_gain; 96 - uint8_t last_exposure, debug_exposure; 95 + uint16_t last_exposure, exposure; 96 + uint8_t last_gain, gain; 97 + struct u_var_draggable_u16 exposure_ui; //! Widget to control `exposure` value 97 98 98 99 struct u_sink_debug debug_sinks[2]; 99 100 ··· 360 361 u_frame_create_roi(xf, cam->configs[0].roi, &xf_left); 361 362 u_frame_create_roi(xf, cam->configs[1].roi, &xf_right); 362 363 364 + update_expgain(cam); 365 + 363 366 if (cam->left_sink != NULL) { 364 367 xrt_sink_push_frame(cam->left_sink, xf_left); 365 368 } ··· 373 376 } 374 377 375 378 xrt_frame_reference(&xf, NULL); 376 - 377 - if (cam->last_exposure != cam->debug_exposure || cam->last_gain != cam->debug_gain) { 378 - int i; 379 - 380 - for (i = 0; i < cam->config_count; i++) { 381 - const struct wmr_camera_config *config = &cam->configs[i]; 382 - if (config->purpose != WMR_CAMERA_PURPOSE_HEAD_TRACKING) { 383 - continue; 384 - } 385 - wmr_camera_set_exposure_gain(cam, config->location, cam->debug_exposure * UI_EXPOSURE_STEP_SIZE, 386 - cam->debug_gain); 387 - } 388 - } 389 379 390 380 out: 391 381 libusb_submit_transfer(xfer); ··· 411 401 int i; 412 402 413 403 cam->log_level = log_level; 414 - cam->debug_gain = DEFAULT_GAIN; 415 - cam->debug_exposure = DEFAULT_EXPOSURE / UI_EXPOSURE_STEP_SIZE; 404 + cam->exposure = DEFAULT_EXPOSURE; 405 + cam->gain = DEFAULT_GAIN; 416 406 417 407 if (os_thread_helper_init(&cam->usb_thread) != 0) { 418 408 WMR_CAM_ERROR(cam, "Failed to initialise threading"); ··· 449 439 } 450 440 } 451 441 442 + cam->exposure_ui.val = &cam->exposure; 443 + cam->exposure_ui.max = WMR_MAX_EXPOSURE; 444 + cam->exposure_ui.min = WMR_MIN_EXPOSURE; 445 + cam->exposure_ui.step = 25; 446 + 452 447 u_sink_debug_init(&cam->debug_sinks[0]); 453 448 u_sink_debug_init(&cam->debug_sinks[1]); 454 449 u_var_add_root(cam, "WMR Camera", true); 455 450 u_var_add_log_level(cam, &cam->log_level, "Log level"); 456 - u_var_add_u8(cam, &cam->debug_gain, "Gain"); 457 - u_var_add_u8(cam, &cam->debug_exposure, "Exposure * 200"); 451 + u_var_add_draggable_u16(cam, &cam->exposure_ui, "Exposure (usec)"); 452 + u_var_add_u8(cam, &cam->gain, "Gain"); 458 453 u_var_add_sink_debug(cam, &cam->debug_sinks[0], "Tracking Streams"); 459 454 u_var_add_sink_debug(cam, &cam->debug_sinks[1], "Controller Streams"); 460 455 ··· 532 527 goto fail; 533 528 } 534 529 535 - for (int i = 0; i < cam->config_count; i++) { 536 - const struct wmr_camera_config *config = &cam->configs[i]; 537 - if (config->purpose != WMR_CAMERA_PURPOSE_HEAD_TRACKING) { 538 - continue; 539 - } 540 - 541 - res = wmr_camera_set_exposure_gain(cam, config->location, cam->debug_exposure * UI_EXPOSURE_STEP_SIZE, 542 - cam->debug_gain); 543 - if (res < 0) { 544 - WMR_CAM_ERROR(cam, "Failed to set initial gain for camera %d", i); 545 - goto fail; 546 - } 530 + res = update_expgain(cam); 531 + if (res < 0) { 532 + goto fail; 547 533 } 548 534 549 535 for (int i = 0; i < NUM_XFERS; i++) { ··· 610 596 return false; 611 597 } 612 598 599 + static int 600 + update_expgain(struct wmr_camera *cam) 601 + { 602 + if (cam->last_exposure == cam->exposure && cam->last_gain == cam->gain) { 603 + return 0; 604 + } 605 + cam->last_exposure = cam->exposure; 606 + cam->last_gain = cam->gain; 607 + 608 + int res = 0; 609 + for (int i = 0; i < cam->config_count; i++) { 610 + const struct wmr_camera_config *config = &cam->configs[i]; 611 + if (config->purpose != WMR_CAMERA_PURPOSE_HEAD_TRACKING) { 612 + continue; 613 + } 614 + res = wmr_camera_set_exposure_gain(cam, config->location, cam->exposure, cam->gain); 615 + if (res != 0) { 616 + WMR_CAM_ERROR(cam, "Failed to set exposure and gain for camera %d", i); 617 + return res; 618 + } 619 + } 620 + return res; 621 + } 622 + 613 623 int 614 624 wmr_camera_set_exposure_gain(struct wmr_camera *cam, uint8_t camera_id, uint16_t exposure, uint8_t gain) 615 625 { ··· 624 634 .gain = __cpu_to_le16(gain), 625 635 .camera_id2 = __cpu_to_le16(camera_id), 626 636 }; 627 - 628 - cam->last_gain = gain; 629 637 630 638 return send_buffer_to_device(cam, (uint8_t *)&cmd, sizeof(cmd)); 631 639 }
+6
src/xrt/drivers/wmr/wmr_protocol.h
··· 55 55 #define STR_TO_U32(s) ((uint32_t)(((s)[0]) | ((s)[1] << 8) | ((s)[2] << 16) | ((s)[3] << 24))) 56 56 #define WMR_MAGIC STR_TO_U32("Dlo+") 57 57 58 + #define WMR_MIN_EXPOSURE 120 59 + #define WMR_MAX_OBSERVED_EXPOSURE 6000 60 + #define WMR_MAX_EXPOSURE 9000 61 + #define WMR_MIN_GAIN 16 62 + #define WMR_MAX_GAIN 255 63 + 58 64 static const unsigned char hololens_sensors_imu_on[64] = {0x02, 0x07}; 59 65 60 66