1 /*
2  * This file is part of the OpenKinect Project. http://www.openkinect.org
3  *
4  * Copyright (c) 2010 individual OpenKinect contributors. See the CONTRIB file
5  * for details.
6  *
7  * This code is licensed to you under the terms of the Apache License, version
8  * 2.0, or, at your option, the terms of the GNU General Public License,
9  * version 2.0. See the APACHE20 and GPL2 files for the text of the licenses,
10  * or the following URLs:
11  * http://www.apache.org/licenses/LICENSE-2.0
12  * http://www.gnu.org/licenses/gpl-2.0.txt
13  *
14  * If you redistribute this file in source form, modified or unmodified, you
15  * may:
16  *   1) Leave this header intact and distribute it under the same terms,
17  *      accompanying it with the APACHE20 and GPL20 files, or
18  *   2) Delete the Apache 2.0 clause and accompany it with the GPL2 file, or
19  *   3) Delete the GPL v2 clause and accompany it with the APACHE20 file
20  * In all cases you must keep the copyright notice intact and include a copy
21  * of the CONTRIB file.
22  *
23  * Binary distributions must follow the binary distribution requirements of
24  * either License.
25  */
26 
27 #ifndef LIBFREENECT_H
28 #define LIBFREENECT_H
29 
30 #include <stdint.h>
31 
32 #ifdef __cplusplus
33 extern "C" {
34 #endif
35 
36 #define FREENECT_FRAME_W 640
37 #define FREENECT_FRAME_H 480
38 #define FREENECT_FRAME_PIX (FREENECT_FRAME_H*FREENECT_FRAME_W)
39 
40 #define FREENECT_IR_FRAME_W 640
41 #define FREENECT_IR_FRAME_H 488
42 #define FREENECT_IR_FRAME_PIX (FREENECT_IR_FRAME_H*FREENECT_IR_FRAME_W)
43 
44 #define FREENECT_VIDEO_RGB_SIZE (FREENECT_FRAME_PIX*3)
45 #define FREENECT_VIDEO_BAYER_SIZE (FREENECT_FRAME_PIX)
46 #define FREENECT_VIDEO_YUV_RGB_SIZE (FREENECT_VIDEO_RGB_SIZE)
47 #define FREENECT_VIDEO_YUV_RAW_SIZE (FREENECT_FRAME_PIX*2)
48 #define FREENECT_VIDEO_IR_8BIT_SIZE (FREENECT_IR_FRAME_PIX)
49 #define FREENECT_VIDEO_IR_10BIT_SIZE (FREENECT_IR_FRAME_PIX*sizeof(uint16_t))
50 #define FREENECT_VIDEO_IR_10BIT_PACKED_SIZE 390400
51 
52 #define FREENECT_DEPTH_11BIT_SIZE (FREENECT_FRAME_PIX*sizeof(uint16_t))
53 #define FREENECT_DEPTH_10BIT_SIZE FREENECT_DEPTH_11BIT_SIZE
54 #define FREENECT_DEPTH_11BIT_PACKED_SIZE 422400
55 #define FREENECT_DEPTH_10BIT_PACKED_SIZE 384000
56 
57 #define FREENECT_COUNTS_PER_G 819
58 
59 typedef enum {
60 	FREENECT_VIDEO_RGB = 0,
61 	FREENECT_VIDEO_BAYER = 1,
62 	FREENECT_VIDEO_IR_8BIT = 2,
63 	FREENECT_VIDEO_IR_10BIT = 3,
64 	FREENECT_VIDEO_IR_10BIT_PACKED = 4,
65 	FREENECT_VIDEO_YUV_RGB = 5,
66 	FREENECT_VIDEO_YUV_RAW = 6,
67 } freenect_video_format;
68 
69 typedef enum {
70 	LED_OFF    = 0,
71 	LED_GREEN  = 1,
72 	LED_RED    = 2,
73 	LED_YELLOW = 3,
74 	LED_BLINK_YELLOW = 4,
75 	LED_BLINK_GREEN = 5,
76 	LED_BLINK_RED_YELLOW = 6
77 } freenect_led_options;
78 
79 typedef enum {
80 	FREENECT_DEPTH_11BIT = 0,
81 	FREENECT_DEPTH_10BIT = 1,
82 	FREENECT_DEPTH_11BIT_PACKED = 2,
83 	FREENECT_DEPTH_10BIT_PACKED = 3,
84 } freenect_depth_format;
85 
86 typedef enum {
87 	TILT_STATUS_STOPPED = 0x00,
88 	TILT_STATUS_LIMIT = 0x01,
89 	TILT_STATUS_MOVING = 0x04
90 } freenect_tilt_status_code;
91 
92 typedef struct {
93 	int16_t accelerometer_x;
94 	int16_t accelerometer_y;
95 	int16_t accelerometer_z;
96 	int8_t tilt_angle;
97 	freenect_tilt_status_code tilt_status;
98 } freenect_raw_tilt_state;
99 
100 struct _freenect_context;
101 typedef struct _freenect_context freenect_context;
102 
103 struct _freenect_device;
104 typedef struct _freenect_device freenect_device;
105 
106 // usb backend specific section
107 #include <libusb-1.0/libusb.h>
108 typedef libusb_context freenect_usb_context;
109 //
110 
111 typedef enum {
112 	FREENECT_LOG_FATAL = 0,
113 	FREENECT_LOG_ERROR,
114 	FREENECT_LOG_WARNING,
115 	FREENECT_LOG_NOTICE,
116 	FREENECT_LOG_INFO,
117 	FREENECT_LOG_DEBUG,
118 	FREENECT_LOG_SPEW,
119 	FREENECT_LOG_FLOOD,
120 } freenect_loglevel;
121 
122 int freenect_init(freenect_context **ctx, freenect_usb_context *usb_ctx);
123 int freenect_shutdown(freenect_context *ctx);
124 
125 typedef void (*freenect_log_cb)(freenect_context *dev, freenect_loglevel level, const char *msg);
126 
127 void freenect_set_log_level(freenect_context *ctx, freenect_loglevel level);
128 void freenect_set_log_callback(freenect_context *ctx, freenect_log_cb cb);
129 
130 int freenect_process_events(freenect_context *ctx);
131 
132 int freenect_num_devices(freenect_context *ctx);
133 int freenect_open_device(freenect_context *ctx, freenect_device **dev, int index);
134 int freenect_close_device(freenect_device *dev);
135 
136 void freenect_set_user(freenect_device *dev, void *user);
137 void *freenect_get_user(freenect_device *dev);
138 
139 typedef void (*freenect_depth_cb)(freenect_device *dev, void *depth, uint32_t timestamp);
140 typedef void (*freenect_video_cb)(freenect_device *dev, void *video, uint32_t timestamp);
141 
142 void freenect_set_depth_callback(freenect_device *dev, freenect_depth_cb cb);
143 void freenect_set_video_callback(freenect_device *dev, freenect_video_cb cb);
144 
145 int freenect_set_depth_format(freenect_device *dev, freenect_depth_format fmt);
146 int freenect_set_video_format(freenect_device *dev, freenect_video_format fmt);
147 
148 int freenect_set_depth_buffer(freenect_device *dev, void *buf);
149 int freenect_set_video_buffer(freenect_device *dev, void *buf);
150 
151 int freenect_start_depth(freenect_device *dev);
152 int freenect_start_video(freenect_device *dev);
153 int freenect_stop_depth(freenect_device *dev);
154 int freenect_stop_video(freenect_device *dev);
155 
156 int freenect_update_tilt_state(freenect_device *dev);
157 freenect_raw_tilt_state* freenect_get_tilt_state(freenect_device *dev);
158 double freenect_get_tilt_degs(freenect_raw_tilt_state *state);
159 int freenect_set_tilt_degs(freenect_device *dev, double angle);
160 int freenect_set_led(freenect_device *dev, freenect_led_options option);
161 void freenect_get_mks_accel(freenect_raw_tilt_state *state, double* x, double* y, double* z);
162 
163 #ifdef __cplusplus
164 }
165 #endif
166 
167 #endif //
168 
169