142 lines
6.0 KiB
VHDL
142 lines
6.0 KiB
VHDL
-- altera vhdl_input_version vhdl_2008
|
|
-- XXX: QSYS Fix (https://www.intel.com/content/www/us/en/support/programmable/articles/000079458.html)
|
|
|
|
library ieee;
|
|
use ieee.std_logic_1164.all;
|
|
use ieee.numeric_std.all;
|
|
|
|
use work.math_pkg.all;
|
|
use work.rtps_package.all;
|
|
use work.ros_package.all;
|
|
use work.ros_config.all;
|
|
use work.user_config.all;
|
|
use work.rtps_config_package.all;
|
|
|
|
package ros_config_package is
|
|
constant ENDPOINT_ROS_NODE_MAPPING : ENDPOINT_ROS_NODE_MAPPING_ARRAY_TYPE(0 to NUM_ENDPOINTS-1); -- Deferred to Package Body
|
|
constant ROS_DISCOVERY_DATA : OUTPUT_DATA_TYPE; --Deferred to package body
|
|
end package;
|
|
|
|
package body ros_config_package is
|
|
|
|
-- NOTE: This function has to mirror the behaviour of the 'gen_config' function of the user_config package
|
|
function gen_endpoint_node_mapping return ENDPOINT_ROS_NODE_MAPPING_ARRAY_TYPE is
|
|
variable ret : ENDPOINT_ROS_NODE_MAPPING_ARRAY_TYPE(0 to NUM_ENDPOINTS-1) := (others => 0);
|
|
variable index : natural;
|
|
begin
|
|
ret := (others => NUM_NODES);
|
|
index := 0;
|
|
|
|
-- SUBSCRIPTIONS
|
|
for i in 0 to ROS_SUBSCRIPTIONS'length-1 loop
|
|
ret(index) := ROS_SUBSCRIPTIONS(i).node_id;
|
|
index := index + 1;
|
|
end loop;
|
|
-- SERVICE SUBS
|
|
for i in 0 to ROS_SERVICES'length-1 loop
|
|
ret(index) := ROS_SERVICES(i).node_id;
|
|
index := index + 1;
|
|
end loop;
|
|
-- PUBLICATIONS
|
|
for i in 0 to ROS_PUBLICATIONS'length-1 loop
|
|
ret(index) := ROS_PUBLICATIONS(i).node_id;
|
|
index := index + 1;
|
|
end loop;
|
|
-- SERVICE PUBS
|
|
for i in 0 to ROS_SERVICES'length-1 loop
|
|
ret(index) := ROS_SERVICES(i).node_id;
|
|
index := index + 1;
|
|
end loop;
|
|
|
|
return ret;
|
|
end function;
|
|
|
|
constant ENDPOINT_ROS_NODE_MAPPING : ENDPOINT_ROS_NODE_MAPPING_ARRAY_TYPE(0 to NUM_ENDPOINTS-1) := gen_endpoint_node_mapping;
|
|
|
|
function gen_ros_discovery_data return OUTPUT_DATA_TYPE is
|
|
variable ret : OUTPUT_DATA_TYPE;
|
|
variable gid : GID_TYPE;
|
|
variable tmp : natural;
|
|
begin
|
|
ret.data := (others => (others => '0'));
|
|
ret.length := 0;
|
|
|
|
-- Sanity Check
|
|
if (NUM_NODES = 0) then
|
|
return ret;
|
|
end if;
|
|
|
|
-- Serialized Payload Header
|
|
ret.data(ret.length) := CDR_BE & x"0000";
|
|
ret.length := ret.length + 1;
|
|
-- ParticipantEntitiesInfo.gid
|
|
gid := to_gid(to_guid(GUIDPREFIX,ENTITYID_PARTICIPANT));
|
|
for i in 0 to GID'length-1 loop
|
|
ret.data(ret.length) := gid(i);
|
|
ret.length := ret.length + 1;
|
|
end loop;
|
|
-- ParticipantEntitiesInfo.node_entities_info_seq [LENGTH]
|
|
ret.data(ret.length) := std_logic_vector(to_unsigned(NUM_NODES,WORD_WIDTH));
|
|
ret.length := ret.length + 1;
|
|
for i in 0 to NUM_NODES-1 loop
|
|
-- ParticipantEntitiesInfo.node_entities_info_seq[i].node_namespace
|
|
ret.data(ret.length) := std_logic_vector(to_unsigned(string_len(ROS_NODES(i).namespace),WORD_WIDTH));
|
|
ret.length := ret.length + 1;
|
|
for j in 0 to round_div(string_len(ROS_NODES(i).namespace),WORD_WIDTH/BYTE_WIDTH)-1 loop
|
|
ret.data(ret.length) := convert_string(ROS_NODES(i).namespace)(j);
|
|
ret.length := ret.length + 1;
|
|
end loop;
|
|
-- ParticipantEntitiesInfo.node_entities_info_seq[i].node_name
|
|
ret.data(ret.length) := std_logic_vector(to_unsigned(string_len(ROS_NODES(i).name),WORD_WIDTH));
|
|
ret.length := ret.length + 1;
|
|
for j in 0 to round_div(string_len(ROS_NODES(i).name),WORD_WIDTH/BYTE_WIDTH)-1 loop
|
|
ret.data(ret.length) := convert_string(ROS_NODES(i).name)(j);
|
|
ret.length := ret.length + 1;
|
|
end loop;
|
|
-- ParticipantEntitiesInfo.node_entities_info_seq[i].reader_gid_seq [LENGTH]
|
|
tmp := 0;
|
|
for j in 0 to NUM_READERS-1 loop
|
|
if (i = ENDPOINT_ROS_NODE_MAPPING(j)) then
|
|
tmp := tmp + 1;
|
|
end if;
|
|
end loop;
|
|
ret.data(ret.length) := std_logic_vector(to_unsigned(tmp,WORD_WIDTH));
|
|
ret.length := ret.length + 1;
|
|
-- ParticipantEntitiesInfo.node_entities_info_seq[i].reader_gid_seq[j]
|
|
for j in 0 to NUM_READERS-1 loop
|
|
if (i = ENDPOINT_ROS_NODE_MAPPING(j)) then
|
|
gid := to_gid(to_guid(GUIDPREFIX,ENTITYID(j)));
|
|
for k in 0 to GID'length-1 loop
|
|
ret.data(ret.length) := gid(k);
|
|
ret.length := ret.length + 1;
|
|
end loop;
|
|
end if;
|
|
end loop;
|
|
-- ParticipantEntitiesInfo.node_entities_info_seq[i].writer_gid_seq [LENGTH]
|
|
tmp := 0;
|
|
for j in NUM_READERS to NUM_ENDPOINTS-1 loop
|
|
if (i = ENDPOINT_ROS_NODE_MAPPING(j)) then
|
|
tmp := tmp + 1;
|
|
end if;
|
|
end loop;
|
|
ret.data(ret.length) := std_logic_vector(to_unsigned(tmp,WORD_WIDTH));
|
|
ret.length := ret.length + 1;
|
|
-- ParticipantEntitiesInfo.node_entities_info_seq[i].writer_gid_seq[j]
|
|
for j in NUM_READERS to NUM_ENDPOINTS-1 loop
|
|
if (i = ENDPOINT_ROS_NODE_MAPPING(j)) then
|
|
gid := to_gid(to_guid(GUIDPREFIX,ENTITYID(j)));
|
|
for k in 0 to GID'length-1 loop
|
|
ret.data(ret.length) := gid(k);
|
|
ret.length := ret.length + 1;
|
|
end loop;
|
|
end if;
|
|
end loop;
|
|
end loop;
|
|
|
|
return ret;
|
|
end function;
|
|
|
|
constant ROS_DISCOVERY_DATA : OUTPUT_DATA_TYPE := gen_ros_discovery_data;
|
|
|
|
end package body;
|