mirror of
https://github.com/PX4/PX4-Autopilot.git
synced 2026-05-30 18:06:39 +08:00
Testing cleanup from Daniel Agar
This commit is contained in:
+1
-1
@@ -246,7 +246,7 @@ endforeach()
|
|||||||
px4_add_git_submodule(TARGET git_genmsg PATH "Tools/genmsg")
|
px4_add_git_submodule(TARGET git_genmsg PATH "Tools/genmsg")
|
||||||
px4_add_git_submodule(TARGET git_gencpp PATH "Tools/gencpp")
|
px4_add_git_submodule(TARGET git_gencpp PATH "Tools/gencpp")
|
||||||
px4_add_git_submodule(TARGET git_mavlink PATH "mavlink/include/mavlink/v1.0")
|
px4_add_git_submodule(TARGET git_mavlink PATH "mavlink/include/mavlink/v1.0")
|
||||||
px4_add_git_submodule(TARGET git_gtest PATH "unittets/gtest")
|
px4_add_git_submodule(TARGET git_gtest PATH "unittests/gtest")
|
||||||
px4_add_git_submodule(TARGET git_uavcan PATH "src/modules/uavcan/libuavcan")
|
px4_add_git_submodule(TARGET git_uavcan PATH "src/modules/uavcan/libuavcan")
|
||||||
px4_add_git_submodule(TARGET git_nuttx PATH "NuttX")
|
px4_add_git_submodule(TARGET git_nuttx PATH "NuttX")
|
||||||
px4_add_git_submodule(TARGET git_driverframework PATH "src/lib/DriverFramework")
|
px4_add_git_submodule(TARGET git_driverframework PATH "src/lib/DriverFramework")
|
||||||
|
|||||||
@@ -174,9 +174,6 @@ posix_sitl_default:
|
|||||||
posix_sitl_lpe:
|
posix_sitl_lpe:
|
||||||
$(call cmake-build,$@)
|
$(call cmake-build,$@)
|
||||||
|
|
||||||
posix_sitl_test:
|
|
||||||
$(call cmake-build,$@)
|
|
||||||
|
|
||||||
posix_sitl_replay:
|
posix_sitl_replay:
|
||||||
$(call cmake-build,$@)
|
$(call cmake-build,$@)
|
||||||
|
|
||||||
@@ -271,14 +268,14 @@ checks_uavcan: \
|
|||||||
check_px4fmu-v4_default_and_uavcan
|
check_px4fmu-v4_default_and_uavcan
|
||||||
|
|
||||||
checks_sitls: \
|
checks_sitls: \
|
||||||
check_posix_sitl_default \
|
check_posix_sitl_default
|
||||||
check_posix_sitl_test \
|
|
||||||
|
|
||||||
checks_last: \
|
checks_last: \
|
||||||
check_unittest \
|
check_tests \
|
||||||
check_format \
|
check_format \
|
||||||
|
|
||||||
check: checks_defaults checks_tests checks_alts checks_uavcan checks_bootloaders checks_sitls checks_last
|
check: checks_defaults checks_tests checks_alts checks_uavcan checks_bootloaders checks_last
|
||||||
|
quick_check: check_px4fmu-v2_default check_px4fmu-v4_default check_tests check_format
|
||||||
|
|
||||||
check_format:
|
check_format:
|
||||||
$(call colorecho,"Checking formatting with astyle")
|
$(call colorecho,"Checking formatting with astyle")
|
||||||
@@ -300,15 +297,18 @@ ifeq ($(VECTORCONTROL),1)
|
|||||||
@rm -rf ROMFS/px4fmu_common/uavcan
|
@rm -rf ROMFS/px4fmu_common/uavcan
|
||||||
endif
|
endif
|
||||||
|
|
||||||
unittest: posix_sitl_test
|
unittest: posix_sitl_default
|
||||||
$(call cmake-build-other,unittest, ../unittests)
|
$(call cmake-build-other,unittest, ../unittests)
|
||||||
@(cd build_unittest && ctest -j2 --output-on-failure)
|
@(cd build_unittest && ctest -j2 --output-on-failure)
|
||||||
|
|
||||||
tests: posix_sitl_test unittest
|
run_tests_posix: posix_sitl_default
|
||||||
|
@mkdir -p build_posix_sitl_default/src/firmware/posix/rootfs/fs/microsd
|
||||||
test_onboard_sitl:
|
@mkdir -p build_posix_sitl_default/src/firmware/posix/rootfs/eeprom
|
||||||
@HEADLESS=1 make posix_sitl_test gazebo_iris
|
@touch build_posix_sitl_default/src/firmware/posix/rootfs/eeprom/parameters
|
||||||
|
@(cd build_posix_sitl_default/src/firmware/posix && ./mainapp -d ../../../../posix-configs/SITL/init/rcS_tests | tee test_output)
|
||||||
|
@(cd build_posix_sitl_default/src/firmware/posix && grep --color=always "All tests passed" test_output)
|
||||||
|
|
||||||
|
tests: check_unittest run_tests_posix
|
||||||
|
|
||||||
# QGroundControl flashable firmware
|
# QGroundControl flashable firmware
|
||||||
qgc_firmware: \
|
qgc_firmware: \
|
||||||
|
|||||||
@@ -111,87 +111,22 @@ fi
|
|||||||
|
|
||||||
sh /etc/init.d/rc.sensors
|
sh /etc/init.d/rc.sensors
|
||||||
|
|
||||||
# Check for flow sensor
|
ver all
|
||||||
if px4flow start
|
|
||||||
then
|
|
||||||
fi
|
|
||||||
|
|
||||||
if ll40ls start
|
|
||||||
then
|
|
||||||
fi
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Run unit tests at board boot, reporting failure as needed.
|
# Run unit tests at board boot, reporting failure as needed.
|
||||||
# Add new unit tests using the same pattern as below.
|
# Add new unit tests using the same pattern as below.
|
||||||
#
|
#
|
||||||
|
|
||||||
echo
|
|
||||||
echo "--------------------------------------------------------------------------------"
|
|
||||||
echo "[mavlink_tests] STARTING TEST"
|
|
||||||
if mavlink_tests
|
|
||||||
then
|
|
||||||
echo "[mavlink_tests] PASS"
|
|
||||||
else
|
|
||||||
set unit_test_failure 1
|
|
||||||
set unit_test_failure_list "${unit_test_failure_list} mavlink_tests"
|
|
||||||
echo "[mavlink_tests] FAILED"
|
|
||||||
fi
|
|
||||||
echo "--------------------------------------------------------------------------------"
|
|
||||||
echo
|
|
||||||
echo "--------------------------------------------------------------------------------"
|
|
||||||
echo "[commander_tests] STARTING TEST"
|
|
||||||
if commander_tests
|
|
||||||
then
|
|
||||||
echo "[commander_tests] PASS"
|
|
||||||
else
|
|
||||||
set unit_test_failure 1
|
|
||||||
set unit_test_failure_list "${unit_test_failure_list} commander_tests"
|
|
||||||
echo "[commander_tests] FAILED"
|
|
||||||
fi
|
|
||||||
echo "--------------------------------------------------------------------------------"
|
|
||||||
echo
|
|
||||||
echo "--------------------------------------------------------------------------------"
|
|
||||||
echo "[controllib_test] STARTING TEST"
|
|
||||||
if controllib_test
|
|
||||||
then
|
|
||||||
echo "[controllib_test] PASS"
|
|
||||||
else
|
|
||||||
set unit_test_failure 1
|
|
||||||
set unit_test_failure_list "${unit_test_failure_list} controllib_tests"
|
|
||||||
echo "[controllib_test] FAILED"
|
|
||||||
fi
|
|
||||||
echo "--------------------------------------------------------------------------------"
|
|
||||||
echo
|
|
||||||
echo "--------------------------------------------------------------------------------"
|
|
||||||
echo "[uorb_tests] STARTING TEST"
|
|
||||||
if uorb_tests
|
|
||||||
then
|
|
||||||
echo "[uorb_tests] PASS"
|
|
||||||
else
|
|
||||||
set unit_test_failure 1
|
|
||||||
set unit_test_failure_list "${unit_test_failure_list} uorb_tests"
|
|
||||||
echo "[uorb_tests] FAILED"
|
|
||||||
fi
|
|
||||||
echo "--------------------------------------------------------------------------------"
|
|
||||||
|
|
||||||
if tests all
|
if tests all
|
||||||
then
|
|
||||||
else
|
|
||||||
set unit_test_failure 1
|
|
||||||
set unit_test_failure_list "${unit_test_failure_list} system_tests"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ $unit_test_failure == 0 ]
|
|
||||||
then
|
then
|
||||||
echo
|
echo
|
||||||
echo "All Unit Tests PASSED"
|
echo "All Unit Tests PASSED"
|
||||||
rgbled rgb 20 255 20
|
rgbled rgb 20 255 20
|
||||||
else
|
else
|
||||||
echo
|
echo
|
||||||
echo "Some Unit Tests FAILED:${unit_test_failure_list}"
|
echo "Some Unit Tests FAILED"
|
||||||
rgbled rgb 255 20 20
|
rgbled rgb 255 20 20
|
||||||
fi
|
fi
|
||||||
|
|
||||||
ver all
|
|
||||||
|
|
||||||
free
|
free
|
||||||
|
|||||||
@@ -53,22 +53,34 @@ set(config_module_list
|
|||||||
# System commands
|
# System commands
|
||||||
#
|
#
|
||||||
systemcmds/bl_update
|
systemcmds/bl_update
|
||||||
|
systemcmds/config
|
||||||
|
systemcmds/dumpfile
|
||||||
|
#systemcmds/esc_calib
|
||||||
systemcmds/mixer
|
systemcmds/mixer
|
||||||
|
#systemcmds/motor_ramp
|
||||||
|
systemcmds/mtd
|
||||||
|
systemcmds/nshterm
|
||||||
systemcmds/param
|
systemcmds/param
|
||||||
systemcmds/perf
|
systemcmds/perf
|
||||||
systemcmds/pwm
|
systemcmds/pwm
|
||||||
#systemcmds/esc_calib
|
|
||||||
systemcmds/reboot
|
systemcmds/reboot
|
||||||
#systemcmds/topic_listener
|
|
||||||
systemcmds/top
|
|
||||||
systemcmds/config
|
|
||||||
systemcmds/nshterm
|
|
||||||
systemcmds/mtd
|
|
||||||
systemcmds/dumpfile
|
|
||||||
systemcmds/ver
|
|
||||||
#systemcmds/sd_bench
|
#systemcmds/sd_bench
|
||||||
|
systemcmds/top
|
||||||
|
#systemcmds/topic_listener
|
||||||
|
systemcmds/ver
|
||||||
|
|
||||||
|
#
|
||||||
|
# Testing
|
||||||
|
#
|
||||||
|
#drivers/sf0x/sf0x_tests
|
||||||
|
#drivers/test_ppm
|
||||||
|
#lib/rc/rc_tests
|
||||||
|
#modules/commander/commander_tests
|
||||||
|
#modules/controllib_test
|
||||||
|
#modules/mavlink/mavlink_tests
|
||||||
|
#modules/unit_test
|
||||||
|
#modules/uORB/uORB_tests
|
||||||
#systemcmds/tests
|
#systemcmds/tests
|
||||||
#systemcmds/motor_ramp
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# General system control
|
# General system control
|
||||||
|
|||||||
@@ -53,32 +53,34 @@ set(config_module_list
|
|||||||
# System commands
|
# System commands
|
||||||
#
|
#
|
||||||
systemcmds/bl_update
|
systemcmds/bl_update
|
||||||
|
systemcmds/config
|
||||||
|
systemcmds/dumpfile
|
||||||
|
#systemcmds/esc_calib
|
||||||
systemcmds/mixer
|
systemcmds/mixer
|
||||||
|
systemcmds/motor_ramp
|
||||||
|
systemcmds/mtd
|
||||||
|
systemcmds/nshterm
|
||||||
systemcmds/param
|
systemcmds/param
|
||||||
systemcmds/perf
|
systemcmds/perf
|
||||||
systemcmds/pwm
|
systemcmds/pwm
|
||||||
systemcmds/esc_calib
|
|
||||||
systemcmds/reboot
|
systemcmds/reboot
|
||||||
#systemcmds/topic_listener
|
|
||||||
systemcmds/top
|
|
||||||
systemcmds/config
|
|
||||||
systemcmds/nshterm
|
|
||||||
systemcmds/mtd
|
|
||||||
systemcmds/dumpfile
|
|
||||||
systemcmds/ver
|
|
||||||
#systemcmds/sd_bench
|
#systemcmds/sd_bench
|
||||||
systemcmds/tests
|
systemcmds/top
|
||||||
systemcmds/motor_ramp
|
#systemcmds/topic_listener
|
||||||
|
systemcmds/ver
|
||||||
|
|
||||||
#
|
#
|
||||||
# Testing
|
# Testing
|
||||||
#
|
#
|
||||||
|
drivers/sf0x/sf0x_tests
|
||||||
drivers/test_ppm
|
drivers/test_ppm
|
||||||
|
#lib/rc/rc_tests
|
||||||
modules/commander/commander_tests
|
modules/commander/commander_tests
|
||||||
modules/controllib_test
|
modules/controllib_test
|
||||||
modules/mavlink/mavlink_tests
|
modules/mavlink/mavlink_tests
|
||||||
modules/unit_test
|
modules/unit_test
|
||||||
modules/uORB/uORB_tests
|
modules/uORB/uORB_tests
|
||||||
|
systemcmds/tests
|
||||||
|
|
||||||
#
|
#
|
||||||
# General system control
|
# General system control
|
||||||
@@ -95,9 +97,10 @@ set(config_module_list
|
|||||||
# Estimation modules (EKF/ SO3 / other filters)
|
# Estimation modules (EKF/ SO3 / other filters)
|
||||||
#
|
#
|
||||||
modules/attitude_estimator_q
|
modules/attitude_estimator_q
|
||||||
modules/ekf_att_pos_estimator
|
#modules/ekf_att_pos_estimator
|
||||||
modules/position_estimator_inav
|
modules/position_estimator_inav
|
||||||
modules/local_position_estimator
|
modules/local_position_estimator
|
||||||
|
modules/ekf2
|
||||||
|
|
||||||
#
|
#
|
||||||
# Vehicle Control
|
# Vehicle Control
|
||||||
|
|||||||
@@ -69,9 +69,20 @@ set(config_module_list
|
|||||||
systemcmds/dumpfile
|
systemcmds/dumpfile
|
||||||
systemcmds/ver
|
systemcmds/ver
|
||||||
systemcmds/sd_bench
|
systemcmds/sd_bench
|
||||||
systemcmds/tests
|
|
||||||
systemcmds/motor_ramp
|
systemcmds/motor_ramp
|
||||||
|
|
||||||
|
#
|
||||||
|
# Testing
|
||||||
|
#
|
||||||
|
drivers/sf0x/sf0x_tests
|
||||||
|
drivers/test_ppm
|
||||||
|
modules/commander/commander_tests
|
||||||
|
modules/controllib_test
|
||||||
|
modules/mavlink/mavlink_tests
|
||||||
|
modules/unit_test
|
||||||
|
modules/uORB/uORB_tests
|
||||||
|
systemcmds/tests
|
||||||
|
|
||||||
#
|
#
|
||||||
# General system control
|
# General system control
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -70,6 +70,7 @@ set(config_module_list
|
|||||||
lib/launchdetection
|
lib/launchdetection
|
||||||
lib/mathlib
|
lib/mathlib
|
||||||
lib/mathlib/math/filter
|
lib/mathlib/math/filter
|
||||||
|
lib/rc
|
||||||
lib/runway_takeoff
|
lib/runway_takeoff
|
||||||
lib/tailsitter_recovery
|
lib/tailsitter_recovery
|
||||||
lib/terrain_estimation
|
lib/terrain_estimation
|
||||||
@@ -79,9 +80,11 @@ set(config_module_list
|
|||||||
#
|
#
|
||||||
# Testing
|
# Testing
|
||||||
#
|
#
|
||||||
|
drivers/sf0x/sf0x_tests
|
||||||
|
lib/rc/rc_tests
|
||||||
modules/commander/commander_tests
|
modules/commander/commander_tests
|
||||||
modules/controllib_test
|
modules/controllib_test
|
||||||
#modules/mavlink/mavlink_tests
|
#modules/mavlink/mavlink_tests #TODO: fix mavlink_tests
|
||||||
modules/unit_test
|
modules/unit_test
|
||||||
modules/uORB/uORB_tests
|
modules/uORB/uORB_tests
|
||||||
systemcmds/tests
|
systemcmds/tests
|
||||||
|
|||||||
@@ -1,110 +0,0 @@
|
|||||||
include(posix/px4_impl_posix)
|
|
||||||
|
|
||||||
set(CMAKE_TOOLCHAIN_FILE ${CMAKE_SOURCE_DIR}/cmake/toolchains/Toolchain-native.cmake)
|
|
||||||
|
|
||||||
set(config_module_list
|
|
||||||
drivers/boards/sitl
|
|
||||||
drivers/device
|
|
||||||
drivers/gps
|
|
||||||
drivers/pwm_out_sim
|
|
||||||
|
|
||||||
platforms/common
|
|
||||||
platforms/posix/drivers/accelsim
|
|
||||||
platforms/posix/drivers/adcsim
|
|
||||||
platforms/posix/drivers/airspeedsim
|
|
||||||
platforms/posix/drivers/barosim
|
|
||||||
platforms/posix/drivers/gpssim
|
|
||||||
platforms/posix/drivers/gyrosim
|
|
||||||
platforms/posix/drivers/ledsim
|
|
||||||
platforms/posix/drivers/rgbledsim
|
|
||||||
platforms/posix/drivers/tonealrmsim
|
|
||||||
platforms/posix/px4_layer
|
|
||||||
platforms/posix/work_queue
|
|
||||||
|
|
||||||
systemcmds/esc_calib
|
|
||||||
systemcmds/mixer
|
|
||||||
systemcmds/param
|
|
||||||
systemcmds/perf
|
|
||||||
systemcmds/reboot
|
|
||||||
systemcmds/sd_bench
|
|
||||||
systemcmds/topic_listener
|
|
||||||
systemcmds/ver
|
|
||||||
|
|
||||||
modules/attitude_estimator_ekf
|
|
||||||
modules/attitude_estimator_q
|
|
||||||
modules/commander
|
|
||||||
modules/dataman
|
|
||||||
modules/ekf2
|
|
||||||
modules/ekf_att_pos_estimator
|
|
||||||
modules/fw_att_control
|
|
||||||
modules/fw_pos_control_l1
|
|
||||||
modules/land_detector
|
|
||||||
modules/logger
|
|
||||||
modules/mavlink
|
|
||||||
modules/mc_att_control
|
|
||||||
modules/mc_att_control_multiplatform
|
|
||||||
modules/mc_pos_control
|
|
||||||
modules/mc_pos_control_multiplatform
|
|
||||||
modules/navigator
|
|
||||||
modules/param
|
|
||||||
modules/position_estimator_inav
|
|
||||||
modules/local_position_estimator
|
|
||||||
modules/sdlog2
|
|
||||||
modules/sensors
|
|
||||||
modules/simulator
|
|
||||||
modules/systemlib
|
|
||||||
modules/systemlib/mixer
|
|
||||||
modules/uORB
|
|
||||||
modules/vtol_att_control
|
|
||||||
|
|
||||||
lib/controllib
|
|
||||||
lib/conversion
|
|
||||||
lib/DriverFramework/framework
|
|
||||||
lib/ecl
|
|
||||||
lib/external_lgpl
|
|
||||||
lib/geo
|
|
||||||
lib/geo_lookup
|
|
||||||
lib/launchdetection
|
|
||||||
lib/mathlib
|
|
||||||
lib/mathlib/math/filter
|
|
||||||
lib/runway_takeoff
|
|
||||||
lib/tailsitter_recovery
|
|
||||||
lib/terrain_estimation
|
|
||||||
|
|
||||||
examples/px4_simple_app
|
|
||||||
|
|
||||||
#
|
|
||||||
# Testing
|
|
||||||
#
|
|
||||||
modules/commander/commander_tests
|
|
||||||
modules/controllib_test
|
|
||||||
#modules/mavlink/mavlink_tests
|
|
||||||
modules/unit_test
|
|
||||||
modules/uORB/uORB_tests
|
|
||||||
systemcmds/tests
|
|
||||||
|
|
||||||
)
|
|
||||||
|
|
||||||
set(config_extra_builtin_cmds
|
|
||||||
serdis
|
|
||||||
sercon
|
|
||||||
)
|
|
||||||
|
|
||||||
set(config_sitl_rcS
|
|
||||||
posix-configs/SITL/init/rcS_test
|
|
||||||
CACHE FILEPATH "init script for sitl"
|
|
||||||
)
|
|
||||||
|
|
||||||
set(config_sitl_viewer
|
|
||||||
jmavsim
|
|
||||||
CACHE STRING "viewer for sitl"
|
|
||||||
)
|
|
||||||
set_property(CACHE config_sitl_viewer
|
|
||||||
PROPERTY STRINGS "jmavsim;none")
|
|
||||||
|
|
||||||
set(config_sitl_debugger
|
|
||||||
disable
|
|
||||||
CACHE STRING "debugger for sitl"
|
|
||||||
)
|
|
||||||
set_property(CACHE config_sitl_debugger
|
|
||||||
PROPERTY STRINGS "disable;gdb;lldb")
|
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
uorb start
|
|
||||||
param load
|
|
||||||
|
|
||||||
dataman start
|
|
||||||
|
|
||||||
simulator start -s
|
|
||||||
rgbledsim start
|
|
||||||
tone_alarm start
|
|
||||||
gyrosim start
|
|
||||||
accelsim start
|
|
||||||
barosim start
|
|
||||||
adcsim start
|
|
||||||
gpssim start
|
|
||||||
pwm_out_sim mode_pwm
|
|
||||||
sleep 1
|
|
||||||
sensors start
|
|
||||||
|
|
||||||
commander_tests
|
|
||||||
controllib_test
|
|
||||||
uorb_tests
|
|
||||||
tests all
|
|
||||||
|
|
||||||
ver all
|
|
||||||
|
|
||||||
shutdown
|
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
uorb start
|
|
||||||
param load
|
|
||||||
|
|
||||||
dataman start
|
|
||||||
|
|
||||||
simulator start -s
|
|
||||||
rgbledsim start
|
|
||||||
tone_alarm start
|
|
||||||
gyrosim start
|
|
||||||
accelsim start
|
|
||||||
barosim start
|
|
||||||
adcsim start
|
|
||||||
gpssim start
|
|
||||||
pwm_out_sim mode_pwm
|
|
||||||
sleep 1
|
|
||||||
sensors start
|
|
||||||
|
|
||||||
commander_tests
|
|
||||||
controllib_test
|
|
||||||
uorb_tests
|
|
||||||
tests all
|
|
||||||
|
|
||||||
ver all
|
|
||||||
|
|
||||||
shutdown
|
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
uorb start
|
||||||
|
param load
|
||||||
|
param set SYS_RESTART_TYPE 0
|
||||||
|
dataman start
|
||||||
|
|
||||||
|
ver all
|
||||||
|
|
||||||
|
sleep 1
|
||||||
|
|
||||||
|
tests all
|
||||||
|
|
||||||
|
shutdown
|
||||||
@@ -0,0 +1,43 @@
|
|||||||
|
############################################################################
|
||||||
|
#
|
||||||
|
# Copyright (c) 2016 PX4 Development Team. All rights reserved.
|
||||||
|
#
|
||||||
|
# Redistribution and use in source and binary forms, with or without
|
||||||
|
# modification, are permitted provided that the following conditions
|
||||||
|
# are met:
|
||||||
|
#
|
||||||
|
# 1. Redistributions of source code must retain the above copyright
|
||||||
|
# notice, this list of conditions and the following disclaimer.
|
||||||
|
# 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
# notice, this list of conditions and the following disclaimer in
|
||||||
|
# the documentation and/or other materials provided with the
|
||||||
|
# distribution.
|
||||||
|
# 3. Neither the name PX4 nor the names of its contributors may be
|
||||||
|
# used to endorse or promote products derived from this software
|
||||||
|
# without specific prior written permission.
|
||||||
|
#
|
||||||
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||||
|
# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||||
|
# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
|
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||||
|
# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
|
||||||
|
# OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
||||||
|
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
||||||
|
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
# POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
#
|
||||||
|
############################################################################
|
||||||
|
px4_add_module(
|
||||||
|
MODULE drivers__sf0x__sf0x_tests
|
||||||
|
MAIN sf0x_tests
|
||||||
|
COMPILE_FLAGS
|
||||||
|
SRCS
|
||||||
|
SF0XTest.cpp
|
||||||
|
../sf0x_parser.cpp
|
||||||
|
DEPENDS
|
||||||
|
platforms__common
|
||||||
|
)
|
||||||
|
# vim: set noet ft=cmake fenc=utf-8 ff=unix :
|
||||||
@@ -1,19 +1,35 @@
|
|||||||
#include <stdio.h>
|
#include <unit_test/unit_test.h>
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
|
|
||||||
#include <drivers/drv_hrt.h>
|
|
||||||
#include <drivers/sf0x/sf0x_parser.h>
|
#include <drivers/sf0x/sf0x_parser.h>
|
||||||
|
|
||||||
#include <systemlib/err.h>
|
#include <systemlib/err.h>
|
||||||
|
|
||||||
#include "gtest/gtest.h"
|
#include <stdio.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
TEST(SF0XTest, SF0X)
|
extern "C" __EXPORT int sf0x_tests_main(int argc, char *argv[]);
|
||||||
|
|
||||||
|
class SF0XTest : public UnitTest
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
virtual bool run_tests(void);
|
||||||
|
|
||||||
|
private:
|
||||||
|
bool sf0xTest();
|
||||||
|
};
|
||||||
|
|
||||||
|
bool SF0XTest::run_tests(void)
|
||||||
|
{
|
||||||
|
ut_run_test(sf0xTest);
|
||||||
|
|
||||||
|
return (_tests_failed == 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool SF0XTest::sf0xTest(void)
|
||||||
{
|
{
|
||||||
const char _LINE_MAX = 20;
|
const char _LINE_MAX = 20;
|
||||||
char _linebuf[_LINE_MAX];
|
//char _linebuf[_LINE_MAX];
|
||||||
_linebuf[0] = '\0';
|
//_linebuf[0] = '\0';
|
||||||
|
|
||||||
const char *lines[] = {"0.01\r\n",
|
const char *lines[] = {"0.01\r\n",
|
||||||
"0.02\r\n",
|
"0.02\r\n",
|
||||||
@@ -39,7 +55,6 @@ TEST(SF0XTest, SF0X)
|
|||||||
unsigned _parsebuf_index = 0;
|
unsigned _parsebuf_index = 0;
|
||||||
|
|
||||||
for (unsigned l = 0; l < sizeof(lines) / sizeof(lines[0]); l++) {
|
for (unsigned l = 0; l < sizeof(lines) / sizeof(lines[0]); l++) {
|
||||||
|
|
||||||
//printf("\n%s", _linebuf);
|
//printf("\n%s", _linebuf);
|
||||||
|
|
||||||
int parse_ret;
|
int parse_ret;
|
||||||
@@ -48,6 +63,19 @@ TEST(SF0XTest, SF0X)
|
|||||||
parse_ret = sf0x_parser(lines[l][i], _parserbuf, &_parsebuf_index, &state, &dist_m);
|
parse_ret = sf0x_parser(lines[l][i], _parserbuf, &_parsebuf_index, &state, &dist_m);
|
||||||
|
|
||||||
if (parse_ret == 0) {
|
if (parse_ret == 0) {
|
||||||
|
if (l == 0) {
|
||||||
|
ut_test(dist_m - 0.010000f < 0.001f);
|
||||||
|
|
||||||
|
} else if (l == 1) {
|
||||||
|
ut_test(dist_m - 0.020000f < 0.001f);
|
||||||
|
|
||||||
|
} else if (l == 2) {
|
||||||
|
ut_test(dist_m - 0.030000f < 0.001f);
|
||||||
|
|
||||||
|
} else if (l == 3) {
|
||||||
|
ut_test(dist_m - 0.040000f < 0.001f);
|
||||||
|
}
|
||||||
|
|
||||||
//printf("\nparsed: %f %s\n", dist_m, (parse_ret == 0) ? "OK" : "");
|
//printf("\nparsed: %f %s\n", dist_m, (parse_ret == 0) ? "OK" : "");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -56,5 +84,8 @@ TEST(SF0XTest, SF0X)
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
warnx("test finished");
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ut_declare_test_c(sf0x_tests_main, SF0XTest)
|
||||||
|
|
||||||
@@ -34,6 +34,7 @@ px4_add_module(
|
|||||||
MODULE lib__rc
|
MODULE lib__rc
|
||||||
COMPILE_FLAGS
|
COMPILE_FLAGS
|
||||||
-Os
|
-Os
|
||||||
|
-Wno-unused-result
|
||||||
SRCS
|
SRCS
|
||||||
st24.c
|
st24.c
|
||||||
sumd.c
|
sumd.c
|
||||||
|
|||||||
@@ -0,0 +1,43 @@
|
|||||||
|
############################################################################
|
||||||
|
#
|
||||||
|
# Copyright (c) 2016 PX4 Development Team. All rights reserved.
|
||||||
|
#
|
||||||
|
# Redistribution and use in source and binary forms, with or without
|
||||||
|
# modification, are permitted provided that the following conditions
|
||||||
|
# are met:
|
||||||
|
#
|
||||||
|
# 1. Redistributions of source code must retain the above copyright
|
||||||
|
# notice, this list of conditions and the following disclaimer.
|
||||||
|
# 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
# notice, this list of conditions and the following disclaimer in
|
||||||
|
# the documentation and/or other materials provided with the
|
||||||
|
# distribution.
|
||||||
|
# 3. Neither the name PX4 nor the names of its contributors may be
|
||||||
|
# used to endorse or promote products derived from this software
|
||||||
|
# without specific prior written permission.
|
||||||
|
#
|
||||||
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||||
|
# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||||
|
# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
|
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||||
|
# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
|
||||||
|
# OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
||||||
|
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
||||||
|
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
# POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
#
|
||||||
|
############################################################################
|
||||||
|
px4_add_module(
|
||||||
|
MODULE lib__rc__rc_tests
|
||||||
|
MAIN rc_tests
|
||||||
|
COMPILE_FLAGS
|
||||||
|
-Wno-unused-result
|
||||||
|
SRCS
|
||||||
|
RCTest.cpp
|
||||||
|
DEPENDS
|
||||||
|
platforms__common
|
||||||
|
)
|
||||||
|
# vim: set noet ft=cmake fenc=utf-8 ff=unix :
|
||||||
@@ -0,0 +1,306 @@
|
|||||||
|
#include <unit_test/unit_test.h>
|
||||||
|
|
||||||
|
#include <systemlib/err.h>
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#include <drivers/drv_hrt.h>
|
||||||
|
|
||||||
|
#define DSM_DEBUG
|
||||||
|
#include <lib/rc/sbus.h>
|
||||||
|
#include <lib/rc/dsm.h>
|
||||||
|
#include <lib/rc/st24.h>
|
||||||
|
#include <lib/rc/sumd.h>
|
||||||
|
|
||||||
|
#if !defined(CONFIG_ARCH_BOARD_SITL)
|
||||||
|
#define TEST_DATA_PATH "/fs/microsd"
|
||||||
|
#else
|
||||||
|
#define TEST_DATA_PATH "../../../../src/lib/rc/rc_tests/test_data/"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
extern "C" __EXPORT int rc_tests_main(int argc, char *argv[]);
|
||||||
|
|
||||||
|
class RCTest : public UnitTest
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
virtual bool run_tests(void);
|
||||||
|
|
||||||
|
private:
|
||||||
|
bool dsmTest();
|
||||||
|
bool sbus2Test();
|
||||||
|
bool st24Test();
|
||||||
|
bool sumdTest();
|
||||||
|
};
|
||||||
|
|
||||||
|
bool RCTest::run_tests(void)
|
||||||
|
{
|
||||||
|
ut_run_test(dsmTest);
|
||||||
|
ut_run_test(sbus2Test);
|
||||||
|
ut_run_test(st24Test);
|
||||||
|
ut_run_test(sumdTest);
|
||||||
|
|
||||||
|
return (_tests_failed == 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool RCTest::dsmTest(void)
|
||||||
|
{
|
||||||
|
|
||||||
|
const char *filepath = TEST_DATA_PATH "dsm_x_data.txt";
|
||||||
|
|
||||||
|
FILE *fp;
|
||||||
|
fp = fopen(filepath, "rt");
|
||||||
|
|
||||||
|
ut_test(fp != nullptr);
|
||||||
|
//warnx("loading data from: %s", filepath);
|
||||||
|
|
||||||
|
float f;
|
||||||
|
unsigned x;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
// Trash the first 20 lines
|
||||||
|
for (unsigned i = 0; i < 20; i++) {
|
||||||
|
char buf[200];
|
||||||
|
(void)fgets(buf, sizeof(buf), fp);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Init the parser
|
||||||
|
uint8_t frame[20];
|
||||||
|
uint16_t rc_values[18];
|
||||||
|
uint16_t num_values;
|
||||||
|
bool dsm_11_bit;
|
||||||
|
unsigned dsm_frame_drops = 0;
|
||||||
|
uint16_t max_channels = sizeof(rc_values) / sizeof(rc_values[0]);
|
||||||
|
|
||||||
|
int rate_limiter = 0;
|
||||||
|
unsigned last_drop = 0;
|
||||||
|
|
||||||
|
while (EOF != (ret = fscanf(fp, "%f,%x,,", &f, &x))) {
|
||||||
|
|
||||||
|
ut_test(ret > 0);
|
||||||
|
|
||||||
|
frame[0] = x;
|
||||||
|
unsigned len = 1;
|
||||||
|
|
||||||
|
// Pipe the data into the parser
|
||||||
|
bool result = dsm_parse(f * 1e6f, &frame[0], len, rc_values, &num_values,
|
||||||
|
&dsm_11_bit, &dsm_frame_drops, max_channels);
|
||||||
|
|
||||||
|
if (result) {
|
||||||
|
//warnx("decoded packet with %d channels and %s encoding:", num_values, (dsm_11_bit) ? "11 bit" : "10 bit");
|
||||||
|
|
||||||
|
for (unsigned i = 0; i < num_values; i++) {
|
||||||
|
//printf("chan #%u:\t%d\n", i, (int)rc_values[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (last_drop != (dsm_frame_drops)) {
|
||||||
|
//warnx("frame dropped, now #%d", (dsm_frame_drops));
|
||||||
|
last_drop = dsm_frame_drops;
|
||||||
|
}
|
||||||
|
|
||||||
|
rate_limiter++;
|
||||||
|
}
|
||||||
|
|
||||||
|
ut_test(ret == EOF);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool RCTest::sbus2Test(void)
|
||||||
|
{
|
||||||
|
const char *filepath = TEST_DATA_PATH "sbus2_r7008SB.txt";
|
||||||
|
|
||||||
|
FILE *fp;
|
||||||
|
fp = fopen(filepath, "rt");
|
||||||
|
|
||||||
|
ut_test(fp != nullptr);
|
||||||
|
//warnx("loading data from: %s", filepath);
|
||||||
|
|
||||||
|
// if (argc < 2)
|
||||||
|
// errx(1, "Need a filename for the input file");
|
||||||
|
|
||||||
|
//int byte_offset = 7;
|
||||||
|
|
||||||
|
// if (argc > 2) {
|
||||||
|
// char* end;
|
||||||
|
// byte_offset = strtol(argv[2],&end,10);
|
||||||
|
// }
|
||||||
|
|
||||||
|
//warnx("RUNNING TEST WITH BYTE OFFSET OF: %d", byte_offset);
|
||||||
|
|
||||||
|
float f;
|
||||||
|
unsigned x;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
// Trash the first 20 lines
|
||||||
|
for (unsigned i = 0; i < 20; i++) {
|
||||||
|
char buf[200];
|
||||||
|
(void)fgets(buf, sizeof(buf), fp);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Init the parser
|
||||||
|
uint8_t frame[SBUS_BUFFER_SIZE];
|
||||||
|
uint16_t rc_values[18];
|
||||||
|
uint16_t num_values;
|
||||||
|
unsigned sbus_frame_drops = 0;
|
||||||
|
unsigned sbus_frame_resets = 0;
|
||||||
|
bool sbus_failsafe;
|
||||||
|
bool sbus_frame_drop;
|
||||||
|
uint16_t max_channels = sizeof(rc_values) / sizeof(rc_values[0]);
|
||||||
|
|
||||||
|
int rate_limiter = 0;
|
||||||
|
unsigned last_drop = 0;
|
||||||
|
|
||||||
|
while (EOF != (ret = fscanf(fp, "%f,%x,,", &f, &x))) {
|
||||||
|
|
||||||
|
ut_test(ret > 0);
|
||||||
|
|
||||||
|
frame[0] = x;
|
||||||
|
unsigned len = 1;
|
||||||
|
|
||||||
|
// Pipe the data into the parser
|
||||||
|
hrt_abstime now = hrt_absolute_time();
|
||||||
|
|
||||||
|
// if (rate_limiter % byte_offset == 0) {
|
||||||
|
bool result = sbus_parse(now, &frame[0], len, rc_values, &num_values,
|
||||||
|
&sbus_failsafe, &sbus_frame_drop, &sbus_frame_drops, max_channels);
|
||||||
|
|
||||||
|
if (result) {
|
||||||
|
//warnx("decoded packet");
|
||||||
|
}
|
||||||
|
|
||||||
|
// }
|
||||||
|
|
||||||
|
if (last_drop != (sbus_frame_drops + sbus_frame_resets)) {
|
||||||
|
warnx("frame dropped, now #%d", (sbus_frame_drops + sbus_frame_resets));
|
||||||
|
last_drop = sbus_frame_drops + sbus_frame_resets;
|
||||||
|
}
|
||||||
|
|
||||||
|
rate_limiter++;
|
||||||
|
}
|
||||||
|
|
||||||
|
ut_test(ret == EOF);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool RCTest::st24Test(void)
|
||||||
|
{
|
||||||
|
const char *filepath = TEST_DATA_PATH "st24_data.txt";
|
||||||
|
|
||||||
|
//warnx("loading data from: %s", filepath);
|
||||||
|
|
||||||
|
FILE *fp;
|
||||||
|
|
||||||
|
fp = fopen(filepath, "rt");
|
||||||
|
ut_test(fp != nullptr);
|
||||||
|
|
||||||
|
float f;
|
||||||
|
unsigned x;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
// Trash the first 20 lines
|
||||||
|
for (unsigned i = 0; i < 20; i++) {
|
||||||
|
char buf[200];
|
||||||
|
(void)fgets(buf, sizeof(buf), fp);
|
||||||
|
}
|
||||||
|
|
||||||
|
float last_time = 0;
|
||||||
|
|
||||||
|
while (EOF != (ret = fscanf(fp, "%f,%x,,", &f, &x))) {
|
||||||
|
ut_test(ret > 0);
|
||||||
|
|
||||||
|
if (((f - last_time) * 1000 * 1000) > 3000) {
|
||||||
|
// warnx("FRAME RESET\n\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t b = static_cast<uint8_t>(x);
|
||||||
|
|
||||||
|
last_time = f;
|
||||||
|
|
||||||
|
// Pipe the data into the parser
|
||||||
|
//hrt_abstime now = hrt_absolute_time();
|
||||||
|
|
||||||
|
uint8_t rssi;
|
||||||
|
uint8_t rx_count;
|
||||||
|
uint16_t channel_count;
|
||||||
|
uint16_t channels[20];
|
||||||
|
|
||||||
|
if (!st24_decode(b, &rssi, &rx_count, &channel_count, channels, sizeof(channels) / sizeof(channels[0]))) {
|
||||||
|
//warnx("decoded: %u channels (converted to PPM range)", (unsigned)channel_count);
|
||||||
|
|
||||||
|
for (unsigned i = 0; i < channel_count; i++) {
|
||||||
|
//int16_t val = channels[i];
|
||||||
|
//warnx("channel %u: %d 0x%03X", i, static_cast<int>(val), static_cast<int>(val));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ut_test(ret == EOF);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool RCTest::sumdTest(void)
|
||||||
|
{
|
||||||
|
const char *filepath = TEST_DATA_PATH "sumd_data.txt";
|
||||||
|
|
||||||
|
//warnx("loading data from: %s", filepath);
|
||||||
|
|
||||||
|
FILE *fp;
|
||||||
|
|
||||||
|
fp = fopen(filepath, "rt");
|
||||||
|
ut_test(fp != nullptr);
|
||||||
|
|
||||||
|
float f;
|
||||||
|
unsigned x;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
// Trash the first 20 lines
|
||||||
|
for (unsigned i = 0; i < 20; i++) {
|
||||||
|
char buf[200];
|
||||||
|
(void)fgets(buf, sizeof(buf), fp);
|
||||||
|
}
|
||||||
|
|
||||||
|
float last_time = 0;
|
||||||
|
|
||||||
|
while (EOF != (ret = fscanf(fp, "%f,%x,,", &f, &x))) {
|
||||||
|
ut_test(ret > 0);
|
||||||
|
|
||||||
|
if (((f - last_time) * 1000 * 1000) > 3000) {
|
||||||
|
// warnx("FRAME RESET\n\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t b = static_cast<uint8_t>(x);
|
||||||
|
|
||||||
|
last_time = f;
|
||||||
|
|
||||||
|
// Pipe the data into the parser
|
||||||
|
//hrt_abstime now = hrt_absolute_time();
|
||||||
|
|
||||||
|
uint8_t rssi;
|
||||||
|
uint8_t rx_count;
|
||||||
|
uint16_t channel_count;
|
||||||
|
uint16_t channels[32];
|
||||||
|
|
||||||
|
|
||||||
|
if (!sumd_decode(b, &rssi, &rx_count, &channel_count, channels, 32)) {
|
||||||
|
//warnx("decoded: %u channels (converted to PPM range)", (unsigned)channel_count);
|
||||||
|
|
||||||
|
for (unsigned i = 0; i < channel_count; i++) {
|
||||||
|
//int16_t val = channels[i];
|
||||||
|
//warnx("channel %u: %d 0x%03X", i, static_cast<int>(val), static_cast<int>(val));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ut_test(ret == EOF);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
ut_declare_test_c(rc_tests_main, RCTest)
|
||||||
|
|
||||||
@@ -50,7 +50,7 @@ class MavlinkFtpTest;
|
|||||||
class MavlinkFTP : public MavlinkStream
|
class MavlinkFTP : public MavlinkStream
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
/// @brief Contructor is only public so unit test code can new objects.
|
/// @brief Constructor is only public so unit test code can new objects.
|
||||||
MavlinkFTP(Mavlink *mavlink);
|
MavlinkFTP(Mavlink *mavlink);
|
||||||
~MavlinkFTP();
|
~MavlinkFTP();
|
||||||
|
|
||||||
|
|||||||
@@ -236,7 +236,7 @@ bool MavlinkFtpTest::_list_test(void)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @brief Tests for correct reponse to a List command on a valid directory, but with an offset that
|
/// @brief Tests for correct response to a List command on a valid directory, but with an offset that
|
||||||
/// is beyond the last directory entry.
|
/// is beyond the last directory entry.
|
||||||
bool MavlinkFtpTest::_list_eof_test(void)
|
bool MavlinkFtpTest::_list_eof_test(void)
|
||||||
{
|
{
|
||||||
@@ -263,7 +263,7 @@ bool MavlinkFtpTest::_list_eof_test(void)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @brief Tests for correct reponse to an Open command on a file which does not exist.
|
/// @brief Tests for correct response to an Open command on a file which does not exist.
|
||||||
bool MavlinkFtpTest::_open_badfile_test(void)
|
bool MavlinkFtpTest::_open_badfile_test(void)
|
||||||
{
|
{
|
||||||
MavlinkFTP::PayloadHeader payload;
|
MavlinkFTP::PayloadHeader payload;
|
||||||
|
|||||||
@@ -130,7 +130,7 @@ int uORBTest::UnitTest::pubsublatency_main(void)
|
|||||||
|
|
||||||
pubsubtest_passed = true;
|
pubsubtest_passed = true;
|
||||||
|
|
||||||
if (static_cast<float>(latency_integral / maxruns) > 40.0f) {
|
if (static_cast<float>(latency_integral / maxruns) > 80.0f) {
|
||||||
pubsubtest_res = uORB::ERROR;
|
pubsubtest_res = uORB::ERROR;
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -37,6 +37,17 @@
|
|||||||
|
|
||||||
#include <systemlib/err.h>
|
#include <systemlib/err.h>
|
||||||
|
|
||||||
|
#define ut_declare_test_c(test_function, test_class) \
|
||||||
|
extern "C" { \
|
||||||
|
int test_function(int argc, char *argv[]) \
|
||||||
|
{ \
|
||||||
|
test_class* test = new test_class(); \
|
||||||
|
bool success = test->run_tests(); \
|
||||||
|
test->print_results(); \
|
||||||
|
return success ? 0 : -1; \
|
||||||
|
} \
|
||||||
|
}
|
||||||
|
|
||||||
/// @brief Base class to be used for unit tests.
|
/// @brief Base class to be used for unit tests.
|
||||||
class __EXPORT UnitTest
|
class __EXPORT UnitTest
|
||||||
{
|
{
|
||||||
@@ -92,6 +103,9 @@ protected:
|
|||||||
} \
|
} \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
|
/// @brief Used to assert a value within a unit test.
|
||||||
|
#define ut_test(test) ut_assert("test", test)
|
||||||
|
|
||||||
/// @brief Used to compare two integer values within a unit test. If possible use ut_compare instead of ut_assert
|
/// @brief Used to compare two integer values within a unit test. If possible use ut_compare instead of ut_assert
|
||||||
/// since it will give you better error reporting of the actual values being compared.
|
/// since it will give you better error reporting of the actual values being compared.
|
||||||
#define ut_compare(message, v1, v2) \
|
#define ut_compare(message, v1, v2) \
|
||||||
|
|||||||
@@ -33,14 +33,26 @@
|
|||||||
|
|
||||||
set(srcs
|
set(srcs
|
||||||
test_adc.c
|
test_adc.c
|
||||||
|
test_autodeclination.cpp
|
||||||
test_bson.c
|
test_bson.c
|
||||||
test_float.c
|
test_conv.cpp
|
||||||
|
test_file.c
|
||||||
|
test_file2.c
|
||||||
|
test_float.cpp
|
||||||
test_gpio.c
|
test_gpio.c
|
||||||
test_hott_telemetry.c
|
test_hott_telemetry.c
|
||||||
test_hrt.c
|
test_hrt.c
|
||||||
test_int.c
|
test_int.cpp
|
||||||
test_jig_voltages.c
|
test_jig_voltages.c
|
||||||
test_led.c
|
test_led.c
|
||||||
|
test_mathlib.cpp
|
||||||
|
test_matrix.cpp
|
||||||
|
test_mixer.cpp
|
||||||
|
test_mount.c
|
||||||
|
test_params.c
|
||||||
|
test_perf.c
|
||||||
|
test_ppm_loopback.c
|
||||||
|
test_rc.c
|
||||||
test_sensors.c
|
test_sensors.c
|
||||||
test_servo.c
|
test_servo.c
|
||||||
test_sleep.c
|
test_sleep.c
|
||||||
@@ -48,16 +60,7 @@ set(srcs
|
|||||||
test_uart_console.c
|
test_uart_console.c
|
||||||
test_uart_loopback.c
|
test_uart_loopback.c
|
||||||
test_uart_send.c
|
test_uart_send.c
|
||||||
test_mixer.cpp
|
|
||||||
test_mathlib.cpp
|
|
||||||
test_file.c
|
|
||||||
test_file2.c
|
|
||||||
tests_main.c
|
tests_main.c
|
||||||
test_params.c
|
|
||||||
test_ppm_loopback.c
|
|
||||||
test_rc.c
|
|
||||||
test_conv.cpp
|
|
||||||
test_mount.c
|
|
||||||
)
|
)
|
||||||
|
|
||||||
if(${OS} STREQUAL "nuttx")
|
if(${OS} STREQUAL "nuttx")
|
||||||
@@ -69,11 +72,15 @@ endif()
|
|||||||
px4_add_module(
|
px4_add_module(
|
||||||
MODULE systemcmds__tests
|
MODULE systemcmds__tests
|
||||||
MAIN tests
|
MAIN tests
|
||||||
STACK_MAIN 9000
|
STACK_MAIN 10000
|
||||||
STACK_MAX 9000
|
STACK_MAX 10000
|
||||||
COMPILE_FLAGS
|
COMPILE_FLAGS
|
||||||
|
${MODULE_CFLAGS}
|
||||||
-Wno-unused-result
|
-Wno-unused-result
|
||||||
-Wno-float-equal
|
-Wno-float-equal
|
||||||
|
-Wno-missing-declarations
|
||||||
|
-Wno-double-promotion
|
||||||
|
-Wno-unknown-warning-option
|
||||||
-Os
|
-Os
|
||||||
SRCS ${srcs}
|
SRCS ${srcs}
|
||||||
DEPENDS
|
DEPENDS
|
||||||
|
|||||||
@@ -0,0 +1,38 @@
|
|||||||
|
#include <unit_test/unit_test.h>
|
||||||
|
|
||||||
|
#include <drivers/drv_hrt.h>
|
||||||
|
#include <geo/geo.h>
|
||||||
|
#include <px4iofirmware/px4io.h>
|
||||||
|
#include <systemlib/err.h>
|
||||||
|
#include <systemlib/mixer/mixer.h>
|
||||||
|
|
||||||
|
#include <math.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
class AutoDeclinationTest : public UnitTest
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
virtual bool run_tests(void);
|
||||||
|
|
||||||
|
private:
|
||||||
|
bool autodeclination_check();
|
||||||
|
};
|
||||||
|
|
||||||
|
bool AutoDeclinationTest::autodeclination_check(void)
|
||||||
|
{
|
||||||
|
ut_assert("declination differs more than 1 degree", get_mag_declination(47.0, 8.0) - 0.6f < 0.5f);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool AutoDeclinationTest::run_tests(void)
|
||||||
|
{
|
||||||
|
ut_run_test(autodeclination_check);
|
||||||
|
|
||||||
|
return (_tests_failed == 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
ut_declare_test_c(test_autodeclination, AutoDeclinationTest)
|
||||||
@@ -59,7 +59,7 @@
|
|||||||
|
|
||||||
int test_conv(int argc, char *argv[])
|
int test_conv(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
PX4_INFO("Testing system conversions");
|
//PX4_INFO("Testing system conversions");
|
||||||
|
|
||||||
for (int i = -10000; i <= 10000; i += 1) {
|
for (int i = -10000; i <= 10000; i += 1) {
|
||||||
float f = i / 10000.0f;
|
float f = i / 10000.0f;
|
||||||
@@ -72,7 +72,7 @@ int test_conv(int argc, char *argv[])
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
PX4_INFO("All conversions clean");
|
//PX4_INFO("All conversions clean");
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -1,287 +0,0 @@
|
|||||||
/****************************************************************************
|
|
||||||
*
|
|
||||||
* Copyright (c) 2012-2015 PX4 Development Team. All rights reserved.
|
|
||||||
* Author: @author Lorenz Meier <lm@inf.ethz.ch>
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
*
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in
|
|
||||||
* the documentation and/or other materials provided with the
|
|
||||||
* distribution.
|
|
||||||
* 3. Neither the name PX4 nor the names of its contributors may be
|
|
||||||
* used to endorse or promote products derived from this software
|
|
||||||
* without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
|
||||||
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
|
||||||
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
||||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
|
||||||
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
|
|
||||||
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
|
||||||
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
||||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
|
||||||
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
* POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @file tests_float.c
|
|
||||||
* Floating point tests
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <px4_config.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include <errno.h>
|
|
||||||
#include "tests.h"
|
|
||||||
#include <math.h>
|
|
||||||
#include <float.h>
|
|
||||||
|
|
||||||
typedef union {
|
|
||||||
float f;
|
|
||||||
double d;
|
|
||||||
uint8_t b[8];
|
|
||||||
} test_float_double_t;
|
|
||||||
|
|
||||||
int test_float(int argc, char *argv[])
|
|
||||||
{
|
|
||||||
int ret = 0;
|
|
||||||
|
|
||||||
printf("\n--- SINGLE PRECISION TESTS ---\n");
|
|
||||||
printf("The single precision test involves calls to fabsf(),\nif test fails check this function as well.\n\n");
|
|
||||||
|
|
||||||
float f1 = 1.55f;
|
|
||||||
|
|
||||||
float sinf_zero = sinf(0.0f);
|
|
||||||
float sinf_one = sinf(1.0f);
|
|
||||||
float sqrt_two = sqrt(2.0f);
|
|
||||||
|
|
||||||
if (fabsf(sinf_zero) < FLT_EPSILON) {
|
|
||||||
printf("\t success: sinf(0.0f) == 0.0f\n");
|
|
||||||
|
|
||||||
} else {
|
|
||||||
printf("\t FAIL: sinf(0.0f) != 0.0f, result: %8.4f\n", (double)sinf_zero);
|
|
||||||
ret = -4;
|
|
||||||
}
|
|
||||||
|
|
||||||
fflush(stdout);
|
|
||||||
|
|
||||||
if (fabsf((sinf_one - 0.841470956802368164062500000000f)) < FLT_EPSILON) {
|
|
||||||
printf("\t success: sinf(1.0f) == 0.84147f\n");
|
|
||||||
|
|
||||||
} else {
|
|
||||||
printf("\t FAIL: sinf(1.0f) != 0.84147f, result: %8.4f\n", (double)sinf_one);
|
|
||||||
ret = -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
fflush(stdout);
|
|
||||||
|
|
||||||
float asinf_one = asinf(1.0f);
|
|
||||||
|
|
||||||
if (fabsf((asinf_one - 1.570796251296997070312500000000f)) < FLT_EPSILON * 1.5f) {
|
|
||||||
printf("\t success: asinf(1.0f) == 1.57079f\n");
|
|
||||||
|
|
||||||
} else {
|
|
||||||
printf("\t FAIL: asinf(1.0f) != 1.57079f, result: %f\n", (double)asinf_one);
|
|
||||||
ret = -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
fflush(stdout);
|
|
||||||
|
|
||||||
float cosf_one = cosf(1.0f);
|
|
||||||
|
|
||||||
if (fabsf((cosf_one - 0.540302336215972900390625000000f)) < FLT_EPSILON) {
|
|
||||||
printf("\t success: cosf(1.0f) == 0.54030f\n");
|
|
||||||
|
|
||||||
} else {
|
|
||||||
printf("\t FAIL: cosf(1.0f) != 0.54030f, result: %8.4f\n", (double)cosf_one);
|
|
||||||
ret = -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
fflush(stdout);
|
|
||||||
|
|
||||||
|
|
||||||
float acosf_one = acosf(1.0f);
|
|
||||||
|
|
||||||
if (fabsf((acosf_one - 0.000000000000000000000000000000f)) < FLT_EPSILON) {
|
|
||||||
printf("\t success: acosf(1.0f) == 0.0f\n");
|
|
||||||
|
|
||||||
} else {
|
|
||||||
printf("\t FAIL: acosf(1.0f) != 0.0f, result: %8.4f\n", (double)acosf_one);
|
|
||||||
ret = -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
fflush(stdout);
|
|
||||||
|
|
||||||
|
|
||||||
float sinf_zero_one = sinf(0.1f);
|
|
||||||
|
|
||||||
if (fabsf(sinf_zero_one - 0.0998334166f) < FLT_EPSILON) {
|
|
||||||
printf("\t success: sinf(0.1f) == 0.09983f\n");
|
|
||||||
|
|
||||||
} else {
|
|
||||||
printf("\t FAIL: sinf(0.1f) != 0.09983f, result: %8.4f\n", (double)sinf_zero_one);
|
|
||||||
ret = -2;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (fabsf(sqrt_two - 1.41421356f) < FLT_EPSILON) {
|
|
||||||
printf("\t success: sqrt(2.0f) == 1.41421f\n");
|
|
||||||
|
|
||||||
} else {
|
|
||||||
printf("\t FAIL: sqrt(2.0f) != 1.41421f, result: %8.4f\n", (double)sinf_zero_one);
|
|
||||||
ret = -3;
|
|
||||||
}
|
|
||||||
|
|
||||||
float atan2f_ones = atan2f(1.0f, 1.0f);
|
|
||||||
|
|
||||||
if (fabsf(atan2f_ones - 0.785398163397448278999490867136f) < 2.0f * FLT_EPSILON) {
|
|
||||||
printf("\t success: atan2f(1.0f, 1.0f) == 0.78539f\n");
|
|
||||||
|
|
||||||
} else {
|
|
||||||
printf("\t FAIL: atan2f(1.0f, 1.0f) != 0.78539f, result: %8.4f\n", (double)atan2f_ones);
|
|
||||||
ret = -4;
|
|
||||||
}
|
|
||||||
|
|
||||||
char sbuf[30];
|
|
||||||
sprintf(sbuf, "%8.4f", (double)0.553415f);
|
|
||||||
|
|
||||||
if (sbuf[0] == ' ' && sbuf[1] == ' ' && sbuf[2] == '0' &&
|
|
||||||
sbuf[3] == '.' && sbuf[4] == '5' && sbuf[5] == '5'
|
|
||||||
&& sbuf[6] == '3' && sbuf[7] == '4' && sbuf[8] == '\0') {
|
|
||||||
printf("\t success: printf(\"%%8.4f\", 0.553415f) == %8.4f\n", (double)0.553415f);
|
|
||||||
|
|
||||||
} else {
|
|
||||||
printf("\t FAIL: printf(\"%%8.4f\", 0.553415f) != \" 0.5534\", result: %s\n", sbuf);
|
|
||||||
ret = -5;
|
|
||||||
}
|
|
||||||
|
|
||||||
sprintf(sbuf, "%8.4f", (double) - 0.553415f);
|
|
||||||
|
|
||||||
if (sbuf[0] == ' ' && sbuf[1] == '-' && sbuf[2] == '0' &&
|
|
||||||
sbuf[3] == '.' && sbuf[4] == '5' && sbuf[5] == '5'
|
|
||||||
&& sbuf[6] == '3' && sbuf[7] == '4' && sbuf[8] == '\0') {
|
|
||||||
printf("\t success: printf(\"%%8.4f\", -0.553415f) == %8.4f\n", (double) - 0.553415f);
|
|
||||||
|
|
||||||
} else {
|
|
||||||
printf("\t FAIL: printf(\"%%8.4f\", -0.553415f) != \" -0.5534\", result: %s\n", sbuf);
|
|
||||||
ret = -6;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
printf("\n--- DOUBLE PRECISION TESTS ---\n");
|
|
||||||
|
|
||||||
double d1 = 1.0111;
|
|
||||||
double d2 = 2.0;
|
|
||||||
|
|
||||||
double d1d2 = d1 * d2;
|
|
||||||
|
|
||||||
if (fabs(d1d2 - 2.022200000000000219557705349871) < DBL_EPSILON) {
|
|
||||||
printf("\t success: 1.0111 * 2.0 == 2.0222\n");
|
|
||||||
|
|
||||||
} else {
|
|
||||||
printf("\t FAIL: 1.0111 * 2.0 != 2.0222, result: %8.4f\n", d1d2);
|
|
||||||
ret = -7;
|
|
||||||
}
|
|
||||||
|
|
||||||
fflush(stdout);
|
|
||||||
|
|
||||||
// Assign value of f1 to d1
|
|
||||||
d1 = f1;
|
|
||||||
|
|
||||||
if (fabsf(f1 - (float)d1) < FLT_EPSILON) {
|
|
||||||
printf("\t success: (float) 1.55f == 1.55 (double)\n");
|
|
||||||
|
|
||||||
} else {
|
|
||||||
printf("\t FAIL: (float) 1.55f != 1.55 (double), result: %8.4f\n", (double)f1);
|
|
||||||
ret = -8;
|
|
||||||
}
|
|
||||||
|
|
||||||
fflush(stdout);
|
|
||||||
|
|
||||||
|
|
||||||
double sin_zero = sin(0.0);
|
|
||||||
double sin_one = sin(1.0);
|
|
||||||
double atan2_ones = atan2(1.0, 1.0);
|
|
||||||
|
|
||||||
if (fabs(sin_zero - 0.0) < DBL_EPSILON) {
|
|
||||||
printf("\t success: sin(0.0) == 0.0\n");
|
|
||||||
|
|
||||||
} else {
|
|
||||||
printf("\t FAIL: sin(0.0) != 0.0, result: %8.4f\n", sin_zero);
|
|
||||||
ret = -9;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (fabs(sin_one - 0.841470984807896504875657228695) < DBL_EPSILON) {
|
|
||||||
printf("\t success: sin(1.0) == 0.84147098480\n");
|
|
||||||
|
|
||||||
} else {
|
|
||||||
printf("\t FAIL: sin(1.0) != 1.0, result: %8.4f\n", sin_one);
|
|
||||||
ret = -10;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (fabs(atan2_ones - 0.785398163397448278999490867136) < 2.0 * DBL_EPSILON) {
|
|
||||||
printf("\t success: atan2(1.0, 1.0) == 0.785398\n");
|
|
||||||
|
|
||||||
} else {
|
|
||||||
printf("\t FAIL: atan2(1.0, 1.0) != 0.785398, result: %8.4f\n", atan2_ones);
|
|
||||||
ret = -11;
|
|
||||||
}
|
|
||||||
|
|
||||||
printf("\t testing pow() with magic value\n");
|
|
||||||
printf("\t (44330.0 * (1.0 - pow((96286LL / 101325.0), 0.190295)));\n");
|
|
||||||
fflush(stdout);
|
|
||||||
usleep(20000);
|
|
||||||
double powres = (44330.0 * (1.0 - pow((96286LL / 101325.0), 0.190295)));
|
|
||||||
printf("\t success: result: %8.4f\n", (double)powres);
|
|
||||||
|
|
||||||
sprintf(sbuf, "%8.4f", 0.553415);
|
|
||||||
|
|
||||||
if (sbuf[0] == ' ' && sbuf[1] == ' ' && sbuf[2] == '0' &&
|
|
||||||
sbuf[3] == '.' && sbuf[4] == '5' && sbuf[5] == '5'
|
|
||||||
&& sbuf[6] == '3' && sbuf[7] == '4' && sbuf[8] == '\0') {
|
|
||||||
printf("\t success: printf(\"%%8.4f\", 0.553415) == %8.4f\n", 0.553415);
|
|
||||||
|
|
||||||
} else {
|
|
||||||
printf("\t FAIL: printf(\"%%8.4f\", 0.553415) != \" 0.5534\", result: %s\n", sbuf);
|
|
||||||
ret = -12;
|
|
||||||
}
|
|
||||||
|
|
||||||
sprintf(sbuf, "%8.4f", -0.553415);
|
|
||||||
|
|
||||||
if (sbuf[0] == ' ' && sbuf[1] == '-' && sbuf[2] == '0' &&
|
|
||||||
sbuf[3] == '.' && sbuf[4] == '5' && sbuf[5] == '5'
|
|
||||||
&& sbuf[6] == '3' && sbuf[7] == '4' && sbuf[8] == '\0') {
|
|
||||||
printf("\t success: printf(\"%%8.4f\", -0.553415) == %8.4f\n", -0.553415);
|
|
||||||
|
|
||||||
} else {
|
|
||||||
printf("\t FAIL: printf(\"%%8.4f\", -0.553415) != \" -0.5534\", result: %s\n", sbuf);
|
|
||||||
ret = -13;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if (ret == 0) {
|
|
||||||
printf("\n SUCCESS: All float and double tests passed.\n");
|
|
||||||
|
|
||||||
} else {
|
|
||||||
printf("\n FAIL: One or more tests failed.\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
printf("\n");
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,149 @@
|
|||||||
|
#include <unit_test/unit_test.h>
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <float.h>
|
||||||
|
#include <math.h>
|
||||||
|
#include <px4_config.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
typedef union {
|
||||||
|
float f;
|
||||||
|
double d;
|
||||||
|
uint8_t b[8];
|
||||||
|
} test_float_double_t;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class FloatTest : public UnitTest
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
virtual bool run_tests(void);
|
||||||
|
|
||||||
|
private:
|
||||||
|
bool singlePrecisionTests();
|
||||||
|
bool doublePrecisionTests();
|
||||||
|
};
|
||||||
|
|
||||||
|
bool FloatTest::singlePrecisionTests(void)
|
||||||
|
{
|
||||||
|
float sinf_zero = sinf(0.0f);
|
||||||
|
float sinf_one = sinf(1.0f);
|
||||||
|
float sqrt_two = sqrt(2.0f);
|
||||||
|
|
||||||
|
ut_assert("sinf(0.0f) == 0.0f", fabsf(sinf_zero) < FLT_EPSILON);
|
||||||
|
ut_assert("sinf(1.0f) == 0.84147f", fabsf((sinf_one - 0.841470956802368164062500000000f)) < FLT_EPSILON);
|
||||||
|
|
||||||
|
float asinf_one = asinf(1.0f);
|
||||||
|
ut_assert("asinf(1.0f) == 1.57079f", fabsf((asinf_one - 1.570796251296997070312500000000f)) < FLT_EPSILON * 1.5f);
|
||||||
|
|
||||||
|
float cosf_one = cosf(1.0f);
|
||||||
|
ut_assert("cosf(1.0f) == 0.54030f", fabsf((cosf_one - 0.540302336215972900390625000000f)) < FLT_EPSILON);
|
||||||
|
|
||||||
|
float acosf_one = acosf(1.0f);
|
||||||
|
ut_assert("acosf(1.0f) == 0.0f", fabsf((acosf_one - 0.000000000000000000000000000000f)) < FLT_EPSILON);
|
||||||
|
|
||||||
|
float sinf_zero_one = sinf(0.1f);
|
||||||
|
ut_assert("sinf(0.1f) == 0.09983f", fabsf(sinf_zero_one - 0.0998334166f) < FLT_EPSILON);
|
||||||
|
|
||||||
|
ut_assert("sqrt(2.0f) == 1.41421f", fabsf(sqrt_two - 1.41421356f) < FLT_EPSILON);
|
||||||
|
|
||||||
|
float atan2f_ones = atan2f(1.0f, 1.0f);
|
||||||
|
ut_assert("atan2f(1.0f, 1.0f) == 0.78539f",
|
||||||
|
fabsf(atan2f_ones - 0.785398163397448278999490867136f) < 2.0f * FLT_EPSILON);
|
||||||
|
|
||||||
|
char sbuf[30];
|
||||||
|
sprintf(sbuf, "%8.4f", (double)0.553415f);
|
||||||
|
ut_compare("sbuf[0]", sbuf[0], ' ');
|
||||||
|
ut_compare("sbuf[1]", sbuf[1], ' ');
|
||||||
|
ut_compare("sbuf[2]", sbuf[2], '0');
|
||||||
|
ut_compare("sbuf[3]", sbuf[3], '.');
|
||||||
|
ut_compare("sbuf[4]", sbuf[4], '5');
|
||||||
|
ut_compare("sbuf[5]", sbuf[5], '5');
|
||||||
|
ut_compare("sbuf[6]", sbuf[6], '3');
|
||||||
|
ut_compare("sbuf[7]", sbuf[7], '4');
|
||||||
|
ut_compare("sbuf[8]", sbuf[8], '\0');
|
||||||
|
|
||||||
|
sprintf(sbuf, "%8.4f", (double) - 0.553415f);
|
||||||
|
ut_compare("sbuf[0]", sbuf[0], ' ');
|
||||||
|
ut_compare("sbuf[1]", sbuf[1], '-');
|
||||||
|
ut_compare("sbuf[2]", sbuf[2], '0');
|
||||||
|
ut_compare("sbuf[3]", sbuf[3], '.');
|
||||||
|
ut_compare("sbuf[4]", sbuf[4], '5');
|
||||||
|
ut_compare("sbuf[5]", sbuf[5], '5');
|
||||||
|
ut_compare("sbuf[6]", sbuf[6], '3');
|
||||||
|
ut_compare("sbuf[7]", sbuf[7], '4');
|
||||||
|
ut_compare("sbuf[8]", sbuf[8], '\0');
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool FloatTest::doublePrecisionTests(void)
|
||||||
|
{
|
||||||
|
float f1 = 1.55f;
|
||||||
|
|
||||||
|
double d1 = 1.0111;
|
||||||
|
double d2 = 2.0;
|
||||||
|
|
||||||
|
double d1d2 = d1 * d2;
|
||||||
|
|
||||||
|
ut_assert("1.0111 * 2.0 == 2.0222", fabs(d1d2 - 2.022200000000000219557705349871) < DBL_EPSILON);
|
||||||
|
|
||||||
|
// Assign value of f1 to d1
|
||||||
|
d1 = f1;
|
||||||
|
|
||||||
|
ut_assert("(float) 1.55f == 1.55 (double)", fabsf(f1 - (float)d1) < FLT_EPSILON);
|
||||||
|
|
||||||
|
|
||||||
|
double sin_zero = sin(0.0);
|
||||||
|
double sin_one = sin(1.0);
|
||||||
|
double atan2_ones = atan2(1.0, 1.0);
|
||||||
|
|
||||||
|
ut_assert("sin(0.0) == 0.0", fabs(sin_zero - 0.0) < DBL_EPSILON);
|
||||||
|
ut_assert("sin(1.0) == 0.84147098480", fabs(sin_one - 0.841470984807896504875657228695) < DBL_EPSILON);
|
||||||
|
ut_assert("atan2(1.0, 1.0) == 0.785398", fabs(atan2_ones - 0.785398163397448278999490867136) < 2.0 * DBL_EPSILON);
|
||||||
|
ut_assert("testing pow() with magic value",
|
||||||
|
(44330.0 * (1.0 - pow((96286LL / 101325.0), 0.190295))) - 428.2293 < DBL_EPSILON);
|
||||||
|
|
||||||
|
|
||||||
|
char sbuf[30];
|
||||||
|
sprintf(sbuf, "%8.4f", 0.553415);
|
||||||
|
ut_compare("sbuf[0]", sbuf[0], ' ');
|
||||||
|
ut_compare("sbuf[1]", sbuf[1], ' ');
|
||||||
|
ut_compare("sbuf[2]", sbuf[2], '0');
|
||||||
|
ut_compare("sbuf[3]", sbuf[3], '.');
|
||||||
|
ut_compare("sbuf[4]", sbuf[4], '5');
|
||||||
|
ut_compare("sbuf[5]", sbuf[5], '5');
|
||||||
|
ut_compare("sbuf[6]", sbuf[6], '3');
|
||||||
|
ut_compare("sbuf[7]", sbuf[7], '4');
|
||||||
|
ut_compare("sbuf[8]", sbuf[8], '\0');
|
||||||
|
|
||||||
|
|
||||||
|
sprintf(sbuf, "%8.4f", -0.553415);
|
||||||
|
ut_compare("sbuf[0]", sbuf[0], ' ');
|
||||||
|
ut_compare("sbuf[1]", sbuf[1], '-');
|
||||||
|
ut_compare("sbuf[2]", sbuf[2], '0');
|
||||||
|
ut_compare("sbuf[3]", sbuf[3], '.');
|
||||||
|
ut_compare("sbuf[4]", sbuf[4], '5');
|
||||||
|
ut_compare("sbuf[5]", sbuf[5], '5');
|
||||||
|
ut_compare("sbuf[6]", sbuf[6], '3');
|
||||||
|
ut_compare("sbuf[7]", sbuf[7], '4');
|
||||||
|
ut_compare("sbuf[8]", sbuf[8], '\0');
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool FloatTest::run_tests(void)
|
||||||
|
{
|
||||||
|
ut_run_test(singlePrecisionTests);
|
||||||
|
ut_run_test(doublePrecisionTests);
|
||||||
|
|
||||||
|
return (_tests_failed == 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
ut_declare_test_c(test_float, FloatTest)
|
||||||
@@ -1,152 +0,0 @@
|
|||||||
/****************************************************************************
|
|
||||||
* px4/sensors/test_gpio.c
|
|
||||||
*
|
|
||||||
* Copyright (C) 2012 PX4 Development Team. All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
*
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in
|
|
||||||
* the documentation and/or other materials provided with the
|
|
||||||
* distribution.
|
|
||||||
* 3. Neither the name NuttX nor the names of its contributors may be
|
|
||||||
* used to endorse or promote products derived from this software
|
|
||||||
* without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
|
||||||
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
|
||||||
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
||||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
|
||||||
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
|
|
||||||
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
|
||||||
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
||||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
|
||||||
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
* POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
* Included Files
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
#include <inttypes.h>
|
|
||||||
|
|
||||||
#include <px4_config.h>
|
|
||||||
#include <px4_defines.h>
|
|
||||||
|
|
||||||
#include <sys/types.h>
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include <errno.h>
|
|
||||||
|
|
||||||
#include <arch/board/board.h>
|
|
||||||
|
|
||||||
#include "tests.h"
|
|
||||||
|
|
||||||
#include <math.h>
|
|
||||||
#include <float.h>
|
|
||||||
|
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
* Pre-processor Definitions
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
* Private Types
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
* Private Function Prototypes
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
* Private Data
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
* Public Data
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
* Private Functions
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
* Public Functions
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
* Name: test_led
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
typedef union {
|
|
||||||
int32_t i;
|
|
||||||
int64_t l;
|
|
||||||
uint8_t b[8];
|
|
||||||
} test_32_64_t;
|
|
||||||
|
|
||||||
int test_int(int argc, char *argv[])
|
|
||||||
{
|
|
||||||
int ret = 0;
|
|
||||||
|
|
||||||
printf("\n--- 64 BIT MATH TESTS ---\n");
|
|
||||||
|
|
||||||
int64_t large = 354156329598;
|
|
||||||
|
|
||||||
int64_t calc = large * 5;
|
|
||||||
|
|
||||||
if (calc == 1770781647990) {
|
|
||||||
printf("\t success: 354156329598 * 5 == %" PRId64 "\n", calc);
|
|
||||||
|
|
||||||
} else {
|
|
||||||
printf("\t FAIL: 354156329598 * 5 != %" PRId64 "\n", calc);
|
|
||||||
ret = -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
fflush(stdout);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
printf("\n--- 32 BIT / 64 BIT MIXED MATH TESTS ---\n");
|
|
||||||
|
|
||||||
|
|
||||||
int32_t small = 50;
|
|
||||||
int32_t large_int = 2147483647; // MAX INT value
|
|
||||||
|
|
||||||
uint64_t small_times_large = large_int * (uint64_t)small;
|
|
||||||
|
|
||||||
if (small_times_large == 107374182350) {
|
|
||||||
printf("\t success: 64bit calculation: 50 * 2147483647 (max int val) == %" PRId64 "\n", small_times_large);
|
|
||||||
|
|
||||||
} else {
|
|
||||||
printf("\t FAIL: 50 * 2147483647 != %" PRId64 ", 64bit cast might fail\n", small_times_large);
|
|
||||||
ret = -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
fflush(stdout);
|
|
||||||
|
|
||||||
if (ret == 0) {
|
|
||||||
printf("\n SUCCESS: All float and double tests passed.\n");
|
|
||||||
|
|
||||||
} else {
|
|
||||||
printf("\n FAIL: One or more tests failed.\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
printf("\n");
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,61 @@
|
|||||||
|
#include <unit_test/unit_test.h>
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <float.h>
|
||||||
|
#include <math.h>
|
||||||
|
#include <px4_config.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
typedef union {
|
||||||
|
int32_t i;
|
||||||
|
int64_t l;
|
||||||
|
uint8_t b[8];
|
||||||
|
} test_32_64_t;
|
||||||
|
|
||||||
|
class IntTest : public UnitTest
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
virtual bool run_tests(void);
|
||||||
|
|
||||||
|
private:
|
||||||
|
bool math64bitTests();
|
||||||
|
bool math3264MixedMathTests();
|
||||||
|
};
|
||||||
|
|
||||||
|
bool IntTest::math64bitTests(void)
|
||||||
|
{
|
||||||
|
int64_t large = 354156329598;
|
||||||
|
int64_t calc = large * 5;
|
||||||
|
|
||||||
|
ut_assert("354156329598 * 5 == 1770781647990", calc == 1770781647990);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool IntTest::math3264MixedMathTests(void)
|
||||||
|
{
|
||||||
|
int32_t small = 50;
|
||||||
|
int32_t large_int = 2147483647; // MAX INT value
|
||||||
|
|
||||||
|
uint64_t small_times_large = large_int * (uint64_t)small;
|
||||||
|
|
||||||
|
ut_assert("64bit calculation: 50 * 2147483647 (max int val) == 107374182350", small_times_large == 107374182350);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool IntTest::run_tests(void)
|
||||||
|
{
|
||||||
|
ut_run_test(math64bitTests);
|
||||||
|
ut_run_test(math3264MixedMathTests);
|
||||||
|
|
||||||
|
return (_tests_failed == 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
ut_declare_test_c(test_int, IntTest)
|
||||||
@@ -31,11 +31,18 @@
|
|||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
/**
|
#include <unit_test/unit_test.h>
|
||||||
* @file test_mathlib.cpp
|
|
||||||
*
|
#include <errno.h>
|
||||||
* Mathlib test
|
#include <fcntl.h>
|
||||||
*/
|
#include <float.h>
|
||||||
|
#include <math.h>
|
||||||
|
#include <px4_config.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
#include <px4_log.h>
|
#include <px4_log.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
@@ -47,17 +54,33 @@
|
|||||||
#include <systemlib/err.h>
|
#include <systemlib/err.h>
|
||||||
#include <drivers/drv_hrt.h>
|
#include <drivers/drv_hrt.h>
|
||||||
|
|
||||||
|
class MathlibTest : public UnitTest
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
virtual bool run_tests(void);
|
||||||
|
|
||||||
|
private:
|
||||||
|
bool testVector2();
|
||||||
|
bool testVector3();
|
||||||
|
bool testVector4();
|
||||||
|
bool testVector10();
|
||||||
|
bool testMatrix3x3();
|
||||||
|
bool testMatrix10x10();
|
||||||
|
bool testMatrixNonsymmetric();
|
||||||
|
bool testRotationMatrixQuaternion();
|
||||||
|
bool testQuaternionfrom_dcm();
|
||||||
|
bool testQuaternionfrom_euler();
|
||||||
|
bool testQuaternionRotate();
|
||||||
|
};
|
||||||
|
|
||||||
#include "tests.h"
|
#include "tests.h"
|
||||||
|
|
||||||
#define TEST_OP(_title, _op) { unsigned int n = 30000; hrt_abstime t0, t1; t0 = hrt_absolute_time(); for (unsigned int j = 0; j < n; j++) { _op; }; t1 = hrt_absolute_time(); PX4_INFO(_title ": %.6fus", (double)(t1 - t0) / n); }
|
#define TEST_OP(_title, _op) { unsigned int n = 30000; hrt_abstime t0, t1; t0 = hrt_absolute_time(); for (unsigned int j = 0; j < n; j++) { _op; }; t1 = hrt_absolute_time(); PX4_INFO(_title ": %.6fus", (double)(t1 - t0) / n); }
|
||||||
|
|
||||||
using namespace math;
|
using namespace math;
|
||||||
|
|
||||||
int test_mathlib(int argc, char *argv[])
|
bool MathlibTest::testVector2(void)
|
||||||
{
|
{
|
||||||
int rc = 0;
|
|
||||||
PX4_INFO("testing mathlib");
|
|
||||||
|
|
||||||
{
|
{
|
||||||
Vector<2> v;
|
Vector<2> v;
|
||||||
Vector<2> v1(1.0f, 2.0f);
|
Vector<2> v1(1.0f, 2.0f);
|
||||||
@@ -75,6 +98,11 @@ int test_mathlib(int argc, char *argv[])
|
|||||||
TEST_OP("Vector<2> * Vector<2>", v * v1);
|
TEST_OP("Vector<2> * Vector<2>", v * v1);
|
||||||
TEST_OP("Vector<2> %% Vector<2>", v1 % v2);
|
TEST_OP("Vector<2> %% Vector<2>", v1 % v2);
|
||||||
}
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool MathlibTest::testVector3(void)
|
||||||
|
{
|
||||||
|
|
||||||
{
|
{
|
||||||
Vector<3> v;
|
Vector<3> v;
|
||||||
@@ -108,7 +136,11 @@ int test_mathlib(int argc, char *argv[])
|
|||||||
TEST_OP("Vector<3> element write", v1(0) = 1.0f);
|
TEST_OP("Vector<3> element write", v1(0) = 1.0f);
|
||||||
TEST_OP("Vector<3> element write direct", v1.data[0] = 1.0f);
|
TEST_OP("Vector<3> element write direct", v1.data[0] = 1.0f);
|
||||||
}
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool MathlibTest::testVector4(void)
|
||||||
|
{
|
||||||
{
|
{
|
||||||
Vector<4> v;
|
Vector<4> v;
|
||||||
Vector<4> v1(1.0f, 2.0f, 0.0f, -1.0f);
|
Vector<4> v1(1.0f, 2.0f, 0.0f, -1.0f);
|
||||||
@@ -125,7 +157,11 @@ int test_mathlib(int argc, char *argv[])
|
|||||||
TEST_OP("Vector<4> -= Vector<4>", v -= v1);
|
TEST_OP("Vector<4> -= Vector<4>", v -= v1);
|
||||||
TEST_OP("Vector<4> * Vector<4>", v * v1);
|
TEST_OP("Vector<4> * Vector<4>", v * v1);
|
||||||
}
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool MathlibTest::testVector10(void)
|
||||||
|
{
|
||||||
{
|
{
|
||||||
Vector<10> v1;
|
Vector<10> v1;
|
||||||
v1.zero();
|
v1.zero();
|
||||||
@@ -134,7 +170,11 @@ int test_mathlib(int argc, char *argv[])
|
|||||||
TEST_OP("Constructor Vector<10>(Vector<10>)", Vector<10> v3(v1));
|
TEST_OP("Constructor Vector<10>(Vector<10>)", Vector<10> v3(v1));
|
||||||
TEST_OP("Constructor Vector<10>(float[])", Vector<10> v3(data));
|
TEST_OP("Constructor Vector<10>(float[])", Vector<10> v3(data));
|
||||||
}
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool MathlibTest::testMatrix3x3(void)
|
||||||
|
{
|
||||||
{
|
{
|
||||||
Matrix<3, 3> m1;
|
Matrix<3, 3> m1;
|
||||||
m1.identity();
|
m1.identity();
|
||||||
@@ -145,7 +185,11 @@ int test_mathlib(int argc, char *argv[])
|
|||||||
TEST_OP("Matrix<3, 3> + Matrix<3, 3>", m1 + m2);
|
TEST_OP("Matrix<3, 3> + Matrix<3, 3>", m1 + m2);
|
||||||
TEST_OP("Matrix<3, 3> * Matrix<3, 3>", m1 * m2);
|
TEST_OP("Matrix<3, 3> * Matrix<3, 3>", m1 * m2);
|
||||||
}
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool MathlibTest::testMatrix10x10(void)
|
||||||
|
{
|
||||||
{
|
{
|
||||||
Matrix<10, 10> m1;
|
Matrix<10, 10> m1;
|
||||||
m1.identity();
|
m1.identity();
|
||||||
@@ -157,9 +201,14 @@ int test_mathlib(int argc, char *argv[])
|
|||||||
TEST_OP("Matrix<10, 10> + Matrix<10, 10>", m1 + m2);
|
TEST_OP("Matrix<10, 10> + Matrix<10, 10>", m1 + m2);
|
||||||
TEST_OP("Matrix<10, 10> * Matrix<10, 10>", m1 * m2);
|
TEST_OP("Matrix<10, 10> * Matrix<10, 10>", m1 * m2);
|
||||||
}
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool MathlibTest::testMatrixNonsymmetric(void)
|
||||||
|
{
|
||||||
|
int rc = true;
|
||||||
{
|
{
|
||||||
PX4_INFO("Nonsymmetric matrix operations test");
|
//PX4_INFO("Nonsymmetric matrix operations test");
|
||||||
// test nonsymmetric +, -, +=, -=
|
// test nonsymmetric +, -, +=, -=
|
||||||
|
|
||||||
float data1[2][3] = {{1, 2, 3}, {4, 5, 6}};
|
float data1[2][3] = {{1, 2, 3}, {4, 5, 6}};
|
||||||
@@ -175,17 +224,21 @@ int test_mathlib(int argc, char *argv[])
|
|||||||
(m1 + m2).print();
|
(m1 + m2).print();
|
||||||
printf("!=\n");
|
printf("!=\n");
|
||||||
m3.print();
|
m3.print();
|
||||||
rc = 1;
|
rc = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ut_assert("m1 + m2 == m3", m1 + m2 == m3);
|
||||||
|
|
||||||
if (m3 - m2 != m1) {
|
if (m3 - m2 != m1) {
|
||||||
PX4_ERR("Matrix<2, 3> - Matrix<2, 3> failed!");
|
PX4_ERR("Matrix<2, 3> - Matrix<2, 3> failed!");
|
||||||
(m3 - m2).print();
|
(m3 - m2).print();
|
||||||
printf("!=\n");
|
printf("!=\n");
|
||||||
m1.print();
|
m1.print();
|
||||||
rc = 1;
|
rc = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ut_assert("m3 - m2 == m1", m3 - m2 == m1);
|
||||||
|
|
||||||
m1 += m2;
|
m1 += m2;
|
||||||
|
|
||||||
if (m1 != m3) {
|
if (m1 != m3) {
|
||||||
@@ -193,9 +246,11 @@ int test_mathlib(int argc, char *argv[])
|
|||||||
m1.print();
|
m1.print();
|
||||||
printf("!=\n");
|
printf("!=\n");
|
||||||
m3.print();
|
m3.print();
|
||||||
rc = 1;
|
rc = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ut_assert("m1 == m3", m1 == m3);
|
||||||
|
|
||||||
m1 -= m2;
|
m1 -= m2;
|
||||||
Matrix<2, 3> m1_orig(data1);
|
Matrix<2, 3> m1_orig(data1);
|
||||||
|
|
||||||
@@ -204,160 +259,181 @@ int test_mathlib(int argc, char *argv[])
|
|||||||
m1.print();
|
m1.print();
|
||||||
printf("!=\n");
|
printf("!=\n");
|
||||||
m1_orig.print();
|
m1_orig.print();
|
||||||
rc = 1;
|
rc = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
ut_assert("m1 == m1_orig", m1 == m1_orig);
|
||||||
|
|
||||||
{
|
|
||||||
// test conversion rotation matrix to quaternion and back
|
|
||||||
math::Matrix<3, 3> R_orig;
|
|
||||||
math::Matrix<3, 3> R;
|
|
||||||
math::Quaternion q;
|
|
||||||
float diff = 0.1f;
|
|
||||||
float tol = 0.00001f;
|
|
||||||
|
|
||||||
PX4_INFO("Quaternion transformation methods test.");
|
|
||||||
|
|
||||||
for (float roll = -M_PI_F; roll <= M_PI_F; roll += diff) {
|
|
||||||
for (float pitch = -M_PI_2_F; pitch <= M_PI_2_F; pitch += diff) {
|
|
||||||
for (float yaw = -M_PI_F; yaw <= M_PI_F; yaw += diff) {
|
|
||||||
R_orig.from_euler(roll, pitch, yaw);
|
|
||||||
q.from_dcm(R_orig);
|
|
||||||
R = q.to_dcm();
|
|
||||||
|
|
||||||
for (int i = 0; i < 3; i++) {
|
|
||||||
for (int j = 0; j < 3; j++) {
|
|
||||||
if (fabsf(R_orig.data[i][j] - R.data[i][j]) > 0.00001f) {
|
|
||||||
PX4_WARN("Quaternion method 'from_dcm' or 'to_dcm' outside tolerance!");
|
|
||||||
rc = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// test against some known values
|
|
||||||
tol = 0.0001f;
|
|
||||||
math::Quaternion q_true = {1.0f, 0.0f, 0.0f, 0.0f};
|
|
||||||
R_orig.identity();
|
|
||||||
q.from_dcm(R_orig);
|
|
||||||
|
|
||||||
for (unsigned i = 0; i < 4; i++) {
|
|
||||||
if (fabsf(q.data[i] - q_true.data[i]) > tol) {
|
|
||||||
PX4_WARN("Quaternion method 'from_dcm()' outside tolerance!");
|
|
||||||
rc = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
q_true.from_euler(0.3f, 0.2f, 0.1f);
|
|
||||||
q = {0.9833f, 0.1436f, 0.1060f, 0.0343f};
|
|
||||||
|
|
||||||
for (unsigned i = 0; i < 4; i++) {
|
|
||||||
if (fabsf(q.data[i] - q_true.data[i]) > tol) {
|
|
||||||
PX4_WARN("Quaternion method 'from_euler()' outside tolerance!");
|
|
||||||
rc = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
q_true.from_euler(-1.5f, -0.2f, 0.5f);
|
|
||||||
q = {0.7222f, -0.6391f, -0.2386f, 0.1142f};
|
|
||||||
|
|
||||||
for (unsigned i = 0; i < 4; i++) {
|
|
||||||
if (fabsf(q.data[i] - q_true.data[i]) > tol) {
|
|
||||||
PX4_WARN("Quaternion method 'from_euler()' outside tolerance!");
|
|
||||||
rc = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
q_true.from_euler(M_PI_2_F, -M_PI_2_F, -M_PI_F / 3);
|
|
||||||
q = {0.6830f, 0.1830f, -0.6830f, 0.1830f};
|
|
||||||
|
|
||||||
for (unsigned i = 0; i < 4; i++) {
|
|
||||||
if (fabsf(q.data[i] - q_true.data[i]) > tol) {
|
|
||||||
PX4_WARN("Quaternion method 'from_euler()' outside tolerance!");
|
|
||||||
rc = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
|
||||||
// test quaternion method "rotate" (rotate vector by quaternion)
|
|
||||||
Vector<3> vector = {1.0f, 1.0f, 1.0f};
|
|
||||||
Vector<3> vector_q;
|
|
||||||
Vector<3> vector_r;
|
|
||||||
Quaternion q;
|
|
||||||
Matrix<3, 3> R;
|
|
||||||
float diff = 0.1f;
|
|
||||||
float tol = 0.00001f;
|
|
||||||
|
|
||||||
PX4_INFO("Quaternion vector rotation method test.");
|
|
||||||
|
|
||||||
for (float roll = -M_PI_F; roll <= M_PI_F; roll += diff) {
|
|
||||||
for (float pitch = -M_PI_2_F; pitch <= M_PI_2_F; pitch += diff) {
|
|
||||||
for (float yaw = -M_PI_F; yaw <= M_PI_F; yaw += diff) {
|
|
||||||
R.from_euler(roll, pitch, yaw);
|
|
||||||
q.from_euler(roll, pitch, yaw);
|
|
||||||
vector_r = R * vector;
|
|
||||||
vector_q = q.conjugate(vector);
|
|
||||||
|
|
||||||
for (int i = 0; i < 3; i++) {
|
|
||||||
if (fabsf(vector_r(i) - vector_q(i)) > tol) {
|
|
||||||
PX4_WARN("Quaternion method 'rotate' outside tolerance");
|
|
||||||
rc = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// test some values calculated with matlab
|
|
||||||
tol = 0.0001f;
|
|
||||||
q.from_euler(M_PI_2_F, 0.0f, 0.0f);
|
|
||||||
vector_q = q.conjugate(vector);
|
|
||||||
Vector<3> vector_true = {1.00f, -1.00f, 1.00f};
|
|
||||||
|
|
||||||
for (unsigned i = 0; i < 3; i++) {
|
|
||||||
if (fabsf(vector_true(i) - vector_q(i)) > tol) {
|
|
||||||
PX4_WARN("Quaternion method 'rotate' outside tolerance");
|
|
||||||
rc = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
q.from_euler(0.3f, 0.2f, 0.1f);
|
|
||||||
vector_q = q.conjugate(vector);
|
|
||||||
vector_true = {1.1566, 0.7792, 1.0273};
|
|
||||||
|
|
||||||
for (unsigned i = 0; i < 3; i++) {
|
|
||||||
if (fabsf(vector_true(i) - vector_q(i)) > tol) {
|
|
||||||
PX4_WARN("Quaternion method 'rotate' outside tolerance");
|
|
||||||
rc = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
q.from_euler(-1.5f, -0.2f, 0.5f);
|
|
||||||
vector_q = q.conjugate(vector);
|
|
||||||
vector_true = {0.5095, 1.4956, -0.7096};
|
|
||||||
|
|
||||||
for (unsigned i = 0; i < 3; i++) {
|
|
||||||
if (fabsf(vector_true(i) - vector_q(i)) > tol) {
|
|
||||||
PX4_WARN("Quaternion method 'rotate' outside tolerance");
|
|
||||||
rc = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
q.from_euler(M_PI_2_F, -M_PI_2_F, -M_PI_F / 3.0f);
|
|
||||||
vector_q = q.conjugate(vector);
|
|
||||||
vector_true = { -1.3660, 0.3660, 1.0000};
|
|
||||||
|
|
||||||
for (unsigned i = 0; i < 3; i++) {
|
|
||||||
if (fabsf(vector_true(i) - vector_q(i)) > tol) {
|
|
||||||
PX4_WARN("Quaternion method 'rotate' outside tolerance");
|
|
||||||
rc = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool MathlibTest::testRotationMatrixQuaternion(void)
|
||||||
|
{
|
||||||
|
// test conversion rotation matrix to quaternion and back
|
||||||
|
math::Matrix<3, 3> R_orig;
|
||||||
|
math::Matrix<3, 3> R;
|
||||||
|
math::Quaternion q;
|
||||||
|
float diff = 0.2f;
|
||||||
|
float tol = 0.00001f;
|
||||||
|
|
||||||
|
//PX4_INFO("Quaternion transformation methods test.");
|
||||||
|
|
||||||
|
for (float roll = -M_PI_F; roll <= M_PI_F; roll += diff) {
|
||||||
|
for (float pitch = -M_PI_2_F; pitch <= M_PI_2_F; pitch += diff) {
|
||||||
|
for (float yaw = -M_PI_F; yaw <= M_PI_F; yaw += diff) {
|
||||||
|
R_orig.from_euler(roll, pitch, yaw);
|
||||||
|
q.from_dcm(R_orig);
|
||||||
|
R = q.to_dcm();
|
||||||
|
|
||||||
|
for (int i = 0; i < 3; i++) {
|
||||||
|
for (int j = 0; j < 3; j++) {
|
||||||
|
ut_assert("Quaternion method 'from_dcm' or 'to_dcm' outside tolerance!", fabsf(R_orig.data[i][j] - R.data[i][j]) < tol);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool MathlibTest::testQuaternionfrom_dcm(void)
|
||||||
|
{
|
||||||
|
// test against some known values
|
||||||
|
float tol = 0.0001f;
|
||||||
|
math::Quaternion q_true = {1.0f, 0.0f, 0.0f, 0.0f};
|
||||||
|
|
||||||
|
math::Matrix<3, 3> R_orig;
|
||||||
|
R_orig.identity();
|
||||||
|
|
||||||
|
math::Quaternion q;
|
||||||
|
q.from_dcm(R_orig);
|
||||||
|
|
||||||
|
for (unsigned i = 0; i < 4; i++) {
|
||||||
|
ut_assert("Quaternion method 'from_dcm()' outside tolerance!", fabsf(q.data[i] - q_true.data[i]) < tol);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool MathlibTest::testQuaternionfrom_euler(void)
|
||||||
|
{
|
||||||
|
float tol = 0.0001f;
|
||||||
|
math::Quaternion q_true = {1.0f, 0.0f, 0.0f, 0.0f};
|
||||||
|
|
||||||
|
math::Matrix<3, 3> R_orig;
|
||||||
|
R_orig.identity();
|
||||||
|
|
||||||
|
math::Quaternion q;
|
||||||
|
q.from_dcm(R_orig);
|
||||||
|
|
||||||
|
q_true.from_euler(0.3f, 0.2f, 0.1f);
|
||||||
|
q = {0.9833f, 0.1436f, 0.1060f, 0.0343f};
|
||||||
|
|
||||||
|
for (unsigned i = 0; i < 4; i++) {
|
||||||
|
ut_assert("Quaternion method 'from_euler()' outside tolerance!", fabsf(q.data[i] - q_true.data[i]) < tol);
|
||||||
|
}
|
||||||
|
|
||||||
|
q_true.from_euler(-1.5f, -0.2f, 0.5f);
|
||||||
|
q = {0.7222f, -0.6391f, -0.2386f, 0.1142f};
|
||||||
|
|
||||||
|
for (unsigned i = 0; i < 4; i++) {
|
||||||
|
ut_assert("Quaternion method 'from_euler()' outside tolerance!", fabsf(q.data[i] - q_true.data[i]) < tol);
|
||||||
|
}
|
||||||
|
|
||||||
|
q_true.from_euler(M_PI_2_F, -M_PI_2_F, -M_PI_F / 3);
|
||||||
|
q = {0.6830f, 0.1830f, -0.6830f, 0.1830f};
|
||||||
|
|
||||||
|
for (unsigned i = 0; i < 4; i++) {
|
||||||
|
ut_assert("Quaternion method 'from_euler()' outside tolerance!", fabsf(q.data[i] - q_true.data[i]) < tol);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool MathlibTest::testQuaternionRotate(void)
|
||||||
|
{
|
||||||
|
// test quaternion method "rotate" (rotate vector by quaternion)
|
||||||
|
Vector<3> vector = {1.0f, 1.0f, 1.0f};
|
||||||
|
Vector<3> vector_q;
|
||||||
|
Vector<3> vector_r;
|
||||||
|
Quaternion q;
|
||||||
|
Matrix<3, 3> R;
|
||||||
|
float diff = 0.2f;
|
||||||
|
float tol = 0.00001f;
|
||||||
|
|
||||||
|
//PX4_INFO("Quaternion vector rotation method test.");
|
||||||
|
|
||||||
|
for (float roll = -M_PI_F; roll <= M_PI_F; roll += diff) {
|
||||||
|
for (float pitch = -M_PI_2_F; pitch <= M_PI_2_F; pitch += diff) {
|
||||||
|
for (float yaw = -M_PI_F; yaw <= M_PI_F; yaw += diff) {
|
||||||
|
R.from_euler(roll, pitch, yaw);
|
||||||
|
q.from_euler(roll, pitch, yaw);
|
||||||
|
vector_r = R * vector;
|
||||||
|
vector_q = q.conjugate(vector);
|
||||||
|
|
||||||
|
for (int i = 0; i < 3; i++) {
|
||||||
|
ut_assert("Quaternion method 'rotate' outside tolerance", fabsf(vector_r(i) - vector_q(i)) < tol);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// test some values calculated with matlab
|
||||||
|
tol = 0.0001f;
|
||||||
|
q.from_euler(M_PI_2_F, 0.0f, 0.0f);
|
||||||
|
vector_q = q.conjugate(vector);
|
||||||
|
Vector<3> vector_true = {1.00f, -1.00f, 1.00f};
|
||||||
|
|
||||||
|
for (unsigned i = 0; i < 3; i++) {
|
||||||
|
ut_assert("Quaternion method 'rotate' outside tolerance", fabsf(vector_true(i) - vector_q(i)) < tol);
|
||||||
|
}
|
||||||
|
|
||||||
|
q.from_euler(0.3f, 0.2f, 0.1f);
|
||||||
|
vector_q = q.conjugate(vector);
|
||||||
|
vector_true = {1.1566, 0.7792, 1.0273};
|
||||||
|
|
||||||
|
for (unsigned i = 0; i < 3; i++) {
|
||||||
|
ut_assert("Quaternion method 'rotate' outside tolerance", fabsf(vector_true(i) - vector_q(i)) < tol);
|
||||||
|
}
|
||||||
|
|
||||||
|
q.from_euler(-1.5f, -0.2f, 0.5f);
|
||||||
|
vector_q = q.conjugate(vector);
|
||||||
|
vector_true = {0.5095, 1.4956, -0.7096};
|
||||||
|
|
||||||
|
for (unsigned i = 0; i < 3; i++) {
|
||||||
|
ut_assert("Quaternion method 'rotate' outside tolerance", fabsf(vector_true(i) - vector_q(i)) < tol);
|
||||||
|
}
|
||||||
|
|
||||||
|
q.from_euler(M_PI_2_F, -M_PI_2_F, -M_PI_F / 3.0f);
|
||||||
|
vector_q = q.conjugate(vector);
|
||||||
|
vector_true = { -1.3660, 0.3660, 1.0000};
|
||||||
|
|
||||||
|
for (unsigned i = 0; i < 3; i++) {
|
||||||
|
ut_assert("Quaternion method 'rotate' outside tolerance", fabsf(vector_true(i) - vector_q(i)) < tol);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool MathlibTest::run_tests(void)
|
||||||
|
{
|
||||||
|
ut_run_test(testVector2);
|
||||||
|
ut_run_test(testVector3);
|
||||||
|
ut_run_test(testVector4);
|
||||||
|
ut_run_test(testVector10);
|
||||||
|
ut_run_test(testMatrix3x3);
|
||||||
|
ut_run_test(testMatrix10x10);
|
||||||
|
ut_run_test(testMatrixNonsymmetric);
|
||||||
|
ut_run_test(testRotationMatrixQuaternion);
|
||||||
|
ut_run_test(testQuaternionfrom_dcm);
|
||||||
|
ut_run_test(testQuaternionfrom_euler);
|
||||||
|
ut_run_test(testQuaternionRotate);
|
||||||
|
|
||||||
|
return (_tests_failed == 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
ut_declare_test_c(test_mathlib, MathlibTest)
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -85,22 +85,22 @@ int test_mixer(int argc, char *argv[])
|
|||||||
uint16_t servo_predicted[output_max];
|
uint16_t servo_predicted[output_max];
|
||||||
int16_t reverse_pwm_mask = 0;
|
int16_t reverse_pwm_mask = 0;
|
||||||
|
|
||||||
PX4_INFO("testing mixer");
|
//PX4_INFO("testing mixer");
|
||||||
|
|
||||||
|
#if !defined(CONFIG_ARCH_BOARD_SITL)
|
||||||
const char *filename = "/etc/mixers/IO_pass.mix";
|
const char *filename = "/etc/mixers/IO_pass.mix";
|
||||||
|
#else
|
||||||
|
const char *filename = "../../../../ROMFS/px4fmu_test/mixers/IO_pass.mix";
|
||||||
|
#endif
|
||||||
|
|
||||||
if (argc > 1) {
|
//PX4_INFO("loading: %s", filename);
|
||||||
filename = argv[1];
|
|
||||||
}
|
|
||||||
|
|
||||||
PX4_INFO("loading: %s", filename);
|
|
||||||
|
|
||||||
char buf[2048];
|
char buf[2048];
|
||||||
|
|
||||||
load_mixer_file(filename, &buf[0], sizeof(buf));
|
load_mixer_file(filename, &buf[0], sizeof(buf));
|
||||||
unsigned loaded = strlen(buf);
|
unsigned loaded = strlen(buf);
|
||||||
|
|
||||||
fprintf(stderr, "loaded: \n\"%s\"\n (%d chars)", &buf[0], loaded);
|
//fprintf(stderr, "loaded: \n\"%s\"\n (%d chars)", &buf[0], loaded);
|
||||||
|
|
||||||
/* load the mixer in chunks, like
|
/* load the mixer in chunks, like
|
||||||
* in the case of a remote load,
|
* in the case of a remote load,
|
||||||
@@ -114,11 +114,7 @@ int test_mixer(int argc, char *argv[])
|
|||||||
/* load at once test */
|
/* load at once test */
|
||||||
unsigned xx = loaded;
|
unsigned xx = loaded;
|
||||||
mixer_group.load_from_buf(&buf[0], xx);
|
mixer_group.load_from_buf(&buf[0], xx);
|
||||||
PX4_INFO("complete buffer load: loaded %u mixers", mixer_group.count());
|
//ASSERT_EQ(mixer_group.count(), 8);
|
||||||
|
|
||||||
if (mixer_group.count() != 8) {
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned empty_load = 2;
|
unsigned empty_load = 2;
|
||||||
char empty_buf[2];
|
char empty_buf[2];
|
||||||
@@ -126,7 +122,9 @@ int test_mixer(int argc, char *argv[])
|
|||||||
empty_buf[1] = '\0';
|
empty_buf[1] = '\0';
|
||||||
mixer_group.reset();
|
mixer_group.reset();
|
||||||
mixer_group.load_from_buf(&empty_buf[0], empty_load);
|
mixer_group.load_from_buf(&empty_buf[0], empty_load);
|
||||||
PX4_INFO("empty buffer load: loaded %u mixers, used: %u", mixer_group.count(), empty_load);
|
//PX4_INFO("empty buffer load: loaded %u mixers, used: %u", mixer_group.count(), empty_load);
|
||||||
|
|
||||||
|
//ASSERT_NE(empty_load, 0);
|
||||||
|
|
||||||
if (empty_load != 0) {
|
if (empty_load != 0) {
|
||||||
return 1;
|
return 1;
|
||||||
@@ -140,7 +138,7 @@ int test_mixer(int argc, char *argv[])
|
|||||||
|
|
||||||
unsigned transmitted = 0;
|
unsigned transmitted = 0;
|
||||||
|
|
||||||
PX4_INFO("transmitted: %d, loaded: %d", transmitted, loaded);
|
//PX4_INFO("transmitted: %d, loaded: %d", transmitted, loaded);
|
||||||
|
|
||||||
while (transmitted < loaded) {
|
while (transmitted < loaded) {
|
||||||
|
|
||||||
@@ -155,7 +153,7 @@ int test_mixer(int argc, char *argv[])
|
|||||||
memcpy(&mixer_text[mixer_text_length], &buf[transmitted], text_length);
|
memcpy(&mixer_text[mixer_text_length], &buf[transmitted], text_length);
|
||||||
mixer_text_length += text_length;
|
mixer_text_length += text_length;
|
||||||
mixer_text[mixer_text_length] = '\0';
|
mixer_text[mixer_text_length] = '\0';
|
||||||
fprintf(stderr, "buflen %u, text:\n\"%s\"", mixer_text_length, &mixer_text[0]);
|
//fprintf(stderr, "buflen %u, text:\n\"%s\"", mixer_text_length, &mixer_text[0]);
|
||||||
|
|
||||||
/* process the text buffer, adding new mixers as their descriptions can be parsed */
|
/* process the text buffer, adding new mixers as their descriptions can be parsed */
|
||||||
unsigned resid = mixer_text_length;
|
unsigned resid = mixer_text_length;
|
||||||
@@ -163,7 +161,7 @@ int test_mixer(int argc, char *argv[])
|
|||||||
|
|
||||||
/* if anything was parsed */
|
/* if anything was parsed */
|
||||||
if (resid != mixer_text_length) {
|
if (resid != mixer_text_length) {
|
||||||
fprintf(stderr, "used %u", mixer_text_length - resid);
|
//fprintf(stderr, "used %u", mixer_text_length - resid);
|
||||||
|
|
||||||
/* copy any leftover text to the base of the buffer for re-use */
|
/* copy any leftover text to the base of the buffer for re-use */
|
||||||
if (resid > 0) {
|
if (resid > 0) {
|
||||||
@@ -176,7 +174,7 @@ int test_mixer(int argc, char *argv[])
|
|||||||
transmitted += text_length;
|
transmitted += text_length;
|
||||||
}
|
}
|
||||||
|
|
||||||
PX4_INFO("chunked load: loaded %u mixers", mixer_group.count());
|
//PX4_INFO("chunked load: loaded %u mixers", mixer_group.count());
|
||||||
|
|
||||||
if (mixer_group.count() != 8) {
|
if (mixer_group.count() != 8) {
|
||||||
return 1;
|
return 1;
|
||||||
@@ -198,7 +196,8 @@ int test_mixer(int argc, char *argv[])
|
|||||||
r_page_servo_control_max[i] = PWM_DEFAULT_MAX;
|
r_page_servo_control_max[i] = PWM_DEFAULT_MAX;
|
||||||
}
|
}
|
||||||
|
|
||||||
PX4_INFO("PRE-ARM TEST: DISABLING SAFETY");
|
//PX4_INFO("PRE-ARM TEST: DISABLING SAFETY");
|
||||||
|
|
||||||
/* mix */
|
/* mix */
|
||||||
should_prearm = true;
|
should_prearm = true;
|
||||||
mixed = mixer_group.mix(&outputs[0], output_max, NULL);
|
mixed = mixer_group.mix(&outputs[0], output_max, NULL);
|
||||||
@@ -209,7 +208,7 @@ int test_mixer(int argc, char *argv[])
|
|||||||
//warnx("mixed %d outputs (max %d), values:", mixed, output_max);
|
//warnx("mixed %d outputs (max %d), values:", mixed, output_max);
|
||||||
for (unsigned i = 0; i < mixed; i++) {
|
for (unsigned i = 0; i < mixed; i++) {
|
||||||
|
|
||||||
fprintf(stderr, "pre-arm:\t %d: out: %8.4f, servo: %d \n", i, (double)outputs[i], (int)r_page_servos[i]);
|
//fprintf(stderr, "pre-arm:\t %d: out: %8.4f, servo: %d \n", i, (double)outputs[i], (int)r_page_servos[i]);
|
||||||
|
|
||||||
if (i != actuator_controls_s::INDEX_THROTTLE) {
|
if (i != actuator_controls_s::INDEX_THROTTLE) {
|
||||||
if (r_page_servos[i] < r_page_servo_control_min[i]) {
|
if (r_page_servos[i] < r_page_servo_control_min[i]) {
|
||||||
@@ -233,7 +232,7 @@ int test_mixer(int argc, char *argv[])
|
|||||||
actuator_controls[i] = 0.1f;
|
actuator_controls[i] = 0.1f;
|
||||||
}
|
}
|
||||||
|
|
||||||
PX4_INFO("ARMING TEST: STARTING RAMP");
|
//PX4_INFO("ARMING TEST: STARTING RAMP");
|
||||||
unsigned sleep_quantum_us = 10000;
|
unsigned sleep_quantum_us = 10000;
|
||||||
|
|
||||||
hrt_abstime starttime = hrt_absolute_time();
|
hrt_abstime starttime = hrt_absolute_time();
|
||||||
@@ -250,7 +249,7 @@ int test_mixer(int argc, char *argv[])
|
|||||||
//warnx("mixed %d outputs (max %d), values:", mixed, output_max);
|
//warnx("mixed %d outputs (max %d), values:", mixed, output_max);
|
||||||
for (unsigned i = 0; i < mixed; i++) {
|
for (unsigned i = 0; i < mixed; i++) {
|
||||||
|
|
||||||
fprintf(stderr, "ramp:\t %d: out: %8.4f, servo: %d \n", i, (double)outputs[i], (int)r_page_servos[i]);
|
//fprintf(stderr, "ramp:\t %d: out: %8.4f, servo: %d \n", i, (double)outputs[i], (int)r_page_servos[i]);
|
||||||
|
|
||||||
/* check mixed outputs to be zero during init phase */
|
/* check mixed outputs to be zero during init phase */
|
||||||
if (hrt_elapsed_time(&starttime) < INIT_TIME_US &&
|
if (hrt_elapsed_time(&starttime) < INIT_TIME_US &&
|
||||||
@@ -274,7 +273,7 @@ int test_mixer(int argc, char *argv[])
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
PX4_INFO("ARMING TEST: NORMAL OPERATION");
|
//PX4_INFO("ARMING TEST: NORMAL OPERATION");
|
||||||
|
|
||||||
for (int j = -jmax; j <= jmax; j++) {
|
for (int j = -jmax; j <= jmax; j++) {
|
||||||
|
|
||||||
@@ -292,7 +291,7 @@ int test_mixer(int argc, char *argv[])
|
|||||||
r_page_servo_control_max, outputs,
|
r_page_servo_control_max, outputs,
|
||||||
r_page_servos, &pwm_limit);
|
r_page_servos, &pwm_limit);
|
||||||
|
|
||||||
fprintf(stderr, "mixed %d outputs (max %d)", mixed, output_max);
|
//fprintf(stderr, "mixed %d outputs (max %d)", mixed, output_max);
|
||||||
|
|
||||||
for (unsigned i = 0; i < mixed; i++) {
|
for (unsigned i = 0; i < mixed; i++) {
|
||||||
servo_predicted[i] = 1500 + outputs[i] * (r_page_servo_control_max[i] - r_page_servo_control_min[i]) / 2.0f;
|
servo_predicted[i] = 1500 + outputs[i] * (r_page_servo_control_max[i] - r_page_servo_control_min[i]) / 2.0f;
|
||||||
@@ -306,7 +305,7 @@ int test_mixer(int argc, char *argv[])
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
PX4_INFO("ARMING TEST: DISARMING");
|
//PX4_INFO("ARMING TEST: DISARMING");
|
||||||
|
|
||||||
starttime = hrt_absolute_time();
|
starttime = hrt_absolute_time();
|
||||||
sleepcount = 0;
|
sleepcount = 0;
|
||||||
@@ -324,7 +323,7 @@ int test_mixer(int argc, char *argv[])
|
|||||||
//warnx("mixed %d outputs (max %d), values:", mixed, output_max);
|
//warnx("mixed %d outputs (max %d), values:", mixed, output_max);
|
||||||
for (unsigned i = 0; i < mixed; i++) {
|
for (unsigned i = 0; i < mixed; i++) {
|
||||||
|
|
||||||
fprintf(stderr, "disarmed:\t %d: out: %8.4f, servo: %d \n", i, (double)outputs[i], (int)r_page_servos[i]);
|
//fprintf(stderr, "disarmed:\t %d: out: %8.4f, servo: %d \n", i, (double)outputs[i], (int)r_page_servos[i]);
|
||||||
|
|
||||||
/* check mixed outputs to be zero during init phase */
|
/* check mixed outputs to be zero during init phase */
|
||||||
if (r_page_servos[i] != r_page_servo_disarmed[i]) {
|
if (r_page_servos[i] != r_page_servo_disarmed[i]) {
|
||||||
@@ -337,14 +336,14 @@ int test_mixer(int argc, char *argv[])
|
|||||||
sleepcount++;
|
sleepcount++;
|
||||||
|
|
||||||
if (sleepcount % 10 == 0) {
|
if (sleepcount % 10 == 0) {
|
||||||
printf(".");
|
//printf(".");
|
||||||
fflush(stdout);
|
//fflush(stdout);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("\n");
|
//printf("\n");
|
||||||
|
|
||||||
PX4_INFO("ARMING TEST: REARMING: STARTING RAMP");
|
//PX4_INFO("ARMING TEST: REARMING: STARTING RAMP");
|
||||||
|
|
||||||
starttime = hrt_absolute_time();
|
starttime = hrt_absolute_time();
|
||||||
sleepcount = 0;
|
sleepcount = 0;
|
||||||
@@ -366,7 +365,7 @@ int test_mixer(int argc, char *argv[])
|
|||||||
|
|
||||||
/* check ramp */
|
/* check ramp */
|
||||||
|
|
||||||
fprintf(stderr, "ramp:\t %d: out: %8.4f, servo: %d \n", i, (double)outputs[i], (int)r_page_servos[i]);
|
//fprintf(stderr, "ramp:\t %d: out: %8.4f, servo: %d \n", i, (double)outputs[i], (int)r_page_servos[i]);
|
||||||
|
|
||||||
if (hrt_elapsed_time(&starttime) < RAMP_TIME_US &&
|
if (hrt_elapsed_time(&starttime) < RAMP_TIME_US &&
|
||||||
(r_page_servos[i] + 1 <= r_page_servo_disarmed[i] ||
|
(r_page_servos[i] + 1 <= r_page_servo_disarmed[i] ||
|
||||||
@@ -388,46 +387,42 @@ int test_mixer(int argc, char *argv[])
|
|||||||
sleepcount++;
|
sleepcount++;
|
||||||
|
|
||||||
if (sleepcount % 10 == 0) {
|
if (sleepcount % 10 == 0) {
|
||||||
printf(".");
|
// printf(".");
|
||||||
fflush(stdout);
|
// fflush(stdout);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("\n");
|
//printf("\n");
|
||||||
|
|
||||||
/* load multirotor at once test */
|
/* load multirotor at once test */
|
||||||
mixer_group.reset();
|
mixer_group.reset();
|
||||||
|
|
||||||
if (argc > 2) {
|
#if !defined(CONFIG_ARCH_BOARD_SITL)
|
||||||
filename = argv[2];
|
filename = "/etc/mixers/quad_test.mix";
|
||||||
|
#else
|
||||||
} else {
|
filename = "../../../../ROMFS/px4fmu_test/mixers/quad_test.mix";
|
||||||
filename = "/etc/mixers/quad_test.mix";
|
#endif
|
||||||
}
|
|
||||||
|
|
||||||
load_mixer_file(filename, &buf[0], sizeof(buf));
|
load_mixer_file(filename, &buf[0], sizeof(buf));
|
||||||
loaded = strlen(buf);
|
loaded = strlen(buf);
|
||||||
|
|
||||||
fprintf(stderr, "loaded: \n\"%s\"\n (%d chars)", &buf[0], loaded);
|
//fprintf(stderr, "loaded: \n\"%s\"\n (%d chars)", &buf[0], loaded);
|
||||||
|
|
||||||
unsigned mc_loaded = loaded;
|
unsigned mc_loaded = loaded;
|
||||||
mixer_group.load_from_buf(&buf[0], mc_loaded);
|
mixer_group.load_from_buf(&buf[0], mc_loaded);
|
||||||
PX4_INFO("complete buffer load: loaded %u mixers", mixer_group.count());
|
//PX4_INFO("complete buffer load: loaded %u mixers", mixer_group.count());
|
||||||
|
|
||||||
if (mixer_group.count() != 5) {
|
if (mixer_group.count() != 5) {
|
||||||
PX4_ERR("FAIL: Quad test mixer load failed");
|
PX4_ERR("FAIL: Quad test mixer load failed");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
PX4_INFO("SUCCESS: No errors in mixer test");
|
//PX4_INFO("SUCCESS: No errors in mixer test");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
mixer_callback(uintptr_t handle,
|
mixer_callback(uintptr_t handle, uint8_t control_group, uint8_t control_index, float &control)
|
||||||
uint8_t control_group,
|
|
||||||
uint8_t control_index,
|
|
||||||
float &control)
|
|
||||||
{
|
{
|
||||||
if (control_group != 0) {
|
if (control_group != 0) {
|
||||||
return -1;
|
return -1;
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
*
|
*
|
||||||
* Copyright (c) 2015 Mark Charlebois. All rights reserved.
|
* Copyright (c) 2012-2014 PX4 Development Team. All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions
|
* modification, are permitted provided that the following conditions
|
||||||
@@ -31,28 +31,39 @@
|
|||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
#ifndef _uORBGtestTopics_hpp_
|
#include <px4_config.h>
|
||||||
#define _uORBGtestTopics_hpp_
|
#include <px4_posix.h>
|
||||||
|
|
||||||
#include "uORB/uORB.h"
|
#include <systemlib/perf_counter.h>
|
||||||
|
|
||||||
namespace uORB_test
|
#include "tests.h"
|
||||||
|
|
||||||
|
int
|
||||||
|
test_perf(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
struct orb_topic_A
|
perf_counter_t cc = perf_alloc(PC_COUNT, "test_count");
|
||||||
{
|
perf_counter_t ec = perf_alloc(PC_ELAPSED, "test_elapsed");
|
||||||
int16_t val;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct orb_topic_B
|
if ((cc == NULL) || (ec == NULL)) {
|
||||||
{
|
printf("perf: counter alloc failed\n");
|
||||||
int16_t val;
|
return 1;
|
||||||
};
|
}
|
||||||
|
|
||||||
ORB_DEFINE(topicA, struct orb_topic_A, nullptr, "TOPICA:int16 val;");
|
perf_begin(ec);
|
||||||
ORB_DEFINE(topicB, struct orb_topic_B, nullptr, "TOPICB:int16 val;");
|
perf_count(cc);
|
||||||
|
perf_count(cc);
|
||||||
|
perf_count(cc);
|
||||||
|
perf_count(cc);
|
||||||
|
printf("perf: expect count of 4\n");
|
||||||
|
perf_print_counter(cc);
|
||||||
|
perf_end(ec);
|
||||||
|
printf("perf: expect count of 1\n");
|
||||||
|
perf_print_counter(ec);
|
||||||
|
printf("perf: expect at least two counters\n");
|
||||||
|
perf_print_all(0);
|
||||||
|
|
||||||
ORB_DEFINE(topicA_clone, struct orb_topic_A, nullptr, "TOPICA_CLONE:int16 val;";
|
perf_free(cc);
|
||||||
ORB_DEFINE(topicB_clone, struct orb_topic_B, nullptr, "TOPICB_CLONE:int16 val;");
|
perf_free(ec);
|
||||||
|
|
||||||
|
return OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // _UnitTest_uORBTopics_hpp_
|
|
||||||
@@ -57,40 +57,6 @@
|
|||||||
#include <math.h>
|
#include <math.h>
|
||||||
#include <float.h>
|
#include <float.h>
|
||||||
|
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
* Pre-processor Definitions
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
* Private Types
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
* Private Function Prototypes
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
* Private Data
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
* Public Data
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
* Private Functions
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
* Public Functions
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
* Name: test_led
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
int test_uart_baudchange(int argc, char *argv[])
|
int test_uart_baudchange(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
int uart2_nwrite = 0;
|
int uart2_nwrite = 0;
|
||||||
|
|||||||
@@ -56,40 +56,6 @@
|
|||||||
#include <float.h>
|
#include <float.h>
|
||||||
#include <drivers/drv_hrt.h>
|
#include <drivers/drv_hrt.h>
|
||||||
|
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
* Pre-processor Definitions
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
* Private Types
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
* Private Function Prototypes
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
* Private Data
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
* Public Data
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
* Private Functions
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
* Public Functions
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
* Name: test_led
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
static void *receive_loop(void *arg)
|
static void *receive_loop(void *arg)
|
||||||
{
|
{
|
||||||
int uart_usb = open("/dev/ttyACM0", O_RDONLY | O_NOCTTY);
|
int uart_usb = open("/dev/ttyACM0", O_RDONLY | O_NOCTTY);
|
||||||
|
|||||||
@@ -70,50 +70,48 @@
|
|||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
* Public Types
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
* Public Variables
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
* Public Function Prototypes
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
__BEGIN_DECLS
|
__BEGIN_DECLS
|
||||||
|
|
||||||
extern int test_sensors(int argc, char *argv[]);
|
|
||||||
extern int test_gpio(int argc, char *argv[]);
|
|
||||||
extern int test_hrt(int argc, char *argv[]);
|
|
||||||
extern int test_tone(int argc, char *argv[]);
|
|
||||||
extern int test_led(int argc, char *argv[]);
|
|
||||||
extern int test_adc(int argc, char *argv[]);
|
extern int test_adc(int argc, char *argv[]);
|
||||||
extern int test_int(int argc, char *argv[]);
|
extern int test_autodeclination(int argc, char *argv[]);
|
||||||
extern int test_float(int argc, char *argv[]);
|
|
||||||
extern int test_ppm(int argc, char *argv[]);
|
|
||||||
extern int test_servo(int argc, char *argv[]);
|
|
||||||
extern int test_ppm_loopback(int argc, char *argv[]);
|
|
||||||
extern int test_uart_loopback(int argc, char *argv[]);
|
|
||||||
extern int test_uart_baudchange(int argc, char *argv[]);
|
|
||||||
extern int test_cpuload(int argc, char *argv[]);
|
|
||||||
extern int test_uart_send(int argc, char *argv[]);
|
|
||||||
extern int test_sleep(int argc, char *argv[]);
|
|
||||||
extern int test_time(int argc, char *argv[]);
|
|
||||||
extern int test_uart_console(int argc, char *argv[]);
|
|
||||||
extern int test_hott_telemetry(int argc, char *argv[]);
|
|
||||||
extern int test_jig_voltages(int argc, char *argv[]);
|
|
||||||
extern int test_param(int argc, char *argv[]);
|
|
||||||
extern int test_bson(int argc, char *argv[]);
|
extern int test_bson(int argc, char *argv[]);
|
||||||
|
extern int test_conv(int argc, char *argv[]);
|
||||||
extern int test_file(int argc, char *argv[]);
|
extern int test_file(int argc, char *argv[]);
|
||||||
extern int test_file2(int argc, char *argv[]);
|
extern int test_file2(int argc, char *argv[]);
|
||||||
extern int test_mixer(int argc, char *argv[]);
|
extern int test_float(int argc, char *argv[]);
|
||||||
extern int test_rc(int argc, char *argv[]);
|
extern int test_gpio(int argc, char *argv[]);
|
||||||
extern int test_conv(int argc, char *argv[]);
|
extern int test_hott_telemetry(int argc, char *argv[]);
|
||||||
extern int test_mount(int argc, char *argv[]);
|
extern int test_hrt(int argc, char *argv[]);
|
||||||
|
extern int test_int(int argc, char *argv[]);
|
||||||
|
extern int test_jig_voltages(int argc, char *argv[]);
|
||||||
|
extern int test_led(int argc, char *argv[]);
|
||||||
extern int test_mathlib(int argc, char *argv[]);
|
extern int test_mathlib(int argc, char *argv[]);
|
||||||
extern int test_eigen(int argc, char *argv[]);
|
extern int test_matrix(int argc, char *argv[]);
|
||||||
|
extern int test_mixer(int argc, char *argv[]);
|
||||||
|
extern int test_mount(int argc, char *argv[]);
|
||||||
|
extern int test_param(int argc, char *argv[]);
|
||||||
|
extern int test_perf(int argc, char *argv[]);
|
||||||
|
extern int test_ppm(int argc, char *argv[]);
|
||||||
|
extern int test_ppm_loopback(int argc, char *argv[]);
|
||||||
|
extern int test_rc(int argc, char *argv[]);
|
||||||
|
extern int test_sensors(int argc, char *argv[]);
|
||||||
|
extern int test_servo(int argc, char *argv[]);
|
||||||
|
extern int test_sleep(int argc, char *argv[]);
|
||||||
|
extern int test_time(int argc, char *argv[]);
|
||||||
|
extern int test_tone(int argc, char *argv[]);
|
||||||
|
extern int test_uart_baudchange(int argc, char *argv[]);
|
||||||
|
extern int test_uart_console(int argc, char *argv[]);
|
||||||
|
extern int test_uart_loopback(int argc, char *argv[]);
|
||||||
|
extern int test_uart_send(int argc, char *argv[]);
|
||||||
|
|
||||||
|
/* external */
|
||||||
|
extern int commander_tests_main(int argc, char *argv[]);
|
||||||
|
extern int mavlink_tests_main(int argc, char *argv[]);
|
||||||
|
extern int controllib_test_main(int argc, char *argv[]);
|
||||||
|
extern int uorb_tests_main(int argc, char *argv[]);
|
||||||
|
extern int rc_tests_main(int argc, char *argv[]);
|
||||||
|
extern int sf0x_tests_main(int argc, char *argv[]);
|
||||||
|
|
||||||
|
|
||||||
__END_DECLS
|
__END_DECLS
|
||||||
|
|
||||||
|
|||||||
@@ -38,20 +38,17 @@
|
|||||||
* @author Lorenz Meier <lm@inf.ethz.ch>
|
* @author Lorenz Meier <lm@inf.ethz.ch>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "tests.h"
|
||||||
|
|
||||||
#include <px4_config.h>
|
#include <px4_config.h>
|
||||||
|
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <unistd.h>
|
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
|
||||||
#include <arch/board/board.h>
|
|
||||||
#include <systemlib/perf_counter.h>
|
|
||||||
|
|
||||||
// Not using Eigen at the moment
|
// Not using Eigen at the moment
|
||||||
#define TESTS_EIGEN_DISABLE
|
#define TESTS_EIGEN_DISABLE
|
||||||
|
|
||||||
@@ -62,8 +59,9 @@
|
|||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
static int test_help(int argc, char *argv[]);
|
static int test_help(int argc, char *argv[]);
|
||||||
|
static int test_runner(unsigned option);
|
||||||
|
|
||||||
static int test_all(int argc, char *argv[]);
|
static int test_all(int argc, char *argv[]);
|
||||||
static int test_perf(int argc, char *argv[]);
|
|
||||||
static int test_jig(int argc, char *argv[]);
|
static int test_jig(int argc, char *argv[]);
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
@@ -78,45 +76,52 @@ const struct {
|
|||||||
#define OPT_NOALLTEST (1<<1)
|
#define OPT_NOALLTEST (1<<1)
|
||||||
#define OPT_NOJIGTEST (1<<2)
|
#define OPT_NOJIGTEST (1<<2)
|
||||||
} tests[] = {
|
} tests[] = {
|
||||||
#ifdef __PX4_NUTTX
|
{"help", test_help, OPT_NOALLTEST | OPT_NOHELP | OPT_NOJIGTEST},
|
||||||
{"led", test_led, 0},
|
|
||||||
{"time", test_time, OPT_NOJIGTEST},
|
|
||||||
{"sensors", test_sensors, 0},
|
|
||||||
{"adc", test_adc, OPT_NOJIGTEST},
|
|
||||||
#endif /* __PX4_NUTTX */
|
|
||||||
{"int", test_int, 0},
|
|
||||||
{"float", test_float, 0},
|
|
||||||
{"gpio", test_gpio, OPT_NOJIGTEST | OPT_NOALLTEST},
|
|
||||||
{"hrt", test_hrt, OPT_NOJIGTEST | OPT_NOALLTEST},
|
|
||||||
{"ppm", test_ppm, OPT_NOJIGTEST | OPT_NOALLTEST},
|
|
||||||
{"servo", test_servo, OPT_NOJIGTEST | OPT_NOALLTEST},
|
|
||||||
{"ppm_loopback", test_ppm_loopback, OPT_NOALLTEST},
|
|
||||||
{"jig_voltages", test_jig_voltages, OPT_NOALLTEST},
|
|
||||||
{"uart_loopback", test_uart_loopback, OPT_NOJIGTEST | OPT_NOALLTEST},
|
|
||||||
{"uart_baudchange", test_uart_baudchange, OPT_NOJIGTEST | OPT_NOALLTEST},
|
|
||||||
{"uart_send", test_uart_send, OPT_NOJIGTEST | OPT_NOALLTEST},
|
|
||||||
{"uart_console", test_uart_console, OPT_NOJIGTEST | OPT_NOALLTEST},
|
|
||||||
{"hott_telemetry", test_hott_telemetry, OPT_NOJIGTEST | OPT_NOALLTEST},
|
|
||||||
{"tone", test_tone, 0},
|
|
||||||
{"sleep", test_sleep, OPT_NOJIGTEST},
|
|
||||||
{"perf", test_perf, OPT_NOJIGTEST},
|
|
||||||
{"all", test_all, OPT_NOALLTEST | OPT_NOJIGTEST},
|
{"all", test_all, OPT_NOALLTEST | OPT_NOJIGTEST},
|
||||||
{"jig", test_jig, OPT_NOJIGTEST | OPT_NOALLTEST},
|
{"jig", test_jig, OPT_NOJIGTEST | OPT_NOALLTEST},
|
||||||
{"param", test_param, 0},
|
#ifdef __PX4_NUTTX
|
||||||
|
{"adc", test_adc, OPT_NOJIGTEST},
|
||||||
|
{"led", test_led, 0},
|
||||||
|
{"sensors", test_sensors, 0},
|
||||||
|
{"time", test_time, OPT_NOJIGTEST},
|
||||||
|
{"uart_baudchange", test_uart_baudchange, OPT_NOJIGTEST},
|
||||||
|
#else
|
||||||
|
{"rc", rc_tests_main, 0},
|
||||||
|
#endif /* __PX4_NUTTX */
|
||||||
|
|
||||||
|
/* external tests */
|
||||||
|
{"commander", commander_tests_main, 0},
|
||||||
|
{"controllib", controllib_test_main, 0},
|
||||||
|
//{"mavlink", mavlink_tests_main, 0}, // TODO: fix mavlink_tests
|
||||||
|
{"sf0x", sf0x_tests_main, 0},
|
||||||
|
{"uorb", uorb_tests_main, 0},
|
||||||
|
|
||||||
|
{"autodeclination", test_autodeclination, 0},
|
||||||
{"bson", test_bson, 0},
|
{"bson", test_bson, 0},
|
||||||
|
{"conv", test_conv, 0},
|
||||||
{"file", test_file, OPT_NOJIGTEST | OPT_NOALLTEST},
|
{"file", test_file, OPT_NOJIGTEST | OPT_NOALLTEST},
|
||||||
{"file2", test_file2, OPT_NOJIGTEST},
|
{"file2", test_file2, OPT_NOJIGTEST},
|
||||||
{"mixer", test_mixer, OPT_NOJIGTEST | OPT_NOALLTEST},
|
{"float", test_float, 0},
|
||||||
{"rc", test_rc, OPT_NOJIGTEST | OPT_NOALLTEST},
|
{"gpio", test_gpio, OPT_NOJIGTEST | OPT_NOALLTEST},
|
||||||
{"conv", test_conv, OPT_NOJIGTEST | OPT_NOALLTEST},
|
{"hott_telemetry", test_hott_telemetry, OPT_NOJIGTEST | OPT_NOALLTEST},
|
||||||
{"mount", test_mount, OPT_NOJIGTEST | OPT_NOALLTEST},
|
{"hrt", test_hrt, OPT_NOJIGTEST | OPT_NOALLTEST},
|
||||||
#ifndef TESTS_MATHLIB_DISABLE
|
{"int", test_int, 0},
|
||||||
|
{"jig_voltages", test_jig_voltages, OPT_NOALLTEST},
|
||||||
{"mathlib", test_mathlib, 0},
|
{"mathlib", test_mathlib, 0},
|
||||||
#endif
|
{"matrix", test_matrix, 0},
|
||||||
#ifndef TESTS_EIGEN_DISABLE
|
{"mixer", test_mixer, OPT_NOJIGTEST},
|
||||||
{"eigen", test_eigen, OPT_NOJIGTEST},
|
{"mount", test_mount, OPT_NOJIGTEST | OPT_NOALLTEST},
|
||||||
#endif
|
{"param", test_param, 0},
|
||||||
{"help", test_help, OPT_NOALLTEST | OPT_NOHELP | OPT_NOJIGTEST},
|
{"perf", test_perf, OPT_NOJIGTEST},
|
||||||
|
{"ppm", test_ppm, OPT_NOJIGTEST | OPT_NOALLTEST},
|
||||||
|
{"ppm_loopback", test_ppm_loopback, OPT_NOALLTEST},
|
||||||
|
{"rc", test_rc, OPT_NOJIGTEST | OPT_NOALLTEST},
|
||||||
|
{"servo", test_servo, OPT_NOJIGTEST | OPT_NOALLTEST},
|
||||||
|
{"sleep", test_sleep, OPT_NOJIGTEST},
|
||||||
|
{"tone", test_tone, 0},
|
||||||
|
{"uart_console", test_uart_console, OPT_NOJIGTEST | OPT_NOALLTEST},
|
||||||
|
{"uart_loopback", test_uart_loopback, OPT_NOJIGTEST | OPT_NOALLTEST},
|
||||||
|
{"uart_send", test_uart_send, OPT_NOJIGTEST | OPT_NOALLTEST},
|
||||||
{NULL, NULL, 0}
|
{NULL, NULL, 0}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -138,18 +143,30 @@ test_help(int argc, char *argv[])
|
|||||||
|
|
||||||
static int
|
static int
|
||||||
test_all(int argc, char *argv[])
|
test_all(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
return test_runner(OPT_NOALLTEST);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
test_jig(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
return test_runner(OPT_NOJIGTEST);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
test_runner(unsigned option)
|
||||||
{
|
{
|
||||||
unsigned i;
|
unsigned i;
|
||||||
char *args[2] = {"all", NULL};
|
char *args[2] = {"all", NULL};
|
||||||
unsigned int failcount = 0;
|
unsigned int failcount = 0;
|
||||||
unsigned int testcount = 0;
|
unsigned int testcount = 0;
|
||||||
bool passed[NTESTS];
|
unsigned passed[NTESTS];
|
||||||
|
|
||||||
printf("\nRunning all tests...\n\n");
|
printf("\nRunning all tests...\n\n");
|
||||||
|
|
||||||
for (i = 0; tests[i].name; i++) {
|
for (i = 0; tests[i].name; i++) {
|
||||||
/* Only run tests that are not excluded */
|
/* Only run tests that are not excluded */
|
||||||
if (!(tests[i].options & OPT_NOALLTEST)) {
|
if (!(tests[i].options & option)) {
|
||||||
for (int j = 0; j < 80; j++) {
|
for (int j = 0; j < 80; j++) {
|
||||||
printf("-");
|
printf("-");
|
||||||
}
|
}
|
||||||
@@ -164,12 +181,12 @@ test_all(int argc, char *argv[])
|
|||||||
fprintf(stderr, " [%s] \t\tFAIL\n", tests[i].name);
|
fprintf(stderr, " [%s] \t\tFAIL\n", tests[i].name);
|
||||||
fflush(stderr);
|
fflush(stderr);
|
||||||
failcount++;
|
failcount++;
|
||||||
passed[i] = false;
|
passed[i] = 0;
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
printf(" [%s] \t\tPASS\n", tests[i].name);
|
printf(" [%s] \t\tPASS\n", tests[i].name);
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
passed[i] = true;
|
passed[i] = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int j = 0; j < 80; j++) {
|
for (int j = 0; j < 80; j++) {
|
||||||
@@ -185,7 +202,7 @@ test_all(int argc, char *argv[])
|
|||||||
/* Print summary */
|
/* Print summary */
|
||||||
printf("\n");
|
printf("\n");
|
||||||
|
|
||||||
for (int j = 0; j < 80; j++) {
|
for (unsigned j = 0; j < 80; j++) {
|
||||||
printf("#");
|
printf("#");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -215,12 +232,12 @@ test_all(int argc, char *argv[])
|
|||||||
printf("\n");
|
printf("\n");
|
||||||
|
|
||||||
/* Print failed tests */
|
/* Print failed tests */
|
||||||
if (failcount > 0) { printf(" Failed tests:\n\n"); }
|
if (failcount > 0) {
|
||||||
|
printf(" Failed tests:\n\n");
|
||||||
|
}
|
||||||
|
|
||||||
unsigned int k;
|
for (unsigned k = 0; k < i; k++) {
|
||||||
|
if (!passed[k] && !(tests[k].options & option)) {
|
||||||
for (k = 0; k < i; k++) {
|
|
||||||
if (!passed[k] && !(tests[k].options & OPT_NOALLTEST)) {
|
|
||||||
printf(" [%s] to obtain details, please re-run with\n\t nsh> tests %s\n\n", tests[k].name, tests[k].name);
|
printf(" [%s] to obtain details, please re-run with\n\t nsh> tests %s\n\n", tests[k].name, tests[k].name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -230,129 +247,6 @@ test_all(int argc, char *argv[])
|
|||||||
return (failcount > 0);
|
return (failcount > 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
|
||||||
test_perf(int argc, char *argv[])
|
|
||||||
{
|
|
||||||
perf_counter_t cc, ec;
|
|
||||||
|
|
||||||
cc = perf_alloc(PC_COUNT, "test_count");
|
|
||||||
ec = perf_alloc(PC_ELAPSED, "test_elapsed");
|
|
||||||
|
|
||||||
if ((cc == NULL) || (ec == NULL)) {
|
|
||||||
printf("perf: counter alloc failed\n");
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
perf_begin(ec);
|
|
||||||
perf_count(cc);
|
|
||||||
perf_count(cc);
|
|
||||||
perf_count(cc);
|
|
||||||
perf_count(cc);
|
|
||||||
printf("perf: expect count of 4\n");
|
|
||||||
perf_print_counter(cc);
|
|
||||||
perf_end(ec);
|
|
||||||
printf("perf: expect count of 1\n");
|
|
||||||
perf_print_counter(ec);
|
|
||||||
printf("perf: expect at least two counters\n");
|
|
||||||
perf_print_all(0);
|
|
||||||
|
|
||||||
perf_free(cc);
|
|
||||||
perf_free(ec);
|
|
||||||
|
|
||||||
return OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
int test_jig(int argc, char *argv[])
|
|
||||||
{
|
|
||||||
unsigned i;
|
|
||||||
char *args[2] = {"jig", NULL};
|
|
||||||
unsigned int failcount = 0;
|
|
||||||
unsigned int testcount = 0;
|
|
||||||
bool passed[NTESTS];
|
|
||||||
|
|
||||||
printf("\nRunning all tests...\n\n");
|
|
||||||
|
|
||||||
for (i = 0; tests[i].name; i++) {
|
|
||||||
/* Only run tests that are not excluded */
|
|
||||||
if (!(tests[i].options & OPT_NOJIGTEST)) {
|
|
||||||
for (int j = 0; j < 80; j++) {
|
|
||||||
printf("-");
|
|
||||||
}
|
|
||||||
|
|
||||||
printf("\n");
|
|
||||||
|
|
||||||
printf(" [%s] \t\tSTARTING TEST\n", tests[i].name);
|
|
||||||
fflush(stdout);
|
|
||||||
|
|
||||||
/* Execute test */
|
|
||||||
if (tests[i].fn(1, args) != 0) {
|
|
||||||
fprintf(stderr, " [%s] \t\tFAIL\n", tests[i].name);
|
|
||||||
fflush(stderr);
|
|
||||||
failcount++;
|
|
||||||
passed[i] = false;
|
|
||||||
|
|
||||||
} else {
|
|
||||||
printf(" [%s] \t\tPASS\n", tests[i].name);
|
|
||||||
fflush(stdout);
|
|
||||||
passed[i] = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int j = 0; j < 80; j++) {
|
|
||||||
printf("-");
|
|
||||||
}
|
|
||||||
|
|
||||||
printf("\n");
|
|
||||||
|
|
||||||
testcount++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Print summary */
|
|
||||||
printf("\n");
|
|
||||||
|
|
||||||
for (int j = 0; j < 80; j++) {
|
|
||||||
printf("-");
|
|
||||||
}
|
|
||||||
|
|
||||||
printf("\n\n");
|
|
||||||
|
|
||||||
printf(" T E S T S U M M A R Y\n\n");
|
|
||||||
|
|
||||||
if (failcount == 0) {
|
|
||||||
printf(" ______ __ __ ______ __ __ \n");
|
|
||||||
printf(" /\\ __ \\ /\\ \\ /\\ \\ /\\ __ \\ /\\ \\/ / \n");
|
|
||||||
printf(" \\ \\ __ \\ \\ \\ \\____ \\ \\ \\____ \\ \\ \\/\\ \\ \\ \\ _\"-. \n");
|
|
||||||
printf(" \\ \\_\\ \\_\\ \\ \\_____\\ \\ \\_____\\ \\ \\_____\\ \\ \\_\\ \\_\\ \n");
|
|
||||||
printf(" \\/_/\\/_/ \\/_____/ \\/_____/ \\/_____/ \\/_/\\/_/ \n");
|
|
||||||
printf("\n");
|
|
||||||
printf(" All tests passed (%d of %d)\n", testcount, testcount);
|
|
||||||
|
|
||||||
} else {
|
|
||||||
printf(" ______ ______ __ __ \n");
|
|
||||||
printf(" /\\ ___\\ /\\ __ \\ /\\ \\ /\\ \\ \n");
|
|
||||||
printf(" \\ \\ __\\ \\ \\ __ \\ \\ \\ \\ \\ \\ \\__\n");
|
|
||||||
printf(" \\ \\_\\ \\ \\_\\ \\_\\ \\ \\_\\ \\ \\_____\\ \n");
|
|
||||||
printf(" \\/_/ \\/_/\\/_/ \\/_/ \\/_____/ \n");
|
|
||||||
printf("\n");
|
|
||||||
printf(" Some tests failed (%d of %d)\n", failcount, testcount);
|
|
||||||
}
|
|
||||||
|
|
||||||
printf("\n");
|
|
||||||
|
|
||||||
/* Print failed tests */
|
|
||||||
if (failcount > 0) { printf(" Failed tests:\n\n"); }
|
|
||||||
|
|
||||||
for (int k = 0; k < i; k++) {
|
|
||||||
if (!passed[i] && !(tests[k].options & OPT_NOJIGTEST)) {
|
|
||||||
printf(" [%s] to obtain details, please re-run with\n\t nsh> tests %s\n\n", tests[k].name, tests[k].name);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fflush(stdout);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
__EXPORT int tests_main(int argc, char *argv[]);
|
__EXPORT int tests_main(int argc, char *argv[]);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -360,19 +254,17 @@ __EXPORT int tests_main(int argc, char *argv[]);
|
|||||||
*/
|
*/
|
||||||
int tests_main(int argc, char *argv[])
|
int tests_main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
unsigned i;
|
|
||||||
|
|
||||||
if (argc < 2) {
|
if (argc < 2) {
|
||||||
printf("tests: missing test name - 'tests help' for a list of tests\n");
|
printf("tests: missing test name - 'tests help' for a list of tests\n");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; tests[i].name; i++) {
|
for (unsigned i = 0; tests[i].name; i++) {
|
||||||
if (!strcmp(tests[i].name, argv[1])) {
|
if (!strcmp(tests[i].name, argv[1])) {
|
||||||
return tests[i].fn(argc - 1, argv + 1);
|
return tests[i].fn(argc - 1, argv + 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("tests: no test called '%s' - 'tests help' for a list of tests\n", argv[1]);
|
printf("tests: no test called '%s' - 'tests help' for a list of tests\n", argv[1]);
|
||||||
return ERROR;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|||||||
+36
-91
@@ -1,9 +1,5 @@
|
|||||||
cmake_minimum_required(VERSION 2.8)
|
cmake_minimum_required(VERSION 2.8)
|
||||||
|
|
||||||
include(CMakeForceCompiler)
|
|
||||||
#CMAKE_FORCE_C_COMPILER(clang Clang)
|
|
||||||
#CMAKE_FORCE_CXX_COMPILER(clang++ Clang)
|
|
||||||
|
|
||||||
if("${CMAKE_C_COMPILER_ID}" STREQUAL "Clang")
|
if("${CMAKE_C_COMPILER_ID}" STREQUAL "Clang")
|
||||||
add_compile_options(-Qunused-arguments )
|
add_compile_options(-Qunused-arguments )
|
||||||
endif()
|
endif()
|
||||||
@@ -14,28 +10,16 @@ endif()
|
|||||||
project(unittests)
|
project(unittests)
|
||||||
enable_testing()
|
enable_testing()
|
||||||
|
|
||||||
include(CheckCXXCompilerFlag)
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Werror -std=gnu99 -g")
|
||||||
CHECK_CXX_COMPILER_FLAG("-std=c++11" COMPILER_SUPPORTS_CXX11)
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Werror -std=c++11 -g -fno-exceptions -fno-rtti -fno-threadsafe-statics")
|
||||||
CHECK_CXX_COMPILER_FLAG("-std=c++0x" COMPILER_SUPPORTS_CXX0X)
|
|
||||||
|
|
||||||
if(COMPILER_SUPPORTS_CXX11)
|
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -fno-exceptions -fno-rtti -fno-threadsafe-statics -D__CUSTOM_FILE_IO__ -D__PX4_UNIT_TESTS -g -Wall -Werror")
|
|
||||||
elseif(COMPILER_SUPPORTS_CXX0X)
|
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x -fno-exceptions -fno-rtti -fno-threadsafe-statics -D__CUSTOM_FILE_IO__ -D__PX4_UNIT_TESTS -g -Wall -Werror")
|
|
||||||
else()
|
|
||||||
message(STATUS "The compiler ${CMAKE_CXX_COMPILER} has no C++11 support. Please use a different C++ compiler.")
|
|
||||||
endif()
|
|
||||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu99 -g")
|
|
||||||
|
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g3 -fsanitize=address -fno-omit-frame-pointer")
|
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-sign-compare -Wno-unused-but-set-variable")
|
|
||||||
|
|
||||||
set(GTEST_DIR ${CMAKE_SOURCE_DIR}/googletest)
|
set(GTEST_DIR ${CMAKE_SOURCE_DIR}/googletest)
|
||||||
add_subdirectory(${GTEST_DIR})
|
add_subdirectory(${GTEST_DIR})
|
||||||
include_directories(${GTEST_DIR}/include)
|
include_directories(${GTEST_DIR}/include)
|
||||||
|
|
||||||
set(PX4_SRC ${CMAKE_SOURCE_DIR}/../src)
|
set(PX4_SRC ${CMAKE_SOURCE_DIR}/../src)
|
||||||
set(PX4_SITL_BUILD ${PX4_SRC}/../build_posix_sitl_test)
|
set(PX4_SITL_BUILD ${PX4_SRC}/../build_posix_sitl_default)
|
||||||
|
|
||||||
include_directories(${CMAKE_SOURCE_DIR})
|
include_directories(${CMAKE_SOURCE_DIR})
|
||||||
include_directories(${PX4_SITL_BUILD}/src)
|
include_directories(${PX4_SITL_BUILD}/src)
|
||||||
@@ -52,38 +36,27 @@ include_directories(${PX4_SRC}/modules/uORB)
|
|||||||
include_directories(${PX4_SRC}/platforms)
|
include_directories(${PX4_SRC}/platforms)
|
||||||
include_directories(${PX4_SRC}/platforms/posix/include)
|
include_directories(${PX4_SRC}/platforms/posix/include)
|
||||||
include_directories(${PX4_SRC}/platforms/posix/px4_layer)
|
include_directories(${PX4_SRC}/platforms/posix/px4_layer)
|
||||||
|
include_directories(${PX4_SRC}/platforms/posix/work_queue)
|
||||||
|
|
||||||
|
add_definitions(-D__CUSTOM_FILE_IO__)
|
||||||
add_definitions(-D__EXPORT=)
|
add_definitions(-D__EXPORT=)
|
||||||
add_definitions(-D__PX4_POSIX)
|
add_definitions(-D__PX4_POSIX)
|
||||||
add_definitions(-D__PX4_TESTS)
|
add_definitions(-D__PX4_TESTS)
|
||||||
|
add_definitions(-D__PX4_UNIT_TESTS)
|
||||||
add_definitions(-D_UNIT_TEST=)
|
add_definitions(-D_UNIT_TEST=)
|
||||||
add_definitions(-DERROR=-1)
|
add_definitions(-DERROR=-1)
|
||||||
add_definitions(-Dmain_t=int)
|
add_definitions(-Dmain_t=int)
|
||||||
add_definitions(-Dnoreturn_function=)
|
add_definitions(-Dnoreturn_function=)
|
||||||
add_definitions(-DOK=0)
|
add_definitions(-DOK=0)
|
||||||
|
|
||||||
# check
|
if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
|
||||||
add_custom_target(check
|
add_definitions(-D__PX4_DARWIN)
|
||||||
COMMAND ${CMAKE_CTEST_COMMAND} -j2 --output-on-failure
|
else()
|
||||||
WORKING_DIR ${CMAKE_BINARY_DIR}
|
add_definitions(-D__PX4_LINUX)
|
||||||
USES_TERMINAL)
|
endif()
|
||||||
|
|
||||||
function(add_gtest)
|
|
||||||
foreach(test_name ${ARGN})
|
|
||||||
if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
|
|
||||||
target_link_libraries(${test_name} gtest_main pthread px4_platform)
|
|
||||||
add_definitions(-D__PX4_DARWIN)
|
|
||||||
else()
|
|
||||||
target_link_libraries(${test_name} gtest_main pthread rt px4_platform)
|
|
||||||
add_definitions(-D__PX4_LINUX)
|
|
||||||
endif()
|
|
||||||
add_test(NAME ${test_name} COMMAND ${test_name} WORKING_DIRECTORY ${CMAKE_SOURCE_DIR})
|
|
||||||
add_dependencies(check ${test_name})
|
|
||||||
endforeach()
|
|
||||||
endfunction()
|
|
||||||
|
|
||||||
add_library(px4_platform
|
add_library(px4_platform
|
||||||
${PX4_SITL_BUILD}/src/modules/param/px4_parameters.c
|
${PX4_SITL_BUILD}/src/modules/param/px4_parameters.c
|
||||||
${PX4_SRC}/drivers/device/device_posix.cpp
|
${PX4_SRC}/drivers/device/device_posix.cpp
|
||||||
${PX4_SRC}/drivers/device/i2c_posix.cpp
|
${PX4_SRC}/drivers/device/i2c_posix.cpp
|
||||||
${PX4_SRC}/drivers/device/ringbuffer.cpp
|
${PX4_SRC}/drivers/device/ringbuffer.cpp
|
||||||
@@ -112,8 +85,30 @@ add_library(px4_platform
|
|||||||
${PX4_SRC}/platforms/posix/work_queue/work_lock.c
|
${PX4_SRC}/platforms/posix/work_queue/work_lock.c
|
||||||
${PX4_SRC}/platforms/posix/work_queue/work_queue.c
|
${PX4_SRC}/platforms/posix/work_queue/work_queue.c
|
||||||
${PX4_SRC}/platforms/posix/work_queue/work_thread.c
|
${PX4_SRC}/platforms/posix/work_queue/work_thread.c
|
||||||
)
|
)
|
||||||
target_include_directories(px4_platform PUBLIC ${PX4_SRC}/platforms)
|
target_include_directories(px4_platform PUBLIC ${PX4_SRC}/platforms)
|
||||||
|
target_include_directories(px4_platform PUBLIC ${PX4_SRC}/platforms/posix/include)
|
||||||
|
target_include_directories(px4_platform PUBLIC ${PX4_SRC}/platforms/posix/work_queue)
|
||||||
|
|
||||||
|
|
||||||
|
# check
|
||||||
|
add_custom_target(check
|
||||||
|
COMMAND ${CMAKE_CTEST_COMMAND} -j2 --output-on-failure
|
||||||
|
WORKING_DIR ${CMAKE_BINARY_DIR}
|
||||||
|
USES_TERMINAL)
|
||||||
|
|
||||||
|
# add_gtest
|
||||||
|
function(add_gtest)
|
||||||
|
foreach(test_name ${ARGN})
|
||||||
|
if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
|
||||||
|
target_link_libraries(${test_name} gtest_main pthread px4_platform)
|
||||||
|
else()
|
||||||
|
target_link_libraries(${test_name} gtest_main pthread rt px4_platform)
|
||||||
|
endif()
|
||||||
|
add_test(NAME ${test_name} COMMAND ${test_name} WORKING_DIRECTORY ${CMAKE_SOURCE_DIR})
|
||||||
|
add_dependencies(check ${test_name})
|
||||||
|
endforeach()
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
|
||||||
#######################################################################
|
#######################################################################
|
||||||
@@ -122,59 +117,9 @@ target_include_directories(px4_platform PUBLIC ${PX4_SRC}/platforms)
|
|||||||
# add_executable(example_test example_test.cpp)
|
# add_executable(example_test example_test.cpp)
|
||||||
# add_gtest(example_test)
|
# add_gtest(example_test)
|
||||||
|
|
||||||
|
|
||||||
# autodeclination_test
|
|
||||||
add_executable(autodeclination_test autodeclination_test.cpp ${PX4_SRC}/lib/geo_lookup/geo_mag_declination.c)
|
|
||||||
add_gtest(autodeclination_test)
|
|
||||||
|
|
||||||
# mixer_test
|
|
||||||
add_custom_command(OUTPUT ${PX4_SRC}/modules/systemlib/mixer/mixer_multirotor.generated.h
|
|
||||||
COMMAND ${PX4_SRC}/modules/systemlib/mixer/multi_tables.py > ${PX4_SRC}/modules/systemlib/mixer/mixer_multirotor.generated.h)
|
|
||||||
add_executable(mixer_test mixer_test.cpp
|
|
||||||
${PX4_SRC}/modules/systemlib/mixer/mixer.cpp
|
|
||||||
${PX4_SRC}/modules/systemlib/mixer/mixer_group.cpp
|
|
||||||
${PX4_SRC}/modules/systemlib/mixer/mixer_load.c
|
|
||||||
${PX4_SRC}/modules/systemlib/mixer/mixer_multirotor.cpp
|
|
||||||
${PX4_SRC}/modules/systemlib/mixer/mixer_multirotor.generated.h
|
|
||||||
${PX4_SRC}/modules/systemlib/mixer/mixer_simple.cpp
|
|
||||||
${PX4_SRC}/modules/systemlib/pwm_limit/pwm_limit.c
|
|
||||||
${PX4_SRC}/systemcmds/tests/test_mixer.cpp)
|
|
||||||
add_gtest(mixer_test)
|
|
||||||
|
|
||||||
# conversion_test
|
|
||||||
add_executable(conversion_test conversion_test.cpp ${PX4_SRC}/systemcmds/tests/test_conv.cpp)
|
|
||||||
add_gtest(conversion_test)
|
|
||||||
|
|
||||||
# sbus2_test
|
|
||||||
add_executable(sbus2_test sbus2_test.cpp
|
|
||||||
${PX4_SRC}/lib/rc/sbus.c)
|
|
||||||
add_gtest(sbus2_test)
|
|
||||||
|
|
||||||
# DSM test
|
|
||||||
add_executable(dsm_test dsm_test.cpp
|
|
||||||
${PX4_SRC}/lib/rc/dsm.c)
|
|
||||||
add_gtest(dsm_test)
|
|
||||||
|
|
||||||
# st24_test
|
|
||||||
add_executable(rc_input_test st24_test.cpp sumd_test.cpp
|
|
||||||
${PX4_SRC}/lib/rc/st24.c
|
|
||||||
${PX4_SRC}/lib/rc/sumd.c)
|
|
||||||
add_gtest(rc_input_test)
|
|
||||||
|
|
||||||
# sf0x_test
|
|
||||||
add_executable(sf0x_test sf0x_test.cpp
|
|
||||||
${PX4_SRC}/drivers/sf0x/sf0x_parser.cpp)
|
|
||||||
add_gtest(sf0x_test)
|
|
||||||
|
|
||||||
# param_test
|
# param_test
|
||||||
add_executable(param_test param_test.cpp uorb_stub.cpp
|
add_executable(param_test param_test.cpp uorb_stub.cpp
|
||||||
${PX4_SRC}/modules/systemlib/bson/tinybson.c
|
${PX4_SRC}/modules/systemlib/bson/tinybson.c
|
||||||
${PX4_SRC}/modules/systemlib/param/param.c)
|
${PX4_SRC}/modules/systemlib/param/param.c)
|
||||||
target_link_libraries(param_test ${PX4_SITL_BUILD}/libmsg_gen.a)
|
target_link_libraries(param_test ${PX4_SITL_BUILD}/libmsg_gen.a)
|
||||||
add_gtest(param_test)
|
add_gtest(param_test)
|
||||||
|
|
||||||
# param_shmem_test
|
|
||||||
#add_executable(param_shmem_test param_test.cpp uorb_stub.cpp
|
|
||||||
# ${PX4_SRC}/modules/systemlib/bson/tinybson.c
|
|
||||||
# ${PX4_SRC}/modules/systemlib/param/param_shmem.c)
|
|
||||||
#add_gtest(param_shmem_test)
|
|
||||||
|
|||||||
@@ -1,18 +0,0 @@
|
|||||||
#include <math.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
|
|
||||||
#include <drivers/drv_hrt.h>
|
|
||||||
#include <geo/geo.h>
|
|
||||||
#include <px4iofirmware/px4io.h>
|
|
||||||
#include <systemlib/err.h>
|
|
||||||
#include <systemlib/mixer/mixer.h>
|
|
||||||
|
|
||||||
#include "gtest/gtest.h"
|
|
||||||
|
|
||||||
TEST(AutoDeclinationTest, AutoDeclination)
|
|
||||||
{
|
|
||||||
ASSERT_NEAR(get_mag_declination(47.0, 8.0), 0.6, 0.5) << "declination differs more than 1 degree";
|
|
||||||
}
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
#include <systemlib/mixer/mixer.h>
|
|
||||||
#include <systemlib/err.h>
|
|
||||||
#include "../../src/systemcmds/tests/tests.h"
|
|
||||||
|
|
||||||
#include "gtest/gtest.h"
|
|
||||||
|
|
||||||
TEST(ConversionTest, quad_w_main)
|
|
||||||
{
|
|
||||||
ASSERT_EQ(test_conv(0, NULL), 0) << "Conversion test failed";
|
|
||||||
}
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
close all;
|
|
||||||
clear all;
|
|
||||||
M = importdata('px4io_v1.3.csv');
|
|
||||||
voltage = M.data(:, 1);
|
|
||||||
counts = M.data(:, 2);
|
|
||||||
plot(counts, voltage, 'b*-', 'LineWidth', 2, 'MarkerSize', 15);
|
|
||||||
coeffs = polyfit(counts, voltage, 1);
|
|
||||||
fittedC = linspace(min(counts), max(counts), 500);
|
|
||||||
fittedV = polyval(coeffs, fittedC);
|
|
||||||
hold on
|
|
||||||
plot(fittedC, fittedV, 'r-', 'LineWidth', 3);
|
|
||||||
|
|
||||||
slope = coeffs(1)
|
|
||||||
y_intersection = coeffs(2)
|
|
||||||
@@ -1,70 +0,0 @@
|
|||||||
voltage, counts
|
|
||||||
4.3, 950
|
|
||||||
4.4, 964
|
|
||||||
4.5, 986
|
|
||||||
4.6, 1009
|
|
||||||
4.7, 1032
|
|
||||||
4.8, 1055
|
|
||||||
4.9, 1078
|
|
||||||
5.0, 1101
|
|
||||||
5.2, 1124
|
|
||||||
5.3, 1148
|
|
||||||
5.4, 1171
|
|
||||||
5.5, 1195
|
|
||||||
6.0, 1304
|
|
||||||
6.1, 1329
|
|
||||||
6.2, 1352
|
|
||||||
7.0, 1517
|
|
||||||
7.1, 1540
|
|
||||||
7.2, 1564
|
|
||||||
7.3, 1585
|
|
||||||
7.4, 1610
|
|
||||||
7.5, 1636
|
|
||||||
8.0, 1728
|
|
||||||
8.1, 1752
|
|
||||||
8.2, 1755
|
|
||||||
8.3, 1798
|
|
||||||
8.4, 1821
|
|
||||||
9.0, 1963
|
|
||||||
9.1, 1987
|
|
||||||
9.3, 2010
|
|
||||||
9.4, 2033
|
|
||||||
10.0, 2174
|
|
||||||
10.1, 2198
|
|
||||||
10.2, 2221
|
|
||||||
10.3, 2245
|
|
||||||
10.4, 2268
|
|
||||||
11.0, 2385
|
|
||||||
11.1, 2409
|
|
||||||
11.2, 2432
|
|
||||||
11.3, 2456
|
|
||||||
11.4, 2480
|
|
||||||
11.5, 2502
|
|
||||||
11.6, 2526
|
|
||||||
11.7, 2550
|
|
||||||
11.8, 2573
|
|
||||||
11.9, 2597
|
|
||||||
12.0, 2621
|
|
||||||
12.1, 2644
|
|
||||||
12.3, 2668
|
|
||||||
12.4, 2692
|
|
||||||
12.5, 2716
|
|
||||||
12.6, 2737
|
|
||||||
12.7, 2761
|
|
||||||
13.0, 2832
|
|
||||||
13.5, 2950
|
|
||||||
13.6, 2973
|
|
||||||
14.1, 3068
|
|
||||||
14.2, 3091
|
|
||||||
14.7, 3209
|
|
||||||
15.0, 3280
|
|
||||||
15.1, 3304
|
|
||||||
15.5, 3374
|
|
||||||
15.6, 3397
|
|
||||||
15.7, 3420
|
|
||||||
16.0, 3492
|
|
||||||
16.1, 3514
|
|
||||||
16.2, 3538
|
|
||||||
16.9, 3680
|
|
||||||
17.0, 3704
|
|
||||||
17.1, 3728
|
|
||||||
|
@@ -1,74 +0,0 @@
|
|||||||
#include <stdio.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
|
|
||||||
#include "../../src/systemcmds/tests/tests.h"
|
|
||||||
#include <drivers/drv_hrt.h>
|
|
||||||
// Enable DSM parser output
|
|
||||||
#define DSM_DEBUG
|
|
||||||
#include <rc/dsm.h>
|
|
||||||
#include <systemlib/err.h>
|
|
||||||
#include <systemlib/mixer/mixer.h>
|
|
||||||
|
|
||||||
#include "gtest/gtest.h"
|
|
||||||
|
|
||||||
TEST(DSMTest, DSM)
|
|
||||||
{
|
|
||||||
const char *filepath = "testdata/dsm_x_data.txt";
|
|
||||||
|
|
||||||
FILE *fp;
|
|
||||||
fp = fopen(filepath, "rt");
|
|
||||||
|
|
||||||
ASSERT_TRUE(fp);
|
|
||||||
warnx("loading data from: %s", filepath);
|
|
||||||
|
|
||||||
float f;
|
|
||||||
unsigned x;
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
// Trash the first 20 lines
|
|
||||||
for (unsigned i = 0; i < 20; i++) {
|
|
||||||
char buf[200];
|
|
||||||
(void)fgets(buf, sizeof(buf), fp);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Init the parser
|
|
||||||
uint8_t frame[20];
|
|
||||||
uint16_t rc_values[18];
|
|
||||||
uint16_t num_values;
|
|
||||||
bool dsm_11_bit;
|
|
||||||
unsigned dsm_frame_drops = 0;
|
|
||||||
uint16_t max_channels = sizeof(rc_values) / sizeof(rc_values[0]);
|
|
||||||
|
|
||||||
int rate_limiter = 0;
|
|
||||||
unsigned last_drop = 0;
|
|
||||||
|
|
||||||
while (EOF != (ret = fscanf(fp, "%f,%x,,", &f, &x))) {
|
|
||||||
|
|
||||||
ASSERT_GT(ret, 0);
|
|
||||||
|
|
||||||
frame[0] = x;
|
|
||||||
unsigned len = 1;
|
|
||||||
|
|
||||||
// Pipe the data into the parser
|
|
||||||
bool result = dsm_parse(f*1e6, &frame[0], len, rc_values, &num_values,
|
|
||||||
&dsm_11_bit, &dsm_frame_drops, max_channels);
|
|
||||||
|
|
||||||
if (result) {
|
|
||||||
warnx("decoded packet with %d channels and %s encoding:", num_values, (dsm_11_bit) ? "11 bit" : "10 bit");
|
|
||||||
|
|
||||||
for (unsigned i = 0; i < num_values; i++) {
|
|
||||||
printf("chan #%u:\t%d\n", i, (int)rc_values[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (last_drop != (dsm_frame_drops)) {
|
|
||||||
warnx("frame dropped, now #%d", (dsm_frame_drops));
|
|
||||||
last_drop = dsm_frame_drops;
|
|
||||||
}
|
|
||||||
|
|
||||||
rate_limiter++;
|
|
||||||
}
|
|
||||||
|
|
||||||
ASSERT_EQ(ret, EOF);
|
|
||||||
}
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
#include <systemlib/mixer/mixer.h>
|
|
||||||
#include <systemlib/err.h>
|
|
||||||
#include "../../src/systemcmds/tests/tests.h"
|
|
||||||
|
|
||||||
#include "gtest/gtest.h"
|
|
||||||
|
|
||||||
|
|
||||||
TEST(MixerTest, Mixer)
|
|
||||||
{
|
|
||||||
const char *args[] = {"empty", "../ROMFS/px4fmu_test/mixers/IO_pass.mix", "../ROMFS/px4fmu_test/mixers/quad_test.mix"};
|
|
||||||
ASSERT_EQ(test_mixer(3, (char **)args), 0) << "IO_pass.mix failed";
|
|
||||||
}
|
|
||||||
@@ -1,89 +0,0 @@
|
|||||||
#include <stdio.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
|
|
||||||
#include "../../src/systemcmds/tests/tests.h"
|
|
||||||
#include <drivers/drv_hrt.h>
|
|
||||||
// Enable S.BUS parser output
|
|
||||||
#define SBUS_DEBUG
|
|
||||||
#include <rc/sbus.h>
|
|
||||||
#include <systemlib/err.h>
|
|
||||||
#include <systemlib/mixer/mixer.h>
|
|
||||||
|
|
||||||
#include "gtest/gtest.h"
|
|
||||||
|
|
||||||
TEST(SBUS2Test, SBUS2)
|
|
||||||
{
|
|
||||||
const char *filepath = "testdata/sbus2_r7008SB.txt";
|
|
||||||
|
|
||||||
FILE *fp;
|
|
||||||
fp = fopen(filepath, "rt");
|
|
||||||
|
|
||||||
ASSERT_TRUE(fp);
|
|
||||||
warnx("loading data from: %s", filepath);
|
|
||||||
|
|
||||||
// if (argc < 2)
|
|
||||||
// errx(1, "Need a filename for the input file");
|
|
||||||
|
|
||||||
int byte_offset = 7;
|
|
||||||
|
|
||||||
// if (argc > 2) {
|
|
||||||
// char* end;
|
|
||||||
// byte_offset = strtol(argv[2],&end,10);
|
|
||||||
// }
|
|
||||||
|
|
||||||
warnx("RUNNING TEST WITH BYTE OFFSET OF: %d", byte_offset);
|
|
||||||
|
|
||||||
float f;
|
|
||||||
unsigned x;
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
// Trash the first 20 lines
|
|
||||||
for (unsigned i = 0; i < 20; i++) {
|
|
||||||
char buf[200];
|
|
||||||
(void)fgets(buf, sizeof(buf), fp);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Init the parser
|
|
||||||
uint8_t frame[SBUS_BUFFER_SIZE];
|
|
||||||
uint16_t rc_values[18];
|
|
||||||
uint16_t num_values;
|
|
||||||
unsigned sbus_frame_drops = 0;
|
|
||||||
unsigned sbus_frame_resets = 0;
|
|
||||||
bool sbus_failsafe;
|
|
||||||
bool sbus_frame_drop;
|
|
||||||
uint16_t max_channels = sizeof(rc_values) / sizeof(rc_values[0]);
|
|
||||||
|
|
||||||
int rate_limiter = 0;
|
|
||||||
unsigned last_drop = 0;
|
|
||||||
|
|
||||||
while (EOF != (ret = fscanf(fp, "%f,%x,,", &f, &x))) {
|
|
||||||
|
|
||||||
ASSERT_GT(ret, 0);
|
|
||||||
|
|
||||||
frame[0] = x;
|
|
||||||
unsigned len = 1;
|
|
||||||
|
|
||||||
// Pipe the data into the parser
|
|
||||||
hrt_abstime now = hrt_absolute_time();
|
|
||||||
|
|
||||||
// if (rate_limiter % byte_offset == 0) {
|
|
||||||
bool result = sbus_parse(now, &frame[0], len, rc_values, &num_values,
|
|
||||||
&sbus_failsafe, &sbus_frame_drop, &sbus_frame_drops, max_channels);
|
|
||||||
|
|
||||||
if (result) {
|
|
||||||
//warnx("decoded packet");
|
|
||||||
}
|
|
||||||
|
|
||||||
// }
|
|
||||||
|
|
||||||
if (last_drop != (sbus_frame_drops + sbus_frame_resets)) {
|
|
||||||
warnx("frame dropped, now #%d", (sbus_frame_drops + sbus_frame_resets));
|
|
||||||
last_drop = sbus_frame_drops + sbus_frame_resets;
|
|
||||||
}
|
|
||||||
|
|
||||||
rate_limiter++;
|
|
||||||
}
|
|
||||||
|
|
||||||
ASSERT_EQ(ret, EOF);
|
|
||||||
}
|
|
||||||
@@ -1,63 +0,0 @@
|
|||||||
#include <stdio.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <systemlib/err.h>
|
|
||||||
#include <drivers/drv_hrt.h>
|
|
||||||
#include <rc/st24.h>
|
|
||||||
#include "../../src/systemcmds/tests/tests.h"
|
|
||||||
|
|
||||||
#include "gtest/gtest.h"
|
|
||||||
|
|
||||||
TEST(ST24Test, ST24)
|
|
||||||
{
|
|
||||||
const char *filepath = "testdata/st24_data.txt";
|
|
||||||
|
|
||||||
//warnx("loading data from: %s", filepath);
|
|
||||||
|
|
||||||
FILE *fp;
|
|
||||||
|
|
||||||
fp = fopen(filepath, "rt");
|
|
||||||
ASSERT_TRUE(fp);
|
|
||||||
|
|
||||||
float f;
|
|
||||||
unsigned x;
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
// Trash the first 20 lines
|
|
||||||
for (unsigned i = 0; i < 20; i++) {
|
|
||||||
char buf[200];
|
|
||||||
(void)fgets(buf, sizeof(buf), fp);
|
|
||||||
}
|
|
||||||
|
|
||||||
float last_time = 0;
|
|
||||||
|
|
||||||
while (EOF != (ret = fscanf(fp, "%f,%x,,", &f, &x))) {
|
|
||||||
if (((f - last_time) * 1000 * 1000) > 3000) {
|
|
||||||
// warnx("FRAME RESET\n\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
uint8_t b = static_cast<uint8_t>(x);
|
|
||||||
|
|
||||||
last_time = f;
|
|
||||||
|
|
||||||
// Pipe the data into the parser
|
|
||||||
//hrt_abstime now = hrt_absolute_time();
|
|
||||||
|
|
||||||
uint8_t rssi;
|
|
||||||
uint8_t rx_count;
|
|
||||||
uint16_t channel_count;
|
|
||||||
uint16_t channels[20];
|
|
||||||
|
|
||||||
|
|
||||||
if (!st24_decode(b, &rssi, &rx_count, &channel_count, channels, sizeof(channels) / sizeof(channels[0]))) {
|
|
||||||
//warnx("decoded: %u channels (converted to PPM range)", (unsigned)channel_count);
|
|
||||||
|
|
||||||
for (unsigned i = 0; i < channel_count; i++) {
|
|
||||||
//int16_t val = channels[i];
|
|
||||||
//warnx("channel %u: %d 0x%03X", i, static_cast<int>(val), static_cast<int>(val));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ASSERT_EQ(EOF, ret);
|
|
||||||
}
|
|
||||||
@@ -1,63 +0,0 @@
|
|||||||
#include <stdio.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <systemlib/err.h>
|
|
||||||
#include <drivers/drv_hrt.h>
|
|
||||||
#include <rc/sumd.h>
|
|
||||||
#include "../../src/systemcmds/tests/tests.h"
|
|
||||||
|
|
||||||
#include "gtest/gtest.h"
|
|
||||||
|
|
||||||
TEST(SUMDTest, SUMD)
|
|
||||||
{
|
|
||||||
const char *filepath = "testdata/sumd_data.txt";
|
|
||||||
|
|
||||||
//warnx("loading data from: %s", filepath);
|
|
||||||
|
|
||||||
FILE *fp;
|
|
||||||
|
|
||||||
fp = fopen(filepath, "rt");
|
|
||||||
//ASSERT_TRUE(fp);
|
|
||||||
|
|
||||||
float f;
|
|
||||||
unsigned x;
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
// Trash the first 20 lines
|
|
||||||
for (unsigned i = 0; i < 20; i++) {
|
|
||||||
char buf[200];
|
|
||||||
(void)fgets(buf, sizeof(buf), fp);
|
|
||||||
}
|
|
||||||
|
|
||||||
float last_time = 0;
|
|
||||||
|
|
||||||
while (EOF != (ret = fscanf(fp, "%f,%x,,", &f, &x))) {
|
|
||||||
if (((f - last_time) * 1000 * 1000) > 3000) {
|
|
||||||
// warnx("FRAME RESET\n\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
uint8_t b = static_cast<uint8_t>(x);
|
|
||||||
|
|
||||||
last_time = f;
|
|
||||||
|
|
||||||
// Pipe the data into the parser
|
|
||||||
//hrt_abstime now = hrt_absolute_time();
|
|
||||||
|
|
||||||
uint8_t rssi;
|
|
||||||
uint8_t rx_count;
|
|
||||||
uint16_t channel_count;
|
|
||||||
uint16_t channels[32];
|
|
||||||
|
|
||||||
|
|
||||||
if (!sumd_decode(b, &rssi, &rx_count, &channel_count, channels, 32)) {
|
|
||||||
//warnx("decoded: %u channels (converted to PPM range)", (unsigned)channel_count);
|
|
||||||
|
|
||||||
for (unsigned i = 0; i < channel_count; i++) {
|
|
||||||
//int16_t val = channels[i];
|
|
||||||
//warnx("channel %u: %d 0x%03X", i, static_cast<int>(val), static_cast<int>(val));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ASSERT_EQ(EOF, ret);
|
|
||||||
}
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user