/* 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 #include // Maximum number of RPM measurement instances available on this platform #define RPM_MAX_INSTANCES 2 class AP_RPM_Backend; class AP_RPM { friend class AP_RPM_Backend; public: AP_RPM(); /* Do not allow copies */ AP_RPM(const AP_RPM &other) = delete; AP_RPM &operator=(const AP_RPM&) = delete; // RPM driver types enum RPM_Type { RPM_TYPE_NONE = 0, RPM_TYPE_PWM = 1, RPM_TYPE_PIN = 2 }; // The RPM_State structure is filled in by the backend driver struct RPM_State { uint8_t instance; // the instance number of this RPM float rate_rpm; // measured rate in revs per minute uint32_t last_reading_ms; // time of last reading float signal_quality; // synthetic quality metric }; // parameters for each instance AP_Int8 _type[RPM_MAX_INSTANCES]; AP_Int8 _pin[RPM_MAX_INSTANCES]; AP_Float _scaling[RPM_MAX_INSTANCES]; AP_Float _maximum[RPM_MAX_INSTANCES]; AP_Float _minimum[RPM_MAX_INSTANCES]; AP_Float _quality_min[RPM_MAX_INSTANCES]; static const struct AP_Param::GroupInfo var_info[]; // Return the number of rpm sensor instances uint8_t num_sensors(void) const { return num_instances; } // detect and initialise any available rpm sensors void init(void); // update state of all rpm sensors. Should be called from main loop void update(void); /* return RPM for a sensor. Return -1 if not healthy */ float get_rpm(uint8_t instance) const { if (!healthy(instance)) { return -1; } return state[instance].rate_rpm; } /* return signal quality for a sensor. */ float get_signal_quality(uint8_t instance) const { return state[instance].signal_quality; } bool healthy(uint8_t instance) const; bool enabled(uint8_t instance) const; static AP_RPM *get_singleton() { return _singleton; } private: static AP_RPM *_singleton; RPM_State state[RPM_MAX_INSTANCES]; AP_RPM_Backend *drivers[RPM_MAX_INSTANCES]; uint8_t num_instances:2; void detect_instance(uint8_t instance); }; namespace AP { AP_RPM *rpm(); };