/* This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #pragma once #include #include #include class AP_WindVane_Backend; class AP_WindVane { friend class AP_WindVane_Backend; friend class AP_WindVane_Home; friend class AP_WindVane_Analog; friend class AP_WindVane_SITL; friend class AP_WindVane_ModernDevice; friend class AP_WindVane_Airspeed; friend class AP_WindVane_RPM; friend class AP_WindVane_NMEA; public: AP_WindVane(); /* Do not allow copies */ AP_WindVane(const AP_WindVane &other) = delete; AP_WindVane &operator=(const AP_WindVane&) = delete; static AP_WindVane *get_singleton(); // return true if wind vane is enabled bool enabled() const; // return true if wind speed is enabled bool wind_speed_enabled() const; // Initialize the Wind Vane object and prepare it for use void init(const AP_SerialManager& serial_manager); // update wind vane void update(); // get the apparent wind direction in body-frame in radians, 0 = head to wind float get_apparent_wind_direction_rad() const { return wrap_PI(_direction_apparent_ef - AP::ahrs().yaw); } // get the true wind direction in radians, 0 = wind coming from north float get_true_wind_direction_rad() const { return _direction_true; } // Return apparent wind speed float get_apparent_wind_speed() const { return _speed_apparent; } // Return true wind speed float get_true_wind_speed() const { return _speed_true; } // record home heading for use as wind direction if no sensor is fitted void record_home_heading() { _home_heading = AP::ahrs().yaw; } // start calibration routine bool start_direction_calibration(); bool start_speed_calibration(); // send mavlink wind message void send_wind(mavlink_channel_t chan); // parameter block static const struct AP_Param::GroupInfo var_info[]; private: // parameters AP_Int8 _direction_type; // type of windvane being used AP_Int8 _rc_in_no; // RC input channel to use AP_Int8 _dir_analog_pin; // analog pin connected to wind vane direction sensor AP_Float _dir_analog_volt_min; // minimum voltage read by windvane AP_Float _dir_analog_volt_max; // maximum voltage read by windvane AP_Float _dir_analog_bearing_offset; // angle offset when windvane is indicating a headwind, ie 0 degress relative to vehicle AP_Float _dir_analog_deadzone; // analog pot deadzone in degrees AP_Float _dir_filt_hz; // vane Low pass filter frequency AP_Int8 _calibration; // enter calibration AP_Float _dir_speed_cutoff; // vane cutoff wind speed AP_Int8 _speed_sensor_type; // wind speed sensor type AP_Int8 _speed_sensor_speed_pin; // speed sensor analog pin for reading speed AP_Float _speed_sensor_temp_pin; // speed sensor analog pin for reading temp, -1 if disable AP_Float _speed_sensor_voltage_offset; // analog speed zero wind voltage offset AP_Float _speed_filt_hz; // speed sensor low pass filter frequency AP_WindVane_Backend *_direction_driver; AP_WindVane_Backend *_speed_driver; // update wind speed sensor void update_apparent_wind_speed(); // update apparent wind direction void update_apparent_wind_direction(); // calculate true wind speed and direction from apparent wind void update_true_wind_speed_and_direction(); // wind direction variables float _direction_apparent_ef; // wind's apparent direction in radians (0 = ahead of vehicle) float _direction_true; // wind's true direction in radians (0 = North) // wind speed variables float _speed_apparent; // wind's apparent speed in m/s float _speed_true; // wind's true estimated speed in m/s // heading in radians recorded when vehicle was armed float _home_heading; enum WindVaneType { WINDVANE_NONE = 0, WINDVANE_HOME_HEADING = 1, WINDVANE_PWM_PIN = 2, WINDVANE_ANALOG_PIN = 3, WINDVANE_NMEA = 4, WINDVANE_SITL = 10 }; enum Speed_type { WINDSPEED_NONE = 0, WINDSPEED_AIRSPEED = 1, WINDVANE_WIND_SENSOR_REV_P = 2, WINDSPEED_RPM = 3, WINDSPEED_NMEA = 4, WINDSPEED_SITL = 10 }; static AP_WindVane *_singleton; }; namespace AP { AP_WindVane *windvane(); };