// -*- tab-width: 4; Mode: C++; c-basic-offset: 4; indent-tabs-mode: nil -*-

#ifndef PARAMETERS_H
#define PARAMETERS_H

#include <AP_Common.h>

// Global parameter class.
//
class Parameters {
public:

    /*
      The value of k_format_version determines whether the existing
      eeprom data is considered valid. You should only change this
      value under the following circumstances:

     1) the meaning of an existing eeprom parameter changes

     2) the value of an existing k_param_* enum value changes

     Adding a new parameter should _not_ require a change to
     k_format_version except under special circumstances. If you
     change it anyway then all ArduPlane users will need to reload all
     their parameters. We want that to be an extremely rare
     thing. Please do not just change it "just in case".

     To determine if a k_param_* value has changed, use the rules of
     C++ enums to work out the value of the neighboring enum
     values. If you don't know the C++ enum rules then please ask for
     help.
    */

    //////////////////////////////////////////////////////////////////
    // STOP!!! DO NOT CHANGE THIS VALUE UNTIL YOU FULLY UNDERSTAND THE
    // COMMENTS ABOVE. IF UNSURE, ASK ANOTHER DEVELOPER!!!
    static const uint16_t k_format_version = 13;
    //////////////////////////////////////////////////////////////////


	// The parameter software_type is set up solely for ground station use
	// and identifies the software type (eg ArduPilotMega versus ArduCopterMega)
	// GCS will interpret values 0-9 as ArduPilotMega.  Developers may use
	// values within that range to identify different branches.
	//
    static const uint16_t k_software_type = 0;		// 0 for APM trunk

    enum {
        // Layout version number, always key zero.
        //
        k_param_format_version = 0,
		k_param_software_type,

        // Misc
        //
        k_param_auto_trim,
        k_param_switch_enable,
        k_param_log_bitmask,
        k_param_pitch_trim,
        k_param_mix_mode,
        k_param_reverse_elevons,
        k_param_reverse_ch1_elevon,
        k_param_reverse_ch2_elevon,
        k_param_flap_1_percent,
        k_param_flap_1_speed,
        k_param_flap_2_percent,
        k_param_flap_2_speed,
        k_param_num_resets,
        k_param_log_last_filenumber,		// *** Deprecated - remove with next eeprom number change
        k_param_reset_switch_chan,
        k_param_manual_level,


		// 110: Telemetry control
		//
		k_param_gcs0 = 110, // stream rates for port0
		k_param_gcs3,       // stream rates for port3
		k_param_sysid_this_mav,
		k_param_sysid_my_gcs,
        k_param_serial3_baud,

        // 120: Fly-by-wire control
        //
        k_param_flybywire_airspeed_min = 120,
        k_param_flybywire_airspeed_max,
        k_param_FBWB_min_altitude,  // 0=disabled, minimum value for altitude in cm (for first time try 30 meters = 3000 cm)

        //
        // 130: Sensor parameters
        //
        k_param_imu = 130,  // sensor calibration
        k_param_altitude_mix,
        k_param_airspeed_ratio,

        // ground_pressure and ground_temperature removed
        // do not re-use 133 and 134 unless format_version
        // is changed

		k_param_compass_enabled = 135,
		k_param_compass,
		k_param_battery_monitoring,
		k_param_volt_div_ratio,
		k_param_curr_amp_per_volt,
		k_param_input_voltage,
		k_param_pack_capacity,
        k_param_airspeed_offset,
		k_param_sonar_enabled,
		k_param_airspeed_enabled,
        k_param_ahrs,  // AHRS group
		k_param_airspeed_use,
        k_param_barometer,   // barometer ground calibration

        //
        // 150: Navigation parameters
        //
        k_param_crosstrack_gain = 150,
        k_param_crosstrack_entry_angle,
        k_param_roll_limit,
        k_param_pitch_limit_max,
        k_param_pitch_limit_min,
        k_param_airspeed_cruise,
        k_param_RTL_altitude,
        k_param_inverted_flight_ch,
        k_param_min_gndspeed,


        //
        // Camera parameters
        //
        k_param_camera,

        //
        // 170: Radio settings
        //
        k_param_channel_roll = 170,
        k_param_channel_pitch,
        k_param_channel_throttle,
        k_param_channel_rudder,
        k_param_rc_5,
        k_param_rc_6,
        k_param_rc_7,
        k_param_rc_8,

