#ifndef JEEPS_GPSPROT_H_INCLUDED_
#define JEEPS_GPSPROT_H_INCLUDED_

#ifndef COMMON
#define COMMON extern
#endif

#include "jeeps/gps.h"

/*
 *  Link protocols
 */

struct LINKDATA {
  US Pid_Protocol_Array;
  US Pid_Product_Rqst;
  US Pid_Product_Data;
  US Pid_Ext_Product_Data;

  US Pid_Ack_Byte;
  US Pid_Command_Data;
  US Pid_Xfer_Cmplt;
  US Pid_Date_Time_Data;
  US Pid_Position_Data;
  US Pid_Prx_Wpt_Data;
  US Pid_Nak_Byte;
  US Pid_Records;
  US Pid_Rte_Hdr;
  US Pid_Rte_Wpt_Data;
  US Pid_Almanac_Data;
  US Pid_Trk_Data;
  US Pid_Wpt_Data;
  US Pid_Pvt_Data;
  US Pid_Rte_Link_Data;
  US Pid_Trk_Hdr;

  US Pid_FlightBook_Record;
  US Pid_Lap;
  US Pid_Wpt_Cat;
  US Pid_Run;
  US Pid_Workout;
  US Pid_Workout_Occurrence;
  US Pid_Fitness_User_Profile;
  US Pid_Workout_Limits;
  US Pid_Course;
  US Pid_Course_Lap;
  US Pid_Course_Point;
  US Pid_Course_Trk_Hdr;
  US Pid_Course_Trk_Data;
  US Pid_Course_Limits;
  US Pid_Trk2_Hdr; /*Undocumented*/
};





/*
 * Command types
 */

#define pA010 10
#define pA011 11

COMMON int32_t gps_device_command;


struct COMMANDDATA {
  US Cmnd_Abort_Transfer;
  US Cmnd_Transfer_Alm;
  US Cmnd_Transfer_Posn;
  US Cmnd_Transfer_Prx;
  US Cmnd_Transfer_Rte;
  US Cmnd_Transfer_Time;
  US Cmnd_Transfer_Trk;
  US Cmnd_Transfer_Wpt;
  US Cmnd_Turn_Off_Pwr;
  US Cmnd_Start_Pvt_Data;
  US Cmnd_Stop_Pvt_Data;
  US Cmnd_FlightBook_Transfer;
  US Cmnd_Transfer_Laps;
  US Cmnd_Transfer_Wpt_Cats;
  US Cmnd_Transfer_Runs;
  US Cmnd_Transfer_Workouts;
  US Cmnd_Transfer_Workout_Occurrences;
  US Cmnd_Transfer_Fitness_User_Profile;
  US Cmnd_Transfer_Workout_Limits;
  US Cmnd_Transfer_Courses;
  US Cmnd_Transfer_Course_Laps;
  US Cmnd_Transfer_Course_Points;
  US Cmnd_Transfer_Course_Tracks;
  US Cmnd_Transfer_Course_Limits;
};




/*
 * Waypoint Transfer Protocol
 */
#define pA100 100
COMMON int32_t gps_waypt_transfer;

/*
 * Waypoint category transfer protocol
 */
#define pA101 101
COMMON int32_t gps_category_transfer;

/*
 * Route Transfer Protocol
 */
#define pA200 200
#define pA201 201
COMMON int32_t gps_route_transfer;

/*
 * Track Log Transfer Protocol
 */
#define pA300 300
#define pA301 301
#define pA302 302
#define pA304 304
COMMON int32_t gps_trk_transfer;

/*
 *  Proximity Waypoint Transfer Protocol
 */
#define pA400 400
COMMON int32_t gps_prx_waypt_transfer;

/*
 *  Almanac Transfer Protocol
 */
#define pA500 500
COMMON int32_t gps_almanac_transfer;


/*
 *  Date Time Transfer
 */
#define pA600 600
COMMON int32_t gps_date_time_transfer;

/*
 *  FlightBook Transfer Protocol
 */
#define pA650 650
/*Not implemented */

/*
 *  Position
 */
#define pA700 700
COMMON int32_t gps_position_transfer;


/*
 *  Pvt
 */
#define pA800 800
COMMON int32_t gps_pvt_transfer;

/*
 * Lap Data Transfer
 */
#define pA906 906
COMMON int32_t gps_lap_transfer;

/*
 * Various fitness related
 */
