farmbot_os/farmbot_os/lib/farmbot_os/sys_calls/flash_firmware.ex

71 lines
1.8 KiB
Elixir
Raw Normal View History

defmodule FarmbotOS.SysCalls.FlashFirmware do
2019-12-17 14:59:26 -07:00
@moduledoc false
2020-05-03 10:00:06 -06:00
alias FarmbotCore.{Asset, Asset.Private, FirmwareResetter}
alias FarmbotFirmware
alias FarmbotCore.FirmwareTTYDetector
2020-01-17 08:58:53 -07:00
import FarmbotFirmware.PackageUtils,
only: [find_hex_file: 1, package_to_string: 1]
require FarmbotCore.Logger
require Logger
def flash_firmware(package) do
2020-01-17 08:58:53 -07:00
FarmbotCore.Logger.busy(
2,
"Flashing #{package_to_string(package)} firmware"
)
with {:ok, hex_file} <- find_hex_file(package),
{:ok, tty} <- find_tty(),
2020-01-17 08:58:53 -07:00
_ <-
FarmbotCore.Logger.debug(3, "found tty: #{tty} for firmware flash"),
2020-05-03 10:00:06 -06:00
{:ok, fun} <- FirmwareResetter.find_reset_fun(package),
2020-01-17 08:58:53 -07:00
_ <-
FarmbotCore.Logger.debug(
3,
2020-05-01 14:47:47 -06:00
"Closing the firmware transport before flash"
2020-01-17 08:58:53 -07:00
),
:ok <- FarmbotFirmware.close_transport(),
_ <- FarmbotCore.Logger.debug(3, "starting firmware flash"),
2020-04-10 15:16:18 -06:00
_ <- finish_flashing(Avrdude.flash(hex_file, tty, fun)) do
2020-02-12 08:15:22 -07:00
%{firmware_path: tty}
|> Asset.update_fbos_config!()
|> Private.mark_dirty!(%{})
:ok
else
{:error, reason} when is_binary(reason) ->
{:error, reason}
2020-03-23 17:18:04 -06:00
error ->
2020-04-10 15:16:18 -06:00
{:error, "flash_firmware returned #{inspect(error)}"}
end
end
2020-04-10 15:16:18 -06:00
def finish_flashing({_result, 0}) do
2020-04-13 14:02:23 -06:00
FarmbotCore.Logger.success(
2020-04-13 15:04:48 -06:00
1,
2020-04-13 14:02:23 -06:00
"Firmware flashed successfully. Unlock FarmBot to finish initialization."
)
2020-04-10 15:16:18 -06:00
end
def finish_flashing(result) do
2020-04-12 16:39:34 -06:00
FarmbotCore.Logger.debug(2, "AVR flash returned #{inspect(result)}")
2020-04-10 15:16:18 -06:00
end
2020-05-01 13:53:57 -06:00
def find_tty() do
case FirmwareTTYDetector.tty() do
nil ->
{:error,
"""
No suitable TTY detected. Check cables and try again.
"""}
tty ->
{:ok, tty}
end
end
end