@@ -93,6 +93,58 @@ int freenect_set_flag(freenect_device *dev, freenect_flag flag, freenect_flag_va
9393 return write_cmos_register (dev , 0x0106 , cmos_value );
9494}
9595
96+ int freenect_get_exposure (freenect_device * dev , int * time_us )
97+ {
98+ freenect_context * ctx = dev -> parent ;
99+
100+ uint16_t shutter_width = read_cmos_register (dev , 0x0009 );
101+ if (shutter_width == UINT16_MAX )
102+ {
103+ return -1 ;
104+ }
105+ switch (dev -> video_format ) {
106+ case FREENECT_VIDEO_RGB :
107+ case FREENECT_VIDEO_BAYER :
108+ * time_us = shutter_width * SHUTTER_WIDTH_TO_EXP_RGB ;
109+ break ;
110+ case FREENECT_VIDEO_YUV_RGB :
111+ case FREENECT_VIDEO_YUV_RAW :
112+ * time_us = shutter_width * SHUTTER_WIDTH_TO_EXP_YUV ;
113+ break ;
114+ case FREENECT_VIDEO_DUMMY :
115+ case FREENECT_VIDEO_IR_8BIT :
116+ case FREENECT_VIDEO_IR_10BIT :
117+ case FREENECT_VIDEO_IR_10BIT_PACKED :
118+ FN_WARNING ("Could not get exposure, invalid video format" );
119+ return -1 ;
120+ }
121+ return 0 ;
122+ }
123+
124+ int freenect_set_exposure (freenect_device * dev , int time_us )
125+ {
126+ freenect_context * ctx = dev -> parent ;
127+
128+ uint16_t cmos_value = 0 ;
129+ switch (dev -> video_format ) {
130+ case FREENECT_VIDEO_RGB :
131+ case FREENECT_VIDEO_BAYER :
132+ cmos_value = time_us / SHUTTER_WIDTH_TO_EXP_RGB ;
133+ break ;
134+ case FREENECT_VIDEO_YUV_RGB :
135+ case FREENECT_VIDEO_YUV_RAW :
136+ cmos_value = time_us / SHUTTER_WIDTH_TO_EXP_YUV ;
137+ break ;
138+ case FREENECT_VIDEO_DUMMY :
139+ case FREENECT_VIDEO_IR_8BIT :
140+ case FREENECT_VIDEO_IR_10BIT :
141+ case FREENECT_VIDEO_IR_10BIT_PACKED :
142+ FN_WARNING ("Could not set exposure, invalid video format" );
143+ return -1 ;
144+ }
145+ return write_cmos_register (dev , 0x0009 , cmos_value );;
146+ }
147+
96148int freenect_get_ir_brightness (freenect_device * dev )
97149{
98150 freenect_context * ctx = dev -> parent ;
0 commit comments