#ifndef  HDT_H
#define  HDT_H

#include "types.h"

/* HDT = hardware description table */

typedef int     (*TestFunc) (DeviceSemantics);
typedef char    String6[7];
typedef char    String10[11];

/* prototypes */

int HDT_Validate(void);
void *HDT_FindEntry(TypeID,DeviceSemantics);
DeviceSemantics  HDT_FindSemantics(TypeID , int);
int   HDT_TypeCount(TypeID);
char* HDT_GetString(TypeID, DeviceSemantics);

/* DTL entry structure */
/*---------------------------------------------------------------------------------*/
typedef struct
{
  TypeID      group;
  String6     name;
  TestFunc    testfunc;
} DTL_entry_type;

/* HDT entry structure */
/*---------------------------------------------------------------------------------*/
typedef struct
{
  TypeID              type_id;
  DeviceSemantics     semantics;
  String6             device_name;
  void*               data_area;
} HDT_entry_type;

/* hardware description structures */
/*---------------------------------------------------------------------------------*/
typedef BYTE image_type[16*64];

typedef struct
{
  int     driver_version;
  int     tpu_channel;
  int     tpu_timer;
  int     pwm_period;
  BYTE*   out_pin_address;
  short   out_pin_fbit;
  short   out_pin_bbit;		/* only used in driver_version 2 */
  BYTE*   conv_table;       /* NULL if no conversion needed */
  short   invert_direction; /* only in driver_version > 2 */ 
} motor_type;

typedef struct
{
  int     driver_version;
  int     master_tpu_channel;
  int	  slave_tpu_channel;
  DeviceSemantics motor;	/* connected motor */
  unsigned int clicksPerMeter;  /* needed for VW-Interface and odometer */
  float   maxspeed;		/* (in m/s) only needed for VW-Interface */
} quad_type;


typedef struct
{
  int     driver_version;
  int     tpu_channel;
  int     tpu_timer;
  int     pwm_period;
  int     pwm_start;
  int     pwm_stop;
} servo_type;


typedef struct
{
  int     driver_version;
  int     tpu_channel;
  int     tpu_timer;
  short   transition;
} bump_type;

typedef struct
{
  int     driver_version;
  int     tpu_channel;
} ir_type;

typedef struct
{
  short   version;
  short   channel;
  void*   pc_port;
  short   pc_pin;
  void*   cal_port;
  short   cal_pin;
  void*   sdo_port;
  short   sdo_pin;
}compass_type;


typedef struct
{
  short   driver_version;
  short   tpu_channel;
  short   tpu_timer;
  short   tpu_priority;
  short   period_or_pulse;
  short   accumulate;
}ppwa_type;


#define TPU_LOW_PRIO  1
#define TPU_MID_PRIO  2
#define TPU_HIGH_PRIO 3

typedef struct
{
  short   version;
  short   channel;
  short   priority;
  /* new in version 1: */
  short   use_in_robios;
  int     type;
  int     length;
  int     tog_mask;
  int     inv_mask;
  int     mode;
  int     bufsize;
  int     delay;
  int     code_key1;
  int     code_key2;
  int     code_key3;
  int     code_key4;
} irtv_type;


typedef struct
{
  short   driver_version;
  short   tpu_channel;
  BYTE*   in_pin_address;
  short   in_pin_bit;
  short   in_logic;
  BYTE*   out_pin_address;
  short   out_pin_bit;
  short   out_logic;
  short*  dist_table;
} psd_type;

typedef struct
{
  int     version;
  short   low_limit;
  short   high_limit;
} battery_type;

typedef struct
{
  short   version;
  BYTE*   out_latch_address;
  short   nr_out;
  BYTE*   in_latch_address;
  short   nr_in;
} latch_type;


typedef struct
{
    int version;
    short robi_id;
    short remote_control;
    short interface;
    short serspeed;
    short imagemode;
    short protocol;
} remote_type;

typedef struct
{
  int     version;
  int     id;         
  int     serspeed;
  int     handshake;
  int     interface;
  int     auto_download;
  int     remote_control;   /* moved to remote_type but is still here for compatibility to old HDTs */
  int     cammode;
  int     battery_display;
  int     CPUclock;
  float   user_version;
  String10 name;
  unsigned char robi_id;    /* moved to remote_type but is still here for compatibility to old HDTs */
} info_type;

