#ifndef RUN_CTRL_HUB_H
#define RUN_CTRL_HUB_H

/*!
  \file
  \brief 走行制御の通信を媒介するクラス
  
  \author Satofumi KAMIMURA
  
  $Id: runCtrlHub.h 439 2009-01-03 05:01:55Z satofumi $
*/

#include "connectionHub.h"


/*!
  \brief TCP/IP 先にて実ロボットを制御するための接続クラス
*/
class RunCtrlHub : public ConnectionHub {
  enum {
    WaitCommandHeader, WaitCommandPacket,
    WaitReplyHeader, WaitReplyPacket,
    PacketSize = 512,
    RetryMax = 3,
    DefaultTimeout = 100,
  };
  int mode;
  int require_size;
  int cmd_filled;
  int reply_filled;
  int retry_max;
  int retry_times;
  int recv_timeout;
  char command_recv[PacketSize];
  char reply_recv[PacketSize];
  unsigned long wait_begin;
  void sendRetryPacket(void);
  void disconnect(void);
  RunCtrlHub(void);

public:
  /*!
    \brief 接続待ちポート指定のコンストラクタ

    接続が行われると、device, baudrate へのシリアル接続が行われる

    \param port [i] 接続待ちポート
    \param device [i] 接続デバイス
    \param baudrate [i] 接続ボーレート
  */
  RunCtrlHub(int port, const char* device, long baudrate = 115200);
  ~RunCtrlHub(void);

  /*!
    \brief データの相互交換を行う

    \retval true 切断前状態
    \retval false 切断済み
  */
  bool update(void);
};

#endif /* !RUN_CTRL_HUB_H */
