cam: Add event loop
Add a simple event loop to the cam application and use it in the main() function, with an example of how to handle SIGINT to gracefully stop the loop. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
This commit is contained in:
parent
67d313240c
commit
71ef5532d9
4 changed files with 95 additions and 1 deletions
39
src/cam/event_loop.cpp
Normal file
39
src/cam/event_loop.cpp
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
/* SPDX-License-Identifier: GPL-2.0-or-later */
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2019, Google Inc.
|
||||||
|
*
|
||||||
|
* event_loop.cpp - cam - Event loop
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <libcamera/event_dispatcher.h>
|
||||||
|
|
||||||
|
#include "event_loop.h"
|
||||||
|
|
||||||
|
using namespace libcamera;
|
||||||
|
|
||||||
|
EventLoop::EventLoop(EventDispatcher *dispatcher)
|
||||||
|
: dispatcher_(dispatcher)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
EventLoop::~EventLoop()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
int EventLoop::exec()
|
||||||
|
{
|
||||||
|
exitCode_ = -1;
|
||||||
|
exit_.store(false, std::memory_order_release);
|
||||||
|
|
||||||
|
while (!exit_.load(std::memory_order_acquire))
|
||||||
|
dispatcher_->processEvents();
|
||||||
|
|
||||||
|
return exitCode_;
|
||||||
|
}
|
||||||
|
|
||||||
|
void EventLoop::exit(int code)
|
||||||
|
{
|
||||||
|
exitCode_ = code;
|
||||||
|
exit_.store(true, std::memory_order_release);
|
||||||
|
dispatcher_->interrupt();
|
||||||
|
}
|
34
src/cam/event_loop.h
Normal file
34
src/cam/event_loop.h
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
/* SPDX-License-Identifier: GPL-2.0-or-later */
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2019, Google Inc.
|
||||||
|
*
|
||||||
|
* event_loop.h - cam - Event loop
|
||||||
|
*/
|
||||||
|
#ifndef __CAM_EVENT_LOOP_H__
|
||||||
|
#define __CAM_EVENT_LOOP_H__
|
||||||
|
|
||||||
|
#include <atomic>
|
||||||
|
|
||||||
|
#include <libcamera/event_notifier.h>
|
||||||
|
|
||||||
|
namespace libcamera {
|
||||||
|
class EventDispatcher;
|
||||||
|
};
|
||||||
|
|
||||||
|
class EventLoop
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
EventLoop(libcamera::EventDispatcher *dispatcher);
|
||||||
|
~EventLoop();
|
||||||
|
|
||||||
|
int exec();
|
||||||
|
void exit(int code = 0);
|
||||||
|
|
||||||
|
private:
|
||||||
|
libcamera::EventDispatcher *dispatcher_;
|
||||||
|
|
||||||
|
std::atomic<bool> exit_;
|
||||||
|
int exitCode_;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* __CAM_EVENT_LOOP_H__ */
|
|
@ -7,10 +7,12 @@
|
||||||
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <map>
|
#include <map>
|
||||||
|
#include <signal.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include <libcamera/libcamera.h>
|
#include <libcamera/libcamera.h>
|
||||||
|
|
||||||
|
#include "event_loop.h"
|
||||||
#include "options.h"
|
#include "options.h"
|
||||||
|
|
||||||
using namespace libcamera;
|
using namespace libcamera;
|
||||||
|
@ -23,6 +25,14 @@ enum {
|
||||||
OptList = 'l',
|
OptList = 'l',
|
||||||
};
|
};
|
||||||
|
|
||||||
|
EventLoop *loop;
|
||||||
|
|
||||||
|
void signalHandler(int signal)
|
||||||
|
{
|
||||||
|
std::cout << "Exiting" << std::endl;
|
||||||
|
loop->exit();
|
||||||
|
}
|
||||||
|
|
||||||
static int parseOptions(int argc, char *argv[])
|
static int parseOptions(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
OptionsParser parser;
|
OptionsParser parser;
|
||||||
|
@ -79,7 +89,17 @@ int main(int argc, char **argv)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
loop = new EventLoop(cm->eventDispatcher());
|
||||||
|
|
||||||
|
struct sigaction sa = {};
|
||||||
|
sa.sa_handler = &signalHandler;
|
||||||
|
sigaction(SIGINT, &sa, nullptr);
|
||||||
|
|
||||||
|
ret = loop->exec();
|
||||||
|
|
||||||
|
delete loop;
|
||||||
|
|
||||||
cm->stop();
|
cm->stop();
|
||||||
|
|
||||||
return 0;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
cam_sources = files([
|
cam_sources = files([
|
||||||
|
'event_loop.cpp',
|
||||||
'main.cpp',
|
'main.cpp',
|
||||||
'options.cpp',
|
'options.cpp',
|
||||||
])
|
])
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue