diff options
Diffstat (limited to 'ipecamera')
| -rw-r--r-- | ipecamera/image.c | 40 | ||||
| -rw-r--r-- | ipecamera/image.h | 2 | ||||
| -rw-r--r-- | ipecamera/model.h | 1 | 
3 files changed, 42 insertions, 1 deletions
| diff --git a/ipecamera/image.c b/ipecamera/image.c index 8ad6953..3e320cd 100644 --- a/ipecamera/image.c +++ b/ipecamera/image.c @@ -37,6 +37,7 @@ struct ipecamera_s {      void *cb_user;      pcilib_event_id_t event_id; +    pcilib_event_id_t reported_id;      pcilib_register_t control_reg, status_reg;      pcilib_register_t start_reg, end_reg; @@ -253,6 +254,7 @@ int ipecamera_start(void *vctx, pcilib_event_t event_mask, pcilib_callback_t cb,      ctx->cb_user = user;      ctx->event_id = 0; +    ctx->reported_id = 0;      ctx->buf_ptr = 0;          ctx->dim.width = 1270; @@ -303,6 +305,7 @@ int ipecamera_stop(void *vctx) {      ctx->event_id = 0; +    ctx->reported_id = 0;      ctx->buf_ptr = 0;       return 0; @@ -504,7 +507,12 @@ int ipecamera_trigger(void *vctx, pcilib_event_t event, size_t trigger_size, voi      }      err = ipecamera_get_image(ctx); -    if (!err) err = ctx->cb(event, ctx->event_id, ctx->cb_user); +    if (!err) { +	if (ctx->cb) { +	    err = ctx->cb(event, ctx->event_id, ctx->cb_user); +	    ctx->reported_id = ctx->event_id; +	} +    }      return err;  } @@ -524,6 +532,36 @@ static int ipecamera_resolve_event_id(ipecamera_t *ctx, pcilib_event_id_t evid)      return buf_ptr;  } +pcilib_event_id_t ipecamera_next_event(void *vctx, pcilib_event_t event_mask) { +    int buf_ptr; +    pcilib_event_id_t reported; +    ipecamera_t *ctx = (ipecamera_t*)vctx; + +    if (!ctx) { +	pcilib_error("IPECamera imaging is not initialized"); +	return PCILIB_EVENT_ID_INVALID; +    } + +    if (!ctx->started) { +	pcilib_error("IPECamera is not in grabbing state"); +	return PCILIB_EVENT_ID_INVALID; +    } + +    if ((!ctx->event_id)||(ctx->reported_id == ctx->event_id)) return PCILIB_EVENT_ID_INVALID; + +	// We had an overflow in event counting +    if (ctx->reported_id > ctx->event_id) { +	do { +	    if (++ctx->reported_id == 0) ctx->reported_id = 1; +	} while (ipecamera_resolve_event_id(ctx, ctx->reported_id) < 0); +    } else { +	if ((ctx->event_id - ctx->reported_id) > ctx->buffer_size) ctx->reported_id = ctx->event_id - (ctx->buffer_size - 1); +	else ++ctx->reported_id; +    } +     +    return ctx->reported_id; +} +  void* ipecamera_get(void *vctx, pcilib_event_id_t event_id, pcilib_event_data_type_t data_type, size_t arg_size, void *arg, size_t *size) {      int buf_ptr;      ipecamera_t *ctx = (ipecamera_t*)vctx; diff --git a/ipecamera/image.h b/ipecamera/image.h index 6b92524..513449f 100644 --- a/ipecamera/image.h +++ b/ipecamera/image.h @@ -13,9 +13,11 @@ int ipecamera_reset(void *ctx);  int ipecamera_start(void *ctx, pcilib_event_t event_mask, pcilib_callback_t cb, void *user);  int ipecamera_stop(void *ctx);  int ipecamera_trigger(void *ctx, pcilib_event_t event, size_t trigger_size, void *trigger_data); +pcilib_event_id_t ipecamera_next_event(void *ctx, pcilib_event_t event_mask);  void* ipecamera_get(void *ctx, pcilib_event_id_t event_id, pcilib_event_data_type_t data_type, size_t arg_size, void *arg, size_t *size);  int ipecamera_return(void *ctx, pcilib_event_id_t event_id); +  #endif /* _IPECAMERA_IMAGE_H */ diff --git a/ipecamera/model.h b/ipecamera/model.h index 07f405a..c3d82e3 100644 --- a/ipecamera/model.h +++ b/ipecamera/model.h @@ -105,6 +105,7 @@ pcilib_event_api_description_t ipecamera_image_api = {      ipecamera_stop,      ipecamera_trigger, +    ipecamera_next_event,      ipecamera_get,      ipecamera_return  }; | 
