diff options
author | Suren A. Chilingaryan <csa@suren.me> | 2020-01-27 05:27:25 +0100 |
---|---|---|
committer | Suren A. Chilingaryan <csa@suren.me> | 2020-01-27 05:27:25 +0100 |
commit | 2eeefe2db3bb9f2e54cc00e7aa657f599c2115ea (patch) | |
tree | 09cb20c623cc8ecdfbf0b526629afcb60aa15f30 /src/ufo-roof-plane-task.c | |
parent | ea424f096c05a9587ffaa0bc6e5392790a046bd7 (diff) | |
download | ufo-roof-2eeefe2db3bb9f2e54cc00e7aa657f599c2115ea.tar.gz ufo-roof-2eeefe2db3bb9f2e54cc00e7aa657f599c2115ea.tar.bz2 ufo-roof-2eeefe2db3bb9f2e54cc00e7aa657f599c2115ea.tar.xz ufo-roof-2eeefe2db3bb9f2e54cc00e7aa657f599c2115ea.zip |
Add metadata about buffer plane and sequential number. Provide filter to allow trough only the buffers acquired at the specified detector plane
Diffstat (limited to 'src/ufo-roof-plane-task.c')
-rw-r--r-- | src/ufo-roof-plane-task.c | 233 |
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); +} |