2020-10-22 14:02:15 -03:00
|
|
|
/*
|
|
|
|
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 <http://www.gnu.org/licenses/>.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include "AP_Generator.h"
|
|
|
|
|
2021-09-24 00:10:47 -03:00
|
|
|
#if HAL_GENERATOR_ENABLED
|
2020-10-22 14:02:15 -03:00
|
|
|
|
|
|
|
#include "AP_Generator_IE_650_800.h"
|
|
|
|
#include "AP_Generator_IE_2400.h"
|
|
|
|
#include "AP_Generator_RichenPower.h"
|
|
|
|
|
2022-02-25 01:06:28 -04:00
|
|
|
#include <GCS_MAVLink/GCS.h>
|
|
|
|
|
2020-10-22 14:02:15 -03:00
|
|
|
const AP_Param::GroupInfo AP_Generator::var_info[] = {
|
|
|
|
|
|
|
|
// @Param: TYPE
|
|
|
|
// @DisplayName: Generator type
|
|
|
|
// @Description: Generator type
|
|
|
|
// @Values: 0:Disabled, 1:IE 650w 800w Fuel Cell, 2:IE 2.4kW Fuel Cell, 3: Richenpower
|
|
|
|
// @User: Standard
|
|
|
|
// @RebootRequired: True
|
|
|
|
AP_GROUPINFO_FLAGS("TYPE", 1, AP_Generator, _type, 0, AP_PARAM_FLAG_ENABLE),
|
|
|
|
|
2022-05-24 08:05:52 -03:00
|
|
|
// @Param: OPTIONS
|
|
|
|
// @DisplayName: Generator Options
|
|
|
|
// @Description: Bitmask of options for generators
|
2023-10-11 04:41:53 -03:00
|
|
|
// @Bitmask: 0:Suppress Maintenance-Required Warnings
|
2022-05-24 08:05:52 -03:00
|
|
|
// @User: Standard
|
|
|
|
AP_GROUPINFO("OPTIONS", 2, AP_Generator, _options, 0),
|
|
|
|
|
2020-10-22 14:02:15 -03:00
|
|
|
AP_GROUPEND
|
|
|
|
};
|
|
|
|
|
|
|
|
// Constructor
|
|
|
|
AP_Generator::AP_Generator()
|
|
|
|
{
|
|
|
|
AP_Param::setup_object_defaults(this, var_info);
|
|
|
|
|
|
|
|
if (_singleton) {
|
|
|
|
#if CONFIG_HAL_BOARD == HAL_BOARD_SITL
|
|
|
|
AP_HAL::panic("Too many generators");
|
|
|
|
#endif
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
_singleton = this;
|
|
|
|
}
|
|
|
|
|
|
|
|
void AP_Generator::init()
|
|
|
|
{
|
|
|
|
// Select backend
|
|
|
|
switch (type()) {
|
|
|
|
case Type::GEN_DISABLED:
|
|
|
|
// Not using a generator
|
|
|
|
return;
|
|
|
|
|
2023-08-14 01:13:11 -03:00
|
|
|
#if AP_GENERATOR_IE_650_800_ENABLED
|
2020-10-22 14:02:15 -03:00
|
|
|
case Type::IE_650_800:
|
|
|
|
_driver_ptr = new AP_Generator_IE_650_800(*this);
|
|
|
|
break;
|
2023-02-27 01:06:56 -04:00
|
|
|
#endif
|
2020-10-22 14:02:15 -03:00
|
|
|
|
2023-08-14 01:13:11 -03:00
|
|
|
#if AP_GENERATOR_IE_2400_ENABLED
|
2020-10-22 14:02:15 -03:00
|
|
|
case Type::IE_2400:
|
|
|
|
_driver_ptr = new AP_Generator_IE_2400(*this);
|
|
|
|
break;
|
2023-02-27 01:06:56 -04:00
|
|
|
#endif
|
2020-10-22 14:02:15 -03:00
|
|
|
|
2022-06-21 22:30:12 -03:00
|
|
|
#if AP_GENERATOR_RICHENPOWER_ENABLED
|
2023-02-27 01:06:56 -04:00
|
|
|
case Type::RICHENPOWER:
|
2020-10-22 14:02:15 -03:00
|
|
|
_driver_ptr = new AP_Generator_RichenPower(*this);
|
|
|
|
break;
|
2023-02-27 01:06:56 -04:00
|
|
|
#endif
|
2020-10-22 14:02:15 -03:00
|
|
|
}
|
|
|
|
|
|
|
|
if (_driver_ptr != nullptr) {
|
|
|
|
_driver_ptr->init();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void AP_Generator::update()
|
|
|
|
{
|
2023-10-11 04:41:53 -03:00
|
|
|
// Return immediately if not enabled. Don't support run-time disabling of generator
|
2020-10-22 14:02:15 -03:00
|
|
|
if (_driver_ptr == nullptr) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Calling backend update will cause backend to update the front end variables
|
|
|
|
_driver_ptr->update();
|
|
|
|
}
|
|
|
|
|
|
|
|
// Helper to get param and cast to Type
|
|
|
|
enum AP_Generator::Type AP_Generator::type() const
|
|
|
|
{
|
|
|
|
return (Type)_type.get();
|
|
|
|
}
|
|
|
|
|
|
|
|
// Pass through to backend
|
|
|
|
void AP_Generator::send_generator_status(const GCS_MAVLINK &channel)
|
|
|
|
{
|
|
|
|
if (_driver_ptr == nullptr) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
_driver_ptr->send_generator_status(channel);
|
|
|
|
}
|
|
|
|
|
|
|
|
// Tell backend to perform arming checks
|
|
|
|
bool AP_Generator::pre_arm_check(char* failmsg, uint8_t failmsg_len) const
|
|
|
|
{
|
|
|
|
if (type() == Type::GEN_DISABLED) {
|
|
|
|
// Don't prevent arming if generator is not enabled and has never been init
|
|
|
|
if (_driver_ptr == nullptr) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
// Don't allow arming if we have disabled the generator since boot
|
2023-10-11 04:41:53 -03:00
|
|
|
strncpy(failmsg, "Generator disabled, reboot required", failmsg_len);
|
2020-10-22 14:02:15 -03:00
|
|
|
return false;
|
|
|
|
}
|
|
|
|
if (_driver_ptr == nullptr) {
|
|
|
|
strncpy(failmsg, "No backend driver", failmsg_len);
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
return _driver_ptr->pre_arm_check(failmsg, failmsg_len);
|
|
|
|
}
|
|
|
|
|
|
|
|
// Tell backend check failsafes
|
2020-11-24 06:58:38 -04:00
|
|
|
AP_BattMonitor::Failsafe AP_Generator::update_failsafes()
|
2020-10-22 14:02:15 -03:00
|
|
|
{
|
|
|
|
// Don't invoke a failsafe if driver not assigned
|
|
|
|
if (_driver_ptr == nullptr) {
|
2020-11-24 06:58:38 -04:00
|
|
|
return AP_BattMonitor::Failsafe::None;
|
2020-10-22 14:02:15 -03:00
|
|
|
}
|
|
|
|
return _driver_ptr->update_failsafes();
|
|
|
|
}
|
|
|
|
|
|
|
|
// Pass through to backend
|
|
|
|
bool AP_Generator::stop()
|
|
|
|
{
|
|
|
|
// Still allow
|
|
|
|
if (_driver_ptr == nullptr) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
return _driver_ptr->stop();
|
|
|
|
}
|
|
|
|
|
|
|
|
// Pass through to backend
|
|
|
|
bool AP_Generator::idle()
|
|
|
|
{
|
|
|
|
if (_driver_ptr == nullptr) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
return _driver_ptr->idle();
|
|
|
|
}
|
|
|
|
|
|
|
|
// Pass through to backend
|
|
|
|
bool AP_Generator::run()
|
|
|
|
{
|
|
|
|
// Don't allow operators to request generator be set to run if it has been disabled
|
|
|
|
if (_driver_ptr == nullptr) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
return _driver_ptr->run();
|
|
|
|
}
|
|
|
|
|
|
|
|
// Get the AP_Generator singleton
|
|
|
|
AP_Generator *AP_Generator::get_singleton()
|
|
|
|
{
|
|
|
|
return _singleton;
|
|
|
|
}
|
|
|
|
|
|
|
|
AP_Generator *AP_Generator::_singleton = nullptr;
|
|
|
|
|
|
|
|
namespace AP {
|
|
|
|
AP_Generator *generator()
|
|
|
|
{
|
|
|
|
return AP_Generator::get_singleton();
|
|
|
|
}
|
|
|
|
};
|
|
|
|
#endif
|