summaryrefslogtreecommitdiff
path: root/src/dummy.c
diff options
context:
space:
mode:
authorNicolas Schodet2020-05-05 20:46:59 +0200
committerNicolas Schodet2020-05-06 21:26:34 +0200
commitfa9ed6c5d0d3ce282524d11f4e99f5b6916093ca (patch)
tree807ad6c35b9d5d24b1be1c998e4c96d9480a35d5 /src/dummy.c
parentb4703718ece48fc5a6f01ae6873fae7d8ca0b710 (diff)
Use a source in dummy driver, reorder includes
Diffstat (limited to 'src/dummy.c')
-rw-r--r--src/dummy.c73
1 files changed, 61 insertions, 12 deletions
diff --git a/src/dummy.c b/src/dummy.c
index 834f212..ab3c1bc 100644
--- a/src/dummy.c
+++ b/src/dummy.c
@@ -24,21 +24,27 @@
*/
#include "dummy.h"
+#include "device_manager.h"
+
struct dummy_device {
struct device device;
+ struct device_manager *dm;
int width;
int height;
int stride;
double exposure_ms;
double gain;
+ bool ready;
+ int n;
struct image *image;
+ GSource *source;
};
static char *
dummy_poll(void);
static struct device *
-dummy_open(GError **error);
+dummy_open(struct device_manager *dm, GError **error);
const struct device_driver dummy_device_driver = {
"Dummy camera",
@@ -63,6 +69,15 @@ static const struct device_info dummy_device_info = {
.resolution = dummy_device_info_resolution,
};
+static gboolean
+dummy_source_cb(gpointer user_data)
+{
+ struct dummy_device *mdev = user_data;
+ mdev->ready = true;
+ device_manager_driver_call_callback(mdev->dm);
+ return G_SOURCE_CONTINUE;
+}
+
static const struct device_info *
dummy_get_info(struct device *device)
{
@@ -102,7 +117,13 @@ dummy_start(struct device *device, GError **error)
g_return_val_if_fail(error == NULL || *error == NULL, false);
struct dummy_device *mdev = (struct dummy_device *) device;
g_assert(!mdev->image);
- /* Nothing to do. */
+ g_assert(!mdev->source);
+ /* Add source. */
+ mdev->source = g_timeout_source_new(1000 / 10);
+ g_source_set_callback(mdev->source, dummy_source_cb, mdev, NULL);
+ device_manager_driver_source_attach(mdev->dm, mdev->source);
+ /* Done. */
+ mdev->ready = true;
return true;
}
@@ -111,18 +132,38 @@ dummy_read(struct device *device, GError **error)
{
g_return_val_if_fail(error == NULL || *error == NULL, NULL);
struct dummy_device *mdev = (struct dummy_device *) device;
+ if (!mdev->ready)
+ return NULL;
+ mdev->ready = false;
/* Prepare image. */
- if (!mdev->image) {
+ if (!mdev->image)
mdev->image = image_new(mdev->width, mdev->height, mdev->stride,
IMAGE_FORMAT_XBGR32);
- uint8_t *p = mdev->image->pixels;
- for (int y = 0; y < mdev->height; y++) {
- for (int x = 0; x < mdev->width; x++) {
- *p++ = (x ^ y) & 0xffffff;
- *p++ = 0;
- *p++ = 0;
- *p++ = 0xff;
- }
+ uint8_t *p = mdev->image->pixels;
+ int mb = 0;
+ int mg = 0;
+ int mr = 0;
+ int n = mdev->n % (3 * 255);
+ if (n < 255) {
+ mb = 255 - n;
+ mg = n;
+ } else if (n < 510) {
+ n -= 255;
+ mg = 255 - n;
+ mr = n;
+ } else {
+ n -= 510;
+ mr = 255 - n;
+ mb = n;
+ }
+ mdev->n += 4;
+ for (int y = 0; y < mdev->height; y++) {
+ for (int x = 0; x < mdev->width; x++) {
+ int g = (x ^ y) & 0xff;
+ *p++ = g * mb / 255;
+ *p++ = g * mg / 255;
+ *p++ = g * mr / 255;
+ *p++ = 0xff;
}
}
image_ref(mdev->image);
@@ -137,6 +178,10 @@ dummy_stop(struct device *device, GError **error)
if (mdev->image) {
image_unref(mdev->image);
mdev->image = NULL;
+ g_assert(mdev->source);
+ g_source_destroy(mdev->source);
+ g_source_unref(mdev->source);
+ mdev->source = NULL;
}
return true;
}
@@ -160,7 +205,7 @@ dummy_poll(void)
}
static struct device *
-dummy_open(GError **error)
+dummy_open(struct device_manager *dm, GError **error)
{
g_return_val_if_fail(error == NULL || *error == NULL, NULL);
/* Create context. */
@@ -173,12 +218,16 @@ dummy_open(GError **error)
mdev->device.read = &dummy_read;
mdev->device.stop = &dummy_stop;
mdev->device.close = &dummy_close;
+ mdev->dm = dm;
mdev->width = 0;
mdev->height = 0;
mdev->stride = 0;
mdev->exposure_ms = dummy_device_info.exposure_default_ms;
mdev->gain = dummy_device_info.gain_default;
+ mdev->ready = false;
+ mdev->n = 0;
mdev->image = NULL;
+ mdev->source = NULL;
/* Done. */
return &mdev->device;
}