summaryrefslogtreecommitdiffstats
path: root/ipecamera
diff options
context:
space:
mode:
authorSuren A. Chilingaryan <csa@suren.me>2015-04-27 02:28:57 +0200
committerSuren A. Chilingaryan <csa@suren.me>2015-04-27 02:28:57 +0200
commite1265fa32837f457ee2c2fa259d12c9545af4bbf (patch)
tree64b8d5f1c81c14f019047b0cb00cb77c2dcecf55 /ipecamera
parenta37beb44d59cca329d0d9345c21505af81030688 (diff)
downloadipecamera-e1265fa32837f457ee2c2fa259d12c9545af4bbf.tar.gz
ipecamera-e1265fa32837f457ee2c2fa259d12c9545af4bbf.tar.bz2
ipecamera-e1265fa32837f457ee2c2fa259d12c9545af4bbf.tar.xz
ipecamera-e1265fa32837f457ee2c2fa259d12c9545af4bbf.zip
First stand-alone ipecamera implementation
Diffstat (limited to 'ipecamera')
-rw-r--r--ipecamera/CMakeLists.txt12
-rw-r--r--ipecamera/data.c287
-rw-r--r--ipecamera/data.h6
-rw-r--r--ipecamera/events.c160
-rw-r--r--ipecamera/events.h5
-rw-r--r--ipecamera/ipecamera.c695
-rw-r--r--ipecamera/ipecamera.h38
-rw-r--r--ipecamera/model.c211
-rw-r--r--ipecamera/model.h180
-rw-r--r--ipecamera/private.h151
-rw-r--r--ipecamera/public.h25
-rw-r--r--ipecamera/reader.c273
-rw-r--r--ipecamera/reader.h8
13 files changed, 0 insertions, 2051 deletions
diff --git a/ipecamera/CMakeLists.txt b/ipecamera/CMakeLists.txt
deleted file mode 100644
index 5b536f2..0000000
--- a/ipecamera/CMakeLists.txt
+++ /dev/null
@@ -1,12 +0,0 @@
-include_directories(
- ${CMAKE_SOURCE_DIR}
- ${UFODECODE_INCLUDE_DIRS}
-)
-
-set(HEADERS ${HEADERS} ipecamera.h model.h reader.h events.h data.h public.h private.h)
-
-add_library(ipecamera STATIC ipecamera.c model.c reader.c events.c data.c)
-
-install(FILES ipecamera.h
- DESTINATION include
-)
diff --git a/ipecamera/data.c b/ipecamera/data.c
deleted file mode 100644
index 2bcccd5..0000000
--- a/ipecamera/data.c
+++ /dev/null
@@ -1,287 +0,0 @@
-#define _BSD_SOURCE
-#define _GNU_SOURCE
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <string.h>
-#include <sys/time.h>
-#include <pthread.h>
-#include <assert.h>
-
-#include <ufodecode.h>
-
-#include "../tools.h"
-#include "../error.h"
-
-#include "pcilib.h"
-#include "private.h"
-#include "data.h"
-
-// DS: Currently, on event_id overflow we are assuming the buffer is lost
-static int ipecamera_resolve_event_id(ipecamera_t *ctx, pcilib_event_id_t evid) {
- pcilib_event_id_t diff;
-
- if (evid > ctx->event_id) {
- diff = (((pcilib_event_id_t)-1) - ctx->event_id) + evid;
- if (diff >= ctx->buffer_size) return -1;
- } else {
- diff = ctx->event_id - evid;
- if (diff >= ctx->buffer_size) return -1;
- }
-
- // DS: Request buffer_size to be power of 2 and replace to shifts (just recompute in set_buffer_size)
- return (evid - 1) % ctx->buffer_size;
-}
-
-inline static int ipecamera_decode_frame(ipecamera_t *ctx, pcilib_event_id_t event_id) {
- int err = 0;
- size_t res;
- uint16_t *pixels;
-
- int buf_ptr = ipecamera_resolve_event_id(ctx, event_id);
- if (buf_ptr < 0) return PCILIB_ERROR_TIMEOUT;
-
- if (ctx->frame[buf_ptr].event.image_ready) return 0;
-
- if (ctx->frame[buf_ptr].event.info.flags&PCILIB_EVENT_INFO_FLAG_BROKEN) {
- err = PCILIB_ERROR_INVALID_DATA;
- ctx->frame[buf_ptr].event.image_broken = err;
- goto ready;
- }
-
-
- pixels = ctx->image + buf_ptr * ctx->image_size;
- memset(ctx->cmask + ctx->buffer_pos * ctx->dim.height, 0, ctx->dim.height * sizeof(ipecamera_change_mask_t));
-/*
- printf("decoding %lx...\n", ctx->raw_size);
- FILE *f = fopen("/mnt/frame.xxx", "w");
- fwrite(ctx->buffer + buf_ptr * ctx->padded_size, 1, ctx->raw_size, f);
- fclose(f);*/
- res = ufo_decoder_decode_frame(ctx->ipedec, ctx->buffer + buf_ptr * ctx->padded_size, ctx->raw_size, pixels, &ctx->frame[buf_ptr].event.meta);
-// puts("done\n");
- if (!res) {
-#ifdef IPECAMERA_DEBUG_BROKEN_FRAMES
- char name[128];
- sprintf(name, "%s/broken.%4lu", IPECAMERA_DEBUG_BROKEN_FRAMES, ctx->event_id);
- FILE *f = fopen(name, "w");
- if (f) {
- fwrite(ctx->buffer + buf_ptr * ctx->padded_size, ctx->raw_size, 1, f);
- fclose(f);
- }
-#endif /* IPECAMERA_DEBUG_BROKEN_FRAMES */
- err = PCILIB_ERROR_FAILED;
- ctx->frame[buf_ptr].event.image_broken = err;
- goto ready;
- }
-
- ctx->frame[buf_ptr].event.image_broken = 0;
-
-ready:
- ctx->frame[buf_ptr].event.image_ready = 1;
-
- if (ipecamera_resolve_event_id(ctx, event_id) < 0) {
- ctx->frame[buf_ptr].event.image_ready = 0;
- return PCILIB_ERROR_TIMEOUT;
- }
-
- return err;
-}
-
-static int ipecamera_get_next_buffer_to_process(ipecamera_t *ctx, pcilib_event_id_t *evid) {
- int res;
-
- if (ctx->preproc_id == ctx->event_id) return -1;
-
- if (ctx->preproc)
- pthread_mutex_lock(&ctx->preproc_mutex);
-
- if (ctx->preproc_id == ctx->event_id) {
- if (ctx->preproc)
- pthread_mutex_unlock(&ctx->preproc_mutex);
- return -1;
- }
-
- if ((ctx->event_id - ctx->preproc_id) > (ctx->buffer_size - IPECAMERA_RESERVE_BUFFERS)) ctx->preproc_id = ctx->event_id - (ctx->buffer_size - 1 - IPECAMERA_RESERVE_BUFFERS - 1);
-
- res = ctx->preproc_id%ctx->buffer_size;
-
- if (pthread_rwlock_trywrlock(&ctx->frame[res].mutex)) {
- pthread_mutex_unlock(&ctx->preproc_mutex);
- return -1;
- }
-
- *evid = ++ctx->preproc_id;
-
- if (ctx->preproc)
- pthread_mutex_unlock(&ctx->preproc_mutex);
-
- return res;
-}
-
-
-void *ipecamera_preproc_thread(void *user) {
- int buf_ptr;
- pcilib_event_id_t evid;
-
- ipecamera_preprocessor_t *preproc = (ipecamera_preprocessor_t*)user;
- ipecamera_t *ctx = preproc->ipecamera;
-
- while (ctx->run_preprocessors) {
- buf_ptr = ipecamera_get_next_buffer_to_process(ctx, &evid);
- if (buf_ptr < 0) {
- usleep(IPECAMERA_NOFRAME_PREPROC_SLEEP);
- continue;
- }
-
- ipecamera_decode_frame(ctx, evid);
-
- pthread_rwlock_unlock(&ctx->frame[buf_ptr].mutex);
- }
-
- return NULL;
-}
-
-static int ipecamera_get_frame(ipecamera_t *ctx, pcilib_event_id_t event_id) {
- int err;
- int buf_ptr = (event_id - 1) % ctx->buffer_size;
-
- if (ctx->preproc) {
- if (ctx->frame[buf_ptr].event.image_broken)
- return ctx->frame[buf_ptr].event.image_broken;
- } else {
- pthread_rwlock_rdlock(&ctx->frame[buf_ptr].mutex);
-
- err = ipecamera_decode_frame(ctx, event_id);
-
- if (err) {
- pthread_rwlock_unlock(&ctx->frame[buf_ptr].mutex);
- return err;
- }
-
- return 0;
- }
-
-
- while (!ctx->frame[buf_ptr].event.image_ready) {
- usleep(IPECAMERA_NOFRAME_PREPROC_SLEEP);
-
- buf_ptr = ipecamera_resolve_event_id(ctx, event_id);
- if (buf_ptr < 0) return PCILIB_ERROR_OVERWRITTEN;
- }
-
- pthread_rwlock_rdlock(&ctx->frame[buf_ptr].mutex);
-
- buf_ptr = ipecamera_resolve_event_id(ctx, event_id);
- if ((buf_ptr < 0)||(!ctx->frame[buf_ptr].event.image_ready)) {
- pthread_rwlock_unlock(&ctx->frame[buf_ptr].mutex);
- return PCILIB_ERROR_OVERWRITTEN;
- }
-
- return 0;
-}
-
-
-/*
- We will lock the data for non-raw data to prevent ocasional overwritting. The
- raw data will be overwritten by the reader thread anyway and we can't do
- anything to prevent it for performance reasons.
-*/
-int ipecamera_get(pcilib_context_t *vctx, pcilib_event_id_t event_id, pcilib_event_data_type_t data_type, size_t arg_size, void *arg, size_t *size, void **ret) {
- int err;
- int buf_ptr;
- size_t raw_size;
- ipecamera_t *ctx = (ipecamera_t*)vctx;
-
- void *data = *ret;
-
- if (!ctx) {
- pcilib_error("IPECamera imaging is not initialized");
- return PCILIB_ERROR_NOTINITIALIZED;
- }
-
- buf_ptr = ipecamera_resolve_event_id(ctx, event_id);
- if (buf_ptr < 0) return PCILIB_ERROR_OVERWRITTEN;
-
- switch ((ipecamera_data_type_t)data_type) {
- case IPECAMERA_RAW_DATA:
- raw_size = ctx->frame[buf_ptr].event.raw_size;
- if (data) {
- if ((!size)||(*size < raw_size)) return PCILIB_ERROR_TOOBIG;
- memcpy(data, ctx->buffer + buf_ptr * ctx->padded_size, raw_size);
- if (ipecamera_resolve_event_id(ctx, event_id) < 0) return PCILIB_ERROR_OVERWRITTEN;
- *size = raw_size;
- return 0;
- }
- if (size) *size = raw_size;
- *ret = ctx->buffer + buf_ptr * ctx->padded_size;
- return 0;
- case IPECAMERA_IMAGE_DATA:
- err = ipecamera_get_frame(ctx, event_id);
- if (err) return err;
-
- if (data) {
- if ((!size)||(*size < ctx->image_size * sizeof(ipecamera_pixel_t))) return PCILIB_ERROR_TOOBIG;
- memcpy(data, ctx->image + buf_ptr * ctx->image_size, ctx->image_size * sizeof(ipecamera_pixel_t));
- pthread_rwlock_unlock(&ctx->frame[buf_ptr].mutex);
- *size = ctx->image_size * sizeof(ipecamera_pixel_t);
- return 0;
- }
-
- if (size) *size = ctx->image_size * sizeof(ipecamera_pixel_t);
- *ret = ctx->image + buf_ptr * ctx->image_size;
- return 0;
- case IPECAMERA_CHANGE_MASK:
- err = ipecamera_get_frame(ctx, event_id);
- if (err) return err;
-
- if (data) {
- if ((!size)||(*size < ctx->dim.height * sizeof(ipecamera_change_mask_t))) return PCILIB_ERROR_TOOBIG;
- memcpy(data, ctx->image + buf_ptr * ctx->dim.height, ctx->dim.height * sizeof(ipecamera_change_mask_t));
- pthread_rwlock_unlock(&ctx->frame[buf_ptr].mutex);
- *size = ctx->dim.height * sizeof(ipecamera_change_mask_t);
- return 0;
- }
-
- if (size) *size = ctx->dim.height * sizeof(ipecamera_change_mask_t);
- *ret = ctx->cmask + buf_ptr * ctx->dim.height;
- return 0;
- case IPECAMERA_DIMENSIONS:
- if (size) *size = sizeof(ipecamera_image_dimensions_t);
- ret = (void*)&ctx->dim;
- return 0;
- case IPECAMERA_IMAGE_REGION:
- case IPECAMERA_PACKED_IMAGE:
- // Shall we return complete image or only changed parts?
- case IPECAMERA_PACKED_LINE:
- case IPECAMERA_PACKED_PAYLOAD:
- pcilib_error("Support for data type (%li) is not implemented yet", data_type);
- return PCILIB_ERROR_NOTSUPPORTED;
- default:
- pcilib_error("Unknown data type (%li) is requested", data_type);
- return PCILIB_ERROR_INVALID_REQUEST;
- }
-}
-
-
-/*
- We will unlock non-raw data and check if the raw data is not overwritten yet
-*/
-int ipecamera_return(pcilib_context_t *vctx, pcilib_event_id_t event_id, pcilib_event_data_type_t data_type, void *data) {
- ipecamera_t *ctx = (ipecamera_t*)vctx;
-
- if (!ctx) {
- pcilib_error("IPECamera imaging is not initialized");
- return PCILIB_ERROR_NOTINITIALIZED;
-
- }
-
- if ((ipecamera_data_type_t)data_type == IPECAMERA_RAW_DATA) {
- if (ipecamera_resolve_event_id(ctx, event_id) < 0) return PCILIB_ERROR_OVERWRITTEN;
- } else {
- int buf_ptr = (event_id - 1) % ctx->buffer_size;
- pthread_rwlock_unlock(&ctx->frame[buf_ptr].mutex);
- }
-
- return 0;
-}
diff --git a/ipecamera/data.h b/ipecamera/data.h
deleted file mode 100644
index 846cb78..0000000
--- a/ipecamera/data.h
+++ /dev/null
@@ -1,6 +0,0 @@
-#ifndef _IPECAMERA_DATA_H
-#define _IPECAMERA_DATA_H
-
-void *ipecamera_preproc_thread(void *user);
-
-#endif /* _IPECAMERA_DATA_H */
diff --git a/ipecamera/events.c b/ipecamera/events.c
deleted file mode 100644
index ef85403..0000000
--- a/ipecamera/events.c
+++ /dev/null
@@ -1,160 +0,0 @@
-#define _BSD_SOURCE
-#define _GNU_SOURCE
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <string.h>
-#include <sys/time.h>
-#include <pthread.h>
-#include <assert.h>
-
-#include <ufodecode.h>
-
-#include "../tools.h"
-#include "../error.h"
-
-#include "pcilib.h"
-#include "public.h"
-#include "private.h"
-#include "events.h"
-
-int ipecamera_stream(pcilib_context_t *vctx, pcilib_event_callback_t callback, void *user) {
- int run_flag = 1;
- int res, err = 0;
- int do_stop = 0;
-
- ipecamera_event_info_t info;
- ipecamera_t *ctx = (ipecamera_t*)vctx;
-
- if (!ctx) {
- pcilib_error("IPECamera imaging is not initialized");
- return PCILIB_ERROR_NOTINITIALIZED;
- }
-
- ctx->streaming = 1;
- ctx->run_streamer = 1;
-
- if (!ctx->started) {
- err = ipecamera_start(vctx, PCILIB_EVENTS_ALL, PCILIB_EVENT_FLAGS_DEFAULT);
- if (err) {
- ctx->streaming = 0;
- return err;
- }
-
- do_stop = 1;
- }
-
- if (ctx->parse_data) {
- // This loop iterates while the generation
- while ((run_flag)&&((ctx->run_streamer)||(ctx->reported_id != ctx->event_id))) {
-#ifdef IPECAMERA_ANNOUNCE_READY
- while (((!ctx->preproc)&&(ctx->reported_id != ctx->event_id))||((ctx->preproc)&&(ctx->reported_id != ctx->preproc_id))) {
-#else /* IPECAMERA_ANNOUNCE_READY */
- while (ctx->reported_id != ctx->event_id) {
-#endif /* IPECAMERA_ANNOUNCE_READY */
- if ((ctx->event_id - ctx->reported_id) > (ctx->buffer_size - IPECAMERA_RESERVE_BUFFERS)) ctx->reported_id = ctx->event_id - (ctx->buffer_size - 1 - IPECAMERA_RESERVE_BUFFERS);
- else ++ctx->reported_id;
-
- memcpy(&info, ctx->frame + ((ctx->reported_id-1)%ctx->buffer_size), sizeof(ipecamera_event_info_t));
-
- if ((ctx->event_id - ctx->reported_id) < ctx->buffer_size) {
- res = callback(ctx->reported_id, (pcilib_event_info_t*)&info, user);
- if (res <= 0) {
- if (res < 0) err = -res;
- run_flag = 0;
- break;
- }
- }
- }
- usleep(IPECAMERA_NOFRAME_SLEEP);
- }
- } else {
- while ((run_flag)&&(ctx->run_streamer)) {
- usleep(IPECAMERA_NOFRAME_SLEEP);
- }
- }
-
- ctx->streaming = 0;
-
- if (do_stop) {
- ipecamera_stop(vctx, PCILIB_EVENT_FLAGS_DEFAULT);
- }
-
-
- return err;
-}
-
-int ipecamera_next_event(pcilib_context_t *vctx, pcilib_timeout_t timeout, pcilib_event_id_t *evid, size_t info_size, pcilib_event_info_t *info) {
- struct timeval tv;
- ipecamera_t *ctx = (ipecamera_t*)vctx;
-
- if (!ctx) {
- pcilib_error("IPECamera imaging is not initialized");
- return PCILIB_ERROR_NOTINITIALIZED;
- }
-
- if (!ctx->started) {
- pcilib_error("IPECamera is not in grabbing mode");
- return PCILIB_ERROR_INVALID_REQUEST;
- }
-
- if (!ctx->parse_data) {
- pcilib_error("RAWData only mode is requested");
- return PCILIB_ERROR_INVALID_REQUEST;
- }
-
-#ifdef IPECAMERA_ANNOUNCE_READY
- if (((!ctx->preproc)&&(ctx->reported_id == ctx->event_id))||((ctx->preproc)&&(ctx->reported_id == ctx->preproc_id))) {
-#else /* IPECAMERA_ANNOUNCE_READY */
- if (ctx->reported_id == ctx->event_id) {
-#endif /* IPECAMERA_ANNOUNCE_READY */
-
- if (timeout) {
- if (timeout == PCILIB_TIMEOUT_INFINITE) {
-#ifdef IPECAMERA_ANNOUNCE_READY
- while ((ctx->started)&&(((!ctx->preproc)&&(ctx->reported_id == ctx->event_id))||((ctx->preproc)&&(ctx->reported_id == ctx->preproc_id)))) {
-#else /* IPECAMERA_ANNOUNCE_READY */
- while ((ctx->started)&&(ctx->reported_id == ctx->event_id)) {
-#endif /* IPECAMERA_ANNOUNCE_READY */
- usleep(IPECAMERA_NOFRAME_SLEEP);
- }
- } else {
- pcilib_calc_deadline(&tv, timeout);
-
-#ifdef IPECAMERA_ANNOUNCE_READY
- while ((ctx->started)&&(pcilib_calc_time_to_deadline(&tv) > 0)&&(((!ctx->preproc)&&(ctx->reported_id == ctx->event_id))||((ctx->preproc)&&(ctx->reported_id == ctx->preproc_id)))) {
-#else /* IPECAMERA_ANNOUNCE_READY */
- while ((ctx->started)&&(pcilib_calc_time_to_deadline(&tv) > 0)&&(ctx->reported_id == ctx->event_id)) {
-#endif /* IPECAMERA_ANNOUNCE_READY */
- usleep(IPECAMERA_NOFRAME_SLEEP);
- }
- }
- }
-
- if (ctx->reported_id == ctx->event_id) {
- return PCILIB_ERROR_TIMEOUT;
- }
-
- }
-
-retry:
- if ((ctx->event_id - ctx->reported_id) > (ctx->buffer_size - IPECAMERA_RESERVE_BUFFERS)) ctx->reported_id = ctx->event_id - (ctx->buffer_size - 1 - IPECAMERA_RESERVE_BUFFERS);
- else ++ctx->reported_id;
-
- if (evid) *evid = ctx->reported_id;
-
- if (info) {
- if (info_size >= sizeof(ipecamera_event_info_t))
- memcpy(info, ctx->frame + ((ctx->reported_id-1)%ctx->buffer_size), sizeof(ipecamera_event_info_t));
- else if (info_size >= sizeof(pcilib_event_info_t))
- memcpy(info, ctx->frame + ((ctx->reported_id-1)%ctx->buffer_size), sizeof(pcilib_event_info_t));
- else
- return PCILIB_ERROR_INVALID_ARGUMENT;
- }
-
- if ((ctx->event_id - ctx->reported_id) >= ctx->buffer_size) goto retry;
-
- return 0;
-}
-
diff --git a/ipecamera/events.h b/ipecamera/events.h
deleted file mode 100644
index 5268c81..0000000
--- a/ipecamera/events.h
+++ /dev/null
@@ -1,5 +0,0 @@
-#ifndef _IPECAMERA_EVENTS_H
-#define _IPECAMERA_EVENTS_H
-
-
-#endif /* _IPECAMERA_EVENTS_H */
diff --git a/ipecamera/ipecamera.c b/ipecamera/ipecamera.c
deleted file mode 100644
index 892c59e..0000000
--- a/ipecamera/ipecamera.c
+++ /dev/null
@@ -1,695 +0,0 @@
-#define _IPECAMERA_IMAGE_C
-#define _BSD_SOURCE
-#define _GNU_SOURCE
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <string.h>
-#include <sys/time.h>
-#include <pthread.h>
-#include <assert.h>
-
-#include <ufodecode.h>
-
-#include "../tools.h"
-#include "../error.h"
-#include "../event.h"
-
-#include "pcilib.h"
-#include "private.h"
-#include "model.h"
-#include "reader.h"
-#include "events.h"
-#include "data.h"
-
-
-#include "dma/nwl.h"
-
-#define FIND_REG(var, bank, name) \
- ctx->var = pcilib_find_register(pcilib, bank, name); \
- if (ctx->var == PCILIB_REGISTER_INVALID) { \
- err = PCILIB_ERROR_NOTFOUND; \
- pcilib_error("Unable to find a %s register", name); \
- }
-
-
-#define GET_REG(reg, var) \
- if (!err) { \
- err = pcilib_read_register_by_id(pcilib, ctx->reg, &var); \
- if (err) { \
- pcilib_error("Error reading %s register", ipecamera_registers[ctx->reg].name); \
- } \
- }
-
-#define SET_REG(reg, val) \
- if (!err) { \
- err = pcilib_write_register_by_id(pcilib, ctx->reg, val); \
- if (err) { \
- pcilib_error("Error writting %s register", ipecamera_registers[ctx->reg].name); \
- } \
- }
-
-#define CHECK_REG(reg, check) \
- if (!err) { \
- err = pcilib_read_register_by_id(pcilib, ctx->reg, &value); \
- if (err) { \
- pcilib_error("Error reading %s register", ipecamera_registers[ctx->reg].name); \
- } \
- if (value != check) { \
- pcilib_error("Unexpected value (0x%lx) of register %s", value, ipecamera_registers[ctx->reg].name); \
- err = PCILIB_ERROR_INVALID_DATA; \
- } \
- }
-
-#define IPECAMERA_GET_EXPECTED_STATUS(ctx) ((ctx->firmware == 4)?IPECAMERA_EXPECTED_STATUS_4:IPECAMERA_EXPECTED_STATUS)
-#define CHECK_STATUS_REG() CHECK_REG(status_reg, IPECAMERA_GET_EXPECTED_STATUS(ctx))
-
-#define CHECK_VALUE(value, val) \
- if ((!err)&&(value != val)) { \
- pcilib_error("Unexpected value (0x%x) in data stream (0x%x is expected)", value, val); \
- err = PCILIB_ERROR_INVALID_DATA; \
- }
-
-#define CHECK_FLAG(flag, check, ...) \
- if ((!err)&&(!(check))) { \
- pcilib_error("Unexpected value (0x%x) of " flag, __VA_ARGS__); \
- err = PCILIB_ERROR_INVALID_DATA; \
- }
-
-
-pcilib_context_t *ipecamera_init(pcilib_t *pcilib) {
- int err = 0;
-
- ipecamera_t *ctx = malloc(sizeof(ipecamera_t));
-
- if (ctx) {
- pcilib_register_value_t value;
-
- memset(ctx, 0, sizeof(ipecamera_t));
-
- ctx->buffer_size = IPECAMERA_DEFAULT_BUFFER_SIZE;
- ctx->dim.bpp = sizeof(ipecamera_pixel_t) * 8;
-
- // We need DMA engine initialized to resolve DMA registers
-// FIND_REG(packet_len_reg, "fpga", "xrawdata_packet_length");
-
- FIND_REG(status_reg, "fpga", "status");
- FIND_REG(control_reg, "fpga", "control");
-
- FIND_REG(status2_reg, "fpga", "status2");
- FIND_REG(status3_reg, "fpga", "status3");
-
- FIND_REG(n_lines_reg, "cmosis", "cmosis_number_lines");
- FIND_REG(line_reg, "cmosis", "cmosis_start1");
- FIND_REG(exposure_reg, "cmosis", "cmosis_exp_time");
- FIND_REG(flip_reg, "cmosis", "cmosis_image_flipping");
-
- FIND_REG(firmware_version_reg, "fpga", "firmware_version");
- FIND_REG(adc_resolution_reg, "fpga", "adc_resolution");
- FIND_REG(output_mode_reg, "fpga", "output_mode");
-
- FIND_REG(max_frames_reg, "fpga", "ddr_max_frames");
- FIND_REG(num_frames_reg, "fpga", "ddr_num_frames");
-
-
- GET_REG(firmware_version_reg, value);
- switch (value) {
- case 4:
- case 5:
- ctx->firmware = value;
- break;
- default:
-// pcilib_error("Unsupported version of firmware (%lu)", value);
- ctx->firmware = 0;
- }
-
-#ifdef IPECAMERA_BUG_POSTPONED_READ
- GET_REG(max_frames_reg, value);
- if ((value + IPECAMERA_RESERVE_BUFFERS + 3) > ctx->buffer_size) {
- ctx->buffer_size = (value + 1) + IPECAMERA_RESERVE_BUFFERS + 2;
- }
-#endif /* IPECAMERA_BUG_POSTPONED_READ */
-
-
- ctx->rdma = PCILIB_DMA_ENGINE_INVALID;
- ctx->wdma = PCILIB_DMA_ENGINE_INVALID;
-
- if (err) {
- free(ctx);
- return NULL;
- }
- }
-
- return (pcilib_context_t*)ctx;
-}
-
-void ipecamera_free(pcilib_context_t *vctx) {
- if (vctx) {
- ipecamera_t *ctx = (ipecamera_t*)vctx;
- ipecamera_stop(vctx, PCILIB_EVENT_FLAGS_DEFAULT);
- free(ctx);
- }
-}
-
-pcilib_dma_context_t *ipecamera_init_dma(pcilib_context_t *vctx) {
-#ifdef IPECAMERA_DMA_R3
- ipecamera_t *ctx = (ipecamera_t*)vctx;
-#endif
-
- pcilib_model_description_t *model_info = pcilib_get_model_description(vctx->pcilib);
- if ((!model_info->dma_api)||(!model_info->dma_api->init)) {
- pcilib_error("The DMA engine is not configured in model");
- return NULL;
- }
-
-
-#ifdef IPECAMERA_DMA_R3
- if (ctx->firmware) {
- return model_info->dma_api->init(vctx->pcilib, PCILIB_NWL_MODIFICATION_IPECAMERA, NULL);
- } else {
- return model_info->dma_api->init(vctx->pcilib, PCILIB_DMA_MODIFICATION_DEFAULT, NULL);
- }
-#else
- return model_info->dma_api->init(vctx->pcilib, PCILIB_DMA_MODIFICATION_DEFAULT, NULL);
-#endif
-}
-
-
-int ipecamera_set_buffer_size(ipecamera_t *ctx, int size) {
- if (ctx->started) {
- pcilib_error("Can't change buffer size while grabbing");
- return PCILIB_ERROR_INVALID_REQUEST;
- }
-
- if (size < 2) {
- pcilib_error("The buffer size is too small");
- return PCILIB_ERROR_INVALID_REQUEST;
- }
-
- if (((size^(size-1)) < size) < size) {
- pcilib_error("The buffer size is not power of 2");
- }
-
- ctx->buffer_size = size;
-
- return 0;
-}
-
-int ipecamera_reset(pcilib_context_t *vctx) {
- int err = 0;
- ipecamera_t *ctx = (ipecamera_t*)vctx;
- pcilib_t *pcilib = vctx->pcilib;
-
- pcilib_register_t control, status;
- pcilib_register_value_t value;
-
- if (!ctx) {
- pcilib_error("IPECamera imaging is not initialized");
- return PCILIB_ERROR_NOTINITIALIZED;
- }
-
- if (!ctx->firmware) {
- pcilib_warning("Unsupported version of firmware (%lu)", ctx->firmware);
- return 0;
- }
-
- pcilib = vctx->pcilib;
- control = ctx->control_reg;
- status = ctx->status_reg;
-
- // Set Reset bit to CMOSIS
- err = pcilib_write_register_by_id(pcilib, control, 0x1e4);
- if (err) {
- pcilib_error("Error setting FPGA reset bit");
- return err;
- }
- usleep(IPECAMERA_SLEEP_TIME);
-
- // Remove Reset bit to CMOSIS
- err = pcilib_write_register_by_id(pcilib, control, 0x1e1);
- if (err) {
- pcilib_error("Error reseting FPGA reset bit");
- return err;
- }
- usleep(IPECAMERA_SLEEP_TIME);
-
- // Special settings for CMOSIS v.2
- value = 01; err = pcilib_write_register_space(pcilib, "cmosis", 115, 1, &value);
- if (err) {
- pcilib_error("Error setting CMOSIS configuration");
- return err;
- }
- usleep(IPECAMERA_SLEEP_TIME);
-
- value = 07; err = pcilib_write_register_space(pcilib, "cmosis", 82, 1, &value);
- if (err) {
- pcilib_error("Error setting CMOSIS configuration");
- return err;
- }
- usleep(IPECAMERA_SLEEP_TIME);
-
- // Set default parameters
- err = pcilib_write_register_by_id(pcilib, control, IPECAMERA_IDLE);
- if (err) {
- pcilib_error("Error bringing FPGA in default mode");
- return err;
- }
-
- usleep(10000);
-
- err = pcilib_read_register_by_id(pcilib, status, &value);
- if (err) {
- pcilib_error("Error reading status register");
- return err;
- }
-
- if (value != IPECAMERA_GET_EXPECTED_STATUS(ctx)) {
- pcilib_error("Unexpected value (%lx) of status register, expected %lx", value, IPECAMERA_GET_EXPECTED_STATUS(ctx));
- return PCILIB_ERROR_VERIFY;
- }
-
- return 0;
-}
-
-
-int ipecamera_start(pcilib_context_t *vctx, pcilib_event_t event_mask, pcilib_event_flags_t flags) {
- int i;
- int err = 0;
- ipecamera_t *ctx = (ipecamera_t*)vctx;
- pcilib_t *pcilib = vctx->pcilib;
- pcilib_register_value_t value;
-
- pthread_attr_t attr;
- struct sched_param sched;
-
- if (!ctx) {
- pcilib_error("IPECamera imaging is not initialized");
- return PCILIB_ERROR_NOTINITIALIZED;
- }
-
- if (!ctx->firmware) {
- pcilib_error("Unsupported version of firmware (%lu)", ctx->firmware);
- return PCILIB_ERROR_INVALID_REQUEST;
- }
-
- if (ctx->started) {
- pcilib_error("IPECamera grabbing is already started");
- return PCILIB_ERROR_INVALID_REQUEST;
- }
-
- // Allow readout and clean the FRAME_REQUEST mode if set for some reason
- usleep(IPECAMERA_SLEEP_TIME);
- if (value&0x1000) ctx->fr_mode = 1;
- else {
- ctx->fr_mode = 0;
-
-// CHECK_STATUS_REG();
-// if (err) return err;
- }
-
- ctx->event_id = 0;
- ctx->preproc_id = 0;
- ctx->reported_id = 0;
- ctx->buffer_pos = 0;
- ctx->parse_data = (flags&PCILIB_EVENT_FLAG_RAW_DATA_ONLY)?0:1;
- ctx->cur_size = 0;
-
- ctx->dim.width = IPECAMERA_WIDTH;
- ctx->dim.height = IPECAMERA_MAX_LINES;
-// GET_REG(n_lines_reg, ctx->dim.height);
-
- GET_REG(output_mode_reg, value);
- switch (value) {
- case IPECAMERA_MODE_16_CHAN_IO:
- ctx->cmosis_outputs = 16;
- break;
- case IPECAMERA_MODE_4_CHAN_IO:
- ctx->cmosis_outputs = 4;
- break;
- default:
- pcilib_error("IPECamera reporting invalid output_mode 0x%lx", value);
- return PCILIB_ERROR_INVALID_STATE;
- }
-
- ipecamera_compute_buffer_size(ctx, ctx->dim.height);
-
- ctx->raw_size = ctx->cur_raw_size;
- ctx->full_size = ctx->cur_full_size;
- ctx->padded_size = ctx->cur_padded_size;
-
- ctx->image_size = ctx->dim.width * ctx->dim.height;
-
-
- GET_REG(max_frames_reg, value);
- ctx->max_frames = value;
-
- ctx->buffer = malloc(ctx->padded_size * ctx->buffer_size);
- if (!ctx->buffer) {
- ipecamera_stop(vctx, PCILIB_EVENT_FLAGS_DEFAULT);
- pcilib_error("Unable to allocate ring buffer (%lu bytes)", ctx->padded_size * ctx->buffer_size);
- return PCILIB_ERROR_MEMORY;
- }
-
- ctx->image = (ipecamera_pixel_t*)malloc(ctx->image_size * ctx->buffer_size * sizeof(ipecamera_pixel_t));
- if (!ctx->image) {
- ipecamera_stop(vctx, PCILIB_EVENT_FLAGS_DEFAULT);
- pcilib_error("Unable to allocate image buffer (%lu bytes)", ctx->image_size * ctx->buffer_size * sizeof(ipecamera_pixel_t));
- return PCILIB_ERROR_MEMORY;
- }
-
- ctx->cmask = malloc(ctx->dim.height * ctx->buffer_size * sizeof(ipecamera_change_mask_t));
- if (!ctx->cmask) {
- ipecamera_stop(vctx, PCILIB_EVENT_FLAGS_DEFAULT);
- pcilib_error("Unable to allocate change-mask buffer");
- return PCILIB_ERROR_MEMORY;
- }
-
- ctx->frame = (ipecamera_frame_t*)malloc(ctx->buffer_size * sizeof(ipecamera_frame_t));
- if (!ctx->frame) {
- ipecamera_stop(vctx, PCILIB_EVENT_FLAGS_DEFAULT);
- pcilib_error("Unable to allocate frame-info buffer");
- return PCILIB_ERROR_MEMORY;
- }
-
- memset(ctx->frame, 0, ctx->buffer_size * sizeof(ipecamera_frame_t));
-
- for (i = 0; i < ctx->buffer_size; i++) {
- err = pthread_rwlock_init(&ctx->frame[i].mutex, NULL);
- if (err) break;
- }
-
- ctx->frame_mutex_destroy = i;
-
- if (err) {
- ipecamera_stop(vctx, PCILIB_EVENT_FLAGS_DEFAULT);
- pcilib_error("Initialization of rwlock mutexes for frame synchronization has failed");
- return PCILIB_ERROR_FAILED;
- }
-
- ctx->ipedec = ufo_decoder_new(ctx->dim.height, ctx->dim.width, NULL, 0);
- if (!ctx->ipedec) {
- ipecamera_stop(vctx, PCILIB_EVENT_FLAGS_DEFAULT);
- pcilib_error("Unable to initialize IPECamera decoder library");
- return PCILIB_ERROR_FAILED;
- }
-
- if (!err) {
- ctx->rdma = pcilib_find_dma_by_addr(vctx->pcilib, PCILIB_DMA_FROM_DEVICE, IPECAMERA_DMA_ADDRESS);
- if (ctx->rdma == PCILIB_DMA_ENGINE_INVALID) {
- err = PCILIB_ERROR_NOTFOUND;
- pcilib_error("The C2S channel of IPECamera DMA Engine (%u) is not found", IPECAMERA_DMA_ADDRESS);
- } else {
- err = pcilib_start_dma(vctx->pcilib, ctx->rdma, PCILIB_DMA_FLAGS_DEFAULT);
- if (err) {
- ctx->rdma = PCILIB_DMA_ENGINE_INVALID;
- pcilib_error("Failed to initialize C2S channel of IPECamera DMA Engine (%u)", IPECAMERA_DMA_ADDRESS);
- }
- }
- }
-
-/*
- if (!err) {
- ctx->wdma = pcilib_find_dma_by_addr(vctx->pcilib, PCILIB_DMA_TO_DEVICE, IPECAMERA_DMA_ADDRESS);
- if (ctx->wdma == PCILIB_DMA_ENGINE_INVALID) {
- err = PCILIB_ERROR_NOTFOUND;
- pcilib_error("The S2C channel of IPECamera DMA Engine (%u) is not found", IPECAMERA_DMA_ADDRESS);
- } else {
- err = pcilib_start_dma(vctx->pcilib, ctx->wdma, PCILIB_DMA_FLAGS_DEFAULT);
- if (err) {
- ctx->wdma = PCILIB_DMA_ENGINE_INVALID;
- pcilib_error("Failed to initialize S2C channel of IPECamera DMA Engine (%u)", IPECAMERA_DMA_ADDRESS);
- }
- }
- }
-*/
-
-/*
- SET_REG(packet_len_reg, IPECAMERA_DMA_PACKET_LENGTH);
-*/
-
- if (err) {
- ipecamera_stop(vctx, PCILIB_EVENT_FLAGS_DEFAULT);
- return err;
- }
-
- // Clean DMA
-#ifndef IPECAMERA_BUG_POSTPONED_READ
- err = pcilib_skip_dma(vctx->pcilib, ctx->rdma);
- if (err) {
- ipecamera_stop(vctx, PCILIB_EVENT_FLAGS_DEFAULT);
- pcilib_error("Can't start grabbing, device continuously writes unexpected data using DMA engine");
- return err;
- }
-#endif /* ! IPECAMERA_BUG_POSTPONED_READ */
-
- if (vctx->params.autostop.duration) {
- gettimeofday(&ctx->autostop.timestamp, NULL);
- ctx->autostop.timestamp.tv_usec += vctx->params.autostop.duration % 1000000;
- if (ctx->autostop.timestamp.tv_usec > 999999) {
- ctx->autostop.timestamp.tv_sec += 1 + vctx->params.autostop.duration / 1000000;
- ctx->autostop.timestamp.tv_usec -= 1000000;
- } else {
- ctx->autostop.timestamp.tv_sec += vctx->params.autostop.duration / 1000000;
- }
- }
-
- if (vctx->params.autostop.max_events) {
- ctx->autostop.evid = vctx->params.autostop.max_events;
- }
-
- if ((ctx->parse_data)&&(flags&PCILIB_EVENT_FLAG_PREPROCESS)) {
- ctx->n_preproc = pcilib_get_cpu_count();
-
- // it would be greate to detect hyperthreading cores and ban them
- switch (ctx->n_preproc) {
- case 1: break;
- case 2 ... 3: ctx->n_preproc -= 1; break;
- default: ctx->n_preproc -= 2; break;
- }
-
- if ((vctx->params.parallel.max_threads)&&(vctx->params.parallel.max_threads < ctx->n_preproc))
- ctx->n_preproc = vctx->params.parallel.max_threads;
-
- ctx->preproc = (ipecamera_preprocessor_t*)malloc(ctx->n_preproc * sizeof(ipecamera_preprocessor_t));
- if (!ctx->preproc) {
- ipecamera_stop(vctx, PCILIB_EVENT_FLAGS_DEFAULT);
- pcilib_error("Unable to allocate memory for preprocessor contexts");
- return PCILIB_ERROR_MEMORY;
- }
-
- memset(ctx->preproc, 0, ctx->n_preproc * sizeof(ipecamera_preprocessor_t));
-
- err = pthread_mutex_init(&ctx->preproc_mutex, NULL);
- if (err) {
- ipecamera_stop(vctx, PCILIB_EVENT_FLAGS_DEFAULT);
- pcilib_error("Failed to initialize event mutex");
- return PCILIB_ERROR_FAILED;
- }
- ctx->preproc_mutex_destroy = 1;
-
-
- ctx->run_preprocessors = 1;
- for (i = 0; i < ctx->n_preproc; i++) {
- ctx->preproc[i].i = i;
- ctx->preproc[i].ipecamera = ctx;
- err = pthread_create(&ctx->preproc[i].thread, NULL, ipecamera_preproc_thread, ctx->preproc + i);
- if (err) {
- err = PCILIB_ERROR_FAILED;
- break;
- } else {
- ctx->preproc[i].started = 1;
- }
- }
-
- if (err) {
- ipecamera_stop(vctx, PCILIB_EVENT_FLAGS_DEFAULT);
- pcilib_error("Failed to schedule some of the preprocessor threads");
- return err;
- }
- } else {
- ctx->n_preproc = 0;
- }
-
- ctx->started = 1;
- ctx->run_reader = 1;
-
- pthread_attr_init(&attr);
-
- if (pthread_attr_setschedpolicy(&attr, SCHED_FIFO)) {
- pcilib_warning("Can't schedule a real-time thread, you may consider running as root");
- } else {
- sched.sched_priority = sched_get_priority_max(SCHED_FIFO) - 1; // Let 1 priority for something really critcial
- pthread_attr_setschedparam(&attr, &sched);
- }
-
- if (pthread_create(&ctx->rthread, &attr, &ipecamera_reader_thread, (void*)ctx)) {
- ctx->started = 0;
- ipecamera_stop(vctx, PCILIB_EVENT_FLAGS_DEFAULT);
- err = PCILIB_ERROR_FAILED;
- }
-
- pthread_attr_destroy(&attr);
-
- return err;
-}
-
-
-int ipecamera_stop(pcilib_context_t *vctx, pcilib_event_flags_t flags) {
- int i;
- int err;
- void *retcode;
- ipecamera_t *ctx = (ipecamera_t*)vctx;
-
- if (!ctx) {
- pcilib_error("IPECamera imaging is not initialized");
- return PCILIB_ERROR_NOTINITIALIZED;
- }
-
- if (flags&PCILIB_EVENT_FLAG_STOP_ONLY) {
- ctx->run_reader = 0;
- return 0;
- }
-
- if (ctx->started) {
- ctx->run_reader = 0;
- err = pthread_join(ctx->rthread, &retcode);
- if (err) pcilib_error("Error joining the reader thread");
- }
-
- if (ctx->preproc) {
- ctx->run_preprocessors = 0;
-
- for (i = 0; i < ctx->n_preproc; i++) {
- if (ctx->preproc[i].started) {
- pthread_join(ctx->preproc[i].thread, &retcode);
- ctx->preproc[i].started = 0;
- }
- }
-
- if (ctx->preproc_mutex_destroy) {
- pthread_mutex_destroy(&ctx->preproc_mutex);
- ctx->preproc_mutex_destroy = 0;
- }
-
- free(ctx->preproc);
- ctx->preproc = NULL;
- }
-
- if (ctx->frame_mutex_destroy) {
- for (i = 0; i < ctx->frame_mutex_destroy; i++) {
- pthread_rwlock_destroy(&ctx->frame[i].mutex);
- }
- ctx->frame_mutex_destroy = 0;
- }
-
-
- if (ctx->wdma != PCILIB_DMA_ENGINE_INVALID) {
- pcilib_stop_dma(vctx->pcilib, ctx->wdma, PCILIB_DMA_FLAGS_DEFAULT);
- ctx->wdma = PCILIB_DMA_ENGINE_INVALID;
- }
-
- if (ctx->rdma != PCILIB_DMA_ENGINE_INVALID) {
- pcilib_stop_dma(vctx->pcilib, ctx->rdma, PCILIB_DMA_FLAGS_DEFAULT);
- ctx->rdma = PCILIB_DMA_ENGINE_INVALID;
- }
-
- while (ctx->streaming) {
- usleep(IPECAMERA_NOFRAME_SLEEP);
- }
-
- if (ctx->ipedec) {
- ufo_decoder_free(ctx->ipedec);
- ctx->ipedec = NULL;
- }
-
- if (ctx->frame) {
- free(ctx->frame);
- ctx->frame = NULL;
- }
-
- if (ctx->cmask) {
- free(ctx->cmask);
- ctx->cmask = NULL;
- }
-
- if (ctx->image) {
- free(ctx->image);
- ctx->image = NULL;
- }
-
- if (ctx->buffer) {
- free(ctx->buffer);
- ctx->buffer = NULL;
- }
-
-
- memset(&ctx->autostop, 0, sizeof(ipecamera_autostop_t));
-
- ctx->event_id = 0;
- ctx->reported_id = 0;
- ctx->buffer_pos = 0;
- ctx->started = 0;
-
- return 0;
-}
-
-
-int ipecamera_trigger(pcilib_context_t *vctx, pcilib_event_t event, size_t trigger_size, void *trigger_data) {
- int err = 0;
- pcilib_register_value_t value;
-
- ipecamera_t *ctx = (ipecamera_t*)vctx;
- pcilib_t *pcilib = vctx->pcilib;
-
- if (!ctx) {
- pcilib_error("IPECamera imaging is not initialized");
- return PCILIB_ERROR_NOTINITIALIZED;
- }
-
- if (!ctx->firmware) {
- pcilib_error("Unsupported version of firmware (%lu)", ctx->firmware);
- return PCILIB_ERROR_INVALID_REQUEST;
- }
-
- pcilib_sleep_until_deadline(&ctx->next_trigger);
-/*
- GET_REG(num_frames_reg, value);
- if (value == ctx->max_frames) {
- return PCILIB_ERROR_BUSY;
- }
-*/
-
- GET_REG(status2_reg, value);
- if (value&0x40000000) {
-// printf("%x\n", value);
-// GET_REG(status3_reg, value);
-// printf("3: %x\n", value);
-// GET_REG(status_reg, value);
-// printf("1: %x\n", value);
-
-#ifdef IPECAMERA_TRIGGER_WAIT_IDLE
- if (IPECAMERA_TRIGGER_WAIT_IDLE) {
- struct timeval deadline;
- pcilib_calc_deadline(&deadline, IPECAMERA_TRIGGER_WAIT_IDLE);
- do {
- usleep(IPECAMERA_READ_STATUS_DELAY);
- GET_REG(status2_reg, value);
- } while ((value&0x40000000)&&(pcilib_calc_time_to_deadline(&deadline) > 0));
- }
- if (value&0x40000000)
-#endif /* IPECAMERA_TRIGGER_WAIT_IDLE */
- return PCILIB_ERROR_BUSY;
- }
-
- GET_REG(control_reg, value);
- SET_REG(control_reg, value|IPECAMERA_FRAME_REQUEST);
- usleep(IPECAMERA_WAIT_FRAME_RCVD_TIME);
- //CHECK_REG(status_reg, IPECAMERA_EXPECTED_STATUS);
- SET_REG(control_reg, value);
-
- // We need to compute it differently, on top of that add exposure time and the time FPGA takes to read frame from CMOSIS
- pcilib_calc_deadline(&ctx->next_trigger, IPECAMERA_NEXT_FRAME_DELAY);
-
- return 0;
-}
diff --git a/ipecamera/ipecamera.h b/ipecamera/ipecamera.h
deleted file mode 100644
index 673eea1..0000000
--- a/ipecamera/ipecamera.h
+++ /dev/null
@@ -1,38 +0,0 @@
-#ifndef _IPECAMERA_H
-#define _IPECAMERA_H
-
-#include <ufodecode.h>
-
-typedef struct ipecamera_s ipecamera_t;
-
-typedef struct {
- unsigned int bpp; /*<< Bits per pixel (8, 16, or 32) as returned by IPECAMERA_IMAGE_DATA */
- unsigned int real_bpp; /*<< Bits per pixel as returned by camera and IPECAMERA_PACKED_IMAGE */
- unsigned int width, height;
-} ipecamera_image_dimensions_t;
-
-typedef enum {
- IPECAMERA_IMAGE_DATA = 0,
- IPECAMERA_RAW_DATA = 1,
- IPECAMERA_DIMENSIONS = 0x8000,
- IPECAMERA_IMAGE_REGION = 0x8010,
- IPECAMERA_PACKED_IMAGE = 0x8020,
- IPECAMERA_PACKED_LINE = 0x8021,
- IPECAMERA_PACKED_PAYLOAD = 0x8022,
- IPECAMERA_CHANGE_MASK = 0x8030
-} ipecamera_data_type_t;
-
-typedef uint16_t ipecamera_change_mask_t;
-typedef uint16_t ipecamera_pixel_t;
-
-typedef struct {
- pcilib_event_info_t info;
- UfoDecoderMeta meta; /**< Frame metadata declared in ufodecode.h */
- int image_ready; /**< Indicates if image data is parsed */
- int image_broken; /**< Unlike the info.flags this is bound to the reconstructed image (i.e. is not updated on rawdata overwrite) */
- size_t raw_size; /**< Indicates the actual size of raw data */
-} ipecamera_event_info_t;
-
-int ipecamera_set_buffer_size(ipecamera_t *ctx, int size);
-
-#endif /* _IPECAMERA_H */
diff --git a/ipecamera/model.c b/ipecamera/model.c
deleted file mode 100644
index e60561b..0000000
--- a/ipecamera/model.c
+++ /dev/null
@@ -1,211 +0,0 @@
-#define _BSD_SOURCE
-#define _IPECAMERA_MODEL_C
-#include <sys/time.h>
-#include <unistd.h>
-#include <assert.h>
-
-#include "../tools.h"
-#include "../error.h"
-#include "model.h"
-
-#define ADDR_MASK 0x7F00
-#define WRITE_BIT 0x8000
-#define RETRIES 10
-
-//ToDo: check bot 1 and 2 bits for READY
-#define READ_READY_BIT 0x20000
-#define READ_ERROR_BIT 0x40000
-
-#define ipecamera_datacpy(dst, src, bank) pcilib_datacpy(dst, src, 4, 1, bank->raw_endianess)
-
-//#define IPECAMERA_SIMPLIFIED_READOUT
-#define IPECAMERA_MULTIREAD
-
-//static pcilib_register_value_t ipecamera_bit_mask[9] = { 0, 1, 3, 7, 15, 31, 63, 127, 255 };
-
-int ipecamera_read(pcilib_t *ctx, pcilib_register_bank_description_t *bank, pcilib_register_addr_t addr, pcilib_register_value_t *value) {
- uint32_t val, tmp[4];
- char *wr, *rd;
- struct timeval start;//, cur;
- int retries = RETRIES;
-
- assert(addr < 128);
-
- wr = pcilib_resolve_register_address(ctx, bank->bar, bank->write_addr);
- rd = pcilib_resolve_register_address(ctx, bank->bar, bank->read_addr);
- if ((!rd)||(!wr)) {
- pcilib_error("Error resolving addresses of read & write registers");
- return PCILIB_ERROR_INVALID_ADDRESS;
- }
-
- //printf("%i %x %p %p\n", addr, val, wr, rd);
-
-/*
-#ifdef IPECAMERA_SIMPLIFIED_READOUT
- ipecamera_datacpy(tmp, rd, bank);
-#endif
-*/
-
-retry:
- val = (addr << 8);
-
- ipecamera_datacpy(wr, &val, bank);
-
-#ifdef IPECAMERA_SIMPLIFIED_READOUT
- usleep(PCILIB_REGISTER_TIMEOUT);
-// ipecamera_datacpy(tmp, rd, bank);
-// usleep(PCILIB_REGISTER_TIMEOUT);
- ipecamera_datacpy(wr, &val, bank);
- usleep(PCILIB_REGISTER_TIMEOUT);
-// ipecamera_datacpy(tmp, rd, bank);
-// usleep(PCILIB_REGISTER_TIMEOUT);
- ipecamera_datacpy(wr, &val, bank);
- usleep(PCILIB_REGISTER_TIMEOUT);
-#endif /* IPECAMERA_SIMPLIFIED_READOUT */
-
- gettimeofday(&start, NULL);
-
-#ifdef IPECAMERA_MULTIREAD
- usleep(PCILIB_REGISTER_TIMEOUT);
- pcilib_datacpy(tmp, rd, 4, 4, bank->raw_endianess);
- val = tmp[0];
-#else /* IPECAMERA_MULTIREAD */
- ipecamera_datacpy(&val, rd, bank);
-
- while ((val & READ_READY_BIT) == 0) {
- gettimeofday(&cur, NULL);
- if (((cur.tv_sec - start.tv_sec)*1000000 + (cur.tv_usec - start.tv_usec)) > PCILIB_REGISTER_TIMEOUT) break;
-
- ipecamera_datacpy(&val, rd, bank);
- }
-#endif /* IPECAMERA_MULTIREAD */
-
- if ((val & READ_READY_BIT) == 0) {
- if (--retries > 0) {
- pcilib_warning("Timeout reading register value (CMOSIS %lu, status: %lx), retrying (try %i of %i)...", addr, val, RETRIES - retries, RETRIES);
- goto retry;
- }
- pcilib_error("Timeout reading register value (CMOSIS %lu, status: %lx)", addr, val);
- return PCILIB_ERROR_TIMEOUT;
- }
-
- if (val & READ_ERROR_BIT) {
-/* if (--retries > 0) {
- pcilib_warning("Error reading register (CMOSIS %lu, status: %lx), retrying (try %i of %i)...", addr, val, RETRIES - retries, RETRIES);
- goto retry;
- }*/
- pcilib_error("Error reading register value (CMOSIS %lu, status: %lx)", addr, val);
- return PCILIB_ERROR_FAILED;
- }
-
- if (((val&ADDR_MASK) >> 8) != addr) {
- if (--retries > 0) {
- pcilib_warning("Address verification failed during register read (CMOSIS %lu, status: %lx), retrying (try %i of %i)...", addr, val, RETRIES - retries, RETRIES);
- goto retry;
- }
- pcilib_error("Address verification failed during register read (CMOSIS %lu, status: %lx)", addr, val);
- return PCILIB_ERROR_VERIFY;
- }
-
-// *value = val&ipecamera_bit_mask[bits];
- *value = val&0xFF;
-
- return 0;
-}
-
-int ipecamera_write(pcilib_t *ctx, pcilib_register_bank_description_t *bank, pcilib_register_addr_t addr, pcilib_register_value_t value) {
- uint32_t val, tmp[4];
- char *wr, *rd;
- struct timeval start;//, cur;
- int retries = RETRIES;
-
- assert(addr < 128);
- assert(value < 256);
-
- wr = pcilib_resolve_register_address(ctx, bank->bar, bank->write_addr);
- rd = pcilib_resolve_register_address(ctx, bank->bar, bank->read_addr);
- if ((!rd)||(!wr)) {
- pcilib_error("Error resolving addresses of read & write registers");
- return PCILIB_ERROR_INVALID_ADDRESS;
- }
-
- //printf("%i %x %p %p\n", addr, val, wr, rd);
-
-/*
-#ifdef IPECAMERA_SIMPLIFIED_READOUT
- ipecamera_datacpy(tmp, rd, bank);
-#endif
-*/
-
-retry:
- val = WRITE_BIT|(addr << 8)|(value&0xFF);
- ipecamera_datacpy(wr, &val, bank);
-
-#ifdef IPECAMERA_SIMPLIFIED_READOUT
- usleep(PCILIB_REGISTER_TIMEOUT);
-// ipecamera_datacpy(tmp, rd, bank);
-// usleep(PCILIB_REGISTER_TIMEOUT);
- ipecamera_datacpy(wr, &val, bank);
- usleep(PCILIB_REGISTER_TIMEOUT);
-// ipecamera_datacpy(tmp, rd, bank);
-// usleep(PCILIB_REGISTER_TIMEOUT);
- ipecamera_datacpy(wr, &val, bank);
- usleep(PCILIB_REGISTER_TIMEOUT);
-#endif /* IPECAMERA_SIMPLIFIED_READOUT */
-
- gettimeofday(&start, NULL);
-
-#ifdef IPECAMERA_MULTIREAD
- usleep(PCILIB_REGISTER_TIMEOUT);
- pcilib_datacpy(tmp, rd, 4, 4, bank->raw_endianess);
- val = tmp[0];
-#else /* IPECAMERA_MULTIREAD */
- ipecamera_datacpy(&val, rd, bank);
- while ((val & READ_READY_BIT) == 0) {
- gettimeofday(&cur, NULL);
- if (((cur.tv_sec - start.tv_sec)*1000000 + (cur.tv_usec - start.tv_usec)) > PCILIB_REGISTER_TIMEOUT) break;
-
- ipecamera_datacpy(&val, rd, bank);
- }
-#endif /* IPECAMERA_MULTIREAD */
-
- if ((val & READ_READY_BIT) == 0) {
- if (--retries > 0) {
- pcilib_warning("Timeout occured during register write (CMOSIS %lu, value: %lu, status: %lx), retrying (try %i of %i)...", addr, value, val, RETRIES - retries, RETRIES);
- goto retry;
- }
-
- pcilib_error("Timeout writting register value (CMOSIS %lu, value: %lu, status: %lx)", addr, value, val);
- return PCILIB_ERROR_TIMEOUT;
- }
-
- if (val & READ_ERROR_BIT) {
-/* if (--retries > 0) {
- pcilib_warning("Register write has failed (CMOSIS %lu, value: %lu, status: %lx), retrying (try %i of %i)...", addr, value, val, RETRIES - retries, RETRIES);
- goto retry;
- }*/
- pcilib_error("Error writting register value (CMOSIS %lu, value: %lu, status: %lx)", addr, value, val);
- return PCILIB_ERROR_FAILED;
- }
-
- if (((val&ADDR_MASK) >> 8) != addr) {
- if (--retries > 0) {
- pcilib_warning("Address verification failed during register write (CMOSIS %lu, value: %lu, status: %lx), retrying (try %i of %i)...", addr, value, val, RETRIES - retries, RETRIES);
- goto retry;
- }
- pcilib_error("Address verification failed during register write (CMOSIS %lu, value: %lu, status: %lx)", addr, value, val);
- return PCILIB_ERROR_VERIFY;
- }
-
- if ((val&0xFF/*&ipecamera_bit_mask[bits]*/) != value) {
- pcilib_error("Value verification failed during register read (CMOSIS %lu, value: %lu != %lu)", addr, val/*&ipecamera_bit_mask[bits]*/, value);
- return PCILIB_ERROR_VERIFY;
- }
-
- //printf("%i\n", val&ipecamera_bit_mask[bits]);
-
- return 0;
-}
-
-
-
diff --git a/ipecamera/model.h b/ipecamera/model.h
deleted file mode 100644
index 60226f0..0000000
--- a/ipecamera/model.h
+++ /dev/null
@@ -1,180 +0,0 @@
-#ifndef _IPECAMERA_MODEL_H
-#define _IPECAMERA_MODEL_H
-
-#include <stdio.h>
-
-#include "../pcilib.h"
-#include "public.h"
-
-//#define IPECAMERA_DEBUG
-
-#define IPECAMERA_DMA_R3
-#define IPECAMERA_DMA_ADDRESS 0
-#define IPECAMERA_DMA_PACKET_LENGTH 4096
-
-//#define IPECAMERA_REGISTER_SPACE 0xfeaffc00
-#define IPECAMERA_REGISTER_SPACE 0x9000
-#define IPECAMERA_REGISTER_WRITE (IPECAMERA_REGISTER_SPACE + 0)
-#define IPECAMERA_REGISTER_READ (IPECAMERA_REGISTER_WRITE + 16)
-
-#ifdef _IPECAMERA_MODEL_C
-pcilib_register_bank_description_t ipecamera_register_banks[] = {
- { PCILIB_REGISTER_BANK0, PCILIB_BAR0, 128, IPECAMERA_REGISTER_PROTOCOL, IPECAMERA_REGISTER_READ , IPECAMERA_REGISTER_WRITE, PCILIB_LITTLE_ENDIAN, 8 , PCILIB_LITTLE_ENDIAN, "%lu" , "cmosis", "CMOSIS CMV2000 Registers" },
- { PCILIB_REGISTER_BANK1, PCILIB_BAR0, 0x0200, PCILIB_DEFAULT_PROTOCOL , IPECAMERA_REGISTER_SPACE, IPECAMERA_REGISTER_SPACE, PCILIB_LITTLE_ENDIAN, 32, PCILIB_LITTLE_ENDIAN, "0x%lx", "fpga", "IPECamera Registers" },
-// { PCILIB_REGISTER_BANK_DMA, PCILIB_BAR0, 0xA000, PCILIB_DEFAULT_PROTOCOL , 0, 0, PCILIB_LITTLE_ENDIAN, 32, PCILIB_LITTLE_ENDIAN, "0x%lx", "dma", "DMA Registers"},
- { PCILIB_REGISTER_BANK_DMA, PCILIB_BAR0, 0x0200, PCILIB_DEFAULT_PROTOCOL , 0, 0, PCILIB_LITTLE_ENDIAN, 32, PCILIB_LITTLE_ENDIAN, "0x%lx", "dma", "DMA Registers"},
- { 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, NULL }
-};
-
-pcilib_register_description_t ipecamera_registers[] = {
-{1, 0, 16, 1088, 0, PCILIB_REGISTER_RW, PCILIB_REGISTER_STANDARD, PCILIB_REGISTER_BANK0, "cmosis_number_lines", ""},
-{3, 0, 16, 0, 0, PCILIB_REGISTER_RW, PCILIB_REGISTER_STANDARD, PCILIB_REGISTER_BANK0, "cmosis_start1", ""},
-{5, 0, 16, 0, 0, PCILIB_REGISTER_RW, PCILIB_REGISTER_STANDARD, PCILIB_REGISTER_BANK0, "cmosis_start2", ""},
-{7, 0, 16, 0, 0, PCILIB_REGISTER_RW, PCILIB_REGISTER_STANDARD, PCILIB_REGISTER_BANK0, "cmosis_start3", ""},
-{9, 0, 16, 0, 0, PCILIB_REGISTER_RW, PCILIB_REGISTER_STANDARD, PCILIB_REGISTER_BANK0, "cmosis_start4", ""},
-{11, 0, 16, 0, 0, PCILIB_REGISTER_RW, PCILIB_REGISTER_STANDARD, PCILIB_REGISTER_BANK0, "cmosis_start5", ""},
-{13, 0, 16, 0, 0, PCILIB_REGISTER_RW, PCILIB_REGISTER_STANDARD, PCILIB_REGISTER_BANK0, "cmosis_start6", ""},
-{15, 0, 16, 0, 0, PCILIB_REGISTER_RW, PCILIB_REGISTER_STANDARD, PCILIB_REGISTER_BANK0, "cmosis_start7", ""},
-{17, 0, 16, 0, 0, PCILIB_REGISTER_RW, PCILIB_REGISTER_STANDARD, PCILIB_REGISTER_BANK0, "cmosis_start8", ""},
-{19, 0, 16, 0, 0, PCILIB_REGISTER_RW, PCILIB_REGISTER_STANDARD, PCILIB_REGISTER_BANK0, "cmosis_number_lines1", ""},
-{21, 0, 16, 0, 0, PCILIB_REGISTER_RW, PCILIB_REGISTER_STANDARD, PCILIB_REGISTER_BANK0, "cmosis_number_lines2", ""},
-{23, 0, 16, 0, 0, PCILIB_REGISTER_RW, PCILIB_REGISTER_STANDARD, PCILIB_REGISTER_BANK0, "cmosis_number_lines3", ""},
-{25, 0, 16, 0, 0, PCILIB_REGISTER_RW, PCILIB_REGISTER_STANDARD, PCILIB_REGISTER_BANK0, "cmosis_number_lines4", ""},
-{27, 0, 16, 0, 0, PCILIB_REGISTER_RW, PCILIB_REGISTER_STANDARD, PCILIB_REGISTER_BANK0, "cmosis_number_lines5", ""},
-{29, 0, 16, 0, 0, PCILIB_REGISTER_RW, PCILIB_REGISTER_STANDARD, PCILIB_REGISTER_BANK0, "cmosis_number_lines6", ""},
-{31, 0, 16, 0, 0, PCILIB_REGISTER_RW, PCILIB_REGISTER_STANDARD, PCILIB_REGISTER_BANK0, "cmosis_number_lines7", ""},
-{33, 0, 16, 0, 0, PCILIB_REGISTER_RW, PCILIB_REGISTER_STANDARD, PCILIB_REGISTER_BANK0, "cmosis_number_lines8", ""},
-{35, 0, 16, 0, 0, PCILIB_REGISTER_RW, PCILIB_REGISTER_STANDARD, PCILIB_REGISTER_BANK0, "cmosis_sub_s", ""},
-{37, 0, 16, 0, 0, PCILIB_REGISTER_RW, PCILIB_REGISTER_STANDARD, PCILIB_REGISTER_BANK0, "cmosis_sub_a", ""},
-{39, 0, 1, 1, 0, PCILIB_REGISTER_RW, PCILIB_REGISTER_STANDARD, PCILIB_REGISTER_BANK0, "cmosis_color", ""},
-{40, 0, 2, 0, 0, PCILIB_REGISTER_RW, PCILIB_REGISTER_STANDARD, PCILIB_REGISTER_BANK0, "cmosis_image_flipping", ""},
-{41, 0, 2, 0, 0, PCILIB_REGISTER_RW, PCILIB_REGISTER_STANDARD, PCILIB_REGISTER_BANK0, "cmosis_exp_flags", ""},
-{42, 0, 24, 1088, 0, PCILIB_REGISTER_RW, PCILIB_REGISTER_STANDARD, PCILIB_REGISTER_BANK0, "cmosis_exp_time", ""},
-{45, 0, 24, 1088, 0, PCILIB_REGISTER_RW, PCILIB_REGISTER_STANDARD, PCILIB_REGISTER_BANK0, "cmosis_exp_step", ""},
-{48, 0, 24, 1, 0, PCILIB_REGISTER_RW, PCILIB_REGISTER_STANDARD, PCILIB_REGISTER_BANK0, "cmosis_exp_kp1", ""},
-{51, 0, 24, 1, 0, PCILIB_REGISTER_RW, PCILIB_REGISTER_STANDARD, PCILIB_REGISTER_BANK0, "cmosis_exp_kp2", ""},
-{54, 0, 2, 1, 0, PCILIB_REGISTER_RW, PCILIB_REGISTER_STANDARD, PCILIB_REGISTER_BANK0, "cmosis_nr_slopes", ""},
-{55, 0, 8, 1, 0, PCILIB_REGISTER_RW, PCILIB_REGISTER_STANDARD, PCILIB_REGISTER_BANK0, "cmosis_exp_seq", ""},
-{56, 0, 24, 1088, 0, PCILIB_REGISTER_RW, PCILIB_REGISTER_STANDARD, PCILIB_REGISTER_BANK0, "cmosis_exp_time2", ""},
-{59, 0, 24, 1088, 0, PCILIB_REGISTER_RW, PCILIB_REGISTER_STANDARD, PCILIB_REGISTER_BANK0, "cmosis_exp_step2", ""},
-{68, 0, 2, 1, 0, PCILIB_REGISTER_RW, PCILIB_REGISTER_STANDARD, PCILIB_REGISTER_BANK0, "cmosis_nr_slopes2", ""},
-{69, 0, 8, 1, 0, PCILIB_REGISTER_RW, PCILIB_REGISTER_STANDARD, PCILIB_REGISTER_BANK0, "cmosis_exp_seq2", ""},
-{70, 0, 16, 1, 0, PCILIB_REGISTER_RW, PCILIB_REGISTER_STANDARD, PCILIB_REGISTER_BANK0, "cmosis_number_frames", ""},
-{72, 0, 2, 0, 0, PCILIB_REGISTER_RW, PCILIB_REGISTER_STANDARD, PCILIB_REGISTER_BANK0, "cmosis_output_mode", ""},
-{78, 0, 12, 85, 0, PCILIB_REGISTER_RW, PCILIB_REGISTER_STANDARD, PCILIB_REGISTER_BANK0, "cmosis_training_pattern", ""},
-{80, 0, 18, 0x3FFFF,0, PCILIB_REGISTER_RW, PCILIB_REGISTER_STANDARD, PCILIB_REGISTER_BANK0, "cmosis_channel_en", ""},
-{82, 0, 3, 7, 0, PCILIB_REGISTER_RW, PCILIB_REGISTER_STANDARD, PCILIB_REGISTER_BANK0, "cmosis_special_82", ""},
-{89, 0, 8, 96, 0, PCILIB_REGISTER_RW, PCILIB_REGISTER_STANDARD, PCILIB_REGISTER_BANK0, "cmosis_vlow2", ""},
-{90, 0, 8, 96, 0, PCILIB_REGISTER_RW, PCILIB_REGISTER_STANDARD, PCILIB_REGISTER_BANK0, "cmosis_vlow3", ""},
-{100, 0, 14, 16260, 0, PCILIB_REGISTER_RW, PCILIB_REGISTER_STANDARD, PCILIB_REGISTER_BANK0, "cmosis_offset", ""},
-{102, 0, 2, 0, 0, PCILIB_REGISTER_RW, PCILIB_REGISTER_STANDARD, PCILIB_REGISTER_BANK0, "cmosis_pga", ""},
-{103, 0, 8, 32, 0, PCILIB_REGISTER_RW, PCILIB_REGISTER_STANDARD, PCILIB_REGISTER_BANK0, "cmosis_adc_gain", ""},
-{111, 0, 1, 1, 0, PCILIB_REGISTER_RW, PCILIB_REGISTER_STANDARD, PCILIB_REGISTER_BANK0, "cmosis_bit_mode", ""},
-{112, 0, 2, 0, 0, PCILIB_REGISTER_RW, PCILIB_REGISTER_STANDARD, PCILIB_REGISTER_BANK0, "cmosis_adc_resolution", ""},
-{115, 0, 1, 1, 0, PCILIB_REGISTER_RW, PCILIB_REGISTER_STANDARD, PCILIB_REGISTER_BANK0, "cmosis_special_115", ""},
-/*{126, 0, 16, 0, PCILIB_REGISTER_RW, PCILIB_REGISTER_STANDARD, PCILIB_REGISTER_BANK0, "temp", ""},*/
-{0x00, 0, 32, 0, 0, PCILIB_REGISTER_RW, PCILIB_REGISTER_STANDARD, PCILIB_REGISTER_BANK1, "spi_conf_input", ""},
-{0x10, 0, 32, 0, 0, PCILIB_REGISTER_R, PCILIB_REGISTER_STANDARD, PCILIB_REGISTER_BANK1, "spi_conf_output", ""},
-{0x20, 0, 32, 0, 0, PCILIB_REGISTER_RW, PCILIB_REGISTER_STANDARD, PCILIB_REGISTER_BANK1, "spi_clk_speed", ""},
-{0x30, 0, 32, 0, 0, PCILIB_REGISTER_R, PCILIB_REGISTER_STANDARD, PCILIB_REGISTER_BANK1, "firmware_info", ""},
-{0x30, 0, 8, 0, 0, PCILIB_REGISTER_R, PCILIB_REGISTER_BITS, PCILIB_REGISTER_BANK1, "firmware_version", ""},
-{0x30, 8, 1, 0, 0, PCILIB_REGISTER_R, PCILIB_REGISTER_BITS, PCILIB_REGISTER_BANK1, "firmware_bitmode", ""},
-{0x30, 12, 2, 0, 0, PCILIB_REGISTER_R, PCILIB_REGISTER_BITS, PCILIB_REGISTER_BANK1, "adc_resolution", ""},
-{0x30, 16, 2, 0, 0, PCILIB_REGISTER_R, PCILIB_REGISTER_BITS, PCILIB_REGISTER_BANK1, "output_mode", ""},
-{0x40, 0, 32, 0, 0, PCILIB_REGISTER_RW, PCILIB_REGISTER_STANDARD, PCILIB_REGISTER_BANK1, "control", ""},
-{0x50, 0, 32, 0, 0, PCILIB_REGISTER_R, PCILIB_REGISTER_STANDARD, PCILIB_REGISTER_BANK1, "status", ""},
-{0x54, 0, 32, 0, 0, PCILIB_REGISTER_R, PCILIB_REGISTER_STANDARD, PCILIB_REGISTER_BANK1, "status2", ""},
-{0x58, 0, 32, 0, 0, PCILIB_REGISTER_R, PCILIB_REGISTER_STANDARD, PCILIB_REGISTER_BANK1, "status3", ""},
-{0x5c, 0, 32, 0, 0, PCILIB_REGISTER_R, PCILIB_REGISTER_STANDARD, PCILIB_REGISTER_BANK1, "fr_status", ""},
-{0x70, 0, 32, 0, 0, PCILIB_REGISTER_R, PCILIB_REGISTER_STANDARD, PCILIB_REGISTER_BANK1, "start_address", ""},
-{0x74, 0, 32, 0, 0, PCILIB_REGISTER_R, PCILIB_REGISTER_STANDARD, PCILIB_REGISTER_BANK1, "end_address", ""},
-{0x78, 0, 32, 0, 0, PCILIB_REGISTER_R, PCILIB_REGISTER_STANDARD, PCILIB_REGISTER_BANK1, "rd_address", ""},
-{0xa0, 0, 32, 0, 0, PCILIB_REGISTER_R, PCILIB_REGISTER_STANDARD, PCILIB_REGISTER_BANK1, "fr_param1", ""},
-{0xa0, 0, 10, 0, PCILIB_REGISTER_ALL_BITS, PCILIB_REGISTER_RW, PCILIB_REGISTER_BITS, PCILIB_REGISTER_BANK1, "fr_skip_lines", ""},
-{0xa0, 10, 11, 0, PCILIB_REGISTER_ALL_BITS, PCILIB_REGISTER_RW, PCILIB_REGISTER_BITS, PCILIB_REGISTER_BANK1, "fr_num_lines", ""},
-{0xa0, 21, 11, 0, PCILIB_REGISTER_ALL_BITS, PCILIB_REGISTER_RW, PCILIB_REGISTER_BITS, PCILIB_REGISTER_BANK1, "fr_start_address", ""},
-{0xb0, 0, 32, 0, PCILIB_REGISTER_ALL_BITS, PCILIB_REGISTER_RW, PCILIB_REGISTER_STANDARD, PCILIB_REGISTER_BANK1, "fr_param2", ""},
-{0xb0, 0, 11, 0, PCILIB_REGISTER_ALL_BITS, PCILIB_REGISTER_RW, PCILIB_REGISTER_BITS, PCILIB_REGISTER_BANK1, "fr_threshold_start_line", ""},
-{0xb0, 16, 10, 0, PCILIB_REGISTER_ALL_BITS, PCILIB_REGISTER_RW, PCILIB_REGISTER_BITS, PCILIB_REGISTER_BANK1, "fr_area_lines", ""},
-{0xc0, 0, 32, 0, 0, PCILIB_REGISTER_R, PCILIB_REGISTER_STANDARD, PCILIB_REGISTER_BANK1, "skiped_lines", ""},
-{0xd0, 0, 32, 0, PCILIB_REGISTER_ALL_BITS, PCILIB_REGISTER_RW, PCILIB_REGISTER_STANDARD, PCILIB_REGISTER_BANK1, "fr_thresholds", ""},
-{0xd0, 0, 10, 0, PCILIB_REGISTER_ALL_BITS, PCILIB_REGISTER_RW, PCILIB_REGISTER_STANDARD, PCILIB_REGISTER_BANK1, "fr_pixel_thr", ""},
-{0xd0, 10, 11, 0, PCILIB_REGISTER_ALL_BITS, PCILIB_REGISTER_RW, PCILIB_REGISTER_STANDARD, PCILIB_REGISTER_BANK1, "fr_num_pixel_thr", ""},
-{0xd0, 21, 11, 0, PCILIB_REGISTER_ALL_BITS, PCILIB_REGISTER_RW, PCILIB_REGISTER_STANDARD, PCILIB_REGISTER_BANK1, "fr_num_lines_thr", ""},
-{0x100, 0, 32, 0, 0, PCILIB_REGISTER_RW, PCILIB_REGISTER_STANDARD, PCILIB_REGISTER_BANK1, "rawdata_pkt_addr", ""},
-{0x110, 0, 32, 0, 0, PCILIB_REGISTER_R, PCILIB_REGISTER_STANDARD, PCILIB_REGISTER_BANK1, "temperature_info", ""},
-{0x110, 0, 16, 0, 0, PCILIB_REGISTER_R, PCILIB_REGISTER_BITS, PCILIB_REGISTER_BANK1, "sensor_temperature", ""},
-{0x110, 16, 3, 0, 0, PCILIB_REGISTER_R, PCILIB_REGISTER_BITS, PCILIB_REGISTER_BANK1, "sensor_temperature_alarms", ""},
-{0x110, 19, 10, 0, 0, PCILIB_REGISTER_R, PCILIB_REGISTER_BITS, PCILIB_REGISTER_BANK1, "fpga_temperature", ""},
-{0x110, 29, 3, 0, 0, PCILIB_REGISTER_R, PCILIB_REGISTER_BITS, PCILIB_REGISTER_BANK1, "fpga_temperature_alarms", ""},
-{0x120, 0, 32, 0, 0, PCILIB_REGISTER_R, PCILIB_REGISTER_STANDARD, PCILIB_REGISTER_BANK1, "num_lines", ""},
-{0x130, 0, 32, 0, 0, PCILIB_REGISTER_R, PCILIB_REGISTER_STANDARD, PCILIB_REGISTER_BANK1, "start_line", ""},
-{0x140, 0, 32, 0, 0, PCILIB_REGISTER_R, PCILIB_REGISTER_STANDARD, PCILIB_REGISTER_BANK1, "exp_time", ""},
-{0x150, 0, 32, 0, 0, PCILIB_REGISTER_RW, PCILIB_REGISTER_STANDARD, PCILIB_REGISTER_BANK1, "motor", ""},
-{0x150, 0, 5, 0, PCILIB_REGISTER_ALL_BITS, PCILIB_REGISTER_RW, PCILIB_REGISTER_BITS, PCILIB_REGISTER_BANK1, "motor_phi", ""},
-{0x150, 5, 5, 0, PCILIB_REGISTER_ALL_BITS, PCILIB_REGISTER_RW, PCILIB_REGISTER_BITS, PCILIB_REGISTER_BANK1, "motor_z", ""},
-{0x150, 10, 5, 0, PCILIB_REGISTER_ALL_BITS, PCILIB_REGISTER_RW, PCILIB_REGISTER_BITS, PCILIB_REGISTER_BANK1, "motor_y", ""},
-{0x150, 15, 5, 0, PCILIB_REGISTER_ALL_BITS, PCILIB_REGISTER_RW, PCILIB_REGISTER_BITS, PCILIB_REGISTER_BANK1, "motor_x", ""},
-{0x150, 20, 8, 0, PCILIB_REGISTER_ALL_BITS, PCILIB_REGISTER_R, PCILIB_REGISTER_BITS, PCILIB_REGISTER_BANK1, "adc_gain", ""},
-{0x160, 0, 32, 0, 0, PCILIB_REGISTER_R, PCILIB_REGISTER_STANDARD, PCILIB_REGISTER_BANK1, "write_status", ""},
-{0x170, 0, 32, 0, 0, PCILIB_REGISTER_RW, PCILIB_REGISTER_STANDARD, PCILIB_REGISTER_BANK1, "num_triggers", ""},
-{0x180, 0, 32, 0x280, 0, PCILIB_REGISTER_RW, PCILIB_REGISTER_STANDARD, PCILIB_REGISTER_BANK1, "trigger_period", ""},
-{0x190, 0, 32, 0, 0, PCILIB_REGISTER_R, PCILIB_REGISTER_STANDARD, PCILIB_REGISTER_BANK1, "temperature_sample_period", ""},
-{0x1a0, 0, 32, 0x64, 0, PCILIB_REGISTER_RW, PCILIB_REGISTER_STANDARD, PCILIB_REGISTER_BANK1, "ddr_max_frames", ""},
-{0x1b0, 0, 32, 0, 0, PCILIB_REGISTER_R, PCILIB_REGISTER_STANDARD, PCILIB_REGISTER_BANK1, "ddr_num_frames", ""},
-{0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL}
-};
-
-pcilib_register_range_t ipecamera_register_ranges[] = {
-// {0xF000, 0xF000 + 128, PCILIB_REGISTER_BANK0, 0},
-// {0x9000, 0x9FFF, PCILIB_REGISTER_BANK1, -0x9000},
- {0, 0, 0, 0}
-};
-
-pcilib_event_description_t ipecamera_events[] = {
- {PCILIB_EVENT0, "new_frame", ""},
- {0, NULL, NULL}
-};
-
-pcilib_event_data_type_description_t ipecamera_data_types[] = {
- {IPECAMERA_IMAGE_DATA, PCILIB_EVENT0, "image", "16 bit pixel data" },
- {IPECAMERA_RAW_DATA, PCILIB_EVENT0, "raw", "raw data from camera" },
- {IPECAMERA_CHANGE_MASK, PCILIB_EVENT0, "cmask", "change mask" },
- {0, 0, NULL, NULL}
-};
-
-#else
-extern pcilib_register_description_t ipecamera_registers[];
-extern pcilib_register_bank_description_t ipecamera_register_banks[];
-extern pcilib_register_range_t ipecamera_register_ranges[];
-extern pcilib_event_description_t ipecamera_events[];
-extern pcilib_event_data_type_description_t ipecamera_data_types[];
-#endif
-
-#ifdef _IPECAMERA_IMAGE_C
-pcilib_event_api_description_t ipecamera_image_api = {
- "ipecamera",
-
- ipecamera_init,
- ipecamera_free,
-
- ipecamera_init_dma,
-
- ipecamera_reset,
- ipecamera_start,
- ipecamera_stop,
- ipecamera_trigger,
-
- ipecamera_stream,
- ipecamera_next_event,
- ipecamera_get,
- ipecamera_return
-};
-#else
-extern pcilib_event_api_description_t ipecamera_image_api;
-#endif
-
-int ipecamera_read(pcilib_t *ctx, pcilib_register_bank_description_t *bank, pcilib_register_addr_t addr, pcilib_register_value_t *value);
-int ipecamera_write(pcilib_t *ctx, pcilib_register_bank_description_t *bank, pcilib_register_addr_t addr, pcilib_register_value_t value);
-
-#endif /* _IPECAMERA_MODEL_H */
diff --git a/ipecamera/private.h b/ipecamera/private.h
deleted file mode 100644
index cf2d689..0000000
--- a/ipecamera/private.h
+++ /dev/null
@@ -1,151 +0,0 @@
-#ifndef _IPECAMERA_PRIVATE_H
-#define _IPECAMERA_PRIVATE_H
-
-#include "ipecamera.h"
-
-#define IPECAMERA_BUG_EXTRA_DATA
-#define IPECAMERA_BUG_MULTIFRAME_PACKETS //**< this is by design, start of packet comes directly after the end of last one in streaming mode */
-//#define IPECAMERA_BUG_INCOMPLETE_PACKETS
-#define IPECAMERA_BUG_POSTPONED_READ
-#define IPECAMERA_DEBUG_BROKEN_FRAMES "/mnt/frames"
-//#define IPECAMERA_DEBUG_RAW_PACKETS "/mnt/frames"
-
-//#define IPECAMERA_ANNOUNCE_READY //**< announce new event only after the reconstruction is done */
-
-#define IPECAMERA_DEFAULT_BUFFER_SIZE 64 //**< should be power of 2 */
-#define IPECAMERA_RESERVE_BUFFERS 2 //**< Return Frame is Lost error, if requested frame will be overwritten after specified number of frames
-#define IPECAMERA_SLEEP_TIME 250000 //**< Michele thinks 250 should be enough, but reset failing in this case */
-#define IPECAMERA_NEXT_FRAME_DELAY 1000 //**< Michele requires 30000 to sync between End Of Readout and next Frame Req */
-#define IPECAMERA_WAIT_FRAME_RCVD_TIME 0 //**< by Uros ,wait 6 ms */
-#define IPECAMERA_TRIGGER_WAIT_IDLE 200000 //**< In trigger call allow specified timeout for camera to get out of busy state. Set 0 to fail immideatly */
-#define IPECAMERA_READ_STATUS_DELAY 1000 //**< According to Uros, 1ms delay needed before consequitive reads from status registers */
-
-#define IPECAMERA_NOFRAME_SLEEP 100
-#define IPECAMERA_NOFRAME_PREPROC_SLEEP 100
-
-//#define IPECAMERA_MAX_LINES 1088
-#define IPECAMERA_MAX_LINES 2048
-#define IPECAMERA_EXPECTED_STATUS_4 0x08409FFFF
-#define IPECAMERA_EXPECTED_STATUS 0x08449FFFF
-
-#define IPECAMERA_END_OF_SEQUENCE 0x1F001001
-
-#define IPECAMERA_MAX_CHANNELS 16
-#define IPECAMERA_PIXELS_PER_CHANNEL 128
-#define IPECAMERA_WIDTH (IPECAMERA_MAX_CHANNELS * IPECAMERA_PIXELS_PER_CHANNEL)
-
-#define IPECAMERA_FRAME_REQUEST 0x80000209 // 0x1E9
-#define IPECAMERA_IDLE 0x80000201 // 0x1E1
-#define IPECAMERA_START_INTERNAL_STIMULI 0x1F1
-
-#define IPECAMERA_MODE_16_CHAN_IO 0
-#define IPECAMERA_MODE_4_CHAN_IO 2
-
-#define IPECAMERA_MODE_12_BIT_ADC 2
-#define IPECAMERA_MODE_11_BIT_ADC 1
-#define IPECAMERA_MODE_10_BIT_ADC 0
-
-typedef uint32_t ipecamera_payload_t;
-
-typedef struct {
- pcilib_event_id_t evid;
- struct timeval timestamp;
-} ipecamera_autostop_t;
-
-typedef struct {
- size_t i;
- pthread_t thread;
- ipecamera_t *ipecamera;
-
- int started; /**< flag indicating that join & cleanup is required */
-} ipecamera_preprocessor_t;
-
-
-typedef struct {
- ipecamera_event_info_t event; /**< this structure is overwritten by the reader thread, we need a copy */
- pthread_rwlock_t mutex; /**< this mutex protects reconstructed buffers only, the raw data, event_info, etc. will be overwritten by reader thread anyway */
-} ipecamera_frame_t;
-
-struct ipecamera_s {
- pcilib_context_t event;
- UfoDecoder *ipedec;
-
- char *data;
- ipecamera_pixel_t *image;
- size_t size;
-
- pcilib_event_callback_t cb;
- void *cb_user;
-
- volatile pcilib_event_id_t event_id;
- volatile pcilib_event_id_t preproc_id;
- pcilib_event_id_t reported_id;
-
- pcilib_dma_engine_t rdma, wdma;
-
- pcilib_register_t packet_len_reg;
- pcilib_register_t control_reg, status_reg;
- pcilib_register_t status2_reg, status3_reg;
- pcilib_register_t n_lines_reg;
- uint16_t line_reg;
- pcilib_register_t exposure_reg;
- pcilib_register_t flip_reg;
-
- pcilib_register_t firmware_version_reg;
- pcilib_register_t adc_resolution_reg;
- pcilib_register_t output_mode_reg;
-
- pcilib_register_t max_frames_reg;
- pcilib_register_t num_frames_reg;
-
- int started; /**< Camera is in grabbing mode (start function is called) */
- int streaming; /**< Camera is in streaming mode (we are within stream call) */
- int parse_data; /**< Indicates if some processing of the data is required, otherwise only rawdata_callback will be called */
-
- volatile int run_reader; /**< Instructs the reader thread to stop processing */
- volatile int run_streamer; /**< Indicates request to stop streaming events and can be set by reader_thread upon exit or by user request */
- volatile int run_preprocessors; /**< Instructs preprocessors to exit */
-
- ipecamera_autostop_t autostop;
-
- struct timeval autostop_time;
- struct timeval next_trigger; /**< The minimal delay between trigger signals is mandatory, this indicates time when next trigger is possible */
-
- size_t buffer_size; /**< How many images to store */
- size_t buffer_pos; /**< Current image offset in the buffer, due to synchronization reasons should not be used outside of reader_thread */
- size_t cur_size; /**< Already written part of data in bytes */
- size_t raw_size; /**< Size of raw data in bytes */
- size_t full_size; /**< Size of raw data including the padding */
- size_t padded_size; /**< Size of buffer for raw data, including the padding for performance */
- size_t cur_raw_size; /**< Size of raw data in bytes */
- size_t cur_full_size; /**< Size of raw data including the padding */
- size_t cur_padded_size; /**< Size of buffer for raw data, including the padding for performance */
-
- size_t image_size; /**< Size of a single image in bytes */
-
- size_t max_frames; /**< Maximal number of frames what may be buffered in camera DDR memory */
- int firmware; /**< Firmware version */
- int fr_mode; /**< Fast Reject mode */
- int cmosis_outputs; /**< Number of active cmosis outputs: 4 or 16 */
- int width, height;
-
-
-// void *raw_buffer;
- void *buffer;
- ipecamera_change_mask_t *cmask;
- ipecamera_frame_t *frame;
-
-
- ipecamera_image_dimensions_t dim;
-
- pthread_t rthread;
-
- size_t n_preproc;
- ipecamera_preprocessor_t *preproc;
- pthread_mutex_t preproc_mutex;
-
- int preproc_mutex_destroy;
- int frame_mutex_destroy;
-};
-
-#endif /* _IPECAMERA_PRIVATE_H */
diff --git a/ipecamera/public.h b/ipecamera/public.h
deleted file mode 100644
index 5f494c2..0000000
--- a/ipecamera/public.h
+++ /dev/null
@@ -1,25 +0,0 @@
-#ifndef _IPECAMERA_PUBLIC_H
-#define _IPECAMERA_PUBLIC_H
-
-#include <stdio.h>
-
-#include "ipecamera.h"
-#include "../pcilib.h"
-
-
-pcilib_context_t *ipecamera_init(pcilib_t *pcilib);
-void ipecamera_free(pcilib_context_t *ctx);
-
-pcilib_dma_context_t *ipecamera_init_dma(pcilib_context_t *ctx);
-
-int ipecamera_reset(pcilib_context_t *ctx);
-int ipecamera_start(pcilib_context_t *ctx, pcilib_event_t event_mask, pcilib_event_flags_t flags);
-int ipecamera_stop(pcilib_context_t *ctx, pcilib_event_flags_t flags);
-int ipecamera_trigger(pcilib_context_t *ctx, pcilib_event_t event, size_t trigger_size, void *trigger_data);
-int ipecamera_stream(pcilib_context_t *vctx, pcilib_event_callback_t callback, void *user);
-int ipecamera_next_event(pcilib_context_t *vctx, pcilib_timeout_t timeout, pcilib_event_id_t *evid, size_t info_size, pcilib_event_info_t *info);
-
-int ipecamera_get(pcilib_context_t *ctx, pcilib_event_id_t event_id, pcilib_event_data_type_t data_type, size_t arg_size, void *arg, size_t *size, void **buf);
-int ipecamera_return(pcilib_context_t *ctx, pcilib_event_id_t event_id, pcilib_event_data_type_t data_type, void *data);
-
-#endif /* _IPECAMERA_PUBLIC_H */
diff --git a/ipecamera/reader.c b/ipecamera/reader.c
deleted file mode 100644
index cad5da8..0000000
--- a/ipecamera/reader.c
+++ /dev/null
@@ -1,273 +0,0 @@
-#define _BSD_SOURCE
-#define _GNU_SOURCE
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <string.h>
-#include <sys/time.h>
-#include <sys/stat.h>
-#include <sys/types.h>
-#include <pthread.h>
-#include <assert.h>
-
-#include <ufodecode.h>
-
-#include "../tools.h"
-#include "../error.h"
-
-#include "pcilib.h"
-#include "model.h"
-#include "private.h"
-#include "reader.h"
-
-
-int ipecamera_compute_buffer_size(ipecamera_t *ctx, size_t lines) {
- const size_t header_size = 8 * sizeof(ipecamera_payload_t);
- const size_t footer_size = 8 * sizeof(ipecamera_payload_t);
-
- size_t line_size, raw_size, padded_blocks;
-
- switch (ctx->firmware) {
- case 4:
- line_size = IPECAMERA_MAX_CHANNELS * (2 + IPECAMERA_PIXELS_PER_CHANNEL / 3) * sizeof(ipecamera_payload_t);
- raw_size = header_size + lines * line_size + footer_size;
- break;
- default:
- line_size = (1 + IPECAMERA_PIXELS_PER_CHANNEL) * 32;
- raw_size = lines * line_size;
- raw_size *= 16 / ctx->cmosis_outputs;
- raw_size += header_size + footer_size;
- }
-
- padded_blocks = raw_size / IPECAMERA_DMA_PACKET_LENGTH + ((raw_size % IPECAMERA_DMA_PACKET_LENGTH)?1:0);
-
- ctx->cur_raw_size = raw_size;
- ctx->cur_full_size = padded_blocks * IPECAMERA_DMA_PACKET_LENGTH;
-
-#ifdef IPECAMERA_BUG_EXTRA_DATA
- ctx->cur_full_size += 8;
- padded_blocks ++;
-#endif /* IPECAMERA_BUG_EXTRA_DATA */
-
- ctx->cur_padded_size = padded_blocks * IPECAMERA_DMA_PACKET_LENGTH;
-// printf("%lu %lu %lu\n", ctx->cur_raw_size, ctx->cur_full_size, ctx->cur_padded_size);
-
- return 0;
-}
-
-static inline int ipecamera_new_frame(ipecamera_t *ctx) {
- ctx->frame[ctx->buffer_pos].event.raw_size = ctx->cur_size;
-
- if (ctx->cur_size < ctx->cur_raw_size) {
- ctx->frame[ctx->buffer_pos].event.info.flags |= PCILIB_EVENT_INFO_FLAG_BROKEN;
- }
-
- ctx->buffer_pos = (++ctx->event_id) % ctx->buffer_size;
- ctx->cur_size = 0;
-
- ctx->frame[ctx->buffer_pos].event.info.type = PCILIB_EVENT0;
- ctx->frame[ctx->buffer_pos].event.info.flags = 0;
- ctx->frame[ctx->buffer_pos].event.image_ready = 0;
-
- if ((ctx->event_id == ctx->autostop.evid)&&(ctx->event_id)) {
- ctx->run_reader = 0;
- return 1;
- }
-
- if (pcilib_check_deadline(&ctx->autostop.timestamp, PCILIB_DMA_TIMEOUT)) {
- ctx->run_reader = 0;
- return 1;
- }
-
- return 0;
-}
-
-static uint32_t frame_magic[5] = { 0x51111111, 0x52222222, 0x53333333, 0x54444444, 0x55555555 };
-
-static int ipecamera_data_callback(void *user, pcilib_dma_flags_t flags, size_t bufsize, void *buf) {
- int res;
- int eof = 0;
-
-#ifdef IPECAMERA_BUG_MULTIFRAME_PACKETS
- size_t real_size;
- size_t extra_data = 0;
-#endif /* IPECAMERA_BUG_MULTIFRAME_PACKETS */
-
- ipecamera_t *ctx = (ipecamera_t*)user;
-
-#if defined(IPECAMERA_BUG_INCOMPLETE_PACKETS)||defined(IPECAMERA_BUG_MULTIFRAME_PACKETS)
- static pcilib_event_id_t invalid_frame_id = (pcilib_event_id_t)-1;
-#endif
-
-#ifdef IPECAMERA_DEBUG_RAW_PACKETS
- char fname[128];
- {
- static unsigned long packet_id = 0;
- sprintf(fname,"%s/frame%4lu", IPECAMERA_DEBUG_RAW_PACKETS, ctx->event_id);
- mkdir(fname, 0755);
- sprintf(fname,"%s/frame%4lu/frame%9lu", IPECAMERA_DEBUG_RAW_PACKETS, ctx->event_id, packet_id);
- FILE *f = fopen(fname, "w");
- if (f) {
- fwrite(buf, 1, bufsize, f);
- fclose(f);
- }
- sprintf(fname,"%s/frame%4lu/frame%9lu.invalid", IPECAMERA_DEBUG_RAW_PACKETS, ctx->event_id, packet_id++);
- }
-#endif /* IPECAMERA_DEBUG_RAW_PACKETS */
-
- if (!ctx->cur_size) {
-#if defined(IPECAMERA_BUG_INCOMPLETE_PACKETS)||defined(IPECAMERA_BUG_MULTIFRAME_PACKETS)
- size_t startpos;
- for (startpos = 0; (startpos + sizeof(frame_magic)) < bufsize; startpos += sizeof(uint32_t)) {
- if (!memcmp(buf + startpos, frame_magic, sizeof(frame_magic))) break;
- }
-
- if ((startpos + sizeof(frame_magic)) >= bufsize) {
-#ifdef IPECAMERA_DEBUG_RAW_PACKETS
- FILE *f = fopen(fname, "w");
- if (f) fclose(f);
-#endif /* IPECAMERA_DEBUG_RAW_PACKETS */
-
- if (invalid_frame_id != ctx->event_id) {
-// pcilib_warning("No frame magic in DMA packet of %u bytes, current event %lu (got %lu)", bufsize, ctx->event_id, invalid_frame_id);
- invalid_frame_id = ctx->event_id;
- }
-
- return PCILIB_STREAMING_CONTINUE;
- }
-
- if (startpos) {
- // pass padding to rawdata callback
- if (ctx->event.params.rawdata.callback) {
- res = ctx->event.params.rawdata.callback(0, NULL, PCILIB_EVENT_FLAG_RAW_DATA_ONLY, startpos, buf, ctx->event.params.rawdata.user);
- if (res <= 0) {
- if (res < 0) return res;
- ctx->run_reader = 0;
- }
- }
-
-
- buf += startpos;
- bufsize -= startpos;
- }
-#endif /* IPECAMERA_BUG_INCOMPLETE_PACKETS */
-
- if ((bufsize >= 8)&&(!memcmp(buf, frame_magic, sizeof(frame_magic)))) {
- size_t n_lines = ((uint32_t*)buf)[5] & 0x7FF;
- ipecamera_compute_buffer_size(ctx, n_lines);
-
- ctx->frame[ctx->buffer_pos].event.info.seqnum = ((uint32_t*)buf)[6] & 0x1FFFFFF;
- ctx->frame[ctx->buffer_pos].event.info.offset = (((uint32_t*)buf)[7] & 0xFFFFFF) * 80;
-
-// ctx->frame[ctx->buffer_pos].event.info.seqnum = ctx->event_id + 1;
-
- gettimeofday(&ctx->frame[ctx->buffer_pos].event.info.timestamp, NULL);
- } else {
-// pcilib_warning("Frame magic is not found, ignoring broken data...");
- return PCILIB_STREAMING_CONTINUE;
- }
- }
-
-#ifdef IPECAMERA_BUG_MULTIFRAME_PACKETS
- // for rawdata_callback with complete padding
- real_size = bufsize;
-
- if (ctx->cur_size + bufsize > ctx->cur_raw_size) {
- size_t need;
-
- for (need = ctx->cur_raw_size - ctx->cur_size; (need + sizeof(frame_magic)) < bufsize; need += sizeof(uint32_t)) {
- if (!memcmp(buf + need, frame_magic, sizeof(frame_magic))) break;
- }
-
- if ((need + sizeof(frame_magic)) < bufsize) {
- extra_data = bufsize - need;
- //bufsize = need;
- eof = 1;
- }
-
-// printf("%lu %lu %lu - %u\n", ctx->event_id, ctx->cur_size, ctx->cur_raw_size, eof);
-
- // just rip of padding
- bufsize = ctx->cur_raw_size - ctx->cur_size;
-
-#ifdef IPECAMERA_DEBUG_RAW_PACKETS
- sprintf(fname + strlen(fname) - 8, ".partial");
- FILE *f = fopen(fname, "w");
- if (f) {
- fwrite(buf, 1, bufsize, f);
- fclose(f);
- }
-#endif /* IPECAMERA_DEBUG_RAW_PACKETS */
- }
-#endif /* IPECAMERA_BUG_MULTIFRAME_PACKETS */
-
- if (ctx->parse_data) {
- if (ctx->cur_size + bufsize > ctx->full_size) {
- pcilib_error("Unexpected event data, we are expecting at maximum (%zu) bytes, but (%zu) already read", ctx->full_size, ctx->cur_size + bufsize);
- return -PCILIB_ERROR_TOOBIG;
- }
-
- memcpy(ctx->buffer + ctx->buffer_pos * ctx->padded_size + ctx->cur_size, buf, bufsize);
- }
-
- ctx->cur_size += bufsize;
-// printf("%i: %i %i\n", ctx->buffer_pos, ctx->cur_size, bufsize);
-
- if (ctx->cur_size >= ctx->full_size) {
- eof = 1;
- }
-
- if (ctx->event.params.rawdata.callback) {
- res = ctx->event.params.rawdata.callback(ctx->event_id, (pcilib_event_info_t*)(ctx->frame + ctx->buffer_pos), (eof?PCILIB_EVENT_FLAG_EOF:PCILIB_EVENT_FLAGS_DEFAULT), bufsize, buf, ctx->event.params.rawdata.user);
- if (res <= 0) {
- if (res < 0) return res;
- ctx->run_reader = 0;
- }
- }
-
- if (eof) {
- if ((ipecamera_new_frame(ctx))||(!ctx->run_reader)) {
- return PCILIB_STREAMING_STOP;
- }
-
-#ifdef IPECAMERA_BUG_MULTIFRAME_PACKETS
- if (extra_data) {
- return ipecamera_data_callback(user, flags, extra_data, buf + (real_size - extra_data));
- }
-#endif /* IPECAMERA_BUG_MULTIFRAME_PACKETS */
- }
-
- return PCILIB_STREAMING_REQ_FRAGMENT;
-}
-
-void *ipecamera_reader_thread(void *user) {
- int err;
- ipecamera_t *ctx = (ipecamera_t*)user;
-
- while (ctx->run_reader) {
- err = pcilib_stream_dma(ctx->event.pcilib, ctx->rdma, 0, 0, PCILIB_DMA_FLAG_MULTIPACKET, 10 * PCILIB_DMA_TIMEOUT, &ipecamera_data_callback, user);
- if (err) {
- if (err == PCILIB_ERROR_TIMEOUT) {
- if (ctx->cur_size >= ctx->cur_raw_size) ipecamera_new_frame(ctx);
-#ifdef IPECAMERA_BUG_INCOMPLETE_PACKETS
- else if (ctx->cur_size > 0) ipecamera_new_frame(ctx);
-#endif /* IPECAMERA_BUG_INCOMPLETE_PACKETS */
- if (pcilib_check_deadline(&ctx->autostop.timestamp, 10 * PCILIB_DMA_TIMEOUT)) {
- ctx->run_reader = 0;
- break;
- }
- usleep(IPECAMERA_NOFRAME_SLEEP);
- } else pcilib_error("DMA error while reading IPECamera frames, error: %i", err);
- } //else printf("no error\n");
-
- //usleep(1000);
- }
-
- ctx->run_streamer = 0;
-
-// if (ctx->cur_size)
-// pcilib_error("partialy read frame after stop signal, %zu bytes in the buffer", ctx->cur_size);
-
- return NULL;
-}
diff --git a/ipecamera/reader.h b/ipecamera/reader.h
deleted file mode 100644
index 5d631c0..0000000
--- a/ipecamera/reader.h
+++ /dev/null
@@ -1,8 +0,0 @@
-#ifndef _IPECAMERA_READER_H
-#define _IPECAMERA_READER_H
-
-int ipecamera_compute_buffer_size(ipecamera_t *ctx, size_t lines);
-
-void *ipecamera_reader_thread(void *user);
-
-#endif /* _IPECAMERA_READER_H */