static void _send_packet_request (ArvGvStreamThreadData *thread_data, guint32 frame_id, guint32 first_block, guint32 last_block) { ArvGvcpPacket *packet; size_t packet_size; thread_data->packet_id = arv_gvcp_next_packet_id (thread_data->packet_id); packet = arv_gvcp_packet_new_packet_resend_cmd (frame_id, first_block, last_block, thread_data->packet_id, &packet_size); arv_log_stream_thread ("[GvStream::send_packet_request] frame_id = %u (%d - %d)", frame_id, first_block, last_block); arv_gvcp_packet_debug (packet, ARV_DEBUG_LEVEL_LOG); g_socket_send_to (thread_data->socket, thread_data->device_address, (const char *) packet, packet_size, NULL, NULL); arv_gvcp_packet_free (packet); }
static gboolean _read_memory (ArvGvDeviceIOData *io_data, guint32 address, guint32 size, void *buffer, GError **error) { ArvGvcpPacket *packet; size_t packet_size; size_t answer_size; int count; unsigned int n_retries = 0; gboolean success = FALSE; answer_size = arv_gvcp_packet_get_read_memory_ack_size (size); g_return_val_if_fail (answer_size <= ARV_GV_DEVICE_BUFFER_SIZE, FALSE); g_mutex_lock (io_data->mutex); packet = arv_gvcp_packet_new_read_memory_cmd (address, ((size + sizeof (guint32) - 1) / sizeof (guint32)) * sizeof (guint32), 0, &packet_size); do { io_data->packet_id = arv_gvcp_next_packet_id (io_data->packet_id); arv_gvcp_packet_set_packet_id (packet, io_data->packet_id); arv_gvcp_packet_debug (packet, ARV_DEBUG_LEVEL_LOG); g_socket_send_to (io_data->socket, io_data->device_address, (const char *) packet, packet_size, NULL, NULL); if (g_poll (&io_data->poll_in_event, 1, io_data->gvcp_timeout_ms) > 0) { count = g_socket_receive (io_data->socket, io_data->buffer, ARV_GV_DEVICE_BUFFER_SIZE, NULL, NULL); if (count >= answer_size) { ArvGvcpPacket *ack_packet = io_data->buffer; ArvGvcpPacketType packet_type; ArvGvcpCommand command; guint16 packet_id; arv_gvcp_packet_debug (ack_packet, ARV_DEBUG_LEVEL_LOG); packet_type = arv_gvcp_packet_get_packet_type (ack_packet); command = arv_gvcp_packet_get_command (ack_packet); packet_id = arv_gvcp_packet_get_packet_id (ack_packet); if (packet_type == ARV_GVCP_PACKET_TYPE_ACK && command == ARV_GVCP_COMMAND_READ_MEMORY_ACK && packet_id == io_data->packet_id) { memcpy (buffer, arv_gvcp_packet_get_read_memory_ack_data (ack_packet), size); success = TRUE; } else arv_gvcp_packet_debug (ack_packet, ARV_DEBUG_LEVEL_WARNING); } } n_retries++; } while (!success && n_retries < io_data->gvcp_n_retries); arv_gvcp_packet_free (packet); g_mutex_unlock (io_data->mutex); if (!success) { if (error != NULL && *error == NULL) *error = g_error_new (ARV_DEVICE_ERROR, ARV_DEVICE_STATUS_TIMEOUT, "[ArvDevice::read_memory] Timeout"); } return success; }
gboolean _write_register (ArvGvDeviceIOData *io_data, guint32 address, guint32 value, GError **error) { ArvGvcpPacket *packet; size_t packet_size; int count; unsigned int n_retries = 0; gboolean success = FALSE; g_mutex_lock (io_data->mutex); packet = arv_gvcp_packet_new_write_register_cmd (address, value, io_data->packet_id, &packet_size); do { io_data->packet_id = arv_gvcp_next_packet_id (io_data->packet_id); arv_gvcp_packet_set_packet_id (packet, io_data->packet_id); arv_gvcp_packet_debug (packet, ARV_DEBUG_LEVEL_LOG); g_socket_send_to (io_data->socket, io_data->device_address, (const char *) packet, packet_size, NULL, NULL); if (g_poll (&io_data->poll_in_event, 1, io_data->gvcp_timeout_ms) > 0) { count = g_socket_receive (io_data->socket, io_data->buffer, ARV_GV_DEVICE_BUFFER_SIZE, NULL, NULL); if (count > 0) { ArvGvcpPacket *ack_packet = io_data->buffer; ArvGvcpPacketType packet_type; ArvGvcpCommand command; guint16 packet_id; arv_gvcp_packet_debug (ack_packet, ARV_DEBUG_LEVEL_LOG); packet_type = arv_gvcp_packet_get_packet_type (ack_packet); command = arv_gvcp_packet_get_command (ack_packet); packet_id = arv_gvcp_packet_get_packet_id (ack_packet); arv_log_gvcp ("%d, %d, %d", packet_type, command, packet_id); if (packet_type == ARV_GVCP_PACKET_TYPE_ACK && command == ARV_GVCP_COMMAND_WRITE_REGISTER_ACK && packet_id == io_data->packet_id) success = TRUE; else arv_gvcp_packet_debug (ack_packet, ARV_DEBUG_LEVEL_WARNING); } } n_retries++; } while (!success && n_retries < io_data->gvcp_n_retries); arv_gvcp_packet_free (packet); g_mutex_unlock (io_data->mutex); if (!success) { if (error != NULL && *error == NULL) *error = g_error_new (ARV_DEVICE_ERROR, ARV_DEVICE_STATUS_TIMEOUT, "[ArvDevice::write_register] Timeout"); } return success; }