Skip to content

Commit 6b33537

Browse files
author
dongxu
committed
Merge branch 'master' into dxli
2 parents 1016cb6 + ce23565 commit 6b33537

File tree

7 files changed

+80
-60
lines changed

7 files changed

+80
-60
lines changed

examples/CMakeLists.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ if (WIN32)
1818
endif()
1919

2020
add_executable(glview glview.c)
21+
add_executable(minimal minimal.c)
2122
add_executable(regview regview.c)
2223
add_executable(hiview hiview.c)
2324
if(BUILD_AUDIO)
@@ -38,6 +39,7 @@ include_directories (../wrappers/c_sync/)
3839
if(APPLE)
3940
set(CMAKE_EXE_LINKER_FLAGS "-framework OpenGL -framework GLUT")
4041
target_link_libraries(glview freenect)
42+
target_link_libraries(minimal freenect)
4143
target_link_libraries(regview freenect)
4244
target_link_libraries(hiview freenect)
4345
if (BUILD_AUDIO)
@@ -65,6 +67,7 @@ else()
6567
endif()
6668

6769
target_link_libraries(glview freenect ${OPENGL_LIBRARIES} ${GLUT_LIBRARY} ${CMAKE_THREAD_LIBS_INIT} ${MATH_LIB})
70+
target_link_libraries(minimal freenect ${OPENGL_LIBRARIES} ${GLUT_LIBRARY} ${CMAKE_THREAD_LIBS_INIT} ${MATH_LIB})
6871
target_link_libraries(regview freenect ${OPENGL_LIBRARIES} ${GLUT_LIBRARY} ${CMAKE_THREAD_LIBS_INIT} ${MATH_LIB})
6972
target_link_libraries(hiview freenect ${OPENGL_LIBRARIES} ${GLUT_LIBRARY} ${CMAKE_THREAD_LIBS_INIT} ${MATH_LIB})
7073
if (BUILD_AUDIO)

examples/glview.c

Lines changed: 2 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,6 @@ GLuint gl_rgb_tex;
6767
freenect_context *f_ctx;
6868
freenect_device *f_dev;
6969
int freenect_angle = 0;
70-
int freenect_led;
7170

7271
freenect_video_format requested_format = FREENECT_VIDEO_RGB;
7372
freenect_video_format current_format = FREENECT_VIDEO_RGB;
@@ -179,29 +178,6 @@ void keyPressed(unsigned char key, int x, int y)
179178
freenect_angle = -30;
180179
}
181180
}
182-
if (key == '1') {
183-
freenect_set_led(f_dev,LED_GREEN);
184-
}
185-
if (key == '2') {
186-
freenect_set_led(f_dev,LED_RED);
187-
}
188-
if (key == '3') {
189-
freenect_set_led(f_dev,LED_YELLOW);
190-
}
191-
if (key == '4') {
192-
freenect_set_led(f_dev,LED_BLINK_GREEN);
193-
}
194-
if (key == '5') {
195-
// 5 is the same as 4
196-
freenect_set_led(f_dev,LED_BLINK_GREEN);
197-
}
198-
if (key == '6') {
199-
freenect_set_led(f_dev,LED_BLINK_RED_YELLOW);
200-
}
201-
if (key == '0') {
202-
freenect_set_led(f_dev,LED_OFF);
203-
}
204-
freenect_set_tilt_degs(f_dev,freenect_angle);
205181
}
206182

207183
void ReSizeGLScene(int Width, int Height)
@@ -335,10 +311,6 @@ void rgb_cb(freenect_device *dev, void *rgb, uint32_t timestamp)
335311

