1 | /* |
2 | * 1394-Based Digital Camera Control Library |
3 | * |
4 | * Written by Damien Douxchamps <ddouxchamps@users.sf.net> |
5 | * |
6 | * This library is free software; you can redistribute it and/or |
7 | * modify it under the terms of the GNU Lesser General Public |
8 | * License as published by the Free Software Foundation; either |
9 | * version 2.1 of the License, or (at your option) any later version. |
10 | * |
11 | * This library is distributed in the hope that it will be useful, |
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
14 | * Lesser General Public License for more details. |
15 | * |
16 | * You should have received a copy of the GNU Lesser General Public |
17 | * License along with this library; if not, write to the Free Software |
18 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
19 | */ |
20 | |
21 | #include <dc1394/log.h> |
22 | #include <stdio.h> |
23 | |
24 | #ifndef __DC1394_CAMERA_H__ |
25 | #define __DC1394_CAMERA_H__ |
26 | |
27 | /*! \file dc1394/camera.h |
28 | \brief Basic system and camera functions |
29 | \author Damien Douxchamps: coding |
30 | \author Peter Antoniac: documentation maintainer |
31 | |
32 | More details soon |
33 | */ |
34 | |
35 | /** |
36 | * List of IIDC versions |
37 | * |
38 | * Currently, the following versions exist: 1.04, 1.20, PTGREY, 1.30 and 1.31 (1.32 coming soon) |
39 | * Observing other versions means that there's a bug crawling somewhere. |
40 | */ |
41 | typedef enum { |
42 | DC1394_IIDC_VERSION_1_04 = 544, |
43 | DC1394_IIDC_VERSION_1_20, |
44 | DC1394_IIDC_VERSION_PTGREY, |
45 | DC1394_IIDC_VERSION_1_30, |
46 | DC1394_IIDC_VERSION_1_31, |
47 | DC1394_IIDC_VERSION_1_32, |
48 | DC1394_IIDC_VERSION_1_33, |
49 | DC1394_IIDC_VERSION_1_34, |
50 | DC1394_IIDC_VERSION_1_35, |
51 | DC1394_IIDC_VERSION_1_36, |
52 | DC1394_IIDC_VERSION_1_37, |
53 | DC1394_IIDC_VERSION_1_38, |
54 | DC1394_IIDC_VERSION_1_39 |
55 | } dc1394iidc_version_t; |
56 | #define DC1394_IIDC_VERSION_MIN DC1394_IIDC_VERSION_1_04 |
57 | #define DC1394_IIDC_VERSION_MAX DC1394_IIDC_VERSION_1_39 |
58 | #define DC1394_IIDC_VERSION_NUM (DC1394_IIDC_VERSION_MAX - DC1394_IIDC_VERSION_MIN + 1) |
59 | |
60 | /** |
61 | * Enumeration of power classes |
62 | * |
63 | * This is currently not used in libdc1394. |
64 | */ |
65 | typedef enum { |
66 | DC1394_POWER_CLASS_NONE=608, |
67 | DC1394_POWER_CLASS_PROV_MIN_15W, |
68 | DC1394_POWER_CLASS_PROV_MIN_30W, |
69 | DC1394_POWER_CLASS_PROV_MIN_45W, |
70 | DC1394_POWER_CLASS_USES_MAX_1W, |
71 | DC1394_POWER_CLASS_USES_MAX_3W, |
72 | DC1394_POWER_CLASS_USES_MAX_6W, |
73 | DC1394_POWER_CLASS_USES_MAX_10W |
74 | } dc1394power_class_t; |
75 | #define DC1394_POWER_CLASS_MIN DC1394_POWER_CLASS_NONE |
76 | #define DC1394_POWER_CLASS_MAX DC1394_POWER_CLASS_USES_MAX_10W |
77 | #define DC1394_POWER_CLASS_NUM (DC1394_POWER_CLASS_MAX - DC1394_POWER_CLASS_MIN + 1) |
78 | |
79 | /** |
80 | * Enumeration of PHY delays |
81 | * |
82 | * This is currently not used in libdc1394. |
83 | */ |
84 | typedef enum { |
85 | DC1394_PHY_DELAY_MAX_144_NS=640, |
86 | DC1394_PHY_DELAY_UNKNOWN_0, |
87 | DC1394_PHY_DELAY_UNKNOWN_1, |
88 | DC1394_PHY_DELAY_UNKNOWN_2 |
89 | } dc1394phy_delay_t; |
90 | #define DC1394_PHY_DELAY_MIN DC1394_PHY_DELAY_MAX_144_NS |
91 | #define DC1394_PHY_DELAY_MAX DC1394_PHY_DELAY_UNKNOWN_0 |
92 | #define DC1394_PHY_DELAY_NUM (DC1394_PHY_DELAY_MAX - DC1394_PHY_DELAY_MIN + 1) |
93 | |
94 | /** |
95 | * Camera structure |
96 | * |
97 | * This structure represents the camera in libdc1394. It contains a number of useful static information, such as model/vendor names, |
98 | * a few capabilities, some ROM offsets, a unique identifier, etc... |
99 | */ |
100 | typedef struct __dc1394_camera |
101 | { |
102 | /* system/firmware information */ |
103 | uint64_t guid; |
104 | int unit; |
105 | uint32_t unit_spec_ID; |
106 | uint32_t unit_sw_version; |
107 | uint32_t unit_sub_sw_version; |
108 | uint32_t command_registers_base; |
109 | uint32_t unit_directory; |
110 | uint32_t unit_dependent_directory; |
111 | uint64_t advanced_features_csr; |
112 | uint64_t PIO_control_csr; |
113 | uint64_t SIO_control_csr; |
114 | uint64_t strobe_control_csr; |
115 | uint64_t format7_csr[DC1394_VIDEO_MODE_FORMAT7_NUM]; |
116 | dc1394iidc_version_t iidc_version; |
117 | char * vendor; |
118 | char * model; |
119 | uint32_t vendor_id; |
120 | uint32_t model_id; |
121 | dc1394bool_t bmode_capable; |
122 | dc1394bool_t one_shot_capable; |
123 | dc1394bool_t multi_shot_capable; |
124 | dc1394bool_t can_switch_on_off; |
125 | dc1394bool_t has_vmode_error_status; |
126 | dc1394bool_t has_feature_error_status; |
127 | int max_mem_channel; |
128 | |
129 | /* not used, for future use: */ |
130 | uint32_t flags; |
131 | |
132 | } dc1394camera_t; |
133 | |
134 | /** |
135 | * A unique identifier for a functional camera unit |
136 | * |
137 | * Since a single camera can contain several functional units (think stereo cameras), the GUID is not enough to identify an IIDC camera. |
138 | * The unit number must also be used, hence this struct. |
139 | */ |
140 | typedef struct |
141 | { |
142 | uint16_t unit; |
143 | uint64_t guid; |
144 | } dc1394camera_id_t; |
145 | |
146 | /** |
147 | * A list of cameras |
148 | * |
149 | * Usually returned by dc1394_camera_eumerate(). |
150 | */ |
151 | typedef struct __dc1394camera_list_t |
152 | { |
153 | uint32_t num; |
154 | dc1394camera_id_t *ids; |
155 | } dc1394camera_list_t; |
156 | |
157 | typedef struct __dc1394_t dc1394_t; |
158 | |
159 | #ifdef __cplusplus |
160 | extern "C" { |
161 | #endif |
162 | |
163 | /*************************************************************************** |
164 | General system functions |
165 | ***************************************************************************/ |
166 | |
167 | /** |
168 | * Creates a new context in which cameras can be searched and used. This should be called before using any other libdc1394 function. |
169 | */ |
170 | dc1394_t* dc1394_new (void); |
171 | |
172 | /** |
173 | * Liberates a context. Last function to use in your program. After this, no libdc1394 function can be used. |
174 | */ |
175 | void dc1394_free (dc1394_t *dc1394); |
176 | |
177 | /** |
178 | * Sets and gets the broadcast flag of a camera. If the broadcast flag is set, |
179 | * all devices on the bus will execute the command. Useful to sync ISO start |
180 | * commands or setting a bunch of cameras at the same time. Broadcast only works |
181 | * with identical devices (brand/model). If the devices are not identical your |
182 | * mileage may vary. Some cameras may not answer broadcast commands at all. Also, |
183 | * this only works with cameras on the SAME bus (IOW, the same port). |
184 | */ |
185 | dc1394error_t dc1394_camera_set_broadcast(dc1394camera_t *camera, dc1394bool_t pwr); |
186 | dc1394error_t dc1394_camera_get_broadcast(dc1394camera_t *camera, dc1394bool_t *pwr); |
187 | |
188 | /** |
189 | * Resets the IEEE1394 bus which camera is attached to. Calling this function is |
190 | * "rude" to other devices because it causes them to re-enumerate on the bus and |
191 | * may cause a temporary disruption in their current activities. Thus, use it |
192 | * sparingly. Its primary use is if a program shuts down uncleanly and needs to |
193 | * free leftover ISO channels or bandwidth. A bus reset will free those things |
194 | * as a side effect. |
195 | */ |
196 | dc1394error_t dc1394_reset_bus(dc1394camera_t *camera); |
197 | dc1394error_t dc1394_read_cycle_timer (dc1394camera_t * camera, |
198 | uint32_t * cycle_timer, uint64_t * local_time); |
199 | |
200 | /** |
201 | * Gets the IEEE 1394 node ID of the camera. |
202 | */ |
203 | dc1394error_t dc1394_camera_get_node(dc1394camera_t *camera, uint32_t *node, |
204 | uint32_t * generation); |
205 | |
206 | |
207 | /*************************************************************************** |
208 | Camera functions |
209 | ***************************************************************************/ |
210 | |
211 | /** |
212 | * Returns the list of cameras available on the computer. If present, multiple cards will be probed |
213 | */ |
214 | dc1394error_t dc1394_camera_enumerate(dc1394_t *dc1394, dc1394camera_list_t **list); |
215 | |
216 | /** |
217 | * Frees the memory allocated in dc1394_enumerate_cameras for the camera list |
218 | */ |
219 | void dc1394_camera_free_list(dc1394camera_list_t *list); |
220 | |
221 | /** |
222 | * Create a new camera based on a GUID (Global Unique IDentifier) |
223 | */ |
224 | dc1394camera_t * dc1394_camera_new(dc1394_t *dc1394, uint64_t guid); |
225 | |
226 | /** |
227 | * Create a new camera based on a GUID and a unit number (for multi-unit cameras) |
228 | */ |
229 | dc1394camera_t * dc1394_camera_new_unit(dc1394_t *dc1394, uint64_t guid, int unit); |
230 | |
231 | /** |
232 | * Frees a camera structure |
233 | */ |
234 | void dc1394_camera_free(dc1394camera_t *camera); |
235 | |
236 | /** |
237 | * Print various camera information, such as GUID, vendor, model, supported IIDC specs, etc... |
238 | */ |
239 | dc1394error_t dc1394_camera_print_info(dc1394camera_t *camera, FILE *fd); |
240 | |
241 | /** |
242 | * Returns a pointer to a string identifying the platform for the cameras. Platforms strings are: |
243 | * juju, linux, macosx, windows, usb |
244 | */ |
245 | dc1394error_t dc1394_camera_get_platform_string(dc1394camera_t *camera, const char **platform); |
246 | |
247 | #ifdef __cplusplus |
248 | } |
249 | #endif |
250 | |
251 | #endif |
252 | |