Skip to content
Matteo Tullo edited this page Feb 4, 2025 · 5 revisions

Intro

This library is a set of traits designed to standardize interactions with battery systems in portable electronics. It follows the Smart Battery System specification to define generic functions that all battery chargers and all smart batteries (AKA fuel gauge, gas gauge) must implement to enforce a standard interface.

Design Principles

Generic Design Diagram

    classDiagram
        Application Level Task --> ChargerDriver: non-std calls (ex. MFG)
        Application Level Task --> SmartBatteryDriver: non-std calls (ex. MFG)
        Application Level Task: -> charging FSMs
        Application Level Task: -> monitoring state of charge
        Application Level Task: -> calls std and non-std fn's
        Application Level Task: +DoStartup()
        Application Level Task: +EnableAutocharging()
        Application Level Task: +GetCellVoltages()
        Application Level Task: +...()
        Application Level Task --> embedded-batteries-charger: std calls
        Application Level Task --> embedded-batteries-smart-battery: std calls
        embedded-batteries-smart-battery <|-- SmartBatteryDriver: implements
        embedded-batteries-charger <|-- ChargerDriver: implements
        embedded-batteries-charger: -> Platform/HW agnostic charger fn's
        embedded-batteries-charger: -> Conforms to SBS spec
        embedded-batteries-charger: +ChargingCurrent()
        embedded-batteries-charger: +ChargingVoltage()
        embedded-batteries-smart-battery: -> Platform/HW agnostic fuel gauge fn's
        embedded-batteries-smart-battery: -> Conforms to SBS spec
        embedded-batteries-smart-battery: +Voltage()
        embedded-batteries-smart-battery: +Current()
        embedded-batteries-smart-battery: +BatteryStatus()
        embedded-batteries-smart-battery: +Temperature()
        embedded-batteries-smart-battery: +CycleCount()
        embedded-batteries-smart-battery: +...()
        <<interface>> embedded-batteries-charger
        <<interface>> embedded-batteries-smart-battery
        ChargerDriver --> platform-specific-hal
        ChargerDriver: -> Specific to charging chip
        ChargerDriver: -> Conforms to chip datasheet
        ChargerDriver: -> has non-std MFG specific fn's
        ChargerDriver: +[std] ChargingCurrent()
        ChargerDriver: +[std] ChargingVoltage()
        ChargerDriver: +[non-std] AutoCharge()
        ChargerDriver: +[non-std] ...()
        SmartBatteryDriver --> platform-specific-hal
        SmartBatteryDriver: -> Specific to charging chip
        SmartBatteryDriver: -> Conforms to chip datasheet
        SmartBatteryDriver: -> has non-std MFG specific fn's
        SmartBatteryDriver: +[std] Voltage()
        SmartBatteryDriver: +[std] Current()
        SmartBatteryDriver: +[std] BatteryStatus()
        SmartBatteryDriver: +[std] ...()
        SmartBatteryDriver: +[non-std] Unseal()
        SmartBatteryDriver: +[non-std] ...()
        class platform-specific-hal["platform-specific-hal comm system"]
        platform-specific-hal: -> communication system agnostic
        platform-specific-hal: -> can be uC, kernel driver, etc.
        platform-specific-hal: +readWord()
        platform-specific-hal: +writeWord()
        platform-specific-hal: +...()
Loading

Specific Example Design

    classDiagram
        class battery-service["battery-service"]
        click battery-service href "https://github.com/OpenDevicePartnership/embedded-services"
        battery-service --> BQ25773: non-std calls (ex. MFG)
        battery-service --> BQ40Z50: non-std calls (ex. MFG)
        battery-service: +DoStartup()
        battery-service: +EnableAutocharging()
        battery-service: +GetCellVoltages()
        battery-service: +...()
        battery-service --> embedded-batteries-charger: std calls
        battery-service --> embedded-batteries-smart-battery: std calls
        embedded-batteries-smart-battery <|-- BQ40Z50: implements
        embedded-batteries-charger <|-- BQ25773: implements
        embedded-batteries-charger: +ChargingCurrent()
        embedded-batteries-charger: +ChargingVoltage()
        embedded-batteries-smart-battery: +Voltage()
        embedded-batteries-smart-battery: +Current()
        embedded-batteries-smart-battery: +BatteryStatus()
        embedded-batteries-smart-battery: +Temperature()
        embedded-batteries-smart-battery: +CycleCount()
        embedded-batteries-smart-battery: +...()
        <<interface>> embedded-batteries-charger
        <<interface>> embedded-batteries-smart-battery
        class BQ25773["BQ25773"]
        click BQ25773 href "https://github.com/OpenDevicePartnership/bq25773"
        BQ25773 --> platform-specific-hal
        BQ25773: +[std] ChargingCurrent()
        BQ25773: +[std] ChargingVoltage()
        BQ25773: +[non-std] AutoCharge()
        BQ25773: +[non-std] ...()
        class BQ40Z50["BQ40Z50"]
        click BQ40Z50 href "https://github.com/OpenDevicePartnership/bq40z50"
        BQ40Z50 --> platform-specific-hal
        BQ40Z50: +[std] Voltage()
        BQ40Z50: +[std] Current()
        BQ40Z50: +[std] BatteryStatus()
        BQ40Z50: +[std] ...()
        BQ40Z50: +[non-std] Unseal()
        BQ40Z50: +[non-std] ...()
        class platform-specific-hal["embassy-imxrt I2C driver"]
        click platform-specific-hal href "https://github.com/OpenDevicePartnership/embassy-imxrt"
        platform-specific-hal: +read()
        platform-specific-hal: +write()
Loading

Clone this wiki locally