/* 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 . */ #include "AP_BattMonitor_config.h" #if AP_BATTERY_ESC_ENABLED #include "AP_BattMonitor_ESC.h" const AP_Param::GroupInfo AP_BattMonitor_ESC::var_info[] = { // @Param: ESC_MASK // @DisplayName: ESC mask // @Description: If 0 all connected ESCs will be used. If non-zero, only those selected in will be used. // @Bitmask: 0: ESC 1, 1: ESC 2, 2: ESC 3, 3: ESC 4, 4: ESC 5, 5: ESC 6, 6: ESC 7, 7: ESC 8, 8: ESC 9, 9: ESC 10, 10: ESC 11, 11: ESC 12, 12: ESC 13, 13: ESC 14, 14: ESC 15, 15: ESC 16, 16: ESC 17, 17: ESC 18, 18: ESC 19, 19: ESC 20, 20: ESC 21, 21: ESC 22, 22: ESC 23, 23: ESC 24, 24: ESC 25, 25: ESC 26, 26: ESC 27, 27: ESC 28, 28: ESC 29, 29: ESC 30, 30: ESC 31, 31: ESC 32 // @User: Standard AP_GROUPINFO("ESC_MASK", 36, AP_BattMonitor_ESC, _mask, 0), // CHECK/UPDATE INDEX TABLE IN AP_BattMonitor_Backend.cpp WHEN CHANGING OR ADDING PARAMETERS AP_GROUPEND }; // constructor. This incorporates initialisation as well. AP_BattMonitor_ESC::AP_BattMonitor_ESC(AP_BattMonitor &mon, AP_BattMonitor::BattMonitor_State &mon_state, AP_BattMonitor_Params ¶ms): AP_BattMonitor_Backend(mon, mon_state, params) { AP_Param::setup_object_defaults(this, var_info); _state.var_info = var_info; }; void AP_BattMonitor_ESC::init(void) { } void AP_BattMonitor_ESC::read(void) { AP_ESC_Telem& telem = AP::esc_telem(); uint8_t voltage_escs = 0; // number of ESCs with valid voltage uint8_t temperature_escs = 0; // number of ESCs with valid temperature float voltage_sum = 0; float current_sum = 0; float temperature_sum = 0; float consumed_mah_sum = 0.0; uint32_t highest_ms = 0; const bool all_enabled = _mask == 0; for (uint8_t i=0; i highest_ms) { highest_ms = telem.get_last_telem_data_ms(i); } } if (voltage_escs > 0) { _state.voltage = voltage_sum / voltage_escs; _state.healthy = true; } else { _state.voltage = 0; _state.healthy = false; } if (temperature_escs > 0) { _state.temperature = temperature_sum / temperature_escs; have_temperature = true; } else { _state.temperature = 0; } _state.current_amps = current_sum; _state.last_time_micros = highest_ms * 1000; _state.temperature_time = highest_ms; const uint32_t now_us = AP_HAL::micros(); const uint32_t dt_us = now_us - last_read_us; last_read_us = now_us; if (have_consumed_mah) { // Report the cumulative consumed mah as reported by the ESCs // delta_mah allows reset_remaining to function without being able to reset the values sent by the ESCs _state.consumed_mah = delta_mah + consumed_mah_sum; } else if (have_current) { // ESCs provide current but not consumed mah, integrate manually update_consumed(_state, dt_us); } } bool AP_BattMonitor_ESC::reset_remaining(float percentage) { delta_mah = 0.0f; read(); const float current_mah = _state.consumed_mah; if (AP_BattMonitor_Backend::reset_remaining(percentage)) { delta_mah = _state.consumed_mah - current_mah; return true; } return false; } #endif // AP_BATTERY_ESC_ENABLED