Exemple #1
0
int Camera::init(const char* file) {
  int isSlave =0;
  if ((fg = Fg_InitEx("FullAreaGray8", m_boardNr, isSlave)) == NULL) {
    fprintf(stderr, "error in Fg_InitEx: %s\n", Fg_getLastErrorDescription(NULL));
    exit(EXIT_FAILURE);
  }
  m_file = file;
  if(Fg_loadConfig(fg,file)!=FG_OK){
    printf("\nFile config loading failed\n");
    exit(EXIT_FAILURE);
  }
  ComNr=m_boardNr*2;
  serialInit(ComNr);
  
  if(Fg_setParameter(fg,FG_TRIGGERMODE,&TriggerMode,camPort)==FG_OK){
    printf("\nTrig config succeed\n");
  }
  size_t totalBufferSize = m_width * m_height * samplePerPixel * bytePerSample * nbBuffers;
  memHandle = Fg_AllocMemEx(fg, totalBufferSize, nbBuffers);
  if (memHandle == NULL) {
    fprintf(stderr, "error in Fg_AllocMemEx: %s\n", Fg_getLastErrorDescription(fg));
    Fg_FreeGrabber(fg);
    exit(EXIT_FAILURE);
  }
  try{
//     if(setExposure(m_exposure)!=FG_OK){throw 0;}
//     setWidth(m_width);
//     setHeight(m_height);
//     setYoffset(m_yoffset);
//     setXoffset(m_xoffset);
    int bitAlignment = FG_LEFT_ALIGNED;
    CHECK(FG_BITALIGNMENT, "FG_BITALIGNMENT", &bitAlignment);
    CHECK(FG_FRAMESPERSEC, "FG_FRAMESPERSEC",  &m_framespersec);
    CHECK(FG_TIMEOUT, "FG_TIMEOUT", &timeout);
//     startAcquire();
    cout << "test" << endl;
  }catch(string const& error){
    cout << "ERROR: " << error <<endl;
    close();
    init(file);
  }catch(int e){
    close();
    init(file);
  }
  return FG_OK;
}
static void
uca_pco_camera_start_recording (UcaCamera *camera, GError **error)
{
    g_return_if_fail(UCA_IS_PCO_CAMERA(camera));
    guint err = PCO_NOERROR;

    UcaPcoCameraPrivate *priv = UCA_PCO_CAMERA_GET_PRIVATE(camera);
    guint16 binned_width, binned_height;
    gboolean use_extended = FALSE;
    gboolean transfer_async = FALSE;

    g_object_get (camera, "sensor-extended", &use_extended, NULL);

    if (use_extended) {
        binned_width = priv->width_ex;
        binned_height = priv->height_ex;
    }
    else {
        binned_width = priv->width;
        binned_height = priv->height;
    }

    binned_width /= priv->binning_h;
    binned_height /= priv->binning_v;

    if ((priv->roi_x + priv->roi_width > binned_width) || (priv->roi_y + priv->roi_height > binned_height)) {
        g_set_error(error, UCA_PCO_CAMERA_ERROR, UCA_PCO_CAMERA_ERROR_UNSUPPORTED,
                "ROI of size %ix%i @ (%i, %i) is outside of (binned) sensor size %ix%i\n",
                priv->roi_width, priv->roi_height, priv->roi_x, priv->roi_y, binned_width, binned_height);
        return;
    }

    /*
     * All parameters are valid. Now, set them on the camera.
     */
    guint16 roi[4] = { priv->roi_x + 1, priv->roi_y + 1, priv->roi_x + priv->roi_width, priv->roi_y + priv->roi_height };

    if (pco_set_roi(priv->pco, roi) != PCO_NOERROR) {
        g_set_error(error, UCA_PCO_CAMERA_ERROR, UCA_PCO_CAMERA_ERROR_LIBPCO_GENERAL,
                "Could not set ROI via pco_set_roi()");
        return;
    }

    g_object_get(G_OBJECT(camera), "transfer-asynchronously", &transfer_async, NULL);

    /*
     * FIXME: We cannot set the binning here as this breaks communication with
     * the camera. Setting the binning works _before_ initializing the frame
     * grabber though. However, it is rather inconvenient to initialize and
     * de-initialize the frame grabber for each recording sequence.
     */

    /* if (pco_set_binning(priv->pco, priv->binning_h, priv->binning_v) != PCO_NOERROR) */
    /*     g_warning("Cannot set binning\n"); */

    if (priv->frame_width != priv->roi_width || priv->frame_height != priv->roi_height || priv->fg_mem == NULL) {
        guint fg_width = priv->description->type == CAMERATYPE_PCO_EDGE ? 2 * priv->roi_width : priv->roi_width;

        priv->frame_width = priv->roi_width;
        priv->frame_height = priv->roi_height;
        priv->num_bytes = 2;

        Fg_setParameter(priv->fg, FG_WIDTH, &fg_width, priv->fg_port);
        Fg_setParameter(priv->fg, FG_HEIGHT, &priv->frame_height, priv->fg_port);

        if (priv->fg_mem)
            Fg_FreeMemEx(priv->fg, priv->fg_mem);

        const guint num_buffers = 2;
        priv->fg_mem = Fg_AllocMemEx(priv->fg,
                num_buffers * priv->frame_width * priv->frame_height * sizeof(uint16_t), num_buffers);

        if (priv->fg_mem == NULL) {
            g_set_error(error, UCA_PCO_CAMERA_ERROR, UCA_PCO_CAMERA_ERROR_FG_INIT,
                    "%s", Fg_getLastErrorDescription(priv->fg));
            g_object_unref(camera);
            return;
        }
    }

    if (transfer_async)
        setup_fg_callback(camera);

    if (is_type (priv, CAMERATYPE_PCO_DIMAX_STD) || is_type (priv, CAMERATYPE_PCO4000))
        pco_clear_active_segment(priv->pco);

    /*
     * Set the storage mode to FIFO buffer otherwise pco.4000 skips
     * frames that it is not able to send in time.
     */
    if (is_type (priv, CAMERATYPE_PCO4000))
        pco_set_storage_mode (priv->pco, STORAGE_MODE_FIFO_BUFFER);

    priv->last_frame = 0;

    err = pco_arm_camera(priv->pco);
    HANDLE_PCO_ERROR(err);

    err = pco_start_recording(priv->pco);
    HANDLE_PCO_ERROR(err);

    err = Fg_AcquireEx(priv->fg, priv->fg_port, GRAB_INFINITE, ACQ_STANDARD, priv->fg_mem);
    FG_SET_ERROR(err, priv->fg, UCA_PCO_CAMERA_ERROR_FG_ACQUISITION);
}
// 初始化采集卡与摄像机
// 设置参数初始化
// 返回Status;
int MicroDisplayInit::InitParameter(MicroDisplayInit& mdi)
{
#ifdef OUTPUT_DEBUG_INFO
	if (OUTPUT_DEBUG_INFO)
	{
		getBoardInfo();
	}
#endif


	int status = 0;
	char debugInfo[256];


	// Initialization of the microEnable frame grabber
	if (mdi.colorType == GRAY)
	{
		if ((mdi.fg = Fg_Init(mdi.dllNameGRAY, mdi.nBoard)) == NULL) {
			return status;
		}
		//设置传输模式,设置后才为4k
		int _FG_CAMERA_LINK_CAMTYP = FG_CL_DUALTAP_8_BIT;
		if (Fg_setParameter(mdi.fg, FG_CAMERA_LINK_CAMTYP, &_FG_CAMERA_LINK_CAMTYP, mdi.nCamPort) < 0) {
			return status;
		}
	}
	else
	{
		if ((mdi.fg = Fg_Init(mdi.dllNameRGB, mdi.nBoard)) == NULL) {
			return status;
		}
		//TODO:添加传输模式的调整
		//int _FG_CAMERA_LINK_CAMTYP = FG_CL_DUALTAP_8_BIT;
		//if (Fg_setParameter(mdi.fg, FG_CAMERA_LINK_CAMTYP, &_FG_CAMERA_LINK_CAMTYP, mdi.nCamPort) < 0) {
		//	return status;
		//}
	}
	OutPutDebugInfo("Init Grabber ok");

	//设置参数
	int _FG_CAMERA_LINK_CAMTYP = FG_CL_DUALTAP_8_BIT;
	if (Fg_setParameter(mdi.fg, FG_CAMERA_LINK_CAMTYP, &_FG_CAMERA_LINK_CAMTYP, mdi.nCamPort) < 0) {
		return status;
	}
	if (Fg_setParameter(mdi.fg, FG_WIDTH, &mdi.width, mdi.nCamPort) < 0) {
		return status;
	}
	if (Fg_setParameter(mdi.fg, FG_HEIGHT, &mdi.height, mdi.nCamPort) < 0) {
		return status;
	}
	int bitAlignment = FG_LEFT_ALIGNED;
	if (Fg_setParameter(mdi.fg, FG_BITALIGNMENT, &bitAlignment, mdi.nCamPort) < 0) {
		return status;
	}
	sprintf(debugInfo, "Set Image Size on port %d (w: %d,h: %d) ok", mdi.nCamPort, mdi.width, mdi.height);
	OutPutDebugInfo(debugInfo);


	// Memory allocation
	int format = 0;
	Fg_getParameter(mdi.fg, FG_FORMAT, &format, mdi.nCamPort);
	size_t bytesPerPixel = 1;
	switch (format){
	case FG_GRAY:	bytesPerPixel = 1; break;
	case FG_GRAY16:	bytesPerPixel = 2; break;
	case FG_COL24:	bytesPerPixel = 3; break;
	case FG_COL32:	bytesPerPixel = 4; break;
	case FG_COL30:	bytesPerPixel = 5; break;
	case FG_COL48:	bytesPerPixel = 6; break;
	}
	size_t totalBufSize = mdi.width*mdi.height*mdi.nr_of_buffer*bytesPerPixel;
	if ((mdi.pMem0 = Fg_AllocMemEx(mdi.fg, totalBufSize, mdi.nr_of_buffer)) == NULL){
		return status;
	}
	else {
		sprintf(debugInfo, "%d framebuffer allocated for port %d ok", mdi.nr_of_buffer, mdi.nCamPort);
		OutPutDebugInfo(debugInfo);
	}
	return status;
}