static gboolean arv_gv_device_write_register (ArvDevice *device, guint32 address, guint32 value, GError **error) { ArvGvDevice *gv_device = ARV_GV_DEVICE (device); return _write_register (gv_device->priv->io_data, address, value, error); }
static ArvGc * arv_gv_device_get_genicam (ArvDevice *device) { ArvGvDevice *gv_device = ARV_GV_DEVICE (device); return gv_device->priv->genicam; }
static ArvStream * arv_gv_device_create_stream (ArvDevice *device, ArvStreamCallback callback, void *user_data) { ArvGvDevice *gv_device = ARV_GV_DEVICE (device); ArvGvDeviceIOData *io_data = gv_device->priv->io_data; ArvStream *stream; const guint8 *address_bytes; guint32 stream_port; guint packet_size; guint32 n_stream_channels; GInetAddress *interface_address; GInetAddress *device_address; arv_device_read_register (device, ARV_GVBS_N_STREAM_CHANNELS_OFFSET, &n_stream_channels, NULL); arv_debug_device ("[GvDevice::create_stream] Number of stream channels = %d", n_stream_channels); if (n_stream_channels < 1) return NULL; if (!io_data->is_controller) { arv_warning_device ("[GvDevice::create_stream] Can't create stream without control access"); return NULL; } interface_address = g_inet_socket_address_get_address (G_INET_SOCKET_ADDRESS (io_data->interface_address)); device_address = g_inet_socket_address_get_address (G_INET_SOCKET_ADDRESS (io_data->device_address)); address_bytes = g_inet_address_to_bytes (interface_address); /* On some cameras, the default packet size after reset is incorrect. * So, if the value is obviously incorrect, set it to a default size. */ packet_size = arv_gv_device_get_packet_size (gv_device); if (packet_size <= ARV_GVSP_PACKET_PROTOCOL_OVERHEAD) { arv_gv_device_set_packet_size (gv_device, ARV_GV_DEVICE_GVSP_PACKET_SIZE_DEFAULT); arv_debug_device ("[GvDevice::create_stream] Packet size set to default value (%d)", ARV_GV_DEVICE_GVSP_PACKET_SIZE_DEFAULT); } packet_size = arv_gv_device_get_packet_size (gv_device); arv_debug_device ("[GvDevice::create_stream] Packet size = %d byte(s)", packet_size); stream = arv_gv_stream_new (device_address, 0, callback, user_data, arv_gv_device_get_timestamp_tick_frequency (gv_device), packet_size); stream_port = arv_gv_stream_get_port (ARV_GV_STREAM (stream)); if (!arv_device_write_register (device, ARV_GVBS_STREAM_CHANNEL_0_IP_ADDRESS_OFFSET, g_htonl(*((guint32 *) address_bytes)), NULL) || !arv_device_write_register (device, ARV_GVBS_STREAM_CHANNEL_0_PORT_OFFSET, stream_port, NULL)) { arv_warning_device ("[GvDevice::create_stream] Stream configuration failed"); g_object_unref (stream); return NULL; } arv_debug_device ("[GvDevice::create_stream] Stream port = %d", stream_port); return stream; }
static gboolean arv_gv_device_write_memory (ArvDevice *device, guint32 address, guint32 size, void *buffer, GError **error) { ArvGvDevice *gv_device = ARV_GV_DEVICE (device); int i; gint32 block_size; for (i = 0; i < (size + ARV_GVCP_DATA_SIZE_MAX - 1) / ARV_GVCP_DATA_SIZE_MAX; i++) { block_size = MIN (ARV_GVCP_DATA_SIZE_MAX, size - i * ARV_GVCP_DATA_SIZE_MAX); if (!_write_memory (gv_device->priv->io_data, address + i * ARV_GVCP_DATA_SIZE_MAX, block_size, buffer + i * ARV_GVCP_DATA_SIZE_MAX, error)) return FALSE; } return TRUE; }
static void arv_gv_device_finalize (GObject *object) { ArvGvDevice *gv_device = ARV_GV_DEVICE (object); ArvGvDeviceIOData *io_data; if (gv_device->priv->heartbeat_thread != NULL) { ArvGvDeviceHeartbeatData *heartbeat_data; heartbeat_data = gv_device->priv->heartbeat_data; heartbeat_data->cancel = TRUE; g_thread_join (gv_device->priv->heartbeat_thread); g_free (heartbeat_data); gv_device->priv->heartbeat_data = NULL; gv_device->priv->heartbeat_thread = NULL; } arv_gv_device_leave_control (gv_device); io_data = gv_device->priv->io_data; g_object_unref (io_data->device_address); g_object_unref (io_data->interface_address); g_object_unref (io_data->socket); g_free (io_data->buffer); #if GLIB_CHECK_VERSION(2,32,0) g_mutex_clear (&io_data->mutex); #else g_mutex_free (io_data->mutex); #endif g_free (gv_device->priv->io_data); if (gv_device->priv->genicam != NULL) g_object_unref (gv_device->priv->genicam); g_free (gv_device->priv->genicam_xml); parent_class->finalize (object); }
static const char * arv_gv_device_get_genicam_xml (ArvDevice *device, size_t *size) { char *xml; ArvGvDevice *gv_device = ARV_GV_DEVICE (device); if (gv_device->priv->genicam_xml != NULL) { *size = gv_device->priv->genicam_xml_size; return gv_device->priv->genicam_xml; } *size = 0; xml = _load_genicam (gv_device, ARV_GVBS_XML_URL_0_OFFSET, size); if (xml == NULL) xml = _load_genicam (gv_device, ARV_GVBS_XML_URL_1_OFFSET, size); gv_device->priv->genicam_xml = xml; gv_device->priv->genicam_xml_size = *size; return xml; }