[UNSTABLE] adding a database

pull/194/head
connor rigby 2016-11-02 07:33:46 -07:00
parent 7a6605bca0
commit 8c13c4cd5d
9 changed files with 39 additions and 221 deletions

View File

@ -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})

View File

@ -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

View File

@ -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}})

View File

@ -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")])

View File

View File

View File

@ -0,0 +1,3 @@
defmodule Sequence do
defstruct
end

View File

@ -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

View File

@ -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]}]}}