summaryrefslogtreecommitdiffstats
path: root/src/cameras/uca_pco.c
blob: 413d3891dfd8c2aab3dcf000564c80c39cfba97f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110

#include <stdlib.h>
#include <clser.h>
#include <fgrab_struct.h>
#include <fgrab_prototyp.h>
#include <libpco/libpco.h>
#include "uca.h"
#include "uca_pco.h"

struct pco_cam_t {
    struct pco_edge_t *pco;
    Fg_Struct *fg;
};

#define GET_PCO(uca) (((struct pco_cam_t *)(uca->user))->pco)
#define GET_FG(uca) (((struct pco_cam_t *)(uca->user))->fg)


static uint32_t uca_pco_set_dimensions(struct uca_t *uca, uint32_t *width, uint32_t *height)
{
    Fg_Struct *fg = GET_FG(uca);
    Fg_setParameter(fg, FG_WIDTH, width, PORT_A);
    Fg_setParameter(fg, FG_HEIGHT, height, PORT_A);
    return 0;
}

static uint32_t uca_pco_set_bitdepth(struct uca_t *uca, uint8_t *bitdepth)
{
    /* TODO: it's not possible via CameraLink so do it via frame grabber */
    return 0;
}

static uint32_t uca_pco_set_exposure(struct uca_t *uca, uint32_t *exposure)
{
    uint32_t e, d;
    pco_get_delay_exposure(GET_PCO(uca), &d, &e);
    pco_set_delay_exposure(GET_PCO(uca), d, *exposure);
    return 0;
}

static uint32_t uca_pco_set_delay(struct uca_t *uca, uint32_t *delay)
{
    uint32_t e, d;
    pco_get_delay_exposure(GET_PCO(uca), &d, &e);
    pco_set_delay_exposure(GET_PCO(uca), *delay, e);
    return 0;
}

static uint32_t uca_pco_acquire_image(struct uca_t *uca, void *buffer)
{
    return 0;
}

static uint32_t uca_pco_destroy(struct uca_t *uca)
{
    Fg_FreeGrabber(GET_FG(uca));
    pco_destroy(GET_PCO(uca));
    free(uca->user);
}

uint32_t uca_pco_init(struct uca_t *uca)
{
    uca->user = (struct pco_cam_t *) malloc(sizeof(struct pco_cam_t));

    struct pco_cam_t *pco_cam = uca->user;
    struct pco_edge_t *pco = pco_cam->pco = pco_init();

    if ((pco->serial_ref == NULL) || !pco_active(pco)) {
        pco_destroy(pco);
        return UCA_ERR_INIT_NOT_FOUND;
    }

    pco_cam->fg = Fg_Init("libFullAreaGray8.so", 0);

    pco_scan_and_set_baud_rate(pco);

    /* Camera found, set function pointers... */
    uca->cam_destroy = &uca_pco_destroy;
    uca->cam_set_dimensions = &uca_pco_set_dimensions;
    uca->cam_set_bitdepth = &uca_pco_set_bitdepth;
    uca->cam_set_exposure = &uca_pco_set_exposure;
    uca->cam_set_delay = &uca_pco_set_delay;
    uca->cam_acquire_image = &uca_pco_acquire_image;

    /* ... and some properties */
    pco_get_actual_size(pco, &uca->image_width, &uca->image_height);

    /* Prepare camera for recording */
    pco_set_rec_state(pco, 0);
    pco_set_timestamp_mode(pco, 2);
    pco_set_timebase(pco, 1, 1); 
    pco_arm_camera(pco);

    /* Prepare frame grabber for recording */
    int val = FG_CL_8BIT_FULL_10;
    Fg_setParameter(fg, FG_CAMERA_LINK_CAMTYP, &val, PORT_A);

    val = FG_GRAY;
    Fg_setParameter(fg, FG_FORMAT, &val, PORT_A);

    val = FREE_RUN;
    Fg_setParameter(fg, FG_TRIGGERMODE, &val, PORT_A);

    Fg_setParameter(fg, FG_WIDTH, &uca->image_width, PORT_A);
    Fg_setParameter(fg, FG_HEIGHT, &uca->image_height, PORT_A);

    pco_set_rec_state(pco, 1);

    return 0;
}