# SPDX-FileCopyrightText: 2026 James Harton # # SPDX-License-Identifier: Apache-2.0 if Code.ensure_loaded?(Igniter) do defmodule Mix.Tasks.BbSensorIna219.Install do @shortdoc "Installs BB.Sensor.INA219 into a robot" @moduledoc """ #{@shortdoc} Adds a `:config.:ina219` param group with `bus` and `address`, writes the bus name default to `config/config.exs`, wires the robot's child spec to load its opts from the application environment, and imports `bb_sensor_ina219` into your formatter. The sensor itself lives on a specific link — the installer can't guess which one, so it prints a snippet for you to paste into the topology. ## Example ```bash mix igniter.install bb_sensor_ina219 mix igniter.install bb_sensor_ina219 --bus ftdi-3:17-i2c ``` ## Options * `--robot` - The robot module (defaults to `{AppPrefix}.Robot`). * `--bus` - The I2C bus name (default `i2c-1`). """ use Igniter.Mix.Task alias Igniter.Project.Formatter @param_group :ina219 @default_bus "i2c-1" @impl Igniter.Mix.Task def info(_argv, _parent) do %Igniter.Mix.Task.Info{ schema: [ robot: :string, bus: :string ], aliases: [r: :robot] } end @impl Igniter.Mix.Task def igniter(igniter) do options = igniter.args.options robot_module = BB.Igniter.robot_module(igniter) bus = Keyword.get(options, :bus, @default_bus) igniter |> Formatter.import_dep(:bb_sensor_ina219) |> BB.Igniter.add_param_group(robot_module, [:config, @param_group], param_group_body()) |> BB.Igniter.set_robot_param_default(robot_module, [:config, @param_group, :bus], bus) |> Igniter.add_notice(topology_snippet()) end defp param_group_body do """ param :bus, type: :string, doc: "I2C bus name (e.g. \\"i2c-1\\")" param :address, type: :integer, default: 0x40, doc: "I2C address of the INA219" """ end defp topology_snippet do """ bb_sensor_ina219: add a sensor to whichever link you want to monitor. Example: link :chassis do sensor :main_bus, {BB.Sensor.INA219, bus: param([:config, :ina219, :bus]), address: param([:config, :ina219, :address]), calibration: :calibrate_32V_2A, publish_rate: ~u(1 hertz) } end Calibration presets: :calibrate_32V_2A, :calibrate_32V_1A, :calibrate_16V_400mA. All assume a 0.1Ω shunt (Adafruit breakout). """ end end else defmodule Mix.Tasks.BbSensorIna219.Install do @shortdoc "Installs BB.Sensor.INA219 into a robot" @moduledoc false use Mix.Task def run(_argv) do Mix.shell().error(""" The bb_sensor_ina219.install task requires igniter. mix igniter.install bb_sensor_ina219 """) exit({:shutdown, 1}) end end end