iot/apps/iot/src/iot_device_sup.erl
2023-08-17 12:37:41 +08:00

42 lines
1.3 KiB
Erlang

%%%-------------------------------------------------------------------
%%% @author aresei
%%% @copyright (C) 2023, <COMPANY>
%%% @doc
%%% @end
%%%-------------------------------------------------------------------
-module(iot_device_sup).
-include("iot.hrl").
-behaviour(supervisor).
-export([start_link/0, init/1, delete_device/1, start_device/1]).
start_link() ->
supervisor:start_link({local, ?MODULE}, ?MODULE, []).
init([]) ->
{ok, {#{strategy => one_for_one, intensity => 1000, period => 3600}, []}}.
-spec start_device(UUID :: binary()) -> {ok, Pid :: pid()} | {error, Reason :: any()}.
start_device(DeviceUUID) when is_binary(DeviceUUID) ->
case supervisor:start_child(?MODULE, child_spec(DeviceUUID)) of
{ok, Pid} when is_pid(Pid) ->
{ok, Pid};
{error, {'already_started', Pid}} when is_pid(Pid) ->
{ok, Pid};
{error, Error} ->
{error, Error}
end.
delete_device(UUID) when is_binary(UUID) ->
Id = iot_device:get_name(UUID),
supervisor:terminate_child(?MODULE, Id).
child_spec(DeviceUUID) when is_binary(DeviceUUID) ->
Name = iot_device:get_name(DeviceUUID),
#{id => Name,
start => {iot_device, start_link, [Name, DeviceUUID]},
restart => permanent,
shutdown => 2000,
type => worker,
modules => ['iot_device']}.