ArvDevice * arv_gv_device_new (GInetAddress *interface_address, GInetAddress *device_address) { ArvGvDevice *gv_device; ArvGvDeviceIOData *io_data; ArvGvDeviceHeartbeatData *heartbeat_data; char *address_string; g_return_val_if_fail (G_IS_INET_ADDRESS (interface_address), NULL); g_return_val_if_fail (G_IS_INET_ADDRESS (device_address), NULL); address_string = g_inet_address_to_string (interface_address); arv_debug_device ("[GvDevice::new] Interface address = %s", address_string); g_free (address_string); address_string = g_inet_address_to_string (device_address); arv_debug_device ("[GvDevice::new] Device address = %s", address_string); g_free (address_string); gv_device = g_object_new (ARV_TYPE_GV_DEVICE, NULL); io_data = g_new0 (ArvGvDeviceIOData, 1); io_data->mutex = g_mutex_new (); io_data->packet_id = 65300; /* Start near the end of the circular counter */ io_data->interface_address = g_inet_socket_address_new (interface_address, 0); io_data->device_address = g_inet_socket_address_new (device_address, ARV_GVCP_PORT); io_data->socket = g_socket_new (G_SOCKET_FAMILY_IPV4, G_SOCKET_TYPE_DATAGRAM, G_SOCKET_PROTOCOL_UDP, NULL); g_socket_bind (io_data->socket, io_data->interface_address, TRUE, NULL); io_data->buffer = g_malloc (ARV_GV_DEVICE_BUFFER_SIZE); io_data->gvcp_n_retries = ARV_GV_DEVICE_GVCP_N_RETRIES_DEFAULT; io_data->gvcp_timeout_ms = ARV_GV_DEVICE_GVCP_TIMEOUT_MS_DEFAULT; io_data->poll_in_event.fd = g_socket_get_fd (io_data->socket); io_data->poll_in_event.events = G_IO_IN; io_data->poll_in_event.revents = 0; gv_device->priv->io_data = io_data; arv_gv_device_load_genicam (gv_device); arv_gv_device_take_control (gv_device); heartbeat_data = g_new (ArvGvDeviceHeartbeatData, 1); heartbeat_data->gv_device = gv_device; heartbeat_data->io_data = io_data; heartbeat_data->period_us = ARV_GV_DEVICE_HEARTBEAT_PERIOD_US; heartbeat_data->cancel = FALSE; gv_device->priv->heartbeat_data = heartbeat_data; gv_device->priv->heartbeat_thread = g_thread_create (arv_gv_device_heartbeat_thread, gv_device->priv->heartbeat_data, TRUE, NULL); return ARV_DEVICE (gv_device); }
ArvDevice * arv_gv_device_new (GInetAddress *interface_address, GInetAddress *device_address) { ArvGvDevice *gv_device; ArvGvDeviceIOData *io_data; ArvGvDeviceHeartbeatData *heartbeat_data; ArvGcRegisterDescriptionNode *register_description; ArvDomDocument *document; char *address_string; guint32 capabilities; g_return_val_if_fail (G_IS_INET_ADDRESS (interface_address), NULL); g_return_val_if_fail (G_IS_INET_ADDRESS (device_address), NULL); address_string = g_inet_address_to_string (interface_address); arv_debug_device ("[GvDevice::new] Interface address = %s", address_string); g_free (address_string); address_string = g_inet_address_to_string (device_address); arv_debug_device ("[GvDevice::new] Device address = %s", address_string); g_free (address_string); gv_device = g_object_new (ARV_TYPE_GV_DEVICE, NULL); io_data = g_new0 (ArvGvDeviceIOData, 1); #if GLIB_CHECK_VERSION(2,32,0) g_mutex_init (&io_data->mutex); #else io_data->mutex = g_mutex_new (); #endif io_data->packet_id = 65300; /* Start near the end of the circular counter */ io_data->interface_address = g_inet_socket_address_new (interface_address, 0); io_data->device_address = g_inet_socket_address_new (device_address, ARV_GVCP_PORT); io_data->socket = g_socket_new (G_SOCKET_FAMILY_IPV4, G_SOCKET_TYPE_DATAGRAM, G_SOCKET_PROTOCOL_UDP, NULL); g_socket_bind (io_data->socket, io_data->interface_address, TRUE, NULL); io_data->buffer = g_malloc (ARV_GV_DEVICE_BUFFER_SIZE); io_data->gvcp_n_retries = ARV_GV_DEVICE_GVCP_N_RETRIES_DEFAULT; io_data->gvcp_timeout_ms = ARV_GV_DEVICE_GVCP_TIMEOUT_MS_DEFAULT; io_data->poll_in_event.fd = g_socket_get_fd (io_data->socket); io_data->poll_in_event.events = G_IO_IN; io_data->poll_in_event.revents = 0; gv_device->priv->io_data = io_data; arv_gv_device_load_genicam (gv_device); arv_gv_device_take_control (gv_device); heartbeat_data = g_new (ArvGvDeviceHeartbeatData, 1); heartbeat_data->gv_device = gv_device; heartbeat_data->io_data = io_data; heartbeat_data->period_us = ARV_GV_DEVICE_HEARTBEAT_PERIOD_US; heartbeat_data->cancel = FALSE; gv_device->priv->heartbeat_data = heartbeat_data; gv_device->priv->heartbeat_thread = arv_g_thread_new ("arv_gv_heartbeat", arv_gv_device_heartbeat_thread, gv_device->priv->heartbeat_data); arv_device_read_register (ARV_DEVICE (gv_device), ARV_GVBS_GVCP_CAPABILITY_OFFSET, &capabilities, NULL); gv_device->priv->is_packet_resend_supported = (capabilities & ARV_GVBS_GVCP_CAPABILITY_PACKET_RESEND) != 0; gv_device->priv->is_write_memory_supported = (capabilities & ARV_GVBS_GVCP_CAPABILITY_WRITE_MEMORY) != 0; arv_debug_device ("[GvDevice::new] Packet resend = %s", gv_device->priv->is_packet_resend_supported ? "yes" : "no"); arv_debug_device ("[GvDevice::new] Write memory = %s", gv_device->priv->is_write_memory_supported ? "yes" : "no"); document = ARV_DOM_DOCUMENT (gv_device->priv->genicam); register_description = ARV_GC_REGISTER_DESCRIPTION_NODE (arv_dom_document_get_document_element (document)); if (!arv_gc_register_description_node_check_schema_version (register_description, 1, 1, 0)) arv_debug_device ("[GvDevice::new] Register workaround = yes"); return ARV_DEVICE (gv_device); }