336312
void *freenect_threadfunc(void *arg)
337313
{
338-
int accelCount = 0;
339-
340-
freenect_set_tilt_degs(f_dev,freenect_angle);
341-
freenect_set_led(f_dev,LED_RED);
342314
freenect_set_depth_callback(f_dev, depth_cb);
343315
freenect_set_video_callback(f_dev, rgb_cb);
344316
freenect_set_video_mode(f_dev, freenect_find_video_mode(FREENECT_RESOLUTION_MEDIUM, current_format));
@@ -348,22 +320,7 @@ void *freenect_threadfunc(void *arg)
348320
freenect_start_depth(f_dev);
349321
freenect_start_video(f_dev);
350322

351-
printf("'w'-tilt up, 's'-level, 'x'-tilt down, '0'-'6'-select LED mode, 'f'-video format\n");
352-
353323
while (!die && freenect_process_events(f_ctx) >= 0) {
354-
//Throttle the text output
355-
if (accelCount++ >= 2000)
356-
{
357-
accelCount = 0;
358-
freenect_raw_tilt_state* state;
359-
freenect_update_tilt_state(f_dev);
360-
state = freenect_get_tilt_state(f_dev);
361-
double dx,dy,dz;
362-
freenect_get_mks_accel(state, &dx, &dy, &dz);
363-
printf("\r raw acceleration: %4d %4d %4d mks acceleration: %4f %4f %4f", state->accelerometer_x, state->accelerometer_y, state->accelerometer_z, dx, dy, dz);
364-
fflush(stdout);
365-
}
366-
367324
if (requested_format != current_format) {
368325
freenect_stop_video(f_dev);
369326
freenect_set_video_mode(f_dev, freenect_find_video_mode(FREENECT_RESOLUTION_MEDIUM, requested_format));
@@ -411,8 +368,8 @@ int main(int argc, char **argv)
411368
return 1;
412369
}
413370

414-
freenect_set_log_level(f_ctx, FREENECT_LOG_DEBUG);
415-
freenect_select_subdevices(f_ctx, (freenect_device_flags)(FREENECT_DEVICE_MOTOR | FREENECT_DEVICE_CAMERA));
371+
freenect_set_log_level(f_ctx, FREENECT_LOG_SPEW);
372+
freenect_select_subdevices(f_ctx, (freenect_device_flags)(FREENECT_DEVICE_CAMERA));
416373

417374
int nr_devices = freenect_num_devices (f_ctx);
418375
printf ("Number of devices found: %d\n", nr_devices);

examples/hiview.c

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,6 @@ GLuint gl_rgb_tex;
6868

6969
freenect_context *f_ctx;
7070
freenect_device *f_dev;
71-
int freenect_led;
7271

7372
freenect_video_format requested_format = FREENECT_VIDEO_RGB;
7473
freenect_video_format current_format = FREENECT_VIDEO_RGB;
@@ -360,7 +359,6 @@ void video_cb(freenect_device *dev, void *rgb, uint32_t timestamp)
360359

361360
void *freenect_threadfunc(void *arg)
362361
{
363-
freenect_set_led(f_dev,LED_RED);
364362
freenect_set_depth_callback(f_dev, depth_cb);
365363
freenect_set_video_callback(f_dev, video_cb);
366364
freenect_set_video_mode(f_dev, freenect_find_video_mode(current_resolution, current_format));
@@ -436,7 +434,7 @@ int main(int argc, char **argv)
436434
}
437435

438436
freenect_set_log_level(f_ctx, FREENECT_LOG_DEBUG);
439-
freenect_select_subdevices(f_ctx, (freenect_device_flags)(FREENECT_DEVICE_MOTOR | FREENECT_DEVICE_CAMERA));
437+
freenect_select_subdevices(f_ctx, FREENECT_DEVICE_CAMERA);
440438

441439
int nr_devices = freenect_num_devices (f_ctx);
442440
printf ("Number of devices found: %d\n", nr_devices);

src/cameras.c

Lines changed: 39 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -903,13 +903,28 @@ static int freenect_fetch_zero_plane_info(freenect_device *dev)
903903
uint16_t cmd[5] = {0}; // Offset is the only field in this command, and it's 0
904904

905905
int res;
906-
res = send_cmd(dev, 0x04, cmd, 10, reply, 322); //OPCODE_GET_FIXED_PARAMS = 4,
907-
if (res != 322) {
908-
FN_ERROR("freenect_fetch_zero_plane_info: send_cmd read %d bytes (expected 322)\n", res);
906+
int expected_len = 0;
907+
int struct_offset = 0;
908+
switch(dev->hwrev) {
909+
case HWREV_XBOX360_0:
910+
expected_len = 322;
911+
struct_offset = 94;
912+
break;
913+
case HWREV_K4W_0:
914+
expected_len = 334;
915+
struct_offset = 94;
916+
break;
917+
}
918+
919+
res = send_cmd(dev, 0x04, cmd, 10, reply, expected_len); //OPCODE_GET_FIXED_PARAMS = 4,
920+
if (res != expected_len) {
921+
FN_ERROR("freenect_fetch_zero_plane_info: send_cmd read %d bytes (expected %d)\n", res, expected_len);
922+
909923
return -1;
910924
}
911925

912-
memcpy(&(dev->registration.zero_plane_info), reply + 94, sizeof(dev->registration.zero_plane_info));
926+
memcpy(&(dev->registration.zero_plane_info), reply + struct_offset, sizeof(dev->registration.zero_plane_info));
927+
913928
uint32_t temp;
914929
temp = fn_le32(*((uint32_t*)(&dev->registration.zero_plane_info.dcmos_emitter_dist)));
915930
dev->registration.zero_plane_info.dcmos_emitter_dist = *((float*)(&temp));
@@ -984,11 +999,28 @@ int freenect_start_depth(freenect_device *dev)
984999
break;
9851000
}
9861001
write_register(dev, 0x13, 0x01);
987-
write_register(dev, 0x14, 0x1e);
1002+
write_register(dev, 0x14, 0x1e);
1003+
9881004
write_register(dev, 0x06, 0x02); // start depth stream
9891005
write_register(dev, 0x17, 0x00); // disable depth hflip
9901006

9911007
dev->depth.running = 1;
1008+
1009+
//#ifdef NEAR_MODE
1010+
// //near mode
1011+
// write_register(dev, 0x15, 0x1e); //register not determined
1012+
// usleep(100000); //sleep 0.1 seconds
1013+
// write_register(dev, 0x2ef, 0x190); //near mode: register 2EF set to 190
1014+
//#else
1015+
// //far mode, doesn't work yet
1016+
// //need to restore the camera to near mode
1017+
// write_register(dev, 0x15, 0x7); //register not determined
1018+
// usleep(100000); //sleep 0.1 seconds
1019+
// //far mode doesn't work yet for me, after being set to near mode once, the camera stays so
1020+
// write_register(dev, 0x2ef, 0x0); //far mode: register 2EF set to 0
1021+
//#endif
1022+
// usleep(100000);
1023+
9921024
return 0;
9931025
}
9941026

@@ -1251,7 +1283,8 @@ int freenect_set_video_mode(freenect_device* dev, const freenect_frame_mode mode
12511283
dev->video_resolution = res;
12521284
// Now that we've changed video format and resolution, we need to update
12531285
// registration tables.
1254-
freenect_fetch_reg_info(dev);
1286+
if (res == FREENECT_RESOLUTION_MEDIUM)
1287+
freenect_fetch_reg_info(dev);
12551288
return 0;
12561289
}
12571290

src/cameras.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@
2929

3030
#include "libfreenect.h"
3131

32+
//#define NEAR_MODE
33+
3234
// Just a couple function declarations.
3335

3436
// These are called by core.c to do camera-specific initialization that needs

src/freenect_internal.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,13 @@ static inline int32_t fn_le32s(int32_t s)
117117
#define PID_NUI_AUDIO 0x02ad
118118
#define PID_NUI_CAMERA 0x02ae
119119
#define PID_NUI_MOTOR 0x02b0
120+
#define PID_K4W_CAMERA 0x02bf
121+
#define PID_K4W_AUDIO 0x02be
122+
123+
typedef enum {
124+
HWREV_XBOX360_0 = 0,
125+
HWREV_K4W_0 = 1,
126+
} hardware_revision;
120127

121128
typedef struct {
122129
int running;
@@ -188,6 +195,8 @@ struct _freenect_device {
188195
freenect_device *next;
189196
void *user_data;
190197

198+
hardware_revision hwrev;
199+
191200
// Cameras
192201
fnusb_dev usb_cam;
193202
fnusb_isoc_stream depth_isoc;

src/usb_libusb10.c

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ int fnusb_num_devices(fnusb_ctx *ctx)
4848
int r = libusb_get_device_descriptor (devs[i], &desc);
4949
if (r < 0)
5050
continue;
51-
if (desc.idVendor == VID_MICROSOFT && desc.idProduct == PID_NUI_CAMERA)
51+
if (desc.idVendor == VID_MICROSOFT && (desc.idProduct == PID_NUI_CAMERA || desc.idProduct == PID_K4W_CAMERA))
5252
nr++;
5353
}
5454
libusb_free_device_list (devs, 1);
@@ -77,7 +77,7 @@ int fnusb_list_device_attributes(fnusb_ctx *ctx, struct freenect_device_attribut
7777
int r = libusb_get_device_descriptor (devs[i], &desc);
7878
if (r < 0)
7979
continue;
80-
if (desc.idVendor == VID_MICROSOFT && desc.idProduct == PID_NUI_CAMERA) {
80+
if (desc.idVendor == VID_MICROSOFT && (desc.idProduct == PID_NUI_CAMERA || desc.idProduct == PID_K4W_CAMERA)) {
8181
// Verify that a serial number exists to query. If not, don't touch the device.
8282
if (desc.iSerialNumber == 0) {
8383
continue;
@@ -121,6 +121,7 @@ int fnusb_init(fnusb_ctx *ctx, freenect_usb_context *usb_ctx)
121121
int res;
122122
if (!usb_ctx) {
123123
res = libusb_init(&ctx->ctx);
124+
libusb_set_debug(ctx->ctx, 3);
124125
if (res >= 0) {
125126
ctx->should_free_ctx = 1;
126127
return 0;
@@ -191,7 +192,7 @@ int fnusb_open_subdevices(freenect_device *dev, int index)
191192
continue;
192193

193194
// Search for the camera
194-
if ((ctx->enabled_subdevices & FREENECT_DEVICE_CAMERA) && !dev->usb_cam.dev && desc.idProduct == PID_NUI_CAMERA) {
195+
if ((ctx->enabled_subdevices & FREENECT_DEVICE_CAMERA) && !dev->usb_cam.dev && (desc.idProduct == PID_NUI_CAMERA || desc.idProduct == PID_K4W_CAMERA)) {
195196
// If the index given by the user matches our camera index
196197
if (nr_cam == index) {
197198
res = libusb_open (devs[i], &dev->usb_cam.dev);
@@ -220,13 +221,30 @@ int fnusb_open_subdevices(freenect_device *dev, int index)
220221
dev->usb_cam.dev = NULL;
221222
break;
222223
}
224+
if (desc.idProduct == PID_NUI_CAMERA) {
225+
dev->hwrev = HWREV_XBOX360_0;
226+
FN_SPEW("Opened Kinect for Xbox360 camera\n");
227+
} else if (desc.idProduct == PID_K4W_CAMERA) {
228+
dev->hwrev = HWREV_K4W_0;
229+
FN_SPEW("Opened Kinect for Windows camera\n");
230+
// Set alternate interface setting 1 to enable the two isochronous endpoints
231+
res = libusb_set_interface_alt_setting(dev->usb_cam.dev, 0, 1);
232+
if (res != 0) {
233+
FN_ERROR("Failed to set alternate interface #1 for K4W: %d\n", res);
234+
libusb_close(dev->usb_cam.dev);
235+
dev->usb_cam.dev = NULL;
236+
break;
237+
}
238+
} else {
239+
FN_ERROR("Unknown hardware revision - fix fnusb_open_subdevices()\n");
240+
}
223241
} else {
224242
nr_cam++;
225243
}
226244
}
227245

228246
// Search for the motor
229-
if ((ctx->enabled_subdevices & FREENECT_DEVICE_MOTOR) && !dev->usb_motor.dev && desc.idProduct == PID_NUI_MOTOR) {
247+
if ((ctx->enabled_subdevices & FREENECT_DEVICE_MOTOR) && !dev->usb_motor.dev && (desc.idProduct == PID_NUI_MOTOR)) {
230248
// If the index given by the user matches our camera index
231249
if (nr_mot == index) {
232250
res = libusb_open (devs[i], &dev->usb_motor.dev);
@@ -250,7 +268,7 @@ int fnusb_open_subdevices(freenect_device *dev, int index)
250268
#ifdef BUILD_AUDIO
251269
// TODO: check that the firmware has already been loaded; if not, upload firmware.
252270
// Search for the audio
253-
if ((ctx->enabled_subdevices & FREENECT_DEVICE_AUDIO) && !dev->usb_audio.dev && desc.idProduct == PID_NUI_AUDIO) {
271+
if ((ctx->enabled_subdevices & FREENECT_DEVICE_AUDIO) && !dev->usb_audio.dev && (desc.idProduct == PID_NUI_AUDIO || desc.idProduct == PID_K4W_AUDIO)) {
254272
// If the index given by the user matches our audio index
255273
if (nr_audio == index) {
256274
res = libusb_open (devs[i], &dev->usb_audio.dev);
@@ -306,7 +324,7 @@ int fnusb_open_subdevices(freenect_device *dev, int index)
306324
if (r < 0)
307325
continue;
308326
// If this dev is a Kinect audio device, open device, read serial, and compare.
309-
if (new_dev_desc.idVendor == VID_MICROSOFT && new_dev_desc.idProduct == PID_NUI_AUDIO) {
327+
if (new_dev_desc.idVendor == VID_MICROSOFT && (new_dev_desc.idProduct == PID_NUI_AUDIO || new_dev_desc.idProduct == PID_K4W_AUDIO)) {
310328
FN_SPEW("Matched VID/PID!\n");
311329
libusb_device_handle* new_dev_handle;
312330
// Open device

0 commit comments

Comments
 (0)