%% %% Copyright (c) 2024 RuhNet %% All rights reserved. %% %% Licensed under the GPL v3. %% -include("app.hrl"). -module(?APPNAME). -behaviour(supervisor). -export([start/0]). -export([init/1]). -define(SERVER, ?MODULE). start() -> io:format("========================================~n"), io:format("==== [ RuhNet - https://ruhnet.co ] ====~n"), io:format("========================================~n"), supervisor:start_link({local, ?SERVER}, ?MODULE, []), timer:sleep(infinity). %%% if this supervisor dies, since it is linked to this main process it %%% will die too, and trigger a restart of the device (IF you have set %%% the auto-restart on exit in your AtomVM compile config.) init([]) -> io:format("Starting supervisor '~p' with ~p/~p...~n", [?MODULE, ?FUNCTION_NAME, ?FUNCTION_ARITY]), setup_pins(), util:beep(220, 200), util:beep(440, 600), util:beep(180, 100), util:beep(440, 200), util:beep(180, 50), %ok = ledc_pwm:start(), MaxRestarts = 5, % Kill everyone and die if more than MaxRestarts failures per MaxSecBetweenRestarts seconds MaxSecBetweenRestarts = 10, %Worker = {led, {led, start_link, []}, permanent, 2000, worker, [led]}, Debugger = worker(debugger, start_link, []), Thermostat = worker(thermostat, start_link, []), TempReader = worker(temperature, start_link, []), MainControl = worker(control, start_link, []), NetworkSup = supervisor(network_sup, []), %LedControl = worker(led, start_link, []), %ButtonWatcher = worker(button_watcher, start_link, []), {ok, {{one_for_one, MaxRestarts, MaxSecBetweenRestarts}, [ Debugger %,LedControl ,TempReader ,Thermostat ,MainControl %,ButtonWatcher ,NetworkSup ] }}. %Create a worker spec: worker(Name, StartFunc, Args) -> {Name, {Name, StartFunc, Args}, permanent, brutal_kill, worker, [Name]}. supervisor(Name, Args) -> {Name, {Name, start_link, Args}, permanent, brutal_kill, supervisor, [Name]}. setup_pins() -> io:format("Setting pin modes...~n"), setup_pins(?OUTPUT_PINS, output), setup_pins(?INPUT_PINS, input). setup_pins([Pin|RemainingPins], Mode) -> gpio:set_pin_mode(Pin, Mode), %gpio:set_direction(GPIO, Pin, Mode), %gpio:start() first for Pid of GPIO case Mode of output -> case lists:member(Pin, ?GENERIC_OUTPUTS) of %check if this pin is a generic output true -> case ?GENERIC_OUTPUT_ACTIVE_LOW of true -> util:set_output(Pin, high); %turn active low generic outputs OFF by setting high. _ -> ok end; _ -> ok end; _ -> ok end, setup_pins(RemainingPins, Mode); setup_pins([], _Mode) -> ok.