typedef struct
{
  short     version;
  short     rom_ws;
  short     ram_ws;
  short     lcd_ws;
  short     io_ws;
  short     serpar_ws;
} waitstate_type;


#define DIFFERENTIAL_DRIVE 0
#define ACKERMAN_DRIVE 1
#define ACKERMANN_DRIVE 1
#define SYNCHRO_DRIVE 2
#define TRICYCLE_DRIVE 3
#define OMNI_DRIVE 4

/* 2 wheel differential drive */
typedef struct
{
  DeviceSemantics quad_left;
  DeviceSemantics quad_right;
  float           wheel_dist; /* meters */
} diff_data;

/* acker_data is not used by now! It's just an example for an implementation
*/
typedef struct
{
  DeviceSemantics quad_steer;
  DeviceSemantics quad_drive;
  float           steerwheel_dist; /* meters */
  float           drivewheel_dist; /* meters */
  float                   axes_dist;       /* meters */
} acker_data;

/* 3 wheel synchro drive */
typedef struct
{
  DeviceSemantics quad_drive;
  DeviceSemantics quad_steer;
  DeviceSemantics quad_turn;
} synchro_data;

/* 4 wheel omni-directional Mechanum drive */
typedef struct
{
  DeviceSemantics quad_frontleft;
  DeviceSemantics quad_frontright;
  DeviceSemantics quad_backleft;
  DeviceSemantics quad_backright;
  float           wheel_dist; /* meters */
  float           axes_dist;  /* meters */
} omni_data;

/* to be compatible with old hdts */
#define vw_type vw_type_diff

typedef struct
{
  int     version;
  int     drive_type;
  diff_data drive_spec;
} vw_type_diff; 

typedef struct
{
  int     version;
  int     drive_type;
  acker_data drive_spec;
} vw_type_acker;

typedef struct
{
  int     version;
  int     drive_type;
  synchro_data drive_spec;
} vw_type_synchro;

typedef struct
{
  int       version;
  int       drive_type;
  omni_data drive_spec;
} vw_type_omni;

/****************************************************************************/
/*  Constantsdefinition                                                       */
/****************************************************************************/

/* for TPU */

#define TIMER1 1
#define TIMER2 2

/* for INFO */

#define PLATFORM 0
#define VEHICLE 1
#define WALKER 2
#define MK1 1
#define MK2 2
#define MK3 3
#define MK4 4
#define MK5 5
#define MK6 6

#define BATTERY_OFF 0
#define BATTERY_ON 1

#define NO_AUTOLOAD 0
#define AUTOLOAD 1
#define AUTOLOADSTART 3

/* Remote Parameter */
#define REMOTE_OFF 0
#define REMOTE_ON 1
#define REMOTE_PC 2
#define REMOTE_EYE 3

#define IMAGE_OFF 0
#define IMAGE_REDUCED 1
#define IMAGE_FULL 2

#define RADIO_METRIX    0
#define RADIO_BLUETOOTH 1
#define RADIO_WLAN      2

/* for PPWA driver*/
#define PPWA_PERIOD  0
#define PPWA_PULSE   1

/* for Bumper */
#define RISING  0x7
#define FALLING 0xB
#define EITHER  0xF

/* misc */

#define AH  0
#define AL  1

#define ON  1
#define OFF 0

/**************************************************************************/
/*  TypeID-constants, for type of device                                      */
/**************************************************************************/

#define UNKNOWN_TYPE   0
#define END_OF_HDT     -1
#define CHECKSUM       -2

#define MOTOR          -100
#define PSD            -200
#define SERVO          -300
#define QUAD           -400
#define BUMP           -500
#define IR             -600
#define VW             -700
#define BATTERY        -800
#define COMPASS        -900
#define IRTV           -1000
#define STARTIMAGE     -1100
#define STARTMELODY    -1200
#define REMOTE         -1300
#define PPWA           -1400
#define LATCH          -1500
#define INFO           -10000
#define WAIT           -11000
#define DATA           -30000

#define UNKNOWN_SEMANTICS    0
                                   
#endif

