#ifndef TICKS_CTRL_INTERFACE_H
#define TICKS_CTRL_INTERFACE_H

/*!
  \file
  \brief モジュール時刻の同期管理インターフェース

  \author Satofumi KAMIMURA

  $Id: ticksCtrlInterface.h 286 2008-10-20 09:40:22Z satofumi $
*/

class CoordinateCtrl;


/*!
  \brief モジュール時刻の同期管理
*/
class TicksCtrlInterface {
  void adjustChildCrdsTicks(TicksCtrlInterface* root, long hostDiff,
			    CoordinateCtrl* subRoot);

protected:

  /*!
    \brief 時刻合わせ時のパラメータ
  */
  class ticksInfo_t {
  public:
    ticksInfo_t(void) : tryTimes_shift(1) {}
    ~ticksInfo_t(void) {}
    long setDiff;		/*!< 設定差分 */
    long moduleDiff;		/*!< モジュールとの差分 */
    int tryTimes_shift;		/*!< 試行回数へのシフト幅 */
  };

  /*!
    \brief ホスト側のタイムスタンプを取得
  */
  virtual unsigned long getHostTicks(void) = 0;

  /*!
    \brief ターゲット側のタイムスタンプを取得
  */
  virtual unsigned long getModuleTicks(unsigned long rawTicks);

  /*!
    \brief 時刻合わせ情報の取得
  */
  virtual ticksInfo_t& getTicksInfo(void) = 0;

  /*!
    \brief 時刻合わせモードへの遷移
  */
  virtual void beginTimeAdjust(void) = 0;

  /*!
    \brief モジュールのタイムスタンプ取得

    \return モジュールが返すタイムスタンプ
  */
  virtual unsigned long getModuleRawTicks(void) = 0;

  /*!
    \brief 時刻合わせモードの終了
  */
  virtual void endTimeAdjust(void) = 0;

 public:
  virtual ~TicksCtrlInterface(void) {}

  /*!
    \brief モジュールのタイムスタンプを取得

    \todo 説明を記述

    \retval モジュールのタイムスタンプ [msec]
  */
  unsigned long getModuleTicks(void);

  /*!
    \brief モジュールのタイムスタンプを指定

    モジュールのタイムスタンプを指定値に設定する

    \param setTicks [i] モジュールに指定するタイムスタンプ [msec]

    \todo サンプルコード
  */
  virtual void adjustOwnTicks(unsigned long setTicks);

  /*!
    \brief モジュールツリーのタイムスタンプを指定

    モジュールツリーのタイムスタンプを指定値に設定する

    \param setTicks [i] モジュールに指定するタイムスタンプ [msec]

    \todo サンプルコード
  */
  void adjustSubTreeTicks(unsigned long setTicks);
};

#endif /* !TICKS_CTRL_INTERFACE_H */
