[aravis] fake: start the implementation of a fake ethernet camera application.



commit d43dcd7ca012c83e73b8e56db858ca0c74d618a8
Author: Emmanuel Pacaud <emmanuel gnome org>
Date:   Sat May 29 10:02:59 2010 +0200

    fake: start the implementation of a fake ethernet camera application.

 src/.gitignore        |    1 +
 src/Makefile.am       |    4 ++
 src/arvfakegvcamera.c |  101 +++++++++++++++++++++++++++++++++++++++++++++++++
 src/arvgvcp.c         |   19 +++++++++
 src/arvgvcp.h         |    1 +
 5 files changed, 126 insertions(+), 0 deletions(-)
---
diff --git a/src/.gitignore b/src/.gitignore
index 91c0f78..c32338c 100644
--- a/src/.gitignore
+++ b/src/.gitignore
@@ -4,6 +4,7 @@ arv-genicam-test
 arv-evaluator-test
 arv-zip-test
 arv-camera-test
+arv-fake-gv-camera
 arvenumtypes.c
 arvenumtypes.h
 arvconfig.h
diff --git a/src/Makefile.am b/src/Makefile.am
index 0f4db64..9816283 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -123,6 +123,7 @@ arvenumtypes.c: arvenumtypes.c.template $(ARAVIS_HDRS) $(GLIB_MKENUMS)
 	$(AM_V_GEN) (cd $(srcdir) && $(GLIB_MKENUMS) --template arvenumtypes.c.template $(libaravis_la_HEADERS)) > $@
 
 noinst_PROGRAMS = arv-test arv-genicam-test arv-evaluator-test arv-zip-test arv-camera-test
+bin_PROGRAMS = arv-fake-gv-camera
 
 arv_test_SOURCES = arvtest.c
 arv_test_LDADD = $(ARAVIS_LIBS) libaravis.la
@@ -139,6 +140,9 @@ arv_zip_test_LDADD = $(ARAVIS_LIBS) libaravis.la
 arv_camera_test_SOURCES = arvcameratest.c
 arv_camera_test_LDADD = $(ARAVIS_LIBS) libaravis.la
 
+arv_fake_gv_camera_SOURCES = arvfakegvcamera.c
+arv_fake_gv_camera_LDADD = $(ARAVIS_LIBS) libaravis.la
+
 CLEANFILES = $(BUILT_SOURCES)
 
 if HAVE_INTROSPECTION
