3 Copyright (c) 2002 Finger Lakes Instrumentation (FLI), L.L.C.
6 Redistribution and use in source and binary forms, with or without
7 modification, are permitted provided that the following conditions
10 Redistributions of source code must retain the above copyright
11 notice, this list of conditions and the following disclaimer.
13 Redistributions in binary form must reproduce the above
14 copyright notice, this list of conditions and the following
15 disclaimer in the documentation and/or other materials
16 provided with the distribution.
18 Neither the name of Finger Lakes Instrumentation (FLI), LLC
19 nor the names of its contributors may be used to endorse or
20 promote products derived from this software without specific
21 prior written permission.
23 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
24 ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
25 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
26 FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
27 REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
28 INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
29 BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
30 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
31 CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
32 LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
33 ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
34 POSSIBILITY OF SUCH DAMAGE.
36 ======================================================================
38 Finger Lakes Instrumentation, L.L.C. (FLI)
39 web: http://www.fli-cam.com
40 email: support@fli-cam.com
48 #include "libfli-libfli.h"
49 #include "libfli-debug.h"
50 #include "libfli-mem.h"
51 #include "libfli-camera.h"
52 #include "libfli-camera-parport.h"
53 #include "libfli-camera-usb.h"
55 const fliccdinfo_t knowndev
[] = {
56 /* id model array_area visible_area */
57 {1, "KAF-0260C0-2", {{0, 0}, {534, 520}}, {{12, 4}, {524, 516}}, 1.0, 20.0, 20.0},
58 {2, "KAF-0400C0-2", {{0, 0}, {796, 520}}, {{14, 4}, {782, 516}}, 1.0, 20.0, 20.0},
59 {3, "KAF-1000C0-2", {{0, 0}, {1042, 1032}}, {{8, 4}, {1032, 1028}}, 1.0, 24.0, 24.0},
60 {4, "KAF-1300C0-2", {{0, 0}, {1304, 1028}}, {{4, 2}, {1284, 1026}}, 1.0, 20.0, 20.0},
61 {5, "KAF-1400C0-2", {{0, 0}, {1348, 1037}}, {{14,14}, {782, 526}}, 1.0, 20.0, 20.0},
62 {6, "KAF-1600C0-2", {{0, 0}, {1564, 1032}}, {{14, 4}, {1550, 1028}}, 1.0, 20.0, 20.0},
63 {7, "KAF-4200C0-2", {{0, 0}, {2060, 2048}}, {{25, 2}, {2057, 2046}}, 1.0, 20.0, 20.0},
64 {8, "SITe-502S", {{0, 0}, {527, 512}}, {{15, 0}, {527, 512}}, 1.0, 20.0, 20.0},
65 {9, "TK-1024", {{0, 0}, {1124, 1024}}, {{50, 0}, {1074, 1024}}, 1.0, 24.0, 24.0},
66 {10, "TK-512", {{0, 0}, {563, 512}}, {{51, 0}, {563, 512}}, 1.0, 24.0, 24.0},
67 {11, "SI-003A", {{0, 0}, {1056, 1024}}, {{16, 0}, {1040, 1024}}, 1.0, 24.0, 24.0},
68 {12, "KAF-6300", {{0, 0}, {3100, 2056}}, {{16, 4}, {3088, 2052}}, 1.0, 9.0, 9.0},
69 {13, "KAF-3200", {{0, 0}, {2267, 1510}}, {{46,34}, {2230, 1506}}, 1.0, 6.8, 6.8},
70 {14, "SI424A", {{0, 0}, {2088, 2049}}, {{20, 0}, {2068, 2049}}, 1.0, 6.8, 6.8},
71 {15, "CCD47-10", {{0, 0}, {1072, 1027}}, {{8, 0}, {1064, 1027}}, 0.0, 0.0, 0.0},
72 {16, "CCD77", {{0, 0}, {527, 512}}, {{15, 0}, {527, 512}}, 0.0, 0.0, 0.0},
73 {17, "CCD42-40", {{0, 0}, {2148, 2048}}, {{50, 0}, {2098, 2048}}, 1.0, 13.5, 13.5},
74 {18, "KAF-4300", {{0, 0}, {2102, 2092}}, {{8, 4}, {2092, 2088}}, 1.0, 24.0, 24.0},
75 {19, "KAF-16801", {{0, 0}, {4145, 4128}}, {{44,29}, {4124, 4109}}, 1.0, 9.0, 9.0},
76 {0, "Unknown Model", {{0, 0}, {0, 0}}, {{0, 0}, {0, 0}}, 0.0, 0.0, 0.0}
79 /* Common camera routines */
80 static long fli_camera_get_pixel_size(flidev_t dev
,
81 double *pixel_x
, double *pixel_y
);
82 #define fli_camera_parport_get_pixel_size fli_camera_get_pixel_size
83 #define fli_camera_usb_get_pixel_size fli_camera_get_pixel_size
85 static long fli_camera_set_frame_type(flidev_t dev
, fliframe_t frametype
);
86 #define fli_camera_parport_set_frame_type fli_camera_set_frame_type
87 #define fli_camera_usb_set_frame_type fli_camera_set_frame_type
89 static long fli_camera_set_flushes(flidev_t dev
, long nflushes
);
90 #define fli_camera_parport_set_flushes fli_camera_set_flushes
91 #define fli_camera_usb_set_flushes fli_camera_set_flushes
93 long fli_camera_open(flidev_t dev
)
99 if ((DEVICE
->device_data
= xcalloc(1, sizeof(flicamdata_t
))) == NULL
)
102 switch (DEVICE
->domain
)
104 case FLIDOMAIN_PARALLEL_PORT
:
105 r
= fli_camera_parport_open(dev
);
109 r
= fli_camera_usb_open(dev
);
118 xfree(DEVICE
->device_data
);
119 DEVICE
->device_data
= NULL
;
125 long fli_camera_close(flidev_t dev
)
131 cam
= DEVICE
->device_data
;
133 if (cam
->gbuf
!= NULL
)
139 if (DEVICE
->devinfo
.model
!= NULL
)
141 xfree(DEVICE
->devinfo
.model
);
142 DEVICE
->devinfo
.model
= NULL
;
145 if (DEVICE
->devinfo
.devnam
!= NULL
)
147 xfree(DEVICE
->devinfo
.devnam
);
148 DEVICE
->devinfo
.devnam
= NULL
;
151 if (DEVICE
->device_data
!= NULL
)
153 xfree(DEVICE
->device_data
);
154 DEVICE
->device_data
= NULL
;
160 long fli_camera_command(flidev_t dev
, int cmd
, int argc
, ...)
170 case FLI_GET_PIXEL_SIZE
:
175 double *pixel_x
, *pixel_y
;
177 pixel_x
= va_arg(ap
, double *);
178 pixel_y
= va_arg(ap
, double *);
180 switch (DEVICE
->domain
)
182 case FLIDOMAIN_PARALLEL_PORT
:
183 r
= fli_camera_parport_get_pixel_size(dev
, pixel_x
, pixel_y
);
187 r
= fli_camera_usb_get_pixel_size(dev
, pixel_x
, pixel_y
);
196 case FLI_GET_ARRAY_AREA
:
201 long *ul_x
, *ul_y
, *lr_x
, *lr_y
;
203 ul_x
= va_arg(ap
, long *);
204 ul_y
= va_arg(ap
, long *);
205 lr_x
= va_arg(ap
, long *);
206 lr_y
= va_arg(ap
, long *);
208 switch (DEVICE
->domain
)
210 case FLIDOMAIN_PARALLEL_PORT
:
211 r
= fli_camera_parport_get_array_area(dev
, ul_x
, ul_y
, lr_x
, lr_y
);
215 r
= fli_camera_usb_get_array_area(dev
, ul_x
, ul_y
, lr_x
, lr_y
);
224 case FLI_GET_VISIBLE_AREA
:
229 long *ul_x
, *ul_y
, *lr_x
, *lr_y
;
231 ul_x
= va_arg(ap
, long *);
232 ul_y
= va_arg(ap
, long *);
233 lr_x
= va_arg(ap
, long *);
234 lr_y
= va_arg(ap
, long *);
236 switch (DEVICE
->domain
)
238 case FLIDOMAIN_PARALLEL_PORT
:
239 r
= fli_camera_parport_get_visible_area(dev
, ul_x
, ul_y
, lr_x
, lr_y
);
243 r
= fli_camera_usb_get_visible_area(dev
, ul_x
, ul_y
, lr_x
, lr_y
);
252 case FLI_SET_EXPOSURE_TIME
:
259 exptime
= *va_arg(ap
, long *);
261 switch (DEVICE
->domain
)
263 case FLIDOMAIN_PARALLEL_PORT
:
264 r
= fli_camera_parport_set_exposure_time(dev
, exptime
);
268 r
= fli_camera_usb_set_exposure_time(dev
, exptime
);
277 case FLI_SET_IMAGE_AREA
:
282 long ul_x
, ul_y
, lr_x
, lr_y
;
284 ul_x
= *va_arg(ap
, long *);
285 ul_y
= *va_arg(ap
, long *);
286 lr_x
= *va_arg(ap
, long *);
287 lr_y
= *va_arg(ap
, long *);
289 switch (DEVICE
->domain
)
291 case FLIDOMAIN_PARALLEL_PORT
:
292 r
= fli_camera_parport_set_image_area(dev
, ul_x
, ul_y
, lr_x
, lr_y
);
296 r
= fli_camera_usb_set_image_area(dev
, ul_x
, ul_y
, lr_x
, lr_y
);
312 hbin
= *va_arg(ap
, long *);
314 switch (DEVICE
->domain
)
316 case FLIDOMAIN_PARALLEL_PORT
:
317 r
= fli_camera_parport_set_hbin(dev
, hbin
);
321 r
= fli_camera_usb_set_hbin(dev
, hbin
);
337 vbin
= *va_arg(ap
, long *);
339 switch (DEVICE
->domain
)
341 case FLIDOMAIN_PARALLEL_PORT
:
342 r
= fli_camera_parport_set_vbin(dev
, vbin
);
346 r
= fli_camera_usb_set_vbin(dev
, vbin
);
355 case FLI_SET_FRAME_TYPE
:
362 frametype
= *va_arg(ap
, long *);
364 switch (DEVICE
->domain
)
366 case FLIDOMAIN_PARALLEL_PORT
:
367 r
= fli_camera_parport_set_frame_type(dev
, frametype
);
371 r
= fli_camera_usb_set_frame_type(dev
, frametype
);
380 case FLI_CANCEL_EXPOSURE
:
387 cam
= DEVICE
->device_data
;
389 cam
->grabrowcount
= 1;
390 cam
->grabrowcounttot
= cam
->grabrowcount
;
391 cam
->grabrowindex
= 0;
392 cam
->grabrowbatchsize
= 1;
393 cam
->grabrowbufferindex
= cam
->grabrowcount
;
394 cam
->flushcountbeforefirstrow
= 0;
395 cam
->flushcountafterlastrow
= 0;
397 r
= DEVICE
->fli_command(dev
, FLI_CONTROL_SHUTTER
, (long) FLI_SHUTTER_CLOSE
);
401 case FLI_GET_EXPOSURE_STATUS
:
408 timeleft
= va_arg(ap
, long *);
410 switch (DEVICE
->domain
)
412 case FLIDOMAIN_PARALLEL_PORT
:
413 r
= fli_camera_parport_get_exposure_status(dev
, timeleft
);
417 r
= fli_camera_usb_get_exposure_status(dev
, timeleft
);
426 case FLI_SET_TEMPERATURE
:
433 temperature
= *va_arg(ap
, double *);
435 switch (DEVICE
->domain
)
437 case FLIDOMAIN_PARALLEL_PORT
:
438 r
= fli_camera_parport_set_temperature(dev
, temperature
);
442 r
= fli_camera_usb_set_temperature(dev
, temperature
);
451 case FLI_GET_TEMPERATURE
:
458 temperature
= va_arg(ap
, double *);
460 switch (DEVICE
->domain
)
462 case FLIDOMAIN_PARALLEL_PORT
:
463 r
= fli_camera_parport_get_temperature(dev
, temperature
);
467 r
= fli_camera_usb_get_temperature(dev
, temperature
);
484 buf
= va_arg(ap
, void *);
485 width
= *va_arg(ap
, size_t *);
487 switch (DEVICE
->domain
)
489 case FLIDOMAIN_PARALLEL_PORT
:
490 r
= fli_camera_parport_grab_row(dev
, buf
, width
);
494 r
= fli_camera_usb_grab_row(dev
, buf
, width
);
503 case FLI_EXPOSE_FRAME
:
508 switch (DEVICE
->domain
)
510 case FLIDOMAIN_PARALLEL_PORT
:
511 r
= fli_camera_parport_expose_frame(dev
);
515 r
= fli_camera_usb_expose_frame(dev
);
531 rows
= *va_arg(ap
, long *);
532 repeat
= *va_arg(ap
, long *);
534 switch (DEVICE
->domain
)
536 case FLIDOMAIN_PARALLEL_PORT
:
537 r
= fli_camera_parport_flush_rows(dev
, rows
, repeat
);
541 r
= fli_camera_usb_flush_rows(dev
, rows
, repeat
);
550 case FLI_SET_FLUSHES
:
557 nflushes
= *va_arg(ap
, long *);
559 switch (DEVICE
->domain
)
561 case FLIDOMAIN_PARALLEL_PORT
:
562 r
= fli_camera_parport_set_flushes(dev
, nflushes
);
566 r
= fli_camera_usb_set_flushes(dev
, nflushes
);
575 case FLI_SET_BIT_DEPTH
:
580 flibitdepth_t bitdepth
;
582 bitdepth
= *va_arg(ap
, flibitdepth_t
*);
584 switch (DEVICE
->domain
)
586 case FLIDOMAIN_PARALLEL_PORT
:
587 r
= fli_camera_parport_set_bit_depth(dev
, bitdepth
);
591 r
= fli_camera_usb_set_bit_depth(dev
, bitdepth
);
600 case FLI_READ_IOPORT
:
607 ioportset
= va_arg(ap
, long *);
609 switch (DEVICE
->domain
)
611 case FLIDOMAIN_PARALLEL_PORT
:
612 r
= fli_camera_parport_read_ioport(dev
, ioportset
);
616 r
= fli_camera_usb_read_ioport(dev
, ioportset
);
625 case FLI_WRITE_IOPORT
:
632 ioportset
= *va_arg(ap
, long *);
634 switch (DEVICE
->domain
)
636 case FLIDOMAIN_PARALLEL_PORT
:
637 r
= fli_camera_parport_write_ioport(dev
, ioportset
);
641 r
= fli_camera_usb_write_ioport(dev
, ioportset
);
650 case FLI_CONFIGURE_IOPORT
:
657 ioportset
= *va_arg(ap
, long *);
659 switch (DEVICE
->domain
)
661 case FLIDOMAIN_PARALLEL_PORT
:
662 r
= fli_camera_parport_configure_ioport(dev
, ioportset
);
666 r
= fli_camera_usb_configure_ioport(dev
, ioportset
);
675 case FLI_CONTROL_SHUTTER
:
683 cam
= DEVICE
->device_data
;
685 shutter
= *va_arg(ap
, long *);
687 if( (shutter
== FLI_SHUTTER_EXTERNAL_TRIGGER_LOW
) ||
688 (shutter
== FLI_SHUTTER_EXTERNAL_TRIGGER_HIGH
) )
690 debug(FLIDEBUG_INFO
, "External trigger.\n");
692 cam
->exttriggerpol
= (shutter
== FLI_SHUTTER_EXTERNAL_TRIGGER_LOW
)?0:1;
698 switch (DEVICE
->domain
)
700 case FLIDOMAIN_PARALLEL_PORT
:
701 r
= fli_camera_parport_control_shutter(dev
, shutter
);
705 r
= fli_camera_usb_control_shutter(dev
, shutter
);
715 case FLI_CONTROL_BGFLUSH
:
723 cam
= DEVICE
->device_data
;
725 bgflush
= *va_arg(ap
, long *);
727 switch (DEVICE
->domain
)
729 case FLIDOMAIN_PARALLEL_PORT
:
734 r
= fli_camera_usb_control_bgflush(dev
, bgflush
);
752 static long fli_camera_get_pixel_size(flidev_t dev
,
753 double *pixel_x
, double *pixel_y
)
757 cam
= DEVICE
->device_data
;
758 *pixel_x
= (double)cam
->ccd
.pixelwidth
;
759 *pixel_y
= (double)cam
->ccd
.pixelheight
;
764 static long fli_camera_set_frame_type(flidev_t dev
, fliframe_t frametype
)
768 cam
= DEVICE
->device_data
;
770 if ((frametype
< FLI_FRAME_TYPE_NORMAL
) || (frametype
> FLI_FRAME_TYPE_DARK
))
773 cam
->frametype
= frametype
;
778 static long fli_camera_set_flushes(flidev_t dev
, long nflushes
)
782 cam
= DEVICE
->device_data
;
784 if((nflushes
< 0) || (nflushes
> 5))
787 cam
->flushes
= nflushes
;