Skip to content
Open
Prev Previous commit
Next Next commit
proxynect: Make sure to stop & start when setting modes.
We also avoid setting the mode if there's no change; this prevents
problems with repeated depth or video start/stops.

Signed-off-by: Robert Xiao <[email protected]>
  • Loading branch information
nneonneo committed Jul 3, 2014
commit 51f9af2eaf1e73b9e2dabf03de1b0bed52b44a52
30 changes: 25 additions & 5 deletions proxynect/proxydaemon.c
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,8 @@
#include <stdlib.h>
#include <string.h>

#define log(level, ...) do { if(device->loglevel >= FREENECT_LOG_##level) { fprintf(stderr, __VA_ARGS__); } } while(0)

volatile sig_atomic_t running = 1;

struct proxynect_device *device;
Expand Down Expand Up @@ -63,7 +65,7 @@ int run()
freenect_device *dev;

if(freenect_init(&ctx, 0)) {
fprintf(stderr, "Error: Failed to get context\n");
log(FATAL, "Error: Failed to get context\n");
return 1;
}

Expand All @@ -79,7 +81,7 @@ int run()
device->depth.timestamp = 0;

if(freenect_open_device(ctx, &dev, device->index)) {
fprintf(stderr, "Error: Failed to open device %d\n", device->index);
log(FATAL, "Error: Failed to open device %d\n", device->index);
return 2;
}

Expand All @@ -93,22 +95,40 @@ int run()

while (running && freenect_process_events(ctx) >= 0) {
if(device->settings.tilt_degs_changed) {
log(INFO, "Updating tilt degrees to %.1f", device->settings.tilt_degs);
freenect_set_tilt_degs(dev, device->settings.tilt_degs);
device->settings.tilt_degs_changed = 0;
}

if(device->settings.led_changed) {
log(INFO, "Updating LED to %d", device->settings.led);
freenect_set_led(dev, device->settings.led);
device->settings.led_changed = 0;
}

if(device->settings.video_mode_changed) {
freenect_set_video_mode(dev, device->settings.video_mode);
freenect_frame_mode curmode = freenect_get_current_video_mode(dev);
if(!memcmp(&device->settings.video_mode, &curmode, sizeof(freenect_frame_mode))) {
log(DEBUG, "Ignoring video format update request for %d\n", device->settings.video_mode.video_format);
} else {
log(INFO, "Updating video format to %d\n", device->settings.video_mode.video_format);
freenect_stop_video(dev);
freenect_set_video_mode(dev, device->settings.video_mode);
freenect_start_video(dev);
}
device->settings.video_mode_changed = 0;
}

if(device->settings.depth_mode_changed) {
freenect_set_depth_mode(dev, device->settings.depth_mode);
freenect_frame_mode curmode = freenect_get_current_depth_mode(dev);
if(!memcmp(&device->settings.depth_mode, &curmode, sizeof(freenect_frame_mode))) {
log(DEBUG, "Ignoring depth format update request for %d\n", device->settings.depth_mode.depth_format);
} else {
log(INFO, "Updating depth format to %d\n", device->settings.depth_mode.depth_format);
freenect_stop_depth(dev);
freenect_set_depth_mode(dev, device->settings.depth_mode);
freenect_start_depth(dev);
}
device->settings.depth_mode_changed = 0;
}

Expand All @@ -128,7 +148,7 @@ int run()
void signal_cleanup(int num)
{
running = 0;
fprintf(stderr, "Caught signal, cleaning up\n");
log(NOTICE, "Caught signal, cleaning up\n");
signal(SIGINT, signal_cleanup);
}

Expand Down