        k_param_throttle_min,
        k_param_throttle_max,
        k_param_throttle_fs_enabled,
        k_param_throttle_fs_value,
        k_param_throttle_cruise,

        k_param_short_fs_action,
        k_param_long_fs_action,
		k_param_gcs_heartbeat_fs_enabled,
        k_param_throttle_slewrate,

        //
        // 200: Feed-forward gains
        //
        k_param_kff_pitch_compensation = 200,
        k_param_kff_rudder_mix,
        k_param_kff_pitch_to_throttle,
        k_param_kff_throttle_to_pitch,

        //
        // 210: flight modes
        //
        k_param_flight_mode_channel = 210,
        k_param_flight_mode1,
        k_param_flight_mode2,
        k_param_flight_mode3,
        k_param_flight_mode4,
        k_param_flight_mode5,
        k_param_flight_mode6,

        //
        // 220: Waypoint data
        //
        k_param_waypoint_mode = 220,
        k_param_command_total,
        k_param_command_index,
        k_param_waypoint_radius,
        k_param_loiter_radius,
        k_param_fence_action,
        k_param_fence_total,
        k_param_fence_channel,
        k_param_fence_minalt,
        k_param_fence_maxalt,

        //
        // 240: PID Controllers
        //
        // Heading-to-roll PID:
        // heading error from command to roll command deviation from trim
        // (bank to turn strategy)
        //
        k_param_pidNavRoll = 240,

        // Roll-to-servo PID:
        // roll error from command to roll servo deviation from trim
        // (tracks commanded bank angle)
        //
        k_param_pidServoRoll,

        //
        // Pitch control
        //
        // Pitch-to-servo PID:
        // pitch error from command to pitch servo deviation from trim
        // (front-side strategy)
        //
        k_param_pidServoPitch,

        // Airspeed-to-pitch PID:
        // airspeed error from command to pitch servo deviation from trim
        // (back-side strategy)
        //
        k_param_pidNavPitchAirspeed,

        //
        // Yaw control
        //
        // Yaw-to-servo PID:
        // yaw rate error from command to yaw servo deviation from trim
        // (stabilizes dutch roll)
        //
        k_param_pidServoRudder,

        //
        // Throttle control
        //
        // Energy-to-throttle PID:
        // total energy error from command to throttle servo deviation from trim
        // (throttle back-side strategy alternative)
        //
        k_param_pidTeThrottle,

        // Altitude-to-pitch PID:
        // altitude error from command to pitch servo deviation from trim
        // (throttle front-side strategy alternative)
        //
        k_param_pidNavPitchAltitude,

        // 254,255: reserved
    };

    AP_Int16    format_version;
	AP_Int8		software_type;

	// Telemetry control
	//
	AP_Int16		sysid_this_mav;
	AP_Int16		sysid_my_gcs;
    AP_Int8			serial3_baud;

    // Feed-forward gains
    //
    AP_Float    kff_pitch_compensation;
    AP_Float    kff_rudder_mix;
    AP_Float    kff_pitch_to_throttle;
    AP_Float    kff_throttle_to_pitch;

    // Crosstrack navigation
    //
    AP_Float    crosstrack_gain;
    AP_Int16    crosstrack_entry_angle;

    // Estimation
    //
    AP_Float    altitude_mix;
    AP_Float    airspeed_ratio;
	AP_Int16	airspeed_offset;

    // Waypoints
    //
    AP_Int8     waypoint_mode;
    AP_Int8     command_total;
    AP_Int8     command_index;
    AP_Int8     waypoint_radius;
    AP_Int8     loiter_radius;
#if GEOFENCE_ENABLED == ENABLED
    AP_Int8     fence_action;
    AP_Int8     fence_total;
    AP_Int8     fence_channel;
    AP_Int16    fence_minalt; // meters
    AP_Int16    fence_maxalt; // meters
#endif

    // Fly-by-wire
    //
    AP_Int8     flybywire_airspeed_min;
    AP_Int8     flybywire_airspeed_max;
    AP_Int16    FBWB_min_altitude;

    // Throttle
    //
    AP_Int8     throttle_min;
    AP_Int8     throttle_max;
    AP_Int8     throttle_slewrate;
	AP_Int8     throttle_fs_enabled;
    AP_Int16    throttle_fs_value;
    AP_Int8     throttle_cruise;

