⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dc1394_vendor_pixelink.c

📁 This library provides functionality to control any camera that conforms to the 1394-Based Digital C
💻 C
📖 第 1 页 / 共 2 页
字号:
/* * 1394-Based Digital Camera Control Library * Pixelink (PxL) specific extensions for Multi-camera control. * Copyright (C) 2006 Aravind Sundaresan, James Sherman * * Written by Aravind Sundaresan <a.sundaresan@gmail.com> *            James Sherman <shermanj@umd.edu> * Version : 10/05/2006 * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */#include "dc1394_vendor_pixelink.h"/****************************************************************************** * Function to convert float to quadlet (32 bit floating point representation) */dc1394error_t dc1394_pxl_convert_float32_to_quadlet(double d, quadlet_t *i) {  dc1394error_t retval;  float32_t f = d;  memcpy((void *)i, (void *)&f, sizeof(quadlet_t));  if (sizeof(quadlet_t) == sizeof(float32_t)) {    retval = DC1394_SUCCESS;  }  else {    retval = DC1394_FAILURE;  }  return retval;}/****************************************************************************** * Function to convert quadlet_t (32 bit float representation) to float */dc1394error_tdc1394_pxl_convert_quadlet_to_float32(quadlet_t i, double *d) {  dc1394error_t retval;    float32_t f;  memcpy((void *)&f, (void *)&i, sizeof(float32_t));  *d = (double) f;  if (sizeof(quadlet_t) == sizeof(float32_t)) {    retval = DC1394_SUCCESS;  }  else {    retval = DC1394_FAILURE;  }  return retval;}/****************************************************************************** * Function to read N bytes from a camera location * Internal function. */dc1394error_tdc1394_pxl_read_n_bytes(dc1394camera_t *camera, quadlet_t offset, char *str, uint_t n) {  if (camera == NULL)	return DC1394_FAILURE;  quadlet_t quadlet;  quadlet_t i;  for (i = 0; i < n; i+=4) {	GetCameraROMValue(camera, (octlet_t)offset*4+i, &quadlet);	quadlet = ntohl(quadlet);	memcpy((void *)(str+i), (void *)&quadlet, sizeof(quadlet));  }  return DC1394_SUCCESS;}/****************************************************************************** * Function to get the camera serial number as unsigned integer. * As opposed to getting all parameters, this is a quick way to just identify * the camera. */dc1394error_tdc1394_pxl_get_camera_serial_number(dc1394camera_t *camera, uint_t *serial_num_int) {  if (camera == NULL)	return DC1394_FAILURE;  quadlet_t serial_num_offset, serial_num_length;  GetCameraAdvControlRegister(camera, PxL_ACR_SERIAL_NUM_OFFSET, 	  &serial_num_offset);  GetCameraAdvControlRegister(camera, PxL_ACR_SERIAL_NUM_LENGTH, 	  &serial_num_length);  char *serial_num = (char *) malloc((serial_num_length/4+1)*4);  dc1394_pxl_read_n_bytes(camera, serial_num_offset, serial_num, serial_num_length);  *serial_num_int = atoi(serial_num);  free(serial_num);  return DC1394_SUCCESS;}/****************************************************************************** * Function to get the camera info. * All strings that are read are hard limited to PxL_MAX_STRING_LENGTH. */dc1394error_tdc1394_pxl_get_camera_info(dc1394camera_t *camera, dc1394_pxl_camera_info_t 	*camera_info) {  if (camera == NULL)	return DC1394_FAILURE;  quadlet_t serial_num_offset, serial_num_length,			camera_desc_offset, camera_desc_length;  GetCameraAdvControlRegister(camera, PxL_ACR_FPGA_VERSION, 	  &(camera_info->fpga_version));  GetCameraAdvControlRegister(camera, PxL_ACR_FW_VERSION, 	  &(camera_info->fw_version));  GetCameraAdvControlRegister(camera, PxL_ACR_SERIAL_NUM_OFFSET, 	  &serial_num_offset);  GetCameraAdvControlRegister(camera, PxL_ACR_SERIAL_NUM_LENGTH, 	  &serial_num_length);  GetCameraAdvControlRegister(camera, PxL_ACR_CAMERA_DESC_OFFSET, 	  &camera_desc_offset);  GetCameraAdvControlRegister(camera, PxL_ACR_CAMERA_DESC_LENGTH, 	  &camera_desc_length);#ifdef PIXELINK_DEBUG_LOWEST_LEVEL  fprintf(stdout, "%-26s: %08x\n", "SERIAL_NUM", serial_num_offset);  fprintf(stdout, "%-26s: %08x\n", "SERIAL_NUM_LENGTH", serial_num_length);  fprintf(stdout, "%-26s: %08x\n", "CAMERA_DESC", camera_desc_offset);  fprintf(stdout, "%-26s: %08x\n", "CAMERA_DESC_LENGTH", camera_desc_length);#endif  serial_num_length = (serial_num_length < PxL_MAX_STRING_LENGTH)?	serial_num_length: PxL_MAX_STRING_LENGTH;  dc1394_pxl_read_n_bytes(camera, serial_num_offset, camera_info->serial_number, serial_num_length);  camera_info->serial_number[PxL_MAX_STRING_LENGTH-1] = '\0';  camera_desc_length = (camera_desc_length < PxL_MAX_STRING_LENGTH)?	camera_desc_length: PxL_MAX_STRING_LENGTH;  dc1394_pxl_read_n_bytes(camera, camera_desc_offset, camera_info->description, camera_desc_length);  camera_info->description[PxL_MAX_STRING_LENGTH-1] = '\0';  return DC1394_SUCCESS;}/****************************************************************************** * Function to get the camera info. * All strings that are read are hard limited to PxL_MAX_STRING_LENGTH. */dc1394error_tdc1394_pxl_get_adv_feature_info(dc1394camera_t *camera, dc1394_pxl_adv_feature_info_t 	*adv_feature_info) {  if (camera == NULL)	return DC1394_FAILURE;  quadlet_t name_inquiry, name_offset, name_length;  GetCameraAdvControlRegister(camera, PxL_ACR_NAME_INQUIRY, &name_inquiry);  GetCameraAdvControlRegister(camera, PxL_ACR_NAME_OFFSET, &name_offset);  GetCameraAdvControlRegister(camera, PxL_ACR_NAME_LENGTH, &name_length);  if (name_inquiry & 0x80000000) {	adv_feature_info->name_presence = DC1394_FALSE;    name_length = (name_length < PxL_MAX_STRING_LENGTH)? 	  name_length: PxL_MAX_STRING_LENGTH;	dc1394_pxl_read_n_bytes(camera, name_offset, adv_feature_info->name, name_length);	adv_feature_info->name[PxL_MAX_STRING_LENGTH-1] = '\0';  }  else  {	adv_feature_info->name_presence = DC1394_FALSE;	adv_feature_info->name[0] = '\0';  }  adv_feature_info->name_offset = name_offset;  return DC1394_SUCCESS;}/***************************************************************************** * Function to get the GPIO (General Purpose Input Output) information. * The GPIO functionality comes under Advanced Features, but are functionally * different enought to warrant their own structure. */dc1394error_tdc1394_pxl_get_gpio_inq(dc1394camera_t *camera, dc1394_pxl_gpio_info_t *gpio_info) {  quadlet_t gpio_inq;  if (camera == NULL)	return DC1394_FAILURE;  quadlet_t address = PxL_ACR_GPIO_INQ;  GetCameraAdvControlRegister(camera, address, &gpio_inq);#ifdef PIXELINK_DEBUG_DISPLAY  printf("  0x%08x : r 0x%08x < GPIO_INQ\n", address, gpio_inq);#endif  quadlet_t bit = 0x1UL << 31;  gpio_info->number      = (gpio_inq>>24) & 0x0FUL;  gpio_info->presence    = gpio_inq & (bit>> 0)? DC1394_TRUE: DC1394_FALSE;  gpio_info->polarity    = gpio_inq & (bit>> 1)? DC1394_TRUE: DC1394_FALSE;  gpio_info->mode_strobe = gpio_inq & (bit>> 8)? DC1394_TRUE: DC1394_FALSE;  gpio_info->mode_normal = gpio_inq & (bit>> 9)? DC1394_TRUE: DC1394_FALSE;  gpio_info->mode_pulse  = gpio_inq & (bit>>10)? DC1394_TRUE: DC1394_FALSE;  gpio_info->mode_busy   = gpio_inq & (bit>>11)? DC1394_TRUE: DC1394_FALSE;  gpio_info->mode_flash  = gpio_inq & (bit>>12)? DC1394_TRUE: DC1394_FALSE;    if (gpio_info->presence == DC1394_FALSE) {	gpio_info->number      = 0;	gpio_info->polarity    = DC1394_FALSE;	gpio_info->mode_strobe = DC1394_FALSE;	gpio_info->mode_normal = DC1394_FALSE;	gpio_info->mode_pulse  = DC1394_FALSE;	gpio_info->mode_busy   = DC1394_FALSE;	gpio_info->mode_flash  = DC1394_FALSE;  }#ifdef PIXELINK_DEBUG_LOWEST_LEVEL  printf("\n");  printf("  Presence ---------------------------------+\n");  printf("  Polarity inq ----------------------------+|\n");  printf("  Number of supported GPIOs ---------+--+  ||\n");  printf("  Strobe mode ----------------------+|  |  ||\n");  printf("  Normal mode ---------------------+||  |  ||\n");  printf("  Pulse mode ---------------------+|||  |  ||\n");  printf("  Busy mode ---------------------+||||  |  ||\n");  printf("                                 |||||  |  ||\n");  printf("  GPIO_INQ : ");  uint_t i;  for (i = 0; i < 32; i++) {	(gpio_inq & (1<<i))? printf("1"): printf("0");  }  printf("\n\n");#endif    return DC1394_SUCCESS;}/***************************************************************************** * Function to get the GPO parameters Parameter1, Parameter2, Parameter3 */dc1394error_tdc1394_pxl_get_gpo_param(dc1394camera_t *camera, uint_t gpio_id, 	quadlet_t *p1_val, quadlet_t *p2_val, quadlet_t *p3_val) {  dc1394error_t err;  dc1394_pxl_gpio_info_t gpio_info;  err = dc1394_pxl_get_gpio_inq(camera, &gpio_info);  if (err == DC1394_FAILURE) {	return DC1394_FAILURE;  }    if (!(gpio_info.presence && gpio_id < gpio_info.number)) {	return DC1394_FAILURE;  }  quadlet_t gpio_parm1_abs, gpio_parm2_abs, gpio_parm3_abs;  GetCameraAdvControlRegister(camera, PxL_ACR_GPIO_PARM1_ABS, &gpio_parm1_abs);  GetCameraAdvControlRegister(camera, PxL_ACR_GPIO_PARM2_ABS, &gpio_parm2_abs);  GetCameraAdvControlRegister(camera, PxL_ACR_GPIO_PARM3_ABS, &gpio_parm3_abs);  quadlet_t gpio_parm1_add, gpio_parm2_add, gpio_parm3_add;  gpio_parm1_add = 4*gpio_parm1_abs + gpio_id*0x0c + 0x08;  gpio_parm2_add = 4*gpio_parm2_abs + gpio_id*0x0c + 0x08;  gpio_parm3_add = 4*gpio_parm3_abs + gpio_id*0x0c + 0x08;  GetCameraROMValue(camera, (octlet_t)(gpio_parm1_add), p1_val);  GetCameraROMValue(camera, (octlet_t)(gpio_parm2_add), p2_val);  GetCameraROMValue(camera, (octlet_t)(gpio_parm3_add), p3_val);#ifdef PIXELINK_DEBUG_DISPLAY  printf("  0x%08x : r 0x%08x < GPIO_PARM1_VALUE\n", gpio_parm1_add, *p1_val);  printf("  0x%08x : r 0x%08x < GPIO_PARM2_VALUE\n", gpio_parm2_add, *p2_val);  printf("  0x%08x : r 0x%08x < GPIO_PARM3_VALUE\n", gpio_parm3_add, *p3_val);#endif  return DC1394_SUCCESS;}/***************************************************************************** * Function to get the GPO parameters Parameter1, Parameter2, Parameter3 * as well as the corresponding minimum and maximum values. */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -