summaryrefslogtreecommitdiffstats
path: root/src/grabbers/me4.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/grabbers/me4.c')
-rw-r--r--src/grabbers/me4.c294
1 files changed, 0 insertions, 294 deletions
diff --git a/src/grabbers/me4.c b/src/grabbers/me4.c
deleted file mode 100644
index 08abef6..0000000
--- a/src/grabbers/me4.c
+++ /dev/null
@@ -1,294 +0,0 @@
-
-#include <stdlib.h>
-#include <string.h>
-#include <clser.h>
-#include <fgrab_struct.h>
-#include <fgrab_prototyp.h>
-
-#include "uca.h"
-#include "uca-grabber.h"
-
-struct fg_apc_data {
- Fg_Struct *fg;
- dma_mem *mem;
- uint32_t timeout;
-
- /* End-user related callback variables */
- uca_cam_grab_callback callback;
- void *meta_data;
- void *user;
-};
-
-struct uca_sisofg_map_t {
- enum uca_grabber_constants uca_prop;
- int fg_id;
- bool interpret_data; /**< is data a constant or a value? */
-};
-
-static struct uca_sisofg_map_t uca_to_fg[] = {
- /* properties */
- { UCA_PROP_WIDTH, FG_WIDTH, false },
- { UCA_PROP_HEIGHT, FG_HEIGHT, false },
- { UCA_PROP_X_OFFSET, FG_XOFFSET, false },
- { UCA_PROP_Y_OFFSET, FG_YOFFSET, false },
- { UCA_PROP_EXPOSURE, FG_EXPOSURE, false },
- { UCA_PROP_GRAB_TIMEOUT, FG_TIMEOUT, false },
-
- { UCA_GRABBER_TRIGGER_MODE, FG_TRIGGERMODE, true },
- { UCA_GRABBER_FORMAT, FG_FORMAT, true },
- { UCA_GRABBER_CAMERALINK_TYPE, FG_CAMERA_LINK_CAMTYP, true },
-
- /* values */
- { UCA_FORMAT_GRAY8, FG_GRAY, false },
- { UCA_FORMAT_GRAY16, FG_GRAY16, false },
- { UCA_CL_SINGLE_TAP_8, FG_CL_SINGLETAP_8_BIT, false },
- { UCA_CL_SINGLE_TAP_16, FG_CL_SINGLETAP_16_BIT, false },
- { UCA_CL_8BIT_FULL_8, FG_CL_8BIT_FULL_8, false },
- { UCA_CL_8BIT_FULL_10, FG_CL_8BIT_FULL_10, false },
- { UCA_TRIGGER_AUTO, FREE_RUN, false },
- { UCA_TRIGGER_SOFTWARE, ASYNC_SOFTWARE_TRIGGER, false },
- { UCA_TRIGGER_EXTERNAL, ASYNC_TRIGGER, false },
- { UCA_GRABBER_INVALID, 0, false }
-};
-
-#define GET_FG(grabber) (((struct fg_apc_data *) grabber->user)->fg)
-#define GET_MEM(grabber) (((struct fg_apc_data *) grabber->user)->mem)
-
-static uint32_t uca_me4_destroy(struct uca_grabber_priv *grabber)
-{
- if (grabber != NULL) {
- Fg_FreeMemEx(GET_FG(grabber), GET_MEM(grabber));
- Fg_FreeGrabber(GET_FG(grabber));
- }
- return UCA_NO_ERROR;
-}
-
-static struct uca_sisofg_map_t *uca_me4_find_fg_property(enum uca_grabber_constants property)
-{
- int i = 0;
- /* Find a valid frame grabber id for the property */
- while (uca_to_fg[i].uca_prop != UCA_GRABBER_INVALID) {
- if (uca_to_fg[i].uca_prop == property)
- return &uca_to_fg[i];
- i++;
- }
- return NULL;
-}
-
-static struct uca_sisofg_map_t *uca_me4_find_uca_property(int fg_id)
-{
- int i = 0;
- /* Find a valid frame grabber id for the property */
- while (uca_to_fg[i].fg_id != 0) {
- if (uca_to_fg[i].fg_id == fg_id)
- return &uca_to_fg[i];
- i++;
- }
- return NULL;
-}
-
-static uint32_t uca_me4_set_property(struct uca_grabber_priv *grabber, int32_t property, void *data)
-{
- /* Handle all properties not related specifically to the me4 */
- union uca_value *v = (union uca_value *) data;
- switch (property) {
- case UCA_PROP_GRAB_TIMEOUT:
- ((struct fg_apc_data *) grabber->user)->timeout = v->u32;
- break;
-
- case UCA_PROP_GRAB_SYNCHRONOUS:
- grabber->synchronous = v->u32 != 0;
- return UCA_NO_ERROR;
-
- default:
- break;
- }
-
- /* Try to find a matching me4 property */
- uint32_t err = UCA_ERR_GRABBER | UCA_ERR_PROP;
- struct uca_sisofg_map_t *fg_prop = uca_me4_find_fg_property(property);
- if (fg_prop == NULL)
- return err | UCA_ERR_INVALID;
-
- if (fg_prop->interpret_data) {
- /* Data is not a value but a SiSo specific constant that we need to
- * translate to Silicon Software speak. Therefore, we try to find it in
- * the map. */
- struct uca_sisofg_map_t *constant = uca_me4_find_fg_property(*((uint32_t *) data));
- if (constant != NULL)
- return Fg_setParameter(GET_FG(grabber), fg_prop->fg_id, &constant->fg_id, PORT_A) == FG_OK ? \
- UCA_NO_ERROR : err | UCA_ERR_INVALID;
- return err | UCA_ERR_INVALID;
- }
- else
- return Fg_setParameter(GET_FG(grabber), fg_prop->fg_id, data, PORT_A) == FG_OK ? \
- UCA_NO_ERROR : err | UCA_ERR_INVALID;
-}
-
-static uint32_t uca_me4_get_property(struct uca_grabber_priv *grabber, int32_t property, void *data)
-{
- switch (property) {
- case UCA_PROP_GRAB_SYNCHRONOUS:
- *((uint32_t *) data) = grabber->synchronous ? 1 : 0;
- return UCA_NO_ERROR;
-
- default:
- break;
- }
-
- uint32_t err = UCA_ERR_GRABBER | UCA_ERR_PROP;
- struct uca_sisofg_map_t *fg_prop = uca_me4_find_fg_property(property);
- if (fg_prop == NULL)
- return err | UCA_ERR_INVALID;
-
- if (fg_prop->interpret_data) {
- int constant;
- if (Fg_getParameter(GET_FG(grabber), fg_prop->fg_id, &constant, PORT_A) != FG_OK)
- return err | UCA_ERR_INVALID;
-
- /* Try to find the constant value */
- struct uca_sisofg_map_t *uca_prop = uca_me4_find_uca_property(constant);
- if (uca_prop == NULL)
- return err | UCA_ERR_INVALID;
-
- *((uint32_t *) data) = uca_prop->uca_prop;
- return UCA_NO_ERROR;
- }
-
- return Fg_getParameter(GET_FG(grabber), fg_prop->fg_id, data, PORT_A) == FG_OK ? \
- UCA_NO_ERROR : err | UCA_ERR_INVALID;
-}
-
-static uint32_t uca_me4_alloc(struct uca_grabber_priv *grabber, uint32_t pixel_size, uint32_t n_buffers)
-{
- dma_mem *mem = GET_MEM(grabber);
- /* If buffers are already allocated, we are freeing every buffer and start
- * again. */
- if (mem != NULL)
- Fg_FreeMemEx(GET_FG(grabber), mem);
-
- uint32_t width, height;
- uca_me4_get_property(grabber, UCA_PROP_WIDTH, &width);
- uca_me4_get_property(grabber, UCA_PROP_HEIGHT, &height);
-
- mem = Fg_AllocMemEx(GET_FG(grabber), n_buffers*width*height*pixel_size, n_buffers);
- if (mem != NULL) {
- ((struct fg_apc_data *) grabber->user)->mem = mem;
- return UCA_NO_ERROR;
- }
- return UCA_ERR_GRABBER | UCA_ERR_NO_MEMORY;
-}
-
-static uint32_t uca_me4_acquire(struct uca_grabber_priv *grabber, int32_t n_frames)
-{
- if (GET_MEM(grabber) == NULL)
- return UCA_ERR_GRABBER | UCA_ERR_NO_MEMORY;
-
- n_frames = n_frames < 0 ? GRAB_INFINITE : n_frames;
- if (Fg_AcquireEx(GET_FG(grabber), 0, n_frames, ACQ_STANDARD, GET_MEM(grabber)) == FG_OK)
- return UCA_NO_ERROR;
-
- return UCA_ERR_GRABBER | UCA_ERR_ACQUIRE;
-}
-
-static uint32_t uca_me4_stop_acquire(struct uca_grabber_priv *grabber)
-{
- if (GET_MEM(grabber) != NULL)
- if (Fg_stopAcquireEx(GET_FG(grabber), 0, GET_MEM(grabber), STOP_SYNC) != FG_OK)
- return UCA_ERR_GRABBER | UCA_ERR_ACQUIRE;
- return UCA_NO_ERROR;
-}
-
-static uint32_t uca_me4_trigger(struct uca_grabber_priv *grabber)
-{
- if (Fg_sendSoftwareTrigger(GET_FG(grabber), PORT_A) != FG_OK)
- return UCA_ERR_GRABBER | UCA_ERR_TRIGGER;
- return UCA_NO_ERROR;
-}
-
-static uint32_t uca_me4_grab(struct uca_grabber_priv *grabber, void **buffer, uint64_t *frame_number)
-{
- static frameindex_t last_frame = 0;
- struct fg_apc_data *me4 = (struct fg_apc_data *) grabber->user;
-
- if (grabber->synchronous)
- last_frame = Fg_getLastPicNumberBlockingEx(me4->fg, last_frame+1, PORT_A, me4->timeout, me4->mem);
- else
- last_frame = Fg_getLastPicNumberEx(me4->fg, PORT_A, me4->mem);
-
- if (last_frame <= 0) {
- *buffer = NULL;
- return UCA_ERR_GRABBER | UCA_ERR_FRAME_TRANSFER;
- }
-
- *frame_number = (uint64_t) last_frame;
- *buffer = Fg_getImagePtrEx(me4->fg, last_frame, PORT_A, me4->mem);
- return UCA_NO_ERROR;
-}
-
-static int uca_me4_callback(frameindex_t frame, struct fg_apc_data *apc)
-{
- apc->callback(frame, Fg_getImagePtrEx(apc->fg, frame, PORT_A, apc->mem), apc->meta_data, apc->user);
- return 0;
-}
-
-static uint32_t uca_me4_register_callback(struct uca_grabber_priv *grabber, uca_cam_grab_callback callback, void *meta_data, void *user)
-{
- if (GET_MEM(grabber) == NULL)
- return UCA_ERR_GRABBER | UCA_ERR_CALLBACK | UCA_ERR_NO_MEMORY;
-
- if (grabber->callback == NULL) {
- grabber->callback = callback;
-
- struct fg_apc_data *apc_data = (struct fg_apc_data *) grabber->user;
- apc_data->callback = callback;
- apc_data->meta_data = meta_data;
- apc_data->user = user;
-
- struct FgApcControl ctrl;
- ctrl.version = 0;
- ctrl.data = (struct fg_apc_data *) grabber->user;
- ctrl.func = &uca_me4_callback;
- ctrl.flags = FG_APC_DEFAULTS;
- ctrl.timeout = 1;
-
- if (Fg_registerApcHandler(GET_FG(grabber), PORT_A, &ctrl, FG_APC_CONTROL_BASIC) != FG_OK)
- return UCA_ERR_GRABBER | UCA_ERR_CALLBACK;
- }
- else
- return UCA_ERR_GRABBER | UCA_ERR_CALLBACK;
-
- return UCA_NO_ERROR;
-}
-
-uint32_t uca_me4_init(struct uca_grabber_priv **grabber)
-{
- /* Fg_Struct *fg = Fg_Init("libFullAreaGray8.so", 0); */
- Fg_Struct *fg = Fg_Init("libDualAreaGray16.so", 0);
- if (fg == NULL)
- return UCA_ERR_GRABBER | UCA_ERR_NOT_FOUND;
-
- struct uca_grabber_priv *uca = (struct uca_grabber_priv *) malloc(sizeof(struct uca_grabber_priv));
- memset(uca, 0, sizeof(struct uca_grabber_priv));
-
- struct fg_apc_data *me4 = (struct fg_apc_data *) malloc(sizeof(struct fg_apc_data));
- memset(me4, 0, sizeof(struct fg_apc_data));
- me4->fg = fg;
-
- Fg_getParameter(fg, FG_TIMEOUT, &me4->timeout, PORT_A);
-
- me4->timeout = 4;
- uca->user = me4;
- uca->destroy = &uca_me4_destroy;
- uca->set_property = &uca_me4_set_property;
- uca->get_property = &uca_me4_get_property;
- uca->alloc = &uca_me4_alloc;
- uca->acquire = &uca_me4_acquire;
- uca->stop_acquire = &uca_me4_stop_acquire;
- uca->trigger = &uca_me4_trigger;
- uca->grab = &uca_me4_grab;
- uca->register_callback = &uca_me4_register_callback;
-
- *grabber = uca;
- return UCA_NO_ERROR;
-}