	// Failsafe
    AP_Int8     short_fs_action;
    AP_Int8     long_fs_action;
	AP_Int8		gcs_heartbeat_fs_enabled;

    // Flight modes
    //
    AP_Int8     flight_mode_channel;
    AP_Int8     flight_mode1;
    AP_Int8     flight_mode2;
    AP_Int8     flight_mode3;
    AP_Int8     flight_mode4;
    AP_Int8     flight_mode5;
    AP_Int8     flight_mode6;

    // Navigational maneuvering limits
    //
    AP_Int16    roll_limit;
    AP_Int16    pitch_limit_max;
    AP_Int16    pitch_limit_min;

    // Misc
    //
    AP_Int8     auto_trim;
    AP_Int8     switch_enable;
    AP_Int8     mix_mode;
    AP_Int8     reverse_elevons;
    AP_Int8     reverse_ch1_elevon;
    AP_Int8     reverse_ch2_elevon;
    AP_Int16    num_resets;
    AP_Int16    log_bitmask;
    AP_Int16	log_last_filenumber;		// *** Deprecated - remove with next eeprom number change
    AP_Int8		reset_switch_chan;
    AP_Int8		manual_level;
    AP_Int16    airspeed_cruise;
    AP_Int16    min_gndspeed;
    AP_Int16    pitch_trim;
    AP_Int16    RTL_altitude;
    AP_Int8		compass_enabled;
    AP_Int16    angle_of_attack;
    AP_Int8		battery_monitoring;	// 0=disabled, 3=voltage only, 4=voltage and current
    AP_Float	volt_div_ratio;
    AP_Float	curr_amp_per_volt;
    AP_Float	input_voltage;
	AP_Int16	pack_capacity;		// Battery pack capacity less reserve
    AP_Int8		inverted_flight_ch; // 0=disabled, 1-8 is channel for inverted flight trigger
    AP_Int8		sonar_enabled;
    AP_Int8		airspeed_enabled;
    AP_Int8		airspeed_use;
    AP_Int8		flap_1_percent;
    AP_Int8		flap_1_speed;
    AP_Int8		flap_2_percent;
    AP_Int8		flap_2_speed;

	// Camera
#if CAMERA == ENABLED
    AP_Camera		camera;
#endif

    // RC channels
    RC_Channel  channel_roll;
    RC_Channel  channel_pitch;
    RC_Channel  channel_throttle;
    RC_Channel  channel_rudder;
	RC_Channel_aux	rc_5;
	RC_Channel_aux	rc_6;
	RC_Channel_aux	rc_7;
	RC_Channel_aux	rc_8;

    // PID controllers
    //
    PID         pidNavRoll;
    PID         pidServoRoll;
    PID         pidServoPitch;
    PID         pidNavPitchAirspeed;
    PID         pidServoRudder;
    PID         pidTeThrottle;
    PID         pidNavPitchAltitude;

    Parameters() :
	// variable				default
	//----------------------------------------
        format_version          (k_format_version),
        software_type			(k_software_type),

        sysid_this_mav			(MAV_SYSTEM_ID),
        sysid_my_gcs			(255),
        serial3_baud			(SERIAL3_BAUD/1000),

        kff_pitch_compensation  (PITCH_COMP),
        kff_rudder_mix          (RUDDER_MIX),
        kff_pitch_to_throttle   (P_TO_T),
        kff_throttle_to_pitch   (T_TO_P),

        crosstrack_gain         (XTRACK_GAIN_SCALED),
        crosstrack_entry_angle  (XTRACK_ENTRY_ANGLE_CENTIDEGREE),

        altitude_mix            (ALTITUDE_MIX),
        airspeed_ratio          (AIRSPEED_RATIO),
        airspeed_offset			(0),

        /* XXX waypoint_mode missing here */
        command_total           (0),
        command_index           (0),
        waypoint_radius         (WP_RADIUS_DEFAULT),
        loiter_radius           (LOITER_RADIUS_DEFAULT),

#if GEOFENCE_ENABLED == ENABLED
        fence_action            (0),
        fence_total             (0),
        fence_channel           (0),
        fence_minalt            (0),
        fence_maxalt            (0),
#endif

        flybywire_airspeed_min  (AIRSPEED_FBW_MIN),
        flybywire_airspeed_max  (AIRSPEED_FBW_MAX),

