libcamera: Add event notification infrastructure

Add three new classes, EventDispatcher, EventNotifier and Timer, that
define APIs for file descriptor event notification and timers. The
implementation of the EventDispatcher is meant to be provided to
libcamera by the application.

The event dispatcher is integrated twith the camera manager to implement
automatic registration of timers and events.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>
This commit is contained in:
Laurent Pinchart 2019-01-04 21:19:38 +02:00
parent d0fd42a4fd
commit 1a57bcb8d1
11 changed files with 495 additions and 1 deletions

View file

@ -14,6 +14,7 @@ namespace libcamera {
class Camera;
class DeviceEnumerator;
class EventDispatcher;
class PipelineHandler;
class CameraManager
@ -27,13 +28,19 @@ public:
static CameraManager *instance();
void setEventDispatcher(EventDispatcher *dispatcher);
EventDispatcher *eventDispatcher();
private:
CameraManager();
CameraManager(const CameraManager &) = delete;
void operator=(const CameraManager &) = delete;
~CameraManager();
DeviceEnumerator *enumerator_;
std::vector<PipelineHandler *> pipes_;
EventDispatcher *dispatcher_;
};
} /* namespace libcamera */

View file

@ -0,0 +1,33 @@
/* SPDX-License-Identifier: LGPL-2.1-or-later */
/*
* Copyright (C) 2019, Google Inc.
*
* event_dispatcher.h - Event dispatcher
*/
#ifndef __LIBCAMERA_EVENT_DISPATCHER_H__
#define __LIBCAMERA_EVENT_DISPATCHER_H__
#include <vector>
namespace libcamera {
class EventNotifier;
class Timer;
class EventDispatcher
{
public:
virtual ~EventDispatcher();
virtual void registerEventNotifier(EventNotifier *notifier) = 0;
virtual void unregisterEventNotifier(EventNotifier *notifier) = 0;
virtual void registerTimer(Timer *timer) = 0;
virtual void unregisterTimer(Timer *timer) = 0;
virtual void processEvents() = 0;
};
} /* namespace libcamera */
#endif /* __LIBCAMERA_EVENT_DISPATCHER_H__ */

View file

@ -0,0 +1,42 @@
/* SPDX-License-Identifier: LGPL-2.1-or-later */
/*
* Copyright (C) 2019, Google Inc.
*
* event_notifier.h - File descriptor event notifier
*/
#ifndef __LIBCAMERA_EVENT_NOTIFIER_H__
#define __LIBCAMERA_EVENT_NOTIFIER_H__
#include <libcamera/signal.h>
namespace libcamera {
class EventNotifier
{
public:
enum Type {
Read,
Write,
Exception,
};
EventNotifier(int fd, Type type);
virtual ~EventNotifier();
Type type() const { return type_; }
int fd() const { return fd_; }
bool enabled() const { return enabled_; }
void setEnabled(bool enable);
Signal<EventNotifier *> activated;
private:
int fd_;
Type type_;
bool enabled_;
};
} /* namespace libcamera */
#endif /* __LIBCAMERA_EVENT_NOTIFIER_H__ */

View file

@ -9,5 +9,6 @@
#include <libcamera/camera.h>
#include <libcamera/camera_manager.h>
#include <libcamera/event_dispatcher.h>
#endif /* __LIBCAMERA_LIBCAMERA_H__ */

View file

@ -1,8 +1,11 @@
libcamera_api = files([
'camera.h',
'camera_manager.h',
'event_dispatcher.h',
'event_notifier.h',
'libcamera.h',
'signal.h',
'timer.h',
])
install_headers(libcamera_api,

37
include/libcamera/timer.h Normal file
View file

@ -0,0 +1,37 @@
/* SPDX-License-Identifier: LGPL-2.1-or-later */
/*
* Copyright (C) 2019, Google Inc.
*
* timer.h - Generic timer
*/
#ifndef __LIBCAMERA_TIMER_H__
#define __LIBCAMERA_TIMER_H__
#include <cstdint>
#include <libcamera/signal.h>
namespace libcamera {
class Timer
{
public:
Timer();
void start(unsigned int msec);
void stop();
bool isRunning() const;
unsigned int interval() const { return interval_; }
uint64_t deadline() const { return deadline_; }
Signal<Timer *> timeout;
private:
unsigned int interval_;
uint64_t deadline_;
};
} /* namespace libcamera */
#endif /* __LIBCAMERA_TIMER_H__ */