#define pA1000 1000
COMMON int32_t gps_run_transfer;
#define pA1002 1002
COMMON int32_t gps_workout_transfer;
#define pA1004 1004
COMMON int32_t gps_user_profile_transfer;
#define pA1005 1005
COMMON int32_t gps_workout_limits_transfer;
#define pA1006 1006
COMMON int32_t gps_course_transfer;
#define pA1007 1007
COMMON int32_t gps_course_lap_transfer;
#define pA1008 1008
COMMON int32_t gps_course_point_transfer;
#define pA1009 1009
COMMON int32_t gps_course_limits_transfer;
#define pA1012 1012
COMMON int32_t gps_course_trk_transfer;

/*
 * Waypoint D Type
 */
#define pD100 100
#define pD101 101
#define pD102 102
#define pD103 103
#define pD104 104
#define pD105 105
#define pD106 106
#define pD107 107
#define pD108 108
#define pD109 109
#define pD110 110
#define pD150 150
#define pD151 151
#define pD152 152
#define pD154 154
#define pD155 155

COMMON int32_t gps_rte_type;
COMMON int32_t gps_waypt_type;

/*
 * Waypoint category types
 */
#define pD120 120
COMMON int32_t gps_category_type;

/*
 * Rte Header Type
 */
#define pD200 200
#define pD201 201
#define pD202 202
COMMON int32_t gps_rte_hdr_type;


/*
 * Rte Link Type
 */
#define pD210 210
COMMON int32_t gps_rte_link_type;


/*
 *  Trk Point Type
 */
#define pD300 300
#define pD301 301
#define pD302 302
#define pD303 303
#define pD304 304
COMMON int32_t gps_trk_type;
COMMON int32_t gps_run_crs_trk_type;


/*
 *  Trk Header Type
 */
#define pD310 310
#define pD311 311
#define pD312 312
COMMON int32_t gps_trk_hdr_type;
COMMON int32_t gps_run_crs_trk_hdr_type;



/*
 * Prx Wpt Type
 */
#define pD400 400
#define pD403 403
#define pD450 450

COMMON int32_t gps_prx_waypt_type;


/*
 * Almanac Type
 */
#define pD500 500
#define pD501 501
#define pD550 550
#define pD551 551

COMMON int32_t gps_almanac_type;


/*
 * Date Time Type
 */
#define pD600 600

COMMON int32_t gps_date_time_type;



/*
 * Position Type
 */
#define pD700 700

COMMON int32_t gps_position_type;



/*
 * Pvt Data Type
 */
#define pD800 800

COMMON int32_t gps_pvt_type;

/*
 * Lap Data Type
 */
#define pD906 906
#define pD1001 1001
#define pD1011 1011
#define pD1015 1015

COMMON int32_t gps_lap_type;

/*
 * Various fitness related
 */
#define pD1000 1000
#define pD1009 1009
#define pD1010 1010
COMMON int32_t gps_run_type;
#define pD1002 1002
#define pD1008 1008
COMMON int32_t gps_workout_type;
#define pD1003 1003
COMMON int32_t gps_workout_occurrence_type;
#define pD1004 1004
COMMON int32_t gps_user_profile_type;
#define pD1005 1005
COMMON int32_t gps_workout_limits_type;
#define pD1006 1006
COMMON int32_t gps_course_type;
#define pD1007 1007
COMMON int32_t gps_course_lap_type;
#define pD1012 1012
COMMON int32_t gps_course_point_type;
#define pD1013 1013
COMMON int32_t gps_course_limits_type;

/*
 * Link protocol type
 */
#define pL000 0
#define pL001 1
#define pL002 2

COMMON int32_t gps_link_type;



struct GPS_MODEL_PROTOCOL {
  US    id;
  int32_t link;
  int32_t command;
  int32_t wayptt;
  int32_t wayptd;
  int32_t rtea;
  int32_t rted0;
  int32_t rted1;
  int32_t trka;
  int32_t trkd;
  int32_t prxa;
  int32_t prxd;
  int32_t alma;
  int32_t almd;
};

US     GPS_Protocol_Version_Change(US id, US version);
COMMON int32_t GPS_Protocol_Table_Set(US id);
void   GPS_Protocol_Error(US tag, US data);
void   GPS_Unknown_Protocol_Print();


#endif // JEEPS_GPSPROT_H_INCLUDED_