diff --git a/src/arvfakegvcamera.c b/src/arvfakegvcamera.c
new file mode 100644
index 0000000..c38c691
--- /dev/null
+++ b/src/arvfakegvcamera.c
@@ -0,0 +1,101 @@
+#include <arv.h>
+#include <stdlib.h>
+
+#define ARV_FAKE_GV_CAMERA_BUFFER_SIZE	65536
+
+static gboolean cancel = FALSE;
+
+static void
+set_cancel (int signal)
+{
+	cancel = TRUE;
+}
+
+typedef struct {
+	ArvFakeCamera *camera;
+} ArvFakeGvCamera;
+
+void *
+arv_fake_gv_camera_thread (void *user_data)
+{
+	return NULL;
+}
+
+void
+handle_control_packet (ArvFakeGvCamera *gv_camera, ArvGvcpPacket *packet, size_t size)
+{
+	ArvGvcpPacket *ack_packet;
+	size_t ack_packet_size;
+
+	if (g_ntohs (packet->header.packet_type) != ARV_GVCP_PACKET_TYPE_CMD)
+		g_message ("Wrong packet type");
+
+	switch (g_ntohs (packet->header.command)) {
+		case ARV_GVCP_COMMAND_DISCOVERY_CMD:
+			arv_gvcp_packet_debug (packet);
+			ack_packet = arv_gvcp_packet_new_discovery_ack (&ack_packet_size);
+			arv_fake_camera_read_memory (gv_camera->camera, 0, ARV_GVBS_DISCOVERY_DATA_SIZE,
+						     &ack_packet->data);
+			g_free (ack_packet);
+			g_message ("Discovery packet");
+			break;
+		case ARV_GVCP_COMMAND_READ_MEMORY_CMD:
+			g_message ("Read command ");
+			break;
+		default:
+			g_message ("Unknown command");
+	}
+}
+
+int
+main (int argc, char **argv)
+{
+	ArvFakeGvCamera *gv_camera;
+	GSocket *socket;
+	GSocketAddress *socket_address;
+	GInetAddress *address;
+	GPollFD poll_fd;
+	int n_events;
+	ArvGvcpPacket *packet;
+
+	g_thread_init (NULL);
+	g_type_init ();
+
+	gv_camera = g_new0 (ArvFakeGvCamera, 1);
+	gv_camera->camera = arv_fake_camera_new ("Fake_1");
+
+	socket = g_socket_new (G_SOCKET_FAMILY_IPV4,
+			       G_SOCKET_TYPE_DATAGRAM,
+			       G_SOCKET_PROTOCOL_UDP, NULL);
+
+	address = g_inet_address_new_from_string ("127.0.0.1");
+	socket_address = g_inet_socket_address_new (address, ARV_GVCP_PORT);
+	g_object_unref (address);
+	g_socket_bind (socket, socket_address, TRUE, NULL);
+
+	packet = g_malloc0 (ARV_FAKE_GV_CAMERA_BUFFER_SIZE);
+
+	poll_fd.fd = g_socket_get_fd (socket);
+	poll_fd.events =  G_IO_IN;
+	poll_fd.revents = 0;
+
+	signal (SIGINT, set_cancel);
+
+	do {
+		n_events = g_poll (&poll_fd, 1, 1000);
+		if (n_events > 0) {
+			int count;
+
+			count = g_socket_receive (socket, (char *) packet, ARV_FAKE_GV_CAMERA_BUFFER_SIZE, NULL, NULL);
+			if (count > 0)
+				handle_control_packet (gv_camera, packet, count);
+		}
+	} while (!cancel);
+
+	g_object_unref (socket);
+
+	g_object_unref (gv_camera->camera);
+	g_free (gv_camera);
+
+	return EXIT_SUCCESS;
+}
diff --git a/src/arvgvcp.c b/src/arvgvcp.c
index d002b08..60e6b3e 100644
--- a/src/arvgvcp.c
+++ b/src/arvgvcp.c
@@ -149,6 +149,25 @@ arv_gvcp_packet_new_discovery_cmd (size_t *packet_size)
 }
 
 ArvGvcpPacket *
+arv_gvcp_packet_new_discovery_ack (size_t *packet_size)
+{
+	ArvGvcpPacket *packet;
+
+	g_return_val_if_fail (packet_size != NULL, NULL);
+
+	*packet_size = sizeof (ArvGvcpHeader) + ARV_GVBS_DISCOVERY_DATA_SIZE ;
+
+	packet = g_malloc (*packet_size);
+
+	packet->header.packet_type = g_htons (ARV_GVCP_PACKET_TYPE_ACK);
+	packet->header.command = g_htons (ARV_GVCP_COMMAND_DISCOVERY_ACK);
+	packet->header.size = g_htons (ARV_GVBS_DISCOVERY_DATA_SIZE);
+	packet->header.count = g_htons (0xffff);
+
+	return packet;
+}
+
+ArvGvcpPacket *
 arv_gvcp_packet_new_packet_resend_cmd (guint32 frame_id,
 				       guint32 first_block, guint32 last_block,
 				       guint32 packet_count, size_t *packet_size)
diff --git a/src/arvgvcp.h b/src/arvgvcp.h
index dd2a55d..0b33c90 100644
--- a/src/arvgvcp.h
+++ b/src/arvgvcp.h
@@ -104,6 +104,7 @@ ArvGvcpPacket * 	arv_gvcp_packet_new_read_register_cmd 	(guint32 address,
 ArvGvcpPacket * 	arv_gvcp_packet_new_write_register_cmd 	(guint32 address, guint32 value,
 								 guint32 packet_count, size_t *packet_size);
 ArvGvcpPacket * 	arv_gvcp_packet_new_discovery_cmd 	(size_t *size);
+ArvGvcpPacket * 	arv_gvcp_packet_new_discovery_ack 	(size_t *packet_size);
 ArvGvcpPacket * 	arv_gvcp_packet_new_packet_resend_cmd 	(guint32 frame_id,
 								 guint32 first_block, guint32 last_block,
 								 guint32 packet_count, size_t *packet_size);



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]