Current section
Files
Jump to
Current section
Files
src/bt_engine/bt_engine.erl
%% a process for running an instance of the bt
-module(bt_engine).
-behaviour(gen_server).
-include("bt_nodes.hrl").
-record(state, {
bt :: any(),
blackboard :: blackboard()
}).
-export([
%% api
start_link/1,
start_link/2,
start_link/3,
tick/2,
get_tree/1,
%% cb
init/1,
handle_call/3,
handle_cast/2
]).
%% API
start_link({Tree, BB}) ->
gen_server:start_link(?MODULE, [Tree, BB], []).
start_link(RootFilePath, TreeName, Args) ->
{Tree, BB} = bt_yaml_parser:parse(RootFilePath, TreeName, Args),
start_link({Tree, BB}).
start_link(GeneratorModule, Args) when is_atom(GeneratorModule) ->
{Tree, BB} = bt_erl_parser:parse(GeneratorModule, Args),
start_link({Tree, BB}).
tick(Pid, Event) ->
gen_server:call(Pid, {event, Event}).
get_tree(Pid) ->
gen_server:call(Pid, get_tree).
%% Callbacks
init([Tree, BB]) ->
{ok,
#state{
bt = Tree,
blackboard = BB
}
}.
handle_call({event, Event}, _From, #state{bt = Tree, blackboard = BB}) ->
%% clear metadata before execution
TreeWithoutMetadata = bt_runner:clear_metadata(Tree),
{Status, NewTree, NewBB} = bt_runner:run(TreeWithoutMetadata, BB, Event),
{
reply,
Status,
#state{
bt = NewTree,
blackboard = NewBB
}
};
handle_call(get_tree, _From, State = #state{bt = Tree}) ->
{reply, Tree, State}.
%% not using
handle_cast(_, State) -> {noreply, State}.