Program Listing for File FuelGauge.h

Return to documentation for file (components/ESC/src/FuelGauge.h)

#ifndef FUEL_GAUGE_H
#define FUEL_GAUGE_H

#include <cstdint>

#include <driver/i2c.h>
#include <driver/gpio.h>

#include <esp_err.h>

namespace esc {

static const bool BAT_LOW = true;
static const bool SOC_INT = false;
enum class SocMeasure {
    Filtered,
    Unfiltered,
};

enum class TempMeasure {
    Battery,
    Internal,
};

class FuelGauge
{
public:
    FuelGauge(FuelGauge const&) = delete;
    FuelGauge(FuelGauge&&) = delete;

    FuelGauge& operator=(FuelGauge const&) = delete;
    FuelGauge& operator=(FuelGauge&&) = delete;

    static FuelGauge& getInstance()
    {
        // Instatiated only once, won't be created again
        static FuelGauge g_instance;
        return g_instance;
    }

    esp_err_t temperature(TempMeasure type, std::uint16_t* temp);

    esp_err_t voltage(std::uint16_t* voltage);

    esp_err_t avgCurrent(std::int16_t* avg_current);

    esp_err_t avgPower(std::int16_t* avg_power);

    esp_err_t soc(SocMeasure type, std::uint16_t* soc);

    esp_err_t setCapacity(std::uint16_t capacity);

    esp_err_t GPOUTPolarity(bool* value);

    esp_err_t setGPOUTPolarity(bool active_high);

    esp_err_t GPOUTFunction(bool* function);

    esp_err_t setGPOUTFunction(bool function);

    esp_err_t sociDelta(std::uint8_t* value);

    esp_err_t setSOCIDelta(std::uint8_t delta);

    esp_err_t pulseGPOUT();

    esp_err_t enterConfig(bool manual_config);

    esp_err_t exitConfig(bool resim);

    esp_err_t opConfig(std::uint16_t* result);

    esp_err_t writeOpConfig(std::uint16_t value);

    esp_err_t softReset();

private:
    FuelGauge();

    esp_err_t status(std::uint16_t* result);

    esp_err_t flags(std::uint16_t* result);

    esp_err_t sealed(bool* is_sealed);

    esp_err_t unseal(std::uint16_t* result);

    esp_err_t seal(std::uint16_t* result);

    esp_err_t blockDataControl();

    esp_err_t blockDataClass(std::uint8_t id);

    esp_err_t blockDataOffset(std::uint8_t offset);

    esp_err_t blockDataChecksum(std::uint8_t* csum);

    esp_err_t readBlockData(std::uint8_t offset, std::uint8_t* result);

    esp_err_t writeBlockData(std::uint8_t offset, std::uint8_t data);

    esp_err_t computeBlockChecksum(std::uint8_t* checksum);

    esp_err_t writeBlockChecksum(std::uint8_t csum);

    esp_err_t readExtendedData(std::uint8_t class_id,
                               std::uint8_t offset,
                               std::uint8_t* result);

    esp_err_t writeExtendedData(std::uint8_t class_id,
                                std::uint8_t offset,
                                std::uint8_t* data,
                                std::uint8_t len);
    esp_err_t readControlWord(std::uint16_t function, std::uint16_t* result);

    esp_err_t executeControlWord(std::uint16_t function);

    esp_err_t readWord(std::uint8_t command, std::uint16_t* word);

    esp_err_t i2cWriteBytes(std::uint8_t sub_address,
                            std::uint8_t* bytes,
                            std::size_t count);

    esp_err_t i2cReadBytes(std::uint8_t sub_address,
                           std::uint8_t* bytes,
                           std::size_t count);

    esp_err_t i2cInit();

    esp_err_t i2cDelete();

    i2c_config_t m_conf;
    bool m_seal_again;
    bool m_manual_config;
};

} // namespace esc

#endif //FUEL_GAUGE_H