#ifndef ENC_CTRL_H
#define ENC_CTRL_H

/*!
  \file
  \brief エンコーダ制御

  エンコーダデバイスの管理を行う(SH7045F依存)

  \author Satofumi KAMIMURA

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

#include "robotParams.h"


/*!
  \brief エンコーダ値が増加したときのモータの回転方向を設定

  早い話、モータが CW に回転したときにエンコーダ値が減少する場合には ENC_CCW_PLUSE を用いる。
*/
enum EncDirSetting {
  ENC_CCW_TO_PLUSE = -1, /*!< CCW にモータが回転するとエンコーダ値が増加 */
  ENC_CW_TO_PLUSE = +1,	/*!< CW にモータが回転するとエンコーダ値が増加*/
};


#ifndef ENC_PULSE
#define ENC_PULSE 512 * 4	/*!< エンコーダの分解能 */
#endif


/*!
 \brief エンコーダ制御用の構造体

 エンコーダ制御に必要なパラメータ、状態を管理
*/
typedef struct {
  short diff;		/*!< 前回呼び出しからのエンコーダ値の変位量 */
  unsigned short prev;		/*!< 前回呼び出し時のエンコーダ値 */
  unsigned char id;		/*!< 使用するエンコーダのデバイスID */
  char enc_direction;	/*!< モータとエンコーダの取り付け方向の状態 */
  int total;			/*!< エンコーダ値の総移動量 */
} encInfo_t;


extern void initEnc(void);
extern void initEncInfo(const unsigned char id, encInfo_t *enc);
extern void updateEncDiff(encInfo_t *enc);
extern int getEncDiff(encInfo_t *enc);

#endif /* !ENC_CTRL_H */
