Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

SNS - Low Power BMS #55

Open
wants to merge 20 commits into
base: master
Choose a base branch
from
43 changes: 43 additions & 0 deletions lib/sensors/low_power_bms.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
#include "low_power_bms.hpp"

namespace hyped::sensors {

std::optional<LowPowerBMS> LowPowerBMS::create(core::ILogger &logger,
std::shared_ptr<io::II2c> i2c,
const std::uint8_t device_address)
{
if (device_address != kDefaultLpBmsReadAddress) {
logger.log(core::LogLevel::kFatal, "Invalid device address for accelerometer");
return std::nullopt;
}
return LowPowerBMS(logger, i2c, device_address);
}

LowPowerBMS::LowPowerBMS(core::ILogger &logger,
std::shared_ptr<io::II2c> i2c,
const std::uint8_t device_address)
: logger_(logger),
i2c_(i2c)
{
}

LowPowerBMS::~LowPowerBMS()
{
}

std::optional<std::uint8_t> LowPowerBMS::getCellData()
{
const std::uint8_t size = sizeof(cell_voltages);
std::optional<std::uint8_t> voltages[size];
for (int i = 0; i < size; i++) {
voltages[i] = i2c_->readByte(kDefaultLpBmsReadAddress, cell_voltages[i]);
}
return *voltages;
}

std::optional<std::uint8_t> LowPowerBMS::getStackVoltage()
{
const auto voltage = i2c_->readByte(kDefaultLpBmsReadAddress, stack_voltage);
return voltage;
}
} // namespace hyped::sensors
41 changes: 41 additions & 0 deletions lib/sensors/low_power_bms.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
#pragma once

#include <cstdint>
#include <memory>
#include <optional>

#include <core/logger.hpp>
#include <core/types.hpp>
#include <io/i2c.hpp>

static constexpr std::uint8_t kDefaultLpBmsReadAddress = 0x10;
static constexpr std::uint8_t kDefaultLpBmsWriteAddress = 0x11;

namespace hyped::sensors {

class LowPowerBMS {
public:
static std::optional<LowPowerBMS> create(core::ILogger &logger,
std::shared_ptr<io::II2c> i2c,
const std::uint8_t device_address);
~LowPowerBMS();

std::optional<std::uint8_t> getStackVoltage();
std::optional<std::uint8_t> getCellData();

private:
LowPowerBMS(core::ILogger &logger,
std::shared_ptr<io::II2c> i2c,
const std::uint8_t device_address);
core::ILogger &logger_;
std::shared_ptr<io::II2c> i2c_;

const std::uint8_t device_read_address = kDefaultLpBmsReadAddress;
const std::uint8_t device_write_address = kDefaultLpBmsWriteAddress;

private:
static constexpr std::uint8_t cell_voltages[] = {
0x14, 0x16, 0x18, 0x1A, 0x1C, 0x1E, 0x20, 0x22, 0x24, 0x26, 0x28, 0x2A, 0x2C, 0x2E, 0x30, 0x32};
static constexpr std::uint8_t stack_voltage = 0x34;
};
} // namespace hyped::sensors
Loading