2013-12-30 00:21:53 +00:00
|
|
|
/*
|
|
|
|
* \brief Platform abstraction
|
|
|
|
* \date 2005-10-24
|
|
|
|
* \author Norman Feske <norman.feske@genode-labs.com>
|
|
|
|
*
|
|
|
|
* This interface specifies the target-platform-specific functions.
|
|
|
|
*/
|
|
|
|
|
|
|
|
/*
|
2017-02-20 12:23:52 +00:00
|
|
|
* Copyright (C) 2005-2017 Genode Labs GmbH
|
2013-12-30 00:21:53 +00:00
|
|
|
*
|
|
|
|
* This file is part of the Genode OS framework, which is distributed
|
2017-02-20 12:23:52 +00:00
|
|
|
* under the terms of the GNU Affero General Public License version 3.
|
2013-12-30 00:21:53 +00:00
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef _INCLUDE__SCOUT__PLATFORM_H_
|
|
|
|
#define _INCLUDE__SCOUT__PLATFORM_H_
|
|
|
|
|
|
|
|
#include <base/env.h>
|
2016-11-23 16:07:49 +00:00
|
|
|
#include <base/attached_dataspace.h>
|
2013-12-30 00:21:53 +00:00
|
|
|
#include <base/semaphore.h>
|
|
|
|
#include <timer_session/connection.h>
|
|
|
|
#include <input_session/input_session.h>
|
|
|
|
#include <input/event.h>
|
|
|
|
#include <scout/event.h>
|
|
|
|
#include <scout/canvas.h>
|
|
|
|
|
|
|
|
namespace Scout {
|
|
|
|
|
|
|
|
typedef Genode::Point<> Point;
|
|
|
|
typedef Genode::Area<> Area;
|
|
|
|
typedef Genode::Rect<> Rect;
|
|
|
|
|
|
|
|
class Platform;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
class Scout::Platform
|
|
|
|
{
|
|
|
|
private:
|
|
|
|
|
2016-11-23 16:07:49 +00:00
|
|
|
Genode::Env &_env;
|
|
|
|
Event_handler *_event_handler = nullptr;
|
|
|
|
|
|
|
|
int _mx = 0, _my = 0;
|
|
|
|
|
|
|
|
void _handle_event(Event const &ev)
|
2013-12-30 00:21:53 +00:00
|
|
|
{
|
2016-11-23 16:07:49 +00:00
|
|
|
if (_event_handler)
|
|
|
|
_event_handler->handle_event(ev);
|
|
|
|
}
|
2013-12-30 00:21:53 +00:00
|
|
|
|
|
|
|
|
2016-11-23 16:07:49 +00:00
|
|
|
/****************************
|
|
|
|
** Timer event processing **
|
|
|
|
****************************/
|
2013-12-30 00:21:53 +00:00
|
|
|
|
2016-11-23 16:07:49 +00:00
|
|
|
Timer::Connection _timer { _env };
|
2013-12-30 00:21:53 +00:00
|
|
|
|
2016-11-23 16:07:49 +00:00
|
|
|
unsigned long _ticks = 0;
|
2013-12-30 00:21:53 +00:00
|
|
|
|
2016-11-23 16:07:49 +00:00
|
|
|
void _handle_timer()
|
|
|
|
{
|
|
|
|
_ticks = _timer.elapsed_ms();
|
2013-12-30 00:21:53 +00:00
|
|
|
|
2016-11-23 16:07:49 +00:00
|
|
|
Event ev;
|
|
|
|
ev.assign(Event::TIMER, _mx, _my, 0);
|
2013-12-30 00:21:53 +00:00
|
|
|
|
2016-11-23 16:07:49 +00:00
|
|
|
_handle_event(ev);
|
|
|
|
}
|
2013-12-30 00:21:53 +00:00
|
|
|
|
2016-11-23 16:07:49 +00:00
|
|
|
Genode::Signal_handler<Platform> _timer_handler {
|
|
|
|
_env.ep(), *this, &Platform::_handle_timer };
|
2013-12-30 00:21:53 +00:00
|
|
|
|
|
|
|
|
2016-11-23 16:07:49 +00:00
|
|
|
/****************************
|
|
|
|
** Input event processing **
|
|
|
|
****************************/
|
|
|
|
|
|
|
|
Input::Session &_input;
|
2013-12-30 00:21:53 +00:00
|
|
|
|
2016-11-23 16:07:49 +00:00
|
|
|
Genode::Attached_dataspace _input_ds { _env.rm(), _input.dataspace() };
|
2013-12-30 00:21:53 +00:00
|
|
|
|
2016-11-23 16:07:49 +00:00
|
|
|
Input::Event * const _ev_buf = _input_ds.local_addr<Input::Event>();
|
2013-12-30 00:21:53 +00:00
|
|
|
|
2016-11-23 16:07:49 +00:00
|
|
|
bool _event_pending = 0;
|
|
|
|
|
|
|
|
void _handle_input()
|
2013-12-30 00:21:53 +00:00
|
|
|
{
|
2016-11-23 16:07:49 +00:00
|
|
|
if (_input.pending() == false) return;
|
|
|
|
|
|
|
|
for (int i = 0, num = _input.flush(); i < num; i++)
|
|
|
|
{
|
|
|
|
Event ev;
|
|
|
|
Input::Event e = _ev_buf[i];
|
|
|
|
|
|
|
|
_event_pending = i + 1 < num;
|
|
|
|
|
|
|
|
if (e.type() == Input::Event::RELEASE
|
|
|
|
|| e.type() == Input::Event::PRESS) {
|
|
|
|
_mx = e.ax();
|
|
|
|
_my = e.ay();
|
|
|
|
ev.assign(e.type() == Input::Event::PRESS ? Event::PRESS : Event::RELEASE,
|
|
|
|
e.ax(), e.ay(), e.code());
|
|
|
|
_handle_event(ev);
|
2013-12-30 00:21:53 +00:00
|
|
|
}
|
|
|
|
|
2016-11-23 16:07:49 +00:00
|
|
|
if (e.type() == Input::Event::MOTION) {
|
|
|
|
_mx = e.ax();
|
|
|
|
_my = e.ay();
|
|
|
|
ev.assign(Event::MOTION, e.ax(), e.ay(), e.code());
|
|
|
|
_handle_event(ev);
|
2013-12-30 00:21:53 +00:00
|
|
|
}
|
2016-11-23 16:07:49 +00:00
|
|
|
}
|
|
|
|
}
|
2013-12-30 00:21:53 +00:00
|
|
|
|
2016-11-23 16:07:49 +00:00
|
|
|
Genode::Signal_handler<Platform> _input_handler {
|
|
|
|
_env.ep(), *this, &Platform::_handle_input};
|
2013-12-30 00:21:53 +00:00
|
|
|
|
|
|
|
public:
|
|
|
|
|
2016-11-23 16:07:49 +00:00
|
|
|
Platform(Genode::Env &env, Input::Session &input)
|
|
|
|
: _env(env), _input(input) { }
|
2013-12-30 00:21:53 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Get timer ticks in miilliseconds
|
|
|
|
*/
|
2016-11-23 16:07:49 +00:00
|
|
|
unsigned long timer_ticks() const { return _ticks; }
|
2013-12-30 00:21:53 +00:00
|
|
|
|
|
|
|
/**
|
2016-11-23 16:07:49 +00:00
|
|
|
* Register event handler
|
2013-12-30 00:21:53 +00:00
|
|
|
*/
|
2016-11-23 16:07:49 +00:00
|
|
|
void event_handler(Event_handler &handler)
|
|
|
|
{
|
|
|
|
_event_handler = &handler;
|
2013-12-30 00:21:53 +00:00
|
|
|
|
2016-11-23 16:07:49 +00:00
|
|
|
_timer.sigh(_timer_handler);
|
|
|
|
_timer.trigger_periodic(40*1000);
|
|
|
|
|
|
|
|
_input.sigh(_input_handler);
|
|
|
|
}
|
|
|
|
|
|
|
|
bool event_pending() const { return _event_pending; }
|
2013-12-30 00:21:53 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
#endif /* _INCLUDE__SCOUT__PLATFORM_H_ */
|