[UNSTABLE] adding a database
parent
7a6605bca0
commit
8c13c4cd5d
|
@ -27,6 +27,7 @@ defmodule BotState do
|
|||
pins: %{},
|
||||
configuration: %{ os_auto_update: false,
|
||||
fw_auto_update: false,
|
||||
timezone: nil,
|
||||
steps_per_mm: 500 },
|
||||
informational_settings: %{
|
||||
controller_version: Fw.version,
|
||||
|
@ -45,7 +46,8 @@ defmodule BotState do
|
|||
else
|
||||
Logger.debug("Trying to apply last bot state")
|
||||
spawn fn -> apply_status(rcontents) end
|
||||
default_state
|
||||
old_config = rcontents.configuration
|
||||
Map.put(default_state, :configuration, old_config)
|
||||
end
|
||||
_ ->
|
||||
spawn fn -> apply_status(default_state) end
|
||||
|
@ -81,6 +83,12 @@ defmodule BotState do
|
|||
{:reply, true, Map.put(state, :configuration, new_config)}
|
||||
end
|
||||
|
||||
def handle_call({:update_config, "timezone", value}, _from, state)
|
||||
when is_bitstring(value) do
|
||||
new_config = Map.put(state.configuration, :timezone, value)
|
||||
{:reply, true, Map.put(state, :configuration, new_config)}
|
||||
end
|
||||
|
||||
def handle_call({:update_config, "steps_per_mm", value}, _from, state)
|
||||
when is_integer(value) do
|
||||
new_config = Map.put(state.configuration, :steps_per_mm, value)
|
||||
|
@ -226,6 +234,9 @@ defmodule BotState do
|
|||
Logger.error("Something weird happened applying last params: #{inspect params}")
|
||||
end
|
||||
|
||||
@doc """
|
||||
Update a config under key
|
||||
"""
|
||||
def update_config(config_key, value)
|
||||
when is_bitstring(config_key) do
|
||||
GenServer.call(__MODULE__, {:update_config, config_key, value})
|
||||
|
|
|
@ -14,7 +14,7 @@ defmodule FarmEventManager do
|
|||
end
|
||||
|
||||
def init(_args) do
|
||||
Process.send_after(self(), :save, @save_interval)
|
||||
# Process.send_after(self(), :save, @save_interval)
|
||||
{:ok, load}
|
||||
end
|
||||
|
||||
|
@ -33,221 +33,13 @@ defmodule FarmEventManager do
|
|||
SafeStorage.write(__MODULE__, :erlang.term_to_binary(state))
|
||||
end
|
||||
|
||||
def restart_regimens(old_state) do
|
||||
b = Auth.fetch_token
|
||||
cond do
|
||||
is_map(b) ->
|
||||
BotSync.sync()
|
||||
Process.sleep(5000)
|
||||
true -> restart_regimens(old_state)
|
||||
end
|
||||
BotSync.sync()
|
||||
r = old_state.running_regimens
|
||||
|> Enum.map(fn({_old_pid, regimen, finished_items, time}) ->
|
||||
Logger.debug("Restarting Regimen")
|
||||
{:ok, pid} = RegimenVM.start_link(regimen, finished_items, time)
|
||||
{pid, regimen, finished_items, time}
|
||||
end)
|
||||
GenServer.call(__MODULE__, {:update_running, r})
|
||||
end
|
||||
|
||||
# THIS SHOULDNT EXIST I DONT THINK
|
||||
def handle_call({:update_running, running}, _from, %{
|
||||
paused_regimens: pr,
|
||||
running_regimens: _,
|
||||
current_sequence: cs,
|
||||
sequence_log: sl,
|
||||
paused_sequences: ps
|
||||
}) do
|
||||
{:reply, :ok, %{
|
||||
paused_regimens: pr,
|
||||
running_regimens: running,
|
||||
current_sequence: cs,
|
||||
sequence_log: sl,
|
||||
paused_sequences: ps
|
||||
} }
|
||||
end
|
||||
|
||||
# add a sequence when one isnt currently running and there is nothing in the list
|
||||
def handle_call( {:add, {:sequence, sequence}}, _from, %{
|
||||
paused_regimens: pr,
|
||||
running_regimens: rr,
|
||||
current_sequence: nil,
|
||||
sequence_log: [],
|
||||
paused_sequences: ps
|
||||
}) do
|
||||
RPCMessageHandler.log("Starting sequence: #{Map.get(sequence, "name")}", [:success_toast], [@log_tag])
|
||||
{:ok, pid} = SequenceManager.start_link(sequence)
|
||||
{:reply, "starting sequence", %{
|
||||
paused_regimens: pr,
|
||||
running_regimens: rr,
|
||||
current_sequence: {pid, sequence},
|
||||
sequence_log: [],
|
||||
paused_sequences: ps
|
||||
}}
|
||||
end
|
||||
|
||||
# add a sequence when there is one already running
|
||||
def handle_call( {:add, {:sequence, sequence}}, _from, %{
|
||||
paused_regimens: pr,
|
||||
running_regimens: rr,
|
||||
current_sequence: cur,
|
||||
sequence_log: log,
|
||||
paused_sequences: ps
|
||||
}) do
|
||||
RPCMessageHandler.log("Adding sequence to queue: #{sequence.name}", [:warning_toast], [@log_tag])
|
||||
{:reply, "queuing sequence", %{
|
||||
paused_regimens: pr,
|
||||
running_regimens: rr,
|
||||
current_sequence: cur,
|
||||
sequence_log: log ++ [sequence],
|
||||
paused_sequences: ps
|
||||
}}
|
||||
end
|
||||
|
||||
def handle_call( {:add, {:regimen, regimen}}, _from, state)
|
||||
when is_map(regimen) do
|
||||
# Combine both lists of regimens.
|
||||
all = state.paused_regimens ++ state.running_regimens
|
||||
|
||||
# check to see if this regimen exists in either list
|
||||
check =
|
||||
Enum.find(all, nil, fn({_pid, stored_regimen, _items, _time}) ->
|
||||
regimen == stored_regimen
|
||||
end)
|
||||
|
||||
case check do
|
||||
nil -> # this regimen isnt tracked and running yet.
|
||||
# REGIMENS ALWAYS START AT MIDNIGHT TODAY.
|
||||
|
||||
now = System.monotonic_time(:milliseconds)
|
||||
# now = :os.system_time
|
||||
Logger.warn("THE REGIMEN IS TIMER IS WRONG")
|
||||
# We need to know how many hours it has been since midnight. But all we
|
||||
# Have is gmt time.
|
||||
start_time = now
|
||||
|
||||
start_time =
|
||||
{:ok, pid} = RegimenVM.start_link(regimen, [], start_time)
|
||||
{:reply, :ok,
|
||||
Map.put(state,
|
||||
:running_regimens, state.running_regimens ++ [{pid, regimen, [], start_time}])}
|
||||
_ -> RPCMessageHandler.log(Map.get(regimen, "name") <> " is already started!", [:warning_toast], [@log_tag])
|
||||
{:reply, :ok, state}
|
||||
end
|
||||
end
|
||||
|
||||
def handle_call(:state, _from, state) do
|
||||
{:reply, state, state}
|
||||
end
|
||||
|
||||
def handle_call(:jsonable, _from, state) do
|
||||
# I CAN DO BETTER
|
||||
pr = Enum.map(state.paused_regimens, fn ({_, regimen, _, _}) -> regimen end)
|
||||
rr = Enum.map(state.running_regimens, fn ({_, regimen, _, _}) -> regimen end)
|
||||
ps = Enum.map(state.paused_sequences, fn ({_, seq}) -> seq end)
|
||||
{_pid, cs} = state.current_sequence || {nil, nil}
|
||||
sl = state.paused_sequences
|
||||
jsonable = %{paused_regimens: pr,
|
||||
running_regimens: rr,
|
||||
current_sequence: cs,
|
||||
paused_sequences: ps,
|
||||
sequence_log: sl}
|
||||
{:reply, jsonable, state}
|
||||
end
|
||||
|
||||
def handle_info({:done, {:regimen_items, {pid, regimen, items, time}}}, state) do
|
||||
Logger.debug("#{Map.get(regimen, "name")} has completed an item.")
|
||||
index = Enum.find_index(state.running_regimens, fn({rpid, rregimen, _ritems, _time}) ->
|
||||
{pid, regimen} == {rpid, rregimen}
|
||||
end)
|
||||
cond do
|
||||
is_integer(index) ->
|
||||
new_running = List.replace_at(state.running_regimens, index, {pid, regimen, items, time})
|
||||
{:noreply, Map.put(state, :running_regimens, new_running)}
|
||||
true ->
|
||||
Logger.debug("bad index")
|
||||
{:noreply, state}
|
||||
end
|
||||
end
|
||||
|
||||
def handle_info({:done, {:regimen, {pid, regimen} }}, state) do
|
||||
Logger.debug("#{Map.get(regimen, "name")} is stopping.")
|
||||
Enum.find_value(state.running_regimens, nil, fn({rpid, rregimen, items, time}) ->
|
||||
if {rpid, rregimen} == {pid, regimen} do
|
||||
{:noreply,
|
||||
Map.put(state, :running_regimens,
|
||||
state.running_regimens -- [{pid, regimen, items, time}])}
|
||||
end
|
||||
end) ||
|
||||
Enum.find_value(state.paused_regimens, nil, fn({rpid, rregimen,items, time}) ->
|
||||
if {rpid, rregimen} == {pid, regimen} do
|
||||
{:noreply,
|
||||
Map.put(state, :paused_regimens,
|
||||
state.paused_regimens -- [{pid, regimen, items, time}])}
|
||||
end
|
||||
end)
|
||||
end
|
||||
|
||||
def handle_info({:done, {:sequence, pid}}, %{
|
||||
paused_regimens: pr,
|
||||
running_regimens: rr,
|
||||
current_sequence: _cur,
|
||||
sequence_log: [],
|
||||
paused_sequences: ps
|
||||
}) do
|
||||
GenServer.stop(pid, :normal)
|
||||
m = "FarmEventManager is out of sequences to run."
|
||||
Logger.debug(m)
|
||||
RPCMessageHandler.log(m, [:success_toast, :ticker], [@log_tag])
|
||||
{:noreply,
|
||||
%{
|
||||
paused_regimens: pr,
|
||||
running_regimens: rr,
|
||||
current_sequence: nil,
|
||||
sequence_log: [],
|
||||
paused_sequences: ps
|
||||
}}
|
||||
end
|
||||
|
||||
def handle_info({:done, {:sequence, pid}},
|
||||
%{
|
||||
paused_regimens: pr,
|
||||
running_regimens: rr,
|
||||
current_sequence: _old_pid,
|
||||
sequence_log: log,
|
||||
paused_sequences: ps
|
||||
})
|
||||
do
|
||||
GenServer.stop(pid, :normal)
|
||||
m = "FarmEventManager is out of sequences to run."
|
||||
Logger.debug(m)
|
||||
RPCMessageHandler.log(m, [:success_toast, :ticker], [@log_tag])
|
||||
next_seq = List.first(log)
|
||||
{:ok, new_pid} = SequenceManager.start_link(next_seq)
|
||||
{:noreply,
|
||||
%{
|
||||
paused_regimens: pr,
|
||||
running_regimens: rr,
|
||||
current_sequence: {new_pid, next_seq},
|
||||
sequence_log: log -- [next_seq],
|
||||
paused_sequences: ps
|
||||
}}
|
||||
end
|
||||
|
||||
def handle_info(:save, state) do
|
||||
save(state)
|
||||
Process.send_after(self(), :save, @save_interval)
|
||||
{:noreply, state}
|
||||
end
|
||||
|
||||
def terminate(:normal, state) do
|
||||
Logger.debug("Farm Event Manager died. This is not good.")
|
||||
save(state)
|
||||
end
|
||||
|
||||
def terminate(reason, state) do
|
||||
Logger.debug("Farm Event Manager died. This is not good.")
|
||||
Logger.error("Farm Event Manager died. This is not good.")
|
||||
spawn fn -> RPCMessageHandler.send_status end
|
||||
IO.inspect reason
|
||||
IO.inspect state
|
||||
|
|
|
@ -271,7 +271,7 @@ defmodule RPCMessageHandler do
|
|||
regimen = BotSync.get_regimen(id)
|
||||
running = GenServer.call(FarmEventManager, :state)
|
||||
|> Map.get(:running_regimens)
|
||||
|> Enum.find(fn({_p, re}) ->
|
||||
|> Enum.find(fn({_pid, re, _items, _start_time}) ->
|
||||
re == regimen
|
||||
end)
|
||||
send(FarmEventManager, {:done, {:regimen, running}})
|
||||
|
|
|
@ -42,13 +42,13 @@ defmodule RegimenVM do
|
|||
regimen: regimen
|
||||
})
|
||||
do
|
||||
now = System.monotonic_time(:milliseconds)
|
||||
now = Timex.now(BotState.get_config(:timezone))
|
||||
{items_to_do, remaining_items} =
|
||||
Enum.partition(items, fn(item) ->
|
||||
offset = Map.get(item, "time_offset")
|
||||
lhs = (now - start_time)
|
||||
rhs = (offset)
|
||||
case ( lhs > rhs ) do
|
||||
run_time = Timex.shift(start_time, milliseconds: offset)
|
||||
should_run = Timex.after?(now, run_time)
|
||||
case ( should_run ) do
|
||||
true ->
|
||||
sequence = BotSync.get_sequence(Map.get(item, "sequence_id"))
|
||||
msg = "Time to run Sequence: " <> Map.get(sequence, "name")
|
||||
|
@ -58,7 +58,7 @@ defmodule RegimenVM do
|
|||
false ->
|
||||
:ok
|
||||
end
|
||||
( lhs > rhs )
|
||||
should_run
|
||||
end)
|
||||
if(items_to_do == []) do
|
||||
RPCMessageHandler.log("nothing to run this cycle", [], [Map.get(regimen, "name")])
|
||||
|
|
|
@ -0,0 +1,3 @@
|
|||
defmodule Sequence do
|
||||
defstruct
|
||||
end
|
8
mix.exs
8
mix.exs
|
@ -38,7 +38,8 @@ defmodule Fw.Mixfile do
|
|||
:rsa,
|
||||
:hulaaki,
|
||||
:runtime_tools,
|
||||
:mustache]
|
||||
:mustache,
|
||||
:timex]
|
||||
end
|
||||
|
||||
# on device
|
||||
|
@ -74,7 +75,8 @@ defmodule Fw.Mixfile do
|
|||
{:nerves_lib, github: "nerves-project/nerves_lib"},
|
||||
{:rsa, "~> 0.0.1"},
|
||||
{:hulaaki, github: "ConnorRigby/hulaaki"},
|
||||
{:mustache, "~> 0.0.2"}
|
||||
{:mustache, "~> 0.0.2"},
|
||||
{:timex, "~> 3.0"}
|
||||
]
|
||||
end
|
||||
|
||||
|
@ -83,7 +85,7 @@ defmodule Fw.Mixfile do
|
|||
[
|
||||
{:nerves, "~> 0.3.0"},
|
||||
{:nerves_firmware_http, github: "nerves-project/nerves_firmware_http"},
|
||||
{:farmbot_configurator, github: "FarmBot/farmbot_configurator"}
|
||||
{:farmbot_configurator, path: "../farmbot_configurator"}
|
||||
]
|
||||
end
|
||||
|
||||
|
|
12
mix.lock
12
mix.lock
|
@ -1,5 +1,7 @@
|
|||
%{"bbmustache": {:hex, :bbmustache, "1.0.4", "7ba94f971c5afd7b6617918a4bb74705e36cab36eb84b19b6a1b7ee06427aa38", [:rebar], []},
|
||||
"certifi": {:hex, :certifi, "0.7.0", "861a57f3808f7eb0c2d1802afeaae0fa5de813b0df0979153cbafcd853ababaf", [:rebar3], []},
|
||||
"cf": {:hex, :cf, "0.2.1", "69d0b1349fd4d7d4dc55b7f407d29d7a840bf9a1ef5af529f1ebe0ce153fc2ab", [:rebar3], []},
|
||||
"combine": {:hex, :combine, "0.9.2", "cd3c8721f378ebe032487d8a4fa2ced3181a456a3c21b16464da8c46904bb552", [:mix], []},
|
||||
"cors_plug": {:hex, :cors_plug, "1.1.2", "3e7451286996f745c7b629c39d24a6493e59b0c8191f27e67f6ab097f96ffd23", [:mix], [{:cowboy, "~> 1.0.0", [hex: :cowboy, optional: false]}, {:plug, "> 0.8.0", [hex: :plug, optional: false]}]},
|
||||
"cowboy": {:hex, :cowboy, "1.0.4", "a324a8df9f2316c833a470d918aaf73ae894278b8aa6226ce7a9bf699388f878", [:rebar, :make], [{:cowlib, "~> 1.0.0", [hex: :cowlib, optional: false]}, {:ranch, "~> 1.0", [hex: :ranch, optional: false]}]},
|
||||
"cowlib": {:hex, :cowlib, "1.0.2", "9d769a1d062c9c3ac753096f868ca121e2730b9a377de23dec0f7e08b1df84ee", [:make], []},
|
||||
|
@ -12,11 +14,16 @@
|
|||
"farmbot_configurator": {:git, "https://github.com/FarmBot/farmbot_configurator.git", "c47caa05298146d14411dac52413b2fe554d99b2", []},
|
||||
"gen_stage": {:hex, :gen_stage, "0.8.0", "a76e3f0530f86fae8b8a1021c06527b1ec171cf4c0bdfecd8d5ad0376d1205af", [:mix], []},
|
||||
"getopt": {:hex, :getopt, "0.8.2", "b17556db683000ba50370b16c0619df1337e7af7ecbf7d64fbf8d1d6bce3109b", [:rebar], []},
|
||||
"gettext": {:hex, :gettext, "0.12.1", "c0624f52763469ef7a3674919ae28b8286d88195b90fa1516180f31bbbd26d14", [:mix], []},
|
||||
"hackney": {:hex, :hackney, "1.6.3", "d489d7ca2d4323e307bedc4bfe684323a7bf773ecfd77938f3ee8074e488e140", [:rebar3, :mix], [{:certifi, "0.7.0", [hex: :certifi, optional: false]}, {:idna, "1.2.0", [hex: :idna, optional: false]}, {:metrics, "1.0.1", [hex: :metrics, optional: false]}, {:mimerl, "1.0.2", [hex: :mimerl, optional: false]}, {:ssl_verify_fun, "1.1.1", [hex: :ssl_verify_fun, optional: false]}]},
|
||||
"httpotion": {:hex, :httpotion, "3.0.2", "525b9bfeb592c914a61a8ee31fdde3871e1861dfe805f8ee5f711f9f11a93483", [:mix], [{:ibrowse, "~> 4.2", [hex: :ibrowse, optional: false]}]},
|
||||
"hulaaki": {:git, "https://github.com/ConnorRigby/hulaaki.git", "47b77e8673ce522f9475e0c2e29f97648ce8598c", []},
|
||||
"ibrowse": {:hex, :ibrowse, "4.2.2", "b32b5bafcc77b7277eff030ed32e1acc3f610c64e9f6aea19822abcadf681b4b", [:rebar3], []},
|
||||
"idna": {:hex, :idna, "1.2.0", "ac62ee99da068f43c50dc69acf700e03a62a348360126260e87f2b54eced86b2", [:rebar3], []},
|
||||
"jsx": {:hex, :jsx, "2.8.0", "749bec6d205c694ae1786d62cea6cc45a390437e24835fd16d12d74f07097727", [:mix, :rebar], []},
|
||||
"metrics": {:hex, :metrics, "1.0.1", "25f094dea2cda98213cecc3aeff09e940299d950904393b2a29d191c346a8486", [:rebar3], []},
|
||||
"mime": {:hex, :mime, "1.0.1", "05c393850524767d13a53627df71beeebb016205eb43bfbd92d14d24ec7a1b51", [:mix], []},
|
||||
"mimerl": {:hex, :mimerl, "1.0.2", "993f9b0e084083405ed8252b99460c4f0563e41729ab42d9074fd5e52439be88", [:rebar3], []},
|
||||
"mustache": {:hex, :mustache, "0.0.2", "870fbef411c47d17df06a57b8b3f69e26eb110cba0177c34e273db5d94369d9b", [:mix], []},
|
||||
"nerves": {:hex, :nerves, "0.3.4", "7de99513f2775633e2db00acbf7437c55bd132f19b7406814f50818702b381b5", [:mix], [{:exrm, "~> 1.0.6", [hex: :exrm, optional: false]}]},
|
||||
"nerves_firmware": {:git, "https://github.com/nerves-project/nerves_firmware.git", "241a12694bd3bc2b4df8cbb7e0f0beaeff075b1c", []},
|
||||
|
@ -39,4 +46,7 @@
|
|||
"providers": {:hex, :providers, "1.6.0", "db0e2f9043ae60c0155205fcd238d68516331d0e5146155e33d1e79dc452964a", [:rebar3], [{:getopt, "0.8.2", [hex: :getopt, optional: false]}]},
|
||||
"ranch": {:hex, :ranch, "1.2.1", "a6fb992c10f2187b46ffd17ce398ddf8a54f691b81768f9ef5f461ea7e28c762", [:make], []},
|
||||
"relx": {:hex, :relx, "3.21.1", "f989dc520730efd9075e9f4debcb8ba1d7d1e86b018b0bcf45a2eb80270b4ad6", [:rebar3], [{:bbmustache, "1.0.4", [hex: :bbmustache, optional: false]}, {:cf, "0.2.1", [hex: :cf, optional: false]}, {:erlware_commons, "0.21.0", [hex: :erlware_commons, optional: false]}, {:getopt, "0.8.2", [hex: :getopt, optional: false]}, {:providers, "1.6.0", [hex: :providers, optional: false]}]},
|
||||
"rsa": {:hex, :rsa, "0.0.1", "a63069f88ce342ffdf8448b7cdef4b39ba7dee3c1510644a39385c7e63ba246f", [:mix], []}}
|
||||
"rsa": {:hex, :rsa, "0.0.1", "a63069f88ce342ffdf8448b7cdef4b39ba7dee3c1510644a39385c7e63ba246f", [:mix], []},
|
||||
"ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.1", "28a4d65b7f59893bc2c7de786dec1e1555bd742d336043fe644ae956c3497fbe", [:rebar, :make], []},
|
||||
"timex": {:hex, :timex, "3.1.3", "3f9e7cd03190faf143098857bebd26c6d33e0709e7d3c42095da2393765fa225", [:mix], [{:combine, "~> 0.7", [hex: :combine, optional: false]}, {:gettext, "~> 0.10", [hex: :gettext, optional: false]}, {:tzdata, "~> 0.1.8 or ~> 0.5", [hex: :tzdata, optional: false]}]},
|
||||
"tzdata": {:hex, :tzdata, "0.5.9", "575be217b039057a47e133b72838cbe104fb5329b19906ea4e66857001c37edb", [:mix], [{:hackney, "~> 1.0", [hex: :hackney, optional: false]}]}}
|
||||
|
|
Loading…
Reference in New Issue