Files
2022-06-13 21:16:44 +02:00

169 lines
5.0 KiB
C++

#pragma once
// system includes
#include <cstdint>
#include <optional>
// local includes
#include <bobbytypesafeenum.h>
typedef struct {
uint16_t minVoltage;
uint16_t maxVoltage;
} CalibrationPointVoltages;
// battery curves
#define PERCENTAGE(higherVoltage,lowerVoltage,fromAh,toAh) \
if (cellVoltage >= lowerVoltage && cellVoltage <= higherVoltage) \
return 100 * (expected_ah - cpputils::mapValue<float>(cellVoltage, higherVoltage, lowerVoltage, fromAh, toAh)) / expected_ah;
#define GET_MINIMUM_VOLTAGE(higherVoltage,lowerVoltage,fromAh,toAh) \
if (expected_ah >= toAh) \
return lowerVoltage;
#define GET_MAXIMUM_VOLTAGE(higherVoltage,lowerVoltage,fromAh,toAh) \
if (fromAh == 0) \
return higherVoltage;
#define GET_MINIMUM_BAT_VOLTAGE(higherVoltage,lowerVoltage,fromAh,toAh) \
if (lowerVoltage < minimumVoltage) \
minimumVoltage = lowerVoltage;
#define GET_MAXIMUM_BAT_VOLTAGE(higherVoltage,lowerVoltage,fromAh,toAh) \
if (fromAh == 0) \
return higherVoltage;
// All curves here have to follow the same order (highest-voltage first)
// as some functions require this to display data in correct order
// 22P
#define BAT_MIN_AH_22P 2.2f
#define BAT_CURVE_22P(func) \
func(4.15f, 4.04f, 0.00f, 0.25f) \
func(4.04f, 3.95f, 0.25f, 0.50f) \
func(3.95f, 3.86f, 0.50f, 0.75f) \
func(3.86f, 3.74f, 0.75f, 1.00f) \
func(3.74f, 3.64f, 1.00f, 1.25f) \
func(3.64f, 3.59f, 1.25f, 1.50f) \
func(3.59f, 3.54f, 1.50f, 1.75f) \
func(3.54f, 3.43f, 1.75f, 2.00f) \
func(3.43f, 3.35f, 2.00f, 2.10f) \
func(3.35f, 2.50f, 2.10f, 2.20f)
// MH1
#define BAT_MIN_AH_MH1 3.2f
#define BAT_CURVE_MH1(func) \
func(4.15f, 4.09f, 0.00f, 0.25f) \
func(4.09f, 4.04f, 0.25f, 0.50f) \
func(4.04f, 3.95f, 0.50f, 0.75f) \
func(3.95f, 3.88f, 0.75f, 1.00f) \
func(3.88f, 3.79f, 1.00f, 1.25f) \
func(3.79f, 3.70f, 1.25f, 1.50f) \
func(3.70f, 3.65f, 1.50f, 1.75f) \
func(3.65f, 3.60f, 1.75f, 2.00f) \
func(3.60f, 3.56f, 2.00f, 2.25f) \
func(3.56f, 3.50f, 2.25f, 2.50f) \
func(3.50f, 3.40f, 2.50f, 2.75f) \
func(3.40f, 3.30f, 2.75f, 3.00f) \
func(3.30f, 2.50f, 3.00f, 3.20f)
// HG2
#define BAT_MIN_AH_HG2 3.0f
#define BAT_CURVE_HG2(func) \
func(4.15f, 4.08f, 0.00f, 0.25f) \
func(4.08f, 4.01f, 0.25f, 0.50f) \
func(4.01f, 3.92f, 0.50f, 0.75f) \
func(3.92f, 3.84f, 0.75f, 1.00f) \
func(3.84f, 3.75f, 1.00f, 1.25f) \
func(3.75f, 3.67f, 1.25f, 1.50f) \
func(3.67f, 3.62f, 1.50f, 1.75f) \
func(3.62f, 3.55f, 1.75f, 2.00f) \
func(3.55f, 3.44f, 2.00f, 2.25f) \
func(3.44f, 3.30f, 2.25f, 2.50f) \
func(3.30f, 3.05f, 2.50f, 2.75f) \
func(3.05f, 2.50f, 2.75f, 3.00f)
// VTC5
#define BAT_MIN_AH_VTC5 2.6f
#define BAT_CURVE_VTC5(func) \
func(4.15f, 4.08f, 0.00f, 0.25f) \
func(4.08f, 3.98f, 0.25f, 0.50f) \
func(3.98f, 3.89f, 0.50f, 0.75f) \
func(3.89f, 3.79f, 0.75f, 1.00f) \
func(3.79f, 3.71f, 1.00f, 1.25f) \
func(3.71f, 3.64f, 1.25f, 1.50f) \
func(3.64f, 3.53f, 1.50f, 1.75f) \
func(3.53f, 3.44f, 1.75f, 2.00f) \
func(3.44f, 3.20f, 2.00f, 2.25f) \
func(3.20f, 2.80f, 2.25f, 2.50f) \
func(2.80f, 2.50f, 2.50f, 2.60f)
// BAK_25R
#define BAT_MIN_AH_BAK_25R 2.5f
#define BAT_CURVE_25R(func) \
func(4.15f, 4.06f, 0.00f, 0.25f) \
func(4.06f, 3.96f, 0.25f, 0.50f) \
func(3.96f, 3.88f, 0.50f, 0.75f) \
func(3.88f, 3.77f, 0.75f, 1.00f) \
func(3.77f, 3.68f, 1.00f, 1.25f) \
func(3.68f, 3.62f, 1.25f, 1.50f) \
func(3.62f, 3.56f, 1.50f, 1.75f) \
func(3.56f, 3.47f, 1.75f, 2.00f) \
func(3.47f, 3.31f, 2.00f, 2.25f) \
func(3.31f, 2.50f, 2.25f, 2.50f)
// HE4
#define BAT_MIN_AH_HE4 2.3f
#define BAT_CURVE_HE4(func) \
func(4.15f, 4.02f, 0.00f, 0.25f) \
func(4.02f, 3.91f, 0.25f, 0.50f) \
func(3.91f, 3.81f, 0.50f, 0.75f) \
func(3.81f, 3.72f, 0.75f, 1.00f) \
func(3.72f, 3.61f, 1.00f, 1.25f) \
func(3.61f, 3.62f, 1.25f, 1.50f) \
func(3.62f, 3.53f, 1.50f, 1.75f) \
func(3.53f, 3.45f, 1.75f, 2.00f) \
func(3.45f, 3.21f, 2.00f, 2.25f) \
func(3.21f, 2.80f, 2.25f, 2.30f)
#define BatteryCellTypeValues(x) \
x(_22P) \
x(HG2) \
x(MH1) \
x(VTC5) \
x(BAK_25R) \
x(HE4)
DECLARE_BOBBYTYPESAFE_ENUM(BatteryCellType, : uint8_t, BatteryCellTypeValues)
float getBatteryPercentage(float batVoltage, BatteryCellType cellType);
float getRemainingWattHours();
float getBatteryWattHours();
float getMinBatCellVoltage(BatteryCellType cellType);
float getMaxBatCellVoltage(BatteryCellType cellType);
std::string getBatteryPercentageString();
std::string getBatteryRemainingWattHoursString();
std::string getRemainingRangeString();
std::string getBatteryDebugString();
std::string getBatteryAdvancedPercentageString();
float getPercentageByWh(float wh);
float getTarget_mAh();
uint8_t count_curve_points(BatteryCellType cellType);
std::optional<CalibrationPointVoltages> get_point_n_voltages(BatteryCellType cellType, uint8_t num);
namespace battery {
extern std::optional<float> bootBatPercentage;
extern std::optional<float> bootBatWh;
}