# brnomarsrover/power-distribution-board architecture

> Architecture diagram of the GitHub repository brnomarsrover/power-distribution-board, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-11-14). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/brnomarsrover/power-distribution-board
- Repository: https://github.com/brnomarsrover/power-distribution-board

## Overview

This repository combines a power-distribution board design, its Pico firmware, and a ROS 2 driver. The principal workflow measures branch voltages and currents, monitors limits, emits versioned serial telemetry/events, then parses and republishes them as ROS topics and diagnostics; ROS commands can travel back to the board. Hardware, firmware, and driver relationships are documented in the README. Firmware and ROS source excerpts are partial, so uncertain internal call links are omitted.

Main entry points: [`ros2/powerboard/powerboard/powerboard_node.py`](https://github.com/brnomarsrover/power-distribution-board/blob/main/ros2/powerboard/powerboard/powerboard_node.py) (Powerboard node), [`firmware/PowerBoard/Functions.cpp`](https://github.com/brnomarsrover/power-distribution-board/blob/main/firmware/PowerBoard/Functions.cpp) (Measurement and control), [`kicad/PowerBoard.kicad_sch`](https://github.com/brnomarsrover/power-distribution-board/blob/main/kicad/PowerBoard.kicad_sch) (Power board), [`ros2/powerboard/powerboard/serial_line_reader.py`](https://github.com/brnomarsrover/power-distribution-board/blob/main/ros2/powerboard/powerboard/serial_line_reader.py) (Serial line reader)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_hardware["Board hardware"]
  node_power["Power board"]
  node_pcb["PCB layout"]
  node_monitors["INA238 monitors"]
end

subgraph group_firmware["Board firmware"]
  node_firmware_entry["Firmware sketch<br/>[PowerBoard.ino]"]
  node_firmware_logic["Measurement and control<br/>[Functions.cpp]"]
  node_ina_driver["INA238 driver<br/>[INA238.cpp]"]
  node_firmware_state["Branch state<br/>[Globals.cpp]"]
  node_board_config["Board configuration<br/>[Config.cpp]"]
end

subgraph group_driver["ROS 2 driver"]
  node_ros_node["Powerboard node<br/>[powerboard_node.py]"]
  node_battery["Battery estimate<br/>[powerboard_node.py]"]
  node_rail_topics["Rail topics<br/>[powerboard_node.py]"]
  node_diagnostics["Diagnostics<br/>[powerboard_node.py]"]
  node_events["Event topic<br/>[powerboard_node.py]"]
end

subgraph group_serial["Serial interface"]
  node_serial_protocol["JSON protocol<br/>[Functions.cpp]"]
  node_serial_reader["Serial line reader"]
end

node_user(("ROS user"))

node_power -->|"laid out as"| node_pcb
node_power -->|"includes"| node_monitors
node_firmware_entry -.->|"runs"| node_firmware_logic
node_firmware_logic -->|"reads sensors"| node_ina_driver
node_firmware_logic -->|"updates state"| node_firmware_state
node_firmware_logic -->|"uses settings"| node_board_config
node_firmware_logic -->|"emits frames"| node_serial_protocol
node_serial_protocol -->|"sends telemetry"| node_serial_reader
node_ros_node -->|"polls and writes"| node_serial_reader
node_ros_node -->|"parses and commands"| node_serial_protocol
node_ros_node -->|"estimates battery"| node_battery
node_ros_node -->|"publishes rails"| node_rail_topics
node_ros_node -->|"publishes status"| node_diagnostics
node_ros_node -->|"publishes events"| node_events
node_user -->|"subscribes commands"| node_ros_node
node_battery -->|"publishes battery"| node_user
node_rail_topics -->|"publishes arrays"| node_user
node_diagnostics -->|"publishes diagnostics"| node_user
node_events -->|"publishes events"| node_user

click node_power "https://github.com/brnomarsrover/power-distribution-board/blob/main/kicad/PowerBoard.kicad_sch"
click node_pcb "https://github.com/brnomarsrover/power-distribution-board/blob/main/kicad/PowerBoard.kicad_pcb"
click node_firmware_entry "https://github.com/brnomarsrover/power-distribution-board/blob/main/firmware/PowerBoard/PowerBoard.ino"
click node_firmware_logic "https://github.com/brnomarsrover/power-distribution-board/blob/main/firmware/PowerBoard/Functions.cpp"
click node_ina_driver "https://github.com/brnomarsrover/power-distribution-board/blob/main/firmware/PowerBoard/INA238.cpp"
click node_firmware_state "https://github.com/brnomarsrover/power-distribution-board/blob/main/firmware/PowerBoard/Globals.cpp"
click node_board_config "https://github.com/brnomarsrover/power-distribution-board/blob/main/firmware/PowerBoard/Config.cpp"
click node_serial_protocol "https://github.com/brnomarsrover/power-distribution-board/blob/main/firmware/PowerBoard/Functions.cpp"
click node_serial_reader "https://github.com/brnomarsrover/power-distribution-board/blob/main/ros2/powerboard/powerboard/serial_line_reader.py"
click node_ros_node "https://github.com/brnomarsrover/power-distribution-board/blob/main/ros2/powerboard/powerboard/powerboard_node.py"
click node_battery "https://github.com/brnomarsrover/power-distribution-board/blob/main/ros2/powerboard/powerboard/powerboard_node.py"
click node_rail_topics "https://github.com/brnomarsrover/power-distribution-board/blob/main/ros2/powerboard/powerboard/powerboard_node.py"
click node_diagnostics "https://github.com/brnomarsrover/power-distribution-board/blob/main/ros2/powerboard/powerboard/powerboard_node.py"
click node_events "https://github.com/brnomarsrover/power-distribution-board/blob/main/ros2/powerboard/powerboard/powerboard_node.py"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_power,node_pcb,node_monitors,node_user toneBlue
class node_firmware_entry,node_firmware_logic,node_ina_driver,node_firmware_state,node_board_config toneAmber
class node_ros_node,node_battery,node_rail_topics,node_diagnostics,node_events toneMint
class node_serial_protocol,node_serial_reader toneRose
```

## Components

### Board hardware

- [Power board](https://github.com/brnomarsrover/power-distribution-board/blob/main/kicad/PowerBoard.kicad_sch): `kicad/PowerBoard.kicad_sch`
- [PCB layout](https://github.com/brnomarsrover/power-distribution-board/blob/main/kicad/PowerBoard.kicad_pcb): `kicad/PowerBoard.kicad_pcb`
- **INA238 monitors**

### Board firmware

- [Firmware sketch](https://github.com/brnomarsrover/power-distribution-board/blob/main/firmware/PowerBoard/PowerBoard.ino): `firmware/PowerBoard/PowerBoard.ino`
- [Measurement and control](https://github.com/brnomarsrover/power-distribution-board/blob/main/firmware/PowerBoard/Functions.cpp): `firmware/PowerBoard/Functions.cpp`
- [INA238 driver](https://github.com/brnomarsrover/power-distribution-board/blob/main/firmware/PowerBoard/INA238.cpp): `firmware/PowerBoard/INA238.cpp`
- [Branch state](https://github.com/brnomarsrover/power-distribution-board/blob/main/firmware/PowerBoard/Globals.cpp): `firmware/PowerBoard/Globals.cpp`
- [Board configuration](https://github.com/brnomarsrover/power-distribution-board/blob/main/firmware/PowerBoard/Config.cpp): `firmware/PowerBoard/Config.cpp`

### ROS 2 driver

- [Powerboard node](https://github.com/brnomarsrover/power-distribution-board/blob/main/ros2/powerboard/powerboard/powerboard_node.py): `ros2/powerboard/powerboard/powerboard_node.py`
- [Battery estimate](https://github.com/brnomarsrover/power-distribution-board/blob/main/ros2/powerboard/powerboard/powerboard_node.py): `ros2/powerboard/powerboard/powerboard_node.py`
- [Rail topics](https://github.com/brnomarsrover/power-distribution-board/blob/main/ros2/powerboard/powerboard/powerboard_node.py): `ros2/powerboard/powerboard/powerboard_node.py`
- [Diagnostics](https://github.com/brnomarsrover/power-distribution-board/blob/main/ros2/powerboard/powerboard/powerboard_node.py): `ros2/powerboard/powerboard/powerboard_node.py`
- [Event topic](https://github.com/brnomarsrover/power-distribution-board/blob/main/ros2/powerboard/powerboard/powerboard_node.py): `ros2/powerboard/powerboard/powerboard_node.py`

### Serial interface

- [JSON protocol](https://github.com/brnomarsrover/power-distribution-board/blob/main/firmware/PowerBoard/Functions.cpp): `firmware/PowerBoard/Functions.cpp`
- [Serial line reader](https://github.com/brnomarsrover/power-distribution-board/blob/main/ros2/powerboard/powerboard/serial_line_reader.py): `ros2/powerboard/powerboard/serial_line_reader.py`

### Other components

- **ROS user**

## Connections

- Power board → PCB layout: laid out as (evidence: `README.md`)
- Power board → INA238 monitors: includes (evidence: `README.md`)
- Firmware sketch → Measurement and control: runs
- Measurement and control → INA238 driver: reads sensors (evidence: `firmware/PowerBoard/Functions.cpp`)
- Measurement and control → Branch state: updates state (evidence: `firmware/PowerBoard/Functions.cpp`)
- Measurement and control → Board configuration: uses settings (evidence: `firmware/PowerBoard/Functions.cpp`)
- Measurement and control → JSON protocol: emits frames (evidence: `firmware/PowerBoard/Functions.cpp`)
- JSON protocol → Serial line reader: sends telemetry (evidence: `README.md`)
- Powerboard node → Serial line reader: polls and writes (evidence: `ros2/powerboard/powerboard/powerboard_node.py`)
- Powerboard node → JSON protocol: parses and commands (evidence: `README.md`)
- Powerboard node → Battery estimate: estimates battery (evidence: `ros2/powerboard/powerboard/powerboard_node.py`)
- Powerboard node → Rail topics: publishes rails (evidence: `ros2/powerboard/powerboard/powerboard_node.py`)
- Powerboard node → Diagnostics: publishes status (evidence: `ros2/powerboard/powerboard/powerboard_node.py`)
- Powerboard node → Event topic: publishes events (evidence: `README.md`)
- ROS user → Powerboard node: subscribes commands (evidence: `README.md`)
- Battery estimate → ROS user: publishes battery (evidence: `README.md`)
- Rail topics → ROS user: publishes arrays (evidence: `README.md`)
- Diagnostics → ROS user: publishes diagnostics (evidence: `README.md`)
- Event topic → ROS user: publishes events (evidence: `README.md`)
