defmodule Robot.Links.Server do
@moduledoc """
Robot model as a GenServer
"""
use GenServer
import Robot.Links
import Collision.Detector
# Client
@doc """
## Example
{:ok, pid} =Robot.Links.Server.start_link([])
"""
def start_link(ops) do
GenServer.start_link(__MODULE__, :ok, ops)
end
@doc """
## Example
{:ok, pid} =Robot.Links.Server.start_link([])
Robot.Links.Server.draw_default(pid)
"""
def draw_default(pid) do
GenServer.cast(pid, :draw_default)
end
@doc """
## Example
{:ok, pid} =Robot.Links.Server.start_link([])
joints = %Robot.Joints{joint1: :math.pi/2, joint2: 0.0, joint3: 0.0, joint4: :math.pi/2, joint5: 0.0, joint6: 0.0}
robot_model = Robot.Links.Server.get_mesh_with_joints(pid, joints)
Robot.Links.Server.draw(pid, robot_model)
"""
def draw(pid, robot_model) do
GenServer.cast(pid, {:draw, robot_model})
end
@doc """
## Example
{:ok, pid} =Robot.Links.Server.start_link([])
joints = %Robot.Joints{joint1: :math.pi/2, joint2: 0.0, joint3: 0.0, joint4: :math.pi/2, joint5: 0.0, joint6: 0.0}
robot_model = Robot.Links.Server.get_mesh_with_joints(pid, joints)
"""
def get_mesh_with_joints(pid, joints) do
GenServer.call(pid, {:get_mesh_with_joints, joints})
end
# Server (callbacks)
@impl true
def init(_ops) do
geometries = File.read!("geometries.txt") |> :erlang.binary_to_term
link_base = File.read!("link_base.txt") |> :erlang.binary_to_term
link_1 = File.read!("link_1.txt") |> :erlang.binary_to_term
link_2 = File.read!("link_2.txt") |> :erlang.binary_to_term
link_3 = File.read!("link_3.txt") |> :erlang.binary_to_term
link_4 = File.read!("link_4.txt") |> :erlang.binary_to_term
link_5 = File.read!("link_5.txt") |> :erlang.binary_to_term
link_6 = File.read!("link_6.txt") |> :erlang.binary_to_term
names = geometries |> Enum.map(fn map -> map[:name] end)
{:ok, %{geometries: geometries, names: names, link_base: link_base, link_1: link_1, link_2: link_2, link_3: link_3, link_4: link_4, link_5: link_5, link_6: link_6}}
end
@impl true
def handle_cast(:draw_default, state) do
joints = %Robot.Joints{joint1: 0.0, joint2: 0.0, joint3: 0.0, joint4: 0.0, joint5: 0.0, joint6: 0.0}
robot_model = %Robot.Mesh{points: [], indices: [], translates: [], rotates: []}
robot_model = add_link_to_robot_model_by_name(robot_model, state[:geometries], state[:names], state[:link_base], 'gkmodel0_base_link_geom0', 0.0)
robot_model = add_link_to_robot_model_by_name(robot_model, state[:geometries], state[:names], state[:link_1], 'gkmodel0_link_1_geom0', joints.joint1)
robot_model = add_link_to_robot_model_by_name(robot_model, state[:geometries], state[:names], state[:link_2], 'gkmodel0_link_2_geom0', joints.joint2)
robot_model = add_link_to_robot_model_by_name(robot_model, state[:geometries], state[:names], state[:link_3], 'gkmodel0_link_3_geom0', joints.joint3)
robot_model = add_link_to_robot_model_by_name(robot_model, state[:geometries], state[:names], state[:link_4], 'gkmodel0_link_4_geom0', joints.joint4)
robot_model = add_link_to_robot_model_by_name(robot_model, state[:geometries], state[:names], state[:link_5], 'gkmodel0_link_5_geom0', joints.joint5)
robot_model = add_link_to_robot_model_by_name(robot_model, state[:geometries], state[:names], state[:link_6], 'gkmodel0_link_6_geom0', joints.joint6)
points = robot_model.points
indices = robot_model.indices
translates = robot_model.translates
rotates = robot_model.rotates
#IO.inspect translates
#IO.inspect rotates
draw(points,indices,translates,rotates)
{:noreply, state}
end
@impl true
def handle_cast({:draw, robot_model}, state) do
points = robot_model.points
indices = robot_model.indices
translates = robot_model.translates
rotates = robot_model.rotates
#IO.inspect translates
#IO.inspect rotates
draw(points,indices,translates,rotates)
{:noreply, state}
end
@impl true
def handle_call({:get_mesh_with_joints, joints}, _from, state) do
robot_model = %Robot.Mesh{points: [], indices: [], translates: [], rotates: []}
robot_model = add_link_to_robot_model_by_name(robot_model, state[:geometries], state[:names], state[:link_base], 'gkmodel0_base_link_geom0', 0.0)
robot_model = add_link_to_robot_model_by_name(robot_model, state[:geometries], state[:names], state[:link_1], 'gkmodel0_link_1_geom0', joints.joint1)
robot_model = add_link_to_robot_model_by_name(robot_model, state[:geometries], state[:names], state[:link_2], 'gkmodel0_link_2_geom0', joints.joint2)
robot_model = add_link_to_robot_model_by_name(robot_model, state[:geometries], state[:names], state[:link_3], 'gkmodel0_link_3_geom0', joints.joint3)
robot_model = add_link_to_robot_model_by_name(robot_model, state[:geometries], state[:names], state[:link_4], 'gkmodel0_link_4_geom0', joints.joint4)
robot_model = add_link_to_robot_model_by_name(robot_model, state[:geometries], state[:names], state[:link_5], 'gkmodel0_link_5_geom0', joints.joint5)
robot_model = add_link_to_robot_model_by_name(robot_model, state[:geometries], state[:names], state[:link_6], 'gkmodel0_link_6_geom0', joints.joint6)
{:reply, robot_model, state}
end
end