From e2548b3af4b8feafbb1c281d99a1f52b90a5da0b Mon Sep 17 00:00:00 2001 From: Rick Carlino Date: Wed, 8 Jan 2020 13:53:18 -0600 Subject: [PATCH 1/5] TEST RELEASE; PLEASE IGNORE. --- farmbot_firmware/lib/farmbot_firmware.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/farmbot_firmware/lib/farmbot_firmware.ex b/farmbot_firmware/lib/farmbot_firmware.ex index 516241d94..3293942b7 100644 --- a/farmbot_firmware/lib/farmbot_firmware.ex +++ b/farmbot_firmware/lib/farmbot_firmware.ex @@ -241,7 +241,7 @@ defmodule FarmbotFirmware do args = Keyword.merge(args, global) transport = Keyword.fetch!(args, :transport) side_effects = Keyword.get(args, :side_effects) - reset = Keyword.fetch!(args, :reset) + reset = Keyword.get(args, :reset) || __MODULE__ vcr_fd = case Keyword.get(args, :vcr_path) do From 2f640c5d13e981a37195291e20024142131ce30d Mon Sep 17 00:00:00 2001 From: Rick Carlino Date: Wed, 8 Jan 2020 14:14:48 -0600 Subject: [PATCH 2/5] If the process has already started, consider firmware reboot complete --- farmbot_firmware/lib/farmbot_firmware.ex | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/farmbot_firmware/lib/farmbot_firmware.ex b/farmbot_firmware/lib/farmbot_firmware.ex index 3293942b7..d16916d01 100644 --- a/farmbot_firmware/lib/farmbot_firmware.ex +++ b/farmbot_firmware/lib/farmbot_firmware.ex @@ -290,6 +290,11 @@ defmodule FarmbotFirmware do Logger.debug("Firmware reset #{state.reset} started. #{inspect(state.transport_args)}") {:noreply, %{state | reset_pid: pid}} + # TODO(Rick): I have no idea what's going on here. + {:error, {:already_started, pid}} -> + Logger.debug("Firmware reset complete. #{inspect(state.transport_args)}") + {:noreply, %{state | reset_pid: pid}} + error -> Logger.error("Error starting Firmware Reset: #{inspect(error)}") Process.send_after(self(), :timeout, @transport_init_error_retry_ms) From d9ba9f25ca8b76a08c8d2e332e9931d8b3b19f07 Mon Sep 17 00:00:00 2001 From: Rick Carlino Date: Wed, 8 Jan 2020 14:44:15 -0600 Subject: [PATCH 3/5] It appears that the `:reset` config is not passed in under all circumstances...? --- .../lib/farmbot_firmware/transports/uart_transport.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/farmbot_firmware/lib/farmbot_firmware/transports/uart_transport.ex b/farmbot_firmware/lib/farmbot_firmware/transports/uart_transport.ex index 0c29c0795..0616433ca 100644 --- a/farmbot_firmware/lib/farmbot_firmware/transports/uart_transport.ex +++ b/farmbot_firmware/lib/farmbot_firmware/transports/uart_transport.ex @@ -14,7 +14,7 @@ defmodule FarmbotFirmware.UARTTransport do def init(args) do device = Keyword.fetch!(args, :device) handle_gcode = Keyword.fetch!(args, :handle_gcode) - reset = Keyword.fetch!(args, :reset) + reset = Keyword.get(args, :reset) {:ok, uart} = UART.start_link() {:ok, %{uart: uart, device: device, open: false, handle_gcode: handle_gcode, reset: reset}, 0} end From 0d549379460bd289cc87a28ae85e545d409014a1 Mon Sep 17 00:00:00 2001 From: Rick Carlino Date: Thu, 9 Jan 2020 11:59:02 -0600 Subject: [PATCH 4/5] Pattern matching problems? --- .../lib/farmbot_core/firmware_side_effects.ex | 13 ++++++++++--- farmbot_ext/lib/farmbot_ext/jwt.ex | 2 +- farmbot_firmware/lib/farmbot_firmware.ex | 4 ++-- farmbot_firmware/lib/farmbot_firmware/command.ex | 2 +- .../lib/farmbot_firmware/gcode/decoder.ex | 4 ++++ .../lib/farmbot_firmware/gcode/encoder.ex | 6 +++++- farmbot_firmware/lib/farmbot_firmware/request.ex | 2 +- 7 files changed, 24 insertions(+), 9 deletions(-) diff --git a/farmbot_core/lib/farmbot_core/firmware_side_effects.ex b/farmbot_core/lib/farmbot_core/firmware_side_effects.ex index 93374fc9f..6e45d00eb 100644 --- a/farmbot_core/lib/farmbot_core/firmware_side_effects.ex +++ b/farmbot_core/lib/farmbot_core/firmware_side_effects.ex @@ -27,7 +27,7 @@ defmodule FarmbotCore.FirmwareSideEffects do @impl FarmbotFirmware.SideEffects def handle_axis_timeout(axis) do - FarmbotCore.Logger.error 1, "Axis #{axis} timed out waiting for movement to complete" + FarmbotCore.Logger.error(1, "Axis #{axis} timed out waiting for movement to complete") :noop end @@ -48,7 +48,7 @@ defmodule FarmbotCore.FirmwareSideEffects do # this is a bug in the firmware code i think def handle_encoders_scaled([]), do: :noop - + @impl FarmbotFirmware.SideEffects def handle_encoders_raw(x: x, y: y, z: z) do :ok = BotState.set_encoders_raw(x, y, z) @@ -64,6 +64,7 @@ defmodule FarmbotCore.FirmwareSideEffects do %{param => value} |> Asset.update_firmware_config!() |> Asset.Private.mark_dirty!(%{}) + :ok end @@ -75,27 +76,33 @@ defmodule FarmbotCore.FirmwareSideEffects do @impl FarmbotFirmware.SideEffects def handle_software_version([version]) do :ok = BotState.set_firmware_version(version) + case String.split(version, ".") do # Ramps [_, _, _, "R"] -> _ = Leds.red(:solid) :ok = BotState.set_firmware_hardware("arduino") + # Farmduino [_, _, _, "F"] -> _ = Leds.red(:solid) :ok = BotState.set_firmware_hardware("farmduino") + # Farmduino V14 [_, _, _, "G"] -> _ = Leds.red(:solid) :ok = BotState.set_firmware_hardware("farmduino_k14") + # Farmduino V15 [_, _, _, "H"] -> _ = Leds.red(:solid) :ok = BotState.set_firmware_hardware("farmduino_k15") + # Express V10 [_, _, _, "E"] -> _ = Leds.red(:solid) :ok = BotState.set_firmware_hardware("express_k10") + [_, _, _, "S"] -> _ = Leds.red(:slow_blink) :ok = BotState.set_firmware_version("none") @@ -159,7 +166,7 @@ defmodule FarmbotCore.FirmwareSideEffects do @impl FarmbotFirmware.SideEffects def handle_debug_message([message]) do fbos_config = Asset.fbos_config() - should_log? = fbos_config.firmware_debug_log || fbos_config.arduino_debug_messages + should_log? = fbos_config.firmware_debug_log || fbos_config.arduino_debug_messages should_log? && FarmbotCore.Logger.debug(3, "Firmware debug message: " <> message) end diff --git a/farmbot_ext/lib/farmbot_ext/jwt.ex b/farmbot_ext/lib/farmbot_ext/jwt.ex index 306562463..7b432eaba 100644 --- a/farmbot_ext/lib/farmbot_ext/jwt.ex +++ b/farmbot_ext/lib/farmbot_ext/jwt.ex @@ -37,7 +37,7 @@ defmodule FarmbotExt.JWT do {:ok, jwt} else :error -> {:error, "base64_decode_fail"} - {:error, _resson} -> {:error, "json_decode_error"} + {:error, _reason} -> {:error, "json_decode_error"} end end diff --git a/farmbot_firmware/lib/farmbot_firmware.ex b/farmbot_firmware/lib/farmbot_firmware.ex index d16916d01..37836f7b8 100644 --- a/farmbot_firmware/lib/farmbot_firmware.ex +++ b/farmbot_firmware/lib/farmbot_firmware.ex @@ -636,7 +636,7 @@ defmodule FarmbotFirmware do {:noreply, goto(state, :busy)} end - def handle_report({:report_error, []} = code, %{status: :configuration} = state) do + def handle_report({:report_error, _} = code, %{status: :configuration} = state) do if state.caller_pid, do: send(state.caller_pid, {state.tag, code}) for {pid, _code} <- state.command_queue, do: send(pid, {state.tag, {:report_busy, []}}) @@ -644,7 +644,7 @@ defmodule FarmbotFirmware do {:stop, {:error, state.current}, state} end - def handle_report({:report_error, []} = code, state) do + def handle_report({:report_error, _} = code, state) do if state.caller_pid, do: send(state.caller_pid, {state.tag, code}) for {pid, _code} <- state.command_queue, do: send(pid, {state.tag, {:report_busy, []}}) diff --git a/farmbot_firmware/lib/farmbot_firmware/command.ex b/farmbot_firmware/lib/farmbot_firmware/command.ex index 40eae1ea5..c39dee098 100644 --- a/farmbot_firmware/lib/farmbot_firmware/command.ex +++ b/farmbot_firmware/lib/farmbot_firmware/command.ex @@ -46,7 +46,7 @@ defmodule FarmbotFirmware.Command do debug_log("#{GCODE.encode(code)} position change") wait_for_command_result(tag, code, retries, error) - {_, {:report_error, []}} -> + {_, {:report_error, _}} -> debug_log("#{GCODE.encode(code)} firmware error") if err, do: {:error, err}, else: {:error, :firmware_error} diff --git a/farmbot_firmware/lib/farmbot_firmware/gcode/decoder.ex b/farmbot_firmware/lib/farmbot_firmware/gcode/decoder.ex index 6ad605b86..a3ddf01d8 100644 --- a/farmbot_firmware/lib/farmbot_firmware/gcode/decoder.ex +++ b/farmbot_firmware/lib/farmbot_firmware/gcode/decoder.ex @@ -91,6 +91,10 @@ defmodule FarmbotFirmware.GCODE.Decoder do def decode_error(["V14"]), do: [:invalid_command] def decode_error(["V15"]), do: [:no_config] def decode_error([unk]), do: [unknown_error: unk] + # TODO(Rick): This is a guess. Can be removed if + # better solution is found. + # FarmBot/farmbot_os/issues/1105#issuecomment-572381069 + def decode_error(unk), do: [unknown_error: [unk]] defp decode_floats(list, acc \\ []) diff --git a/farmbot_firmware/lib/farmbot_firmware/gcode/encoder.ex b/farmbot_firmware/lib/farmbot_firmware/gcode/encoder.ex index 88cd4c41c..cb56bd0fb 100644 --- a/farmbot_firmware/lib/farmbot_firmware/gcode/encoder.ex +++ b/farmbot_firmware/lib/farmbot_firmware/gcode/encoder.ex @@ -8,7 +8,10 @@ defmodule FarmbotFirmware.GCODE.Encoder do def do_encode(:report_idle, []), do: "R00" def do_encode(:report_begin, []), do: "R01" def do_encode(:report_success, []), do: "R02" - def do_encode(:report_error, []), do: "R03" + # TODO(Rick): Why are some `:report_error`s sending + # tuples instead of lists?? + # https://github.com/FarmBot/farmbot_os/issues/1105#issuecomment-572381069 + def do_encode(:report_error, _), do: "R03" def do_encode(:report_busy, []), do: "R04" def do_encode(:report_axis_state, xyz), do: "R05 " <> encode_axis_state(xyz) @@ -84,6 +87,7 @@ defmodule FarmbotFirmware.GCODE.Encoder do def do_encode(:command_emergency_unlock, _), do: "F09" def do_encode(:command_emergency_lock, _), do: "E" + def do_encode(), do: "R03" @spec encode_floats([{Param.t(), float()}]) :: binary() defp encode_floats(args) do diff --git a/farmbot_firmware/lib/farmbot_firmware/request.ex b/farmbot_firmware/lib/farmbot_firmware/request.ex index 0b7c8d5e1..272f20425 100644 --- a/farmbot_firmware/lib/farmbot_firmware/request.ex +++ b/farmbot_firmware/lib/farmbot_firmware/request.ex @@ -65,7 +65,7 @@ defmodule FarmbotFirmware.Request do do: {:ok, {tag, result}}, else: wait_for_request_result(tag, code, result) - {_, {:report_error, []}} -> + {_, {:report_error, _}} -> {:error, :firmware_error} {_, {:report_invalid, []}} -> From 5c04f54cd85fedb3b61b048d9e243cf105b871b3 Mon Sep 17 00:00:00 2001 From: Rick Carlino Date: Thu, 9 Jan 2020 13:32:45 -0600 Subject: [PATCH 5/5] v9.0.1-rc2 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index ee3ea8073..e14105e1c 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -9.0.1-rc1 +9.0.1-rc2