[aravis] gv_device: implement register workaround for schema < 1.1.0.



commit 0331c76097d962be75fb33dd66068fc3b18176b2
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]