Add AddTwoInts ROS Service Implementation
A complete ROS service server and client implementation of the example_interfaces AddTwoInts service is done, along with an acompaning testbench.
This commit is contained in:
parent
a99b8f13c8
commit
63ce5642de
105
sim/L1_AddTwoInts_service_test1.do
Normal file
105
sim/L1_AddTwoInts_service_test1.do
Normal file
@ -0,0 +1,105 @@
|
||||
onerror {resume}
|
||||
radix define ROS_RETCODE {
|
||||
"10#0#" "ROS_RET_OK",
|
||||
"10#1#" "ROS_RET_ERROR",
|
||||
"10#2#" "ROS_RET_TIMEOUT",
|
||||
"10#3#" "ROS_RET_UNSUPPORTED",
|
||||
-default unsigned
|
||||
}
|
||||
quietly WaveActivateNextPane {} 0
|
||||
add wave -noupdate -divider SYSTEM
|
||||
add wave -noupdate /l1_addtwoints_service_test1/clk
|
||||
add wave -noupdate /l1_addtwoints_service_test1/reset
|
||||
add wave -noupdate -divider CLIENT
|
||||
add wave -noupdate -group CPORTS /l1_addtwoints_service_test1/uut_c/start_r
|
||||
add wave -noupdate -group CPORTS /l1_addtwoints_service_test1/uut_c/ack_r
|
||||
add wave -noupdate -group CPORTS /l1_addtwoints_service_test1/uut_c/get_data_r
|
||||
add wave -noupdate -group CPORTS /l1_addtwoints_service_test1/uut_c/done_r
|
||||
add wave -noupdate -group CPORTS /l1_addtwoints_service_test1/uut_c/valid_in_r
|
||||
add wave -noupdate -group CPORTS /l1_addtwoints_service_test1/uut_c/ready_in_r
|
||||
add wave -noupdate -group CPORTS -radix hexadecimal /l1_addtwoints_service_test1/uut_c/data_in_r
|
||||
add wave -noupdate -group CPORTS /l1_addtwoints_service_test1/uut_c/last_word_in_r
|
||||
add wave -noupdate -group CPORTS /l1_addtwoints_service_test1/uut_c/si_valid_data_r
|
||||
add wave -noupdate -group CPORTS /l1_addtwoints_service_test1/uut_c/si_valid_r
|
||||
add wave -noupdate -group CPORTS /l1_addtwoints_service_test1/uut_c/si_ack_r
|
||||
add wave -noupdate -group CPORTS /l1_addtwoints_service_test1/uut_c/eoc_r
|
||||
add wave -noupdate -group CPORTS /l1_addtwoints_service_test1/uut_c/start_w
|
||||
add wave -noupdate -group CPORTS /l1_addtwoints_service_test1/uut_c/ack_w
|
||||
add wave -noupdate -group CPORTS /l1_addtwoints_service_test1/uut_c/done_w
|
||||
add wave -noupdate -group CPORTS /l1_addtwoints_service_test1/uut_c/valid_out_w
|
||||
add wave -noupdate -group CPORTS /l1_addtwoints_service_test1/uut_c/ready_out_w
|
||||
add wave -noupdate -group CPORTS -radix hexadecimal /l1_addtwoints_service_test1/uut_c/data_out_w
|
||||
add wave -noupdate -group CPORTS /l1_addtwoints_service_test1/uut_c/last_word_out_w
|
||||
add wave -noupdate -group CPORTS /l1_addtwoints_service_test1/uut_c/start_user
|
||||
add wave -noupdate -group CPORTS /l1_addtwoints_service_test1/uut_c/ack_user
|
||||
add wave -noupdate -group CPORTS /l1_addtwoints_service_test1/uut_c/opcode_user
|
||||
add wave -noupdate -group CPORTS -radix hexadecimal /l1_addtwoints_service_test1/uut_c/service_info_user
|
||||
add wave -noupdate -group CPORTS /l1_addtwoints_service_test1/uut_c/sequence_id
|
||||
add wave -noupdate -group CPORTS /l1_addtwoints_service_test1/uut_c/taken_user
|
||||
add wave -noupdate -group CPORTS -radix hexadecimal /l1_addtwoints_service_test1/uut_c/a
|
||||
add wave -noupdate -group CPORTS -radix hexadecimal /l1_addtwoints_service_test1/uut_c/b
|
||||
add wave -noupdate -group CPORTS -radix hexadecimal /l1_addtwoints_service_test1/uut_c/sum
|
||||
add wave -noupdate -group CPORTS /l1_addtwoints_service_test1/uut_c/done_user
|
||||
add wave -noupdate -group CPORTS -radix ROS_RETCODE /l1_addtwoints_service_test1/uut_c/return_code_user
|
||||
add wave -noupdate /l1_addtwoints_service_test1/uut_c/stage
|
||||
add wave -noupdate /l1_addtwoints_service_test1/uut_c/encode_stage
|
||||
add wave -noupdate /l1_addtwoints_service_test1/uut_c/decode_stage
|
||||
add wave -noupdate /l1_addtwoints_service_test1/uut_c/return_stage
|
||||
add wave -noupdate /l1_addtwoints_service_test1/uut_c/cnt
|
||||
add wave -noupdate /l1_addtwoints_service_test1/uut_c/decode_error_latch
|
||||
add wave -noupdate -divider SERVER
|
||||
add wave -noupdate -group SPORTS /l1_addtwoints_service_test1/uut_s/start_r
|
||||
add wave -noupdate -group SPORTS /l1_addtwoints_service_test1/uut_s/ack_r
|
||||
add wave -noupdate -group SPORTS /l1_addtwoints_service_test1/uut_s/get_data_r
|
||||
add wave -noupdate -group SPORTS /l1_addtwoints_service_test1/uut_s/done_r
|
||||
add wave -noupdate -group SPORTS /l1_addtwoints_service_test1/uut_s/valid_in_r
|
||||
add wave -noupdate -group SPORTS /l1_addtwoints_service_test1/uut_s/ready_in_r
|
||||
add wave -noupdate -group SPORTS -radix hexadecimal /l1_addtwoints_service_test1/uut_s/data_in_r
|
||||
add wave -noupdate -group SPORTS /l1_addtwoints_service_test1/uut_s/last_word_in_r
|
||||
add wave -noupdate -group SPORTS /l1_addtwoints_service_test1/uut_s/si_valid_data_r
|
||||
add wave -noupdate -group SPORTS /l1_addtwoints_service_test1/uut_s/si_valid_r
|
||||
add wave -noupdate -group SPORTS /l1_addtwoints_service_test1/uut_s/si_ack_r
|
||||
add wave -noupdate -group SPORTS /l1_addtwoints_service_test1/uut_s/eoc_r
|
||||
add wave -noupdate -group SPORTS /l1_addtwoints_service_test1/uut_s/start_w
|
||||
add wave -noupdate -group SPORTS /l1_addtwoints_service_test1/uut_s/ack_w
|
||||
add wave -noupdate -group SPORTS /l1_addtwoints_service_test1/uut_s/done_w
|
||||
add wave -noupdate -group SPORTS /l1_addtwoints_service_test1/uut_s/valid_out_w
|
||||
add wave -noupdate -group SPORTS /l1_addtwoints_service_test1/uut_s/ready_out_w
|
||||
add wave -noupdate -group SPORTS -radix hexadecimal /l1_addtwoints_service_test1/uut_s/data_out_w
|
||||
add wave -noupdate -group SPORTS /l1_addtwoints_service_test1/uut_s/last_word_out_w
|
||||
add wave -noupdate -group SPORTS /l1_addtwoints_service_test1/uut_s/start_user
|
||||
add wave -noupdate -group SPORTS /l1_addtwoints_service_test1/uut_s/ack_user
|
||||
add wave -noupdate -group SPORTS /l1_addtwoints_service_test1/uut_s/opcode_user
|
||||
add wave -noupdate -group SPORTS -radix hexadecimal /l1_addtwoints_service_test1/uut_s/service_info_user
|
||||
add wave -noupdate -group SPORTS -radix hexadecimal /l1_addtwoints_service_test1/uut_s/request_id_user
|
||||
add wave -noupdate -group SPORTS /l1_addtwoints_service_test1/uut_s/taken_user
|
||||
add wave -noupdate -group SPORTS -radix hexadecimal /l1_addtwoints_service_test1/uut_s/a
|
||||
add wave -noupdate -group SPORTS -radix hexadecimal /l1_addtwoints_service_test1/uut_s/b
|
||||
add wave -noupdate -group SPORTS -radix hexadecimal /l1_addtwoints_service_test1/uut_s/sum
|
||||
add wave -noupdate -group SPORTS /l1_addtwoints_service_test1/uut_s/done_user
|
||||
add wave -noupdate -group SPORTS -radix ROS_RETCODE /l1_addtwoints_service_test1/uut_s/return_code_user
|
||||
add wave -noupdate /l1_addtwoints_service_test1/uut_s/stage
|
||||
add wave -noupdate /l1_addtwoints_service_test1/uut_s/encode_stage
|
||||
add wave -noupdate /l1_addtwoints_service_test1/uut_s/decode_stage
|
||||
add wave -noupdate /l1_addtwoints_service_test1/uut_s/return_stage
|
||||
add wave -noupdate /l1_addtwoints_service_test1/uut_s/cnt
|
||||
add wave -noupdate /l1_addtwoints_service_test1/uut_s/decode_error_latch
|
||||
add wave -noupdate -divider MISC
|
||||
TreeUpdate [SetDefaultTree]
|
||||
WaveRestoreCursors {{Cursor 1} {325000 ps} 0}
|
||||
quietly wave cursor active 1
|
||||
configure wave -namecolwidth 150
|
||||
configure wave -valuecolwidth 100
|
||||
configure wave -justifyvalue left
|
||||
configure wave -signalnamewidth 1
|
||||
configure wave -snapdistance 10
|
||||
configure wave -datasetprefix 0
|
||||
configure wave -rowmargin 4
|
||||
configure wave -childrowmargin 2
|
||||
configure wave -gridoffset 0
|
||||
configure wave -gridperiod 1
|
||||
configure wave -griddelta 40
|
||||
configure wave -timeline 0
|
||||
configure wave -timelineunits ns
|
||||
update
|
||||
WaveRestoreZoom {0 ps} {1024 ns}
|
||||
@ -23,6 +23,7 @@ Testbench_Lib3 = W:/HDL-SIM/OSVVM-Scripts/../sim/VHDL_LIBS/ModelSim-2020.02/Test
|
||||
Testbench_Lib4 = W:/HDL-SIM/OSVVM-Scripts/../sim/VHDL_LIBS/ModelSim-2020.02/Testbench_Lib4.lib
|
||||
Testbench_Lib5 = W:/HDL-SIM/OSVVM-Scripts/../sim/VHDL_LIBS/ModelSim-2020.02/Testbench_Lib5.lib
|
||||
Testbench_Lib1 = W:/HDL-SIM/OSVVM-Scripts/../sim/VHDL_LIBS/ModelSim-2020.02/Testbench_Lib1.lib
|
||||
Testbench_ROS_Lib1 = W:/HDL-SIM/OSVVM-Scripts/../sim/VHDL_LIBS/ModelSim-2020.02/Testbench_ROS_Lib1.lib
|
||||
[vcom]
|
||||
; VHDL93 variable selects language version as the default.
|
||||
; Default is VHDL-2002.
|
||||
|
||||
32
src/ros2/Service_ref.txt
Normal file
32
src/ros2/Service_ref.txt
Normal file
@ -0,0 +1,32 @@
|
||||
31............24..............16..............8...............0
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Representation_id | Representation_options |
|
||||
00 01 (=CDR_LE) 00 00
|
||||
| request_id.writer_guid |
|
||||
| |
|
||||
55 05 54 47 12 ee 90 0d
|
||||
| request_id.sn |
|
||||
| |
|
||||
01 00 00 00 00 00 00 00
|
||||
| AddTwoInts.a |
|
||||
| |
|
||||
02 00 00 00 00 00 00 00
|
||||
| AddTwoInts.b |
|
||||
| |
|
||||
03 00 00 00 00 00 00 00
|
||||
+---------------------------------------------------------------+
|
||||
|
||||
31............24..............16..............8...............0
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Representation_id | Representation_options |
|
||||
00 01 (=CDR_LE) 00 00
|
||||
| request_id.writer_guid |
|
||||
| |
|
||||
55 05 54 47 12 ee 90 0d
|
||||
| request_id.sn |
|
||||
| |
|
||||
01 00 00 00 00 00 00 00
|
||||
| AddTwoInts.sum |
|
||||
| |
|
||||
05 00 00 00 00 00 00 00
|
||||
+---------------------------------------------------------------+
|
||||
428
src/ros2/Tests/Level_1/L1_AddTwoInts_srv_test1.vhd
Normal file
428
src/ros2/Tests/Level_1/L1_AddTwoInts_srv_test1.vhd
Normal file
@ -0,0 +1,428 @@
|
||||
library ieee;
|
||||
use ieee.std_logic_1164.all;
|
||||
use ieee.numeric_std.all;
|
||||
|
||||
library osvvm; -- Utility Library
|
||||
context osvvm.OsvvmContext;
|
||||
|
||||
use work.rtps_package.all;
|
||||
use work.ros_package.all;
|
||||
use work.rtps_test_package.all;
|
||||
|
||||
-- This testbench tests the General Behavour of the AddTwoInts Service.
|
||||
-- More specifically following tests are done:
|
||||
-- * Test Unssuported Opcode Operations
|
||||
-- * Test RETCODE_NO_DATA response from DDS Reader
|
||||
-- * Test RETCODE_ERROR response from DDS Reader
|
||||
-- * Test RETCODE_ERROR response from DDS Writer
|
||||
-- * Test Sample with No Valid response from DDS Reader
|
||||
-- * Test Big Endian Encoding/Decoding of AddTwoInts Service Messages
|
||||
|
||||
entity L1_AddTwoInts_srv_test1 is
|
||||
end entity;
|
||||
|
||||
architecture testbench of L1_AddTwoInts_srv_test1 is
|
||||
|
||||
signal clk, reset : std_logic := '0';
|
||||
signal valid_rq, valid_rr, ready_rq, ready_rr, last_word_rq, last_word_rr : std_logic := '0';
|
||||
signal data_rq, data_rr : std_logic_vector(WORD_WIDTH-1 downto 0) := (others => '0');
|
||||
signal start_c, start_s, ack_c, ack_s, taken_c, taken_s, done_c, done_s : std_logic := '0';
|
||||
signal opcode_c, opcode_s : ROS_SERVICE_OPCODE_TYPE := NOP;
|
||||
signal return_code_c, return_code_s : std_logic_vector(ROS_RETCODE_WIDTH-1 downto 0) := (others => '0');
|
||||
signal a_c, a_s, b_c, b_s, sum_c, sum_s : std_logic_vector(CDR_LONG_LONG_WIDTH-1 downto 0) := (others => '0');
|
||||
signal service_info_c, service_info_s : SERVICE_INFO_TYPE := EMPTY_SERVICE_INFO;
|
||||
signal sequence_id_c : std_logic_vector(ROS_SEQUENCE_ID_WIDTH-1 downto 0) := (others => '0');
|
||||
signal request_id_s : REQUEST_ID_TYPE := EMPTY_REQUEST_ID;
|
||||
signal start_sr, start_cr, si_valid_data_cr, si_valid_data_sr : std_logic := '0';
|
||||
signal return_code_cr, return_code_cw, return_code_sr, return_code_sw : std_logic_vector(RETURN_CODE_WIDTH-1 downto 0) := (others => '0');
|
||||
signal ready_sw, ready_cw, last_word_out_cw, last_word_out_sw, selector : std_logic := '0';
|
||||
begin
|
||||
|
||||
uut_c : entity work.AddTwoInts_srv_client(arch)
|
||||
port map (
|
||||
clk => clk,
|
||||
reset => reset,
|
||||
start_r => start_cr,--
|
||||
ack_r => '1',--
|
||||
opcode_r => open,
|
||||
instance_state_r => open,
|
||||
view_state_r => open,
|
||||
sample_state_r => open,
|
||||
instance_handle_r => open,
|
||||
max_samples_r => open,
|
||||
get_data_r => open,--
|
||||
done_r => '1',--
|
||||
return_code_r => return_code_cr,--
|
||||
valid_in_r => valid_rr,--
|
||||
ready_in_r => ready_rr,--
|
||||
data_in_r => data_rr,--
|
||||
last_word_in_r => last_word_rr,--
|
||||
si_sample_state_r => ANY_SAMPLE_STATE,
|
||||
si_view_state_r => ANY_VIEW_STATE,
|
||||
si_instance_state_r => ANY_INSTANCE_STATE,
|
||||
si_source_timestamp_r => TIME_INVALID,
|
||||
si_instance_handle_r => HANDLE_NIL,
|
||||
si_publication_handle_r => HANDLE_NIL,
|
||||
si_disposed_generation_count_r => (others => '0'),
|
||||
si_no_writers_generation_count_r => (others => '0'),
|
||||
si_sample_rank_r => (others => '0'),
|
||||
si_generation_rank_r => (others => '0'),
|
||||
si_absolute_generation_rank_r => (others => '0'),
|
||||
si_valid_data_r => si_valid_data_cr,--
|
||||
si_valid_r => '1',--
|
||||
si_ack_r => open,--
|
||||
eoc_r => '1',--
|
||||
status_r => (others => '0'),
|
||||
start_w => open,--
|
||||
ack_w => '1',--
|
||||
opcode_w => open,
|
||||
instance_handle_out_w => open,
|
||||
source_ts_w => open,
|
||||
max_wait_w => open,
|
||||
done_w => '1',--
|
||||
return_code_w => return_code_cw,
|
||||
instance_handle_in_w => HANDLE_NIL,
|
||||
valid_out_w => valid_rq,--
|
||||
ready_out_w => ready_cw,--ready_rq,--
|
||||
data_out_w => data_rq,--
|
||||
last_word_out_w => last_word_out_cw,--last_word_rq,--
|
||||
valid_in_w => '0',
|
||||
ready_in_w => open,
|
||||
data_in_w => (others => '0'),
|
||||
last_word_in_w => '0',
|
||||
status_w => (others => '0'),
|
||||
start_user => start_c,--
|
||||
ack_user => ack_c,--
|
||||
opcode_user => opcode_c,--
|
||||
service_info_user => service_info_c,--
|
||||
sequence_id_user => sequence_id_c,--
|
||||
taken_user => taken_c,--
|
||||
data_available_user => open,--
|
||||
a => a_c,--
|
||||
b => b_c,--
|
||||
sum => sum_c,--
|
||||
done_user => done_c,--
|
||||
return_code_user => return_code_c --
|
||||
);
|
||||
|
||||
uut_s : entity work.AddTwoInts_srv_server(arch)
|
||||
port map (
|
||||
clk => clk,
|
||||
reset => reset,
|
||||
start_r => start_sr,--
|
||||
ack_r => '1',--
|
||||
opcode_r => open,
|
||||
instance_state_r => open,
|
||||
view_state_r => open,
|
||||
sample_state_r => open,
|
||||
instance_handle_r => open,
|
||||
max_samples_r => open,
|
||||
get_data_r => open,--
|
||||
done_r => '1',--
|
||||
return_code_r => return_code_sr,--
|
||||
valid_in_r => valid_rq,--
|
||||
ready_in_r => ready_rq,--
|
||||
data_in_r => data_rq,--
|
||||
last_word_in_r => last_word_rq,--
|
||||
si_sample_state_r => ANY_SAMPLE_STATE,
|
||||
si_view_state_r => ANY_VIEW_STATE,
|
||||
si_instance_state_r => ANY_INSTANCE_STATE,
|
||||
si_source_timestamp_r => TIME_INVALID,
|
||||
si_instance_handle_r => HANDLE_NIL,
|
||||
si_publication_handle_r => HANDLE_NIL,
|
||||
si_disposed_generation_count_r => (others => '0'),
|
||||
si_no_writers_generation_count_r => (others => '0'),
|
||||
si_sample_rank_r => (others => '0'),
|
||||
si_generation_rank_r => (others => '0'),
|
||||
si_absolute_generation_rank_r => (others => '0'),
|
||||
si_valid_data_r => si_valid_data_sr,--
|
||||
si_valid_r => '1',--
|
||||
si_ack_r => open,--
|
||||
eoc_r => '1',--
|
||||
status_r => (others => '0'),
|
||||
start_w => open,--
|
||||
ack_w => '1',--
|
||||
opcode_w => open,
|
||||
instance_handle_out_w => open,
|
||||
source_ts_w => open,
|
||||
max_wait_w => open,
|
||||
done_w => '1',--
|
||||
return_code_w => return_code_sw,--
|
||||
instance_handle_in_w => HANDLE_NIL,
|
||||
valid_out_w => valid_rr,--
|
||||
ready_out_w => ready_sw,--ready_rr,--
|
||||
data_out_w => data_rr,--
|
||||
last_word_out_w => last_word_out_sw,--last_word_rr,--
|
||||
valid_in_w => '0',
|
||||
ready_in_w => open,
|
||||
data_in_w => (others => '0'),
|
||||
last_word_in_w => '0',
|
||||
status_w => (others => '0'),
|
||||
start_user => start_s,--
|
||||
ack_user => ack_s,--
|
||||
opcode_user => opcode_s,--
|
||||
service_info_user => service_info_s,--
|
||||
request_id_user => request_id_s,--
|
||||
taken_user => taken_s,--
|
||||
data_available_user => open,--
|
||||
a => a_s,--
|
||||
b => b_s,--
|
||||
sum => sum_s,--
|
||||
done_user => done_s,--
|
||||
return_code_user => return_code_s --
|
||||
);
|
||||
|
||||
process (all)
|
||||
begin
|
||||
if (selector = '1') then
|
||||
ready_cw <= '1';
|
||||
ready_sw <= '1';
|
||||
last_word_rq <= '0';
|
||||
last_word_rr <= '0';
|
||||
else
|
||||
ready_cw <= ready_rq;
|
||||
ready_sw <= ready_rr;
|
||||
last_word_rq <= last_word_out_cw;
|
||||
last_word_rr <= last_word_out_sw;
|
||||
end if;
|
||||
end process;
|
||||
|
||||
stimulus_prc : process
|
||||
variable RV : RandomPType;
|
||||
variable A, B, SUM, RET : AlertLogIDType;
|
||||
|
||||
procedure wait_on_sig(signal sig : std_logic) is
|
||||
begin
|
||||
if (sig /= '1') then
|
||||
wait on sig until sig = '1';
|
||||
end if;
|
||||
end procedure;
|
||||
begin
|
||||
|
||||
SetAlertLogName("AddTwoInts Service - Level 1 - (Big Endian) - General");
|
||||
SetAlertEnable(FAILURE, TRUE);
|
||||
SetAlertEnable(ERROR, TRUE);
|
||||
SetAlertEnable(WARNING, TRUE);
|
||||
SetLogEnable(DEBUG, FALSE);
|
||||
SetLogEnable(PASSED, FALSE);
|
||||
SetLogEnable(INFO, TRUE);
|
||||
RV.InitSeed(RV'instance_name);
|
||||
A := GetAlertLogID("A", ALERTLOG_BASE_ID);
|
||||
B := GetAlertLogID("B", ALERTLOG_BASE_ID);
|
||||
SUM := GetAlertLogID("SUM", ALERTLOG_BASE_ID);
|
||||
|
||||
Log("Initial Reset", INFO);
|
||||
selector <= '1';
|
||||
return_code_cr <= RETCODE_OK;
|
||||
return_code_cw <= RETCODE_OK;
|
||||
return_code_sr <= RETCODE_OK;
|
||||
return_code_sw <= RETCODE_OK;
|
||||
si_valid_data_cr <= '0';
|
||||
si_valid_data_sr <= '0';
|
||||
start_c <= '0';
|
||||
start_s <= '0';
|
||||
reset <= '1';
|
||||
wait until rising_edge(clk);
|
||||
wait until rising_edge(clk);
|
||||
reset <= '0';
|
||||
|
||||
Log("CLIENT: Test Unsupported Opcode", INFO);
|
||||
start_c <= '1';
|
||||
opcode_c <= TAKE_REQUEST;
|
||||
wait_on_sig(ack_c);
|
||||
wait until rising_edge(clk);
|
||||
start_c <= '0';
|
||||
wait_on_sig(done_c);
|
||||
wait for 1 ps; -- Make sure all signals stable
|
||||
AlertIf(return_code_c /= ROS_RET_UNSUPPORTED, "Unexpected Client Response", FAILURE);
|
||||
wait until rising_edge(clk);
|
||||
|
||||
Log("SERVER: Test Unsupported Opcode", INFO);
|
||||
start_s <= '1';
|
||||
opcode_s <= TAKE_RESPONSE;
|
||||
wait_on_sig(ack_s);
|
||||
wait until rising_edge(clk);
|
||||
start_s <= '0';
|
||||
wait_on_sig(done_s);
|
||||
wait for 1 ps; -- Make sure all signals stable
|
||||
AlertIf(return_code_s /= ROS_RET_UNSUPPORTED, "Unexpected Server Response", FAILURE);
|
||||
wait until rising_edge(clk);
|
||||
|
||||
Log("CLIENT: Test No Data", INFO);
|
||||
return_code_cr <= RETCODE_NO_DATA;
|
||||
start_c <= '1';
|
||||
opcode_c <= TAKE_RESPONSE;
|
||||
wait_on_sig(ack_c);
|
||||
wait until rising_edge(clk);
|
||||
start_c <= '0';
|
||||
wait_on_sig(done_c);
|
||||
wait for 1 ps; -- Make sure all signals stable
|
||||
AlertIf(return_code_c /= ROS_RET_OK, "Unexpected Client Response", FAILURE);
|
||||
AlertIf(taken_c /= '0', "Client taken is unexpectedly set", FAILURE);
|
||||
wait until rising_edge(clk);
|
||||
|
||||
Log("SERVER: Test No Data", INFO);
|
||||
return_code_sr <= RETCODE_NO_DATA;
|
||||
start_s <= '1';
|
||||
opcode_s <= TAKE_REQUEST;
|
||||
wait_on_sig(ack_s);
|
||||
wait until rising_edge(clk);
|
||||
start_s <= '0';
|
||||
wait_on_sig(done_s);
|
||||
wait for 1 ps; -- Make sure all signals stable
|
||||
AlertIf(return_code_s /= ROS_RET_OK, "Unexpected Server Response", FAILURE);
|
||||
AlertIf(taken_s /= '0', "Server taken is unexpectedly set", FAILURE);
|
||||
wait until rising_edge(clk);
|
||||
|
||||
Log("CLIENT: Test Reader Error", INFO);
|
||||
return_code_cr <= RETCODE_ERROR;
|
||||
start_c <= '1';
|
||||
opcode_c <= TAKE_RESPONSE;
|
||||
wait_on_sig(ack_c);
|
||||
wait until rising_edge(clk);
|
||||
start_c <= '0';
|
||||
wait_on_sig(done_c);
|
||||
wait for 1 ps; -- Make sure all signals stable
|
||||
AlertIf(return_code_c /= ROS_RET_ERROR, "Unexpected Client Response", FAILURE);
|
||||
wait until rising_edge(clk);
|
||||
|
||||
Log("SERVER: Test Reader Error", INFO);
|
||||
return_code_sr <= RETCODE_ERROR;
|
||||
start_s <= '1';
|
||||
opcode_s <= TAKE_REQUEST;
|
||||
wait_on_sig(ack_s);
|
||||
wait until rising_edge(clk);
|
||||
start_s <= '0';
|
||||
wait_on_sig(done_s);
|
||||
wait for 1 ps; -- Make sure all signals stable
|
||||
AlertIf(return_code_s /= ROS_RET_ERROR, "Unexpected Server Response", FAILURE);
|
||||
wait until rising_edge(clk);
|
||||
|
||||
Log("CLIENT: Test Writer Error", INFO);
|
||||
return_code_cw <= RETCODE_ERROR;
|
||||
start_c <= '1';
|
||||
opcode_c <= SEND_REQUEST;
|
||||
wait_on_sig(ack_c);
|
||||
wait until rising_edge(clk);
|
||||
start_c <= '0';
|
||||
wait_on_sig(done_c);
|
||||
wait for 1 ps; -- Make sure all signals stable
|
||||
AlertIf(return_code_c /= ROS_RET_ERROR, "Unexpected Client Response", FAILURE);
|
||||
wait until rising_edge(clk);
|
||||
|
||||
Log("SERVER: Test Writer Error", INFO);
|
||||
return_code_sw <= RETCODE_ERROR;
|
||||
start_s <= '1';
|
||||
opcode_s <= SEND_RESPONSE;
|
||||
wait_on_sig(ack_s);
|
||||
wait until rising_edge(clk);
|
||||
start_s <= '0';
|
||||
wait_on_sig(done_s);
|
||||
wait for 1 ps; -- Make sure all signals stable
|
||||
AlertIf(return_code_s /= ROS_RET_ERROR, "Unexpected Server Response", FAILURE);
|
||||
wait until rising_edge(clk);
|
||||
|
||||
return_code_cr <= RETCODE_OK;
|
||||
return_code_cw <= RETCODE_OK;
|
||||
return_code_sr <= RETCODE_OK;
|
||||
return_code_sw <= RETCODE_OK;
|
||||
selector <= '0';
|
||||
|
||||
Log("Setting Request", INFO);
|
||||
-- Static
|
||||
a_c <= RV.RandSlv(a_c'length);
|
||||
b_c <= RV.RandSlv(b_c'length);
|
||||
wait for 0 ns;
|
||||
|
||||
Log("CLIENT: Send Request", INFO);
|
||||
start_c <= '1';
|
||||
opcode_c <= SEND_REQUEST;
|
||||
wait_on_sig(ack_c);
|
||||
wait until rising_edge(clk);
|
||||
start_c <= '0';
|
||||
|
||||
Log("SERVER: Take Request", INFO);
|
||||
start_s <= '1';
|
||||
opcode_s <= TAKE_REQUEST;
|
||||
wait_on_sig(ack_s);
|
||||
wait until rising_edge(clk);
|
||||
start_s <= '0';
|
||||
|
||||
-- TEST NO VALID DATA
|
||||
wait_on_sig(start_sr);
|
||||
wait until rising_edge(clk);
|
||||
wait until rising_edge(clk);
|
||||
wait_on_sig(start_sr);
|
||||
si_valid_data_sr <= '1';
|
||||
|
||||
Log("Wait for Request on Server", INFO);
|
||||
wait_on_sig(done_s);
|
||||
wait until rising_edge(clk);
|
||||
|
||||
AlertIf(return_code_s /= ROS_RET_OK, "Server did Return ERROR", FAILURE);
|
||||
AlertIf(taken_s /= '1', "Server did not take Request", FAILURE);
|
||||
|
||||
Log("Compare Request", INFO);
|
||||
AffirmIfEqual(A, a_s, a_c);
|
||||
AffirmIfEqual(B, b_s, b_c);
|
||||
|
||||
Log("Setting Response", INFO);
|
||||
-- Static
|
||||
sum_s <= RV.RandSlv(sum_s'length);
|
||||
wait for 0 ns;
|
||||
|
||||
Log("SERVER: Send Response", INFO);
|
||||
start_s <= '1';
|
||||
opcode_s <= SEND_RESPONSE;
|
||||
wait_on_sig(ack_s);
|
||||
wait until rising_edge(clk);
|
||||
start_s <= '0';
|
||||
|
||||
Log("CLIENT: Take Response", INFO);
|
||||
start_c <= '1';
|
||||
opcode_c <= TAKE_RESPONSE;
|
||||
wait_on_sig(ack_c);
|
||||
wait until rising_edge(clk);
|
||||
start_c <= '0';
|
||||
|
||||
-- TEST NO VALID DATA
|
||||
wait_on_sig(start_cr);
|
||||
wait until rising_edge(clk);
|
||||
wait until rising_edge(clk);
|
||||
wait_on_sig(start_cr);
|
||||
si_valid_data_cr <= '1';
|
||||
|
||||
Log("Wait for Response on Client", INFO);
|
||||
wait_on_sig(done_c);
|
||||
wait until rising_edge(clk);
|
||||
|
||||
AlertIf(return_code_c /= ROS_RET_OK, "Client did Return ERROR", FAILURE);
|
||||
AlertIf(taken_c /= '1', "Client did not take Response", FAILURE);
|
||||
|
||||
Log("Compare Response", INFO);
|
||||
AffirmIfEqual(SUM, sum_c, sum_s);
|
||||
|
||||
TranscriptOpen(RESULTS_FILE, APPEND_MODE);
|
||||
SetTranscriptMirror;
|
||||
ReportAlerts;
|
||||
TranscriptClose;
|
||||
std.env.stop;
|
||||
wait;
|
||||
end process;
|
||||
|
||||
clock_prc : process
|
||||
begin
|
||||
clk <= '0';
|
||||
wait for TEST_CLOCK_PERIOD/2;
|
||||
clk <= '1';
|
||||
wait for TEST_CLOCK_PERIOD/2;
|
||||
end process;
|
||||
|
||||
watchdog : process
|
||||
begin
|
||||
wait for 1 ms;
|
||||
Alert("Test timeout", FAILURE);
|
||||
std.env.stop;
|
||||
end process;
|
||||
|
||||
end architecture;
|
||||
434
src/ros2/Tests/Level_1/L1_AddTwoInts_srv_test2.vhd
Normal file
434
src/ros2/Tests/Level_1/L1_AddTwoInts_srv_test2.vhd
Normal file
@ -0,0 +1,434 @@
|
||||
library ieee;
|
||||
use ieee.std_logic_1164.all;
|
||||
use ieee.numeric_std.all;
|
||||
|
||||
library osvvm; -- Utility Library
|
||||
context osvvm.OsvvmContext;
|
||||
|
||||
use work.rtps_package.all;
|
||||
use work.ros_package.all;
|
||||
use work.rtps_test_package.all;
|
||||
|
||||
-- This testbench tests the General Behavour of the AddTwoInts Service.
|
||||
-- More specifically following tests are done:
|
||||
-- * Test Unssuported Opcode Operations
|
||||
-- * Test RETCODE_NO_DATA response from DDS Reader
|
||||
-- * Test RETCODE_ERROR response from DDS Reader
|
||||
-- * Test RETCODE_ERROR response from DDS Writer
|
||||
-- * Test Sample with No Valid response from DDS Reader
|
||||
-- * Test Little Endian Encoding/Decoding of AddTwoInts Service Messages
|
||||
|
||||
entity L1_AddTwoInts_srv_test2 is
|
||||
end entity;
|
||||
|
||||
architecture testbench of L1_AddTwoInts_srv_test2 is
|
||||
|
||||
signal clk, reset : std_logic := '0';
|
||||
signal valid_rq, valid_rr, ready_rq, ready_rr, last_word_rq, last_word_rr : std_logic := '0';
|
||||
signal data_rq, data_rr : std_logic_vector(WORD_WIDTH-1 downto 0) := (others => '0');
|
||||
signal start_c, start_s, ack_c, ack_s, taken_c, taken_s, done_c, done_s : std_logic := '0';
|
||||
signal opcode_c, opcode_s : ROS_SERVICE_OPCODE_TYPE := NOP;
|
||||
signal return_code_c, return_code_s : std_logic_vector(ROS_RETCODE_WIDTH-1 downto 0) := (others => '0');
|
||||
signal a_c, a_s, b_c, b_s, sum_c, sum_s : std_logic_vector(CDR_LONG_LONG_WIDTH-1 downto 0) := (others => '0');
|
||||
signal service_info_c, service_info_s : SERVICE_INFO_TYPE := EMPTY_SERVICE_INFO;
|
||||
signal sequence_id_c : std_logic_vector(ROS_SEQUENCE_ID_WIDTH-1 downto 0) := (others => '0');
|
||||
signal request_id_s : REQUEST_ID_TYPE := EMPTY_REQUEST_ID;
|
||||
signal start_sr, start_cr, si_valid_data_cr, si_valid_data_sr : std_logic := '0';
|
||||
signal return_code_cr, return_code_cw, return_code_sr, return_code_sw : std_logic_vector(RETURN_CODE_WIDTH-1 downto 0) := (others => '0');
|
||||
signal ready_sw, ready_cw, last_word_out_cw, last_word_out_sw, selector : std_logic := '0';
|
||||
begin
|
||||
|
||||
uut_c : entity work.AddTwoInts_srv_client(arch)
|
||||
generic map (
|
||||
LITTLE_ENDIAN => '1'
|
||||
)
|
||||
port map (
|
||||
clk => clk,
|
||||
reset => reset,
|
||||
start_r => start_cr,--
|
||||
ack_r => '1',--
|
||||
opcode_r => open,
|
||||
instance_state_r => open,
|
||||
view_state_r => open,
|
||||
sample_state_r => open,
|
||||
instance_handle_r => open,
|
||||
max_samples_r => open,
|
||||
get_data_r => open,--
|
||||
done_r => '1',--
|
||||
return_code_r => return_code_cr,--
|
||||
valid_in_r => valid_rr,--
|
||||
ready_in_r => ready_rr,--
|
||||
data_in_r => data_rr,--
|
||||
last_word_in_r => last_word_rr,--
|
||||
si_sample_state_r => ANY_SAMPLE_STATE,
|
||||
si_view_state_r => ANY_VIEW_STATE,
|
||||
si_instance_state_r => ANY_INSTANCE_STATE,
|
||||
si_source_timestamp_r => TIME_INVALID,
|
||||
si_instance_handle_r => HANDLE_NIL,
|
||||
si_publication_handle_r => HANDLE_NIL,
|
||||
si_disposed_generation_count_r => (others => '0'),
|
||||
si_no_writers_generation_count_r => (others => '0'),
|
||||
si_sample_rank_r => (others => '0'),
|
||||
si_generation_rank_r => (others => '0'),
|
||||
si_absolute_generation_rank_r => (others => '0'),
|
||||
si_valid_data_r => si_valid_data_cr,--
|
||||
si_valid_r => '1',--
|
||||
si_ack_r => open,--
|
||||
eoc_r => '1',--
|
||||
status_r => (others => '0'),
|
||||
start_w => open,--
|
||||
ack_w => '1',--
|
||||
opcode_w => open,
|
||||
instance_handle_out_w => open,
|
||||
source_ts_w => open,
|
||||
max_wait_w => open,
|
||||
done_w => '1',--
|
||||
return_code_w => return_code_cw,
|
||||
instance_handle_in_w => HANDLE_NIL,
|
||||
valid_out_w => valid_rq,--
|
||||
ready_out_w => ready_cw,--ready_rq,--
|
||||
data_out_w => data_rq,--
|
||||
last_word_out_w => last_word_out_cw,--last_word_rq,--
|
||||
valid_in_w => '0',
|
||||
ready_in_w => open,
|
||||
data_in_w => (others => '0'),
|
||||
last_word_in_w => '0',
|
||||
status_w => (others => '0'),
|
||||
start_user => start_c,--
|
||||
ack_user => ack_c,--
|
||||
opcode_user => opcode_c,--
|
||||
service_info_user => service_info_c,--
|
||||
sequence_id_user => sequence_id_c,--
|
||||
taken_user => taken_c,--
|
||||
data_available_user => open,--
|
||||
a => a_c,--
|
||||
b => b_c,--
|
||||
sum => sum_c,--
|
||||
done_user => done_c,--
|
||||
return_code_user => return_code_c --
|
||||
);
|
||||
|
||||
uut_s : entity work.AddTwoInts_srv_server(arch)
|
||||
generic map (
|
||||
LITTLE_ENDIAN => '1'
|
||||
)
|
||||
port map (
|
||||
clk => clk,
|
||||
reset => reset,
|
||||
start_r => start_sr,--
|
||||
ack_r => '1',--
|
||||
opcode_r => open,
|
||||
instance_state_r => open,
|
||||
view_state_r => open,
|
||||
sample_state_r => open,
|
||||
instance_handle_r => open,
|
||||
max_samples_r => open,
|
||||
get_data_r => open,--
|
||||
done_r => '1',--
|
||||
return_code_r => return_code_sr,--
|
||||
valid_in_r => valid_rq,--
|
||||
ready_in_r => ready_rq,--
|
||||
data_in_r => data_rq,--
|
||||
last_word_in_r => last_word_rq,--
|
||||
si_sample_state_r => ANY_SAMPLE_STATE,
|
||||
si_view_state_r => ANY_VIEW_STATE,
|
||||
si_instance_state_r => ANY_INSTANCE_STATE,
|
||||
si_source_timestamp_r => TIME_INVALID,
|
||||
si_instance_handle_r => HANDLE_NIL,
|
||||
si_publication_handle_r => HANDLE_NIL,
|
||||
si_disposed_generation_count_r => (others => '0'),
|
||||
si_no_writers_generation_count_r => (others => '0'),
|
||||
si_sample_rank_r => (others => '0'),
|
||||
si_generation_rank_r => (others => '0'),
|
||||
si_absolute_generation_rank_r => (others => '0'),
|
||||
si_valid_data_r => si_valid_data_sr,--
|
||||
si_valid_r => '1',--
|
||||
si_ack_r => open,--
|
||||
eoc_r => '1',--
|
||||
status_r => (others => '0'),
|
||||
start_w => open,--
|
||||
ack_w => '1',--
|
||||
opcode_w => open,
|
||||
instance_handle_out_w => open,
|
||||
source_ts_w => open,
|
||||
max_wait_w => open,
|
||||
done_w => '1',--
|
||||
return_code_w => return_code_sw,--
|
||||
instance_handle_in_w => HANDLE_NIL,
|
||||
valid_out_w => valid_rr,--
|
||||
ready_out_w => ready_sw,--ready_rr,--
|
||||
data_out_w => data_rr,--
|
||||
last_word_out_w => last_word_out_sw,--last_word_rr,--
|
||||
valid_in_w => '0',
|
||||
ready_in_w => open,
|
||||
data_in_w => (others => '0'),
|
||||
last_word_in_w => '0',
|
||||
status_w => (others => '0'),
|
||||
start_user => start_s,--
|
||||
ack_user => ack_s,--
|
||||
opcode_user => opcode_s,--
|
||||
service_info_user => service_info_s,--
|
||||
request_id_user => request_id_s,--
|
||||
taken_user => taken_s,--
|
||||
data_available_user => open,--
|
||||
a => a_s,--
|
||||
b => b_s,--
|
||||
sum => sum_s,--
|
||||
done_user => done_s,--
|
||||
return_code_user => return_code_s --
|
||||
);
|
||||
|
||||
process (all)
|
||||
begin
|
||||
if (selector = '1') then
|
||||
ready_cw <= '1';
|
||||
ready_sw <= '1';
|
||||
last_word_rq <= '0';
|
||||
last_word_rr <= '0';
|
||||
else
|
||||
ready_cw <= ready_rq;
|
||||
ready_sw <= ready_rr;
|
||||
last_word_rq <= last_word_out_cw;
|
||||
last_word_rr <= last_word_out_sw;
|
||||
end if;
|
||||
end process;
|
||||
|
||||
stimulus_prc : process
|
||||
variable RV : RandomPType;
|
||||
variable A, B, SUM, RET : AlertLogIDType;
|
||||
|
||||
procedure wait_on_sig(signal sig : std_logic) is
|
||||
begin
|
||||
if (sig /= '1') then
|
||||
wait on sig until sig = '1';
|
||||
end if;
|
||||
end procedure;
|
||||
begin
|
||||
|
||||
SetAlertLogName("AddTwoInts Service - Level 1 - (Little Endian) - General");
|
||||
SetAlertEnable(FAILURE, TRUE);
|
||||
SetAlertEnable(ERROR, TRUE);
|
||||
SetAlertEnable(WARNING, TRUE);
|
||||
SetLogEnable(DEBUG, FALSE);
|
||||
SetLogEnable(PASSED, FALSE);
|
||||
SetLogEnable(INFO, TRUE);
|
||||
RV.InitSeed(RV'instance_name);
|
||||
A := GetAlertLogID("A", ALERTLOG_BASE_ID);
|
||||
B := GetAlertLogID("B", ALERTLOG_BASE_ID);
|
||||
SUM := GetAlertLogID("SUM", ALERTLOG_BASE_ID);
|
||||
|
||||
Log("Initial Reset", INFO);
|
||||
selector <= '1';
|
||||
return_code_cr <= RETCODE_OK;
|
||||
return_code_cw <= RETCODE_OK;
|
||||
return_code_sr <= RETCODE_OK;
|
||||
return_code_sw <= RETCODE_OK;
|
||||
si_valid_data_cr <= '0';
|
||||
si_valid_data_sr <= '0';
|
||||
start_c <= '0';
|
||||
start_s <= '0';
|
||||
reset <= '1';
|
||||
wait until rising_edge(clk);
|
||||
wait until rising_edge(clk);
|
||||
reset <= '0';
|
||||
|
||||
Log("CLIENT: Test Unsupported Opcode", INFO);
|
||||
start_c <= '1';
|
||||
opcode_c <= TAKE_REQUEST;
|
||||
wait_on_sig(ack_c);
|
||||
wait until rising_edge(clk);
|
||||
start_c <= '0';
|
||||
wait_on_sig(done_c);
|
||||
wait for 1 ps; -- Make sure all signals stable
|
||||
AlertIf(return_code_c /= ROS_RET_UNSUPPORTED, "Unexpected Client Response", FAILURE);
|
||||
wait until rising_edge(clk);
|
||||
|
||||
Log("SERVER: Test Unsupported Opcode", INFO);
|
||||
start_s <= '1';
|
||||
opcode_s <= TAKE_RESPONSE;
|
||||
wait_on_sig(ack_s);
|
||||
wait until rising_edge(clk);
|
||||
start_s <= '0';
|
||||
wait_on_sig(done_s);
|
||||
wait for 1 ps; -- Make sure all signals stable
|
||||
AlertIf(return_code_s /= ROS_RET_UNSUPPORTED, "Unexpected Server Response", FAILURE);
|
||||
wait until rising_edge(clk);
|
||||
|
||||
Log("CLIENT: Test No Data", INFO);
|
||||
return_code_cr <= RETCODE_NO_DATA;
|
||||
start_c <= '1';
|
||||
opcode_c <= TAKE_RESPONSE;
|
||||
wait_on_sig(ack_c);
|
||||
wait until rising_edge(clk);
|
||||
start_c <= '0';
|
||||
wait_on_sig(done_c);
|
||||
wait for 1 ps; -- Make sure all signals stable
|
||||
AlertIf(return_code_c /= ROS_RET_OK, "Unexpected Client Response", FAILURE);
|
||||
AlertIf(taken_c /= '0', "Client taken is unexpectedly set", FAILURE);
|
||||
wait until rising_edge(clk);
|
||||
|
||||
Log("SERVER: Test No Data", INFO);
|
||||
return_code_sr <= RETCODE_NO_DATA;
|
||||
start_s <= '1';
|
||||
opcode_s <= TAKE_REQUEST;
|
||||
wait_on_sig(ack_s);
|
||||
wait until rising_edge(clk);
|
||||
start_s <= '0';
|
||||
wait_on_sig(done_s);
|
||||
wait for 1 ps; -- Make sure all signals stable
|
||||
AlertIf(return_code_s /= ROS_RET_OK, "Unexpected Server Response", FAILURE);
|
||||
AlertIf(taken_s /= '0', "Server taken is unexpectedly set", FAILURE);
|
||||
wait until rising_edge(clk);
|
||||
|
||||
Log("CLIENT: Test Reader Error", INFO);
|
||||
return_code_cr <= RETCODE_ERROR;
|
||||
start_c <= '1';
|
||||
opcode_c <= TAKE_RESPONSE;
|
||||
wait_on_sig(ack_c);
|
||||
wait until rising_edge(clk);
|
||||
start_c <= '0';
|
||||
wait_on_sig(done_c);
|
||||
wait for 1 ps; -- Make sure all signals stable
|
||||
AlertIf(return_code_c /= ROS_RET_ERROR, "Unexpected Client Response", FAILURE);
|
||||
wait until rising_edge(clk);
|
||||
|
||||
Log("SERVER: Test Reader Error", INFO);
|
||||
return_code_sr <= RETCODE_ERROR;
|
||||
start_s <= '1';
|
||||
opcode_s <= TAKE_REQUEST;
|
||||
wait_on_sig(ack_s);
|
||||
wait until rising_edge(clk);
|
||||
start_s <= '0';
|
||||
wait_on_sig(done_s);
|
||||
wait for 1 ps; -- Make sure all signals stable
|
||||
AlertIf(return_code_s /= ROS_RET_ERROR, "Unexpected Server Response", FAILURE);
|
||||
wait until rising_edge(clk);
|
||||
|
||||
Log("CLIENT: Test Writer Error", INFO);
|
||||
return_code_cw <= RETCODE_ERROR;
|
||||
start_c <= '1';
|
||||
opcode_c <= SEND_REQUEST;
|
||||
wait_on_sig(ack_c);
|
||||
wait until rising_edge(clk);
|
||||
start_c <= '0';
|
||||
wait_on_sig(done_c);
|
||||
wait for 1 ps; -- Make sure all signals stable
|
||||
AlertIf(return_code_c /= ROS_RET_ERROR, "Unexpected Client Response", FAILURE);
|
||||
wait until rising_edge(clk);
|
||||
|
||||
Log("SERVER: Test Writer Error", INFO);
|
||||
return_code_sw <= RETCODE_ERROR;
|
||||
start_s <= '1';
|
||||
opcode_s <= SEND_RESPONSE;
|
||||
wait_on_sig(ack_s);
|
||||
wait until rising_edge(clk);
|
||||
start_s <= '0';
|
||||
wait_on_sig(done_s);
|
||||
wait for 1 ps; -- Make sure all signals stable
|
||||
AlertIf(return_code_s /= ROS_RET_ERROR, "Unexpected Server Response", FAILURE);
|
||||
wait until rising_edge(clk);
|
||||
|
||||
return_code_cr <= RETCODE_OK;
|
||||
return_code_cw <= RETCODE_OK;
|
||||
return_code_sr <= RETCODE_OK;
|
||||
return_code_sw <= RETCODE_OK;
|
||||
selector <= '0';
|
||||
|
||||
Log("Setting Request", INFO);
|
||||
-- Static
|
||||
a_c <= RV.RandSlv(a_c'length);
|
||||
b_c <= RV.RandSlv(b_c'length);
|
||||
wait for 0 ns;
|
||||
|
||||
Log("CLIENT: Send Request", INFO);
|
||||
start_c <= '1';
|
||||
opcode_c <= SEND_REQUEST;
|
||||
wait_on_sig(ack_c);
|
||||
wait until rising_edge(clk);
|
||||
start_c <= '0';
|
||||
|
||||
Log("SERVER: Take Request", INFO);
|
||||
start_s <= '1';
|
||||
opcode_s <= TAKE_REQUEST;
|
||||
wait_on_sig(ack_s);
|
||||
wait until rising_edge(clk);
|
||||
start_s <= '0';
|
||||
|
||||
-- TEST NO VALID DATA
|
||||
wait_on_sig(start_sr);
|
||||
wait until rising_edge(clk);
|
||||
wait until rising_edge(clk);
|
||||
wait_on_sig(start_sr);
|
||||
si_valid_data_sr <= '1';
|
||||
|
||||
Log("Wait for Request on Server", INFO);
|
||||
wait_on_sig(done_s);
|
||||
wait until rising_edge(clk);
|
||||
|
||||
AlertIf(return_code_s /= ROS_RET_OK, "Server did Return ERROR", FAILURE);
|
||||
AlertIf(taken_s /= '1', "Server did not take Request", FAILURE);
|
||||
|
||||
Log("Compare Request", INFO);
|
||||
AffirmIfEqual(A, a_s, a_c);
|
||||
AffirmIfEqual(B, b_s, b_c);
|
||||
|
||||
Log("Setting Response", INFO);
|
||||
-- Static
|
||||
sum_s <= RV.RandSlv(sum_s'length);
|
||||
wait for 0 ns;
|
||||
|
||||
Log("SERVER: Send Response", INFO);
|
||||
start_s <= '1';
|
||||
opcode_s <= SEND_RESPONSE;
|
||||
wait_on_sig(ack_s);
|
||||
wait until rising_edge(clk);
|
||||
start_s <= '0';
|
||||
|
||||
Log("CLIENT: Take Response", INFO);
|
||||
start_c <= '1';
|
||||
opcode_c <= TAKE_RESPONSE;
|
||||
wait_on_sig(ack_c);
|
||||
wait until rising_edge(clk);
|
||||
start_c <= '0';
|
||||
|
||||
-- TEST NO VALID DATA
|
||||
wait_on_sig(start_cr);
|
||||
wait until rising_edge(clk);
|
||||
wait until rising_edge(clk);
|
||||
wait_on_sig(start_cr);
|
||||
si_valid_data_cr <= '1';
|
||||
|
||||
Log("Wait for Response on Client", INFO);
|
||||
wait_on_sig(done_c);
|
||||
wait until rising_edge(clk);
|
||||
|
||||
AlertIf(return_code_c /= ROS_RET_OK, "Client did Return ERROR", FAILURE);
|
||||
AlertIf(taken_c /= '1', "Client did not take Response", FAILURE);
|
||||
|
||||
Log("Compare Response", INFO);
|
||||
AffirmIfEqual(SUM, sum_c, sum_s);
|
||||
|
||||
TranscriptOpen(RESULTS_FILE, APPEND_MODE);
|
||||
SetTranscriptMirror;
|
||||
ReportAlerts;
|
||||
TranscriptClose;
|
||||
std.env.stop;
|
||||
wait;
|
||||
end process;
|
||||
|
||||
clock_prc : process
|
||||
begin
|
||||
clk <= '0';
|
||||
wait for TEST_CLOCK_PERIOD/2;
|
||||
clk <= '1';
|
||||
wait for TEST_CLOCK_PERIOD/2;
|
||||
end process;
|
||||
|
||||
watchdog : process
|
||||
begin
|
||||
wait for 1 ms;
|
||||
Alert("Test timeout", FAILURE);
|
||||
std.env.stop;
|
||||
end process;
|
||||
|
||||
end architecture;
|
||||
19
src/ros2/Tests/ros_testbench.pro
Normal file
19
src/ros2/Tests/ros_testbench.pro
Normal file
@ -0,0 +1,19 @@
|
||||
# Compile OSVVM Library
|
||||
include ../OSVVM/osvvm.pro
|
||||
|
||||
# Compile
|
||||
library Testbench_ROS_Lib1
|
||||
analyze ../../math_pkg.vhd
|
||||
analyze ../../rtps_package.vhd
|
||||
analyze ../../TEMPLATE_user_config.vhd
|
||||
analyze ../../rtps_config_package.vhd
|
||||
analyze ../../rtps_test_package.vhd
|
||||
analyze ../ros_package.vhd
|
||||
analyze ../example_interfaces/AddTwoInts_srv_client.vhd
|
||||
analyze ../example_interfaces/AddTwoInts_srv_server.vhd
|
||||
analyze Level_1/L1_AddTwoInts_srv_test1.vhd
|
||||
analyze Level_1/L1_AddTwoInts_srv_test2.vhd
|
||||
|
||||
# Simulate
|
||||
simulate L1_AddTwoInts_srv_test1
|
||||
simulate L1_AddTwoInts_srv_test2
|
||||
17
src/ros2/example_interfaces/AddTwoInts.idl
Normal file
17
src/ros2/example_interfaces/AddTwoInts.idl
Normal file
@ -0,0 +1,17 @@
|
||||
// generated from rosidl_adapter/resource/srv.idl.em
|
||||
// with input from example_interfaces/srv/AddTwoInts.srv
|
||||
// generated code does not contain a copyright notice
|
||||
|
||||
|
||||
module example_interfaces {
|
||||
module srv {
|
||||
struct AddTwoInts_Request {
|
||||
int64 a;
|
||||
|
||||
int64 b;
|
||||
};
|
||||
struct AddTwoInts_Response {
|
||||
int64 sum;
|
||||
};
|
||||
};
|
||||
};
|
||||
4
src/ros2/example_interfaces/AddTwoInts.srv
Normal file
4
src/ros2/example_interfaces/AddTwoInts.srv
Normal file
@ -0,0 +1,4 @@
|
||||
int64 a
|
||||
int64 b
|
||||
---
|
||||
int64 sum
|
||||
741
src/ros2/example_interfaces/AddTwoInts_srv_client.vhd
Normal file
741
src/ros2/example_interfaces/AddTwoInts_srv_client.vhd
Normal file
@ -0,0 +1,741 @@
|
||||
-- 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.rtps_package.all;
|
||||
use work.rtps_config_package.all;
|
||||
use work.ros_package.all;
|
||||
|
||||
entity AddTwoInts_srv_client is
|
||||
generic (
|
||||
LITTLE_ENDIAN : std_logic := '0'
|
||||
);
|
||||
port (
|
||||
-- SYSTEM
|
||||
clk : in std_logic;
|
||||
reset : in std_logic;
|
||||
-- FROM DDS READER
|
||||
start_r : out std_logic;
|
||||
ack_r : in std_logic;
|
||||
opcode_r : out DDS_READER_OPCODE_TYPE;
|
||||
instance_state_r : out std_logic_vector(INSTANCE_STATE_KIND_WIDTH-1 downto 0);
|
||||
view_state_r : out std_logic_vector(VIEW_STATE_KIND_WIDTH-1 downto 0);
|
||||
sample_state_r : out std_logic_vector(SAMPLE_STATE_KIND_WIDTH-1 downto 0);
|
||||
instance_handle_r : out INSTANCE_HANDLE_TYPE;
|
||||
max_samples_r : out std_logic_vector(MAX_SAMPLES_WIDTH-1 downto 0);
|
||||
get_data_r : out std_logic;
|
||||
done_r : in std_logic;
|
||||
return_code_r : in std_logic_vector(RETURN_CODE_WIDTH-1 downto 0);
|
||||
valid_in_r : in std_logic;
|
||||
ready_in_r : out std_logic;
|
||||
data_in_r : in std_logic_vector(WORD_WIDTH-1 downto 0);
|
||||
last_word_in_r : in std_logic;
|
||||
-- Sample Info
|
||||
si_sample_state_r : in std_logic_vector(SAMPLE_STATE_KIND_WIDTH-1 downto 0);
|
||||
si_view_state_r : in std_logic_vector(VIEW_STATE_KIND_WIDTH-1 downto 0);
|
||||
si_instance_state_r : in std_logic_vector(INSTANCE_STATE_KIND_WIDTH-1 downto 0);
|
||||
si_source_timestamp_r : in TIME_TYPE;
|
||||
si_instance_handle_r : in INSTANCE_HANDLE_TYPE;
|
||||
si_publication_handle_r : in INSTANCE_HANDLE_TYPE;
|
||||
si_disposed_generation_count_r : in std_logic_vector(DISPOSED_GENERATION_COUNT_WIDTH-1 downto 0);
|
||||
si_no_writers_generation_count_r : in std_logic_vector(NO_WRITERS_GENERATION_COUNT_WIDTH-1 downto 0);
|
||||
si_sample_rank_r : in std_logic_vector(SAMPLE_RANK_WIDTH-1 downto 0);
|
||||
si_generation_rank_r : in std_logic_vector(GENERATION_RANK_WIDTH-1 downto 0);
|
||||
si_absolute_generation_rank_r : in std_logic_vector(ABSOLUTE_GENERATION_COUNT_WIDTH-1 downto 0);
|
||||
si_valid_data_r : in std_logic;
|
||||
si_valid_r : in std_logic;
|
||||
si_ack_r : out std_logic;
|
||||
eoc_r : in std_logic;
|
||||
status_r : in std_logic_vector(STATUS_KIND_WIDTH-1 downto 0);
|
||||
-- FROM DDS WRITER
|
||||
start_w : out std_logic;
|
||||
ack_w : in std_logic;
|
||||
opcode_w : out DDS_WRITER_OPCODE_TYPE;
|
||||
instance_handle_out_w : out INSTANCE_HANDLE_TYPE;
|
||||
source_ts_w : out TIME_TYPE;
|
||||
max_wait_w : out DURATION_TYPE;
|
||||
done_w : in std_logic;
|
||||
return_code_w : in std_logic_vector(RETURN_CODE_WIDTH-1 downto 0);
|
||||
instance_handle_in_w : in INSTANCE_HANDLE_TYPE;
|
||||
valid_out_w : out std_logic;
|
||||
ready_out_w : in std_logic;
|
||||
data_out_w : out std_logic_vector(WORD_WIDTH-1 downto 0);
|
||||
last_word_out_w : out std_logic;
|
||||
valid_in_w : in std_logic;
|
||||
ready_in_w : out std_logic;
|
||||
data_in_w : in std_logic_vector(WORD_WIDTH-1 downto 0);
|
||||
last_word_in_w : in std_logic;
|
||||
status_w : in std_logic_vector(STATUS_KIND_WIDTH-1 downto 0);
|
||||
|
||||
-- TO USER
|
||||
start_user : in std_logic;
|
||||
ack_user : out std_logic;
|
||||
opcode_user : in ROS_SERVICE_OPCODE_TYPE;
|
||||
service_info_user : out SERVICE_INFO_TYPE;
|
||||
sequence_id_user : out std_logic_vector(ROS_SEQUENCE_ID_WIDTH-1 downto 0);
|
||||
data_available_user : out std_logic;
|
||||
-- REQUEST
|
||||
taken_user : out std_logic;
|
||||
a : in std_logic_vector(CDR_LONG_LONG_WIDTH-1 downto 0);
|
||||
b : in std_logic_vector(CDR_LONG_LONG_WIDTH-1 downto 0);
|
||||
-- RESPONSE
|
||||
sum : out std_logic_vector(CDR_LONG_LONG_WIDTH-1 downto 0);
|
||||
done_user : out std_logic;
|
||||
return_code_user : out std_logic_vector(ROS_RETCODE_WIDTH-1 downto 0)
|
||||
);
|
||||
end entity;
|
||||
|
||||
architecture arch of AddTwoInts_srv_client is
|
||||
|
||||
--*****TYPE DECLARATION*****
|
||||
-- FSM states. Explained below in detail
|
||||
type STAGE_TYPE is (IDLE,RETURN_ROS,INITIATE_READ,WAIT_FOR_READER,WAIT_FOR_WRITER,WAIT_FOR_DATA,GET_PAYLOAD_HEADER,FETCH,ALIGN_IN_STREAM,SKIP_PAYLOAD,DECODE_PAYLOAD,INITIATE_WRITE,WRITE_PAYLOAD_HEADER,PUSH,ALIGN_OUT_STREAM,ENCODE_PAYLOAD);
|
||||
-- ###GENERATED START###
|
||||
type ENCODE_STAGE_TYPE is (WRITE_RID_WGUID,WRITE_RID_SN,WRITE_A,WRITE_B);
|
||||
type DECODE_STAGE_TYPE is (GET_RID_WGUID,GET_RID_SN,GET_OPTIONAL_HEADER,GET_SUM);
|
||||
-- ###GENERATED END###
|
||||
|
||||
-- *MAIN PROCESS*
|
||||
signal stage, stage_next : STAGE_TYPE;
|
||||
signal cnt, cnt_next : natural range 0 to 5;
|
||||
signal endian_flag, endian_flag_next : std_logic;
|
||||
signal last_word_in_latch, last_word_in_latch_next : std_logic;
|
||||
signal decode_error_latch, decode_error_latch_next : std_logic;
|
||||
signal dw_latch, dw_latch_next : std_logic_vector(CDR_LONG_LONG_WIDTH-1 downto 0);
|
||||
signal align_offset, align_offset_next : unsigned(MAX_ALIGN_OFFSET_WIDTH-1 downto 0);
|
||||
signal align_op, align_op_next : std_logic;
|
||||
signal target_align, target_align_next : ALIGN_TYPE;
|
||||
signal data_in_latch, data_in_latch_next : std_logic_vector(WORD_WIDTH-1 downto 0);
|
||||
signal optional, optional_next : std_logic;
|
||||
signal data_out_latch, data_out_latch_next : std_logic_vector(WORD_WIDTH-1 downto 0);
|
||||
signal abort_mem : std_logic;
|
||||
signal ready_in_r_sig : std_logic;
|
||||
signal taken_sig, taken_sig_next : std_logic;
|
||||
signal service_info_sig, service_info_sig_next : SERVICE_INFO_TYPE;
|
||||
signal sequence_id_sig, sequence_id_sig_next : unsigned(ROS_SEQUENCE_ID_WIDTH-1 downto 0);
|
||||
signal finalize_payload, finalize_payload_next : std_logic;
|
||||
signal encode_stage, encode_stage_next : ENCODE_STAGE_TYPE;
|
||||
signal decode_stage, decode_stage_next : DECODE_STAGE_TYPE;
|
||||
signal return_stage, return_stage_next : DECODE_STAGE_TYPE;
|
||||
signal return_code_latch, return_code_latch_next : std_logic_vector(ROS_RETCODE_WIDTH-1 downto 0);
|
||||
signal data_available_sig, data_available_sig_next : std_logic;
|
||||
-- ###GENERATED START###
|
||||
signal sum_latch, sum_latch_next : std_logic_vector(CDR_LONG_LONG_WIDTH-1 downto 0);
|
||||
-- ###GENERATED END###
|
||||
|
||||
--*****ALIAS DECLARATION*****
|
||||
alias representation_id : std_logic_vector(PAYLOAD_REPRESENTATION_ID_WIDTH-1 downto 0) is data_in_r(WORD_WIDTH-1 downto WORD_WIDTH-PAYLOAD_REPRESENTATION_ID_WIDTH);
|
||||
alias representation_options : std_logic_vector(PAYLOAD_REPRESENTATION_ID_WIDTH-1 downto 0) is data_in_r(PAYLOAD_REPRESENTATION_OPTIONS_WIDTH-1 downto 0);
|
||||
alias parameter_id : std_logic_vector(PARAMETER_ID_WIDTH-1 downto 0) is data_in_latch(WORD_WIDTH-1 downto WORD_WIDTH-PARAMETER_ID_WIDTH);
|
||||
alias parameter_length : std_logic_vector(PARAMETER_LENGTH_WIDTH-1 downto 0) is data_in_latch(PARAMETER_LENGTH_WIDTH-1 downto 0);
|
||||
|
||||
|
||||
begin
|
||||
|
||||
-- ###GENERATED START###
|
||||
-- MEMORY INSTANTIATIONS
|
||||
-- ###GENERATED END###
|
||||
|
||||
instance_state_r <= ANY_INSTANCE_STATE;
|
||||
view_state_r <= ANY_VIEW_STATE;
|
||||
sample_state_r <= ANY_SAMPLE_STATE;
|
||||
instance_handle_r <= HANDLE_NIL;
|
||||
max_samples_r <= (others => '0');
|
||||
instance_handle_out_w <= HANDLE_NIL;
|
||||
source_ts_w <= TIME_INVALID;
|
||||
max_wait_w <= DURATION_ZERO;
|
||||
ready_in_w <= '0'; -- DDS Writer Input is unused
|
||||
taken_user <= taken_sig;
|
||||
ready_in_r <= ready_in_r_sig;
|
||||
service_info_user <= service_info_sig;
|
||||
sequence_id_user <= std_logic_vector(sequence_id_sig);
|
||||
data_available_user <= data_available_sig;
|
||||
|
||||
-- ###GENERATED START###
|
||||
sum <= sum_latch;
|
||||
-- ###GENERATED END###
|
||||
|
||||
main_prc : process (all)
|
||||
variable tmp_length : unsigned(WORD_WIDTH-1 downto 0);
|
||||
begin
|
||||
-- DEFAULT
|
||||
stage_next <= stage;
|
||||
encode_stage_next <= encode_stage;
|
||||
decode_stage_next <= decode_stage;
|
||||
return_stage_next <= return_stage;
|
||||
cnt_next <= cnt;
|
||||
endian_flag_next <= endian_flag;
|
||||
last_word_in_latch_next <= last_word_in_latch;
|
||||
decode_error_latch_next <= decode_error_latch;
|
||||
align_offset_next <= align_offset;
|
||||
target_align_next <= target_align;
|
||||
data_out_latch_next <= data_out_latch;
|
||||
finalize_payload_next <= finalize_payload;
|
||||
optional_next <= optional;
|
||||
taken_sig_next <= taken_sig;
|
||||
data_in_latch_next <= data_in_latch;
|
||||
align_op_next <= align_op;
|
||||
return_code_latch_next <= return_code_latch;
|
||||
service_info_sig_next <= service_info_sig;
|
||||
dw_latch_next <= dw_latch;
|
||||
sequence_id_sig_next <= sequence_id_sig;
|
||||
data_available_sig_next <= data_available_sig;
|
||||
ready_in_r_sig <= '0';
|
||||
abort_mem <= '0';
|
||||
ack_user <= '0';
|
||||
si_ack_r <= '0';
|
||||
get_data_r <= '0';
|
||||
start_r <= '0';
|
||||
opcode_r <= NOP;
|
||||
start_w <= '0';
|
||||
opcode_w <= NOP;
|
||||
valid_out_w <= '0';
|
||||
last_word_out_w <= '0';
|
||||
done_user <= '0';
|
||||
return_code_user <= ROS_RET_OK;
|
||||
data_out_w <= (others => '0');
|
||||
-- ###GENERATED START###
|
||||
sum_latch_next <= sum_latch;
|
||||
-- ###GENERATED END###
|
||||
|
||||
-- Last Word Latch Setter
|
||||
if (last_word_in_r = '1') then
|
||||
last_word_in_latch_next <= '1';
|
||||
end if;
|
||||
-- Data Available Setter
|
||||
if (check_mask(status_r, DATA_AVAILABLE_STATUS)) then
|
||||
data_available_sig_next <= '1';
|
||||
end if;
|
||||
|
||||
|
||||
case (stage) is
|
||||
when IDLE =>
|
||||
if (start_user = '1') then
|
||||
ack_user <= '1';
|
||||
case (opcode_user) is
|
||||
when SEND_REQUEST =>
|
||||
stage_next <= INITIATE_WRITE;
|
||||
-- Increment Sequence ID
|
||||
sequence_id_sig_next <= sequence_id_sig + 1;
|
||||
when TAKE_RESPONSE =>
|
||||
stage_next <= INITIATE_READ;
|
||||
when others =>
|
||||
return_code_latch_next <= ROS_RET_UNSUPPORTED;
|
||||
stage_next <= RETURN_ROS;
|
||||
end case;
|
||||
-- RESET
|
||||
taken_sig_next <= '0';
|
||||
abort_mem <= '1';
|
||||
else
|
||||
-- ###GENERATED START###
|
||||
-- MEMORY SIGNAL CONNECTIONS
|
||||
-- ###GENERATED END###
|
||||
end if;
|
||||
when RETURN_ROS =>
|
||||
done_user <= '1';
|
||||
return_code_user <= return_code_latch;
|
||||
|
||||
-- DONE
|
||||
stage_next <= IDLE;
|
||||
when INITIATE_READ =>
|
||||
start_r <= '1';
|
||||
opcode_r <= TAKE_NEXT_SAMPLE;
|
||||
|
||||
if (ack_r = '1') then
|
||||
stage_next <= WAIT_FOR_READER;
|
||||
end if;
|
||||
when WAIT_FOR_READER =>
|
||||
if (done_r = '1') then
|
||||
case (return_code_r) is
|
||||
when RETCODE_OK =>
|
||||
stage_next <= WAIT_FOR_DATA;
|
||||
when RETCODE_NO_DATA =>
|
||||
assert (taken_sig = '0') severity FAILURE;
|
||||
|
||||
-- Data Available Resetter
|
||||
data_available_sig_next <= '0';
|
||||
|
||||
return_code_latch_next <= ROS_RET_OK;
|
||||
stage_next <= RETURN_ROS;
|
||||
when others =>
|
||||
return_code_latch_next <= ROS_RET_ERROR;
|
||||
stage_next <= RETURN_ROS;
|
||||
end case;
|
||||
end if;
|
||||
when WAIT_FOR_DATA =>
|
||||
if (si_valid_r = '1') then
|
||||
si_ack_r <= '1';
|
||||
-- Meta Sample
|
||||
if (si_valid_data_r = '0') then
|
||||
-- Ignore and read Next Sample
|
||||
stage_next <= INITIATE_READ;
|
||||
else
|
||||
get_data_r <= '1';
|
||||
stage_next <= GET_PAYLOAD_HEADER;
|
||||
|
||||
service_info_sig_next.received_timestamp <= TIME_INVALID;
|
||||
service_info_sig_next.source_timestamp <= si_source_timestamp_r;
|
||||
end if;
|
||||
end if;
|
||||
when GET_PAYLOAD_HEADER =>
|
||||
-- TODO: Latch Offset from Options Field?
|
||||
|
||||
ready_in_r_sig <= '1';
|
||||
-- Input Guard
|
||||
if (valid_in_r = '1') then
|
||||
case (representation_id) is
|
||||
when CDR_BE =>
|
||||
endian_flag_next <= '0';
|
||||
stage_next <= FETCH;
|
||||
-- Alignment Reset
|
||||
align_offset_next <= (others => '0');
|
||||
decode_stage_next <= GET_RID_WGUID;
|
||||
cnt_next <= 0;
|
||||
-- Initial Fetch
|
||||
when CDR_LE =>
|
||||
endian_flag_next <= '1';
|
||||
stage_next <= FETCH;
|
||||
-- Alignment Reset
|
||||
align_offset_next <= (others => '0');
|
||||
decode_stage_next <= GET_RID_WGUID;
|
||||
cnt_next <= 0;
|
||||
when others =>
|
||||
-- Unknown Payload Encoding
|
||||
stage_next <= SKIP_PAYLOAD;
|
||||
decode_error_latch_next <= '1';
|
||||
end case;
|
||||
end if;
|
||||
when FETCH =>
|
||||
ready_in_r_sig <= '1';
|
||||
-- Input Guard
|
||||
if (valid_in_r = '1') then
|
||||
data_in_latch_next <= data_in_r;
|
||||
-- Alignment Operation in progress
|
||||
if (align_op = '1') then
|
||||
stage_next <= ALIGN_IN_STREAM;
|
||||
-- Reset
|
||||
align_op_next <= '0';
|
||||
else
|
||||
stage_next <= DECODE_PAYLOAD;
|
||||
end if;
|
||||
end if;
|
||||
when ALIGN_IN_STREAM =>
|
||||
-- Target Stream Alignment reached
|
||||
if (check_align(align_offset, target_align)) then
|
||||
-- DONE
|
||||
stage_next <= DECODE_PAYLOAD;
|
||||
else
|
||||
align_offset_next <= align_offset + 1;
|
||||
-- Need to fetch new Input Word
|
||||
if (align_offset(1 downto 0) = "11") then
|
||||
align_op_next <= '1';
|
||||
stage_next <= FETCH;
|
||||
end if;
|
||||
end if;
|
||||
when DECODE_PAYLOAD =>
|
||||
case (decode_stage) is
|
||||
-- NOTE: The Cyclone DDS implementation uses a custom request header that is pre-pended to the actual service request/response.
|
||||
-- It is defined as follows:
|
||||
-- struct cdds_request_header_t{
|
||||
-- uint64_t guid;
|
||||
-- int64_t seq;
|
||||
-- };
|
||||
-- 'seq' is set by a counter that is incremented on each "send_request".
|
||||
-- 'guid' is set to the publication handle of the request writer of the service client.
|
||||
-- Note that the publication handle is useless for the server, since it is only meanigful localy (i.e. only the client can do something with it)
|
||||
-- Nevertheless the same 'guid' has to be returned to the client.
|
||||
when GET_RID_WGUID =>
|
||||
-- ALIGN GUARD
|
||||
if (not check_align(align_offset, ALIGN_8)) then
|
||||
target_align_next <= ALIGN_8;
|
||||
stage_next <= ALIGN_IN_STREAM;
|
||||
else
|
||||
case (cnt) is
|
||||
-- Double Word 1/2
|
||||
when 0 =>
|
||||
dw_latch_next(CDR_LONG_LONG_WIDTH-1 downto CDR_LONG_LONG_WIDTH/2) <= data_in_latch;
|
||||
stage_next <= FETCH;
|
||||
cnt_next <= cnt + 1;
|
||||
-- Double Word 2/2
|
||||
when 1 =>
|
||||
dw_latch_next((CDR_LONG_LONG_WIDTH/2)-1 downto 0) <= data_in_latch;
|
||||
stage_next <= FETCH;
|
||||
cnt_next <= cnt + 1;
|
||||
-- Push Double Word
|
||||
when 2 =>
|
||||
service_info_sig_next.request_id.writer_guid(0) <= get_sub_vector(endian_swap(endian_flag, dw_latch),0,WORD_WIDTH,TRUE);
|
||||
service_info_sig_next.request_id.writer_guid(1) <= get_sub_vector(endian_swap(endian_flag, dw_latch),1,WORD_WIDTH,TRUE);
|
||||
align_offset_next <= align_offset + 8;
|
||||
decode_stage_next <= GET_RID_SN;
|
||||
cnt_next <= 0;
|
||||
when others =>
|
||||
null;
|
||||
end case;
|
||||
end if;
|
||||
when GET_RID_SN =>
|
||||
-- ALIGN GUARD
|
||||
if (not check_align(align_offset, ALIGN_8)) then
|
||||
target_align_next <= ALIGN_8;
|
||||
stage_next <= ALIGN_IN_STREAM;
|
||||
else
|
||||
case (cnt) is
|
||||
-- Double Word 1/2
|
||||
when 0 =>
|
||||
dw_latch_next(CDR_LONG_LONG_WIDTH-1 downto CDR_LONG_LONG_WIDTH/2) <= data_in_latch;
|
||||
stage_next <= FETCH;
|
||||
cnt_next <= cnt + 1;
|
||||
-- Double Word 2/2
|
||||
when 1 =>
|
||||
dw_latch_next((CDR_LONG_LONG_WIDTH/2)-1 downto 0) <= data_in_latch;
|
||||
stage_next <= FETCH;
|
||||
cnt_next <= cnt + 1;
|
||||
-- Push Double Word
|
||||
when 2 =>
|
||||
service_info_sig_next.request_id.sequence_number <= to_double_word(unsigned(endian_swap(endian_flag, dw_latch)));
|
||||
align_offset_next <= align_offset + 8;
|
||||
-- ###GENERATED START###
|
||||
decode_stage_next <= GET_SUM;
|
||||
cnt_next <= 0;
|
||||
-- ###GENERATED END###
|
||||
when others =>
|
||||
null;
|
||||
end case;
|
||||
end if;
|
||||
-- ###GENERATED START###
|
||||
when GET_SUM =>
|
||||
-- ALIGN GUARD
|
||||
if (not check_align(align_offset, ALIGN_8)) then
|
||||
target_align_next <= ALIGN_8;
|
||||
stage_next <= ALIGN_IN_STREAM;
|
||||
else
|
||||
case (cnt) is
|
||||
-- Double Word 1/2
|
||||
when 0 =>
|
||||
dw_latch_next(CDR_LONG_LONG_WIDTH-1 downto CDR_LONG_LONG_WIDTH/2) <= data_in_latch;
|
||||
stage_next <= FETCH;
|
||||
cnt_next <= cnt + 1;
|
||||
-- Double Word 2/2
|
||||
when 1 =>
|
||||
dw_latch_next((CDR_LONG_LONG_WIDTH/2)-1 downto 0) <= data_in_latch;
|
||||
cnt_next <= cnt + 1;
|
||||
-- Push Double Word
|
||||
when 2 =>
|
||||
sum_latch_next <= endian_swap(endian_flag, dw_latch);
|
||||
align_offset_next <= align_offset + 8;
|
||||
|
||||
-- DONE
|
||||
stage_next <= SKIP_PAYLOAD;
|
||||
when others =>
|
||||
null;
|
||||
end case;
|
||||
end if;
|
||||
-- ###GENERATED END###
|
||||
when GET_OPTIONAL_HEADER =>
|
||||
-- ALIGN GUARD
|
||||
if (not check_align(align_offset, ALIGN_4)) then
|
||||
target_align_next <= ALIGN_4;
|
||||
stage_next <= ALIGN_IN_STREAM;
|
||||
else
|
||||
case (cnt) is
|
||||
-- Optional Member Header
|
||||
when 0 =>
|
||||
-- Extended Parameter Header
|
||||
if (endian_swap(endian_flag,parameter_id) = PID_EXTENDED) then
|
||||
cnt_next <= cnt + 1;
|
||||
stage_next <= FETCH;
|
||||
else
|
||||
stage_next <= FETCH;
|
||||
decode_stage_next <= return_stage;
|
||||
cnt_next <= 0;
|
||||
-- Alignment Reset
|
||||
align_offset_next <= (others => '0');
|
||||
|
||||
-- Optional omitted
|
||||
if(endian_swap(endian_flag,parameter_length) = (parameter_length'reverse_range => '0')) then
|
||||
optional_next <= '0';
|
||||
else
|
||||
optional_next <= '1';
|
||||
end if;
|
||||
end if;
|
||||
-- eMemberHeader
|
||||
when 1 =>
|
||||
-- Ignore Parameter ID
|
||||
cnt_next <= cnt + 1;
|
||||
stage_next <= FETCH;
|
||||
-- Llength
|
||||
when 2 =>
|
||||
stage_next <= FETCH;
|
||||
decode_stage_next <= return_stage;
|
||||
cnt_next <= 0;
|
||||
-- Alignment Reset
|
||||
align_offset_next <= (others => '0');
|
||||
|
||||
-- Optional omitted
|
||||
if(endian_swap(endian_flag, data_in_r) = (data_in_r'reverse_range => '0')) then
|
||||
optional_next <= '0';
|
||||
else
|
||||
optional_next <= '1';
|
||||
end if;
|
||||
when others =>
|
||||
null;
|
||||
end case;
|
||||
end if;
|
||||
when others =>
|
||||
null;
|
||||
end case;
|
||||
when SKIP_PAYLOAD =>
|
||||
if (last_word_in_latch = '0' and last_word_in_r = '0') then
|
||||
-- Skip Read
|
||||
ready_in_r_sig <= '1';
|
||||
else
|
||||
-- Reset
|
||||
last_word_in_latch_next <= '0';
|
||||
|
||||
-- If no Decode Error, mark output as valid
|
||||
if (decode_error_latch = '0') then
|
||||
taken_sig_next <= '1';
|
||||
return_code_latch_next <= ROS_RET_OK;
|
||||
else
|
||||
taken_sig_next <= '0';
|
||||
return_code_latch_next <= ROS_RET_ERROR;
|
||||
end if;
|
||||
|
||||
stage_next <= RETURN_ROS;
|
||||
end if;
|
||||
when INITIATE_WRITE =>
|
||||
start_w <= '1';
|
||||
opcode_w <= WRITE;
|
||||
|
||||
if (ack_w = '1') then
|
||||
stage_next <= WRITE_PAYLOAD_HEADER;
|
||||
end if;
|
||||
when WRITE_PAYLOAD_HEADER =>
|
||||
valid_out_w <= '1';
|
||||
if (LITTLE_ENDIAN = '0') then
|
||||
data_out_w <= CDR_BE & x"0000";
|
||||
else
|
||||
data_out_w <= CDR_LE & x"0000";
|
||||
end if;
|
||||
-- Output Guard
|
||||
if (ready_out_w = '1') then
|
||||
stage_next <= ENCODE_PAYLOAD;
|
||||
-- Reset
|
||||
align_offset_next <= (others => '0');
|
||||
data_out_latch_next <= (others => '0');
|
||||
encode_stage_next <= WRITE_RID_WGUID;
|
||||
cnt_next <= 0;
|
||||
end if;
|
||||
when PUSH =>
|
||||
-- Mark Last Word
|
||||
if (finalize_payload = '1') then
|
||||
last_word_out_w <= '1';
|
||||
end if;
|
||||
|
||||
valid_out_w <= '1';
|
||||
data_out_w <= data_out_latch;
|
||||
-- Output Guard
|
||||
if (ready_out_w = '1') then
|
||||
-- NOTE: Ensures all padding is zero.
|
||||
data_out_latch_next <= (others => '0');
|
||||
-- Alignment Operation in process
|
||||
if (align_op = '1') then
|
||||
stage_next <= ALIGN_OUT_STREAM;
|
||||
-- Reset
|
||||
align_op_next <= '0';
|
||||
-- DONE
|
||||
elsif (finalize_payload = '1') then
|
||||
finalize_payload_next <= '0';
|
||||
stage_next <= WAIT_FOR_WRITER;
|
||||
else
|
||||
stage_next <= ENCODE_PAYLOAD;
|
||||
end if;
|
||||
end if;
|
||||
when ALIGN_OUT_STREAM =>
|
||||
-- Target Stream Alignment reached
|
||||
if (check_align(align_offset, target_align)) then
|
||||
-- DONE
|
||||
stage_next <= ENCODE_PAYLOAD;
|
||||
else
|
||||
align_offset_next <= align_offset + 1;
|
||||
-- Need to push Word
|
||||
if (align_offset(1 downto 0) = "11") then
|
||||
align_op_next <= '1';
|
||||
stage_next <= PUSH;
|
||||
end if;
|
||||
end if;
|
||||
when ENCODE_PAYLOAD =>
|
||||
case (encode_stage) is
|
||||
when WRITE_RID_WGUID =>
|
||||
-- ALIGN GUARD
|
||||
if (not check_align(align_offset, ALIGN_8)) then
|
||||
target_align_next <= ALIGN_8;
|
||||
stage_next <= ALIGN_OUT_STREAM;
|
||||
else
|
||||
case (cnt) is
|
||||
when 0 =>
|
||||
data_out_latch_next <= (others => '0');
|
||||
stage_next <= PUSH;
|
||||
cnt_next <= cnt + 1;
|
||||
when 1 =>
|
||||
data_out_latch_next <= (others => '0');
|
||||
stage_next <= PUSH;
|
||||
align_offset_next <= align_offset + 8;
|
||||
encode_stage_next <= WRITE_RID_SN;
|
||||
cnt_next <= 0;
|
||||
when others =>
|
||||
end case;
|
||||
end if;
|
||||
when WRITE_RID_SN =>
|
||||
-- ALIGN GUARD
|
||||
if (not check_align(align_offset, ALIGN_8)) then
|
||||
target_align_next <= ALIGN_8;
|
||||
stage_next <= ALIGN_OUT_STREAM;
|
||||
else
|
||||
case (cnt) is
|
||||
when 0 =>
|
||||
data_out_latch_next <= get_sub_vector(endian_swap(LITTLE_ENDIAN, std_logic_vector(sequence_id_sig)), 0, WORD_WIDTH, TRUE);
|
||||
stage_next <= PUSH;
|
||||
cnt_next <= cnt + 1;
|
||||
when 1 =>
|
||||
data_out_latch_next <= get_sub_vector(endian_swap(LITTLE_ENDIAN, std_logic_vector(sequence_id_sig)), 1, WORD_WIDTH, TRUE);
|
||||
stage_next <= PUSH;
|
||||
align_offset_next <= align_offset + 8;
|
||||
-- ###GENERATED START###
|
||||
encode_stage_next <= WRITE_A;
|
||||
cnt_next <= 0;
|
||||
-- ###GENERATED END###
|
||||
when others =>
|
||||
end case;
|
||||
end if;
|
||||
-- ###GENERATED START###
|
||||
when WRITE_A =>
|
||||
-- ALIGN GUARD
|
||||
if (not check_align(align_offset, ALIGN_8)) then
|
||||
target_align_next <= ALIGN_8;
|
||||
stage_next <= ALIGN_OUT_STREAM;
|
||||
else
|
||||
case (cnt) is
|
||||
when 0 =>
|
||||
data_out_latch_next <= get_sub_vector(endian_swap(LITTLE_ENDIAN, a), 0, WORD_WIDTH, TRUE);
|
||||
stage_next <= PUSH;
|
||||
cnt_next <= cnt + 1;
|
||||
when 1 =>
|
||||
data_out_latch_next <= get_sub_vector(endian_swap(LITTLE_ENDIAN, a), 1, WORD_WIDTH, TRUE);
|
||||
stage_next <= PUSH;
|
||||
align_offset_next <= align_offset + 8;
|
||||
|
||||
encode_stage_next <= WRITE_B;
|
||||
cnt_next <= 0;
|
||||
when others =>
|
||||
end case;
|
||||
end if;
|
||||
when WRITE_B =>
|
||||
-- ALIGN GUARD
|
||||
if (not check_align(align_offset, ALIGN_8)) then
|
||||
target_align_next <= ALIGN_8;
|
||||
stage_next <= ALIGN_OUT_STREAM;
|
||||
else
|
||||
case (cnt) is
|
||||
when 0 =>
|
||||
data_out_latch_next <= get_sub_vector(endian_swap(LITTLE_ENDIAN, b), 0, WORD_WIDTH, TRUE);
|
||||
stage_next <= PUSH;
|
||||
cnt_next <= cnt + 1;
|
||||
when 1 =>
|
||||
data_out_latch_next <= get_sub_vector(endian_swap(LITTLE_ENDIAN, b), 1, WORD_WIDTH, TRUE);
|
||||
stage_next <= PUSH;
|
||||
align_offset_next <= align_offset + 8;
|
||||
|
||||
-- DONE
|
||||
finalize_payload_next <= '1';
|
||||
when others =>
|
||||
end case;
|
||||
end if;
|
||||
-- ###GENERATED END###
|
||||
when others =>
|
||||
null;
|
||||
end case;
|
||||
when WAIT_FOR_WRITER =>
|
||||
if (done_w = '1') then
|
||||
case (return_code_w) is
|
||||
when RETCODE_OK =>
|
||||
return_code_latch_next <= ROS_RET_OK;
|
||||
stage_next <= RETURN_ROS;
|
||||
when others =>
|
||||
return_code_latch_next <= ROS_RET_ERROR;
|
||||
stage_next <= RETURN_ROS;
|
||||
end case;
|
||||
end if;
|
||||
when others =>
|
||||
null;
|
||||
end case;
|
||||
|
||||
-- OVERREAD GUARD
|
||||
-- Attempted read on empty input
|
||||
if (last_word_in_latch = '1' and last_word_in_r = '0' and ready_in_r_sig = '1') then
|
||||
stage_next <= SKIP_PAYLOAD;
|
||||
decode_error_latch_next <= '1';
|
||||
end if;
|
||||
|
||||
end process;
|
||||
|
||||
sync_prc : process(clk)
|
||||
begin
|
||||
if rising_edge(clk) then
|
||||
if (reset = '1') then
|
||||
stage <= IDLE;
|
||||
encode_stage <= WRITE_RID_WGUID;
|
||||
decode_stage <= GET_RID_WGUID;
|
||||
return_stage <= GET_RID_WGUID;
|
||||
target_align <= ALIGN_1;
|
||||
cnt <= 0;
|
||||
endian_flag <= '0';
|
||||
last_word_in_latch <= '0';
|
||||
decode_error_latch <= '0';
|
||||
optional <= '0';
|
||||
taken_sig <= '0';
|
||||
align_op <= '0';
|
||||
finalize_payload <= '0';
|
||||
data_available_sig <= '0';
|
||||
align_offset <= (others => '0');
|
||||
data_in_latch <= (others => '0');
|
||||
data_out_latch <= (others => '0');
|
||||
dw_latch <= (others => '0');
|
||||
sequence_id_sig <= (others => '0');
|
||||
return_code_latch <= ROS_RET_OK;
|
||||
service_info_sig <= EMPTY_SERVICE_INFO;
|
||||
-- ###GENERATED START###
|
||||
sum_latch <= (others => '0');
|
||||
-- ###GENERATED END###
|
||||
else
|
||||
stage <= stage_next;
|
||||
encode_stage <= encode_stage_next;
|
||||
decode_stage <= decode_stage_next;
|
||||
return_stage <= return_stage_next;
|
||||
target_align <= target_align_next;
|
||||
cnt <= cnt_next;
|
||||
endian_flag <= endian_flag_next;
|
||||
last_word_in_latch <= last_word_in_latch_next;
|
||||
decode_error_latch <= decode_error_latch_next;
|
||||
optional <= optional_next;
|
||||
taken_sig <= taken_sig_next;
|
||||
align_op <= align_op_next;
|
||||
finalize_payload <= finalize_payload_next;
|
||||
data_available_sig <= data_available_sig_next;
|
||||
align_offset <= align_offset_next;
|
||||
data_in_latch <= data_in_latch_next;
|
||||
data_out_latch <= data_out_latch_next;
|
||||
dw_latch <= dw_latch_next;
|
||||
sequence_id_sig <= sequence_id_sig_next;
|
||||
return_code_latch <= return_code_latch_next;
|
||||
service_info_sig <= service_info_sig_next;
|
||||
-- ###GENERATED START###
|
||||
sum_latch <= sum_latch_next;
|
||||
-- ###GENERATED END###
|
||||
end if;
|
||||
end if;
|
||||
end process;
|
||||
|
||||
end architecture;
|
||||
745
src/ros2/example_interfaces/AddTwoInts_srv_server.vhd
Normal file
745
src/ros2/example_interfaces/AddTwoInts_srv_server.vhd
Normal file
@ -0,0 +1,745 @@
|
||||
-- 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.rtps_package.all;
|
||||
use work.rtps_config_package.all;
|
||||
use work.ros_package.all;
|
||||
|
||||
entity AddTwoInts_srv_server is
|
||||
generic (
|
||||
LITTLE_ENDIAN : std_logic := '0'
|
||||
);
|
||||
port (
|
||||
-- SYSTEM
|
||||
clk : in std_logic;
|
||||
reset : in std_logic;
|
||||
-- FROM DDS READER
|
||||
start_r : out std_logic;
|
||||
ack_r : in std_logic;
|
||||
opcode_r : out DDS_READER_OPCODE_TYPE;
|
||||
instance_state_r : out std_logic_vector(INSTANCE_STATE_KIND_WIDTH-1 downto 0);
|
||||
view_state_r : out std_logic_vector(VIEW_STATE_KIND_WIDTH-1 downto 0);
|
||||
sample_state_r : out std_logic_vector(SAMPLE_STATE_KIND_WIDTH-1 downto 0);
|
||||
instance_handle_r : out INSTANCE_HANDLE_TYPE;
|
||||
max_samples_r : out std_logic_vector(MAX_SAMPLES_WIDTH-1 downto 0);
|
||||
get_data_r : out std_logic;
|
||||
done_r : in std_logic;
|
||||
return_code_r : in std_logic_vector(RETURN_CODE_WIDTH-1 downto 0);
|
||||
valid_in_r : in std_logic;
|
||||
ready_in_r : out std_logic;
|
||||
data_in_r : in std_logic_vector(WORD_WIDTH-1 downto 0);
|
||||
last_word_in_r : in std_logic;
|
||||
-- Sample Info
|
||||
si_sample_state_r : in std_logic_vector(SAMPLE_STATE_KIND_WIDTH-1 downto 0);
|
||||
si_view_state_r : in std_logic_vector(VIEW_STATE_KIND_WIDTH-1 downto 0);
|
||||
si_instance_state_r : in std_logic_vector(INSTANCE_STATE_KIND_WIDTH-1 downto 0);
|
||||
si_source_timestamp_r : in TIME_TYPE;
|
||||
si_instance_handle_r : in INSTANCE_HANDLE_TYPE;
|
||||
si_publication_handle_r : in INSTANCE_HANDLE_TYPE;
|
||||
si_disposed_generation_count_r : in std_logic_vector(DISPOSED_GENERATION_COUNT_WIDTH-1 downto 0);
|
||||
si_no_writers_generation_count_r : in std_logic_vector(NO_WRITERS_GENERATION_COUNT_WIDTH-1 downto 0);
|
||||
si_sample_rank_r : in std_logic_vector(SAMPLE_RANK_WIDTH-1 downto 0);
|
||||
si_generation_rank_r : in std_logic_vector(GENERATION_RANK_WIDTH-1 downto 0);
|
||||
si_absolute_generation_rank_r : in std_logic_vector(ABSOLUTE_GENERATION_COUNT_WIDTH-1 downto 0);
|
||||
si_valid_data_r : in std_logic;
|
||||
si_valid_r : in std_logic;
|
||||
si_ack_r : out std_logic;
|
||||
eoc_r : in std_logic;
|
||||
status_r : in std_logic_vector(STATUS_KIND_WIDTH-1 downto 0);
|
||||
-- FROM DDS WRITER
|
||||
start_w : out std_logic;
|
||||
ack_w : in std_logic;
|
||||
opcode_w : out DDS_WRITER_OPCODE_TYPE;
|
||||
instance_handle_out_w : out INSTANCE_HANDLE_TYPE;
|
||||
source_ts_w : out TIME_TYPE;
|
||||
max_wait_w : out DURATION_TYPE;
|
||||
done_w : in std_logic;
|
||||
return_code_w : in std_logic_vector(RETURN_CODE_WIDTH-1 downto 0);
|
||||
instance_handle_in_w : in INSTANCE_HANDLE_TYPE;
|
||||
valid_out_w : out std_logic;
|
||||
ready_out_w : in std_logic;
|
||||
data_out_w : out std_logic_vector(WORD_WIDTH-1 downto 0);
|
||||
last_word_out_w : out std_logic;
|
||||
valid_in_w : in std_logic;
|
||||
ready_in_w : out std_logic;
|
||||
data_in_w : in std_logic_vector(WORD_WIDTH-1 downto 0);
|
||||
last_word_in_w : in std_logic;
|
||||
status_w : in std_logic_vector(STATUS_KIND_WIDTH-1 downto 0);
|
||||
|
||||
-- TO USER
|
||||
start_user : in std_logic;
|
||||
ack_user : out std_logic;
|
||||
opcode_user : in ROS_SERVICE_OPCODE_TYPE;
|
||||
service_info_user : out SERVICE_INFO_TYPE;
|
||||
request_id_user : in REQUEST_ID_TYPE;
|
||||
data_available_user : out std_logic;
|
||||
-- REQUEST
|
||||
taken_user : out std_logic;
|
||||
a : out std_logic_vector(CDR_LONG_LONG_WIDTH-1 downto 0);
|
||||
b : out std_logic_vector(CDR_LONG_LONG_WIDTH-1 downto 0);
|
||||
-- RESPONSE
|
||||
sum : in std_logic_vector(CDR_LONG_LONG_WIDTH-1 downto 0);
|
||||
done_user : out std_logic;
|
||||
return_code_user : out std_logic_vector(ROS_RETCODE_WIDTH-1 downto 0)
|
||||
);
|
||||
end entity;
|
||||
|
||||
architecture arch of AddTwoInts_srv_server is
|
||||
|
||||
--*****TYPE DECLARATION*****
|
||||
-- FSM states. Explained below in detail
|
||||
type STAGE_TYPE is (IDLE,RETURN_ROS,INITIATE_READ,WAIT_FOR_READER,WAIT_FOR_WRITER,WAIT_FOR_DATA,GET_PAYLOAD_HEADER,FETCH,ALIGN_IN_STREAM,SKIP_PAYLOAD,DECODE_PAYLOAD,INITIATE_WRITE,WRITE_PAYLOAD_HEADER,PUSH,ALIGN_OUT_STREAM,ENCODE_PAYLOAD);
|
||||
-- ###GENERATED START###
|
||||
type ENCODE_STAGE_TYPE is (WRITE_RID_WGUID,WRITE_RID_SN,WRITE_SUM);
|
||||
type DECODE_STAGE_TYPE is (GET_RID_WGUID,GET_RID_SN,GET_OPTIONAL_HEADER,GET_A,GET_B);
|
||||
-- ###GENERATED END###
|
||||
|
||||
-- *MAIN PROCESS*
|
||||
signal stage, stage_next : STAGE_TYPE;
|
||||
signal cnt, cnt_next : natural range 0 to 5;
|
||||
signal endian_flag, endian_flag_next : std_logic;
|
||||
signal last_word_in_latch, last_word_in_latch_next : std_logic;
|
||||
signal decode_error_latch, decode_error_latch_next : std_logic;
|
||||
signal dw_latch, dw_latch_next : std_logic_vector(CDR_LONG_LONG_WIDTH-1 downto 0);
|
||||
signal align_offset, align_offset_next : unsigned(MAX_ALIGN_OFFSET_WIDTH-1 downto 0);
|
||||
signal align_op, align_op_next : std_logic;
|
||||
signal target_align, target_align_next : ALIGN_TYPE;
|
||||
signal data_in_latch, data_in_latch_next : std_logic_vector(WORD_WIDTH-1 downto 0);
|
||||
signal optional, optional_next : std_logic;
|
||||
signal data_out_latch, data_out_latch_next : std_logic_vector(WORD_WIDTH-1 downto 0);
|
||||
signal abort_mem : std_logic;
|
||||
signal ready_in_r_sig : std_logic;
|
||||
signal taken_sig, taken_sig_next : std_logic;
|
||||
signal service_info_sig, service_info_sig_next : SERVICE_INFO_TYPE;
|
||||
signal finalize_payload, finalize_payload_next : std_logic;
|
||||
signal encode_stage, encode_stage_next : ENCODE_STAGE_TYPE;
|
||||
signal decode_stage, decode_stage_next : DECODE_STAGE_TYPE;
|
||||
signal return_stage, return_stage_next : DECODE_STAGE_TYPE;
|
||||
signal return_code_latch, return_code_latch_next : std_logic_vector(ROS_RETCODE_WIDTH-1 downto 0);
|
||||
signal data_available_sig, data_available_sig_next : std_logic;
|
||||
-- ###GENERATED START###
|
||||
signal a_latch, a_latch_next : std_logic_vector(CDR_LONG_LONG_WIDTH-1 downto 0);
|
||||
signal b_latch, b_latch_next : std_logic_vector(CDR_LONG_LONG_WIDTH-1 downto 0);
|
||||
-- ###GENERATED END###
|
||||
|
||||
--*****ALIAS DECLARATION*****
|
||||
alias representation_id : std_logic_vector(PAYLOAD_REPRESENTATION_ID_WIDTH-1 downto 0) is data_in_r(WORD_WIDTH-1 downto WORD_WIDTH-PAYLOAD_REPRESENTATION_ID_WIDTH);
|
||||
alias representation_options : std_logic_vector(PAYLOAD_REPRESENTATION_ID_WIDTH-1 downto 0) is data_in_r(PAYLOAD_REPRESENTATION_OPTIONS_WIDTH-1 downto 0);
|
||||
alias parameter_id : std_logic_vector(PARAMETER_ID_WIDTH-1 downto 0) is data_in_latch(WORD_WIDTH-1 downto WORD_WIDTH-PARAMETER_ID_WIDTH);
|
||||
alias parameter_length : std_logic_vector(PARAMETER_LENGTH_WIDTH-1 downto 0) is data_in_latch(PARAMETER_LENGTH_WIDTH-1 downto 0);
|
||||
|
||||
|
||||
begin
|
||||
|
||||
-- ###GENERATED START###
|
||||
-- MEMORY INSTANTIATIONS
|
||||
-- ###GENERATED END###
|
||||
|
||||
instance_state_r <= ANY_INSTANCE_STATE;
|
||||
view_state_r <= ANY_VIEW_STATE;
|
||||
sample_state_r <= ANY_SAMPLE_STATE;
|
||||
instance_handle_r <= HANDLE_NIL;
|
||||
max_samples_r <= (others => '0');
|
||||
instance_handle_out_w <= HANDLE_NIL;
|
||||
source_ts_w <= TIME_INVALID;
|
||||
max_wait_w <= DURATION_ZERO;
|
||||
ready_in_w <= '0'; -- DDS Writer Input is unused
|
||||
taken_user <= taken_sig;
|
||||
ready_in_r <= ready_in_r_sig;
|
||||
service_info_user <= service_info_sig;
|
||||
data_available_user <= data_available_sig;
|
||||
|
||||
-- ###GENERATED START###
|
||||
a <= a_latch;
|
||||
b <= b_latch;
|
||||
-- ###GENERATED END###
|
||||
|
||||
main_prc : process (all)
|
||||
variable tmp_length : unsigned(WORD_WIDTH-1 downto 0);
|
||||
begin
|
||||
-- DEFAULT
|
||||
stage_next <= stage;
|
||||
encode_stage_next <= encode_stage;
|
||||
decode_stage_next <= decode_stage;
|
||||
return_stage_next <= return_stage;
|
||||
cnt_next <= cnt;
|
||||
endian_flag_next <= endian_flag;
|
||||
last_word_in_latch_next <= last_word_in_latch;
|
||||
decode_error_latch_next <= decode_error_latch;
|
||||
align_offset_next <= align_offset;
|
||||
target_align_next <= target_align;
|
||||
data_out_latch_next <= data_out_latch;
|
||||
finalize_payload_next <= finalize_payload;
|
||||
optional_next <= optional;
|
||||
taken_sig_next <= taken_sig;
|
||||
data_in_latch_next <= data_in_latch;
|
||||
align_op_next <= align_op;
|
||||
return_code_latch_next <= return_code_latch;
|
||||
service_info_sig_next <= service_info_sig;
|
||||
dw_latch_next <= dw_latch;
|
||||
data_available_sig_next <= data_available_sig;
|
||||
ready_in_r_sig <= '0';
|
||||
abort_mem <= '0';
|
||||
ack_user <= '0';
|
||||
si_ack_r <= '0';
|
||||
get_data_r <= '0';
|
||||
start_r <= '0';
|
||||
opcode_r <= NOP;
|
||||
start_w <= '0';
|
||||
opcode_w <= NOP;
|
||||
valid_out_w <= '0';
|
||||
last_word_out_w <= '0';
|
||||
done_user <= '0';
|
||||
return_code_user <= ROS_RET_OK;
|
||||
data_out_w <= (others => '0');
|
||||
-- ###GENERATED START###
|
||||
a_latch_next <= a_latch;
|
||||
b_latch_next <= b_latch;
|
||||
-- ###GENERATED END###
|
||||
|
||||
-- Last Word Latch Setter
|
||||
if (last_word_in_r = '1') then
|
||||
last_word_in_latch_next <= '1';
|
||||
end if;
|
||||
-- Data Available Setter
|
||||
if (check_mask(status_r, DATA_AVAILABLE_STATUS)) then
|
||||
data_available_sig_next <= '1';
|
||||
end if;
|
||||
|
||||
|
||||
case (stage) is
|
||||
when IDLE =>
|
||||
if (start_user = '1') then
|
||||
ack_user <= '1';
|
||||
case (opcode_user) is
|
||||
when TAKE_REQUEST =>
|
||||
stage_next <= INITIATE_READ;
|
||||
when SEND_RESPONSE =>
|
||||
stage_next <= INITIATE_WRITE;
|
||||
when others =>
|
||||
return_code_latch_next <= ROS_RET_UNSUPPORTED;
|
||||
stage_next <= RETURN_ROS;
|
||||
end case;
|
||||
-- RESET
|
||||
taken_sig_next <= '0';
|
||||
abort_mem <= '1';
|
||||
else
|
||||
-- ###GENERATED START###
|
||||
-- MEMORY SIGNAL CONNECTIONS
|
||||
-- ###GENERATED END###
|
||||
end if;
|
||||
when RETURN_ROS =>
|
||||
done_user <= '1';
|
||||
return_code_user <= return_code_latch;
|
||||
|
||||
-- DONE
|
||||
stage_next <= IDLE;
|
||||
when INITIATE_READ =>
|
||||
start_r <= '1';
|
||||
opcode_r <= TAKE_NEXT_SAMPLE;
|
||||
|
||||
if (ack_r = '1') then
|
||||
stage_next <= WAIT_FOR_READER;
|
||||
end if;
|
||||
when WAIT_FOR_READER =>
|
||||
if (done_r = '1') then
|
||||
case (return_code_r) is
|
||||
when RETCODE_OK =>
|
||||
stage_next <= WAIT_FOR_DATA;
|
||||
when RETCODE_NO_DATA =>
|
||||
assert (taken_sig = '0') severity FAILURE;
|
||||
|
||||
-- Data Available Resetter
|
||||
data_available_sig_next <= '0';
|
||||
|
||||
return_code_latch_next <= ROS_RET_OK;
|
||||
stage_next <= RETURN_ROS;
|
||||
when others =>
|
||||
return_code_latch_next <= ROS_RET_ERROR;
|
||||
stage_next <= RETURN_ROS;
|
||||
end case;
|
||||
end if;
|
||||
when WAIT_FOR_DATA =>
|
||||
if (si_valid_r = '1') then
|
||||
si_ack_r <= '1';
|
||||
-- Meta Sample
|
||||
if (si_valid_data_r = '0') then
|
||||
-- Ignore and read Next Sample
|
||||
stage_next <= INITIATE_READ;
|
||||
else
|
||||
get_data_r <= '1';
|
||||
stage_next <= GET_PAYLOAD_HEADER;
|
||||
|
||||
service_info_sig_next.received_timestamp <= TIME_INVALID;
|
||||
service_info_sig_next.source_timestamp <= si_source_timestamp_r;
|
||||
end if;
|
||||
end if;
|
||||
when GET_PAYLOAD_HEADER =>
|
||||
-- TODO: Latch Offset from Options Field?
|
||||
|
||||
ready_in_r_sig <= '1';
|
||||
-- Input Guard
|
||||
if (valid_in_r = '1') then
|
||||
case (representation_id) is
|
||||
when CDR_BE =>
|
||||
endian_flag_next <= '0';
|
||||
stage_next <= FETCH;
|
||||
-- Alignment Reset
|
||||
align_offset_next <= (others => '0');
|
||||
decode_stage_next <= GET_RID_WGUID;
|
||||
cnt_next <= 0;
|
||||
-- Initial Fetch
|
||||
when CDR_LE =>
|
||||
endian_flag_next <= '1';
|
||||
stage_next <= FETCH;
|
||||
-- Alignment Reset
|
||||
align_offset_next <= (others => '0');
|
||||
decode_stage_next <= GET_RID_WGUID;
|
||||
cnt_next <= 0;
|
||||
when others =>
|
||||
-- Unknown Payload Encoding
|
||||
stage_next <= SKIP_PAYLOAD;
|
||||
decode_error_latch_next <= '1';
|
||||
end case;
|
||||
end if;
|
||||
when FETCH =>
|
||||
ready_in_r_sig <= '1';
|
||||
-- Input Guard
|
||||
if (valid_in_r = '1') then
|
||||
data_in_latch_next <= data_in_r;
|
||||
-- Alignment Operation in progress
|
||||
if (align_op = '1') then
|
||||
stage_next <= ALIGN_IN_STREAM;
|
||||
-- Reset
|
||||
align_op_next <= '0';
|
||||
else
|
||||
stage_next <= DECODE_PAYLOAD;
|
||||
end if;
|
||||
end if;
|
||||
when ALIGN_IN_STREAM =>
|
||||
-- Target Stream Alignment reached
|
||||
if (check_align(align_offset, target_align)) then
|
||||
-- DONE
|
||||
stage_next <= DECODE_PAYLOAD;
|
||||
else
|
||||
align_offset_next <= align_offset + 1;
|
||||
-- Need to fetch new Input Word
|
||||
if (align_offset(1 downto 0) = "11") then
|
||||
align_op_next <= '1';
|
||||
stage_next <= FETCH;
|
||||
end if;
|
||||
end if;
|
||||
when DECODE_PAYLOAD =>
|
||||
case (decode_stage) is
|
||||
-- NOTE: The Cyclone DDS implementation uses a custom request header that is pre-pended to the actual service request/response.
|
||||
-- It is defined as follows:
|
||||
-- struct cdds_request_header_t{
|
||||
-- uint64_t guid;
|
||||
-- int64_t seq;
|
||||
-- };
|
||||
-- 'seq' is set by a counter that is incremented on each "send_request".
|
||||
-- 'guid' is set to the publication handle of the request writer of the service client.
|
||||
-- Note that the publication handle is useless for the server, since it is only meanigful localy (i.e. only the client can do something with it)
|
||||
-- Nevertheless the same 'guid' has to be returned to the client.
|
||||
when GET_RID_WGUID =>
|
||||
-- ALIGN GUARD
|
||||
if (not check_align(align_offset, ALIGN_8)) then
|
||||
target_align_next <= ALIGN_8;
|
||||
stage_next <= ALIGN_IN_STREAM;
|
||||
else
|
||||
case (cnt) is
|
||||
-- Double Word 1/2
|
||||
when 0 =>
|
||||
dw_latch_next(CDR_LONG_LONG_WIDTH-1 downto CDR_LONG_LONG_WIDTH/2) <= data_in_latch;
|
||||
stage_next <= FETCH;
|
||||
cnt_next <= cnt + 1;
|
||||
-- Double Word 2/2
|
||||
when 1 =>
|
||||
dw_latch_next((CDR_LONG_LONG_WIDTH/2)-1 downto 0) <= data_in_latch;
|
||||
stage_next <= FETCH;
|
||||
cnt_next <= cnt + 1;
|
||||
-- Push Double Word
|
||||
when 2 =>
|
||||
service_info_sig_next.request_id.writer_guid(0) <= get_sub_vector(endian_swap(endian_flag, dw_latch),0,WORD_WIDTH,TRUE);
|
||||
service_info_sig_next.request_id.writer_guid(1) <= get_sub_vector(endian_swap(endian_flag, dw_latch),1,WORD_WIDTH,TRUE);
|
||||
align_offset_next <= align_offset + 8;
|
||||
decode_stage_next <= GET_RID_SN;
|
||||
cnt_next <= 0;
|
||||
when others =>
|
||||
null;
|
||||
end case;
|
||||
end if;
|
||||
when GET_RID_SN =>
|
||||
-- ALIGN GUARD
|
||||
if (not check_align(align_offset, ALIGN_8)) then
|
||||
target_align_next <= ALIGN_8;
|
||||
stage_next <= ALIGN_IN_STREAM;
|
||||
else
|
||||
case (cnt) is
|
||||
-- Double Word 1/2
|
||||
when 0 =>
|
||||
dw_latch_next(CDR_LONG_LONG_WIDTH-1 downto CDR_LONG_LONG_WIDTH/2) <= data_in_latch;
|
||||
stage_next <= FETCH;
|
||||
cnt_next <= cnt + 1;
|
||||
-- Double Word 2/2
|
||||
when 1 =>
|
||||
dw_latch_next((CDR_LONG_LONG_WIDTH/2)-1 downto 0) <= data_in_latch;
|
||||
stage_next <= FETCH;
|
||||
cnt_next <= cnt + 1;
|
||||
-- Push Double Word
|
||||
when 2 =>
|
||||
service_info_sig_next.request_id.sequence_number <= to_double_word(unsigned(endian_swap(endian_flag, dw_latch)));
|
||||
align_offset_next <= align_offset + 8;
|
||||
-- ###GENERATED START###
|
||||
decode_stage_next <= GET_A;
|
||||
cnt_next <= 0;
|
||||
-- ###GENERATED END###
|
||||
when others =>
|
||||
null;
|
||||
end case;
|
||||
end if;
|
||||
-- ###GENERATED START###
|
||||
when GET_A =>
|
||||
-- ALIGN GUARD
|
||||
if (not check_align(align_offset, ALIGN_8)) then
|
||||
target_align_next <= ALIGN_8;
|
||||
stage_next <= ALIGN_IN_STREAM;
|
||||
else
|
||||
case (cnt) is
|
||||
-- Double Word 1/2
|
||||
when 0 =>
|
||||
dw_latch_next(CDR_LONG_LONG_WIDTH-1 downto CDR_LONG_LONG_WIDTH/2) <= data_in_latch;
|
||||
stage_next <= FETCH;
|
||||
cnt_next <= cnt + 1;
|
||||
-- Double Word 2/2
|
||||
when 1 =>
|
||||
dw_latch_next((CDR_LONG_LONG_WIDTH/2)-1 downto 0) <= data_in_latch;
|
||||
stage_next <= FETCH;
|
||||
cnt_next <= cnt + 1;
|
||||
-- Push Double Word
|
||||
when 2 =>
|
||||
a_latch_next <= endian_swap(endian_flag, dw_latch);
|
||||
align_offset_next <= align_offset + 8;
|
||||
decode_stage_next <= GET_B;
|
||||
cnt_next <= 0;
|
||||
when others =>
|
||||
null;
|
||||
end case;
|
||||
end if;
|
||||
when GET_B =>
|
||||
-- ALIGN GUARD
|
||||
if (not check_align(align_offset, ALIGN_8)) then
|
||||
target_align_next <= ALIGN_8;
|
||||
stage_next <= ALIGN_IN_STREAM;
|
||||
else
|
||||
case (cnt) is
|
||||
-- Double Word 1/2
|
||||
when 0 =>
|
||||
dw_latch_next(CDR_LONG_LONG_WIDTH-1 downto CDR_LONG_LONG_WIDTH/2) <= data_in_latch;
|
||||
stage_next <= FETCH;
|
||||
cnt_next <= cnt + 1;
|
||||
-- Double Word 2/2
|
||||
when 1 =>
|
||||
dw_latch_next((CDR_LONG_LONG_WIDTH/2)-1 downto 0) <= data_in_latch;
|
||||
cnt_next <= cnt + 1;
|
||||
-- Push Double Word
|
||||
when 2 =>
|
||||
b_latch_next <= endian_swap(endian_flag, dw_latch);
|
||||
align_offset_next <= align_offset + 8;
|
||||
|
||||
-- DONE
|
||||
stage_next <= SKIP_PAYLOAD;
|
||||
when others =>
|
||||
null;
|
||||
end case;
|
||||
end if;
|
||||
-- ###GENERATED END###
|
||||
when GET_OPTIONAL_HEADER =>
|
||||
-- ALIGN GUARD
|
||||
if (not check_align(align_offset, ALIGN_4)) then
|
||||
target_align_next <= ALIGN_4;
|
||||
stage_next <= ALIGN_IN_STREAM;
|
||||
else
|
||||
case (cnt) is
|
||||
-- Optional Member Header
|
||||
when 0 =>
|
||||
-- Extended Parameter Header
|
||||
if (endian_swap(endian_flag,parameter_id) = PID_EXTENDED) then
|
||||
cnt_next <= cnt + 1;
|
||||
stage_next <= FETCH;
|
||||
else
|
||||
stage_next <= FETCH;
|
||||
decode_stage_next <= return_stage;
|
||||
cnt_next <= 0;
|
||||
-- Alignment Reset
|
||||
align_offset_next <= (others => '0');
|
||||
|
||||
-- Optional omitted
|
||||
if(endian_swap(endian_flag,parameter_length) = (parameter_length'reverse_range => '0')) then
|
||||
optional_next <= '0';
|
||||
else
|
||||
optional_next <= '1';
|
||||
end if;
|
||||
end if;
|
||||
-- eMemberHeader
|
||||
when 1 =>
|
||||
-- Ignore Parameter ID
|
||||
cnt_next <= cnt + 1;
|
||||
stage_next <= FETCH;
|
||||
-- Llength
|
||||
when 2 =>
|
||||
stage_next <= FETCH;
|
||||
decode_stage_next <= return_stage;
|
||||
cnt_next <= 0;
|
||||
-- Alignment Reset
|
||||
align_offset_next <= (others => '0');
|
||||
|
||||
-- Optional omitted
|
||||
if(endian_swap(endian_flag, data_in_r) = (data_in_r'reverse_range => '0')) then
|
||||
optional_next <= '0';
|
||||
else
|
||||
optional_next <= '1';
|
||||
end if;
|
||||
when others =>
|
||||
null;
|
||||
end case;
|
||||
end if;
|
||||
when others =>
|
||||
null;
|
||||
end case;
|
||||
when SKIP_PAYLOAD =>
|
||||
if (last_word_in_latch = '0' and last_word_in_r = '0') then
|
||||
-- Skip Read
|
||||
ready_in_r_sig <= '1';
|
||||
else
|
||||
-- Reset
|
||||
last_word_in_latch_next <= '0';
|
||||
|
||||
-- If no Decode Error, mark output as valid
|
||||
if (decode_error_latch = '0') then
|
||||
taken_sig_next <= '1';
|
||||
return_code_latch_next <= ROS_RET_OK;
|
||||
else
|
||||
taken_sig_next <= '0';
|
||||
return_code_latch_next <= ROS_RET_ERROR;
|
||||
end if;
|
||||
|
||||
stage_next <= RETURN_ROS;
|
||||
end if;
|
||||
when INITIATE_WRITE =>
|
||||
start_w <= '1';
|
||||
opcode_w <= WRITE;
|
||||
|
||||
if (ack_w = '1') then
|
||||
stage_next <= WRITE_PAYLOAD_HEADER;
|
||||
end if;
|
||||
when WRITE_PAYLOAD_HEADER =>
|
||||
valid_out_w <= '1';
|
||||
if (LITTLE_ENDIAN = '0') then
|
||||
data_out_w <= CDR_BE & x"0000";
|
||||
else
|
||||
data_out_w <= CDR_LE & x"0000";
|
||||
end if;
|
||||
-- Output Guard
|
||||
if (ready_out_w = '1') then
|
||||
stage_next <= ENCODE_PAYLOAD;
|
||||
-- Reset
|
||||
align_offset_next <= (others => '0');
|
||||
data_out_latch_next <= (others => '0');
|
||||
encode_stage_next <= WRITE_RID_WGUID;
|
||||
cnt_next <= 0;
|
||||
end if;
|
||||
when PUSH =>
|
||||
-- Mark Last Word
|
||||
if (finalize_payload = '1') then
|
||||
last_word_out_w <= '1';
|
||||
end if;
|
||||
|
||||
valid_out_w <= '1';
|
||||
data_out_w <= data_out_latch;
|
||||
-- Output Guard
|
||||
if (ready_out_w = '1') then
|
||||
-- NOTE: Ensures all padding is zero.
|
||||
data_out_latch_next <= (others => '0');
|
||||
-- Alignment Operation in process
|
||||
if (align_op = '1') then
|
||||
stage_next <= ALIGN_OUT_STREAM;
|
||||
-- Reset
|
||||
align_op_next <= '0';
|
||||
-- DONE
|
||||
elsif (finalize_payload = '1') then
|
||||
finalize_payload_next <= '0';
|
||||
stage_next <= WAIT_FOR_WRITER;
|
||||
else
|
||||
stage_next <= ENCODE_PAYLOAD;
|
||||
end if;
|
||||
end if;
|
||||
when ALIGN_OUT_STREAM =>
|
||||
-- Target Stream Alignment reached
|
||||
if (check_align(align_offset, target_align)) then
|
||||
-- DONE
|
||||
stage_next <= ENCODE_PAYLOAD;
|
||||
else
|
||||
align_offset_next <= align_offset + 1;
|
||||
-- Need to push Word
|
||||
if (align_offset(1 downto 0) = "11") then
|
||||
align_op_next <= '1';
|
||||
stage_next <= PUSH;
|
||||
end if;
|
||||
end if;
|
||||
when ENCODE_PAYLOAD =>
|
||||
case (encode_stage) is
|
||||
when WRITE_RID_WGUID =>
|
||||
-- ALIGN GUARD
|
||||
if (not check_align(align_offset, ALIGN_8)) then
|
||||
target_align_next <= ALIGN_8;
|
||||
stage_next <= ALIGN_OUT_STREAM;
|
||||
else
|
||||
case (cnt) is
|
||||
when 0 =>
|
||||
data_out_latch_next <= get_sub_vector(endian_swap(LITTLE_ENDIAN, get_sub_vector(std_logic_vector(to_unsigned(request_id_user.writer_guid)), 0, 64, TRUE)), 0, WORD_WIDTH, TRUE);
|
||||
stage_next <= PUSH;
|
||||
cnt_next <= cnt + 1;
|
||||
when 1 =>
|
||||
data_out_latch_next <= get_sub_vector(endian_swap(LITTLE_ENDIAN, get_sub_vector(std_logic_vector(to_unsigned(request_id_user.writer_guid)), 0, 64, TRUE)), 1, WORD_WIDTH, TRUE);
|
||||
stage_next <= PUSH;
|
||||
align_offset_next <= align_offset + 8;
|
||||
encode_stage_next <= WRITE_RID_SN;
|
||||
cnt_next <= 0;
|
||||
when others =>
|
||||
end case;
|
||||
end if;
|
||||
when WRITE_RID_SN =>
|
||||
-- ALIGN GUARD
|
||||
if (not check_align(align_offset, ALIGN_8)) then
|
||||
target_align_next <= ALIGN_8;
|
||||
stage_next <= ALIGN_OUT_STREAM;
|
||||
else
|
||||
case (cnt) is
|
||||
when 0 =>
|
||||
data_out_latch_next <= get_sub_vector(endian_swap(LITTLE_ENDIAN, std_logic_vector(to_unsigned(request_id_user.sequence_number))), 0, WORD_WIDTH, TRUE);
|
||||
stage_next <= PUSH;
|
||||
cnt_next <= cnt + 1;
|
||||
when 1 =>
|
||||
data_out_latch_next <= get_sub_vector(endian_swap(LITTLE_ENDIAN, std_logic_vector(to_unsigned(request_id_user.sequence_number))), 1, WORD_WIDTH, TRUE);
|
||||
stage_next <= PUSH;
|
||||
align_offset_next <= align_offset + 8;
|
||||
-- ###GENERATED START###
|
||||
encode_stage_next <= WRITE_SUM;
|
||||
cnt_next <= 0;
|
||||
-- ###GENERATED END###
|
||||
when others =>
|
||||
end case;
|
||||
end if;
|
||||
-- ###GENERATED START###
|
||||
when WRITE_SUM =>
|
||||
-- ALIGN GUARD
|
||||
if (not check_align(align_offset, ALIGN_8)) then
|
||||
target_align_next <= ALIGN_8;
|
||||
stage_next <= ALIGN_OUT_STREAM;
|
||||
else
|
||||
case (cnt) is
|
||||
when 0 =>
|
||||
data_out_latch_next <= get_sub_vector(endian_swap(LITTLE_ENDIAN, sum), 0, WORD_WIDTH, TRUE);
|
||||
stage_next <= PUSH;
|
||||
cnt_next <= cnt + 1;
|
||||
when 1 =>
|
||||
data_out_latch_next <= get_sub_vector(endian_swap(LITTLE_ENDIAN, sum), 1, WORD_WIDTH, TRUE);
|
||||
stage_next <= PUSH;
|
||||
align_offset_next <= align_offset + 8;
|
||||
|
||||
-- DONE
|
||||
finalize_payload_next <= '1';
|
||||
when others =>
|
||||
end case;
|
||||
end if;
|
||||
-- ###GENERATED END###
|
||||
when others =>
|
||||
null;
|
||||
end case;
|
||||
when WAIT_FOR_WRITER =>
|
||||
if (done_w = '1') then
|
||||
case (return_code_w) is
|
||||
when RETCODE_OK =>
|
||||
return_code_latch_next <= ROS_RET_OK;
|
||||
stage_next <= RETURN_ROS;
|
||||
when others =>
|
||||
return_code_latch_next <= ROS_RET_ERROR;
|
||||
stage_next <= RETURN_ROS;
|
||||
end case;
|
||||
end if;
|
||||
when others =>
|
||||
null;
|
||||
end case;
|
||||
|
||||
-- OVERREAD GUARD
|
||||
-- Attempted read on empty input
|
||||
if (last_word_in_latch = '1' and last_word_in_r = '0' and ready_in_r_sig = '1') then
|
||||
stage_next <= SKIP_PAYLOAD;
|
||||
decode_error_latch_next <= '1';
|
||||
end if;
|
||||
|
||||
end process;
|
||||
|
||||
sync_prc : process(clk)
|
||||
begin
|
||||
if rising_edge(clk) then
|
||||
if (reset = '1') then
|
||||
stage <= IDLE;
|
||||
encode_stage <= WRITE_RID_WGUID;
|
||||
decode_stage <= GET_RID_WGUID;
|
||||
return_stage <= GET_RID_WGUID;
|
||||
target_align <= ALIGN_1;
|
||||
cnt <= 0;
|
||||
endian_flag <= '0';
|
||||
last_word_in_latch <= '0';
|
||||
decode_error_latch <= '0';
|
||||
optional <= '0';
|
||||
taken_sig <= '0';
|
||||
align_op <= '0';
|
||||
finalize_payload <= '0';
|
||||
data_available_sig <= '0';
|
||||
align_offset <= (others => '0');
|
||||
data_in_latch <= (others => '0');
|
||||
data_out_latch <= (others => '0');
|
||||
dw_latch <= (others => '0');
|
||||
return_code_latch <= ROS_RET_OK;
|
||||
service_info_sig <= EMPTY_SERVICE_INFO;
|
||||
-- ###GENERATED START###
|
||||
a_latch <= (others => '0');
|
||||
b_latch <= (others => '0');
|
||||
-- ###GENERATED END###
|
||||
else
|
||||
stage <= stage_next;
|
||||
encode_stage <= encode_stage_next;
|
||||
decode_stage <= decode_stage_next;
|
||||
return_stage <= return_stage_next;
|
||||
target_align <= target_align_next;
|
||||
cnt <= cnt_next;
|
||||
endian_flag <= endian_flag_next;
|
||||
last_word_in_latch <= last_word_in_latch_next;
|
||||
decode_error_latch <= decode_error_latch_next;
|
||||
optional <= optional_next;
|
||||
taken_sig <= taken_sig_next;
|
||||
align_op <= align_op_next;
|
||||
finalize_payload <= finalize_payload_next;
|
||||
data_available_sig <= data_available_sig_next;
|
||||
align_offset <= align_offset_next;
|
||||
data_in_latch <= data_in_latch_next;
|
||||
data_out_latch <= data_out_latch_next;
|
||||
dw_latch <= dw_latch_next;
|
||||
return_code_latch <= return_code_latch_next;
|
||||
service_info_sig <= service_info_sig_next;
|
||||
-- ###GENERATED START###
|
||||
a_latch <= a_latch_next;
|
||||
b_latch <= b_latch_next;
|
||||
-- ###GENERATED END###
|
||||
end if;
|
||||
end if;
|
||||
end process;
|
||||
|
||||
end architecture;
|
||||
17
src/ros2/example_interfaces/Bool.idl
Normal file
17
src/ros2/example_interfaces/Bool.idl
Normal file
@ -0,0 +1,17 @@
|
||||
// generated from rosidl_adapter/resource/msg.idl.em
|
||||
// with input from example_interfaces/msg/Bool.msg
|
||||
// generated code does not contain a copyright notice
|
||||
|
||||
|
||||
module example_interfaces {
|
||||
module msg {
|
||||
@verbatim (language="comment", text=
|
||||
" This is an example message of using a primitive datatype, bool." "\n"
|
||||
" If you want to test with this that's fine, but if you are deploying" "\n"
|
||||
" it into a system you should create a semantically meaningful message type." "\n"
|
||||
" If you want to embed it in another message, use the primitive data type instead.")
|
||||
struct Bool {
|
||||
boolean data;
|
||||
};
|
||||
};
|
||||
};
|
||||
5
src/ros2/example_interfaces/Bool.msg
Normal file
5
src/ros2/example_interfaces/Bool.msg
Normal file
@ -0,0 +1,5 @@
|
||||
# This is an example message of using a primitive datatype, bool.
|
||||
# If you want to test with this that's fine, but if you are deploying
|
||||
# it into a system you should create a semantically meaningful message type.
|
||||
# If you want to embed it in another message, use the primitive data type instead.
|
||||
bool data
|
||||
17
src/ros2/example_interfaces/Byte.idl
Normal file
17
src/ros2/example_interfaces/Byte.idl
Normal file
@ -0,0 +1,17 @@
|
||||
// generated from rosidl_adapter/resource/msg.idl.em
|
||||
// with input from example_interfaces/msg/Byte.msg
|
||||
// generated code does not contain a copyright notice
|
||||
|
||||
|
||||
module example_interfaces {
|
||||
module msg {
|
||||
@verbatim (language="comment", text=
|
||||
" This is an example message of using a primitive datatype, byte." "\n"
|
||||
" If you want to test with this that's fine, but if you are deploying" "\n"
|
||||
" it into a system you should create a semantically meaningful message type." "\n"
|
||||
" If you want to embed it in another message, use the primitive data type instead.")
|
||||
struct Byte {
|
||||
octet data;
|
||||
};
|
||||
};
|
||||
};
|
||||
5
src/ros2/example_interfaces/Byte.msg
Normal file
5
src/ros2/example_interfaces/Byte.msg
Normal file
@ -0,0 +1,5 @@
|
||||
# This is an example message of using a primitive datatype, byte.
|
||||
# If you want to test with this that's fine, but if you are deploying
|
||||
# it into a system you should create a semantically meaningful message type.
|
||||
# If you want to embed it in another message, use the primitive data type instead.
|
||||
byte data
|
||||
25
src/ros2/example_interfaces/ByteMultiArray.idl
Normal file
25
src/ros2/example_interfaces/ByteMultiArray.idl
Normal file
@ -0,0 +1,25 @@
|
||||
// generated from rosidl_adapter/resource/msg.idl.em
|
||||
// with input from example_interfaces/msg/ByteMultiArray.msg
|
||||
// generated code does not contain a copyright notice
|
||||
|
||||
#include "example_interfaces/msg/MultiArrayLayout.idl"
|
||||
|
||||
module example_interfaces {
|
||||
module msg {
|
||||
@verbatim (language="comment", text=
|
||||
" This is an example of using complex datatypes." "\n"
|
||||
" It is not recommended to use directly." "\n"
|
||||
" To use a similar datastruct please define a custom message with appropriate semantic meaning.")
|
||||
struct ByteMultiArray {
|
||||
@verbatim (language="comment", text=
|
||||
" Please look at the MultiArrayLayout message definition for" "\n"
|
||||
" documentation on all multiarrays." "\n"
|
||||
" specification of data layout")
|
||||
example_interfaces::msg::MultiArrayLayout layout;
|
||||
|
||||
@verbatim (language="comment", text=
|
||||
" array of data")
|
||||
sequence<octet> data;
|
||||
};
|
||||
};
|
||||
};
|
||||
9
src/ros2/example_interfaces/ByteMultiArray.msg
Normal file
9
src/ros2/example_interfaces/ByteMultiArray.msg
Normal file
@ -0,0 +1,9 @@
|
||||
# This is an example of using complex datatypes.
|
||||
# It is not recommended to use directly.
|
||||
# To use a similar datastruct please define a custom message with appropriate semantic meaning.
|
||||
|
||||
# Please look at the MultiArrayLayout message definition for
|
||||
# documentation on all multiarrays.
|
||||
|
||||
MultiArrayLayout layout # specification of data layout
|
||||
byte[] data # array of data
|
||||
17
src/ros2/example_interfaces/Char.idl
Normal file
17
src/ros2/example_interfaces/Char.idl
Normal file
@ -0,0 +1,17 @@
|
||||
// generated from rosidl_adapter/resource/msg.idl.em
|
||||
// with input from example_interfaces/msg/Char.msg
|
||||
// generated code does not contain a copyright notice
|
||||
|
||||
|
||||
module example_interfaces {
|
||||
module msg {
|
||||
@verbatim (language="comment", text=
|
||||
" This is an example message of using a primitive datatype, char." "\n"
|
||||
" If you want to test with this that's fine, but if you are deploying" "\n"
|
||||
" it into a system you should create a semantically meaningful message type." "\n"
|
||||
" If you want to embed it in another message, use the primitive data type instead.")
|
||||
struct Char {
|
||||
uint8 data;
|
||||
};
|
||||
};
|
||||
};
|
||||
5
src/ros2/example_interfaces/Char.msg
Normal file
5
src/ros2/example_interfaces/Char.msg
Normal file
@ -0,0 +1,5 @@
|
||||
# This is an example message of using a primitive datatype, char.
|
||||
# If you want to test with this that's fine, but if you are deploying
|
||||
# it into a system you should create a semantically meaningful message type.
|
||||
# If you want to embed it in another message, use the primitive data type instead.
|
||||
char data
|
||||
15
src/ros2/example_interfaces/Empty.idl
Normal file
15
src/ros2/example_interfaces/Empty.idl
Normal file
@ -0,0 +1,15 @@
|
||||
// generated from rosidl_adapter/resource/msg.idl.em
|
||||
// with input from example_interfaces/msg/Empty.msg
|
||||
// generated code does not contain a copyright notice
|
||||
|
||||
|
||||
module example_interfaces {
|
||||
module msg {
|
||||
@verbatim (language="comment", text=
|
||||
" If you want to test with this that's fine, but if you are deploying" "\n"
|
||||
" it into a system you should create a semantically meaningful message type.")
|
||||
struct Empty {
|
||||
uint8 structure_needs_at_least_one_member;
|
||||
};
|
||||
};
|
||||
};
|
||||
2
src/ros2/example_interfaces/Empty.msg
Normal file
2
src/ros2/example_interfaces/Empty.msg
Normal file
@ -0,0 +1,2 @@
|
||||
# If you want to test with this that's fine, but if you are deploying
|
||||
# it into a system you should create a semantically meaningful message type.
|
||||
8
src/ros2/example_interfaces/Fibonacci.action
Normal file
8
src/ros2/example_interfaces/Fibonacci.action
Normal file
@ -0,0 +1,8 @@
|
||||
# Goal
|
||||
int32 order
|
||||
---
|
||||
# Result
|
||||
int32[] sequence
|
||||
---
|
||||
# Feedback
|
||||
int32[] sequence
|
||||
17
src/ros2/example_interfaces/Float32.idl
Normal file
17
src/ros2/example_interfaces/Float32.idl
Normal file
@ -0,0 +1,17 @@
|
||||
// generated from rosidl_adapter/resource/msg.idl.em
|
||||
// with input from example_interfaces/msg/Float32.msg
|
||||
// generated code does not contain a copyright notice
|
||||
|
||||
|
||||
module example_interfaces {
|
||||
module msg {
|
||||
@verbatim (language="comment", text=
|
||||
" This is an example message of using a primitive datatype, float32." "\n"
|
||||
" If you want to test with this that's fine, but if you are deploying" "\n"
|
||||
" it into a system you should create a semantically meaningful message type." "\n"
|
||||
" If you want to embed it in another message, use the primitive data type instead.")
|
||||
struct Float32 {
|
||||
float data;
|
||||
};
|
||||
};
|
||||
};
|
||||
5
src/ros2/example_interfaces/Float32.msg
Normal file
5
src/ros2/example_interfaces/Float32.msg
Normal file
@ -0,0 +1,5 @@
|
||||
# This is an example message of using a primitive datatype, float32.
|
||||
# If you want to test with this that's fine, but if you are deploying
|
||||
# it into a system you should create a semantically meaningful message type.
|
||||
# If you want to embed it in another message, use the primitive data type instead.
|
||||
float32 data
|
||||
25
src/ros2/example_interfaces/Float32MultiArray.idl
Normal file
25
src/ros2/example_interfaces/Float32MultiArray.idl
Normal file
@ -0,0 +1,25 @@
|
||||
// generated from rosidl_adapter/resource/msg.idl.em
|
||||
// with input from example_interfaces/msg/Float32MultiArray.msg
|
||||
// generated code does not contain a copyright notice
|
||||
|
||||
#include "example_interfaces/msg/MultiArrayLayout.idl"
|
||||
|
||||
module example_interfaces {
|
||||
module msg {
|
||||
@verbatim (language="comment", text=
|
||||
" This is an example of using complex datatypes." "\n"
|
||||
" It is not recommended to use directly." "\n"
|
||||
" To use a similar datastruct please define a custom message with appropriate semantic meaning.")
|
||||
struct Float32MultiArray {
|
||||
@verbatim (language="comment", text=
|
||||
" Please look at the MultiArrayLayout message definition for" "\n"
|
||||
" documentation on all multiarrays." "\n"
|
||||
" specification of data layout")
|
||||
example_interfaces::msg::MultiArrayLayout layout;
|
||||
|
||||
@verbatim (language="comment", text=
|
||||
" array of data")
|
||||
sequence<float> data;
|
||||
};
|
||||
};
|
||||
};
|
||||
9
src/ros2/example_interfaces/Float32MultiArray.msg
Normal file
9
src/ros2/example_interfaces/Float32MultiArray.msg
Normal file
@ -0,0 +1,9 @@
|
||||
# This is an example of using complex datatypes.
|
||||
# It is not recommended to use directly.
|
||||
# To use a similar datastruct please define a custom message with appropriate semantic meaning.
|
||||
|
||||
# Please look at the MultiArrayLayout message definition for
|
||||
# documentation on all multiarrays.
|
||||
|
||||
MultiArrayLayout layout # specification of data layout
|
||||
float32[] data # array of data
|
||||
17
src/ros2/example_interfaces/Float64.idl
Normal file
17
src/ros2/example_interfaces/Float64.idl
Normal file
@ -0,0 +1,17 @@
|
||||
// generated from rosidl_adapter/resource/msg.idl.em
|
||||
// with input from example_interfaces/msg/Float64.msg
|
||||
// generated code does not contain a copyright notice
|
||||
|
||||
|
||||
module example_interfaces {
|
||||
module msg {
|
||||
@verbatim (language="comment", text=
|
||||
" This is an example message of using a primitive datatype, float64." "\n"
|
||||
" If you want to test with this that's fine, but if you are deploying" "\n"
|
||||
" it into a system you should create a semantically meaningful message type." "\n"
|
||||
" If you want to embed it in another message, use the primitive data type instead.")
|
||||
struct Float64 {
|
||||
double data;
|
||||
};
|
||||
};
|
||||
};
|
||||
5
src/ros2/example_interfaces/Float64.msg
Normal file
5
src/ros2/example_interfaces/Float64.msg
Normal file
@ -0,0 +1,5 @@
|
||||
# This is an example message of using a primitive datatype, float64.
|
||||
# If you want to test with this that's fine, but if you are deploying
|
||||
# it into a system you should create a semantically meaningful message type.
|
||||
# If you want to embed it in another message, use the primitive data type instead.
|
||||
float64 data
|
||||
25
src/ros2/example_interfaces/Float64MultiArray.idl
Normal file
25
src/ros2/example_interfaces/Float64MultiArray.idl
Normal file
@ -0,0 +1,25 @@
|
||||
// generated from rosidl_adapter/resource/msg.idl.em
|
||||
// with input from example_interfaces/msg/Float64MultiArray.msg
|
||||
// generated code does not contain a copyright notice
|
||||
|
||||
#include "example_interfaces/msg/MultiArrayLayout.idl"
|
||||
|
||||
module example_interfaces {
|
||||
module msg {
|
||||
@verbatim (language="comment", text=
|
||||
" This is an example of using complex datatypes." "\n"
|
||||
" It is not recommended to use directly." "\n"
|
||||
" To use a similar datastruct please define a custom message with appropriate semantic meaning.")
|
||||
struct Float64MultiArray {
|
||||
@verbatim (language="comment", text=
|
||||
" Please look at the MultiArrayLayout message definition for" "\n"
|
||||
" documentation on all multiarrays." "\n"
|
||||
" specification of data layout")
|
||||
example_interfaces::msg::MultiArrayLayout layout;
|
||||
|
||||
@verbatim (language="comment", text=
|
||||
" array of data")
|
||||
sequence<double> data;
|
||||
};
|
||||
};
|
||||
};
|
||||
9
src/ros2/example_interfaces/Float64MultiArray.msg
Normal file
9
src/ros2/example_interfaces/Float64MultiArray.msg
Normal file
@ -0,0 +1,9 @@
|
||||
# This is an example of using complex datatypes.
|
||||
# It is not recommended to use directly.
|
||||
# To use a similar datastruct please define a custom message with appropriate semantic meaning.
|
||||
|
||||
# Please look at the MultiArrayLayout message definition for
|
||||
# documentation on all multiarrays.
|
||||
|
||||
MultiArrayLayout layout # specification of data layout
|
||||
float64[] data # array of data
|
||||
17
src/ros2/example_interfaces/Int16.idl
Normal file
17
src/ros2/example_interfaces/Int16.idl
Normal file
@ -0,0 +1,17 @@
|
||||
// generated from rosidl_adapter/resource/msg.idl.em
|
||||
// with input from example_interfaces/msg/Int16.msg
|
||||
// generated code does not contain a copyright notice
|
||||
|
||||
|
||||
module example_interfaces {
|
||||
module msg {
|
||||
@verbatim (language="comment", text=
|
||||
" This is an example message of using a primitive datatype, int16." "\n"
|
||||
" If you want to test with this that's fine, but if you are deploying" "\n"
|
||||
" it into a system you should create a semantically meaningful message type." "\n"
|
||||
" If you want to embed it in another message, use the primitive data type instead.")
|
||||
struct Int16 {
|
||||
int16 data;
|
||||
};
|
||||
};
|
||||
};
|
||||
5
src/ros2/example_interfaces/Int16.msg
Normal file
5
src/ros2/example_interfaces/Int16.msg
Normal file
@ -0,0 +1,5 @@
|
||||
# This is an example message of using a primitive datatype, int16.
|
||||
# If you want to test with this that's fine, but if you are deploying
|
||||
# it into a system you should create a semantically meaningful message type.
|
||||
# If you want to embed it in another message, use the primitive data type instead.
|
||||
int16 data
|
||||
25
src/ros2/example_interfaces/Int16MultiArray.idl
Normal file
25
src/ros2/example_interfaces/Int16MultiArray.idl
Normal file
@ -0,0 +1,25 @@
|
||||
// generated from rosidl_adapter/resource/msg.idl.em
|
||||
// with input from example_interfaces/msg/Int16MultiArray.msg
|
||||
// generated code does not contain a copyright notice
|
||||
|
||||
#include "example_interfaces/msg/MultiArrayLayout.idl"
|
||||
|
||||
module example_interfaces {
|
||||
module msg {
|
||||
@verbatim (language="comment", text=
|
||||
" This is an example of using complex datatypes." "\n"
|
||||
" It is not recommended to use directly." "\n"
|
||||
" To use a similar datastruct please define a custom message with appropriate semantic meaning.")
|
||||
struct Int16MultiArray {
|
||||
@verbatim (language="comment", text=
|
||||
" Please look at the MultiArrayLayout message definition for" "\n"
|
||||
" documentation on all multiarrays." "\n"
|
||||
" specification of data layout")
|
||||
example_interfaces::msg::MultiArrayLayout layout;
|
||||
|
||||
@verbatim (language="comment", text=
|
||||
" array of data")
|
||||
sequence<int16> data;
|
||||
};
|
||||
};
|
||||
};
|
||||
9
src/ros2/example_interfaces/Int16MultiArray.msg
Normal file
9
src/ros2/example_interfaces/Int16MultiArray.msg
Normal file
@ -0,0 +1,9 @@
|
||||
# This is an example of using complex datatypes.
|
||||
# It is not recommended to use directly.
|
||||
# To use a similar datastruct please define a custom message with appropriate semantic meaning.
|
||||
|
||||
# Please look at the MultiArrayLayout message definition for
|
||||
# documentation on all multiarrays.
|
||||
|
||||
MultiArrayLayout layout # specification of data layout
|
||||
int16[] data # array of data
|
||||
17
src/ros2/example_interfaces/Int32.idl
Normal file
17
src/ros2/example_interfaces/Int32.idl
Normal file
@ -0,0 +1,17 @@
|
||||
// generated from rosidl_adapter/resource/msg.idl.em
|
||||
// with input from example_interfaces/msg/Int32.msg
|
||||
// generated code does not contain a copyright notice
|
||||
|
||||
|
||||
module example_interfaces {
|
||||
module msg {
|
||||
@verbatim (language="comment", text=
|
||||
" This is an example message of using a primitive datatype, int32." "\n"
|
||||
" If you want to test with this that's fine, but if you are deploying" "\n"
|
||||
" it into a system you should create a semantically meaningful message type." "\n"
|
||||
" If you want to embed it in another message, use the primitive data type instead.")
|
||||
struct Int32 {
|
||||
int32 data;
|
||||
};
|
||||
};
|
||||
};
|
||||
5
src/ros2/example_interfaces/Int32.msg
Normal file
5
src/ros2/example_interfaces/Int32.msg
Normal file
@ -0,0 +1,5 @@
|
||||
# This is an example message of using a primitive datatype, int32.
|
||||
# If you want to test with this that's fine, but if you are deploying
|
||||
# it into a system you should create a semantically meaningful message type.
|
||||
# If you want to embed it in another message, use the primitive data type instead.
|
||||
int32 data
|
||||
25
src/ros2/example_interfaces/Int32MultiArray.idl
Normal file
25
src/ros2/example_interfaces/Int32MultiArray.idl
Normal file
@ -0,0 +1,25 @@
|
||||
// generated from rosidl_adapter/resource/msg.idl.em
|
||||
// with input from example_interfaces/msg/Int32MultiArray.msg
|
||||
// generated code does not contain a copyright notice
|
||||
|
||||
#include "example_interfaces/msg/MultiArrayLayout.idl"
|
||||
|
||||
module example_interfaces {
|
||||
module msg {
|
||||
@verbatim (language="comment", text=
|
||||
" This is an example of using complex datatypes." "\n"
|
||||
" It is not recommended to use directly." "\n"
|
||||
" To use a similar datastruct please define a custom message with appropriate semantic meaning.")
|
||||
struct Int32MultiArray {
|
||||
@verbatim (language="comment", text=
|
||||
" Please look at the MultiArrayLayout message definition for" "\n"
|
||||
" documentation on all multiarrays." "\n"
|
||||
" specification of data layout")
|
||||
example_interfaces::msg::MultiArrayLayout layout;
|
||||
|
||||
@verbatim (language="comment", text=
|
||||
" array of data")
|
||||
sequence<int32> data;
|
||||
};
|
||||
};
|
||||
};
|
||||
9
src/ros2/example_interfaces/Int32MultiArray.msg
Normal file
9
src/ros2/example_interfaces/Int32MultiArray.msg
Normal file
@ -0,0 +1,9 @@
|
||||
# This is an example of using complex datatypes.
|
||||
# It is not recommended to use directly.
|
||||
# To use a similar datastruct please define a custom message with appropriate semantic meaning.
|
||||
|
||||
# Please look at the MultiArrayLayout message definition for
|
||||
# documentation on all multiarrays.
|
||||
|
||||
MultiArrayLayout layout # specification of data layout
|
||||
int32[] data # array of data
|
||||
17
src/ros2/example_interfaces/Int64.idl
Normal file
17
src/ros2/example_interfaces/Int64.idl
Normal file
@ -0,0 +1,17 @@
|
||||
// generated from rosidl_adapter/resource/msg.idl.em
|
||||
// with input from example_interfaces/msg/Int64.msg
|
||||
// generated code does not contain a copyright notice
|
||||
|
||||
|
||||
module example_interfaces {
|
||||
module msg {
|
||||
@verbatim (language="comment", text=
|
||||
" This is an example message of using a primitive datatype, int64." "\n"
|
||||
" If you want to test with this that's fine, but if you are deploying" "\n"
|
||||
" it into a system you should create a semantically meaningful message type." "\n"
|
||||
" If you want to embed it in another message, use the primitive data type instead.")
|
||||
struct Int64 {
|
||||
int64 data;
|
||||
};
|
||||
};
|
||||
};
|
||||
5
src/ros2/example_interfaces/Int64.msg
Normal file
5
src/ros2/example_interfaces/Int64.msg
Normal file
@ -0,0 +1,5 @@
|
||||
# This is an example message of using a primitive datatype, int64.
|
||||
# If you want to test with this that's fine, but if you are deploying
|
||||
# it into a system you should create a semantically meaningful message type.
|
||||
# If you want to embed it in another message, use the primitive data type instead.
|
||||
int64 data
|
||||
25
src/ros2/example_interfaces/Int64MultiArray.idl
Normal file
25
src/ros2/example_interfaces/Int64MultiArray.idl
Normal file
@ -0,0 +1,25 @@
|
||||
// generated from rosidl_adapter/resource/msg.idl.em
|
||||
// with input from example_interfaces/msg/Int64MultiArray.msg
|
||||
// generated code does not contain a copyright notice
|
||||
|
||||
#include "example_interfaces/msg/MultiArrayLayout.idl"
|
||||
|
||||
module example_interfaces {
|
||||
module msg {
|
||||
@verbatim (language="comment", text=
|
||||
" This is an example of using complex datatypes." "\n"
|
||||
" It is not recommended to use directly." "\n"
|
||||
" To use a similar datastruct please define a custom message with appropriate semantic meaning.")
|
||||
struct Int64MultiArray {
|
||||
@verbatim (language="comment", text=
|
||||
" Please look at the MultiArrayLayout message definition for" "\n"
|
||||
" documentation on all multiarrays." "\n"
|
||||
" specification of data layout")
|
||||
example_interfaces::msg::MultiArrayLayout layout;
|
||||
|
||||
@verbatim (language="comment", text=
|
||||
" array of data")
|
||||
sequence<int64> data;
|
||||
};
|
||||
};
|
||||
};
|
||||
9
src/ros2/example_interfaces/Int64MultiArray.msg
Normal file
9
src/ros2/example_interfaces/Int64MultiArray.msg
Normal file
@ -0,0 +1,9 @@
|
||||
# This is an example of using complex datatypes.
|
||||
# It is not recommended to use directly.
|
||||
# To use a similar datastruct please define a custom message with appropriate semantic meaning.
|
||||
|
||||
# Please look at the MultiArrayLayout message definition for
|
||||
# documentation on all multiarrays.
|
||||
|
||||
MultiArrayLayout layout # specification of data layout
|
||||
int64[] data # array of data
|
||||
17
src/ros2/example_interfaces/Int8.idl
Normal file
17
src/ros2/example_interfaces/Int8.idl
Normal file
@ -0,0 +1,17 @@
|
||||
// generated from rosidl_adapter/resource/msg.idl.em
|
||||
// with input from example_interfaces/msg/Int8.msg
|
||||
// generated code does not contain a copyright notice
|
||||
|
||||
|
||||
module example_interfaces {
|
||||
module msg {
|
||||
@verbatim (language="comment", text=
|
||||
" This is an example message of using a primitive datatype, in8." "\n"
|
||||
" If you want to test with this that's fine, but if you are deploying" "\n"
|
||||
" it into a system you should create a semantically meaningful message type." "\n"
|
||||
" If you want to embed it in another message, use the primitive data type instead.")
|
||||
struct Int8 {
|
||||
int8 data;
|
||||
};
|
||||
};
|
||||
};
|
||||
5
src/ros2/example_interfaces/Int8.msg
Normal file
5
src/ros2/example_interfaces/Int8.msg
Normal file
@ -0,0 +1,5 @@
|
||||
# This is an example message of using a primitive datatype, in8.
|
||||
# If you want to test with this that's fine, but if you are deploying
|
||||
# it into a system you should create a semantically meaningful message type.
|
||||
# If you want to embed it in another message, use the primitive data type instead.
|
||||
int8 data
|
||||
25
src/ros2/example_interfaces/Int8MultiArray.idl
Normal file
25
src/ros2/example_interfaces/Int8MultiArray.idl
Normal file
@ -0,0 +1,25 @@
|
||||
// generated from rosidl_adapter/resource/msg.idl.em
|
||||
// with input from example_interfaces/msg/Int8MultiArray.msg
|
||||
// generated code does not contain a copyright notice
|
||||
|
||||
#include "example_interfaces/msg/MultiArrayLayout.idl"
|
||||
|
||||
module example_interfaces {
|
||||
module msg {
|
||||
@verbatim (language="comment", text=
|
||||
" This is an example of using complex datatypes." "\n"
|
||||
" It is not recommended to use directly." "\n"
|
||||
" To use a similar datastruct please define a custom message with appropriate semantic meaning.")
|
||||
struct Int8MultiArray {
|
||||
@verbatim (language="comment", text=
|
||||
" Please look at the MultiArrayLayout message definition for" "\n"
|
||||
" documentation on all multiarrays." "\n"
|
||||
" specification of data layout")
|
||||
example_interfaces::msg::MultiArrayLayout layout;
|
||||
|
||||
@verbatim (language="comment", text=
|
||||
" array of data")
|
||||
sequence<int8> data;
|
||||
};
|
||||
};
|
||||
};
|
||||
9
src/ros2/example_interfaces/Int8MultiArray.msg
Normal file
9
src/ros2/example_interfaces/Int8MultiArray.msg
Normal file
@ -0,0 +1,9 @@
|
||||
# This is an example of using complex datatypes.
|
||||
# It is not recommended to use directly.
|
||||
# To use a similar datastruct please define a custom message with appropriate semantic meaning.
|
||||
|
||||
# Please look at the MultiArrayLayout message definition for
|
||||
# documentation on all multiarrays.
|
||||
|
||||
MultiArrayLayout layout # specification of data layout
|
||||
int8[] data # array of data
|
||||
26
src/ros2/example_interfaces/MultiArrayDimension.idl
Normal file
26
src/ros2/example_interfaces/MultiArrayDimension.idl
Normal file
@ -0,0 +1,26 @@
|
||||
// generated from rosidl_adapter/resource/msg.idl.em
|
||||
// with input from example_interfaces/msg/MultiArrayDimension.msg
|
||||
// generated code does not contain a copyright notice
|
||||
|
||||
|
||||
module example_interfaces {
|
||||
module msg {
|
||||
@verbatim (language="comment", text=
|
||||
" This is an example of using complex datatypes." "\n"
|
||||
" It is not recommended to use directly." "\n"
|
||||
" To use a similar datastruct please define a custom message with appropriate semantic meaning.")
|
||||
struct MultiArrayDimension {
|
||||
@verbatim (language="comment", text=
|
||||
" label of given dimension")
|
||||
string label;
|
||||
|
||||
@verbatim (language="comment", text=
|
||||
" size of given dimension (in type units)")
|
||||
uint32 size;
|
||||
|
||||
@verbatim (language="comment", text=
|
||||
" stride of given dimension")
|
||||
uint32 stride;
|
||||
};
|
||||
};
|
||||
};
|
||||
7
src/ros2/example_interfaces/MultiArrayDimension.msg
Normal file
7
src/ros2/example_interfaces/MultiArrayDimension.msg
Normal file
@ -0,0 +1,7 @@
|
||||
# This is an example of using complex datatypes.
|
||||
# It is not recommended to use directly.
|
||||
# To use a similar datastruct please define a custom message with appropriate semantic meaning.
|
||||
|
||||
string label # label of given dimension
|
||||
uint32 size # size of given dimension (in type units)
|
||||
uint32 stride # stride of given dimension
|
||||
46
src/ros2/example_interfaces/MultiArrayLayout.idl
Normal file
46
src/ros2/example_interfaces/MultiArrayLayout.idl
Normal file
@ -0,0 +1,46 @@
|
||||
// generated from rosidl_adapter/resource/msg.idl.em
|
||||
// with input from example_interfaces/msg/MultiArrayLayout.msg
|
||||
// generated code does not contain a copyright notice
|
||||
|
||||
#include "example_interfaces/msg/MultiArrayDimension.idl"
|
||||
|
||||
module example_interfaces {
|
||||
module msg {
|
||||
@verbatim (language="comment", text=
|
||||
" This is an example of using complex datatypes." "\n"
|
||||
" It is not recommended to use directly." "\n"
|
||||
" To use a similar datastruct please define a custom message with appropriate semantic meaning.")
|
||||
struct MultiArrayLayout {
|
||||
@verbatim (language="comment", text=
|
||||
" The multiarray declares a generic multi-dimensional array of a" "\n"
|
||||
" particular data type. Dimensions are ordered from outer most" "\n"
|
||||
" to inner most." "\n"
|
||||
"" "\n"
|
||||
" Accessors should ALWAYS be written in terms of dimension stride" "\n"
|
||||
" and specified outer-most dimension first." "\n"
|
||||
"" "\n"
|
||||
" multiarray(i,j,k) = data[data_offset + dim_stride[1]*i + dim_stride[2]*j + k]" "\n"
|
||||
"" "\n"
|
||||
" A standard, 3-channel 640x480 image with interleaved color channels" "\n"
|
||||
" would be specified as:" "\n"
|
||||
"" "\n"
|
||||
" dim[0].label = \"height\"" "\n"
|
||||
" dim[0].size = 480" "\n"
|
||||
" dim[0].stride = 3*640*480 = 921600 (note dim[0] stride is just size of image)" "\n"
|
||||
" dim[1].label = \"width\"" "\n"
|
||||
" dim[1].size = 640" "\n"
|
||||
" dim[1].stride = 3*640 = 1920" "\n"
|
||||
" dim[2].label = \"channel\"" "\n"
|
||||
" dim[2].size = 3" "\n"
|
||||
" dim[2].stride = 3" "\n"
|
||||
"" "\n"
|
||||
" multiarray(i,j,k) refers to the ith row, jth column, and kth channel." "\n"
|
||||
" Array of dimension properties")
|
||||
sequence<example_interfaces::msg::MultiArrayDimension> dim;
|
||||
|
||||
@verbatim (language="comment", text=
|
||||
" padding bytes at front of data")
|
||||
uint32 data_offset;
|
||||
};
|
||||
};
|
||||
};
|
||||
30
src/ros2/example_interfaces/MultiArrayLayout.msg
Normal file
30
src/ros2/example_interfaces/MultiArrayLayout.msg
Normal file
@ -0,0 +1,30 @@
|
||||
# This is an example of using complex datatypes.
|
||||
# It is not recommended to use directly.
|
||||
# To use a similar datastruct please define a custom message with appropriate semantic meaning.
|
||||
|
||||
# The multiarray declares a generic multi-dimensional array of a
|
||||
# particular data type. Dimensions are ordered from outer most
|
||||
# to inner most.
|
||||
#
|
||||
# Accessors should ALWAYS be written in terms of dimension stride
|
||||
# and specified outer-most dimension first.
|
||||
#
|
||||
# multiarray(i,j,k) = data[data_offset + dim_stride[1]*i + dim_stride[2]*j + k]
|
||||
#
|
||||
# A standard, 3-channel 640x480 image with interleaved color channels
|
||||
# would be specified as:
|
||||
#
|
||||
# dim[0].label = "height"
|
||||
# dim[0].size = 480
|
||||
# dim[0].stride = 3*640*480 = 921600 (note dim[0] stride is just size of image)
|
||||
# dim[1].label = "width"
|
||||
# dim[1].size = 640
|
||||
# dim[1].stride = 3*640 = 1920
|
||||
# dim[2].label = "channel"
|
||||
# dim[2].size = 3
|
||||
# dim[2].stride = 3
|
||||
#
|
||||
# multiarray(i,j,k) refers to the ith row, jth column, and kth channel.
|
||||
|
||||
MultiArrayDimension[] dim # Array of dimension properties
|
||||
uint32 data_offset # padding bytes at front of data
|
||||
27
src/ros2/example_interfaces/SetBool.idl
Normal file
27
src/ros2/example_interfaces/SetBool.idl
Normal file
@ -0,0 +1,27 @@
|
||||
// generated from rosidl_adapter/resource/srv.idl.em
|
||||
// with input from example_interfaces/srv/SetBool.srv
|
||||
// generated code does not contain a copyright notice
|
||||
|
||||
|
||||
module example_interfaces {
|
||||
module srv {
|
||||
@verbatim (language="comment", text=
|
||||
" This is an example of a service to set a boolean value." "\n"
|
||||
" This can be used for testing but a semantically meaningful" "\n"
|
||||
" one should be created to be built upon.")
|
||||
struct SetBool_Request {
|
||||
@verbatim (language="comment", text=
|
||||
" e.g. for hardware enabling / disabling")
|
||||
boolean data;
|
||||
};
|
||||
struct SetBool_Response {
|
||||
@verbatim (language="comment", text=
|
||||
" indicate successful run of triggered service")
|
||||
boolean success;
|
||||
|
||||
@verbatim (language="comment", text=
|
||||
" informational, e.g. for error messages")
|
||||
string message;
|
||||
};
|
||||
};
|
||||
};
|
||||
8
src/ros2/example_interfaces/SetBool.srv
Normal file
8
src/ros2/example_interfaces/SetBool.srv
Normal file
@ -0,0 +1,8 @@
|
||||
# This is an example of a service to set a boolean value.
|
||||
# This can be used for testing but a semantically meaningful
|
||||
# one should be created to be built upon.
|
||||
|
||||
bool data # e.g. for hardware enabling / disabling
|
||||
---
|
||||
bool success # indicate successful run of triggered service
|
||||
string message # informational, e.g. for error messages
|
||||
17
src/ros2/example_interfaces/String.idl
Normal file
17
src/ros2/example_interfaces/String.idl
Normal file
@ -0,0 +1,17 @@
|
||||
// generated from rosidl_adapter/resource/msg.idl.em
|
||||
// with input from example_interfaces/msg/String.msg
|
||||
// generated code does not contain a copyright notice
|
||||
|
||||
|
||||
module example_interfaces {
|
||||
module msg {
|
||||
@verbatim (language="comment", text=
|
||||
" This is an example message of using a primitive datatype, string." "\n"
|
||||
" If you want to test with this that's fine, but if you are deploying" "\n"
|
||||
" it into a system you should create a semantically meaningful message type." "\n"
|
||||
" If you want to embed it in another message, use the primitive data type instead.")
|
||||
struct String {
|
||||
string data;
|
||||
};
|
||||
};
|
||||
};
|
||||
5
src/ros2/example_interfaces/String.msg
Normal file
5
src/ros2/example_interfaces/String.msg
Normal file
@ -0,0 +1,5 @@
|
||||
# This is an example message of using a primitive datatype, string.
|
||||
# If you want to test with this that's fine, but if you are deploying
|
||||
# it into a system you should create a semantically meaningful message type.
|
||||
# If you want to embed it in another message, use the primitive data type instead.
|
||||
string data
|
||||
25
src/ros2/example_interfaces/Trigger.idl
Normal file
25
src/ros2/example_interfaces/Trigger.idl
Normal file
@ -0,0 +1,25 @@
|
||||
// generated from rosidl_adapter/resource/srv.idl.em
|
||||
// with input from example_interfaces/srv/Trigger.srv
|
||||
// generated code does not contain a copyright notice
|
||||
|
||||
|
||||
module example_interfaces {
|
||||
module srv {
|
||||
@verbatim (language="comment", text=
|
||||
" An example of a trigger service." "\n"
|
||||
" This can be used for testing but a semantically meaningful" "\n"
|
||||
" one should be created to be built upon.")
|
||||
struct Trigger_Request {
|
||||
uint8 structure_needs_at_least_one_member;
|
||||
};
|
||||
struct Trigger_Response {
|
||||
@verbatim (language="comment", text=
|
||||
" indicate successful run of triggered service")
|
||||
boolean success;
|
||||
|
||||
@verbatim (language="comment", text=
|
||||
" informational, e.g. for error messages.")
|
||||
string message;
|
||||
};
|
||||
};
|
||||
};
|
||||
7
src/ros2/example_interfaces/Trigger.srv
Normal file
7
src/ros2/example_interfaces/Trigger.srv
Normal file
@ -0,0 +1,7 @@
|
||||
# An example of a trigger service.
|
||||
# This can be used for testing but a semantically meaningful
|
||||
# one should be created to be built upon.
|
||||
|
||||
---
|
||||
bool success # indicate successful run of triggered service
|
||||
string message # informational, e.g. for error messages.
|
||||
17
src/ros2/example_interfaces/UInt16.idl
Normal file
17
src/ros2/example_interfaces/UInt16.idl
Normal file
@ -0,0 +1,17 @@
|
||||
// generated from rosidl_adapter/resource/msg.idl.em
|
||||
// with input from example_interfaces/msg/UInt16.msg
|
||||
// generated code does not contain a copyright notice
|
||||
|
||||
|
||||
module example_interfaces {
|
||||
module msg {
|
||||
@verbatim (language="comment", text=
|
||||
" This is an example message of using a primitive datatype, uint16." "\n"
|
||||
" If you want to test with this that's fine, but if you are deploying" "\n"
|
||||
" it into a system you should create a semantically meaningful message type." "\n"
|
||||
" If you want to embed it in another message, use the primitive data type instead.")
|
||||
struct UInt16 {
|
||||
uint16 data;
|
||||
};
|
||||
};
|
||||
};
|
||||
5
src/ros2/example_interfaces/UInt16.msg
Normal file
5
src/ros2/example_interfaces/UInt16.msg
Normal file
@ -0,0 +1,5 @@
|
||||
# This is an example message of using a primitive datatype, uint16.
|
||||
# If you want to test with this that's fine, but if you are deploying
|
||||
# it into a system you should create a semantically meaningful message type.
|
||||
# If you want to embed it in another message, use the primitive data type instead.
|
||||
uint16 data
|
||||
25
src/ros2/example_interfaces/UInt16MultiArray.idl
Normal file
25
src/ros2/example_interfaces/UInt16MultiArray.idl
Normal file
@ -0,0 +1,25 @@
|
||||
// generated from rosidl_adapter/resource/msg.idl.em
|
||||
// with input from example_interfaces/msg/UInt16MultiArray.msg
|
||||
// generated code does not contain a copyright notice
|
||||
|
||||
#include "example_interfaces/msg/MultiArrayLayout.idl"
|
||||
|
||||
module example_interfaces {
|
||||
module msg {
|
||||
@verbatim (language="comment", text=
|
||||
" This is an example of using complex datatypes." "\n"
|
||||
" It is not recommended to use directly." "\n"
|
||||
" To use a similar datastruct please define a custom message with appropriate semantic meaning.")
|
||||
struct UInt16MultiArray {
|
||||
@verbatim (language="comment", text=
|
||||
" Please look at the MultiArrayLayout message definition for" "\n"
|
||||
" documentation on all multiarrays." "\n"
|
||||
" specification of data layout")
|
||||
example_interfaces::msg::MultiArrayLayout layout;
|
||||
|
||||
@verbatim (language="comment", text=
|
||||
" array of data")
|
||||
sequence<uint16> data;
|
||||
};
|
||||
};
|
||||
};
|
||||
9
src/ros2/example_interfaces/UInt16MultiArray.msg
Normal file
9
src/ros2/example_interfaces/UInt16MultiArray.msg
Normal file
@ -0,0 +1,9 @@
|
||||
# This is an example of using complex datatypes.
|
||||
# It is not recommended to use directly.
|
||||
# To use a similar datastruct please define a custom message with appropriate semantic meaning.
|
||||
|
||||
# Please look at the MultiArrayLayout message definition for
|
||||
# documentation on all multiarrays.
|
||||
|
||||
MultiArrayLayout layout # specification of data layout
|
||||
uint16[] data # array of data
|
||||
17
src/ros2/example_interfaces/UInt32.idl
Normal file
17
src/ros2/example_interfaces/UInt32.idl
Normal file
@ -0,0 +1,17 @@
|
||||
// generated from rosidl_adapter/resource/msg.idl.em
|
||||
// with input from example_interfaces/msg/UInt32.msg
|
||||
// generated code does not contain a copyright notice
|
||||
|
||||
|
||||
module example_interfaces {
|
||||
module msg {
|
||||
@verbatim (language="comment", text=
|
||||
" This is an example message of using a primitive datatype, uint32." "\n"
|
||||
" If you want to test with this that's fine, but if you are deploying" "\n"
|
||||
" it into a system you should create a semantically meaningful message type." "\n"
|
||||
" If you want to embed it in another message, use the primitive data type instead.")
|
||||
struct UInt32 {
|
||||
uint32 data;
|
||||
};
|
||||
};
|
||||
};
|
||||
5
src/ros2/example_interfaces/UInt32.msg
Normal file
5
src/ros2/example_interfaces/UInt32.msg
Normal file
@ -0,0 +1,5 @@
|
||||
# This is an example message of using a primitive datatype, uint32.
|
||||
# If you want to test with this that's fine, but if you are deploying
|
||||
# it into a system you should create a semantically meaningful message type.
|
||||
# If you want to embed it in another message, use the primitive data type instead.
|
||||
uint32 data
|
||||
25
src/ros2/example_interfaces/UInt32MultiArray.idl
Normal file
25
src/ros2/example_interfaces/UInt32MultiArray.idl
Normal file
@ -0,0 +1,25 @@
|
||||
// generated from rosidl_adapter/resource/msg.idl.em
|
||||
// with input from example_interfaces/msg/UInt32MultiArray.msg
|
||||
// generated code does not contain a copyright notice
|
||||
|
||||
#include "example_interfaces/msg/MultiArrayLayout.idl"
|
||||
|
||||
module example_interfaces {
|
||||
module msg {
|
||||
@verbatim (language="comment", text=
|
||||
" This is an example of using complex datatypes." "\n"
|
||||
" It is not recommended to use directly." "\n"
|
||||
" To use a similar datastruct please define a custom message with appropriate semantic meaning.")
|
||||
struct UInt32MultiArray {
|
||||
@verbatim (language="comment", text=
|
||||
" Please look at the MultiArrayLayout message definition for" "\n"
|
||||
" documentation on all multiarrays." "\n"
|
||||
" specification of data layout")
|
||||
example_interfaces::msg::MultiArrayLayout layout;
|
||||
|
||||
@verbatim (language="comment", text=
|
||||
" array of data")
|
||||
sequence<uint32> data;
|
||||
};
|
||||
};
|
||||
};
|
||||
9
src/ros2/example_interfaces/UInt32MultiArray.msg
Normal file
9
src/ros2/example_interfaces/UInt32MultiArray.msg
Normal file
@ -0,0 +1,9 @@
|
||||
# This is an example of using complex datatypes.
|
||||
# It is not recommended to use directly.
|
||||
# To use a similar datastruct please define a custom message with appropriate semantic meaning.
|
||||
|
||||
# Please look at the MultiArrayLayout message definition for
|
||||
# documentation on all multiarrays.
|
||||
|
||||
MultiArrayLayout layout # specification of data layout
|
||||
uint32[] data # array of data
|
||||
17
src/ros2/example_interfaces/UInt64.idl
Normal file
17
src/ros2/example_interfaces/UInt64.idl
Normal file
@ -0,0 +1,17 @@
|
||||
// generated from rosidl_adapter/resource/msg.idl.em
|
||||
// with input from example_interfaces/msg/UInt64.msg
|
||||
// generated code does not contain a copyright notice
|
||||
|
||||
|
||||
module example_interfaces {
|
||||
module msg {
|
||||
@verbatim (language="comment", text=
|
||||
" This is an example message of using a primitive datatype, unint64." "\n"
|
||||
" If you want to test with this that's fine, but if you are deploying" "\n"
|
||||
" it into a system you should create a semantically meaningful message type." "\n"
|
||||
" If you want to embed it in another message, use the primitive data type instead.")
|
||||
struct UInt64 {
|
||||
uint64 data;
|
||||
};
|
||||
};
|
||||
};
|
||||
5
src/ros2/example_interfaces/UInt64.msg
Normal file
5
src/ros2/example_interfaces/UInt64.msg
Normal file
@ -0,0 +1,5 @@
|
||||
# This is an example message of using a primitive datatype, unint64.
|
||||
# If you want to test with this that's fine, but if you are deploying
|
||||
# it into a system you should create a semantically meaningful message type.
|
||||
# If you want to embed it in another message, use the primitive data type instead.
|
||||
uint64 data
|
||||
25
src/ros2/example_interfaces/UInt64MultiArray.idl
Normal file
25
src/ros2/example_interfaces/UInt64MultiArray.idl
Normal file
@ -0,0 +1,25 @@
|
||||
// generated from rosidl_adapter/resource/msg.idl.em
|
||||
// with input from example_interfaces/msg/UInt64MultiArray.msg
|
||||
// generated code does not contain a copyright notice
|
||||
|
||||
#include "example_interfaces/msg/MultiArrayLayout.idl"
|
||||
|
||||
module example_interfaces {
|
||||
module msg {
|
||||
@verbatim (language="comment", text=
|
||||
" This is an example of using complex datatypes." "\n"
|
||||
" It is not recommended to use directly." "\n"
|
||||
" To use a similar datastruct please define a custom message with appropriate semantic meaning.")
|
||||
struct UInt64MultiArray {
|
||||
@verbatim (language="comment", text=
|
||||
" Please look at the MultiArrayLayout message definition for" "\n"
|
||||
" documentation on all multiarrays." "\n"
|
||||
" specification of data layout")
|
||||
example_interfaces::msg::MultiArrayLayout layout;
|
||||
|
||||
@verbatim (language="comment", text=
|
||||
" array of data")
|
||||
sequence<uint64> data;
|
||||
};
|
||||
};
|
||||
};
|
||||
9
src/ros2/example_interfaces/UInt64MultiArray.msg
Normal file
9
src/ros2/example_interfaces/UInt64MultiArray.msg
Normal file
@ -0,0 +1,9 @@
|
||||
# This is an example of using complex datatypes.
|
||||
# It is not recommended to use directly.
|
||||
# To use a similar datastruct please define a custom message with appropriate semantic meaning.
|
||||
|
||||
# Please look at the MultiArrayLayout message definition for
|
||||
# documentation on all multiarrays.
|
||||
|
||||
MultiArrayLayout layout # specification of data layout
|
||||
uint64[] data # array of data
|
||||
17
src/ros2/example_interfaces/UInt8.idl
Normal file
17
src/ros2/example_interfaces/UInt8.idl
Normal file
@ -0,0 +1,17 @@
|
||||
// generated from rosidl_adapter/resource/msg.idl.em
|
||||
// with input from example_interfaces/msg/UInt8.msg
|
||||
// generated code does not contain a copyright notice
|
||||
|
||||
|
||||
module example_interfaces {
|
||||
module msg {
|
||||
@verbatim (language="comment", text=
|
||||
" This is an example message of using a primitive datatype, uint8." "\n"
|
||||
" If you want to test with this that's fine, but if you are deploying" "\n"
|
||||
" it into a system you should create a semantically meaningful message type." "\n"
|
||||
" If you want to embed it in another message, use the primitive data type instead.")
|
||||
struct UInt8 {
|
||||
uint8 data;
|
||||
};
|
||||
};
|
||||
};
|
||||
5
src/ros2/example_interfaces/UInt8.msg
Normal file
5
src/ros2/example_interfaces/UInt8.msg
Normal file
@ -0,0 +1,5 @@
|
||||
# This is an example message of using a primitive datatype, uint8.
|
||||
# If you want to test with this that's fine, but if you are deploying
|
||||
# it into a system you should create a semantically meaningful message type.
|
||||
# If you want to embed it in another message, use the primitive data type instead.
|
||||
uint8 data
|
||||
25
src/ros2/example_interfaces/UInt8MultiArray.idl
Normal file
25
src/ros2/example_interfaces/UInt8MultiArray.idl
Normal file
@ -0,0 +1,25 @@
|
||||
// generated from rosidl_adapter/resource/msg.idl.em
|
||||
// with input from example_interfaces/msg/UInt8MultiArray.msg
|
||||
// generated code does not contain a copyright notice
|
||||
|
||||
#include "example_interfaces/msg/MultiArrayLayout.idl"
|
||||
|
||||
module example_interfaces {
|
||||
module msg {
|
||||
@verbatim (language="comment", text=
|
||||
" This is an example of using complex datatypes." "\n"
|
||||
" It is not recommended to use directly." "\n"
|
||||
" To use a similar datastruct please define a custom message with appropriate semantic meaning.")
|
||||
struct UInt8MultiArray {
|
||||
@verbatim (language="comment", text=
|
||||
" Please look at the MultiArrayLayout message definition for" "\n"
|
||||
" documentation on all multiarrays." "\n"
|
||||
" specification of data layout")
|
||||
example_interfaces::msg::MultiArrayLayout layout;
|
||||
|
||||
@verbatim (language="comment", text=
|
||||
" array of data")
|
||||
sequence<uint8> data;
|
||||
};
|
||||
};
|
||||
};
|
||||
9
src/ros2/example_interfaces/UInt8MultiArray.msg
Normal file
9
src/ros2/example_interfaces/UInt8MultiArray.msg
Normal file
@ -0,0 +1,9 @@
|
||||
# This is an example of using complex datatypes.
|
||||
# It is not recommended to use directly.
|
||||
# To use a similar datastruct please define a custom message with appropriate semantic meaning.
|
||||
|
||||
# Please look at the MultiArrayLayout message definition for
|
||||
# documentation on all multiarrays.
|
||||
|
||||
MultiArrayLayout layout # specification of data layout
|
||||
uint8[] data # array of data
|
||||
17
src/ros2/example_interfaces/WString.idl
Normal file
17
src/ros2/example_interfaces/WString.idl
Normal file
@ -0,0 +1,17 @@
|
||||
// generated from rosidl_adapter/resource/msg.idl.em
|
||||
// with input from example_interfaces/msg/WString.msg
|
||||
// generated code does not contain a copyright notice
|
||||
|
||||
|
||||
module example_interfaces {
|
||||
module msg {
|
||||
@verbatim (language="comment", text=
|
||||
" This is an example message of using a primitive datatype, wstring." "\n"
|
||||
" If you want to test with this that's fine, but if you are deploying" "\n"
|
||||
" it into a system you should create a semantically meaningful message type." "\n"
|
||||
" If you want to embed it in another message, use the primitive data type instead.")
|
||||
struct WString {
|
||||
wstring data;
|
||||
};
|
||||
};
|
||||
};
|
||||
5
src/ros2/example_interfaces/WString.msg
Normal file
5
src/ros2/example_interfaces/WString.msg
Normal file
@ -0,0 +1,5 @@
|
||||
# This is an example message of using a primitive datatype, wstring.
|
||||
# If you want to test with this that's fine, but if you are deploying
|
||||
# it into a system you should create a semantically meaningful message type.
|
||||
# If you want to embed it in another message, use the primitive data type instead.
|
||||
wstring data
|
||||
248
src/ros2/ros2.txt
Normal file
248
src/ros2/ros2.txt
Normal file
@ -0,0 +1,248 @@
|
||||
RCL
|
||||
===
|
||||
rcl_get_zero_initialized_node () [NODE]
|
||||
rcl_node_init (node, name, namespace, context, options) [RET]
|
||||
rcl_node_fini (node) [RET]
|
||||
rcl_node_is_valid (node) [BOOL]
|
||||
rcl_node_is_valid_except_context (node) [BOOL]
|
||||
rcl_node_get_name (node) [NAME]
|
||||
rcl_node_get_namespace (node) [NAMESPACE]
|
||||
rcl_node_get_fully_qualified_name (node) [FQN]
|
||||
rcl_node_get_options (node) [OPTIONS]
|
||||
rcl_node_get_domain_id (node, domain_id) [RET]
|
||||
rcl_node_get_rmw_handle (node) [RMW NODE]
|
||||
rcl_node_get_rcl_instance_id (node) [INSTANCE ID]
|
||||
rcl_node_get_graph_guard_condition (node) [GUARD CONDITION]
|
||||
rcl_node_get_logger_name (node) [LOGGER NAME]
|
||||
|
||||
rcl_get_zero_initialized_publisher () [PUBLISHER]
|
||||
rcl_publisher_init (publisher, node, type_support, topic_name, options) [RET]
|
||||
rcl_publisher_fini (publisher, node) [RET]
|
||||
rcl_publisher_get_default_options () [options]
|
||||
rcl_borrow_loaned_message (publisher, type_support, ros_message) [RET]
|
||||
rcl_return_loaned_message_from_publisher (publisher, loaned_message) [RET]
|
||||
rcl_publish (publisher, ros_message, allocation) [RET]
|
||||
rcl_publish_serialized_message (publisher, serialized_message, allocation) [RET]
|
||||
rcl_publish_loaned_message (publisher, ros_message, allocation) [RET]
|
||||
rcl_publisher_assert_liveliness (publisher) [RET]
|
||||
rcl_publisher_get_topic_name (publisher) [TOPIC NAME]
|
||||
rcl_publisher_get_options (publisher) [OPTIONS]
|
||||
rcl_publisher_get_rmw_handle (publisher) [RMW PUBLISHER]
|
||||
rcl_publisher_get_context (publisher) [CONTEXT]
|
||||
rcl_publisher_is_valid (publisher) [BOOL]
|
||||
rcl_publisher_is_valid_except_context (publisher) [BOOL]
|
||||
rcl_publisher_get_subscription_count (publisher, subscription_count) [RET]
|
||||
rcl_publisher_get_actual_qos (publisher) [RMW QOS PROFILE]
|
||||
rcl_publisher_can_loan_messages (publisher) [BOOL]
|
||||
|
||||
rcl_get_zero_initialized_subscription () [SUBSCRIBER]
|
||||
rcl_subscription_init (subscriber, node, type_support, topic_name, options) [RET]
|
||||
rcl_subscription_fini (subscriber, node) [RET]
|
||||
rcl_subscription_get_default_options() [OPTIONS]
|
||||
rcl_take (subscriber, ros_message, message_info, allocation) [RET]
|
||||
rcl_take_sequence (subscriber, message_sequence, message_info_sequence, allocation) [RET]
|
||||
rcl_take_serialized_message (subscriber, serialized_message, message_info, allocation) [RET]
|
||||
rcl_take_loaned_message (subscriber, loaned_message, message_info, allocation) [RET]
|
||||
rcl_return_loaned_message_from_subscription (subscriber, loaned_message) [RET]
|
||||
rcl_subscription_get_topic_name (subscriber) [TOPIC NAME]
|
||||
rcl_subscription_get_options (subscriber) [OPTIONS]
|
||||
rcl_subscription_get_rmw_handle (subscriber) [RMW SUBSCRIBER]
|
||||
rcl_subscription_is_valid (subscriber) [BOOL]
|
||||
rcl_subscription_get_publisher_count (subscriber, publisher_count) [RET]
|
||||
rcl_subscription_get_actual_qos (subscriber) [QOS PROFILE]
|
||||
rcl_subscription_can_loan_messages (subscriber) [BOOL]
|
||||
|
||||
rcl_get_zero_initialized_client () [CLIENT]
|
||||
rcl_client_init (client, node, type_support, service_name, options) [RET]
|
||||
rcl_client_fini (client, node) [RET]
|
||||
rcl_client_get_default_options () [OPTIONS]
|
||||
rcl_send_request (client, ros_request, sequence_number) [RET]
|
||||
rcl_take_response_with_info (client, request_header, ros_response)
|
||||
rcl_take_response (client, request_header, ros_response)
|
||||
rcl_client_get_service_name (client) [SERVICE NAME]
|
||||
rcl_client_get_options (client) [OPTIONS]
|
||||
rcl_client_get_rmw_handle (client) [RMW HANDLE]
|
||||
rcl_client_is_valid (client) [BOOL]
|
||||
|
||||
rcl_get_zero_initialized_service () [SERVICE]
|
||||
rcl_service_init (service, node, type_support, service_name, options) [RET]
|
||||
rcl_service_fini (service, node) [RET]
|
||||
rcl_service_get_default_options () [OPTIONS]
|
||||
rcl_take_request_with_info (service, request_header, ros_request) [RET]
|
||||
rcl_take_request (service, request_header, ros_request) [RET]
|
||||
rcl_send_response (service, response_header, ros_response) [RET]
|
||||
rcl_service_get_service_name (service) [SERVICE NAME]
|
||||
rcl_service_get_options (service) [OPTIONS]
|
||||
rcl_service_get_rmw_handle (service) [RMW SERVICE]
|
||||
rcl_service_is_valid (service) [BOOL]
|
||||
|
||||
rcl_get_zero_initialized_timer () [TIMER]
|
||||
rcl_timer_init (timer, clock, context, period, callback, allocator) [RET]
|
||||
rcl_timer_fini (timer) [RET]
|
||||
rcl_timer_call (timer) [RET]
|
||||
rcl_timer_clock (timer, clock) [RET]
|
||||
rcl_timer_is_ready (timer, is_ready) [RET]
|
||||
rcl_timer_get_time_until_next_call (timer, time_until_next_call) [RET]
|
||||
rcl_timer_get_time_since_last_call (timer, time_since_last_call) [RET]
|
||||
rcl_timer_get_period (timer, period) [RET]
|
||||
rcl_timer_exchange_period (timer, new_period, old_period) [RET]
|
||||
rcl_timer_get_callback (timer) [TIMER CALLBACK]
|
||||
rcl_timer_exchange_callback (TIMER, NEW_CALLBACK) [TIMER CALLBACK]
|
||||
rcl_timer_cancel (timer) [RET]
|
||||
rcl_timer_is_canceled (timer, is_canceled) [RET]
|
||||
rcl_timer_reset (timer) [RET]
|
||||
rcl_timer_get_allocator (timer) [ALLOCATOR]
|
||||
rcl_timer_get_guard_condition (timer) [GUARD CONDITION]
|
||||
|
||||
RMW
|
||||
===
|
||||
|
||||
rmw_get_zero_initialized_context () [CONTEXT]
|
||||
rmw_init (options, context) [RET]
|
||||
rmw_shutdown (context) [RET]
|
||||
rmw_context_fini (context) [RET]
|
||||
|
||||
rmw_get_implementation_identifier () [IMPLEMENTATION IDENTIFIER]
|
||||
rmw_get_serialization_format () [SERIALIZATION FORMAT]
|
||||
rmw_create_node (context, name, namespace, domain_id, localhost_only) [NODE]
|
||||
rmw_destroy_node (node) [RET]
|
||||
rmw_node_get_graph_guard_condition (node) [GUARD CONDITION]
|
||||
rmw_init_publisher_allocation (type_support, message_bound, allocation) [RET]
|
||||
rmw_fini_publisher_allocation (allocation) [RET]
|
||||
rmw_get_default_publisher_options () [PUB OPTIONS]
|
||||
rmw_create_publisher (node, type_support, topic_name, qos_policies, publisher_options) [PUBLISHER]
|
||||
rmw_destroy_publisher (node, publisher)
|
||||
rmw_borrow_loaned_message (publisher, type_support, ros_message) [RET]
|
||||
rmw_return_loaned_message_from_publisher (publisher, loaned_message [RET]
|
||||
rmw_publish (publisher, ros_message, allocation) [RET]
|
||||
rmw_publish_loaned_message (publisher, ros_message, allocation) [RET]
|
||||
rmw_publisher_count_matched_subscriptions (publisher, subscription_count) [RET]
|
||||
rmw_publisher_get_actual_qos (publisher, qos) [RET]
|
||||
rmw_publish_serialized_message (publisher, serialized_message, allocation) [RET]
|
||||
rmw_get_serialized_message_size (type_support, message_bounds, size) [RET]
|
||||
rmw_publisher_assert_liveliness (publisher) [RET]
|
||||
rmw_serialize (ros_message, type_support, serialized_message) [RET]
|
||||
rmw_deserialize (serialized_message, type_support, ros_message) [RET]
|
||||
rmw_init_subscription_allocation (type_support, message_bounds, allocation) [RET]
|
||||
rmw_fini_subscription_allocation (allocation) [RET]
|
||||
rmw_create_subscription (node, type_support, topic_name, qos_policies, subscriber_options) [SUBSCRIBER]
|
||||
rmw_destroy_subscription (node, subscriber) [RET]
|
||||
rmw_subscription_count_matched_publishers (subscriber, publisher_count) [RET]
|
||||
rmw_subscription_get_actual_qos (subscriber, qos) [RET]
|
||||
rmw_take (subscriber, ros_message, taken, allocation) [RET]
|
||||
rmw_take_with_info (subscriber, ros_message, taken, message_info, allocation) [RET]
|
||||
rmw_take_sequence (subscriber, count, message_sequence, message_info_sequence, taken, allocation) [RET]
|
||||
rmw_take_serialized_message (subscriber, serialized_message, taken, allocation) [RET]
|
||||
rmw_take_serialized_message_with_info (subscriber, serialized_message, taken, message_info, allocation) [RET]
|
||||
rmw_take_loaned_message (subscriber, loaned_message, taken, allocation) [RET]
|
||||
rmw_take_loaned_message_with_info (subscriber, loaned_message, taken, message_info, allocation) [RET]
|
||||
rmw_return_loaned_message_from_subscription (subscriber, loaned_message) [RET]
|
||||
rmw_create_client (node, type_support, service_name, qos_policies) [CLIENT]
|
||||
rmw_destroy_client (node, client) [RET]
|
||||
rmw_send_request (client, ros_request, sequence_id) [RET]
|
||||
rmw_take_response (client, service_info, ros_response, taken) [RET]
|
||||
rmw_create_service (node, type_support, service_name, qos_policies) [SERVICE]
|
||||
rmw_destroy_service (node, service) [RET]
|
||||
rmw_take_request (service, service_info, ros_request, taken) [RET]
|
||||
rmw_send_response (service, request_id, ros_response) [RET]
|
||||
rmw_create_guard_condition (context) [GUARD CONDITION]
|
||||
rmw_destroy_guard_condition (guard_condition) [RET]
|
||||
rmw_trigger_guard_condition (guard_condition) [RET]
|
||||
rmw_create_wait_set (context, max_conditions) [WAIT_SET]
|
||||
rmw_destroy_wait_set (wait_set) [RET]
|
||||
rmw_wait (subscriber, guard_condition, services, clients, events, wait_set, wait_timeout) [RET]
|
||||
rmw_get_node_names (node, node_names, node_namespaces) [RET]
|
||||
rmw_get_node_names_with_enclaves (node, node_names, node_namespaces, enclaves) [RET]
|
||||
rmw_count_publishers (node, topic_name, count) [RET]
|
||||
rmw_count_subscribers (node, topic_name, count) [RET]
|
||||
rmw_get_gid_for_publisher (publisher, gid) [RET]
|
||||
rmw_compare_gids_equal (gid1, gid2, result) [RET]
|
||||
rmw_service_server_is_available (node, client, is_available) [RET]
|
||||
rmw_set_log_severity (severity) [RET]
|
||||
|
||||
|
||||
CONTEXT
|
||||
-------
|
||||
instance_id, implementation_identifier, options, impl
|
||||
|
||||
OPTIONS
|
||||
-------
|
||||
instance_id, implementation_identifier, domain_id, security_options, localhost_only, enclave, allocator, impl
|
||||
|
||||
SECURITY OPTIONS
|
||||
----------------
|
||||
enforce_security, security_root_path
|
||||
|
||||
GUARD CONDITION
|
||||
---------------
|
||||
implementation_identifier, data, context
|
||||
|
||||
SERVICE INFO
|
||||
------------
|
||||
source_timestamp, received_timestamp, request_id
|
||||
|
||||
REQUEST ID
|
||||
----------
|
||||
writer_guid, sequence_number
|
||||
|
||||
|
||||
##################################
|
||||
http://design.ros2.org/articles/legacy_interface_definition.html
|
||||
http://design.ros2.org/articles/idl_interface_definition.html
|
||||
http://design.ros2.org/articles/topic_and_service_names.html
|
||||
|
||||
http://design.ros2.org/articles/clock_and_time.html
|
||||
http://design.ros2.org/articles/qos.html
|
||||
http://design.ros2.org/articles/qos_configurability.html
|
||||
http://design.ros2.org/articles/qos_deadline_liveliness_lifespan.html
|
||||
|
||||
GENERAL
|
||||
=======
|
||||
http://design.ros2.org/articles/Node_to_Participant_mapping.html
|
||||
REF: https://github.com/ros2/rmw_dds_common.git
|
||||
|
||||
TOPIC: 'ros_discovery_info' [ParticipantInfo.msg]
|
||||
QOS: TRANSIENT_LOCAL, KEEP_LAST, DEPTH 1, RELIABLE
|
||||
|
||||
Each Participant publishes a message with all the information needed to match an entity to a Node.
|
||||
When one entity is updated (e.g.: a Publisher is created or destroyed), a new message is sent.
|
||||
|
||||
SERVICE
|
||||
=======
|
||||
REF: https://github.com/ros2/rmw_cyclonedds.git
|
||||
|
||||
TOPIC: 'rq<SERVICE_NAME>Request' [cdds_request_wrapper_t]
|
||||
TOPIC: 'rr<SERVICE_NAME>Response' [cdds_request_wrapper_t]
|
||||
QOS: According to caling rmw_function
|
||||
|
||||
NOTE: This is Cyclone DDS implementation specific
|
||||
|
||||
ACTION
|
||||
======
|
||||
http://design.ros2.org/articles/actions.html
|
||||
REF: https://github.com/ros2/rclcpp.git [/rlcpp_action]
|
||||
|
||||
SERVICE: '<ACTIONNAME>/_action/send_goal' [1st section of .action Definition]
|
||||
SERVICE: '<ACTIONNAME>/_action/cancel_goal' [rcl_interfaces/action_msgs/CancelGoal.srv]
|
||||
SERVICE: '<ACTIONNAME>/_action/get_result' [2nd section of .action Definition]
|
||||
TOPIC: '<ACTIONNAME>/_action/feedback' [3rd section of .action Definition]
|
||||
TOPIC: '<ACTIONNAME>/_action/status'
|
||||
|
||||
|
||||
PARAMETER
|
||||
=========
|
||||
http://design.ros2.org/articles/ros_parameters.html
|
||||
REF: https://github.com/ros2/rclcpp.git
|
||||
|
||||
SERVICE: 'GetParameters'
|
||||
SERVICE: 'HasParameters'
|
||||
SERVICE: 'ListParameters'
|
||||
SERVICE: 'SetParameters'
|
||||
TOPIC: 'ParameterEvent'
|
||||
TOPIC: 'ParameterEventDescriptor'
|
||||
|
||||
|
||||
MANAGED NODE
|
||||
============
|
||||
http://design.ros2.org/articles/node_lifecycle.html
|
||||
REF: https://github.com/ros2/rclcpp.git [/rlcpp_lifecycle]
|
||||
463
src/ros2/ros_package.vhd
Normal file
463
src/ros2/ros_package.vhd
Normal file
@ -0,0 +1,463 @@
|
||||
-- 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.rtps_package.all;
|
||||
use work.rtps_config_package.all; --TODO: Remove after putting DDS_*_OPCODE_TYPE inside rtps_package
|
||||
|
||||
package ros_package is
|
||||
|
||||
type ROS_QOS_PROFILE_TYPE is record
|
||||
HISTORY_QOS : std_logic_vector(CDR_ENUMERATION_WIDTH-1 downto 0);
|
||||
HISTORY_DEPTH : std_logic_vector(CDR_LONG_WIDTH-1 downto 0);
|
||||
RELIABILITY_QOS : std_logic_vector(CDR_ENUMERATION_WIDTH-1 downto 0);
|
||||
DURABILITY_QOS : std_logic_vector(CDR_ENUMERATION_WIDTH-1 downto 0);
|
||||
DEADLINE_QOS : DURATION_TYPE;
|
||||
LIFESPAN_QOS : DURATION_TYPE;
|
||||
LIVELINESS_QOS : std_logic_vector(CDR_ENUMERATION_WIDTH-1 downto 0);
|
||||
LEASE_DURATION : DURATION_TYPE;
|
||||
AVOID_ROS_NAMESPACE_CONVENTION : boolean;
|
||||
end record;
|
||||
|
||||
constant ROS_QOS_PROFILE_SENSOR_DATA : ROS_QOS_PROFILE_TYPE := (
|
||||
HISTORY_QOS => KEEP_LAST_HISTORY_QOS,
|
||||
HISTORY_DEPTH => std_logic_vector(to_unsigned(5, CDR_LONG_WIDTH)),
|
||||
RELIABILITY_QOS => BEST_EFFORT_RELIABILITY_QOS,
|
||||
DURABILITY_QOS => VOLATILE_DURABILITY_QOS,
|
||||
DEADLINE_QOS => DEFAULT_DEADLINE_QOS,
|
||||
LIFESPAN_QOS => DEFAULT_LIFESPAN_QOS,
|
||||
LIVELINESS_QOS => DEFAULT_LIVELINESS_QOS,
|
||||
LEASE_DURATION => DEFAULT_LEASE_DURATION,
|
||||
AVOID_ROS_NAMESPACE_CONVENTION => FALSE
|
||||
);
|
||||
|
||||
constant ROS_QOS_PROFILE_PARAMETERS : ROS_QOS_PROFILE_TYPE := (
|
||||
HISTORY_QOS => KEEP_LAST_HISTORY_QOS,
|
||||
HISTORY_DEPTH => std_logic_vector(to_unsigned(1000, CDR_LONG_WIDTH)),
|
||||
RELIABILITY_QOS => RELIABLE_RELIABILITY_QOS,
|
||||
DURABILITY_QOS => VOLATILE_DURABILITY_QOS,
|
||||
DEADLINE_QOS => DEFAULT_DEADLINE_QOS,
|
||||
LIFESPAN_QOS => DEFAULT_LIFESPAN_QOS,
|
||||
LIVELINESS_QOS => DEFAULT_LIVELINESS_QOS,
|
||||
LEASE_DURATION => DEFAULT_LEASE_DURATION,
|
||||
AVOID_ROS_NAMESPACE_CONVENTION => FALSE
|
||||
);
|
||||
|
||||
constant ROS_QOS_PROFILE_DEFAULT : ROS_QOS_PROFILE_TYPE := (
|
||||
HISTORY_QOS => KEEP_LAST_HISTORY_QOS,
|
||||
HISTORY_DEPTH => std_logic_vector(to_unsigned(10, CDR_LONG_WIDTH)),
|
||||
RELIABILITY_QOS => RELIABLE_RELIABILITY_QOS,
|
||||
DURABILITY_QOS => VOLATILE_DURABILITY_QOS,
|
||||
DEADLINE_QOS => DEFAULT_DEADLINE_QOS,
|
||||
LIFESPAN_QOS => DEFAULT_LIFESPAN_QOS,
|
||||
LIVELINESS_QOS => DEFAULT_LIVELINESS_QOS,
|
||||
LEASE_DURATION => DEFAULT_LEASE_DURATION,
|
||||
AVOID_ROS_NAMESPACE_CONVENTION => FALSE
|
||||
);
|
||||
|
||||
constant ROS_QOS_PROFILE_SERVICES_DEFAULT : ROS_QOS_PROFILE_TYPE := (
|
||||
HISTORY_QOS => KEEP_LAST_HISTORY_QOS,
|
||||
HISTORY_DEPTH => std_logic_vector(to_unsigned(10, CDR_LONG_WIDTH)),
|
||||
RELIABILITY_QOS => RELIABLE_RELIABILITY_QOS,
|
||||
DURABILITY_QOS => VOLATILE_DURABILITY_QOS,
|
||||
DEADLINE_QOS => DEFAULT_DEADLINE_QOS,
|
||||
LIFESPAN_QOS => DEFAULT_LIFESPAN_QOS,
|
||||
LIVELINESS_QOS => DEFAULT_LIVELINESS_QOS,
|
||||
LEASE_DURATION => DEFAULT_LEASE_DURATION,
|
||||
AVOID_ROS_NAMESPACE_CONVENTION => FALSE
|
||||
);
|
||||
|
||||
constant ROS_QOS_PROFILE_PARAMETER_EVENTS : ROS_QOS_PROFILE_TYPE := (
|
||||
HISTORY_QOS => KEEP_LAST_HISTORY_QOS,
|
||||
HISTORY_DEPTH => std_logic_vector(to_unsigned(1000, CDR_LONG_WIDTH)),
|
||||
RELIABILITY_QOS => RELIABLE_RELIABILITY_QOS,
|
||||
DURABILITY_QOS => VOLATILE_DURABILITY_QOS,
|
||||
DEADLINE_QOS => DEFAULT_DEADLINE_QOS,
|
||||
LIFESPAN_QOS => DEFAULT_LIFESPAN_QOS,
|
||||
LIVELINESS_QOS => DEFAULT_LIVELINESS_QOS,
|
||||
LEASE_DURATION => DEFAULT_LEASE_DURATION,
|
||||
AVOID_ROS_NAMESPACE_CONVENTION => FALSE
|
||||
);
|
||||
|
||||
constant ROS_QOS_PROFILE_SYSTEM_DEFAULT : ROS_QOS_PROFILE_TYPE := (
|
||||
HISTORY_QOS => DEFAULT_HISTORY_QOS,
|
||||
HISTORY_DEPTH => DEFAULT_HISTORY_DEPTH,
|
||||
RELIABILITY_QOS => DEFAULT_RELIABILITY_QOS_R,
|
||||
DURABILITY_QOS => DEFAULT_DURABILITY_QOS,
|
||||
DEADLINE_QOS => DEFAULT_DEADLINE_QOS,
|
||||
LIFESPAN_QOS => DEFAULT_LIFESPAN_QOS,
|
||||
LIVELINESS_QOS => DEFAULT_LIVELINESS_QOS,
|
||||
LEASE_DURATION => DEFAULT_LEASE_DURATION,
|
||||
AVOID_ROS_NAMESPACE_CONVENTION => FALSE
|
||||
);
|
||||
|
||||
type ROS_NODE_TYPE is record
|
||||
--context_id : natural;
|
||||
name : USER_STRING_TYPE;
|
||||
namespace : USER_STRING_TYPE;
|
||||
domain_id : natural;
|
||||
NUM_PUBS : natural;
|
||||
NUM_SUBS : natural;
|
||||
NUM_SERVICES : natural;
|
||||
NUM_ACTIONS : natural;
|
||||
end record;
|
||||
|
||||
type ROS_TOPIC_TYPE is record
|
||||
node_id : natural;
|
||||
TOPICNAME : USER_STRING_TYPE;
|
||||
TYPENAME : USER_STRING_TYPE;
|
||||
QOS : ROS_QOS_PROFILE_TYPE;
|
||||
end record;
|
||||
|
||||
type ROS_SERVICE_TYPE is record
|
||||
node_id : natural;
|
||||
SERVICENAME : USER_STRING_TYPE;
|
||||
TYPENAME : USER_STRING_TYPE;
|
||||
QOS : ROS_QOS_PROFILE_TYPE;
|
||||
is_client : boolean;
|
||||
end record;
|
||||
|
||||
type ROS_ACTION_TYPE is record
|
||||
node_id : natural;
|
||||
-- TODO
|
||||
end record;
|
||||
|
||||
type REQUEST_ID_TYPE is record
|
||||
writer_guid : GUID_TYPE;
|
||||
sequence_number : SEQUENCENUMBER_TYPE;
|
||||
end record;
|
||||
|
||||
constant EMPTY_REQUEST_ID : REQUEST_ID_TYPE := (writer_guid => GUID_UNKNOWN, sequence_number => SEQUENCENUMBER_UNKNOWN);
|
||||
|
||||
type SERVICE_INFO_TYPE is record
|
||||
source_timestamp : TIME_TYPE;
|
||||
received_timestamp : TIME_TYPE;
|
||||
request_id : REQUEST_ID_TYPE;
|
||||
end record;
|
||||
|
||||
constant EMPTY_SERVICE_INFO : SERVICE_INFO_TYPE := (source_timestamp => TIME_INVALID, received_timestamp => TIME_INVALID, request_id => EMPTY_REQUEST_ID);
|
||||
|
||||
type ROS_NODE_ARRAY_TYPE is array (natural range <>) of ROS_NODE_TYPE;
|
||||
type ROS_TOPIC_ARRAY_TYPE is array (natural range <>) of ROS_TOPIC_TYPE;
|
||||
type ROS_SERVICE_ARRAY_TYPE is array (natural range <>) of ROS_SERVICE_TYPE;
|
||||
type ROS_ACTION_ARRAY_TYPE is array (natural range <>) of ROS_ACTION_TYPE;
|
||||
|
||||
-- *ROS RETURN CODES*
|
||||
constant ROS_RETCODE_WIDTH : natural := 32;
|
||||
constant ROS_RET_OK : std_logic_vector(ROS_RETCODE_WIDTH-1 downto 0) := std_logic_vector(to_unsigned(0,ROS_RETCODE_WIDTH));
|
||||
constant ROS_RET_ERROR : std_logic_vector(ROS_RETCODE_WIDTH-1 downto 0) := std_logic_vector(to_unsigned(1,ROS_RETCODE_WIDTH));
|
||||
constant ROS_RET_TIMEOUT : std_logic_vector(ROS_RETCODE_WIDTH-1 downto 0) := std_logic_vector(to_unsigned(2,ROS_RETCODE_WIDTH));
|
||||
constant ROS_RET_UNSUPPORTED : std_logic_vector(ROS_RETCODE_WIDTH-1 downto 0) := std_logic_vector(to_unsigned(3,ROS_RETCODE_WIDTH));
|
||||
|
||||
type ROS_SERVICE_OPCODE_TYPE is (NOP, SEND_REQUEST, TAKE_REQUEST, SEND_RESPONSE, TAKE_RESPONSE);
|
||||
|
||||
constant ROS_SEQUENCE_ID_WIDTH : natural := 64;
|
||||
|
||||
type ENDPOINT_ROS_NODE_MAPPING_ARRAY_TYPE is array (natural range <>) of natural;
|
||||
|
||||
constant GID_WIDTH : natural := 192;
|
||||
type GID_TYPE is array (0 to (GID_WIDTH/WORD_WIDTH)-1) of std_logic_vector(WORD_WIDTH-1 downto 0);
|
||||
|
||||
function to_gid(guid : GUID_TYPE) return GID_TYPE;
|
||||
|
||||
function get_num_pubs(nodes : ROS_NODE_ARRAY_TYPE) return natural;
|
||||
function get_num_subs(nodes : ROS_NODE_ARRAY_TYPE) return natural;
|
||||
function get_num_services(nodes : ROS_NODE_ARRAY_TYPE) return natural;
|
||||
function get_num_actions(nodes : ROS_NODE_ARRAY_TYPE) return natural;
|
||||
function get_domain_id(nodes : ROS_NODE_ARRAY_TYPE) return natural;
|
||||
function gen_fqn(ns : string; node : string; name : string) return USER_STRING_TYPE;
|
||||
procedure check_node_mapping(nodes : in ROS_NODE_ARRAY_TYPE; pubs : in ROS_TOPIC_ARRAY_TYPE; subs : in ROS_TOPIC_ARRAY_TYPE; services : in ROS_SERVICE_ARRAY_TYPE; actions : in ROS_ACTION_ARRAY_TYPE);
|
||||
procedure set_from_qos_profile(profile : in ROS_QOS_PROFILE_TYPE; config : inout CONFIG_TYPE);
|
||||
|
||||
type SERVICE_INTERFACE_TYPE is record
|
||||
start_r : std_logic;
|
||||
ack_r : std_logic;
|
||||
opcode_r : DDS_READER_OPCODE_TYPE;
|
||||
instance_state_r : std_logic_vector(INSTANCE_STATE_KIND_WIDTH-1 downto 0);
|
||||
view_state_r : std_logic_vector(VIEW_STATE_KIND_WIDTH-1 downto 0);
|
||||
sample_state_r : std_logic_vector(SAMPLE_STATE_KIND_WIDTH-1 downto 0);
|
||||
instance_handle_r : INSTANCE_HANDLE_TYPE;
|
||||
max_samples_r : std_logic_vector(MAX_SAMPLES_WIDTH-1 downto 0);
|
||||
get_data_r : std_logic;
|
||||
done_r : std_logic;
|
||||
return_code_r : std_logic_vector(RETURN_CODE_WIDTH-1 downto 0);
|
||||
valid_in_r : std_logic;
|
||||
ready_in_r : std_logic;
|
||||
data_in_r : std_logic_vector(WORD_WIDTH-1 downto 0);
|
||||
last_word_in_r : std_logic;
|
||||
si_sample_state_r : std_logic_vector(SAMPLE_STATE_KIND_WIDTH-1 downto 0);
|
||||
si_view_state_r : std_logic_vector(VIEW_STATE_KIND_WIDTH-1 downto 0);
|
||||
si_instance_state_r : std_logic_vector(INSTANCE_STATE_KIND_WIDTH-1 downto 0);
|
||||
si_source_timestamp_r : TIME_TYPE;
|
||||
si_instance_handle_r : INSTANCE_HANDLE_TYPE;
|
||||
si_publication_handle_r : INSTANCE_HANDLE_TYPE;
|
||||
si_disposed_generation_count_r : std_logic_vector(DISPOSED_GENERATION_COUNT_WIDTH-1 downto 0);
|
||||
si_no_writers_generation_count_r : std_logic_vector(NO_WRITERS_GENERATION_COUNT_WIDTH-1 downto 0);
|
||||
si_sample_rank_r : std_logic_vector(SAMPLE_RANK_WIDTH-1 downto 0);
|
||||
si_generation_rank_r : std_logic_vector(GENERATION_RANK_WIDTH-1 downto 0);
|
||||
si_absolute_generation_rank_r : std_logic_vector(ABSOLUTE_GENERATION_COUNT_WIDTH-1 downto 0);
|
||||
si_valid_data_r : std_logic;
|
||||
si_valid_r : std_logic;
|
||||
si_ack_r : std_logic;
|
||||
eoc_r : std_logic;
|
||||
status_r : std_logic_vector(STATUS_KIND_WIDTH-1 downto 0);
|
||||
start_w : std_logic;
|
||||
ack_w : std_logic;
|
||||
opcode_w : DDS_WRITER_OPCODE_TYPE;
|
||||
instance_handle_out_w : INSTANCE_HANDLE_TYPE;
|
||||
source_ts_w : TIME_TYPE;
|
||||
max_wait_w : DURATION_TYPE;
|
||||
done_w : std_logic;
|
||||
return_code_w : std_logic_vector(RETURN_CODE_WIDTH-1 downto 0);
|
||||
instance_handle_in_w : INSTANCE_HANDLE_TYPE;
|
||||
valid_out_w : std_logic;
|
||||
ready_out_w : std_logic;
|
||||
data_out_w : std_logic_vector(WORD_WIDTH-1 downto 0);
|
||||
last_word_out_w : std_logic;
|
||||
valid_in_w : std_logic;
|
||||
ready_in_w : std_logic;
|
||||
data_in_w : std_logic_vector(WORD_WIDTH-1 downto 0);
|
||||
last_word_in_w : std_logic;
|
||||
status_w : std_logic_vector(STATUS_KIND_WIDTH-1 downto 0);
|
||||
end record;
|
||||
|
||||
type SERVICE_INTERFACE_ARRAY_TYPE is array (natural range <>) of SERVICE_INTERFACE_TYPE;
|
||||
|
||||
end package;
|
||||
|
||||
package body ros_package is
|
||||
|
||||
function to_gid(guid : GUID_TYPE) return GID_TYPE is
|
||||
variable ret : GID_TYPE;
|
||||
begin
|
||||
ret := (others => (others => '0'));
|
||||
for i in 0 to guid'length-1 loop
|
||||
ret(i) := guid(i);
|
||||
end loop;
|
||||
|
||||
return ret;
|
||||
end function;
|
||||
|
||||
function get_num_pubs(nodes : ROS_NODE_ARRAY_TYPE) return natural is
|
||||
variable ret : natural;
|
||||
begin
|
||||
ret := 0;
|
||||
for i in 0 to nodes'length-1 loop
|
||||
ret := ret + nodes(i).NUM_PUBS;
|
||||
end loop;
|
||||
return ret;
|
||||
end function;
|
||||
|
||||
function get_num_subs(nodes : ROS_NODE_ARRAY_TYPE) return natural is
|
||||
variable ret : natural;
|
||||
begin
|
||||
ret := 0;
|
||||
for i in 0 to nodes'length-1 loop
|
||||
ret := ret + nodes(i).NUM_SUBS;
|
||||
end loop;
|
||||
return ret;
|
||||
end function;
|
||||
|
||||
function get_num_services(nodes : ROS_NODE_ARRAY_TYPE) return natural is
|
||||
variable ret : natural;
|
||||
begin
|
||||
ret := 0;
|
||||
for i in 0 to nodes'length-1 loop
|
||||
ret := ret + nodes(i).NUM_SERVICES;
|
||||
end loop;
|
||||
return ret;
|
||||
end function;
|
||||
|
||||
function get_num_actions(nodes : ROS_NODE_ARRAY_TYPE) return natural is
|
||||
variable ret : natural;
|
||||
begin
|
||||
ret := 0;
|
||||
for i in 0 to nodes'length-1 loop
|
||||
ret := ret + nodes(i).NUM_ACTIONS;
|
||||
end loop;
|
||||
return ret;
|
||||
end function;
|
||||
|
||||
function is_numeric_char (char : character) return boolean is
|
||||
variable ret : boolean;
|
||||
begin
|
||||
if (character'POS(char) >= character'POS('0') and character'POS(char) <= character'POS('9')) then
|
||||
return TRUE;
|
||||
else
|
||||
return FALSE;
|
||||
end if;
|
||||
end function;
|
||||
|
||||
function is_valid_char (char : character) return boolean is
|
||||
variable ret : boolean;
|
||||
begin
|
||||
-- Whitelist
|
||||
-- Name may contain alphanumeric characters ([0-9|a-z|A-Z]), underscores (_), or forward slashes (/)
|
||||
if is_numeric_char(char) then
|
||||
return TRUE;
|
||||
elsif (character'POS(char) >= character'POS('A') and character'POS(char) <= character'POS('Z')) then
|
||||
return TRUE;
|
||||
elsif (character'POS(char) >= character'POS('a') and character'POS(char) <= character'POS('z')) then
|
||||
return TRUE;
|
||||
elsif (char = '_' or char = '/') then
|
||||
return TRUE;
|
||||
end if;
|
||||
|
||||
return FALSE;
|
||||
end function;
|
||||
|
||||
procedure is_valid_name (name : in string) is
|
||||
variable start : natural;
|
||||
variable prev : character;
|
||||
begin
|
||||
assert (string_len(name) > 0) report "Name must not be empty" severity FAILURE;
|
||||
assert (not is_numeric_char(name(1))) report "Name must not start with a numeric character" severity FAILURE;
|
||||
assert (name(string_len(name)) /= '/') report "Name must not end with a forward slash (/)" severity FAILURE;
|
||||
|
||||
start := 1;
|
||||
|
||||
if (name(1) = '~') then
|
||||
if (string_len(name) > 1) then
|
||||
assert (name(2) = '/') report "Name must separate a tilde (~) from the rest of the name with a forward slash (/), i.e. ~/foo not ~foo" severity FAILURE;
|
||||
end if;
|
||||
start := 2; -- Skip valid char checking for '~'
|
||||
end if;
|
||||
|
||||
prev := ' ';
|
||||
for i in start to string_len(name) loop
|
||||
assert (name(i) /= '{') report "Substitution is not supported" severity FAILURE;
|
||||
assert (not (name(i) = '/' and name(i) = prev)) report "Name must not contain any number of repeated forward slashes (/)" severity FAILURE;
|
||||
assert (not (name(i) = '_' and name(i) = prev)) report "Name must not contain any number of repeated underscores (_)" severity FAILURE;
|
||||
assert (is_valid_char(name(i))) report "Name may contain alphanumeric characters ([0-9|a-z|A-Z]), underscores (_), or forward slashes (/)" severity FAILURE;
|
||||
prev := name(i);
|
||||
end loop;
|
||||
end procedure;
|
||||
|
||||
|
||||
function get_domain_id(nodes : ROS_NODE_ARRAY_TYPE) return natural is
|
||||
variable ret : natural;
|
||||
begin
|
||||
ret := nodes(0).domain_id;
|
||||
for i in 1 to nodes'length-1 loop
|
||||
assert (nodes(i).domain_id = ret) report "No support for multiple domain IDs in same ROS context" severity FAILURE;
|
||||
end loop;
|
||||
return ret;
|
||||
end function;
|
||||
|
||||
procedure check_node_mapping (nodes : in ROS_NODE_ARRAY_TYPE; pubs : in ROS_TOPIC_ARRAY_TYPE; subs : in ROS_TOPIC_ARRAY_TYPE; services : in ROS_SERVICE_ARRAY_TYPE; actions : in ROS_ACTION_ARRAY_TYPE) is
|
||||
variable tmp : natural;
|
||||
begin
|
||||
for i in 0 to nodes'length loop
|
||||
-- Check PUB Mapping
|
||||
if (nodes(i).NUM_PUBS > 0) then
|
||||
tmp := 0;
|
||||
for j in 0 to pubs'length loop
|
||||
if (pubs(j).node_id = i) then
|
||||
tmp := tmp + 1;
|
||||
end if;
|
||||
end loop;
|
||||
assert (tmp = nodes(i).NUM_PUBS) report "Missing publication definition for Node " & integer'image(i) severity FAILURE;
|
||||
end if;
|
||||
|
||||
-- Check SUB Mapping
|
||||
if (nodes(i).NUM_SUBS > 0) then
|
||||
tmp := 0;
|
||||
for j in 0 to subs'length loop
|
||||
if (subs(j).node_id = i) then
|
||||
tmp := tmp + 1;
|
||||
end if;
|
||||
end loop;
|
||||
assert (tmp = nodes(i).NUM_SUBS) report "Missing subscription definition for Node " & integer'image(i) severity FAILURE;
|
||||
end if;
|
||||
|
||||
-- Check SERVICE Mapping
|
||||
if (nodes(i).NUM_SERVICES > 0) then
|
||||
tmp := 0;
|
||||
for j in 0 to services'length loop
|
||||
if (services(j).node_id = i) then
|
||||
tmp := tmp + 1;
|
||||
end if;
|
||||
end loop;
|
||||
assert (tmp = nodes(i).NUM_SERVICES) report "Missing service definition for Node " & integer'image(i) severity FAILURE;
|
||||
end if;
|
||||
|
||||
-- Check ACTION Mapping
|
||||
if (nodes(i).NUM_ACTIONS > 0) then
|
||||
tmp := 0;
|
||||
for j in 0 to actions'length loop
|
||||
if (actions(j).node_id = i) then
|
||||
tmp := tmp + 1;
|
||||
end if;
|
||||
end loop;
|
||||
assert (tmp = nodes(i).NUM_ACTIONS) report "Missing action definition for Node " & integer'image(i) severity FAILURE;
|
||||
end if;
|
||||
end loop;
|
||||
end procedure;
|
||||
|
||||
procedure set_from_qos_profile(profile : in ROS_QOS_PROFILE_TYPE; config : inout CONFIG_TYPE) is
|
||||
begin
|
||||
config.RELIABILITY_QOS := profile.RELIABILITY_QOS;
|
||||
config.DURABILITY_QOS := profile.DURABILITY_QOS;
|
||||
config.HISTORY_QOS := profile.HISTORY_QOS;
|
||||
config.HISTORY_DEPTH := profile.HISTORY_DEPTH;
|
||||
config.DEADLINE_QOS := profile.DEADLINE_QOS;
|
||||
config.LIFESPAN_QOS := profile.LIFESPAN_QOS;
|
||||
config.LIVELINESS_QOS := profile.LIVELINESS_QOS;
|
||||
config.LEASE_DURATION := profile.LEASE_DURATION;
|
||||
-- Since ROS does not use Keyed Topics, we can effectively limit the Resources to the History Depth
|
||||
config.MAX_SAMPLES := profile.HISTORY_DEPTH;
|
||||
config.MAX_INSTANCES := profile.HISTORY_DEPTH;
|
||||
config.MAX_SAMPLES_PER_INSTANCE := profile.HISTORY_DEPTH;
|
||||
end procedure;
|
||||
|
||||
function gen_fqn(ns : string; node : string; name : string) return USER_STRING_TYPE is
|
||||
variable ret : USER_STRING_TYPE;
|
||||
begin
|
||||
ret := EMPTY_USER_STRING;
|
||||
|
||||
is_valid_name(name);
|
||||
|
||||
-- Private Namespace
|
||||
if (name(1) = '~') then
|
||||
|
||||
-- NAMESPACE
|
||||
if (string_len(ns) > 0) then
|
||||
assert(ns(1) = '/') report "Namespace has to be absolute" severity FAILURE;
|
||||
is_valid_name(ns);
|
||||
ret := concat(ns,"/");
|
||||
else
|
||||
ret := gen_user_string("/");
|
||||
end if;
|
||||
-- NODENAME
|
||||
assert(node(1) /= '/') report "Nodename cannot start with '/'" severity FAILURE;
|
||||
is_valid_name(node);
|
||||
ret := concat(ret,node);
|
||||
-- NAME
|
||||
if (string_len(name) > 1) then
|
||||
-- Remove First Character ('~')
|
||||
ret := concat(ret,substr(2,string_len(name),name));
|
||||
end if;
|
||||
-- Absolute Name
|
||||
elsif (name(1) = '/') then
|
||||
ret := name;
|
||||
-- Relative Name
|
||||
else
|
||||
-- NAMESPACE
|
||||
if (string_len(ns) > 0) then
|
||||
assert(ns(1) = '/') report "Namespace has to be absolute" severity FAILURE;
|
||||
is_valid_name(ns);
|
||||
ret := concat(ns,"/");
|
||||
else
|
||||
ret := gen_user_string("/");
|
||||
end if;
|
||||
-- NAME
|
||||
ret := concat(ret,name);
|
||||
end if;
|
||||
|
||||
return ret;
|
||||
end function;
|
||||
|
||||
end package body;
|
||||
@ -473,9 +473,13 @@ package rtps_package is
|
||||
type USER_ENUMERATION_ARRAY_TYPE is array (natural range <>) of std_logic_vector(CDR_ENUMERATION_WIDTH-1 downto 0);
|
||||
type USER_LONG_ARRAY_TYPE is array (natural range <>) of std_logic_vector(CDR_LONG_WIDTH-1 downto 0);
|
||||
|
||||
constant DEFAULT_USER_DOMAIN_TAG : USER_STRING_TYPE := (others => NUL);
|
||||
constant EMPTY_USER_STRING : USER_STRING_TYPE := (others => NUL);
|
||||
constant DEFAULT_USER_DOMAIN_TAG : USER_STRING_TYPE := EMPTY_USER_STRING;
|
||||
|
||||
function gen_user_string(input : string) return string;
|
||||
function string_len (str : string) return natural;
|
||||
function concat(A,B : string) return USER_STRING_TYPE;
|
||||
function substr(first : natural; last : natural; str : string) return USER_STRING_TYPE;
|
||||
|
||||
type CONFIG_TYPE is record
|
||||
-- If Endpoint uses Keye Topics
|
||||
@ -956,4 +960,49 @@ package body rtps_package is
|
||||
AUTOPURGE_DISPOSED_SAMPLES_DELAY => DEFAULT_AUTOPURGE_DISPOSED_SAMPLES_DELAY
|
||||
);
|
||||
|
||||
function string_len(str : string) return natural is
|
||||
variable ret : natural;
|
||||
begin
|
||||
ret := 0;
|
||||
for i in 1 to str'length loop
|
||||
if (str(i) = NUL) then
|
||||
exit;
|
||||
end if;
|
||||
ret := ret + 1;
|
||||
end loop;
|
||||
return ret;
|
||||
end function;
|
||||
|
||||
function concat(A,B : string) return USER_STRING_TYPE is
|
||||
variable ret : USER_STRING_TYPE;
|
||||
variable index : natural;
|
||||
begin
|
||||
assert (string_len(A) + string_len(B) <= USER_STRING_TYPE'length) report "Concatenated String exceeds USER_STRING_TYPE character limit" severity FAILURE;
|
||||
|
||||
ret := EMPTY_USER_STRING;
|
||||
index := 1;
|
||||
for i in 1 to string_len(A) loop
|
||||
ret(index) := A(i);
|
||||
index := index + 1;
|
||||
end loop;
|
||||
for i in 1 to string_len(B) loop
|
||||
ret(index) := B(i);
|
||||
index := index + 1;
|
||||
end loop;
|
||||
return ret;
|
||||
end function;
|
||||
|
||||
function substr(first : natural; last : natural; str : string) return USER_STRING_TYPE is
|
||||
variable ret : USER_STRING_TYPE;
|
||||
begin
|
||||
assert (last >= first) report "SUBSTR: Last index has to come after first index" severity FAILURE;
|
||||
assert (last <= string_len(str)) report "SUBSTR: Last index exceeds string length" severity FAILURE;
|
||||
|
||||
ret := EMPTY_USER_STRING;
|
||||
for i in 1 to last-first+1 loop
|
||||
ret(i) := str(first+i);
|
||||
end loop;
|
||||
return ret;
|
||||
end function;
|
||||
|
||||
end package body;
|
||||
|
||||
Loading…
Reference in New Issue
Block a user