[aravis/register] gv_device: implement register workaround for schema < 1.1.0.
- From: Emmanuel Pacaud <emmanuel src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [aravis/register] gv_device: implement register workaround for schema < 1.1.0.
- Date: Mon, 20 May 2013 17:36:55 +0000 (UTC)
commit 3eb3a8ac23bbf31bfc2fdf95e858f7be4e93a605
Author: Emmanuel Pacaud <emmanuel gnome org>
Date: Mon May 20 19:36:22 2013 +0200
gv_device: implement register workaround for schema < 1.1.0.
src/arvgcport.c | 36 ++++++++++++++++++++++++++++++++++--
src/arvgvdevice.c | 8 ++++++++
2 files changed, 42 insertions(+), 2 deletions(-)
---
diff --git a/src/arvgcport.c b/src/arvgcport.c
index 937b95f..54ce465 100644
--- a/src/arvgcport.c
+++ b/src/arvgcport.c
@@ -26,6 +26,7 @@
*/
#include <arvgcport.h>
+#include <arvgcregisterdescriptionnode.h>
#include <arvdevice.h>
#include <arvgc.h>
@@ -41,6 +42,18 @@ arv_gc_port_get_node_name (ArvDomNode *node)
/* ArvGcPort implementation */
+static gboolean
+_register_workaround_check (ArvGcPort *port, guint64 length)
+{
+ ArvDomDocument *document;
+ ArvGcRegisterDescriptionNode *register_description;
+
+ document = arv_dom_node_get_owner_document (ARV_DOM_NODE (port));
+ register_description = ARV_GC_REGISTER_DESCRIPTION_NODE (arv_dom_document_get_document_element
(document));
+
+ return length == 4 && !arv_gc_register_description_node_check_schema_version (register_description,
1, 1, 0);
+}
+
void
arv_gc_port_read (ArvGcPort *port, void *buffer, guint64 address, guint64 length, GError **error)
{
@@ -49,11 +62,21 @@ arv_gc_port_read (ArvGcPort *port, void *buffer, guint64 address, guint64 length
g_return_if_fail (ARV_IS_GC_PORT (port));
g_return_if_fail (error == NULL || *error == NULL);
+ g_return_if_fail (buffer != NULL);
genicam = arv_gc_node_get_genicam (ARV_GC_NODE (port));
device = arv_gc_get_device (genicam);
- arv_device_read_memory (device, address, length, buffer, error);
+ if (_register_workaround_check (port, length)) {
+ guint32 value;
+
+ value = *((guint32 *) buffer);
+ value = GUINT32_FROM_BE (value);
+
+ arv_device_read_register (device, address, &value, error);
+ *((guint32 *) buffer) = GUINT32_TO_BE (value);
+ } else
+ arv_device_read_memory (device, address, length, buffer, error);
}
void
@@ -64,11 +87,20 @@ arv_gc_port_write (ArvGcPort *port, void *buffer, guint64 address, guint64 lengt
g_return_if_fail (ARV_IS_GC_PORT (port));
g_return_if_fail (error == NULL || *error == NULL);
+ g_return_if_fail (buffer != NULL);
genicam = arv_gc_node_get_genicam (ARV_GC_NODE (port));
device = arv_gc_get_device (genicam);
- arv_device_write_memory (device, address, length, buffer, error);
+ if (_register_workaround_check (port, length)) {
+ guint32 value;
+
+ value = *((guint32 *) buffer);
+ value = GUINT32_FROM_BE (value);
+
+ arv_device_write_register (device, address, value, error);
+ } else
+ arv_device_write_memory (device, address, length, buffer, error);
}
ArvGcNode *
diff --git a/src/arvgvdevice.c b/src/arvgvdevice.c
index c46a52a..81e1c71 100644
--- a/src/arvgvdevice.c
+++ b/src/arvgvdevice.c
@@ -27,6 +27,7 @@
#include <arvgvdevice.h>
#include <arvgc.h>
+#include <arvgcregisterdescriptionnode.h>
#include <arvdebug.h>
#include <arvgvstream.h>
#include <arvgvcp.h>
@@ -853,6 +854,8 @@ 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;
@@ -915,6 +918,11 @@ arv_gv_device_new (GInetAddress *interface_address, GInetAddress *device_address
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);
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]