// vi:ft=cpp
/*
 * \brief   Timed event scheduler interface
 * \date    2005-10-24
 * \author  Norman Feske <norman.feske@genode-labs.com>
 */

/*
 * Copyright (C) 2005-2009
 * Genode Labs, Feske & Helmuth Systementwicklung GbR
 *
 * This file is part of the Genode OS framework, which is distributed
 * under the terms of the GNU General Public License version 2.
 */

#pragma once

namespace Scout_gfx {

class Tick
{
public:

  typedef unsigned long Time;

private:

  /**
   * Tick object attributes
   */
  Time  _deadline;   /* next deadline          */
  Time  _period;     /* duration between ticks */
  Tick *_next;       /* next tick in tick list */
  int   _active;     /* set to one when active */

  /**
   * Enqueue tick into tick queue
   */
  void _enqueue();

  /**
   * Dequeue tick from tick queue (for destruction of Tick)
   */
  void _dequeue();

protected:

  /**
   * Function to be called on when deadline is reached
   *
   * This function must be implemented by a derived class.
   * If the return value is 1, the tick is scheduled again.
   */
  virtual int on_tick() = 0;

public:

  Tick() : _deadline(0), _period(0), _next(0), _active(0) {}

  virtual ~Tick() { _dequeue(); }

  /**
   * Schedule tick
   *
   * \param  tick period
   */
  void schedule(Time period);

  /**
   * Return the number of scheduled ticks
   */
  static int ticks_scheduled();

  /**
   * Handle ticks
   *
   * \param now  current time
   */
  static void handle(Time now);
};

}
