|
|
|
@@ -7,8 +7,8 @@ set -o pipefail
|
|
|
|
repo_root="$(git rev-parse --show-toplevel)"
|
|
|
|
repo_root="$(git rev-parse --show-toplevel)"
|
|
|
|
|
|
|
|
|
|
|
|
if [[ -z $repo_root ]]; then
|
|
|
|
if [[ -z $repo_root ]]; then
|
|
|
|
echo "script must be run from within the rover-ros2 repo" >&2
|
|
|
|
echo "script must be run from within the rover-ros2 repo" >&2
|
|
|
|
exit 1
|
|
|
|
exit 1
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
cd "$repo_root"
|
|
|
|
cd "$repo_root"
|
|
|
|
@@ -23,78 +23,78 @@ TESTS_PASSED=0
|
|
|
|
TESTS_FAILED=0
|
|
|
|
TESTS_FAILED=0
|
|
|
|
|
|
|
|
|
|
|
|
log() {
|
|
|
|
log() {
|
|
|
|
echo -e "${BOLD}${YELLOW}info:${NC} ${1}"
|
|
|
|
echo -e "${BOLD}${YELLOW}info:${NC} ${1}"
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
pass() {
|
|
|
|
pass() {
|
|
|
|
echo -e "${BOLD}${GREEN}pass:${NC} ${1}"
|
|
|
|
echo -e "${BOLD}${GREEN}pass:${NC} ${1}"
|
|
|
|
TESTS_PASSED=$((TESTS_PASSED + 1))
|
|
|
|
TESTS_PASSED=$((TESTS_PASSED + 1))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
fail() {
|
|
|
|
fail() {
|
|
|
|
echo -e "${BOLD}${RED}fail:${NC} ${1}"
|
|
|
|
echo -e "${BOLD}${RED}fail:${NC} ${1}"
|
|
|
|
TESTS_FAILED=$((TESTS_FAILED + 1))
|
|
|
|
TESTS_FAILED=$((TESTS_FAILED + 1))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
cleanup() {
|
|
|
|
cleanup() {
|
|
|
|
log "cleaning up"
|
|
|
|
log "cleaning up"
|
|
|
|
if [[ -n $ANCHOR_PID ]]; then
|
|
|
|
if [[ -n $ANCHOR_PID ]]; then
|
|
|
|
kill -INT -- -"$ANCHOR_PID" 2>/dev/null || true
|
|
|
|
kill -INT -- -"$ANCHOR_PID" 2>/dev/null || true
|
|
|
|
wait "$ANCHOR_PID" 2>/dev/null || true
|
|
|
|
wait "$ANCHOR_PID" 2>/dev/null || true
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
if [[ -n $SOCAT_PID ]]; then
|
|
|
|
if [[ -n $SOCAT_PID ]]; then
|
|
|
|
kill -INT "$SOCAT_PID" 2>/dev/null || true
|
|
|
|
kill -INT "$SOCAT_PID" 2>/dev/null || true
|
|
|
|
wait "$SOCAT_PID" 2>/dev/null || true
|
|
|
|
wait "$SOCAT_PID" 2>/dev/null || true
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
rm -f /tmp/ttyACM9 /tmp/ttyOUT 2>/dev/null || true
|
|
|
|
rm -f /tmp/ttyACM9 /tmp/ttyOUT 2>/dev/null || true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
trap cleanup EXIT
|
|
|
|
trap cleanup EXIT
|
|
|
|
|
|
|
|
|
|
|
|
source_ros2() {
|
|
|
|
source_ros2() {
|
|
|
|
source install/setup.bash
|
|
|
|
source install/setup.bash
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
wait_for_topic() {
|
|
|
|
wait_for_topic() {
|
|
|
|
local topic="$1"
|
|
|
|
local topic="$1"
|
|
|
|
local timeout="${2:-5}"
|
|
|
|
local timeout="${2:-5}"
|
|
|
|
local count=0
|
|
|
|
local count=0
|
|
|
|
while ! ros2 topic list 2>/dev/null | grep -q "^${topic}$"; do
|
|
|
|
while ! ros2 topic list 2>/dev/null | grep -q "^${topic}$"; do
|
|
|
|
sleep 0.5
|
|
|
|
sleep 0.5
|
|
|
|
count=$((count + 1))
|
|
|
|
count=$((count + 1))
|
|
|
|
if [[ $count -ge $((timeout * 2)) ]]; then
|
|
|
|
if [[ $count -ge $((timeout * 2)) ]]; then
|
|
|
|
return 1
|
|
|
|
return 1
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
done
|
|
|
|
done
|
|
|
|
return 0
|
|
|
|
return 0
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
test_mock_connector() {
|
|
|
|
test_mock_connector() {
|
|
|
|
log "testing mock connector"
|
|
|
|
log "testing mock connector"
|
|
|
|
|
|
|
|
|
|
|
|
log "starting anchor with mock connector"
|
|
|
|
log "starting anchor with mock connector"
|
|
|
|
setsid ros2 run anchor_pkg anchor --ros-args -p connector:=mock &
|
|
|
|
setsid ros2 run anchor_pkg anchor --ros-args -p connector:=mock &
|
|
|
|
ANCHOR_PID=$!
|
|
|
|
ANCHOR_PID=$!
|
|
|
|
sleep 2
|
|
|
|
sleep 2
|
|
|
|
|
|
|
|
|
|
|
|
if ! kill -0 "$ANCHOR_PID" 2>/dev/null; then
|
|
|
|
if ! kill -0 "$ANCHOR_PID" 2>/dev/null; then
|
|
|
|
fail "mock connector: anchor failed to start"
|
|
|
|
fail "mock connector: anchor failed to start"
|
|
|
|
return 1
|
|
|
|
return 1
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
if ! wait_for_topic "/anchor/to_vic/relay" 10; then
|
|
|
|
if ! wait_for_topic "/anchor/to_vic/relay" 10; then
|
|
|
|
fail "mock connector: topics not available"
|
|
|
|
fail "mock connector: topics not available"
|
|
|
|
kill -INT -- -"$ANCHOR_PID" 2>/dev/null || true
|
|
|
|
kill -INT -- -"$ANCHOR_PID" 2>/dev/null || true
|
|
|
|
return 1
|
|
|
|
return 1
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
log "anchor started successfully"
|
|
|
|
log "anchor started successfully"
|
|
|
|
|
|
|
|
|
|
|
|
# relay -> debug
|
|
|
|
# relay -> debug
|
|
|
|
log "testing relay -> debug"
|
|
|
|
log "testing relay -> debug"
|
|
|
|
|
|
|
|
|
|
|
|
local debug_output
|
|
|
|
local debug_output
|
|
|
|
debug_output=$(timeout 5 bash -c '
|
|
|
|
debug_output=$(timeout 5 bash -c '
|
|
|
|
ros2 topic echo --once /anchor/to_vic/debug &
|
|
|
|
ros2 topic echo --once /anchor/to_vic/debug &
|
|
|
|
ECHO_PID=$!
|
|
|
|
ECHO_PID=$!
|
|
|
|
sleep 0.5
|
|
|
|
sleep 0.5
|
|
|
|
@@ -102,17 +102,17 @@ test_mock_connector() {
|
|
|
|
wait $ECHO_PID
|
|
|
|
wait $ECHO_PID
|
|
|
|
' 2>/dev/null) || true
|
|
|
|
' 2>/dev/null) || true
|
|
|
|
|
|
|
|
|
|
|
|
if [[ -n "$debug_output" ]] && echo "$debug_output" | grep -q "can_relay_tovic,core,50"; then
|
|
|
|
if [[ -n $debug_output ]] && echo "$debug_output" | grep -q "can_relay_tovic,core,50"; then
|
|
|
|
pass "mock connector: relay -> debug"
|
|
|
|
pass "mock connector: relay -> debug"
|
|
|
|
else
|
|
|
|
else
|
|
|
|
fail "mock connector: relay -> debug"
|
|
|
|
fail "mock connector: relay -> debug"
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
# mock_mcu -> from_vic/core
|
|
|
|
# mock_mcu -> from_vic/core
|
|
|
|
log "testing mock_mcu (core) -> from_vic/core"
|
|
|
|
log "testing mock_mcu (core) -> from_vic/core"
|
|
|
|
|
|
|
|
|
|
|
|
local core_output=""
|
|
|
|
local core_output=""
|
|
|
|
core_output=$(timeout 5 bash -c '
|
|
|
|
core_output=$(timeout 5 bash -c '
|
|
|
|
ros2 topic echo --once /anchor/from_vic/core &
|
|
|
|
ros2 topic echo --once /anchor/from_vic/core &
|
|
|
|
ECHO_PID=$!
|
|
|
|
ECHO_PID=$!
|
|
|
|
sleep 0.5
|
|
|
|
sleep 0.5
|
|
|
|
@@ -120,17 +120,17 @@ test_mock_connector() {
|
|
|
|
wait $ECHO_PID || true
|
|
|
|
wait $ECHO_PID || true
|
|
|
|
' 2>/dev/null || true) || core_output=""
|
|
|
|
' 2>/dev/null || true) || core_output=""
|
|
|
|
|
|
|
|
|
|
|
|
if [[ -n "$core_output" ]] && echo "$core_output" | grep -q "mcu_name: core" && echo "$core_output" | grep -q "command_id: 10"; then
|
|
|
|
if [[ -n $core_output ]] && echo "$core_output" | grep -q "mcu_name: core" && echo "$core_output" | grep -q "command_id: 10"; then
|
|
|
|
pass "mock connector: mock_mcu -> from_vic/core"
|
|
|
|
pass "mock connector: mock_mcu -> from_vic/core"
|
|
|
|
else
|
|
|
|
else
|
|
|
|
fail "mock connector: mock_mcu -> from_vic/core"
|
|
|
|
fail "mock connector: mock_mcu -> from_vic/core"
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
# mock_mcu -> from_vic/arm
|
|
|
|
# mock_mcu -> from_vic/arm
|
|
|
|
log "testing mock_mcu (arm) -> from_vic/arm"
|
|
|
|
log "testing mock_mcu (arm) -> from_vic/arm"
|
|
|
|
|
|
|
|
|
|
|
|
local arm_output
|
|
|
|
local arm_output
|
|
|
|
arm_output=$(timeout 5 bash -c '
|
|
|
|
arm_output=$(timeout 5 bash -c '
|
|
|
|
ros2 topic echo --once /anchor/from_vic/arm &
|
|
|
|
ros2 topic echo --once /anchor/from_vic/arm &
|
|
|
|
ECHO_PID=$!
|
|
|
|
ECHO_PID=$!
|
|
|
|
sleep 0.5
|
|
|
|
sleep 0.5
|
|
|
|
@@ -138,17 +138,17 @@ test_mock_connector() {
|
|
|
|
wait $ECHO_PID
|
|
|
|
wait $ECHO_PID
|
|
|
|
' 2>/dev/null) || true
|
|
|
|
' 2>/dev/null) || true
|
|
|
|
|
|
|
|
|
|
|
|
if [[ -n "$arm_output" ]] && echo "$arm_output" | grep -q "mcu_name: arm" && echo "$arm_output" | grep -q "command_id: 55"; then
|
|
|
|
if [[ -n $arm_output ]] && echo "$arm_output" | grep -q "mcu_name: arm" && echo "$arm_output" | grep -q "command_id: 55"; then
|
|
|
|
pass "mock connector: mock_mcu -> from_vic/arm"
|
|
|
|
pass "mock connector: mock_mcu -> from_vic/arm"
|
|
|
|
else
|
|
|
|
else
|
|
|
|
fail "mock connector: mock_mcu -> from_vic/arm"
|
|
|
|
fail "mock connector: mock_mcu -> from_vic/arm"
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
# mock_mcu -> from_vic/bio
|
|
|
|
# mock_mcu -> from_vic/bio
|
|
|
|
log "testing mock_mcu (citadel) -> from_vic/bio"
|
|
|
|
log "testing mock_mcu (citadel) -> from_vic/bio"
|
|
|
|
|
|
|
|
|
|
|
|
local bio_output
|
|
|
|
local bio_output
|
|
|
|
bio_output=$(timeout 5 bash -c '
|
|
|
|
bio_output=$(timeout 5 bash -c '
|
|
|
|
ros2 topic echo --once /anchor/from_vic/bio &
|
|
|
|
ros2 topic echo --once /anchor/from_vic/bio &
|
|
|
|
ECHO_PID=$!
|
|
|
|
ECHO_PID=$!
|
|
|
|
sleep 0.5
|
|
|
|
sleep 0.5
|
|
|
|
@@ -156,17 +156,17 @@ test_mock_connector() {
|
|
|
|
wait $ECHO_PID
|
|
|
|
wait $ECHO_PID
|
|
|
|
' 2>/dev/null) || true
|
|
|
|
' 2>/dev/null) || true
|
|
|
|
|
|
|
|
|
|
|
|
if echo "$bio_output" | grep -q "mcu_name: citadel" && echo "$bio_output" | grep -q "command_id: 20"; then
|
|
|
|
if echo "$bio_output" | grep -q "mcu_name: citadel" && echo "$bio_output" | grep -q "command_id: 20"; then
|
|
|
|
pass "mock connector: mock_mcu -> from_vic/bio"
|
|
|
|
pass "mock connector: mock_mcu -> from_vic/bio"
|
|
|
|
else
|
|
|
|
else
|
|
|
|
fail "mock connector: mock_mcu -> from_vic/bio"
|
|
|
|
fail "mock connector: mock_mcu -> from_vic/bio"
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
# relay_string -> debug
|
|
|
|
# relay_string -> debug
|
|
|
|
log "testing relay_string -> debug"
|
|
|
|
log "testing relay_string -> debug"
|
|
|
|
|
|
|
|
|
|
|
|
local relay_string_output
|
|
|
|
local relay_string_output
|
|
|
|
relay_string_output=$(timeout 5 bash -c '
|
|
|
|
relay_string_output=$(timeout 5 bash -c '
|
|
|
|
ros2 topic echo --once /anchor/to_vic/debug &
|
|
|
|
ros2 topic echo --once /anchor/to_vic/debug &
|
|
|
|
ECHO_PID=$!
|
|
|
|
ECHO_PID=$!
|
|
|
|
sleep 0.5
|
|
|
|
sleep 0.5
|
|
|
|
@@ -174,55 +174,55 @@ test_mock_connector() {
|
|
|
|
wait $ECHO_PID
|
|
|
|
wait $ECHO_PID
|
|
|
|
' 2>/dev/null) || true
|
|
|
|
' 2>/dev/null) || true
|
|
|
|
|
|
|
|
|
|
|
|
if [[ -n "$relay_string_output" ]] && echo "$relay_string_output" | grep -q "test_raw_string_data"; then
|
|
|
|
if [[ -n $relay_string_output ]] && echo "$relay_string_output" | grep -q "test_raw_string_data"; then
|
|
|
|
pass "mock connector: relay_string -> debug"
|
|
|
|
pass "mock connector: relay_string -> debug"
|
|
|
|
else
|
|
|
|
else
|
|
|
|
fail "mock connector: relay_string -> debug"
|
|
|
|
fail "mock connector: relay_string -> debug"
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
kill -INT -- -"$ANCHOR_PID" 2>/dev/null || true
|
|
|
|
kill -INT -- -"$ANCHOR_PID" 2>/dev/null || true
|
|
|
|
wait "$ANCHOR_PID" 2>/dev/null || true
|
|
|
|
wait "$ANCHOR_PID" 2>/dev/null || true
|
|
|
|
ANCHOR_PID=""
|
|
|
|
ANCHOR_PID=""
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
test_serial_connector() {
|
|
|
|
test_serial_connector() {
|
|
|
|
log "testing serial connector"
|
|
|
|
log "testing serial connector"
|
|
|
|
|
|
|
|
|
|
|
|
log "creating virtual serial ports with socat"
|
|
|
|
log "creating virtual serial ports with socat"
|
|
|
|
socat pty,raw,echo=0,link=/tmp/ttyACM9 pty,raw,echo=0,link=/tmp/ttyOUT 2>/dev/null &
|
|
|
|
socat pty,raw,echo=0,link=/tmp/ttyACM9 pty,raw,echo=0,link=/tmp/ttyOUT 2>/dev/null &
|
|
|
|
SOCAT_PID=$!
|
|
|
|
SOCAT_PID=$!
|
|
|
|
sleep 2
|
|
|
|
sleep 2
|
|
|
|
|
|
|
|
|
|
|
|
if ! kill -0 "$SOCAT_PID" 2>/dev/null; then
|
|
|
|
if ! kill -0 "$SOCAT_PID" 2>/dev/null; then
|
|
|
|
fail "serial connector: failed to create virtual serial ports"
|
|
|
|
fail "serial connector: failed to create virtual serial ports"
|
|
|
|
return 1
|
|
|
|
return 1
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
log "starting anchor with serial connector (override: /tmp/ttyACM9)"
|
|
|
|
log "starting anchor with serial connector (override: /tmp/ttyACM9)"
|
|
|
|
setsid ros2 run anchor_pkg anchor --ros-args -p connector:=serial -p serial_override:=/tmp/ttyACM9 &
|
|
|
|
setsid ros2 run anchor_pkg anchor --ros-args -p connector:=serial -p serial_override:=/tmp/ttyACM9 &
|
|
|
|
ANCHOR_PID=$!
|
|
|
|
ANCHOR_PID=$!
|
|
|
|
sleep 2
|
|
|
|
sleep 2
|
|
|
|
|
|
|
|
|
|
|
|
if ! kill -0 "$ANCHOR_PID" 2>/dev/null; then
|
|
|
|
if ! kill -0 "$ANCHOR_PID" 2>/dev/null; then
|
|
|
|
fail "serial connector: anchor failed to start"
|
|
|
|
fail "serial connector: anchor failed to start"
|
|
|
|
kill -INT "$SOCAT_PID" 2>/dev/null || true
|
|
|
|
kill -INT "$SOCAT_PID" 2>/dev/null || true
|
|
|
|
return 1
|
|
|
|
return 1
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
if ! wait_for_topic "/anchor/to_vic/relay" 10; then
|
|
|
|
if ! wait_for_topic "/anchor/to_vic/relay" 10; then
|
|
|
|
fail "serial connector: topics not available"
|
|
|
|
fail "serial connector: topics not available"
|
|
|
|
kill -INT -- -"$ANCHOR_PID" 2>/dev/null || true
|
|
|
|
kill -INT -- -"$ANCHOR_PID" 2>/dev/null || true
|
|
|
|
kill -INT "$SOCAT_PID" 2>/dev/null || true
|
|
|
|
kill -INT "$SOCAT_PID" 2>/dev/null || true
|
|
|
|
return 1
|
|
|
|
return 1
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
pass "serial connector: anchor starts with virtual serial"
|
|
|
|
pass "serial connector: anchor starts with virtual serial"
|
|
|
|
|
|
|
|
|
|
|
|
# relay_string -> debug
|
|
|
|
# relay_string -> debug
|
|
|
|
log "testing relay_string -> debug"
|
|
|
|
log "testing relay_string -> debug"
|
|
|
|
|
|
|
|
|
|
|
|
local relay_string_output
|
|
|
|
local relay_string_output
|
|
|
|
relay_string_output=$(timeout 5 bash -c '
|
|
|
|
relay_string_output=$(timeout 5 bash -c '
|
|
|
|
ros2 topic echo --once /anchor/to_vic/debug &
|
|
|
|
ros2 topic echo --once /anchor/to_vic/debug &
|
|
|
|
ECHO_PID=$!
|
|
|
|
ECHO_PID=$!
|
|
|
|
sleep 0.5
|
|
|
|
sleep 0.5
|
|
|
|
@@ -230,49 +230,49 @@ test_serial_connector() {
|
|
|
|
wait $ECHO_PID
|
|
|
|
wait $ECHO_PID
|
|
|
|
' 2>/dev/null) || true
|
|
|
|
' 2>/dev/null) || true
|
|
|
|
|
|
|
|
|
|
|
|
if [[ -n "$relay_string_output" ]] && echo "$relay_string_output" | grep -q "serial_test_string"; then
|
|
|
|
if [[ -n $relay_string_output ]] && echo "$relay_string_output" | grep -q "serial_test_string"; then
|
|
|
|
pass "serial connector: relay_string -> debug"
|
|
|
|
pass "serial connector: relay_string -> debug"
|
|
|
|
else
|
|
|
|
else
|
|
|
|
fail "serial connector: relay_string -> debug"
|
|
|
|
fail "serial connector: relay_string -> debug"
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
log "serial data transfer tests skipped (virtual pty limitation)"
|
|
|
|
log "serial data transfer tests skipped (virtual pty limitation)"
|
|
|
|
|
|
|
|
|
|
|
|
kill -INT -- -"$ANCHOR_PID" 2>/dev/null || true
|
|
|
|
kill -INT -- -"$ANCHOR_PID" 2>/dev/null || true
|
|
|
|
wait "$ANCHOR_PID" 2>/dev/null || true
|
|
|
|
wait "$ANCHOR_PID" 2>/dev/null || true
|
|
|
|
ANCHOR_PID=""
|
|
|
|
ANCHOR_PID=""
|
|
|
|
kill -INT "$SOCAT_PID" 2>/dev/null || true
|
|
|
|
kill -INT "$SOCAT_PID" 2>/dev/null || true
|
|
|
|
wait "$SOCAT_PID" 2>/dev/null || true
|
|
|
|
wait "$SOCAT_PID" 2>/dev/null || true
|
|
|
|
SOCAT_PID=""
|
|
|
|
SOCAT_PID=""
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
test_can_connector() {
|
|
|
|
test_can_connector() {
|
|
|
|
log "testing CAN connector"
|
|
|
|
log "testing CAN connector"
|
|
|
|
|
|
|
|
|
|
|
|
log "starting anchor with CAN connector (override: vcan0)"
|
|
|
|
log "starting anchor with CAN connector (override: vcan0)"
|
|
|
|
setsid ros2 run anchor_pkg anchor --ros-args -p connector:=can -p can_override:=vcan0 &
|
|
|
|
setsid ros2 run anchor_pkg anchor --ros-args -p connector:=can -p can_override:=vcan0 &
|
|
|
|
ANCHOR_PID=$!
|
|
|
|
ANCHOR_PID=$!
|
|
|
|
sleep 2
|
|
|
|
sleep 2
|
|
|
|
|
|
|
|
|
|
|
|
if ! kill -0 "$ANCHOR_PID" 2>/dev/null; then
|
|
|
|
if ! kill -0 "$ANCHOR_PID" 2>/dev/null; then
|
|
|
|
fail "CAN connector: anchor failed to start"
|
|
|
|
fail "CAN connector: anchor failed to start"
|
|
|
|
return 1
|
|
|
|
return 1
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
if ! wait_for_topic "/anchor/to_vic/relay" 10; then
|
|
|
|
if ! wait_for_topic "/anchor/to_vic/relay" 10; then
|
|
|
|
fail "CAN connector: topics not available"
|
|
|
|
fail "CAN connector: topics not available"
|
|
|
|
kill -INT -- -"$ANCHOR_PID" 2>/dev/null || true
|
|
|
|
kill -INT -- -"$ANCHOR_PID" 2>/dev/null || true
|
|
|
|
return 1
|
|
|
|
return 1
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
log "anchor started successfully"
|
|
|
|
log "anchor started successfully"
|
|
|
|
sleep 1
|
|
|
|
sleep 1
|
|
|
|
|
|
|
|
|
|
|
|
# relay -> CAN bus
|
|
|
|
# relay -> CAN bus
|
|
|
|
log "testing relay -> CAN bus"
|
|
|
|
log "testing relay -> CAN bus"
|
|
|
|
|
|
|
|
|
|
|
|
local can_output
|
|
|
|
local can_output
|
|
|
|
can_output=$(timeout 8 bash -c '
|
|
|
|
can_output=$(timeout 8 bash -c '
|
|
|
|
candump -n 1 vcan0 &
|
|
|
|
candump -n 1 vcan0 &
|
|
|
|
DUMP_PID=$!
|
|
|
|
DUMP_PID=$!
|
|
|
|
sleep 1
|
|
|
|
sleep 1
|
|
|
|
@@ -282,18 +282,18 @@ test_can_connector() {
|
|
|
|
wait $DUMP_PID
|
|
|
|
wait $DUMP_PID
|
|
|
|
' 2>/dev/null) || true
|
|
|
|
' 2>/dev/null) || true
|
|
|
|
|
|
|
|
|
|
|
|
# core=1, int16x4=2, cmd=30 -> id = (1<<8)|(2<<6)|30 = 0x19E
|
|
|
|
# core=1, int16x4=2, cmd=30 -> id = (1<<8)|(2<<6)|30 = 0x19E
|
|
|
|
if echo "$can_output" | grep -qi "19E"; then
|
|
|
|
if echo "$can_output" | grep -qi "19E"; then
|
|
|
|
pass "CAN connector: relay -> CAN bus"
|
|
|
|
pass "CAN connector: relay -> CAN bus"
|
|
|
|
else
|
|
|
|
else
|
|
|
|
fail "CAN connector: relay -> CAN bus (got: $can_output)"
|
|
|
|
fail "CAN connector: relay -> CAN bus (got: $can_output)"
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
# CAN -> from_vic/core
|
|
|
|
# CAN -> from_vic/core
|
|
|
|
log "testing CAN bus -> from_vic/core"
|
|
|
|
log "testing CAN bus -> from_vic/core"
|
|
|
|
|
|
|
|
|
|
|
|
local core_output
|
|
|
|
local core_output
|
|
|
|
core_output=$(timeout 5 bash -c '
|
|
|
|
core_output=$(timeout 5 bash -c '
|
|
|
|
ros2 topic echo --once /anchor/from_vic/core &
|
|
|
|
ros2 topic echo --once /anchor/from_vic/core &
|
|
|
|
ECHO_PID=$!
|
|
|
|
ECHO_PID=$!
|
|
|
|
sleep 1
|
|
|
|
sleep 1
|
|
|
|
@@ -303,17 +303,17 @@ test_can_connector() {
|
|
|
|
wait $ECHO_PID
|
|
|
|
wait $ECHO_PID
|
|
|
|
' 2>/dev/null) || true
|
|
|
|
' 2>/dev/null) || true
|
|
|
|
|
|
|
|
|
|
|
|
if echo "$core_output" | grep -q "mcu_name: core" && echo "$core_output" | grep -q "command_id: 15"; then
|
|
|
|
if echo "$core_output" | grep -q "mcu_name: core" && echo "$core_output" | grep -q "command_id: 15"; then
|
|
|
|
pass "CAN connector: CAN -> from_vic/core"
|
|
|
|
pass "CAN connector: CAN -> from_vic/core"
|
|
|
|
else
|
|
|
|
else
|
|
|
|
fail "CAN connector: CAN -> from_vic/core"
|
|
|
|
fail "CAN connector: CAN -> from_vic/core"
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
# CAN -> from_vic/arm
|
|
|
|
# CAN -> from_vic/arm
|
|
|
|
log "testing CAN bus -> from_vic/arm"
|
|
|
|
log "testing CAN bus -> from_vic/arm"
|
|
|
|
|
|
|
|
|
|
|
|
local arm_output
|
|
|
|
local arm_output
|
|
|
|
arm_output=$(timeout 5 bash -c '
|
|
|
|
arm_output=$(timeout 5 bash -c '
|
|
|
|
ros2 topic echo --once /anchor/from_vic/arm &
|
|
|
|
ros2 topic echo --once /anchor/from_vic/arm &
|
|
|
|
ECHO_PID=$!
|
|
|
|
ECHO_PID=$!
|
|
|
|
sleep 1
|
|
|
|
sleep 1
|
|
|
|
@@ -323,17 +323,17 @@ test_can_connector() {
|
|
|
|
wait $ECHO_PID
|
|
|
|
wait $ECHO_PID
|
|
|
|
' 2>/dev/null) || true
|
|
|
|
' 2>/dev/null) || true
|
|
|
|
|
|
|
|
|
|
|
|
if echo "$arm_output" | grep -q "mcu_name: arm" && echo "$arm_output" | grep -q "command_id: 20"; then
|
|
|
|
if echo "$arm_output" | grep -q "mcu_name: arm" && echo "$arm_output" | grep -q "command_id: 20"; then
|
|
|
|
pass "CAN connector: CAN -> from_vic/arm"
|
|
|
|
pass "CAN connector: CAN -> from_vic/arm"
|
|
|
|
else
|
|
|
|
else
|
|
|
|
fail "CAN connector: CAN -> from_vic/arm"
|
|
|
|
fail "CAN connector: CAN -> from_vic/arm"
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
# double data type
|
|
|
|
# double data type
|
|
|
|
log "testing CAN double data type"
|
|
|
|
log "testing CAN double data type"
|
|
|
|
|
|
|
|
|
|
|
|
local double_output
|
|
|
|
local double_output
|
|
|
|
double_output=$(timeout 8 bash -c '
|
|
|
|
double_output=$(timeout 8 bash -c '
|
|
|
|
ros2 topic echo --once /anchor/from_vic/core &
|
|
|
|
ros2 topic echo --once /anchor/from_vic/core &
|
|
|
|
ECHO_PID=$!
|
|
|
|
ECHO_PID=$!
|
|
|
|
sleep 1
|
|
|
|
sleep 1
|
|
|
|
@@ -345,17 +345,17 @@ test_can_connector() {
|
|
|
|
wait $ECHO_PID
|
|
|
|
wait $ECHO_PID
|
|
|
|
' 2>/dev/null) || true
|
|
|
|
' 2>/dev/null) || true
|
|
|
|
|
|
|
|
|
|
|
|
if echo "$double_output" | grep -q "mcu_name: core" && echo "$double_output" | grep -q "command_id: 5"; then
|
|
|
|
if echo "$double_output" | grep -q "mcu_name: core" && echo "$double_output" | grep -q "command_id: 5"; then
|
|
|
|
pass "CAN connector: double data type"
|
|
|
|
pass "CAN connector: double data type"
|
|
|
|
else
|
|
|
|
else
|
|
|
|
fail "CAN connector: double data type"
|
|
|
|
fail "CAN connector: double data type"
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
# float32x2 data type
|
|
|
|
# float32x2 data type
|
|
|
|
log "testing CAN float32x2 data type"
|
|
|
|
log "testing CAN float32x2 data type"
|
|
|
|
|
|
|
|
|
|
|
|
local float_output
|
|
|
|
local float_output
|
|
|
|
float_output=$(timeout 8 bash -c '
|
|
|
|
float_output=$(timeout 8 bash -c '
|
|
|
|
ros2 topic echo --once /anchor/from_vic/core &
|
|
|
|
ros2 topic echo --once /anchor/from_vic/core &
|
|
|
|
ECHO_PID=$!
|
|
|
|
ECHO_PID=$!
|
|
|
|
sleep 1
|
|
|
|
sleep 1
|
|
|
|
@@ -367,81 +367,81 @@ test_can_connector() {
|
|
|
|
wait $ECHO_PID
|
|
|
|
wait $ECHO_PID
|
|
|
|
' 2>/dev/null) || true
|
|
|
|
' 2>/dev/null) || true
|
|
|
|
|
|
|
|
|
|
|
|
if echo "$float_output" | grep -q "mcu_name: core" && echo "$float_output" | grep -q "command_id: 10"; then
|
|
|
|
if echo "$float_output" | grep -q "mcu_name: core" && echo "$float_output" | grep -q "command_id: 10"; then
|
|
|
|
pass "CAN connector: float32x2 data type"
|
|
|
|
pass "CAN connector: float32x2 data type"
|
|
|
|
else
|
|
|
|
else
|
|
|
|
fail "CAN connector: float32x2 data type"
|
|
|
|
fail "CAN connector: float32x2 data type"
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
kill -INT -- -"$ANCHOR_PID" 2>/dev/null || true
|
|
|
|
kill -INT -- -"$ANCHOR_PID" 2>/dev/null || true
|
|
|
|
wait "$ANCHOR_PID" 2>/dev/null || true
|
|
|
|
wait "$ANCHOR_PID" 2>/dev/null || true
|
|
|
|
ANCHOR_PID=""
|
|
|
|
ANCHOR_PID=""
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
check_prerequisites() {
|
|
|
|
check_prerequisites() {
|
|
|
|
log "checking prerequisites"
|
|
|
|
log "checking prerequisites"
|
|
|
|
local missing=0
|
|
|
|
local missing=0
|
|
|
|
|
|
|
|
|
|
|
|
if [[ ! -f install/setup.bash ]]; then
|
|
|
|
if [[ ! -f install/setup.bash ]]; then
|
|
|
|
fail "install/setup.bash not found; run 'colcon build' first"
|
|
|
|
fail "install/setup.bash not found; run 'colcon build' first"
|
|
|
|
missing=1
|
|
|
|
missing=1
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
if ! command -v socat &>/dev/null; then
|
|
|
|
if ! command -v socat &>/dev/null; then
|
|
|
|
fail "socat not found; install it or use 'nix develop'"
|
|
|
|
fail "socat not found; install it or use 'nix develop'"
|
|
|
|
missing=1
|
|
|
|
missing=1
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
if ! command -v cansend &>/dev/null || ! command -v candump &>/dev/null; then
|
|
|
|
if ! command -v cansend &>/dev/null || ! command -v candump &>/dev/null; then
|
|
|
|
fail "can-utils (cansend/candump) not found; install it or use 'nix develop'"
|
|
|
|
fail "can-utils (cansend/candump) not found; install it or use 'nix develop'"
|
|
|
|
missing=1
|
|
|
|
missing=1
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
if ! ip link show vcan0 &>/dev/null; then
|
|
|
|
if ! ip link show vcan0 &>/dev/null; then
|
|
|
|
fail "vcan0 interface not found"
|
|
|
|
fail "vcan0 interface not found"
|
|
|
|
log " create it with:"
|
|
|
|
log " create it with:"
|
|
|
|
log " sudo ip link add dev vcan0 type vcan"
|
|
|
|
log " sudo ip link add dev vcan0 type vcan"
|
|
|
|
log " sudo ip link set vcan0 up"
|
|
|
|
log " sudo ip link set vcan0 up"
|
|
|
|
missing=1
|
|
|
|
missing=1
|
|
|
|
elif ! ip link show vcan0 | grep -q ",UP"; then
|
|
|
|
elif ! ip link show vcan0 | grep -q ",UP"; then
|
|
|
|
fail "vcan0 exists but is not UP"
|
|
|
|
fail "vcan0 exists but is not UP"
|
|
|
|
log " enable it with: sudo ip link set vcan0 up"
|
|
|
|
log " enable it with: sudo ip link set vcan0 up"
|
|
|
|
missing=1
|
|
|
|
missing=1
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
if [[ $missing -eq 1 ]]; then
|
|
|
|
if [[ $missing -eq 1 ]]; then
|
|
|
|
echo ""
|
|
|
|
echo ""
|
|
|
|
log "prerequisites not met"
|
|
|
|
log "prerequisites not met"
|
|
|
|
exit 1
|
|
|
|
exit 1
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
log "all prerequisites met"
|
|
|
|
log "all prerequisites met"
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
main() {
|
|
|
|
main() {
|
|
|
|
echo ""
|
|
|
|
echo ""
|
|
|
|
log "anchor connector test suite"
|
|
|
|
log "anchor connector test suite"
|
|
|
|
echo ""
|
|
|
|
echo ""
|
|
|
|
|
|
|
|
|
|
|
|
check_prerequisites
|
|
|
|
check_prerequisites
|
|
|
|
|
|
|
|
|
|
|
|
log "sourcing ROS2 workspace"
|
|
|
|
log "sourcing ROS2 workspace"
|
|
|
|
source_ros2
|
|
|
|
source_ros2
|
|
|
|
|
|
|
|
|
|
|
|
test_mock_connector
|
|
|
|
test_mock_connector
|
|
|
|
test_serial_connector
|
|
|
|
test_serial_connector
|
|
|
|
test_can_connector
|
|
|
|
test_can_connector
|
|
|
|
|
|
|
|
|
|
|
|
echo ""
|
|
|
|
echo ""
|
|
|
|
log "test summary"
|
|
|
|
log "test summary"
|
|
|
|
echo -e "${BOLD}${GREEN}passed:${NC} $TESTS_PASSED"
|
|
|
|
echo -e "${BOLD}${GREEN}passed:${NC} $TESTS_PASSED"
|
|
|
|
echo -e "${BOLD}${RED}failed:${NC} $TESTS_FAILED"
|
|
|
|
echo -e "${BOLD}${RED}failed:${NC} $TESTS_FAILED"
|
|
|
|
echo ""
|
|
|
|
echo ""
|
|
|
|
|
|
|
|
|
|
|
|
if [[ $TESTS_FAILED -gt 0 ]]; then
|
|
|
|
if [[ $TESTS_FAILED -gt 0 ]]; then
|
|
|
|
exit 1
|
|
|
|
exit 1
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
exit 0
|
|
|
|
exit 0
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
main "$@"
|
|
|
|
main "$@"
|
|
|
|
|