summaryrefslogtreecommitdiffstats
path: root/src/ufo-roof-plane-task.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/ufo-roof-plane-task.c')
-rw-r--r--src/ufo-roof-plane-task.c233
1 files changed, 233 insertions, 0 deletions
diff --git a/src/ufo-roof-plane-task.c b/src/ufo-roof-plane-task.c
new file mode 100644
index 0000000..25c2bfa
--- /dev/null
+++ b/src/ufo-roof-plane-task.c
@@ -0,0 +1,233 @@
+/*
+ * Copyright (C) 2011-2015 Karlsruhe Institute of Technology
+ *
+ * This file is part of Ufo.
+ *
+ * This library is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation, either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <stdio.h>
+
+#ifdef __APPLE__
+#include <OpenCL/cl.h>
+#else
+#include <CL/cl.h>
+#endif
+
+#include "ufo-roof-plane-task.h"
+
+
+struct _UfoRoofPlaneTaskPrivate {
+ gboolean ready; // Indicates if data is ready for generation
+ guint plane; // Selected plane (0 - pass everything trough)
+};
+
+static void ufo_task_interface_init (UfoTaskIface *iface);
+
+G_DEFINE_TYPE_WITH_CODE (UfoRoofPlaneTask, ufo_roof_plane_task, UFO_TYPE_TASK_NODE,
+ G_IMPLEMENT_INTERFACE (UFO_TYPE_TASK,
+ ufo_task_interface_init))
+
+#define UFO_ROOF_PLANE_TASK_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE((obj), UFO_TYPE_ROOF_PLANE_TASK, UfoRoofPlaneTaskPrivate))
+
+enum {
+ PROP_0,
+ PROP_PLANE,
+ N_PROPERTIES
+};
+
+static GParamSpec *properties[N_PROPERTIES] = { NULL, };
+
+UfoNode *
+ufo_roof_plane_task_new (void)
+{
+ return UFO_NODE (g_object_new (UFO_TYPE_ROOF_PLANE_TASK, NULL));
+}
+
+static void
+ufo_roof_plane_task_setup (UfoTask *task,
+ UfoResources *resources,
+ GError **error)
+{
+}
+
+static void
+ufo_roof_plane_task_get_requisition (UfoTask *task,
+ UfoBuffer **inputs,
+ UfoRequisition *requisition,
+ GError **error)
+{
+ ufo_buffer_get_requisition (inputs[0], requisition);
+/* int i;
+// UfoRoofPlaneTaskPrivate *priv;
+ UfoRequisition in_req;
+
+// priv = UFO_ROOF_PLANE_TASK_GET_PRIVATE (task);
+ ufo_buffer_get_requisition (inputs[0], &in_req);
+
+ requisition->n_dims = in_req.n_dims;
+ for (i = 0; i < in_req.n_dims; i++)
+ requisition->dims[i] = in_req.dims[i];*/
+}
+
+static guint
+ufo_roof_plane_task_get_num_inputs (UfoTask *task)
+{
+ return 1;
+}
+
+static guint
+ufo_roof_plane_task_get_num_dimensions (UfoTask *task,
+ guint input)
+{
+ return 2;
+}
+
+static UfoTaskMode
+ufo_roof_plane_task_get_mode (UfoTask *task)
+{
+ return UFO_TASK_MODE_CPU|UFO_TASK_MODE_REDUCTOR;
+}
+
+static gboolean
+ufo_roof_plane_task_process (UfoTask *task,
+ UfoBuffer **inputs,
+ UfoBuffer *output,
+ UfoRequisition *requisition)
+{
+ UfoRoofPlaneTaskPrivate *priv;
+
+ priv = UFO_ROOF_PLANE_TASK_GET_PRIVATE (task);
+
+ if (priv->plane) {
+ int buf_plane;
+ GValue *value;
+
+ value = ufo_buffer_get_metadata(inputs[0], "plane");
+ buf_plane = g_value_get_uint(value);
+ if (buf_plane != priv->plane)
+ return TRUE;
+ }
+
+ ufo_buffer_copy(inputs[0], output);
+ ufo_buffer_copy_metadata (inputs[0], output);
+ priv->ready = TRUE;
+
+ return FALSE;
+}
+
+static gboolean
+ufo_roof_plane_task_generate (UfoTask *task,
+ UfoBuffer *output,
+ UfoRequisition *requisition)
+{
+ UfoRoofPlaneTaskPrivate *priv;
+
+ priv = UFO_ROOF_PLANE_TASK_GET_PRIVATE (task);
+ if (!priv->ready) return FALSE;
+
+/*
+ GValue *value = ufo_buffer_get_metadata(output, "plane");
+ guint buf_plane = g_value_get_uint(value);
+ printf("Passing buffer for plane %u\n", buf_plane);
+*/
+
+ priv->ready = FALSE;
+
+ return TRUE;
+}
+
+
+static void
+ufo_roof_plane_task_set_property (GObject *object,
+ guint property_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ UfoRoofPlaneTaskPrivate *priv = UFO_ROOF_PLANE_TASK_GET_PRIVATE (object);
+
+ switch (property_id) {
+ case PROP_PLANE:
+ priv->plane = g_value_get_uint (value);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+ break;
+ }
+}
+
+static void
+ufo_roof_plane_task_get_property (GObject *object,
+ guint property_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ UfoRoofPlaneTaskPrivate *priv = UFO_ROOF_PLANE_TASK_GET_PRIVATE (object);
+
+ switch (property_id) {
+ case PROP_PLANE:
+ g_value_set_uint (value, priv->plane);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+ break;
+ }
+}
+
+static void
+ufo_roof_plane_task_finalize (GObject *object)
+{
+ G_OBJECT_CLASS (ufo_roof_plane_task_parent_class)->finalize (object);
+}
+
+static void
+ufo_task_interface_init (UfoTaskIface *iface)
+{
+ iface->setup = ufo_roof_plane_task_setup;
+ iface->get_num_inputs = ufo_roof_plane_task_get_num_inputs;
+ iface->get_num_dimensions = ufo_roof_plane_task_get_num_dimensions;
+ iface->get_mode = ufo_roof_plane_task_get_mode;
+ iface->get_requisition = ufo_roof_plane_task_get_requisition;
+ iface->process = ufo_roof_plane_task_process;
+ iface->generate = ufo_roof_plane_task_generate;
+
+}
+
+static void
+ufo_roof_plane_task_class_init (UfoRoofPlaneTaskClass *klass)
+{
+ GObjectClass *oclass = G_OBJECT_CLASS (klass);
+
+ oclass->set_property = ufo_roof_plane_task_set_property;
+ oclass->get_property = ufo_roof_plane_task_get_property;
+ oclass->finalize = ufo_roof_plane_task_finalize;
+
+ properties[PROP_PLANE] =
+ g_param_spec_uint ("plane",
+ "Detector planes",
+ "Only passes trough the data for the selecte plane",
+ 0, G_MAXUINT, 0,
+ G_PARAM_READWRITE);
+
+ for (guint i = PROP_0 + 1; i < N_PROPERTIES; i++)
+ g_object_class_install_property (oclass, i, properties[i]);
+
+ g_type_class_add_private (oclass, sizeof(UfoRoofPlaneTaskPrivate));
+}
+
+static void
+ufo_roof_plane_task_init(UfoRoofPlaneTask *self)
+{
+ self->priv = UFO_ROOF_PLANE_TASK_GET_PRIVATE(self);
+}