/alps/ipecamera

To get this branch, use:
bzr branch http://suren.me/webbzr/alps/ipecamera

« back to all changes in this revision

Viewing changes to reader.c

  • Committer: Suren A. Chilingaryan
  • Date: 2015-08-14 01:53:15 UTC
  • Revision ID: csa@suren.me-20150814015315-5ud1s13mrou18zl0
Add another workaround to handle cameras stuck in busy (disabled and untested)

Show diffs side-by-side

added added

removed removed

Lines of Context:
21
21
#include "private.h"
22
22
#include "reader.h"
23
23
 
 
24
 
 
25
#define GET_REG(reg, var) \
 
26
    if (!err) { \
 
27
        err = pcilib_read_register_by_id(pcilib, ctx->reg, &var); \
 
28
        if (err) { \
 
29
            pcilib_error("Error reading %s register", model_info->registers[ctx->reg].name); \
 
30
        } \
 
31
    }
 
32
 
 
33
#define SET_REG(reg, val) \
 
34
    if (!err) { \
 
35
        err = pcilib_write_register_by_id(pcilib, ctx->reg, val); \
 
36
        if (err) { \
 
37
            pcilib_error("Error writting %s register", model_info->registers[ctx->reg].name); \
 
38
        } \
 
39
    }
 
40
 
24
41
//#define CHECK_FRAME_MAGIC(buf) \
25
42
//      memcmp(buf, ((void*)frame_magic) + 1, sizeof(frame_magic) - 1)
26
43
 
304
321
void *ipecamera_reader_thread(void *user) {
305
322
    int err;
306
323
    ipecamera_t *ctx = (ipecamera_t*)user;
307
 
    
 
324
#ifdef IPECAMERA_BUG_STUCKED_BUSY
 
325
    pcilib_register_value_t saved, value;
 
326
    pcilib_t *pcilib = ctx->event.pcilib;
 
327
    const pcilib_model_description_t *model_info = pcilib_get_model_description(pcilib);
 
328
#endif /* IPECAMERA_BUG_STUCKED_BUSY */
 
329
 
308
330
    while (ctx->run_reader) {
309
331
        err = pcilib_stream_dma(ctx->event.pcilib, ctx->rdma, 0, 0, PCILIB_DMA_FLAG_MULTIPACKET, IPECAMERA_DMA_TIMEOUT, &ipecamera_data_callback, user);
310
332
        if (err) {
317
339
                    ctx->run_reader = 0;
318
340
                    break;
319
341
                }
 
342
#ifdef IPECAMERA_BUG_STUCKED_BUSY
 
343
                GET_REG(status2_reg, value);
 
344
                if (value&0x2FFFFFFF) {
 
345
                    pcilib_warning("Camera stuck in busy, trying to recover...");
 
346
                    GET_REG(control_reg, saved);
 
347
                    SET_REG(control_reg, IPECAMERA_IDLE);
 
348
                    while ((value&0x2FFFFFFF)&&(ctx->run_reader)) {
 
349
                        usleep(IPECAMERA_NOFRAME_SLEEP);
 
350
                    }
 
351
                    return 0;
 
352
                }
 
353
#endif /* IPECAMERA_BUG_STUCKED_BUSY */
320
354
                usleep(IPECAMERA_NOFRAME_SLEEP);
321
355
            } else pcilib_error("DMA error while reading IPECamera frames, error: %i", err);
322
356
        }