Fix reporting WiFi signal

* Adds new `informational_settings` field: `wifi_level_percent`.
   This uses the built in vintage_net algorithm to accurately determine
   percentage
pull/974/head
Connor Rigby 2019-07-03 08:32:18 -07:00
parent 28ae6910fc
commit 6f5615fff4
No known key found for this signature in database
GPG Key ID: 29A88B24B70456E0
4 changed files with 75 additions and 8 deletions

View File

@ -135,6 +135,10 @@ defmodule FarmbotCore.BotState do
GenServer.call(bot_state_server, {:report_wifi_level, level})
end
def report_wifi_level_percent(bot_state_server \\ __MODULE__, percent) do
GenServer.call(bot_state_server, {:report_wifi_level_percent, percent})
end
def report_farmware_installed(bot_state_server \\ __MODULE__, name, %{} = manifest) do
GenServer.call(bot_state_server, {:report_farmware_installed, name, manifest})
end
@ -398,6 +402,16 @@ defmodule FarmbotCore.BotState do
{:reply, reply, state}
end
def handle_call({:report_wifi_level_percent, percent}, _form, state) do
change = %{informational_settings: %{wifi_level_percent: percent}}
{reply, state} =
BotStateNG.changeset(state.tree, change)
|> dispatch_and_apply(state)
{:reply, reply, state}
end
def handle_call({:report_farmware_installed, name, manifest}, _from, state) do
{reply, state} =
BotStateNG.add_or_update_farmware(state.tree, name, manifest)

View File

@ -19,6 +19,7 @@ defmodule FarmbotCore.BotStateNG.InformationalSettings do
field(:soc_temp, :integer)
field(:throttled, :string)
field(:wifi_level, :integer)
field(:wifi_level_percent, :integer)
field(:uptime, :integer)
field(:memory_usage, :integer)
field(:disk_usage, :integer)
@ -49,6 +50,7 @@ defmodule FarmbotCore.BotStateNG.InformationalSettings do
soc_temp: informational_settings.soc_temp,
throttled: informational_settings.throttled,
wifi_level: informational_settings.wifi_level,
wifi_level_percent: informational_settings.wifi_level_percent,
uptime: informational_settings.uptime,
memory_usage: informational_settings.memory_usage,
disk_usage: informational_settings.disk_usage,
@ -75,6 +77,7 @@ defmodule FarmbotCore.BotStateNG.InformationalSettings do
:soc_temp,
:throttled,
:wifi_level,
:wifi_level_percent,
:uptime,
:memory_usage,
:disk_usage,

View File

@ -93,7 +93,8 @@ defmodule FarmbotOS.Platform.Target.Configurator.Validator do
%{
key_mgmt: :none,
ssid: ssid,
scan_ssid: 1
scan_ssid: 1,
bgscan: :simple
}
end
@ -102,7 +103,8 @@ defmodule FarmbotOS.Platform.Target.Configurator.Validator do
ssid: ssid,
key_mgmt: :wpa_psk,
psk: psk,
scan_ssid: 1
scan_ssid: 1,
bgscan: :simple
}
end
@ -111,7 +113,8 @@ defmodule FarmbotOS.Platform.Target.Configurator.Validator do
ssid: ssid,
key_mgmt: :wpa_psk,
psk: psk,
scan_ssid: 1
scan_ssid: 1,
bgscan: :simple
}
end
@ -121,7 +124,8 @@ defmodule FarmbotOS.Platform.Target.Configurator.Validator do
key_mgmt: :wpa_eap,
identity: id,
password: pw,
scan_ssid: 1
scan_ssid: 1,
bgscan: :simple
}
end

View File

@ -1,17 +1,63 @@
defmodule FarmbotOS.Platform.Target.InfoWorker.WifiLevel do
use GenServer
require Logger
require FarmbotCore.Logger
alias FarmbotCore.BotState
def start_link(args) do
GenServer.start_link(__MODULE__, args)
end
def init(_args) do
{:ok, %{}, 0}
send(self(), :load_network_config)
{:ok, %{ssid: nil}}
end
def handle_info(:timeout, state) do
Logger.warn("Reenable wifi level worker")
def handle_info(:load_network_config, state) do
if FarmbotCore.Config.get_network_config("eth0") do
FarmbotCore.Logger.warn(3, """
FarmBot configured to use ethernet
Disabling WiFi status reporting
""")
{:noreply, state}
else
case FarmbotCore.Config.get_network_config("wlan0") do
%{ssid: ssid} ->
VintageNet.subscribe(["interface", "wlan0"])
{:noreply, %{state | ssid: ssid}}
nil ->
Process.send_after(self(), :load_network_config, 10_000)
{:noreply, %{state | ssid: nil}}
end
end
end
def handle_info(
{VintageNet, ["interface", "wlan0", "wifi", "access_points"], _, new, _meta},
%{ssid: ssid} = state
)
when is_binary(ssid) do
ap =
Enum.find_value(new, fn
{_bssid, %{ssid: ^ssid} = ap} ->
ap
_ ->
false
end)
if ap do
:ok = BotState.report_wifi_level(ap.signal_dbm)
:ok = BotState.report_wifi_level_percent(ap.signal_percent)
else
FarmbotCore.Logger.warn(3, "WiFi scan did not report configured ssid. Skipping")
end
{:noreply, state}
end
def handle_info({VintageNet, _property, _old, _new, _meta}, state) do
{:noreply, state}
end
end