/* * Private functions */ dc1394error_t get_sff_address_from_csr_guid (dc1394camera_t* camera, const dc1394basler_sff_guid_t* feature_guid, uint64_t* address) { dc1394error_t err; uint32_t data; if (camera == NULL || feature_guid == NULL || address == NULL) return DC1394_FAILURE; /* write GUID like this to BASLER_ADDRESS_SFF_INQUIRY_REGISTER: * 0x10 <- D1 * 0x14 <- D3 | D2 * 0x18 <- D4[3] | D4[2] | D4[1] | D4[0] * 0x1C <- D4[7] | D4[6] | D4[5] | D4[4] */ data = feature_guid->d1; err = dc1394_set_adv_control_register (camera, BASLER_ADDRESS_SFF_INQUIRY, data); DC1394_ERR_RTN(err, "Could not write D1 to SFF inquiry register"); data = ((uint32_t)feature_guid->d3) << 16 | feature_guid->d2; err = dc1394_set_adv_control_register (camera, BASLER_ADDRESS_SFF_INQUIRY + 0x4U, data); DC1394_ERR_RTN(err, "Could not write D3 | D2 to SFF inquiry register"); data = ((uint32_t)feature_guid->d4[3] << 24) | ((uint32_t)feature_guid->d4[2] << 16) | ((uint32_t)feature_guid->d4[1] << 8) | feature_guid->d4[0]; err = dc1394_set_adv_control_register (camera, BASLER_ADDRESS_SFF_INQUIRY + 0x8U, data); DC1394_ERR_RTN(err, "Could not write D4[3..0] to SFF inquiry register"); data = ((uint32_t)feature_guid->d4[7] << 24) | ((uint32_t)feature_guid->d4[6] << 16) | ((uint32_t)feature_guid->d4[5] << 8) | feature_guid->d4[4]; err = dc1394_set_adv_control_register (camera, BASLER_ADDRESS_SFF_INQUIRY + 0xCU, data); DC1394_ERR_RTN(err, "Could not write D4[7..4] to SFF inquiry register"); /* read address */ err = dc1394_get_adv_control_register (camera, BASLER_ADDRESS_SFF_ADDRESS, &data); DC1394_ERR_RTN(err, "Could not read first quadlet of address from SFF address register"); *address = data; err = dc1394_get_adv_control_register (camera, BASLER_ADDRESS_SFF_ADDRESS + 0x4U, &data); DC1394_ERR_RTN(err, "Could not read second quadlet of address from SFF address register"); *address |= ((uint64_t)data) << 32; *address -= CONFIG_ROM_BASE; return DC1394_SUCCESS; }
void FWCamera::enablePtGreyBayer() { #ifdef AVG_ENABLE_1394_2 dc1394error_t err; uint32_t imageDataFormat; err = dc1394_get_adv_control_register(m_pCamera, 0x48, &imageDataFormat); AVG_ASSERT(err == DC1394_SUCCESS); if (imageDataFormat & 0x80000000) { err = dc1394_set_adv_control_register(m_pCamera, 0x48, 0x80000081); AVG_ASSERT(err == DC1394_SUCCESS); uint32_t bayerFormat; err = dc1394_get_adv_control_register(m_pCamera, 0x40, &bayerFormat); AVG_ASSERT(err == DC1394_SUCCESS); PixelFormat exactPF = fwBayerStringToPF(bayerFormat); if (exactPF == I8) { throw(Exception(AVG_ERR_CAMERA_NONFATAL, "Greyscale camera doesn't support bayer pattern.")); } setCamPF(exactPF); } #endif }
/* * Tests whether the camera supports Basler SFF */ dc1394error_t dc1394_basler_sff_is_available (dc1394camera_t* camera, dc1394bool_t *available) { uint32_t data; dc1394error_t err; const uint32_t basler_feature_id_1 = 0x0030533b; const uint32_t basler_feature_id_2 = 0x73c3f000; if (camera == NULL || available == NULL) { err = DC1394_INVALID_ARGUMENT_VALUE; DC1394_ERR_RTN(err, "camera or available is NULL"); } *available = DC1394_FALSE; err = dc1394_set_adv_control_register (camera, 0x0U, basler_feature_id_1); DC1394_ERR_RTN(err, "Could not write the first quadlet of Basler feature ID"); err = dc1394_set_adv_control_register (camera, 0x4U, basler_feature_id_2); DC1394_ERR_RTN(err, "Could not write the second quadlet of Basler feature ID"); err = dc1394_get_adv_control_register (camera, 0x0U, &data); DC1394_ERR_RTN(err, "Could not read from the ACR"); if (data != 0xffffffff) { *available = DC1394_TRUE; return DC1394_SUCCESS; } err = dc1394_get_adv_control_register (camera, 0x4U, &data); DC1394_ERR_RTN(err, "Could not read from ACR + 4"); if (data != 0xffffffff) { *available = DC1394_TRUE; return DC1394_SUCCESS; } /* SFF is not supported */ return DC1394_SUCCESS; }
/** Set the area of interest (AOI) for the auto functions. * @param left offset form the left image border * @param top offset form the top image border * @param width width of the AOI * @param height height of the AOI * @param show_work_area highlight the work area in the image * @return true on success, false otherwise */ bool PikeCamera::set_autofunction_aoi(unsigned int left, unsigned int top, unsigned int width, unsigned int height, bool show_work_area) { if (!_opened) { return false; } if (!set_autofnc_aoi_) { return true; } avt_autofnc_aoi_t aoi; avt_af_area_position_t position; avt_af_area_size_t size; aoi.show_work_area = show_work_area; aoi.on_off = true; position.left = left; position.top = top; size.width = width; size.height = height; dc1394error_t err; uint32_t value = 0; memcpy((void *)&value, (void *)&aoi, sizeof(value)); err = dc1394_set_adv_control_register(_camera, AVT_AUTOFNC_AOI_REGISTER, value); if (err != DC1394_SUCCESS) { throw Exception( "Pike::set_autofunction_aoi; dc1394_set_register(AVT_AUTOFNC_AOI_REGISTER) failed\n"); } memcpy((void *)&value, (void *)&position, sizeof(value)); err = dc1394_set_adv_control_register(_camera, AVT_AF_AREA_POSITION_REGISTER, value); if (err != DC1394_SUCCESS) { throw Exception( "Pike::set_autofunction_aoi; dc1394_set_register(AVT_AF_AREA_POSITION_REGISTER) failed\n"); } memcpy((void *)&value, (void *)&size, sizeof(value)); err = dc1394_set_adv_control_register(_camera, AVT_AF_AREA_SIZE_REGISTER, value); if (err != DC1394_SUCCESS) { throw Exception( "Pike::set_autofunction_aoi; dc1394_set_register(AVT_AF_AREA_SIZE_REGISTER) failed\n"); } err = dc1394_get_adv_control_register(_camera, AVT_AUTOFNC_AOI_REGISTER, &value); if (err != DC1394_SUCCESS) { throw Exception( "Pike::set_autofunction_aoi; dc1394_get_register(AVT_AUTOFNC_AOI_REGISTER) failed\n"); } memcpy((void *)&aoi, (void *)&value, sizeof(value)); return aoi.on_off; }