/* 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 #include "AP_BattMonitor_ESC.h" #if HAL_WITH_ESC_TELEM extern const AP_HAL::HAL &hal; 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; uint32_t highest_ms = 0; _state.consumed_mah = delta_mah; 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; if (current_sum > 0) { // if we have ever got a current value then we know we have a // current sensor have_current = true; } } 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 // HAL_WITH_ESC_TELEM