lib/nerves_time/rtc/abracon/b5ze/configuration.ex

defmodule NervesTime.RTC.Abracon.B5ZE.Configuration do
  @type bit() :: 0 | 1
  @type t :: %{
          stop: bit(),
          sr: bit(),
          twelve_hour: bit(),
          sie: bit(),
          aie: bit(),
          cie: bit(),
          wtaf: bit(),
          ctaf: bit(),
          ctbf: bit(),
          sf: bit(),
          af: bit(),
          wtaie: bit(),
          ctaie: bit(),
          ctbie: bit(),
          battery: 0..7,
          bsf: bit(),
          blf: bit(),
          bsei: bit(),
          blie: bit()
        }

  @spec decode(<<_::24>>) :: {:ok, t()} | {:error, any()}
  def decode(
        <<0::1, 0::1, stop::1, sr::1, twelve_hour::1, sie::1, aie::1, cie::1, wtaf::1, ctaf::1,
          ctbf::1, sf::1, af::1, wtaie::1, ctaie::1, ctbie::1, battery::3, _unused::1, bsf::1,
          blf::1, bsei::1, blie::1>>
      ) do
    config = %{
      stop: stop,
      sr: sr,
      twelve_hour: twelve_hour,
      sie: sie,
      aie: aie,
      cie: cie,
      wtaf: wtaf,
      ctaf: ctaf,
      ctbf: ctbf,
      sf: sf,
      af: af,
      wtaie: wtaie,
      ctaie: ctaie,
      ctbie: ctbie,
      battery: battery,
      bsf: bsf,
      blf: blf,
      bsei: bsei,
      blie: blie
    }

    {:ok, config}
  end

  def decode(_other), do: {:error, :invalid}

  @spec encode(t()) :: <<_::24>>
  def encode(cfg) do
    <<0::1, 0::1, cfg.stop::1, cfg.sr::1, cfg.twelve_hour::1, cfg.sie::1, cfg.aie::1, cfg.cie::1,
      cfg.wtaf::1, cfg.ctaf::1, cfg.ctbf::1, cfg.sf::1, cfg.af::1, cfg.wtaie::1, cfg.ctaie::1,
      cfg.ctaie::1, cfg.battery::3, 0::1, cfg.bsf::1, cfg.blf::1, cfg.bsei::1, cfg.blie::1>>
  end
end