        throttle_min            (THROTTLE_MIN),
        throttle_max            (THROTTLE_MAX),
        throttle_slewrate		(THROTTLE_SLEW_LIMIT),
        throttle_fs_enabled   	(THROTTLE_FAILSAFE),
        throttle_fs_value 		(THROTTLE_FS_VALUE),
        throttle_cruise         (THROTTLE_CRUISE),

        short_fs_action			(SHORT_FAILSAFE_ACTION),
        long_fs_action			(LONG_FAILSAFE_ACTION),
        gcs_heartbeat_fs_enabled(GCS_HEARTBEAT_FAILSAFE),

        flight_mode_channel     (FLIGHT_MODE_CHANNEL),
        flight_mode1            (FLIGHT_MODE_1),
        flight_mode2            (FLIGHT_MODE_2),
        flight_mode3            (FLIGHT_MODE_3),
        flight_mode4            (FLIGHT_MODE_4),
        flight_mode5            (FLIGHT_MODE_5),
        flight_mode6            (FLIGHT_MODE_6),

        roll_limit              (HEAD_MAX_CENTIDEGREE),
        pitch_limit_max         (PITCH_MAX_CENTIDEGREE),
        pitch_limit_min         (PITCH_MIN_CENTIDEGREE),

        auto_trim               (AUTO_TRIM),
        switch_enable           (REVERSE_SWITCH),
        mix_mode                (ELEVON_MIXING),
        reverse_elevons         (ELEVON_REVERSE),
        reverse_ch1_elevon      (ELEVON_CH1_REVERSE),
        reverse_ch2_elevon      (ELEVON_CH2_REVERSE),
        num_resets              (0),
        log_bitmask             (DEFAULT_LOG_BITMASK),
        log_last_filenumber     (0),
        reset_switch_chan		(0),
        manual_level			(MANUAL_LEVEL),
        airspeed_cruise         (AIRSPEED_CRUISE_CM),
        min_gndspeed            (MIN_GNDSPEED_CM),
        pitch_trim              (0),
        RTL_altitude            (ALT_HOLD_HOME_CM),
        FBWB_min_altitude       (ALT_HOLD_FBW_CM),
        compass_enabled			(MAGNETOMETER),
        flap_1_percent			(FLAP_1_PERCENT),
        flap_1_speed			(FLAP_1_SPEED),
        flap_2_percent			(FLAP_2_PERCENT),
        flap_2_speed			(FLAP_2_SPEED),


        battery_monitoring 		(DISABLED),
        volt_div_ratio			(VOLT_DIV_RATIO),
        curr_amp_per_volt		(CURR_AMP_PER_VOLT),
        input_voltage			(INPUT_VOLTAGE),
        pack_capacity	 		(HIGH_DISCHARGE),
        inverted_flight_ch      (0),
        sonar_enabled			(SONAR_ENABLED),
        airspeed_enabled		(AIRSPEED_SENSOR),
        airspeed_use			(1),

        // PID controller    initial P        initial I        initial D        initial imax
        //-----------------------------------------------------------------------------------
        pidNavRoll          (NAV_ROLL_P,      NAV_ROLL_I,      NAV_ROLL_D,      NAV_ROLL_INT_MAX_CENTIDEGREE),
        pidServoRoll        (SERVO_ROLL_P,    SERVO_ROLL_I,    SERVO_ROLL_D,    SERVO_ROLL_INT_MAX_CENTIDEGREE),
        pidServoPitch       (SERVO_PITCH_P,   SERVO_PITCH_I,   SERVO_PITCH_D,   SERVO_PITCH_INT_MAX_CENTIDEGREE),
        pidNavPitchAirspeed (NAV_PITCH_ASP_P, NAV_PITCH_ASP_I, NAV_PITCH_ASP_D, NAV_PITCH_ASP_INT_MAX_CMSEC),
        pidServoRudder      (SERVO_YAW_P,     SERVO_YAW_I,     SERVO_YAW_D,     SERVO_YAW_INT_MAX),
        pidTeThrottle       (THROTTLE_TE_P,   THROTTLE_TE_I,   THROTTLE_TE_D,   THROTTLE_TE_INT_MAX),
        pidNavPitchAltitude (NAV_PITCH_ALT_P, NAV_PITCH_ALT_I, NAV_PITCH_ALT_D, NAV_PITCH_ALT_INT_MAX_CM)
        {}
};

#endif // PARAMETERS_H