%% a process for running an instance of the bt -module(bt_engine). -behaviour(gen_server). -include("./bt_node_behaviours/bt_nodes.hrl"). -record(state, { bt :: any(), blackboard :: blackboard() }). -export([ %% api start_link/1, 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_parser:parse(RootFilePath, TreeName, 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}.