Current section

Files

Jump to
grizzly lib grizzly options.ex
Raw

lib/grizzly/options.ex

defmodule Grizzly.Options do
@moduledoc """
Grizzly config options.
"""
alias Grizzly.{Supervisor, Trace, ZWaveFirmware}
alias Grizzly.ZIPGateway.Config
require Logger
@typedoc """
Options for configuring Z-Wave module firmware upgrades.
* `enabled` - whether or not to enable firmware upgrades
* `specs` - a list of firmware upgrade specifications. If multiple specs match,
the first will be applied. See `Grizzly.ZWaveFirmware.UpgradeSpec`.
* `chip_series` - the Z-Wave module chip type. See `t:Grizzly.ZWaveFirmware.chip_series/0`.
* `module_reset_fun` - a function that performs a hard rest of the Z-Wave module.
Used to detect whether the module is stuck at the bootloader due to a previous
failed upgrade. See `t:Grizzly.ZWaveFirmware.module_reset_fun/0`.
"""
@type zwave_firmware_options :: %{
enabled: boolean(),
specs: [ZWaveFirmware.UpgradeSpec.t()],
chip_series: ZWaveFirmware.chip_series(),
module_reset_fun: ZWaveFirmware.module_reset_fun()
}
@typedoc """
See Grizzly.Supervisor
"""
@type t() :: %__MODULE__{
transport: module(),
run_zipgateway: boolean(),
serial_port: String.t(),
zipgateway_binary: Path.t(),
zipgateway_config_path: Path.t(),
zipgateway_port: :inet.port_number(),
manufacturer_id: non_neg_integer() | nil,
hardware_version: byte() | nil,
product_id: byte() | nil,
product_type: byte() | nil,
serial_log: Path.t() | nil,
tun_script: Path.t(),
lan_ip: :inet.ip_address(),
pan_ip: :inet.ip_address(),
inclusion_handler: Grizzly.handler() | nil,
firmware_update_handler: Grizzly.handler() | nil,
unsolicited_destination: {:inet.ip_address(), :inet.port_number()},
associations_file: Path.t(),
eeprom_file: Path.t() | nil,
database_file: Path.t() | nil,
indicator_handler: (Grizzly.Indicator.event() -> :ok),
rf_region: Supervisor.rf_region() | nil,
power_level: {Supervisor.tx_power(), Supervisor.measured_power()} | nil,
status_reporter: module(),
zwave_firmware: zwave_firmware_options(),
zw_programmer_path: Path.t(),
inclusion_adapter: module(),
extra_config: String.t() | nil,
trace_options: [Trace.trace_opt()]
}
defstruct run_zipgateway: true,
serial_port: "/dev/ttyUSB0",
zipgateway_binary: "/usr/sbin/zipgateway",
zipgateway_config_path: "/tmp/zipgateway.cfg",
transport: Grizzly.Transports.DTLS,
zipgateway_port: 41230,
manufacturer_id: nil,
hardware_version: nil,
product_id: nil,
product_type: nil,
serial_log: nil,
tun_script: "./zipgateway.tun",
pan_ip: {0xFD00, 0xBBBB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01},
lan_ip: {0xFD00, 0xAAAA, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01},
inclusion_handler: nil,
firmware_update_handler: nil,
unsolicited_destination: {{0xFD00, 0xAAAA, 0, 0, 0, 0, 0, 0x0002}, 41230},
associations_file: nil,
eeprom_file: "/data/zipeeprom.dat",
database_file: "/data/zipgateway.db",
indicator_handler: nil,
rf_region: nil,
power_level: nil,
status_reporter: Grizzly.StatusReporter.Console,
zwave_firmware: %{
enabled: false,
zw_programmer_path: "/usr/bin/zw_programmer",
specs: []
},
zw_programmer_path: "/usr/bin/zw_programmer",
inclusion_adapter: Grizzly.Inclusions.ZWaveAdapter,
extra_config: nil,
trace_options: []
@spec new([Supervisor.arg()]) :: t()
def new(opts \\ []) do
struct(__MODULE__, opts)
end
@spec to_zipgateway_config(t(), boolean()) :: Config.t()
def to_zipgateway_config(%__MODULE__{database_file: file} = grizzly_opts, use_database?)
when file == nil or not use_database? do
# Build a zipgateway configuration for zipgateway <7.14.2
Config.new(grizzly_opts)
end
def to_zipgateway_config(%__MODULE__{} = grizzly_opts, true = _use_database?) do
# Build a zipgateway configuration for zipgateway >= 7.14.2. This version
# of zipgateway will exit if an eeprom file is specified
Config.new(%{grizzly_opts | eeprom_file: nil})
end
end