Charger
The Charger component is by nature closely associated with the battery, and could be tightly coupled as an extension to that subsystem and sharing the battery Controller. However, that would undermine the modular component advantages of ODP because the charger is an independent component and could be matched with different battery configurations.
Battery and Charger are two independent components, each with their own Device
, Controller
, and Service
. They are registered individually with the embedded-services framework and communicate only via messaging through our comms
implementation.
This models real-world physical separation, where a charging circuit and a battery pack are distinct units that coordinate via well-defined interfaces.
graph TD subgraph EmbeddedServices Registry[Service Registry] end subgraph Battery BatteryDevice[BatteryDevice -- _impl Device_] BatteryController[BatteryController -- _impl Controller_] end subgraph Charger ChargerDevice[ChargerDevice -- _impl Device_] ChargerController[ChargerController -- _impl Controller_] end BatteryDevice --> BatteryController ChargerDevice --> ChargerController BatteryController --> Registry ChargerController --> Registry BatteryDevice --> Registry ChargerDevice --> Registry
The BatteryDevice
contains both the SmartBattery
implementation (as battery) and the Charger
implementation (as charger).
The BatteryDevice
is registered with the BatteryController
, which polls the battery, interprets the data, and invokes charger methods to respond to battery needs.
sequenceDiagram participant ChargerController participant BatteryController ChargerController->>BatteryController: Request battery status BatteryController-->>ChargerController: BatteryState _voltage, temp, soc_ ChargerController->>BatteryController: Apply charging parameters BatteryController-->>ChargerController: Ack / Updated status
When paired with the battery, the two work in concert:
sequenceDiagram participant PolicyManager participant BatteryController participant BatteryDevice participant Battery participant ChargerController participant ChargerDevice participant Charger PolicyManager->>BatteryController: poll() BatteryController->>BatteryDevice: read_status() BatteryDevice->>Battery: get_status() Battery-->>BatteryDevice: BatteryStatus { low_charge: true } BatteryDevice-->>BatteryController: BatteryStatus BatteryController-->>PolicyManager: BatteryStatus PolicyManager->>ChargerController: apply_charge(mA, mV) ChargerController->>ChargerDevice: charging_current(mA) ChargerDevice->>Charger: set_current(mA) Charger-->>ChargerDevice: Ok(mA) ChargerDevice-->>ChargerController: Ok(mA) ChargerController->>ChargerDevice: charging_voltage(mV) ChargerDevice->>Charger: set_voltage(mV) Charger-->>ChargerDevice: Ok(mV) ChargerDevice-->>ChargerController: Ok(mV) ChargerController->>PolicyManager: Charging applied
Here, the controller polls the battery state, and the battery indicates that is has a low charge. The controller determines the charging parameters and instructs the charger. The battery charge level should now improve as the charge is applied over time.