Skip to content

Commit

Permalink
AP_BattMonitor: Add calculate_mah, add unit tests
Browse files Browse the repository at this point in the history
  • Loading branch information
arBalasquide authored and tridge committed Dec 21, 2021
1 parent 74fa47a commit 10b4eeb
Show file tree
Hide file tree
Showing 5 changed files with 52 additions and 4 deletions.
3 changes: 1 addition & 2 deletions libraries/AP_BattMonitor/AP_BattMonitor_Analog.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -93,8 +93,7 @@ AP_BattMonitor_Analog::read()

// update total current drawn since startup
if (_state.last_time_micros != 0 && dt < 2000000.0f) {
// .0002778 is 1/3600 (conversion to hours)
float mah = _state.current_amps * dt * 0.0000002778f;
float mah = calculate_mah(_state.current_amps, dt);
_state.consumed_mah += mah;
_state.consumed_wh += 0.001f * mah * _state.voltage;
}
Expand Down
4 changes: 4 additions & 0 deletions libraries/AP_BattMonitor/AP_BattMonitor_Backend.h
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,10 @@ class AP_BattMonitor_Backend
void Log_Write_BAT(const uint8_t instance, const uint64_t time_us) const;
void Log_Write_BCL(const uint8_t instance, const uint64_t time_us) const;

// amps: current (A)
// dt_us: time between samples (micro-seconds)
static float calculate_mah(float amps, float dt_us) { return (float) (amps * dt_us * AUS_TO_MAH); }

protected:
AP_BattMonitor &_mon; // reference to front-end
AP_BattMonitor::BattMonitor_State &_state; // reference to this instances state (held in the front-end)
Expand Down
3 changes: 1 addition & 2 deletions libraries/AP_BattMonitor/AP_BattMonitor_UAVCAN.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -141,8 +141,7 @@ void AP_BattMonitor_UAVCAN::update_interim_state(const float voltage, const floa

// update total current drawn since startup
if (_interim_state.last_time_micros != 0 && dt < 2000000) {
// .0002778 is 1/3600 (conversion to hours)
float mah = (float) ((double) _interim_state.current_amps * (double) dt * (double) 0.0000002778f);
float mah = calculate_mah(_interim_state.current_amps, dt);
_interim_state.consumed_mah += mah;
_interim_state.consumed_wh += 0.001f * mah * _interim_state.voltage;
}
Expand Down
39 changes: 39 additions & 0 deletions libraries/AP_BattMonitor/tests/test_calculate_mah.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
#include <AP_gtest.h>

#include <AP_BattMonitor/AP_BattMonitor_Backend.h>

float calculate_mah_with_double_cast(float amps, float dt)
{
return (float) ((double) amps * (double) dt * (double) 0.0000002778f);
}

float calculate_mah(float amps, float dt)
{
return AP_BattMonitor_Backend::calculate_mah(amps, dt);
}

TEST(AP_BATTMONITOR_MAH, test_calculate_mah)
{
/* Basic unit tests to check for regressions */
EXPECT_FLOAT_EQ(0.0002778, calculate_mah(1000, 1));
EXPECT_FLOAT_EQ(2.778e-06, calculate_mah(1, 10));
EXPECT_FLOAT_EQ(0.34296274, calculate_mah(1234567, 1));

/* Test negative amperes */
EXPECT_FLOAT_EQ(-0.02778, calculate_mah(-100, 1000));
EXPECT_FLOAT_EQ(-34296.3, calculate_mah(-12345678, 10000));
EXPECT_FLOAT_EQ(-2.778e-10, calculate_mah(-0.000001, 1000));
EXPECT_FLOAT_EQ(-2.778e-07, calculate_mah(-1, 1));
}

TEST(AP_BATTMONITOR_ACCURACY, test_float_accuracy)
{
/* Test for loss of accuracy */
EXPECT_FLOAT_EQ(calculate_mah(100, 1), calculate_mah_with_double_cast(100, 1));
EXPECT_FLOAT_EQ(calculate_mah(-1, 1), calculate_mah_with_double_cast(-1, 1));
EXPECT_FLOAT_EQ(calculate_mah(0.0000000001f, 1), calculate_mah_with_double_cast(0.0000000001f, 1));
EXPECT_FLOAT_EQ(calculate_mah(1234.123456789, 1), calculate_mah_with_double_cast(1234.123456789, 1));
EXPECT_FLOAT_EQ(calculate_mah(-1234.123456789, 1), calculate_mah_with_double_cast(-1234.123456789, 1));
}

AP_GTEST_MAIN()
7 changes: 7 additions & 0 deletions libraries/AP_BattMonitor/tests/wscript
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
#!/usr/bin/env python
# encoding: utf-8

def build(bld):
bld.ap_find_tests(
use='ap',
)

0 comments on commit 10b4eeb

Please sign in to comment.