This is an automated email from the ASF dual-hosted git repository.

xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-nuttx-apps.git


The following commit(s) were added to refs/heads/master by this push:
     new a4e170b  remove examples/dsptest
a4e170b is described below

commit a4e170b7e9c4089f7a4c60e5105099605cc90d38
Author: raiden00pl <[email protected]>
AuthorDate: Sun Feb 28 21:08:57 2021 +0100

    remove examples/dsptest
    
    This example doesn't make much sense, tests cases are incomplete, and it's 
nightmare to maintain with even the slightest changes in libdsp
---
 examples/README.md                |   17 -
 examples/dsptest/Kconfig          |   29 -
 examples/dsptest/Make.defs        |   39 --
 examples/dsptest/Makefile         |   52 --
 examples/dsptest/dsptest.h        |  109 ----
 examples/dsptest/dsptest_main.c   |  113 ----
 examples/dsptest/test_foc.c       |  493 ----------------
 examples/dsptest/test_misc.c      |  633 --------------------
 examples/dsptest/test_motor.c     | 1141 -------------------------------------
 examples/dsptest/test_observer.c  |  357 ------------
 examples/dsptest/test_pid.c       |  516 -----------------
 examples/dsptest/test_svm.c       |  309 ----------
 examples/dsptest/test_transform.c |  303 ----------
 13 files changed, 4111 deletions(-)

diff --git a/examples/README.md b/examples/README.md
index 6dd601d..552a683 100644
--- a/examples/README.md
+++ b/examples/README.md
@@ -276,23 +276,6 @@ Example Configuration:
 - `CONFIG_EXAMPLES_DJOYSTICK_SIGNO` – Signal used to signal the test
   application. Default `13`.
 
-
-## `dsptest` DSP
-
-This is a Unit Test for the NuttX DSP library. It use Unity testing framework.
-
-Dependencies:
-
-```conf
-CONFIG_LIBDSP=y
-CONFIG_LIBDSP_DEBUG=y
-CONFIG_TESTING_UNITY=y
-```
-
-Optional configuration:
-
-- `CONFIG_TESTING_UNITY_OUTPUT_COLOR` – enable colored output.
-
 ## `elf` ELF loader
 
 This example builds a small ELF loader test case. This includes several test
diff --git a/examples/dsptest/Kconfig b/examples/dsptest/Kconfig
deleted file mode 100644
index 4ecda43..0000000
--- a/examples/dsptest/Kconfig
+++ /dev/null
@@ -1,29 +0,0 @@
-#
-# For a description of the syntax of this configuration file,
-# see the file kconfig-language.txt in the NuttX tools repository.
-#
-
-config EXAMPLES_DSPTEST
-       tristate "LIBDSP library testing"
-       default n
-       ---help---
-               Enable the LIBDSP library testing
-
-if EXAMPLES_DSPTEST
-
-config EXAMPLES_DSPTEST_PROGNAME
-       string "Program name"
-       default "dsptest"
-       ---help---
-               This is the name of the program that will be used when the NSH 
ELF
-               program is installed.
-
-config EXAMPLES_DSPTEST_PRIORITY
-       int "Dsptest task priority"
-       default 100
-
-config EXAMPLES_DSPTEST_STACKSIZE
-       int "Dsptest stack size"
-       default DEFAULT_TASK_STACKSIZE
-
-endif
diff --git a/examples/dsptest/Make.defs b/examples/dsptest/Make.defs
deleted file mode 100644
index 9a40bf2..0000000
--- a/examples/dsptest/Make.defs
+++ /dev/null
@@ -1,39 +0,0 @@
-############################################################################
-# apps/examples/dsptest/Make.defs
-# Adds selected applications to apps/ build
-#
-#   Copyright (C) 2018 Gregory Nutt. All rights reserved.
-#   Author: Mateusz Szafoni <[email protected]>
-#
-# 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.
-#
-############################################################################
-
-ifneq ($(CONFIG_EXAMPLES_DSPTEST),)
-CONFIGURED_APPS += $(APPDIR)/examples/dsptest
-endif
diff --git a/examples/dsptest/Makefile b/examples/dsptest/Makefile
deleted file mode 100644
index be9e98c..0000000
--- a/examples/dsptest/Makefile
+++ /dev/null
@@ -1,52 +0,0 @@
-############################################################################
-# apps/examples/dsptest/Makefile
-#
-#   Copyright (C) 2018 Gregory Nutt. All rights reserved.
-#   Author: Mateusz Szafoni <[email protected]>
-#
-# 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.
-#
-############################################################################
-
-include $(APPDIR)/Make.defs
-
-# dsptest built-in application info
-
-PROGNAME = $(CONFIG_EXAMPLES_DSPTEST_PROGNAME)
-PRIORITY = $(CONFIG_EXAMPLES_DSPTEST_PRIORITY)
-STACKSIZE = $(CONFIG_EXAMPLES_DSPTEST_STACKSIZE)
-MODULE = $(CONFIG_EXAMPLES_DSPTEST)
-
-# dsptest example
-
-MAINSRC = dsptest_main.c
-
-CSRCS += test_foc.c test_pid.c test_svm.c test_misc.c test_motor.c
-CSRCS += test_observer.c test_transform.c
-
-include $(APPDIR)/Application.mk
diff --git a/examples/dsptest/dsptest.h b/examples/dsptest/dsptest.h
deleted file mode 100644
index 4c5b443..0000000
--- a/examples/dsptest/dsptest.h
+++ /dev/null
@@ -1,109 +0,0 @@
-/****************************************************************************
- * apps/examples/dsptest/dsptest.h
- *
- *   Copyright (C) 2018 Gregory Nutt. All rights reserved.
- *   Author: Mateusz Szafoni <[email protected]>
- *
- * 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.
- *
- ****************************************************************************/
-
-#ifndef __APPS_EXAMPLES_DSPTEST_DSPTEST_H
-#define __APPS_EXAMPLES_DSPTEST_DSPTEST_H
-
-/****************************************************************************
- * Pre-processor Definitions
- ****************************************************************************/
-
-/****************************************************************************
- * Included Files
- ****************************************************************************/
-
-#include <nuttx/config.h>
-
-#include <stdio.h>
-#include <float.h>
-
-#include <dsp.h>
-
-#include <testing/unity.h>
-
-/****************************************************************************
- * Pre-processor Definitions
- ****************************************************************************/
-
-#define TEST_SINCOS_DELTA       0.06
-#define TEST_SINCOS2_DELTA      0.01
-#define TEST_ATAN2_DELTA        0.015
-
-#define TEST_SEPARATOR()                                                  \
-  printf("\n========================================================\n"); \
-  printf("-> %s\n", __FILE__);                                            \
-  printf("========================================================\n\n");
-
-/****************************************************************************
- * Public Types
- ****************************************************************************/
-
-/****************************************************************************
- * Public Data
- ****************************************************************************/
-
-/****************************************************************************
- * Public Function Prototypes
- ****************************************************************************/
-
-/* test_misc.c **************************************************************/
-
-void test_misc(void);
-
-/* test_pid.c ***************************************************************/
-
-void test_pid(void);
-
-/* test_transform.c *********************************************************/
-
-void test_transform(void);
-
-/* test_foc.c ***************************************************************/
-
-void test_foc(void);
-
-/* test_svm.c ***************************************************************/
-
-void test_svm(void);
-
-/* test_observer.c **********************************************************/
-
-void test_observer(void);
-
-/* test_motor.c *************************************************************/
-
-void test_motor(void);
-
-#endif /* __APPS_EXAMPLES_DSPTEST_DSPTEST_H */
diff --git a/examples/dsptest/dsptest_main.c b/examples/dsptest/dsptest_main.c
deleted file mode 100644
index 703b911..0000000
--- a/examples/dsptest/dsptest_main.c
+++ /dev/null
@@ -1,113 +0,0 @@
-/****************************************************************************
- * examples/dsptest/dsptest_main.c
- *
- *   Copyright (C) 2018 Gregory Nutt. All rights reserved.
- *   Author: Mateusz Szafoni <[email protected]>
- *
- * 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 "dsptest.h"
-
-/****************************************************************************
- * Pre-processor Definitions
- ****************************************************************************/
-
-#ifndef CONFIG_TESTING_UNITY
-#  error "This example needs Unity testing library"
-#endif
-
-#ifndef CONFIG_LIBDSP
-#  error "Libdsp not enabled"
-#endif
-
-#ifndef CONFIG_LIBDSP_DEBUG
-#  error "Libdsp debug not enabled"
-#endif
-
-/****************************************************************************
- * Private Types
- ****************************************************************************/
-
-/****************************************************************************
- * Private Function Protototypes
- ****************************************************************************/
-
-/****************************************************************************
- * Private Data
- ****************************************************************************/
-
-/****************************************************************************
- * Private Functions
- ****************************************************************************/
-
-/****************************************************************************
- * Public Functions
- ****************************************************************************/
-
-/****************************************************************************
- * dsptest_main
- ****************************************************************************/
-
-int main(int argc, FAR char *argv[])
-{
-  /* Test misc module */
-
-  test_misc();
-
-  /* Test pid module */
-
-  test_pid();
-
-  /* Test transform module */
-
-  test_transform();
-
-  /* Test foc module */
-
-  test_foc();
-
-  /* Test SVM module */
-
-  test_svm();
-
-  /* Test observer module */
-
-  test_observer();
-
-  /* Test motor module */
-
-  test_motor();
-
-  return 0;
-}
diff --git a/examples/dsptest/test_foc.c b/examples/dsptest/test_foc.c
deleted file mode 100644
index 0c8f0c6..0000000
--- a/examples/dsptest/test_foc.c
+++ /dev/null
@@ -1,493 +0,0 @@
-/****************************************************************************
- * examples/dsptest/test_foc.c
- *
- *   Copyright (C) 2018 Gregory Nutt. All rights reserved.
- *   Author: Mateusz Szafoni <[email protected]>
- *
- * 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 "dsptest.h"
-
-/****************************************************************************
- * Pre-processor Definitions
- ****************************************************************************/
-
-/* Set float precision for this module */
-
-#undef UNITY_FLOAT_PRECISION
-
-#if CONFIG_LIBDSP_PRECISION == 1
-#  define UNITY_FLOAT_PRECISION   (0.1f)
-#elif CONFIG_LIBDSP_PRECISION == 2
-#  define UNITY_FLOAT_PRECISION   (0.001f)
-#else
-#  define UNITY_FLOAT_PRECISION   (0.999f)
-#endif
-
-/* Value close enough to zero */
-
-#define TEST_ASSERT_EQUAL_FLOAT_ZERO(a)         \
-  TEST_ASSERT_FLOAT_WITHIN(1e-6, 0.0, a);
-
-/****************************************************************************
- * Private Types
- ****************************************************************************/
-
-/****************************************************************************
- * Private Function Protototypes
- ****************************************************************************/
-
-/****************************************************************************
- * Private Data
- ****************************************************************************/
-
-/****************************************************************************
- * Private Functions
- ****************************************************************************/
-
-/* Initialize FOC data */
-
-static void test_foc_init(void)
-{
-  struct foc_data_s foc;
-  float id_kp = 1.0;
-  float id_ki = 2.0;
-  float iq_kp = 3.0;
-  float iq_ki = 4.0;
-
-  foc_init(&foc, id_kp, id_ki, iq_kp, iq_ki);
-
-  TEST_ASSERT_EQUAL_FLOAT(1.0, foc.id_pid.KP);
-  TEST_ASSERT_EQUAL_FLOAT(2.0, foc.id_pid.KI);
-  TEST_ASSERT_EQUAL_FLOAT(0.0, foc.id_pid.KD);
-  TEST_ASSERT_EQUAL_FLOAT(3.0, foc.iq_pid.KP);
-  TEST_ASSERT_EQUAL_FLOAT(4.0, foc.iq_pid.KI);
-  TEST_ASSERT_EQUAL_FLOAT(0.0, foc.iq_pid.KD);
-
-  foc_idq_ref_set(&foc, 1.0, 2.0);
-
-  TEST_ASSERT_EQUAL_FLOAT(1.0, foc.i_dq_ref.d);
-  TEST_ASSERT_EQUAL_FLOAT(2.0, foc.i_dq_ref.q);
-
-  foc_vbase_update(&foc, 0.1);
-
-  TEST_ASSERT_EQUAL_FLOAT(0.1, 1.0 / foc.vab_mod_scale);
-  TEST_ASSERT_EQUAL_FLOAT(0.1, foc.vdq_mag_max);
-}
-
-/* Feed FOC with zeros */
-
-static void test_foc_process_zeros(void)
-{
-  struct foc_data_s foc;
-  float id_kp = 1.00;
-  float id_ki = 0.01;
-  float iq_kp = 1.00;
-  float iq_ki = 0.01;
-  abc_frame_t i_abc;
-  phase_angle_t angle;
-
-  /* Initialize FOC */
-
-  foc_init(&foc, id_kp, id_ki, iq_kp, iq_ki);
-
-  /* Input:
-   *   abc         = (0.0, 0.0, 0.0)
-   *   i_dq_ref    = (1.0, 1.0)
-   *   vab_scale   = 1.0
-   *   vdq_mag_max = 1.0
-   *   angle       = 0.0
-   *
-   * Expected:
-   *   i_ab     = (0.0, 0.0)
-   *   i_dq     = (0.0, 0.0)
-   *   v_dq     = (0.0, 0.0)
-   *   v_ab     = (0.0, 0.0)
-   *   v_ab_mod = (0.0, 0.0)
-   */
-
-  i_abc.a = 0.0;
-  i_abc.b = 0.0;
-  i_abc.c = 0.0;
-  phase_angle_update(&angle, 0.0);
-  foc_idq_ref_set(&foc, 0.0, 0.0);
-  foc_vbase_update(&foc, 1.0);
-
-  foc_process(&foc, &i_abc, &angle);
-
-  TEST_ASSERT_EQUAL_FLOAT_ZERO(foc.v_ab.a);
-  TEST_ASSERT_EQUAL_FLOAT_ZERO(foc.v_ab.b);
-  TEST_ASSERT_EQUAL_FLOAT_ZERO(foc.v_ab_mod.a);
-  TEST_ASSERT_EQUAL_FLOAT_ZERO(foc.v_ab_mod.b);
-
-  /* Input:
-   *   abc         = (1.0, -0.5, -0.5)
-   *   i_dq_ref    = (1.0, 0.0)
-   *   vab_scale   = 1.0
-   *   vdq_mag_max = 1.0
-   *   angle       = 0.0
-   *
-   * Expected:
-   *   i_ab     = (1.0, 0.0)
-   *   i_dq     = (1.0, 0.0)
-   *   v_dq     = (0.0, 0.0)
-   *   v_ab     = (0.0, 0.0)
-   *   v_ab_mod = (0.0, 0.0)
-   */
-
-  i_abc.a = 1.0;
-  i_abc.b = -0.5;
-  i_abc.c = -0.5;
-  foc_idq_ref_set(&foc, 1.0, 0.0);
-  foc_vbase_update(&foc, 1.0);
-  phase_angle_update(&angle, 0.0);
-
-  foc_process(&foc, &i_abc, &angle);
-
-  TEST_ASSERT_EQUAL_FLOAT_ZERO(foc.v_ab.a);
-  TEST_ASSERT_EQUAL_FLOAT_ZERO(foc.v_ab.b);
-  TEST_ASSERT_EQUAL_FLOAT_ZERO(foc.v_ab_mod.a);
-  TEST_ASSERT_EQUAL_FLOAT_ZERO(foc.v_ab_mod.b);
-
-  /* Input:
-   *   abc         = (-1.0, 0.5, 0.5)
-   *   i_dq_ref    = (-1.0, 0.0)
-   *   vab_scale   = 1.0
-   *   vdq_mag_max = 1.0
-   *   angle       = 0.0
-   *
-   * Expected:
-   *   i_ab     = (-1.0, 0.0)
-   *   i_dq     = (-1.0, 0.0)
-   *   v_dq     = (0.0, 0.0)
-   *   v_ab     = (0.0, 0.0)
-   *   v_ab_mod = (0.0, 0.0)
-   */
-
-  i_abc.a = -1.0;
-  i_abc.b = 0.5;
-  i_abc.c = 0.5;
-  foc_idq_ref_set(&foc, -1.0, 0.0);
-  foc_vbase_update(&foc, 1.0);
-  phase_angle_update(&angle, 0.0);
-
-  foc_process(&foc, &i_abc, &angle);
-
-  TEST_ASSERT_EQUAL_FLOAT_ZERO(foc.v_ab.a);
-  TEST_ASSERT_EQUAL_FLOAT_ZERO(foc.v_ab.b);
-  TEST_ASSERT_EQUAL_FLOAT_ZERO(foc.v_ab_mod.a);
-  TEST_ASSERT_EQUAL_FLOAT_ZERO(foc.v_ab_mod.b);
-}
-
-/* Process FOC with some test data */
-
-static void test_foc_process(void)
-{
-  struct foc_data_s foc;
-  float id_kp = 1.00;
-  float id_ki = 0.00;
-  float iq_kp = 1.00;
-  float iq_ki = 0.00;
-  abc_frame_t i_abc;
-  phase_angle_t angle;
-  float i_d_ref = 0.0;
-  float i_q_ref = 0.0;
-
-  /* Initialize FOC.
-   * For simplicity KP = 1.0, KI = 0.0
-   */
-
-  foc_init(&foc, id_kp, id_ki, iq_kp, iq_ki);
-
-  /* Input:
-   *   abc         = (1.0, 1.0, -2.0)
-   *   i_dq_ref    = (2.0, 2.0)
-   *   vab_scale   = 0.1
-   *   vdq_mag_max = 10.0
-   *   angle       = PI
-   *
-   * Expected:
-   *   i_ab     = (1.0, 1.7320)
-   *   i_dq     = (-1.0, -1.7320)
-   *   v_dq     = (3.0, 3.7320)
-   *   v_ab     = (0.30, 0.37320)
-   *   v_ab_mod = (0.30, 0.37320)
-   */
-
-  i_abc.a = 1.0;
-  i_abc.b = 1.0;
-  i_abc.c = -2.0;
-  i_d_ref = 2.0;
-  i_q_ref = 2.0;
-  phase_angle_update(&angle, M_PI_F);
-  foc_idq_ref_set(&foc, i_d_ref, i_q_ref);
-  foc_vbase_update(&foc, 10.0);
-
-  foc_process(&foc, &i_abc, &angle);
-
-  TEST_ASSERT_EQUAL_FLOAT(1.0    , foc.i_ab.a);
-  TEST_ASSERT_EQUAL_FLOAT(1.7320 , foc.i_ab.b);
-  TEST_ASSERT_EQUAL_FLOAT(-1.0   , foc.i_dq.d);
-  TEST_ASSERT_EQUAL_FLOAT(-1.7320, foc.i_dq.q);
-  TEST_ASSERT_EQUAL_FLOAT(3.0    , foc.v_dq.d);
-  TEST_ASSERT_EQUAL_FLOAT(3.7320 , foc.v_dq.q);
-  TEST_ASSERT_EQUAL_FLOAT(-3.0   , foc.v_ab.a);
-  TEST_ASSERT_EQUAL_FLOAT(-3.7320, foc.v_ab.b);
-  TEST_ASSERT_EQUAL_FLOAT(-0.3   , foc.v_ab_mod.a);
-  TEST_ASSERT_EQUAL_FLOAT(-0.3732, foc.v_ab_mod.b);
-
-  /* Input:
-   *   abc         = (1.0, 1.0, -2.0)
-   *   i_dq_ref    = (2.0, 2.0)
-   *   vab_scale   = 0.1
-   *   vdq_mag_max = 10
-   *   angle       = -PI
-   *
-   * Expected:
-   *   i_ab     = (1.0, 1.7320)
-   *   i_dq     = (-1.0, -1.7320)
-   *   v_dq     = (3.0, 3.7320)
-   *   v_ab     = (-0.30, -0.37320)
-   *   v_ab_mod = (-0.30, -0.37320)
-   */
-
-  i_abc.a = 1.0;
-  i_abc.b = 1.0;
-  i_abc.c = -2.0;
-  i_d_ref = 2.0;
-  i_q_ref = 2.0;
-  phase_angle_update(&angle, -M_PI_F);
-  foc_idq_ref_set(&foc, i_d_ref, i_q_ref);
-  foc_vbase_update(&foc, 10.0);
-
-  foc_process(&foc, &i_abc, &angle);
-
-  TEST_ASSERT_EQUAL_FLOAT(1.0    , foc.i_ab.a);
-  TEST_ASSERT_EQUAL_FLOAT(1.7320 , foc.i_ab.b);
-  TEST_ASSERT_EQUAL_FLOAT(-1.0   , foc.i_dq.d);
-  TEST_ASSERT_EQUAL_FLOAT(-1.7320, foc.i_dq.q);
-  TEST_ASSERT_EQUAL_FLOAT(3.0    , foc.v_dq.d);
-  TEST_ASSERT_EQUAL_FLOAT(3.7320 , foc.v_dq.q);
-  TEST_ASSERT_EQUAL_FLOAT(-3.0   , foc.v_ab.a);
-  TEST_ASSERT_EQUAL_FLOAT(-3.7320, foc.v_ab.b);
-  TEST_ASSERT_EQUAL_FLOAT(-0.30  , foc.v_ab_mod.a);
-  TEST_ASSERT_EQUAL_FLOAT(-0.3732, foc.v_ab_mod.b);
-
-  /* Input:
-   *   abc         = (1.0, 1.0, -2.0)
-   *   i_dq_ref    = (2.0, 2.0)
-   *   vab_scale   = 0.1
-   *   vdq_mag_max = 10
-   *   angle       = 0.1
-   *
-   * Expected:
-   *   i_ab     = (1.0, 1.7320)
-   *   i_dq     = (1.1679, 1.6236)
-   *   v_dq     = (0.8321, 0.3764)
-   *   v_ab     = (0.7903, 0.4576)
-   *   v_ab_mod = (0.07903, 0.04576)
-   */
-
-  i_abc.a = 1.0;
-  i_abc.b = 1.0;
-  i_abc.c = -2.0;
-  i_d_ref = 2.0;
-  i_q_ref = 2.0;
-  phase_angle_update(&angle, 0.1);
-  foc_idq_ref_set(&foc, i_d_ref, i_q_ref);
-  foc_vbase_update(&foc, 10.0);
-
-  foc_process(&foc, &i_abc, &angle);
-
-  TEST_ASSERT_EQUAL_FLOAT(1.0    , foc.i_ab.a);
-  TEST_ASSERT_EQUAL_FLOAT(1.7320 , foc.i_ab.b);
-  TEST_ASSERT_EQUAL_FLOAT(1.1679 , foc.i_dq.d);
-  TEST_ASSERT_EQUAL_FLOAT(1.6236 , foc.i_dq.q);
-  TEST_ASSERT_EQUAL_FLOAT(0.8321 , foc.v_dq.d);
-  TEST_ASSERT_EQUAL_FLOAT(0.3764 , foc.v_dq.q);
-  TEST_ASSERT_EQUAL_FLOAT(0.7903 , foc.v_ab.a);
-  TEST_ASSERT_EQUAL_FLOAT(0.4576 , foc.v_ab.b);
-  TEST_ASSERT_EQUAL_FLOAT(0.07903, foc.v_ab_mod.a);
-  TEST_ASSERT_EQUAL_FLOAT(0.04576, foc.v_ab_mod.b);
-
-  /* Input:
-   *   abc         = (1.0, 1.0, -2.0)
-   *   i_dq_ref    = (2.0, 2.0)
-   *   vab_scale   = 0.1
-   *   vdq_mag_max = 10.0
-   *   angle       = -0.1
-   *
-   * Expected:
-   *   i_ab     = (1.0   , 1.7320)
-   *   i_dq     = (0.8221, 1.8232)
-   *   v_dq     = (1.1779, 0.1768)
-   *   v_ab     = (0.11897, 0.00583)
-   *   v_ab_mod = (0.11897, 0.00583)
-   */
-
-  i_abc.a = 1.0;
-  i_abc.b = 1.0;
-  i_abc.c = -2.0;
-  i_d_ref = 2.0;
-  i_q_ref = 2.0;
-  phase_angle_update(&angle, -0.1);
-  foc_idq_ref_set(&foc, i_d_ref, i_q_ref);
-  foc_vbase_update(&foc, 10.0);
-
-  foc_process(&foc, &i_abc, &angle);
-
-  TEST_ASSERT_EQUAL_FLOAT(1.0, foc.i_ab.a);
-  TEST_ASSERT_EQUAL_FLOAT(1.7320, foc.i_ab.b);
-  TEST_ASSERT_EQUAL_FLOAT(0.8221, foc.i_dq.d);
-  TEST_ASSERT_EQUAL_FLOAT(1.8232, foc.i_dq.q);
-  TEST_ASSERT_EQUAL_FLOAT(1.1779, foc.v_dq.d);
-  TEST_ASSERT_EQUAL_FLOAT(0.1768, foc.v_dq.q);
-  TEST_ASSERT_EQUAL_FLOAT(1.1897, foc.v_ab.a);
-  TEST_ASSERT_EQUAL_FLOAT(0.0583, foc.v_ab.b);
-  TEST_ASSERT_EQUAL_FLOAT(0.11897, foc.v_ab_mod.a);
-  TEST_ASSERT_EQUAL_FLOAT(0.00583, foc.v_ab_mod.b);
-
-  /* Input:
-   *   abc         = (1.0, 1.0, -2.0)
-   *   i_dq_ref    = (-2.0, 0.0)
-   *   vab_scale   = 0.1
-   *   vdq_mag_max = 10.0
-   *   angle       = 0.1
-   *
-   * Expected:
-   *   i_ab     = (1.0, 1.7320)
-   *   i_dq     = (1.1679, 1.6236)
-   *   v_dq     = (-3.1679, -1.6236)
-   *   v_ab     = (-0.29900, -0.19317)
-   *   v_ab_mod = (-0.29900, -0.19317)
-   */
-
-  i_abc.a = 1.0;
-  i_abc.b = 1.0;
-  i_abc.c = -2.0;
-  i_d_ref = -2.0;
-  i_q_ref = 0.0;
-  phase_angle_update(&angle, 0.1);
-  foc_idq_ref_set(&foc, i_d_ref, i_q_ref);
-  foc_vbase_update(&foc, 10.0);
-
-  foc_process(&foc, &i_abc, &angle);
-
-  TEST_ASSERT_EQUAL_FLOAT(1.0    , foc.i_ab.a);
-  TEST_ASSERT_EQUAL_FLOAT(1.7320 , foc.i_ab.b);
-  TEST_ASSERT_EQUAL_FLOAT(1.1679 , foc.i_dq.d);
-  TEST_ASSERT_EQUAL_FLOAT(1.6236 , foc.i_dq.q);
-  TEST_ASSERT_EQUAL_FLOAT(-3.1679 , foc.v_dq.d);
-  TEST_ASSERT_EQUAL_FLOAT(-1.6236 , foc.v_dq.q);
-  TEST_ASSERT_EQUAL_FLOAT(-2.9900 , foc.v_ab.a);
-  TEST_ASSERT_EQUAL_FLOAT(-1.9317 , foc.v_ab.b);
-  TEST_ASSERT_EQUAL_FLOAT(-0.29900 , foc.v_ab_mod.a);
-  TEST_ASSERT_EQUAL_FLOAT(-0.19317 , foc.v_ab_mod.b);
-
-  /* Input:
-   *   abc         = (1.0, 1.0, -2.0)
-   *   i_dq_ref    = (-2.0, -2.0)
-   *   vab_scale   = 0.1
-   *   vdq_mag_max = 10.0
-   *   angle       = 0.1
-   *
-   * Expected:
-   *   i_ab     = (1.0, 1.7320)
-   *   i_dq     = (1.1679, 1.6236)
-   *   v_dq     = (-3.1679, -3.6236)
-   *   v_ab     = (-0.27903, -0.39217)
-   *   v_ab_mod = (-0.27903, -0.39217)
-   */
-
-  i_abc.a = 1.0;
-  i_abc.b = 1.0;
-  i_abc.c = -2.0;
-  i_d_ref = -2.0;
-  i_q_ref = -2.0;
-  phase_angle_update(&angle, 0.1);
-  foc_idq_ref_set(&foc, i_d_ref, i_q_ref);
-  foc_vbase_update(&foc, 10.0);
-
-  foc_process(&foc, &i_abc, &angle);
-
-  TEST_ASSERT_EQUAL_FLOAT(1.0    , foc.i_ab.a);
-  TEST_ASSERT_EQUAL_FLOAT(1.7320 , foc.i_ab.b);
-  TEST_ASSERT_EQUAL_FLOAT(1.1679 , foc.i_dq.d);
-  TEST_ASSERT_EQUAL_FLOAT(1.6236 , foc.i_dq.q);
-  TEST_ASSERT_EQUAL_FLOAT(-3.1679 , foc.v_dq.d);
-  TEST_ASSERT_EQUAL_FLOAT(-3.6236 , foc.v_dq.q);
-  TEST_ASSERT_EQUAL_FLOAT(-2.7903 , foc.v_ab.a);
-  TEST_ASSERT_EQUAL_FLOAT(-3.9217 , foc.v_ab.b);
-  TEST_ASSERT_EQUAL_FLOAT(-0.27903, foc.v_ab_mod.a);
-  TEST_ASSERT_EQUAL_FLOAT(-0.39217, foc.v_ab_mod.b);
-}
-
-/* Test FOC saturation */
-
-static void test_foc_saturation(void)
-{
-  TEST_FAIL_MESSAGE("not implemented");
-}
-
-/* Test FOC vdq modulation */
-
-static void test_foc_vdq_modulation(void)
-{
-  TEST_FAIL_MESSAGE("not implemented");
-}
-
-/****************************************************************************
- * Public Functions
- ****************************************************************************/
-
-/****************************************************************************
- * Name: test_foc
- ****************************************************************************/
-
-void test_foc(void)
-{
-  UNITY_BEGIN();
-
-  TEST_SEPARATOR();
-
-  /* Test FOC */
-
-  RUN_TEST(test_foc_init);
-  RUN_TEST(test_foc_process_zeros);
-  RUN_TEST(test_foc_process);
-  RUN_TEST(test_foc_saturation);
-  RUN_TEST(test_foc_vdq_modulation);
-
-  UNITY_END();
-}
diff --git a/examples/dsptest/test_misc.c b/examples/dsptest/test_misc.c
deleted file mode 100644
index 62a5510..0000000
--- a/examples/dsptest/test_misc.c
+++ /dev/null
@@ -1,633 +0,0 @@
-/****************************************************************************
- * examples/dsptest/test_misc.c
- *
- *   Copyright (C) 2018 Gregory Nutt. All rights reserved.
- *   Author: Mateusz Szafoni <[email protected]>
- *
- * 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 "dsptest.h"
-
-/****************************************************************************
- * Pre-processor Definitions
- ****************************************************************************/
-
-/* Set float precision for this module */
-
-#undef UNITY_FLOAT_PRECISION
-#define UNITY_FLOAT_PRECISION   (0.0001f)
-
-#define TEST_SINCOS_ANGLE_STEP  0.01
-#define TEST_SINCOS2_ANGLE_STEP 0.01
-#define TEST_ATAN2_XY_STEP      0.01
-
-/* Angle sin/cos depends on libdsp precision */
-
-#if CONFIG_LIBDSP_PRECISION == 1
-#  define ANGLE_SIN(val) fast_sin2(val)
-#  define ANGLE_COS(val) fast_cos2(val)
-#elif CONFIG_LIBDSP_PRECISION == 2
-#  define ANGLE_SIN(val) sin(val)
-#  define ANGLE_COS(val) cos(val)
-#else
-#  define ANGLE_SIN(val) fast_sin(val)
-#  define ANGLE_COS(val) fast_cos(val)
-#endif
-
-/****************************************************************************
- * Private Types
- ****************************************************************************/
-
-/****************************************************************************
- * Private Function Protototypes
- ****************************************************************************/
-
-/****************************************************************************
- * Private Data
- ****************************************************************************/
-
-/****************************************************************************
- * Private Functions
- ****************************************************************************/
-
-/* Test float value saturation */
-
-static void test_f_saturate(void)
-{
-  float val = 0.0;
-
-  /* Value in the range */
-
-  val = 0.9;
-  f_saturate(&val, 0.0, 1.0);
-
-  TEST_ASSERT_EQUAL_FLOAT(0.9, val);
-
-  /* Upper limit */
-
-  val = 1.2;
-  f_saturate(&val, 0.0, 1.0);
-
-  TEST_ASSERT_EQUAL_FLOAT(1.0, val);
-
-  /* Lower limit */
-
-  val = 0.0;
-  f_saturate(&val, 0.1, 1.0);
-
-  TEST_ASSERT_EQUAL_FLOAT(0.1, val);
-}
-
-/* Test 2D vector magnitude */
-
-static void test_vector2d_mag(void)
-{
-  float mag = 0.0;
-
-  /* mag([0.0, 0.0]) = 0.0 */
-
-  mag = vector2d_mag(0.0, 0.0);
-
-  TEST_ASSERT_EQUAL_FLOAT(0.0, mag);
-
-  /* mag([1.0, 1.0]) = 1.4142 */
-
-  mag = vector2d_mag(1.0, 1.0);
-
-  TEST_ASSERT_EQUAL_FLOAT(1.4142, mag);
-
-  /* mag([-1.0, 1.0]) = 1.4142 */
-
-  mag = vector2d_mag(-1.0, 1.0);
-
-  TEST_ASSERT_EQUAL_FLOAT(1.4142, mag);
-}
-
-/* Test 2D vector saturation */
-
-static void test_vector2d_saturate(void)
-{
-  float x       = 0.0;
-  float y       = 0.0;
-  float mag     = 0.0;
-  float mag_ref = 0.0;
-
-  /* Vector magnitude 0.0 */
-
-  x = 0.0;
-  y = 0.0;
-  mag_ref = 1.0;
-  vector2d_saturate(&x, &y, mag_ref);
-
-  TEST_ASSERT_EQUAL_FLOAT(0.0, x);
-  TEST_ASSERT_EQUAL_FLOAT(0.0, y);
-
-  /* Vector magnitude 0.0, saturation 0.0 */
-
-  x = 0.0;
-  y = 0.0;
-  mag_ref = 0.0;
-  vector2d_saturate(&x, &y, mag_ref);
-
-  TEST_ASSERT_EQUAL_FLOAT(mag_ref, x);
-  TEST_ASSERT_EQUAL_FLOAT(mag_ref, y);
-
-  /* Vector magnitude 1.4142, saturation 0.0 */
-
-  x = 1.0;
-  y = 1.0;
-  mag_ref = 0.0;
-  vector2d_saturate(&x, &y, mag_ref);
-
-  TEST_ASSERT_EQUAL_FLOAT(0.0, x);
-  TEST_ASSERT_EQUAL_FLOAT(0.0, y);
-
-  /* Vector magnitude 1.4142, saturation 3.0 */
-
-  x = 1.0;
-  y = 1.0;
-  mag_ref = 3.0;
-  vector2d_saturate(&x, &y, mag_ref);
-
-  TEST_ASSERT_EQUAL_FLOAT(1.0, x);
-  TEST_ASSERT_EQUAL_FLOAT(1.0, y);
-
-  /* Vector magnitude 1.4142, saturation 1.0 - truncate */
-
-  x = 1.0;
-  y = 1.0;
-  mag_ref = 1.0;
-  vector2d_saturate(&x, &y, mag_ref);
-  mag = vector2d_mag(x, y);
-
-  TEST_ASSERT_EQUAL_FLOAT(mag_ref, mag);
-}
-
-/* Test dq vector magnitude */
-
-static void test_dq_mag(void)
-{
-  TEST_IGNORE_MESSAGE("test_dq_mag not implemented");
-}
-
-/* Test dq vector saturation */
-
-static void test_dq_saturate(void)
-{
-  dq_frame_t dq;
-  float mag_ref = 0.0;
-  float mag     = 0.0;
-
-  /* Vector magnitude 0.0 */
-
-  dq.d = 0.0;
-  dq.q = 0.0;
-  mag_ref = 1.0;
-  dq_saturate(&dq, mag_ref);
-
-  TEST_ASSERT_EQUAL_FLOAT(0.0, dq.d);
-  TEST_ASSERT_EQUAL_FLOAT(0.0, dq.q);
-
-  /* Vector magnitude 0.0, saturation 0.0 */
-
-  dq.d = 0.0;
-  dq.q = 0.0;
-  mag_ref = 0.0;
-  dq_saturate(&dq, mag_ref);
-
-  TEST_ASSERT_EQUAL_FLOAT(mag_ref, dq.d);
-  TEST_ASSERT_EQUAL_FLOAT(mag_ref, dq.q);
-
-  /* Vector magnitude 1.4142, saturation 0.0 */
-
-  dq.d = 1.0;
-  dq.q = 1.0;
-  mag_ref = 0.0;
-  dq_saturate(&dq, mag_ref);
-
-  TEST_ASSERT_EQUAL_FLOAT(mag_ref, dq.d);
-  TEST_ASSERT_EQUAL_FLOAT(mag_ref, dq.q);
-
-  /* Vector magnitude 1.4142, saturation 3.0 */
-
-  dq.d = 1.0;
-  dq.q = 1.0;
-  mag_ref = 3.0;
-  dq_saturate(&dq, mag_ref);
-
-  TEST_ASSERT_EQUAL_FLOAT(1.0, dq.d);
-  TEST_ASSERT_EQUAL_FLOAT(1.0, dq.q);
-
-  /* Vector magnitude 1.4142, saturation 1.0 - truncate */
-
-  dq.d = 1.0;
-  dq.q = 1.0;
-  mag_ref = 1.0;
-  dq_saturate(&dq, mag_ref);
-  mag = dq_mag(&dq);
-
-  TEST_ASSERT_EQUAL_FLOAT(mag_ref, mag);
-}
-
-/* Test fast sine */
-
-static void test_fast_sin(void)
-{
-  float s_ref = 0.0;
-  float angle = 0.0;
-  float s     = 0.0;
-
-  /* Compare with LIBC sine */
-
-  for (angle = 0.0; angle < 2 * M_PI_F; angle += TEST_SINCOS_ANGLE_STEP)
-    {
-      s_ref = sinf(angle);
-      s     = fast_sin(angle);
-
-      TEST_ASSERT_FLOAT_WITHIN(TEST_SINCOS_DELTA, s_ref, s);
-    }
-}
-
-/* Test fast cosine */
-
-static void test_fast_cos(void)
-{
-  float c_ref = 0.0;
-  float angle = 0.0;
-  float c     = 0.0;
-
-  /* Compare with LIBC cosine */
-
-  for (angle = 0.0; angle < 2 * M_PI_F; angle += TEST_SINCOS_ANGLE_STEP)
-    {
-      c_ref = cosf(angle);
-      c     = fast_cos(angle);
-
-      TEST_ASSERT_FLOAT_WITHIN(TEST_SINCOS_DELTA, c_ref, c);
-    }
-}
-
-/* Test fast sine (better accuracy) */
-
-static void test_fast_sin2(void)
-{
-  float s_ref = 0.0;
-  float angle = 0.0;
-  float s     = 0.0;
-
-  /* Compare with LIBC sine */
-
-  for (angle = 0.0; angle < 2 * M_PI_F; angle += TEST_SINCOS2_ANGLE_STEP)
-    {
-      s_ref = sinf(angle);
-      s     = fast_sin2(angle);
-
-      TEST_ASSERT_FLOAT_WITHIN(TEST_SINCOS2_DELTA, s_ref, s);
-    }
-}
-
-/* Test fast cosine (better accuracy) */
-
-static void test_fast_cos2(void)
-{
-  float c_ref = 0.0;
-  float angle = 0.0;
-  float c     = 0.0;
-
-  /* Compare with LIBC cosine */
-
-  for (angle = 0.0; angle < 2 * M_PI_F; angle += TEST_SINCOS2_ANGLE_STEP)
-    {
-      c_ref = cosf(angle);
-      c     = fast_cos2(angle);
-
-      TEST_ASSERT_FLOAT_WITHIN(TEST_SINCOS2_DELTA, c_ref, c);
-    }
-}
-
-/* Test fast atan2 */
-
-static void test_fast_atan2(void)
-{
-  float angle_ref = 0.0;
-  float angle     = 0.0;
-  float x         = 0.0;
-  float y         = 0.0;
-
-  /* atan2(0, 0) - special case when atan2 is not defined */
-
-  angle = fast_atan2(y, x);
-
-  /* Expect non inf and non nan */
-
-  TEST_ASSERT_FLOAT_IS_DETERMINATE(angle);
-
-  /* Compare with LIBC atan2 */
-
-  for (x = TEST_ATAN2_XY_STEP; x < M_PI_F; x += TEST_ATAN2_XY_STEP)
-    {
-      for (y = TEST_ATAN2_XY_STEP; y < M_PI_F; y += TEST_ATAN2_XY_STEP)
-        {
-          angle_ref = atan2f(y, x);
-          angle     = fast_atan2(y, x);
-
-          TEST_ASSERT_FLOAT_WITHIN(TEST_ATAN2_DELTA, angle_ref, angle);
-        }
-    }
-
-  for (x = -TEST_ATAN2_XY_STEP; x > -M_PI_F; x -= TEST_ATAN2_XY_STEP)
-    {
-      for (y = -TEST_ATAN2_XY_STEP; y > -M_PI_F; y -= TEST_ATAN2_XY_STEP)
-        {
-          angle_ref = atan2f(y, x);
-          angle     = fast_atan2(y, x);
-
-          TEST_ASSERT_FLOAT_WITHIN(TEST_ATAN2_DELTA, angle_ref, angle);
-        }
-    }
-
-  for (x = TEST_ATAN2_XY_STEP; x < M_PI_F; x += TEST_ATAN2_XY_STEP)
-    {
-      for (y = -TEST_ATAN2_XY_STEP; y > -M_PI_F; y -= TEST_ATAN2_XY_STEP)
-        {
-          angle_ref = atan2f(y, x);
-          angle     = fast_atan2(y, x);
-
-          TEST_ASSERT_FLOAT_WITHIN(TEST_ATAN2_DELTA, angle_ref, angle);
-        }
-    }
-
-  for (x = -TEST_ATAN2_XY_STEP; x > -M_PI_F; x -= TEST_ATAN2_XY_STEP)
-    {
-      for (y = TEST_ATAN2_XY_STEP; y < M_PI_F; y += TEST_ATAN2_XY_STEP)
-        {
-          angle_ref = atan2f(y, x);
-          angle     = fast_atan2(y, x);
-
-          TEST_ASSERT_FLOAT_WITHIN(TEST_ATAN2_DELTA, angle_ref, angle);
-        }
-    }
-
-  /* Test some big numbers */
-
-  x = 1000000.0;
-  y = 2.0;
-
-  angle_ref = atan2f(y, x);
-  angle     = fast_atan2(y, x);
-
-  TEST_ASSERT_FLOAT_WITHIN(TEST_ATAN2_DELTA, angle_ref, angle);
-
-  x = 2.0;
-  y = 1000000.0;
-
-  angle_ref = atan2f(y, x);
-  angle     = fast_atan2(y, x);
-
-  TEST_ASSERT_FLOAT_WITHIN(TEST_ATAN2_DELTA, angle_ref, angle);
-
-  x = 1000000.0;
-  y = 1000000.0;
-
-  angle_ref = atan2f(y, x);
-  angle     = fast_atan2(y, x);
-
-  TEST_ASSERT_FLOAT_WITHIN(TEST_ATAN2_DELTA, angle_ref, angle);
-
-  x = -1000000.0;
-  y = 1000000.0;
-
-  angle_ref = atan2f(y, x);
-  angle     = fast_atan2(y, x);
-
-  TEST_ASSERT_FLOAT_WITHIN(TEST_ATAN2_DELTA, angle_ref, angle);
-
-  x = 1000000.0;
-  y = -1000000.0;
-
-  angle_ref = atan2f(y, x);
-  angle     = fast_atan2(y, x);
-
-  TEST_ASSERT_FLOAT_WITHIN(TEST_ATAN2_DELTA, angle_ref, angle);
-
-  x = -1000000.0;
-  y = -1000000.0;
-
-  angle_ref = atan2f(y, x);
-  angle     = fast_atan2(y, x);
-
-  TEST_ASSERT_FLOAT_WITHIN(TEST_ATAN2_DELTA, angle_ref, angle);
-}
-
-/* Test angle normalization */
-
-static void test_angle_norm(void)
-{
-  float angle  = 0.0;
-  float per    = 0.0;
-  float bottom = 0.0;
-  float top    = 0.0;
-
-  /* range = (0.0, 2PI)  */
-
-  per    = 2 * M_PI_F;
-  bottom = 0.0;
-  top    = 2 * M_PI_F;
-
-  /* in range */
-
-  angle  = 0.0;
-  angle_norm(&angle, per, bottom, top);
-
-  TEST_ASSERT_EQUAL_FLOAT(0.0, angle);
-
-  /* in range */
-
-  angle  = 1.0;
-  angle_norm(&angle, per, bottom, top);
-
-  TEST_ASSERT_EQUAL_FLOAT(1.0, angle);
-
-  /* wrap to 0.2 */
-
-  angle  = 2 * M_PI_F + 0.2;
-  angle_norm(&angle, per, bottom, top);
-
-  TEST_ASSERT_EQUAL_FLOAT(0.2, angle);
-
-  /* wrap to 0.2 */
-
-  angle  = -2 * M_PI_F + 0.2;
-  angle_norm(&angle, per, bottom, top);
-
-  TEST_ASSERT_EQUAL_FLOAT(0.2, angle);
-}
-
-/* Test angle normalization with 2*PI period length */
-
-static void test_angle_norm_2pi(void)
-{
-  float angle  = 0.0;
-  float bottom = 0.0;
-  float top    = 0.0;
-
-  /* range = (0.0, 2PI)  */
-
-  bottom = 0.0;
-  top    = 2 * M_PI_F;
-
-  /* in range */
-
-  angle = 0.0;
-  angle_norm_2pi(&angle, bottom, top);
-
-  TEST_ASSERT_EQUAL_FLOAT(0.0, angle);
-
-  /* in range */
-
-  angle = 1.0;
-  angle_norm_2pi(&angle, bottom, top);
-
-  TEST_ASSERT_EQUAL_FLOAT(1.0, angle);
-
-  /* wrap to 0.2 */
-
-  angle = 2 * M_PI_F + 0.2;
-  angle_norm_2pi(&angle, bottom, top);
-
-  TEST_ASSERT_EQUAL_FLOAT(0.2, angle);
-
-  /* wrap to 0.2 */
-
-  angle = -2 * M_PI_F + 0.2;
-  angle_norm_2pi(&angle, bottom, top);
-
-  TEST_ASSERT_EQUAL_FLOAT(0.2, angle);
-}
-
-/* Test phase angle update */
-
-static void test_phase_angle_update(void)
-{
-  struct phase_angle_s angle;
-  float val = 0.0;
-  float s   = 0.0;
-  float c   = 0.0;
-
-  /* angle = 0.0 */
-
-  val = 0.0;
-  s   = ANGLE_SIN(val);
-  c   = ANGLE_COS(val);
-  phase_angle_update(&angle, val);
-
-  TEST_ASSERT_EQUAL_FLOAT(val, angle.angle);
-  TEST_ASSERT_EQUAL_FLOAT(s, angle.sin);
-  TEST_ASSERT_EQUAL_FLOAT(c, angle.cos);
-
-  /* angle = 1.5 */
-
-  val = 1.5;
-  s   = ANGLE_SIN(val);
-  c   = ANGLE_COS(val);
-  phase_angle_update(&angle, val);
-
-  TEST_ASSERT_EQUAL_FLOAT(val, angle.angle);
-  TEST_ASSERT_EQUAL_FLOAT(s, angle.sin);
-  TEST_ASSERT_EQUAL_FLOAT(c, angle.cos);
-
-  /* angle = 8, should be normalize to (0.0, 2PI) range */
-
-  val = 8;
-  s   = ANGLE_SIN(val);
-  c   = ANGLE_COS(val);
-  phase_angle_update(&angle, val);
-
-  TEST_ASSERT_EQUAL_FLOAT(val - 2 * M_PI_F, angle.angle);
-  TEST_ASSERT_EQUAL_FLOAT(s, angle.sin);
-  TEST_ASSERT_EQUAL_FLOAT(c, angle.cos);
-
-  /* angle = -1.5, should be normalize to (0.0, 2PI) range */
-
-  val = -1.5;
-  s   = ANGLE_SIN(val);
-  c   = ANGLE_COS(val);
-  phase_angle_update(&angle, val);
-
-  TEST_ASSERT_EQUAL_FLOAT(val + 2 * M_PI_F, angle.angle);
-  TEST_ASSERT_EQUAL_FLOAT(s, angle.sin);
-  TEST_ASSERT_EQUAL_FLOAT(c, angle.cos);
-}
-
-/****************************************************************************
- * Public Functions
- ****************************************************************************/
-
-/****************************************************************************
- * Name: test_misc
- ****************************************************************************/
-
-void test_misc(void)
-{
-  UNITY_BEGIN();
-
-  TEST_SEPARATOR();
-
-  /* Test helper functions */
-
-  RUN_TEST(test_f_saturate);
-
-  /* Test vector functions */
-
-  RUN_TEST(test_vector2d_mag);
-  RUN_TEST(test_vector2d_saturate);
-  RUN_TEST(test_dq_mag);
-  RUN_TEST(test_dq_saturate);
-
-  /* Test fast trigonometric functions */
-
-  RUN_TEST(test_fast_sin);
-  RUN_TEST(test_fast_cos);
-  RUN_TEST(test_fast_sin2);
-  RUN_TEST(test_fast_cos2);
-  RUN_TEST(test_fast_atan2);
-
-  /* Test angle functions */
-
-  RUN_TEST(test_angle_norm);
-  RUN_TEST(test_angle_norm_2pi);
-  RUN_TEST(test_phase_angle_update);
-
-  UNITY_END();
-}
diff --git a/examples/dsptest/test_motor.c b/examples/dsptest/test_motor.c
deleted file mode 100644
index 15f9f7f..0000000
--- a/examples/dsptest/test_motor.c
+++ /dev/null
@@ -1,1141 +0,0 @@
-/****************************************************************************
- * examples/dsptest/test_motor.c
- *
- *   Copyright (C) 2018 Gregory Nutt. All rights reserved.
- *   Author: Mateusz Szafoni <[email protected]>
- *
- * 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 "dsptest.h"
-
-/****************************************************************************
- * Pre-processor Definitions
- ****************************************************************************/
-
-/* Set float precision for this module */
-
-#undef UNITY_FLOAT_PRECISION
-#define UNITY_FLOAT_PRECISION (0.0001f)
-
-/****************************************************************************
- * Private Types
- ****************************************************************************/
-
-/****************************************************************************
- * Private Function Protototypes
- ****************************************************************************/
-
-/****************************************************************************
- * Private Data
- ****************************************************************************/
-
-/****************************************************************************
- * Private Functions
- ****************************************************************************/
-
-/* Initialize openloop */
-
-static void test_openloop_init(void)
-{
-  struct openloop_data_s op;
-  float angle     = 0.0;
-  float max_speed = 100;
-  float per       = 10e-6;
-
-  /* Initialize openlooop controller */
-
-  motor_openloop_init(&op, max_speed, per);
-
-  /* Get openloop angle */
-
-  angle = motor_openloop_angle_get(&op);
-
-  /* Test values after initialization */
-
-  TEST_ASSERT_EQUAL_FLOAT(0.0, angle);
-  TEST_ASSERT_EQUAL_FLOAT(per, op.per);
-  TEST_ASSERT_EQUAL_FLOAT(max_speed, op.max);
-}
-
-/* Single step openloop */
-
-static void test_openloop_one_step(void)
-{
-  struct openloop_data_s op;
-  float expected  = 0.0;
-  float angle     = 0.0;
-  float max_speed = 100;
-  float speed     = 10;
-  float per       = 10e-6;
-
-  /* Initialize openlooop controller */
-
-  motor_openloop_init(&op, max_speed, per);
-
-  /* Do single iteration in CW direction */
-
-  motor_openloop(&op, speed, DIR_CW);
-
-  /* Get openloop angle */
-
-  angle = motor_openloop_angle_get(&op);
-
-  /* Get expected value */
-
-  expected = speed * per;
-
-  /* Test */
-
-  TEST_ASSERT_EQUAL_FLOAT(expected, angle);
-
-  /* Do single iteration in CCW direction */
-
-  motor_openloop(&op, speed, DIR_CCW);
-
-  /* Get openloop angle */
-
-  angle = motor_openloop_angle_get(&op);
-
-  /* Get expected value */
-
-  expected = 0.0;
-
-  /* Test */
-
-  TEST_ASSERT_EQUAL_FLOAT(expected, angle);
-}
-
-/* Many steps in openloop */
-
-static void test_openloop_many_steps(void)
-{
-  struct openloop_data_s op;
-  float expected  = 0.0;
-  float angle     = 0.0;
-  float max_speed = 100;
-  float speed     = 10;
-  float per       = 50e-6;
-  int   iter      = 10;
-  int   i         = 0;
-
-  /* Initialize openlooop controller */
-
-  motor_openloop_init(&op, max_speed, per);
-
-  /* Do some iterations in CW direction */
-
-  for (i = 0; i < iter; i += 1)
-    {
-      motor_openloop(&op, speed, DIR_CW);
-    }
-
-  /* Get openloop angle */
-
-  angle = motor_openloop_angle_get(&op);
-
-  /* Get expected value */
-
-  expected = speed * per * iter;
-
-  /* Test */
-
-  TEST_ASSERT_EQUAL_FLOAT(expected, angle);
-
-  /* Do some iterations in CCW direction */
-
-  for (i = 0; i < iter; i += 1)
-    {
-      motor_openloop(&op, speed, DIR_CCW);
-    }
-
-  /* Get openloop angle */
-
-  angle = motor_openloop_angle_get(&op);
-
-  /* We should return to 0 */
-
-  expected = 0.0;
-
-  /* Test */
-
-  TEST_ASSERT_EQUAL_FLOAT(expected, angle);
-}
-
-/* Test maximum openloop speed */
-
-static void test_openloop_max_speed(void)
-{
-  TEST_IGNORE_MESSAGE("not implemented");
-}
-
-/* Normalize angle in openloop */
-
-static void test_openloop_normalize_angle(void)
-{
-  struct openloop_data_s op;
-  float expected  = 0.0;
-  float angle     = 0.0;
-  float max_speed = 100;
-  float speed     = 10;
-  float per       = 10e-6;
-  int   iter      = 1000;
-  int   i         = 0;
-
-  /* Initialize openlooop controller */
-
-  motor_openloop_init(&op, max_speed, per);
-
-  /* Do many iterations to exceed 2PI range */
-
-  for (i = 0; i < iter; i += 1)
-    {
-      motor_openloop(&op, speed, DIR_CW);
-    }
-
-  /* Get openloop angle */
-
-  angle = motor_openloop_angle_get(&op);
-
-  /* Get expected value */
-
-  expected = speed * per * iter;
-
-  /* And normalize to <0.0, 2*PI> */
-
-  while (expected > 2 * M_PI_F)
-    {
-      expected -= 2 * M_PI_F;
-    }
-
-  /* Test angle */
-
-  TEST_ASSERT_EQUAL_FLOAT(expected, angle);
-}
-
-/* Initialize otor angle */
-
-static void test_angle_init(void)
-{
-  struct motor_angle_s angle;
-  float angle_m = 0.0;
-  float angle_e = 0.0;
-  uint8_t p     = 0;
-
-  /* Initialize motor angle */
-
-  p = 32;
-  motor_angle_init(&angle, p);
-
-  angle_m = motor_angle_m_get(&angle);
-  angle_e = motor_angle_e_get(&angle);
-
-  /* Test initial values */
-
-  TEST_ASSERT_EQUAL_FLOAT(0.0, angle_e);
-  TEST_ASSERT_EQUAL_FLOAT(0.0, angle_m);
-  TEST_ASSERT_EQUAL_UINT8(p, angle.p);
-  TEST_ASSERT_EQUAL_FLOAT((float)1.0 / p, angle.one_by_p);
-  TEST_ASSERT_EQUAL_INT8(0, angle.i);
-}
-
-/* Update electrical angle in CW direction */
-
-static void test_angle_el_update_cw(void)
-{
-  struct motor_angle_s angle;
-  uint8_t p          = 0;
-  float   angle_step = 0.0;
-  float   angle_m    = 0.0;
-  float   angle_e    = 0.0;
-  float   expected_e = 0.0;
-  float   expected_m = 0.0;
-  float   s          = 0.0;
-  float   c          = 0.0;
-
-  /* Initialize motor angle */
-
-  p = 8;
-  motor_angle_init(&angle, p);
-
-  /* Update electrical angle with 0.0 */
-
-  angle_step = 0.0;
-  expected_e = 0.0;
-  expected_m = 0.0;
-  s = sin(expected_e);
-  c = cos(expected_e);
-
-  motor_angle_e_update(&angle, angle_step, DIR_CW);
-
-  angle_m = motor_angle_m_get(&angle);
-  angle_e = motor_angle_e_get(&angle);
-
-  /* Test */
-
-  TEST_ASSERT_EQUAL_FLOAT(expected_e, angle_e);
-  TEST_ASSERT_FLOAT_WITHIN(TEST_SINCOS_DELTA, s, angle.angle_el.sin);
-  TEST_ASSERT_FLOAT_WITHIN(TEST_SINCOS_DELTA, c, angle.angle_el.cos);
-  TEST_ASSERT_EQUAL_INT8(0, angle.i);
-  TEST_ASSERT_EQUAL_FLOAT(expected_m, angle_m);
-
-  /* Update electrical angle with 0.1 */
-
-  angle_step = 0.1;
-  expected_e = 0.1;
-  expected_m = 0.1 / p;
-  s = sin(expected_e);
-  c = cos(expected_e);
-
-  motor_angle_e_update(&angle, angle_step, DIR_CW);
-
-  angle_m = motor_angle_m_get(&angle);
-  angle_e = motor_angle_e_get(&angle);
-
-  /* Test */
-
-  TEST_ASSERT_EQUAL_FLOAT(expected_e, angle_e);
-  TEST_ASSERT_FLOAT_WITHIN(TEST_SINCOS_DELTA, s, angle.angle_el.sin);
-  TEST_ASSERT_FLOAT_WITHIN(TEST_SINCOS_DELTA, c, angle.angle_el.cos);
-  TEST_ASSERT_EQUAL_INT8(0, angle.i);
-  TEST_ASSERT_EQUAL_FLOAT(expected_m, angle_m);
-
-  /* Update electrical angle with 2*PI + 0.2 in three steps.
-   * This should increase pole counter in angle structure by 1.
-   */
-
-  angle_step = 2 * M_PI_F + 0.2;
-  expected_e = 0.2;
-  expected_m = angle_step / p;
-  s = sin(expected_e);
-  c = cos(expected_e);
-
-  /* Move in a few steps */
-
-  motor_angle_e_update(&angle, M_PI_F, DIR_CW);
-  motor_angle_e_update(&angle, 2 * M_PI_F, DIR_CW);
-  motor_angle_e_update(&angle, 0.2, DIR_CW);
-
-  angle_m = motor_angle_m_get(&angle);
-  angle_e = motor_angle_e_get(&angle);
-
-  /* Test */
-
-  TEST_ASSERT_EQUAL_FLOAT(expected_e, angle_e);
-  TEST_ASSERT_FLOAT_WITHIN(TEST_SINCOS_DELTA, s, angle.angle_el.sin);
-  TEST_ASSERT_FLOAT_WITHIN(TEST_SINCOS_DELTA, c, angle.angle_el.cos);
-  TEST_ASSERT_EQUAL_INT8(1, angle.i);
-  TEST_ASSERT_EQUAL_FLOAT(expected_m, angle_m);
-}
-
-/* Update electrical angle in CCW direction */
-
-static void test_angle_el_update_ccw(void)
-{
-  struct motor_angle_s angle;
-  uint8_t p          = 0;
-  float   angle_step = 0.0;
-  float   angle_m    = 0.0;
-  float   angle_e    = 0.0;
-  float   expected_e = 0.0;
-  float   expected_m = 0.0;
-  float   s          = 0.0;
-  float   c          = 0.0;
-
-  /* Initialize motor angle */
-
-  p = 8;
-  motor_angle_init(&angle, p);
-
-  /* Move angle 0.1 in CCW direction from 0.0.
-   * We start from 0.0 and move angle CCW by 0.1.
-   */
-
-  angle_step = MOTOR_ANGLE_E_MAX - 0.1;
-  expected_e = angle_step;
-  expected_m = (p - 1) * MOTOR_ANGLE_M_MAX / p + expected_e / p;
-  s = sin(expected_e);
-  c = cos(expected_e);
-
-  motor_angle_e_update(&angle, angle_step, DIR_CCW);
-
-  angle_m = motor_angle_m_get(&angle);
-  angle_e = motor_angle_e_get(&angle);
-
-  /* Test */
-
-  TEST_ASSERT_EQUAL_FLOAT(expected_e, angle_e);
-  TEST_ASSERT_FLOAT_WITHIN(TEST_SINCOS_DELTA, s, angle.angle_el.sin);
-  TEST_ASSERT_FLOAT_WITHIN(TEST_SINCOS_DELTA, c, angle.angle_el.cos);
-  TEST_ASSERT_EQUAL_INT8(p - 1, angle.i);
-  TEST_ASSERT_EQUAL_FLOAT(expected_m, angle_m);
-
-  /* Update electrical angle with 2PI+0.1 in CCW direction in three steps */
-
-  angle_step = (MOTOR_ANGLE_E_MAX + 0.1);
-  expected_e = MOTOR_ANGLE_E_MAX - 0.1;
-  expected_m = (p - 2) * MOTOR_ANGLE_M_MAX / p + expected_e / p;
-  s = sin(expected_e);
-  c = cos(expected_e);
-
-  /* Move in a few steps */
-
-  motor_angle_e_update(&angle, MOTOR_ANGLE_E_MAX - M_PI_F, DIR_CCW);
-  motor_angle_e_update(&angle, MOTOR_ANGLE_E_MAX - 2 * M_PI_F, DIR_CCW);
-  motor_angle_e_update(&angle, MOTOR_ANGLE_E_MAX - 0.1, DIR_CCW);
-
-  angle_m = motor_angle_m_get(&angle);
-  angle_e = motor_angle_e_get(&angle);
-
-  /* Test */
-
-  TEST_ASSERT_EQUAL_FLOAT(expected_e, angle_e);
-  TEST_ASSERT_FLOAT_WITHIN(TEST_SINCOS_DELTA, s, angle.angle_el.sin);
-  TEST_ASSERT_FLOAT_WITHIN(TEST_SINCOS_DELTA, c, angle.angle_el.cos);
-  TEST_ASSERT_EQUAL_INT8(p - 2, angle.i);
-  TEST_ASSERT_EQUAL_FLOAT(expected_m, angle_m);
-}
-
-/* Update electrical angle and overflow electrical angle in CW direction */
-
-static void test_angle_el_update_cw_overflow(void)
-{
-  struct motor_angle_s angle;
-  uint8_t p          = 0;
-  float   angle_step = 0.0;
-  float   angle_m    = 0.0;
-  float   angle_e    = 0.0;
-  float   expected_e = 0.0;
-  float   expected_m = 0.0;
-  float   s          = 0.0;
-  float   c          = 0.0;
-  float   a          = 0.0;
-  int     i          = 0;
-
-  /* Initialize motor angle */
-
-  p = 8;
-  motor_angle_init(&angle, p);
-
-  /* Update electrical angle to achieve full mechanical rotation */
-
-  angle_step = 0.1;
-  expected_e = angle_step;
-  expected_m = angle_step / p;
-  s = sin(expected_e);
-  c = cos(expected_e);
-
-  /* Move angle in loop */
-
-  for (i = 0; i < p; i += 1)
-    {
-      for (a = 0.0; a <= MOTOR_ANGLE_E_MAX; a += angle_step)
-        {
-          motor_angle_e_update(&angle, a, DIR_CW);
-        }
-    }
-
-  /* Test poles counter before final step */
-
-  TEST_ASSERT_EQUAL_INT8(p - 1, angle.i);
-
-  /* One more step after overflow mechanical angle */
-
-  a = angle_step;
-  motor_angle_e_update(&angle, a, DIR_CW);
-
-  angle_m = motor_angle_m_get(&angle);
-  angle_e = motor_angle_e_get(&angle);
-
-  /* Test */
-
-  TEST_ASSERT_EQUAL_FLOAT(expected_e, angle_e);
-  TEST_ASSERT_FLOAT_WITHIN(TEST_SINCOS_DELTA, s, angle.angle_el.sin);
-  TEST_ASSERT_FLOAT_WITHIN(TEST_SINCOS_DELTA, c, angle.angle_el.cos);
-  TEST_ASSERT_EQUAL_INT8(0, angle.i);
-  TEST_ASSERT_EQUAL_FLOAT(expected_m, angle_m);
-}
-
-/* Update electrical angle and overflow electrical angle in CCW direction */
-
-static void test_angle_el_update_ccw_overflow(void)
-{
-  struct motor_angle_s angle;
-  uint8_t p          = 0;
-  float   angle_step = 0.0;
-  float   angle_m    = 0.0;
-  float   angle_e    = 0.0;
-  float   expected_e = 0.0;
-  float   expected_m = 0.0;
-  float   s          = 0.0;
-  float   c          = 0.0;
-  float   a          = 0.0;
-  int     i          = 0;
-
-  /* Initialize motor angle */
-
-  p = 8;
-  motor_angle_init(&angle, p);
-
-  /* Update electrical angle to achieve full mechanical rotation */
-
-  angle_step = 0.1;
-  expected_e = MOTOR_ANGLE_E_MAX - angle_step;
-  expected_m = MOTOR_ANGLE_M_MAX - angle_step / p;
-  s = sin(expected_e);
-  c = cos(expected_e);
-
-  /* Move angle in loop */
-
-  for (i = 0; i < p; i += 1)
-    {
-      for (a = MOTOR_ANGLE_E_MAX; a >= 0.0; a -= angle_step)
-        {
-          motor_angle_e_update(&angle, a, DIR_CCW);
-        }
-    }
-
-  /* Test poles counter before final step */
-
-  TEST_ASSERT_EQUAL_INT8(0, angle.i);
-
-  /* One more step after overflow mechanical angle */
-
-  a = MOTOR_ANGLE_E_MAX - 0.1;
-  motor_angle_e_update(&angle, a, DIR_CCW);
-
-  angle_m = motor_angle_m_get(&angle);
-  angle_e = motor_angle_e_get(&angle);
-
-  /* Test */
-
-  TEST_ASSERT_EQUAL_FLOAT(expected_e, angle_e);
-  TEST_ASSERT_FLOAT_WITHIN(TEST_SINCOS_DELTA, s, angle.angle_el.sin);
-  TEST_ASSERT_FLOAT_WITHIN(TEST_SINCOS_DELTA, c, angle.angle_el.cos);
-  TEST_ASSERT_EQUAL_INT8(7, angle.i);
-  TEST_ASSERT_EQUAL_FLOAT(expected_m, angle_m);
-}
-
-/* Update electric angle and change direction */
-
-static void test_angle_el_change_dir(void)
-{
-  struct motor_angle_s angle;
-  uint8_t p          = 0;
-  int     i          = 0;
-  float   angle_step = 0.0;
-  float   angle_m    = 0.0;
-  float   angle_e    = 0.0;
-  float   expected_e = 0.0;
-  float   expected_m = 0.0;
-  float   s          = 0.0;
-  float   c          = 0.0;
-  float   a          = 0.0;
-
-  /* Initialize motor angle */
-
-  p = 7;
-  motor_angle_init(&angle, p);
-
-  /* Move electrical angle with 4*(2PI) + 0.1.
-   * It give us pole counter = 4
-   */
-
-  angle_step = 0.1;
-  expected_m = 4 * MOTOR_ANGLE_M_MAX / p + angle_step / p;
-  expected_e = 0.1;
-  s = sin(expected_e);
-  c = cos(expected_e);
-
-  /* Move angle in loop */
-
-  for (i = 0; i < 4; i += 1)
-    {
-      for (a = 0.0; a <= MOTOR_ANGLE_E_MAX; a += angle_step)
-        {
-          motor_angle_e_update(&angle, a, DIR_CW);
-        }
-    }
-
-  /* Test poles counter before final step */
-
-  TEST_ASSERT_EQUAL_INT8(3, angle.i);
-
-  /* And rest 0.1 */
-
-  motor_angle_e_update(&angle, angle_step, DIR_CW);
-
-  angle_m = motor_angle_m_get(&angle);
-  angle_e = motor_angle_e_get(&angle);
-
-  /* Test */
-
-  TEST_ASSERT_EQUAL_FLOAT(expected_e, angle_e);
-  TEST_ASSERT_FLOAT_WITHIN(TEST_SINCOS_DELTA, s, angle.angle_el.sin);
-  TEST_ASSERT_FLOAT_WITHIN(TEST_SINCOS_DELTA, c, angle.angle_el.cos);
-  TEST_ASSERT_EQUAL_INT8(4, angle.i);
-  TEST_ASSERT_EQUAL_FLOAT(expected_m, angle_m);
-
-  /* Now move angle backward  2*(2PI) + 0.1 */
-
-  angle_step = 0.1;
-  expected_m = 2 * MOTOR_ANGLE_M_MAX / p - angle_step / p;
-  expected_e = MOTOR_ANGLE_E_MAX - angle_step;
-  s = sin(expected_e);
-  c = cos(expected_e);
-
-  /* Move angle in loop */
-
-  for (i = 0; i < 2; i += 1)
-    {
-      for (a = angle_m; a >= 0.0; a -= angle_step)
-        {
-          motor_angle_e_update(&angle, a, DIR_CCW);
-        }
-    }
-
-  /* Test poles counter before final step */
-
-  TEST_ASSERT_EQUAL_INT8(2, angle.i);
-
-  /* And rest 0.1 */
-
-  motor_angle_e_update(&angle, MOTOR_ANGLE_E_MAX - angle_step, DIR_CCW);
-
-  angle_m = motor_angle_m_get(&angle);
-  angle_e = motor_angle_e_get(&angle);
-
-  /* Test */
-
-  TEST_ASSERT_EQUAL_FLOAT(expected_e, angle_e);
-  TEST_ASSERT_FLOAT_WITHIN(TEST_SINCOS_DELTA, s, angle.angle_el.sin);
-  TEST_ASSERT_FLOAT_WITHIN(TEST_SINCOS_DELTA, c, angle.angle_el.cos);
-  TEST_ASSERT_EQUAL_INT8(1, angle.i);
-  TEST_ASSERT_EQUAL_FLOAT(expected_m, angle_m);
-
-  /* and again in forward direction 4*(2PI) + 0.1 */
-
-  angle_step = 0.1;
-  expected_m = 5 * MOTOR_ANGLE_M_MAX / p + angle_step / p;
-  expected_e = 0.1;
-  s = sin(expected_e);
-  c = cos(expected_e);
-
-  /* Move angle in loop */
-
-  for (i = 0; i < 4; i += 1)
-    {
-      for (a = angle_e; a <= MOTOR_ANGLE_E_MAX; a += angle_step)
-        {
-          motor_angle_e_update(&angle, a, DIR_CW);
-        }
-    }
-
-  /* Test poles counter before final step */
-
-  TEST_ASSERT_EQUAL_INT8(4, angle.i);
-
-  /* And rest 0.1 */
-
-  motor_angle_e_update(&angle, angle_step, DIR_CW);
-
-  angle_m = motor_angle_m_get(&angle);
-  angle_e = motor_angle_e_get(&angle);
-
-  /* Test */
-
-  TEST_ASSERT_EQUAL_FLOAT(expected_e, angle_e);
-  TEST_ASSERT_FLOAT_WITHIN(TEST_SINCOS_DELTA, s, angle.angle_el.sin);
-  TEST_ASSERT_FLOAT_WITHIN(TEST_SINCOS_DELTA, c, angle.angle_el.cos);
-  TEST_ASSERT_EQUAL_INT8(5, angle.i);
-  TEST_ASSERT_EQUAL_FLOAT(expected_m, angle_m);
-}
-
-/* Update mechanical angle in CW direction */
-
-static void test_angle_m_update_cw(void)
-{
-  struct motor_angle_s angle;
-  uint8_t p          = 0;
-  float   angle_step = 0.0;
-  float   angle_m    = 0.0;
-  float   angle_e    = 0.0;
-  float   expected_e = 0.0;
-  float   expected_m = 0.0;
-  float   s          = 0.0;
-  float   c          = 0.0;
-
-  /* Initialize motor angle */
-
-  p = 8;
-  motor_angle_init(&angle, p);
-
-  /* Update mechanical angle with 0.0 */
-
-  angle_step = 0.0;
-  expected_m = 0.0;
-  expected_e = 0.0;
-  s = sin(expected_e);
-  c = cos(expected_e);
-
-  motor_angle_m_update(&angle, angle_step, DIR_CW);
-
-  angle_m = motor_angle_m_get(&angle);
-  angle_e = motor_angle_e_get(&angle);
-
-  /* Test */
-
-  TEST_ASSERT_EQUAL_FLOAT(expected_m, angle_m);
-  TEST_ASSERT_EQUAL_FLOAT(expected_e, angle_e);
-  TEST_ASSERT_FLOAT_WITHIN(TEST_SINCOS_DELTA, s, angle.angle_el.sin);
-  TEST_ASSERT_FLOAT_WITHIN(TEST_SINCOS_DELTA, c, angle.angle_el.cos);
-  TEST_ASSERT_EQUAL_INT8(0, angle.i);
-
-  /* Update mechanical angle with 0.1 */
-
-  angle_step = 0.1;
-  expected_m = angle_step;
-  expected_e = angle_step * p - 0*MOTOR_ANGLE_E_MAX / p;
-  s = sin(expected_e);
-  c = cos(expected_e);
-
-  motor_angle_m_update(&angle, angle_step, DIR_CW);
-
-  angle_m = motor_angle_m_get(&angle);
-  angle_e = motor_angle_e_get(&angle);
-
-  /* Test */
-
-  TEST_ASSERT_EQUAL_FLOAT(expected_m, angle_m);
-  TEST_ASSERT_EQUAL_FLOAT(expected_e, angle_e);
-  TEST_ASSERT_FLOAT_WITHIN(TEST_SINCOS_DELTA, s, angle.angle_el.sin);
-  TEST_ASSERT_FLOAT_WITHIN(TEST_SINCOS_DELTA, c, angle.angle_el.cos);
-  TEST_ASSERT_EQUAL_INT8(0, angle.i);
-
-  /* Update mechanical angle to get one electrical angle rotation + 0.1 */
-
-  angle_step = MOTOR_ANGLE_M_MAX / p + 0.1;
-  expected_m = angle_step;
-  expected_e = angle_step * p - 1 * MOTOR_ANGLE_E_MAX;
-
-  s = sin(expected_e);
-  c = cos(expected_e);
-
-  /* Move in a few steps */
-
-  motor_angle_m_update(&angle, angle_step / 3, DIR_CW);
-  motor_angle_m_update(&angle, 2 * angle_step / 3, DIR_CW);
-  motor_angle_m_update(&angle, 3 * angle_step / 3, DIR_CW);
-
-  angle_m = motor_angle_m_get(&angle);
-  angle_e = motor_angle_e_get(&angle);
-
-  /* Test */
-
-  TEST_ASSERT_EQUAL_FLOAT(expected_m, angle_m);
-  TEST_ASSERT_EQUAL_FLOAT(expected_e, angle_e);
-  TEST_ASSERT_FLOAT_WITHIN(TEST_SINCOS_DELTA, s, angle.angle_el.sin);
-  TEST_ASSERT_FLOAT_WITHIN(TEST_SINCOS_DELTA, c, angle.angle_el.cos);
-  TEST_ASSERT_EQUAL_INT8(1, angle.i);
-}
-
-/* Update mechanical angle in CCW direction */
-
-static void test_angle_m_update_ccw(void)
-{
-  struct motor_angle_s angle;
-  uint8_t p          = 0;
-  float   angle_step = 0.0;
-  float   angle_m    = 0.0;
-  float   angle_e    = 0.0;
-  float   expected_e = 0.0;
-  float   expected_m = 0.0;
-  float   s          = 0.0;
-  float   c          = 0.0;
-
-  /* Initialize motor angle */
-
-  p = 8;
-  motor_angle_init(&angle, p);
-
-  /* Update mechanical angle with 1.0
-   * For 8 poles, one electrical angle rotationa takes ~0.785.
-   * So with angle step = 1.0 we have 1 electical angle rotation plus
-   * some rest.
-   */
-
-  angle_step = 1.0;
-  expected_m = angle_step;
-  expected_e = angle_step * p - 1 * MOTOR_ANGLE_E_MAX;
-  s = sin(expected_e);
-  c = cos(expected_e);
-
-  motor_angle_m_update(&angle, angle_step, DIR_CCW);
-
-  angle_m = motor_angle_m_get(&angle);
-  angle_e = motor_angle_e_get(&angle);
-
-  /* Test */
-
-  TEST_ASSERT_EQUAL_FLOAT(expected_m, angle_m);
-  TEST_ASSERT_EQUAL_FLOAT(expected_e, angle_e);
-  TEST_ASSERT_FLOAT_WITHIN(TEST_SINCOS_DELTA, s, angle.angle_el.sin);
-  TEST_ASSERT_FLOAT_WITHIN(TEST_SINCOS_DELTA, c, angle.angle_el.cos);
-  TEST_ASSERT_EQUAL_INT8(1, angle.i);
-
-  /* Update mechanical angle to get one electrical angle rotation */
-
-  angle_step = angle_step - MOTOR_ANGLE_E_MAX / p;
-  expected_m = angle_step;
-  expected_e = angle_step * p;
-  s = sin(expected_e);
-  c = cos(expected_e);
-
-  /* Move in a few steps */
-
-  motor_angle_m_update(&angle, angle_step / 3, DIR_CCW);
-  motor_angle_m_update(&angle, 2 * angle_step / 3, DIR_CCW);
-  motor_angle_m_update(&angle, 3 * angle_step / 3, DIR_CCW);
-
-  angle_m = motor_angle_m_get(&angle);
-  angle_e = motor_angle_e_get(&angle);
-
-  /* Test */
-
-  TEST_ASSERT_EQUAL_FLOAT(expected_m, angle_m);
-  TEST_ASSERT_EQUAL_FLOAT(expected_e, angle_e);
-  TEST_ASSERT_FLOAT_WITHIN(TEST_SINCOS_DELTA, s, angle.angle_el.sin);
-  TEST_ASSERT_FLOAT_WITHIN(TEST_SINCOS_DELTA, c, angle.angle_el.cos);
-  TEST_ASSERT_EQUAL_INT8(0, angle.i);
-}
-
-/* Update mechanical angle and overflow mechanical angle in CW direction */
-
-static void test_angle_m_update_cw_overflow(void)
-{
-  struct motor_angle_s angle;
-  uint8_t p          = 0;
-  float   angle_step = 0.0;
-  float   angle_m    = 0.0;
-  float   angle_e    = 0.0;
-  float   expected_e = 0.0;
-  float   expected_m = 0.0;
-  float   s          = 0.0;
-  float   c          = 0.0;
-
-  /* Initialize motor angle */
-
-  p = 3;
-  motor_angle_init(&angle, p);
-
-  /* Full mechanical angle rotation (2PI) + 0.1 in CW direction */
-
-  angle_step = 0.1;
-  expected_m = angle_step;
-  expected_e = 0 * MOTOR_ANGLE_E_MAX / p + angle_step * p;
-  s = sin(expected_e);
-  c = cos(expected_e);
-
-  /* Move in a few steps */
-
-  motor_angle_m_update(&angle, 0.0, DIR_CW);
-  motor_angle_m_update(&angle, MOTOR_ANGLE_M_MAX / 4, DIR_CW);
-  motor_angle_m_update(&angle, 1 * MOTOR_ANGLE_M_MAX / 4, DIR_CW);
-  motor_angle_m_update(&angle, 2 * MOTOR_ANGLE_M_MAX / 4, DIR_CW);
-  motor_angle_m_update(&angle, 3 * MOTOR_ANGLE_M_MAX / 4, DIR_CW);
-  motor_angle_m_update(&angle, 4 * MOTOR_ANGLE_M_MAX / 4, DIR_CW);
-  motor_angle_m_update(&angle, angle_step, DIR_CW);
-
-  angle_m = motor_angle_m_get(&angle);
-  angle_e = motor_angle_e_get(&angle);
-
-  /* Test */
-
-  TEST_ASSERT_EQUAL_FLOAT(expected_m, angle_m);
-  TEST_ASSERT_EQUAL_FLOAT(expected_e, angle_e);
-  TEST_ASSERT_FLOAT_WITHIN(TEST_SINCOS_DELTA, s, angle.angle_el.sin);
-  TEST_ASSERT_FLOAT_WITHIN(TEST_SINCOS_DELTA, c, angle.angle_el.cos);
-  TEST_ASSERT_EQUAL_INT8(0, angle.i);
-}
-
-/* Update mechanical angle and overflow mechanical angle in CCW direction */
-
-static void test_angle_m_update_ccw_overflow(void)
-{
-  struct motor_angle_s angle;
-  uint8_t p          = 0;
-  float   angle_step = 0.0;
-  float   angle_m    = 0.0;
-  float   angle_e    = 0.0;
-  float   expected_e = 0.0;
-  float   expected_m = 0.0;
-  float   s          = 0.0;
-  float   c          = 0.0;
-
-  /* Initialize motor angle */
-
-  p = 3;
-  motor_angle_init(&angle, p);
-
-  /* Full mechanical angle rotation (2PI) + 0.1 in CCW direction */
-
-  angle_step = MOTOR_ANGLE_M_MAX - 0.1;
-  expected_m = angle_step;
-  expected_e = MOTOR_ANGLE_E_MAX - 0.1 * p;
-  s = sin(expected_e);
-  c = cos(expected_e);
-
-  /* Move in a few steps */
-
-  motor_angle_m_update(&angle, 0.0, DIR_CCW);
-  motor_angle_m_update(&angle, 4 * MOTOR_ANGLE_M_MAX / 4, DIR_CCW);
-  motor_angle_m_update(&angle, 3 * MOTOR_ANGLE_M_MAX / 4, DIR_CCW);
-  motor_angle_m_update(&angle, 2 * MOTOR_ANGLE_M_MAX / 4, DIR_CCW);
-  motor_angle_m_update(&angle, 1 * MOTOR_ANGLE_M_MAX / 4, DIR_CCW);
-  motor_angle_m_update(&angle, angle_step, DIR_CCW);
-
-  angle_m = motor_angle_m_get(&angle);
-  angle_e = motor_angle_e_get(&angle);
-
-  /* Test */
-
-  TEST_ASSERT_EQUAL_FLOAT(expected_m, angle_m);
-  TEST_ASSERT_EQUAL_FLOAT(expected_e, angle_e);
-  TEST_ASSERT_FLOAT_WITHIN(TEST_SINCOS_DELTA, s, angle.angle_el.sin);
-  TEST_ASSERT_FLOAT_WITHIN(TEST_SINCOS_DELTA, c, angle.angle_el.cos);
-  TEST_ASSERT_EQUAL_INT8(p - 1, angle.i);
-}
-
-/* Update mechanical angle and change direction */
-
-static void test_angle_m_change_dir(void)
-{
-  struct motor_angle_s angle;
-  uint8_t p          = 0;
-  float   angle_step = 0.0;
-  float   angle_m    = 0.0;
-  float   angle_e    = 0.0;
-  float   expected_e = 0.0;
-  float   expected_m = 0.0;
-  float   expected_i = 0.0;
-  float   s          = 0.0;
-  float   c          = 0.0;
-
-  /* Initialize motor angle */
-
-  p = 3;
-  motor_angle_init(&angle, p);
-
-  /* Move mechanical angle by 3*(2PI)/4 in CW direction */
-
-  angle_step = 3 * MOTOR_ANGLE_M_MAX / 4;
-  expected_m = angle_step;
-  expected_i = ((int)(angle_step * p / MOTOR_ANGLE_M_MAX));
-  expected_e = angle_step * p - expected_i * MOTOR_ANGLE_E_MAX;
-  s = sin(expected_e);
-  c = cos(expected_e);
-
-  /* Move in a few steps */
-
-  motor_angle_m_update(&angle, 0.0, DIR_CW);
-  motor_angle_m_update(&angle, 1 * MOTOR_ANGLE_M_MAX / 4, DIR_CW);
-  motor_angle_m_update(&angle, 2 * MOTOR_ANGLE_M_MAX / 4, DIR_CW);
-  motor_angle_m_update(&angle, 3 * MOTOR_ANGLE_M_MAX / 4, DIR_CW);
-
-  angle_m = motor_angle_m_get(&angle);
-  angle_e = motor_angle_e_get(&angle);
-
-  /* Test */
-
-  TEST_ASSERT_EQUAL_FLOAT(expected_m, angle_m);
-  TEST_ASSERT_EQUAL_FLOAT(expected_e, angle_e);
-  TEST_ASSERT_FLOAT_WITHIN(TEST_SINCOS_DELTA, s, angle.angle_el.sin);
-  TEST_ASSERT_FLOAT_WITHIN(TEST_SINCOS_DELTA, c, angle.angle_el.cos);
-  TEST_ASSERT_EQUAL_INT8(expected_i, angle.i);
-
-  /* Move mechanical angle by 1.0 in CCW direction */
-
-  angle_step = 3 * MOTOR_ANGLE_M_MAX / 4 - 2.0;
-  expected_m = angle_step;
-  expected_i = ((int)(angle_step * p / MOTOR_ANGLE_M_MAX));
-  expected_e = angle_step * p - expected_i * MOTOR_ANGLE_E_MAX;
-  s = sin(expected_e);
-  c = cos(expected_e);
-
-  motor_angle_m_update(&angle, 3 * MOTOR_ANGLE_M_MAX / 4 - 1.0, DIR_CCW);
-  motor_angle_m_update(&angle, 3 * MOTOR_ANGLE_M_MAX / 4 - 2.0, DIR_CCW);
-
-  angle_m = motor_angle_m_get(&angle);
-  angle_e = motor_angle_e_get(&angle);
-
-  /* Test */
-
-  TEST_ASSERT_EQUAL_FLOAT(expected_m, angle_m);
-  TEST_ASSERT_EQUAL_FLOAT(expected_e, angle_e);
-  TEST_ASSERT_FLOAT_WITHIN(TEST_SINCOS_DELTA, s, angle.angle_el.sin);
-  TEST_ASSERT_FLOAT_WITHIN(TEST_SINCOS_DELTA, c, angle.angle_el.cos);
-  TEST_ASSERT_EQUAL_INT8(expected_i, angle.i);
-}
-
-/* Mix update mechanical angle and update electrical angle */
-
-static void test_angle_m_el_mixed(void)
-{
-  struct motor_angle_s angle;
-  uint8_t p          = 0;
-  int     i          = 0;
-  float   angle_step = 0.0;
-  float   angle_m    = 0.0;
-  float   angle_e    = 0.0;
-  float   expected_e = 0.0;
-  float   expected_m = 0.0;
-  float   expected_i = 0.0;
-  float   s          = 0.0;
-  float   c          = 0.0;
-  float   a          = 0.0;
-
-  /* Initialize motor angle */
-
-  p = 27;
-  motor_angle_init(&angle, p);
-
-  /* Update mechanical angle to get 4 electrical angle
-   * rotations + 0.1 in CW direction
-   */
-
-  angle_step = 4 * MOTOR_ANGLE_M_MAX / p + 0.1;
-  expected_m = angle_step;
-  expected_i = ((int)(angle_step * p / MOTOR_ANGLE_M_MAX));
-  expected_e = angle_step * p - expected_i * MOTOR_ANGLE_E_MAX;
-  s = sin(expected_e);
-  c = cos(expected_e);
-
-  /* Move in a few steps */
-
-  motor_angle_m_update(&angle, 0.0, DIR_CW);
-  motor_angle_m_update(&angle, MOTOR_ANGLE_M_MAX / p, DIR_CW);
-  motor_angle_m_update(&angle, 4 * MOTOR_ANGLE_M_MAX / p, DIR_CW);
-  motor_angle_m_update(&angle, 4 * MOTOR_ANGLE_M_MAX / p + 0.1, DIR_CW);
-
-  angle_m = motor_angle_m_get(&angle);
-  angle_e = motor_angle_e_get(&angle);
-
-  /* Test */
-
-  TEST_ASSERT_EQUAL_FLOAT(expected_m, angle_m);
-  TEST_ASSERT_EQUAL_FLOAT(expected_e, angle_e);
-  TEST_ASSERT_FLOAT_WITHIN(TEST_SINCOS_DELTA, s, angle.angle_el.sin);
-  TEST_ASSERT_FLOAT_WITHIN(TEST_SINCOS_DELTA, c, angle.angle_el.cos);
-  TEST_ASSERT_EQUAL_INT8(expected_i, angle.i);
-
-  /* Now move electrical angle by 2 full rotation in CCW direction.
-   * This should give us the same electrical angle and mechanical
-   * angle reduced by 2 electrical rotations.
-   */
-
-  angle_step = 2 * MOTOR_ANGLE_E_MAX;
-  expected_i = expected_i - 2;
-  expected_m = expected_m - 2 * MOTOR_ANGLE_M_MAX / p;
-  s = sin(expected_e);
-  c = cos(expected_e);
-
-  /* Move angle in loop */
-
-  for (i = 0; i < 2; i += 1)
-    {
-      for (a = expected_e ; a >= 0.0; a -= 0.1)
-        {
-          motor_angle_e_update(&angle, a, DIR_CCW);
-        }
-    }
-
-  /* Final step */
-
-  motor_angle_e_update(&angle, expected_e, DIR_CCW);
-
-  angle_m = motor_angle_m_get(&angle);
-  angle_e = motor_angle_e_get(&angle);
-
-  /* Test */
-
-  TEST_ASSERT_EQUAL_FLOAT(expected_e, angle_e);
-  TEST_ASSERT_EQUAL_FLOAT(expected_m, angle_m);
-  TEST_ASSERT_FLOAT_WITHIN(TEST_SINCOS_DELTA, s, angle.angle_el.sin);
-  TEST_ASSERT_FLOAT_WITHIN(TEST_SINCOS_DELTA, c, angle.angle_el.cos);
-  TEST_ASSERT_EQUAL_INT8(expected_i, angle.i);
-}
-
-/****************************************************************************
- * Public Functions
- ****************************************************************************/
-
-/****************************************************************************
- * Name: test_motor
- ****************************************************************************/
-
-void test_motor(void)
-{
-  UNITY_BEGIN();
-
-  TEST_SEPARATOR();
-
-  /* Test some definitions */
-
-  TEST_ASSERT_EQUAL_FLOAT(1.0, DIR_CW);
-  TEST_ASSERT_EQUAL_FLOAT(-1.0, DIR_CCW);
-
-  /* Openloop control functions */
-
-  RUN_TEST(test_openloop_init);
-  RUN_TEST(test_openloop_one_step);
-  RUN_TEST(test_openloop_many_steps);
-  RUN_TEST(test_openloop_max_speed);
-  RUN_TEST(test_openloop_normalize_angle);
-
-  /* Motor angle */
-
-  RUN_TEST(test_angle_init);
-  RUN_TEST(test_angle_el_update_cw);
-  RUN_TEST(test_angle_el_update_ccw);
-  RUN_TEST(test_angle_el_update_cw_overflow);
-  RUN_TEST(test_angle_el_update_ccw_overflow);
-  RUN_TEST(test_angle_el_change_dir);
-  RUN_TEST(test_angle_m_update_cw);
-  RUN_TEST(test_angle_m_update_ccw);
-  RUN_TEST(test_angle_m_update_cw_overflow);
-  RUN_TEST(test_angle_m_update_ccw_overflow);
-  RUN_TEST(test_angle_m_change_dir);
-  RUN_TEST(test_angle_m_el_mixed);
-
-  UNITY_END();
-}
diff --git a/examples/dsptest/test_observer.c b/examples/dsptest/test_observer.c
deleted file mode 100644
index fd9f746..0000000
--- a/examples/dsptest/test_observer.c
+++ /dev/null
@@ -1,357 +0,0 @@
-/****************************************************************************
- * examples/dsptest/test_observer.c
- *
- *   Copyright (C) 2018 Gregory Nutt. All rights reserved.
- *   Author: Mateusz Szafoni <[email protected]>
- *
- * 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 "dsptest.h"
-
-/****************************************************************************
- * Pre-processor Definitions
- ****************************************************************************/
-
-/****************************************************************************
- * Private Types
- ****************************************************************************/
-
-/* Dummy angle observer */
-
-struct motor_observer_dummy_s
-{
-  float x;
-};
-
-/* Dummy speed observer */
-
-struct motor_sobserver_dummy_s
-{
-  float x;
-};
-
-/****************************************************************************
- * Private Function Protototypes
- ****************************************************************************/
-
-/****************************************************************************
- * Private Data
- ****************************************************************************/
-
-/****************************************************************************
- * Private Functions
- ****************************************************************************/
-
-/* Initialize observer data */
-
-static void test_observer_init(void)
-{
-  struct motor_observer_dummy_s  ao;
-  struct motor_sobserver_dummy_s so;
-  struct motor_observer_s        o;
-  float per = 1e-11;
-
-  motor_observer_init(&o, (void *)&ao, (void *)&so, per);
-
-  TEST_ASSERT_EQUAL_FLOAT(0.0, o.angle);
-  TEST_ASSERT_EQUAL_FLOAT(0.0, o.speed);
-  TEST_ASSERT_EQUAL_FLOAT(per, o.per);
-  TEST_ASSERT_NOT_NULL(o.ao);
-  TEST_ASSERT_NOT_NULL(o.so);
-}
-
-/* Initialize SMO observer data */
-
-static void test_observer_smo_init(void)
-{
-  struct motor_observer_smo_s ao;
-  float kslide  = 0.99;
-  float err_max = 0.99;
-
-  /* Initialize SMO observer */
-
-  motor_observer_smo_init(&ao, kslide, err_max);
-
-  /* Test */
-
-  TEST_ASSERT_EQUAL_FLOAT(kslide, ao.k_slide);
-  TEST_ASSERT_EQUAL_FLOAT(err_max, ao.err_max);
-  TEST_ASSERT_EQUAL_FLOAT(0.0, ao.F);
-  TEST_ASSERT_EQUAL_FLOAT(0.0, ao.G);
-  TEST_ASSERT_EQUAL_FLOAT(0.0, ao.emf_lp_filter1);
-  TEST_ASSERT_EQUAL_FLOAT(0.0, ao.emf_lp_filter2);
-  TEST_ASSERT_EQUAL_FLOAT(0.0, ao.emf.a);
-  TEST_ASSERT_EQUAL_FLOAT(0.0, ao.emf.b);
-  TEST_ASSERT_EQUAL_FLOAT(0.0, ao.z.a);
-  TEST_ASSERT_EQUAL_FLOAT(0.0, ao.z.b);
-  TEST_ASSERT_EQUAL_FLOAT(0.0, ao.i_est.a);
-  TEST_ASSERT_EQUAL_FLOAT(0.0, ao.i_est.b);
-  TEST_ASSERT_EQUAL_FLOAT(0.0, ao.v_err.a);
-  TEST_ASSERT_EQUAL_FLOAT(0.0, ao.v_err.b);
-  TEST_ASSERT_EQUAL_FLOAT(0.0, ao.i_err.a);
-  TEST_ASSERT_EQUAL_FLOAT(0.0, ao.i_err.b);
-  TEST_ASSERT_EQUAL_FLOAT(0.0, ao.sign.a);
-  TEST_ASSERT_EQUAL_FLOAT(0.0, ao.sign.b);
-}
-
-/* Feed SMO observer with zeros */
-
-static void test_observer_smo_zeros(void)
-{
-  struct motor_sobserver_dummy_s so;
-  struct motor_observer_smo_s    ao;
-  struct motor_observer_s        o;
-  struct motor_phy_params_s      phy;
-  ab_frame_t i_ab;
-  ab_frame_t v_ab;
-  float      k_slide = 1.0;
-  float      err_max = 1.0;
-  float      per     = 1e-6;
-  float      angle   = 0.0;
-  int        i       = 0;
-
-  /* Initialize ab frames */
-
-  i_ab.a = 0.0f;
-  i_ab.b = 0.0f;
-  v_ab.a = 0.0f;
-  v_ab.b = 0.0f;
-
-  /* Initialize motor physical parameters */
-
-  phy.p   = 8;
-  phy.res = 0.001;
-  phy.ind = 10e-6;
-
-  /* Initialize SMO angle observer */
-
-  motor_observer_smo_init(&ao, k_slide, err_max);
-
-  /* Initialize observer */
-
-  motor_observer_init(&o, &ao, &so, per);
-
-  /* Feed SMO observer with zeros. This should return
-   * angle equal to observer phase shift (direction * PI)
-   */
-
-  i_ab.a = 0.0;
-  i_ab.b = 0.0;
-  v_ab.a = 0.0;
-  v_ab.b = 0.0;
-
-  for (i = 0; i < 1000000; i += 1)
-    {
-      motor_observer_smo(&o, &i_ab, &v_ab, &phy, DIR_CW);
-    }
-
-  angle = motor_observer_angle_get(&o);
-
-  /* Test */
-
-  TEST_ASSERT_EQUAL_FLOAT(M_PI_F, angle);
-
-  for (i = 0; i < 1000000; i += 1)
-    {
-      motor_observer_smo(&o, &i_ab, &v_ab, &phy, DIR_CCW);
-    }
-
-  angle = motor_observer_angle_get(&o);
-
-  /* Test. NOTE: -M_PI_F normalised = 0.0 */
-
-  TEST_ASSERT_FLOAT_WITHIN(5e-6, 0.0, angle);
-}
-
-/* Feed SMO in CW direction */
-
-static void test_observer_smo_cw(void)
-{
-  /* TODO */
-
-  TEST_FAIL_MESSAGE("not implemented");
-}
-
-/* Feed SMO in CCW direction */
-
-static void test_observer_smo_ccw(void)
-{
-  /* TODO */
-
-  TEST_FAIL_MESSAGE("not implemented");
-}
-
-/* SMO observer in linear region */
-
-static void test_observer_smo_linear(void)
-{
-  /* TODO */
-
-  TEST_FAIL_MESSAGE("not implemented");
-}
-
-/* SMO observer gain saturation */
-
-static void test_observer_smo_gain_saturate(void)
-{
-  /* TODO */
-
-  TEST_FAIL_MESSAGE("not implemented");
-}
-
-/* DIV speed observer initialization */
-
-static void test_sobserver_div_init(void)
-{
-  struct motor_sobserver_div_s so;
-  uint8_t samples = 10;
-  float filter    = 0.1;
-  float per       = 10e-6;
-
-  /* Initialize DIV speed observer */
-
-  motor_sobserver_div_init(&so, samples, filter, per);
-
-  TEST_ASSERT_EQUAL_FLOAT(filter, so.filter);
-  TEST_ASSERT_EQUAL_FLOAT(1.0 / (samples * per), so.one_by_dt);
-  TEST_ASSERT_EQUAL_UINT8(samples, so.samples);
-}
-
-/* Feed DIV speed observer with zeros */
-
-static void test_sobserver_div_zeros(void)
-{
-  struct motor_sobserver_div_s  so;
-  struct motor_observer_s       o;
-  struct motor_observer_dummy_s ao;
-  uint8_t samples    = 10;
-  float   filter     = 0.1;
-  int     i          = 0;
-  float   expected_s = 0.0;
-  float   speed      = 0.0;
-  float   per        = 1e-6;
-
-  /* Initialize DIV speed observer */
-
-  motor_sobserver_div_init(&so, samples, filter, per);
-
-  /* Initialize observer */
-
-  motor_observer_init(&o, &ao, &so, per);
-
-  /* Feed observer with zeros in CW direction */
-
-  expected_s = 0.0;
-
-  for (i = 0; i < 1000; i += 1)
-    {
-      motor_sobserver_div(&o, 0.0, DIR_CW);
-    }
-
-  speed = motor_observer_speed_get(&o);
-
-  /* Test */
-
-  TEST_ASSERT_EQUAL_FLOAT(expected_s, speed);
-
-  /* Feed observer with zeros in CCW direction */
-
-  expected_s = 0.0;
-
-  for (i = 0; i < 1000; i += 1)
-    {
-      motor_sobserver_div(&o, 0.0, DIR_CCW);
-    }
-
-  speed = motor_observer_speed_get(&o);
-
-  /* Test */
-
-  TEST_ASSERT_EQUAL_FLOAT(expected_s, speed);
-}
-
-/* Feed DIV speed observer in CW direction */
-
-static void test_sobserver_div_cw(void)
-{
-  /* TODO */
-
-  TEST_FAIL_MESSAGE("not implemented");
-}
-
-/* Feed DIV speed observer in CCW direction */
-
-static void test_sobserver_div_ccw(void)
-{
-  /* TODO */
-
-  TEST_FAIL_MESSAGE("not implemented");
-}
-
-/****************************************************************************
- * Public Functions
- ****************************************************************************/
-
-/****************************************************************************
- * Name: test_observer
- ****************************************************************************/
-
-void test_observer(void)
-{
-  UNITY_BEGIN();
-
-  TEST_SEPARATOR();
-
-  /* Test observer functions */
-
-  RUN_TEST(test_observer_init);
-
-  /* SMO observer */
-
-  RUN_TEST(test_observer_smo_init);
-  RUN_TEST(test_observer_smo_zeros);
-  RUN_TEST(test_observer_smo_linear);
-  RUN_TEST(test_observer_smo_gain_saturate);
-  RUN_TEST(test_observer_smo_cw);
-  RUN_TEST(test_observer_smo_ccw);
-
-  /* DIV observer */
-
-  RUN_TEST(test_sobserver_div_init);
-  RUN_TEST(test_sobserver_div_zeros);
-  RUN_TEST(test_sobserver_div_cw);
-  RUN_TEST(test_sobserver_div_ccw);
-
-  UNITY_END();
-}
diff --git a/examples/dsptest/test_pid.c b/examples/dsptest/test_pid.c
deleted file mode 100644
index d40fb20..0000000
--- a/examples/dsptest/test_pid.c
+++ /dev/null
@@ -1,516 +0,0 @@
-/****************************************************************************
- * examples/dsptest/test_pid.c
- *
- *   Copyright (C) 2018 Gregory Nutt. All rights reserved.
- *   Author: Mateusz Szafoni <[email protected]>
- *
- * 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 "dsptest.h"
-
-/****************************************************************************
- * Pre-processor Definitions
- ****************************************************************************/
-
-#define TEST_NAME "PID"
-
-/****************************************************************************
- * Private Types
- ****************************************************************************/
-
-/****************************************************************************
- * Private Function Protototypes
- ****************************************************************************/
-
-/****************************************************************************
- * Private Data
- ****************************************************************************/
-
-/****************************************************************************
- * Private Functions
- ****************************************************************************/
-
-/* Initialize PI controller */
-
-static void test_pi_controller_init(void)
-{
-  pid_controller_t pi;
-  float max = 0.990;
-  float min = 0.001;
-  float kp  = 2.0;
-  float ki  = 0.001;
-
-  /* Initialize PI controller */
-
-  pi_controller_init(&pi, kp, ki);
-
-  /* Test */
-
-  TEST_ASSERT_EQUAL_FLOAT(kp, pi.KP);
-  TEST_ASSERT_EQUAL_FLOAT(ki, pi.KI);
-  TEST_ASSERT_EQUAL_FLOAT(0.0, pi.KD);
-  TEST_ASSERT_EQUAL_FLOAT(0.0, pi.out);
-  TEST_ASSERT_EQUAL_FLOAT(0.0, pi.err);
-  TEST_ASSERT_EQUAL_FLOAT(0.0, pi.err_prev);
-  TEST_ASSERT_EQUAL_FLOAT(0.0, pi.part[0]);
-  TEST_ASSERT_EQUAL_FLOAT(0.0, pi.part[1]);
-  TEST_ASSERT_EQUAL_FLOAT(0.0, pi.part[2]);
-
-  /* Initialize saturation */
-
-  pi_saturation_set(&pi, min, max);
-
-  /* Test */
-
-  TEST_ASSERT_EQUAL_FLOAT(max, pi.sat.max);
-  TEST_ASSERT_EQUAL_FLOAT(min, pi.sat.min);
-}
-
-/* Feed PI controller with zeros */
-
-static void test_pi_controller_zeros(void)
-{
-  pid_controller_t pi;
-  float max = 0.990;
-  float min = 0.000;
-  float kp  = 2.0;
-  float ki  = 0.001;
-  int   i   = 0;
-
-  /* Initialize PI controller */
-
-  pi_controller_init(&pi, kp, ki);
-
-  /* Initialize saturation */
-
-  pid_saturation_set(&pi, min, max);
-
-  for (i = 0; i < 10000; i += 1)
-    {
-      pi_controller(&pi, 0.0);
-    }
-
-  /* Test */
-
-  TEST_ASSERT_EQUAL_FLOAT(0.0, pi.out);
-}
-
-/* Feed PI controller with some data */
-
-static void test_pi_controller(void)
-{
-  pid_controller_t pi;
-  float kp  = 0.0;
-  float ki  = 0.0;
-  float max = 0.0;
-  float min = 0.0;
-  float p1  = 0.0;
-  float p2  = 0.0;
-  float p3  = 0.0;
-  float out = 0.0;
-  float err = 0.0;
-  int   i   = 0;
-
-  kp = 1.0;
-  ki = 0.1;
-  pi_controller_init(&pi, kp, ki);
-
-  /* Step 1 */
-
-  err = 0.1;
-
-  pi_controller(&pi, err);
-
-  p1  = err * kp;
-  p2  += err * ki;
-  p3  = err * 0;
-  out = p1 + p2 + p3;
-
-  TEST_ASSERT_EQUAL_FLOAT(out, pi.out);
-
-  /* Step 2 */
-
-  err = 0.2;
-
-  pi_controller(&pi, err);
-  p1 = err * kp;
-  p2 += err * ki;
-  p3 = err * 0;
-  out = p1 + p2 + p3;
-
-  TEST_ASSERT_EQUAL_FLOAT(out, pi.out);
-
-  /* Step 3 */
-
-  err = -0.3;
-
-  pi_controller(&pi, err);
-  p1 = err * kp;
-  p2 += err * ki;
-  p3 = err * 0;
-  out = p1 + p2 + p3;
-
-  TEST_ASSERT_EQUAL_FLOAT(out, pi.out);
-
-  /* Now set saturation */
-
-  max = 0.3;
-  min = 0.0;
-  pi_saturation_set(&pi, min, max);
-
-  /* Test saturation max */
-
-  err = 0.4;
-  for (i = 0; i < 20; i += 1)
-    {
-      pi_controller(&pi, err);
-    }
-
-  out = max;
-  TEST_ASSERT_EQUAL_FLOAT(out, pi.out);
-
-  err = -0.8;
-  for (i = 0; i < 20; i += 1)
-    {
-      pi_controller(&pi, err);
-    }
-
-  /* Test saturation min */
-
-  out = min;
-  TEST_ASSERT_EQUAL_FLOAT(out, pi.out);
-}
-
-/* Saturate PI controller */
-
-static void test_pi_controller_saturation(void)
-{
-  pid_controller_t pi;
-  float max = 0.990;
-  float min = 0.000;
-  float kp  = 2.0;
-  float ki  = 0.001;
-  int   i   = 0;
-
-  /* Initialize PI controller */
-
-  pi_controller_init(&pi, kp, ki);
-
-  /* Initialize saturation */
-
-  pi_saturation_set(&pi, min, max);
-
-  /* Feed controller */
-
-  for (i = 0; i < 1000; i += 1)
-    {
-      pi_controller(&pi, 0.01);
-      TEST_ASSERT_LESS_OR_EQUAL(max, pi.out);
-      TEST_ASSERT_LESS_OR_EQUAL(max, pi.part[1]);
-    }
-
-  /* Feed controller */
-
-  for (i = 0; i < 1000; i += 1)
-    {
-      pi_controller(&pi, -0.01);
-      TEST_ASSERT_GREATER_OR_EQUAL(min, pi.out);
-      TEST_ASSERT_GREATER_OR_EQUAL(min, pi.part[1]);
-    }
-}
-
-/* PI windup protection */
-
-static void test_pi_windup_protection(void)
-{
-  pid_controller_t pi;
-  float max = 0.990;
-  float min = 0.000;
-  float kp  = 2.0;
-  float ki  = 0.1;
-  int   i   = 0;
-
-  /* Initialize PI controller */
-
-  pi_controller_init(&pi, kp, ki);
-
-  /* Initialize saturation */
-
-  pi_saturation_set(&pi, min, max);
-
-  /* Feed controller */
-
-  for (i = 0; i < 1000; i += 1)
-    {
-      pi_controller(&pi, 0.01);
-      TEST_ASSERT_LESS_OR_EQUAL(max, pi.part[1]);
-    }
-
-  /* Feed controller */
-
-  for (i = 0; i < 1000; i += 1)
-    {
-      pi_controller(&pi, -0.01);
-      TEST_ASSERT_GREATER_OR_EQUAL(min, pi.part[1]);
-    }
-}
-
-/* Initialize PID controller */
-
-static void test_pid_controller_init(void)
-{
-  pid_controller_t pid;
-  float max = 0.990;
-  float min = 0.001;
-  float kp  = 2.0;
-  float ki  = 0.001;
-  float kd  = 0.001;
-
-  /* Initialize PID controller */
-
-  pid_controller_init(&pid, kp, ki, kd);
-
-  /* Test */
-
-  TEST_ASSERT_EQUAL_FLOAT(kp, pid.KP);
-  TEST_ASSERT_EQUAL_FLOAT(ki, pid.KI);
-  TEST_ASSERT_EQUAL_FLOAT(kd, pid.KD);
-  TEST_ASSERT_EQUAL_FLOAT(0.0, pid.out);
-  TEST_ASSERT_EQUAL_FLOAT(0.0, pid.err);
-  TEST_ASSERT_EQUAL_FLOAT(0.0, pid.err_prev);
-  TEST_ASSERT_EQUAL_FLOAT(0.0, pid.part[0]);
-  TEST_ASSERT_EQUAL_FLOAT(0.0, pid.part[1]);
-  TEST_ASSERT_EQUAL_FLOAT(0.0, pid.part[2]);
-
-  /* Initialize saturation */
-
-  pid_saturation_set(&pid, min, max);
-
-  /* Test */
-
-  TEST_ASSERT_EQUAL_FLOAT(max, pid.sat.max);
-  TEST_ASSERT_EQUAL_FLOAT(min, pid.sat.min);
-}
-
-/* Feed PID controller with zeros */
-
-static void test_pid_controller_zeros(void)
-{
-  pid_controller_t pid;
-  float max = 0.990;
-  float min = 0.000;
-  float kp  = 2.0;
-  float ki  = 0.001;
-  float kd  = 0.001;
-  int   i   = 0;
-
-  /* Initialize PI controller */
-
-  pid_controller_init(&pid, kp, ki, kd);
-
-  /* Initialize saturation */
-
-  pid_saturation_set(&pid, min, max);
-
-  for (i = 0; i < 10000; i += 1)
-    {
-      pid_controller(&pid, 0.0);
-    }
-
-  /* Test */
-
-  TEST_ASSERT_EQUAL_FLOAT(0.0, pid.out);
-}
-
-/* Feed PID controller with some data */
-
-static void test_pid_controller(void)
-{
-  pid_controller_t pid;
-  float kp   = 0.0;
-  float ki   = 0.0;
-  float kd   = 0.0;
-  float max  = 0.0;
-  float min  = 0.0;
-  float p1   = 0.0;
-  float p2   = 0.0;
-  float p3   = 0.0;
-  float out  = 0.0;
-  float err  = 0.0;
-  float prev = 0.0;
-  int   i    = 0;
-
-  kp = 1.0;
-  ki = 0.1;
-  kd = 0.01;
-  pid_controller_init(&pid, kp, ki, kd);
-
-  /* Step 1 */
-
-  prev = 0.0;
-  err  = 0.1;
-
-  pid_controller(&pid, err);
-
-  p1  = err * kp;
-  p2  += err * ki;
-  p3  = (err - prev) * kd;
-  out = p1 + p2 + p3;
-
-  TEST_ASSERT_EQUAL_FLOAT(out, pid.out);
-
-  /* Step 2 */
-
-  prev = err;
-  err  = 0.2;
-
-  pid_controller(&pid, err);
-  p1  = err * kp;
-  p2  += err * ki;
-  p3  = (err - prev) * kd;
-  out = p1 + p2 + p3;
-
-  TEST_ASSERT_EQUAL_FLOAT(out, pid.out);
-
-  /* Step 3 */
-
-  prev = err;
-  err = -0.3;
-
-  pid_controller(&pid, err);
-  p1  = err * kp;
-  p2  += err * ki;
-  p3  = (err - prev) * kd;
-  out = p1 + p2 +p3;
-
-  TEST_ASSERT_EQUAL_FLOAT(out, pid.out);
-
-  /* Now set saturation */
-
-  max = 0.3;
-  min = 0.0;
-  pid_saturation_set(&pid, min, max);
-
-  /* Test saturation max */
-
-  prev = err;
-  err  = 0.4;
-  for (i = 0; i < 20; i += 1)
-    {
-      pid_controller(&pid, err);
-    }
-
-  out = max;
-  TEST_ASSERT_EQUAL_FLOAT(out, pid.out);
-
-  prev = err;
-  err = -0.8;
-  for (i = 0; i < 20; i += 1)
-    {
-      pid_controller(&pid, err);
-    }
-
-  /* Test saturation min */
-
-  out = min;
-  TEST_ASSERT_EQUAL_FLOAT(out, pid.out);
-}
-
-/* Saturate PID controller */
-
-static void test_pid_controller_saturation(void)
-{
-  pid_controller_t pid;
-  float max = 0.990;
-  float min = 0.000;
-  float kp  = 2.0;
-  float ki  = 0.001;
-  float kd  = 0.001;
-  int   i   = 0;
-
-  /* Initialize PID controller */
-
-  pid_controller_init(&pid, kp, ki, kd);
-
-  /* Initialize saturation */
-
-  pid_saturation_set(&pid, min, max);
-
-  /* Feed controller */
-
-  for (i = 0; i < 1000; i += 1)
-    {
-      pid_controller(&pid, 0.01);
-      TEST_ASSERT_LESS_OR_EQUAL(max, pid.out);
-      TEST_ASSERT_LESS_OR_EQUAL(max, pid.part[1]);
-    }
-
-  /* Feed controller */
-
-  for (i = 0; i < 1000; i += 1)
-    {
-      pid_controller(&pid, -0.01);
-      TEST_ASSERT_GREATER_OR_EQUAL(min, pid.out);
-      TEST_ASSERT_GREATER_OR_EQUAL(min, pid.part[1]);
-    }
-}
-
-/****************************************************************************
- * Public Functions
- ****************************************************************************/
-
-/****************************************************************************
- * Name: test_pid
- ****************************************************************************/
-
-void test_pid(void)
-{
-  UNITY_BEGIN();
-
-  TEST_SEPARATOR();
-
-  /* Test PID functions */
-
-  RUN_TEST(test_pi_controller_init);
-  RUN_TEST(test_pi_controller_zeros);
-  RUN_TEST(test_pi_controller);
-  RUN_TEST(test_pi_controller_saturation);
-  RUN_TEST(test_pi_windup_protection);
-  RUN_TEST(test_pid_controller_init);
-  RUN_TEST(test_pid_controller_zeros);
-  RUN_TEST(test_pid_controller);
-  RUN_TEST(test_pid_controller_saturation);
-
-  UNITY_END();
-}
diff --git a/examples/dsptest/test_svm.c b/examples/dsptest/test_svm.c
deleted file mode 100644
index 72455dc..0000000
--- a/examples/dsptest/test_svm.c
+++ /dev/null
@@ -1,309 +0,0 @@
-/****************************************************************************
- * examples/dsptest/test_svm.c
- *
- *   Copyright (C) 2018 Gregory Nutt. All rights reserved.
- *   Author: Mateusz Szafoni <[email protected]>
- *
- * 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 "dsptest.h"
-
-/****************************************************************************
- * Pre-processor Definitions
- ****************************************************************************/
-
-#define SVM3_DUTY_MAX 0.95
-#define SVM3_DUTY_MIN 0.00
-
-#undef UNITY_FLOAT_PRECISION
-#define UNITY_FLOAT_PRECISION   (0.0001f)
-
-/****************************************************************************
- * Private Types
- ****************************************************************************/
-
-/****************************************************************************
- * Private Function Protototypes
- ****************************************************************************/
-
-/****************************************************************************
- * Private Data
- ****************************************************************************/
-
-/****************************************************************************
- * Private Functions
- ****************************************************************************/
-
-static void SVM3(FAR struct svm3_state_s *s, float a, float b)
-{
-  ab_frame_t ab;
-
-  svm3_init(s, SVM3_DUTY_MIN, SVM3_DUTY_MAX);
-
-  ab.a = a;
-  ab.b = b;
-
-  svm3(s, &ab);
-}
-
-/* Feed SVM3 with zeros */
-
-static void test_svm3_zero(void)
-{
-  struct svm3_state_s s;
-
-  SVM3(&s, 0.0, 0.0);
-
-  TEST_ASSERT_EQUAL_FLOAT(0.5, s.d_u);
-  TEST_ASSERT_EQUAL_FLOAT(0.5, s.d_v);
-  TEST_ASSERT_EQUAL_FLOAT(0.5, s.d_w);
-  TEST_ASSERT_EQUAL_INT8(2, s.sector);
-}
-
-/* Test duty cycle saturation */
-
-static void test_svm3_saturation(void)
-{
-  struct svm3_state_s s;
-
-  /* v_a = 1.0
-   * v_b = 1.0
-   * mag(v_ab) > 1.0 which is not valid for SVM
-   * d_u > 1.0, d_w < 0.0
-   */
-
-  SVM3(&s, 1.0, 1.0);
-
-  TEST_ASSERT_EQUAL_FLOAT(SVM3_DUTY_MAX, s.d_u);
-  TEST_ASSERT_EQUAL_FLOAT(0.81698, s.d_v);
-  TEST_ASSERT_EQUAL_FLOAT(SVM3_DUTY_MIN, s.d_w);
-  TEST_ASSERT_EQUAL_INT8(1, s.sector);
-
-  /* v_a = -1.0
-   * v_b = -1.0
-   * mag(v_ab) > 1.0 which is not valid for SVM
-   * d_u < 0.0, dw > 1
-   */
-
-  SVM3(&s, -1.0, -1.0);
-
-  TEST_ASSERT_EQUAL_FLOAT(SVM3_DUTY_MIN, s.d_u);
-  TEST_ASSERT_EQUAL_FLOAT(0.183012, s.d_v);
-  TEST_ASSERT_EQUAL_FLOAT(SVM3_DUTY_MAX, s.d_w);
-  TEST_ASSERT_EQUAL_INT8(4, s.sector);
-}
-
-/* Test vectors from sector 1 to sector 6 */
-
-static void test_svm3_s1s6(void)
-{
-  struct svm3_state_s s;
-
-  /* Vector in sector 1 */
-
-  SVM3(&s, 0.5, 0.5);
-
-  TEST_ASSERT_EQUAL_FLOAT(0.84150, s.d_u);
-  TEST_ASSERT_EQUAL_FLOAT(0.65849, s.d_v);
-  TEST_ASSERT_EQUAL_FLOAT(0.15849, s.d_w);
-  TEST_ASSERT_EQUAL_INT8(1, s.sector);
-
-  /* Vector in sector 2 */
-
-  SVM3(&s, 0.0, 0.5);
-
-  TEST_ASSERT_EQUAL_FLOAT(0.5, s.d_u);
-  TEST_ASSERT_EQUAL_FLOAT(0.75, s.d_v);
-  TEST_ASSERT_EQUAL_FLOAT(0.25, s.d_w);
-  TEST_ASSERT_EQUAL_INT8(2, s.sector);
-
-  /* Vector in sector 3 */
-
-  SVM3(&s, -0.5, 0.5);
-
-  TEST_ASSERT_EQUAL_FLOAT(0.15849, s.d_u);
-  TEST_ASSERT_EQUAL_FLOAT(0.84150, s.d_v);
-  TEST_ASSERT_EQUAL_FLOAT(0.34150, s.d_w);
-  TEST_ASSERT_EQUAL_INT8(3, s.sector);
-
-  /* Vector in sector 4 */
-
-  SVM3(&s, -0.5, -0.5);
-
-  TEST_ASSERT_EQUAL_FLOAT(0.15849, s.d_u);
-  TEST_ASSERT_EQUAL_FLOAT(0.34150, s.d_v);
-  TEST_ASSERT_EQUAL_FLOAT(0.84150, s.d_w);
-  TEST_ASSERT_EQUAL_INT8(4, s.sector);
-
-  /* Vector in sector 5 */
-
-  SVM3(&s, 0.0, -0.5);
-
-  TEST_ASSERT_EQUAL_FLOAT(0.5, s.d_u);
-  TEST_ASSERT_EQUAL_FLOAT(0.25, s.d_v);
-  TEST_ASSERT_EQUAL_FLOAT(0.75, s.d_w);
-  TEST_ASSERT_EQUAL_INT8(5, s.sector);
-
-  /* Vector in sector 6 */
-
-  SVM3(&s, 0.5, -0.5);
-
-  TEST_ASSERT_EQUAL_FLOAT(0.84150, s.d_u);
-  TEST_ASSERT_EQUAL_FLOAT(0.15849, s.d_v);
-  TEST_ASSERT_EQUAL_FLOAT(0.65849, s.d_w);
-  TEST_ASSERT_EQUAL_INT8(6, s.sector);
-}
-
-/* Get SVM3 base voltage */
-
-static void test_svm3_vbase(void)
-{
-  float vbus  = 0.0;
-  float vbase = 0.0;
-
-  vbus = 10.0;
-  vbase = SVM3_BASE_VOLTAGE_GET(vbus);
-  TEST_ASSERT_EQUAL_FLOAT(5.77350, vbase);
-
-  vbus = 78.0;
-  vbase = SVM3_BASE_VOLTAGE_GET(vbus);
-  TEST_ASSERT_EQUAL_FLOAT(45.0333, vbase);
-}
-
-/* Correct ADC samples according to SVM3 state */
-
-static void test_svm3_adc_correct(void)
-{
-  struct svm3_state_s s;
-  int32_t c1 = 0;
-  int32_t c2 = 0;
-  int32_t c3 = 0;
-
-  /* Sector 1 - ignore phase 1 */
-
-  c1 = 100;
-  c2 = 10;
-  c3 = -30;
-  SVM3(&s, 0.5, 0.5);
-  svm3_current_correct(&s, &c1, &c2, &c3);
-
-  TEST_ASSERT_EQUAL_INT(20, c1);
-  TEST_ASSERT_EQUAL_INT(10, c2);
-  TEST_ASSERT_EQUAL_INT(-30, c3);
-
-  /* Sector 2 - ignore phase 2 */
-
-  c1 = 100;
-  c2 = 10;
-  c3 = -30;
-  SVM3(&s, 0.0, 0.5);
-  svm3_current_correct(&s, &c1, &c2, &c3);
-
-  TEST_ASSERT_EQUAL_INT(100, c1);
-  TEST_ASSERT_EQUAL_INT(-70, c2);
-  TEST_ASSERT_EQUAL_INT(-30, c3);
-
-  /* Sector 3 - ignore phase 2 */
-
-  c1 = 100;
-  c2 = 10;
-  c3 = -30;
-  SVM3(&s, -0.5, 0.5);
-  svm3_current_correct(&s, &c1, &c2, &c3);
-
-  TEST_ASSERT_EQUAL_INT(100, c1);
-  TEST_ASSERT_EQUAL_INT(-70, c2);
-  TEST_ASSERT_EQUAL_INT(-30, c3);
-
-  /* Sector 4 - ignore phase 3 */
-
-  c1 = 100;
-  c2 = 10;
-  c3 = -30;
-  SVM3(&s, -0.5, -0.5);
-  svm3_current_correct(&s, &c1, &c2, &c3);
-
-  TEST_ASSERT_EQUAL_INT(100, c1);
-  TEST_ASSERT_EQUAL_INT(10, c2);
-  TEST_ASSERT_EQUAL_INT(-110, c3);
-
-  /* Sector 5 - ignore phase 3 */
-
-  c1 = 100;
-  c2 = 10;
-  c3 = -30;
-  SVM3(&s, 0.0, -0.5);
-  svm3_current_correct(&s, &c1, &c2, &c3);
-
-  TEST_ASSERT_EQUAL_INT(100, c1);
-  TEST_ASSERT_EQUAL_INT(10, c2);
-  TEST_ASSERT_EQUAL_INT(-110, c3);
-
-  /* Sector 6 - ignore phase 1 */
-
-  c1 = 100;
-  c2 = 10;
-  c3 = -30;
-  SVM3(&s, 0.5, -0.5);
-  svm3_current_correct(&s, &c1, &c2, &c3);
-
-  TEST_ASSERT_EQUAL_INT(20, c1);
-  TEST_ASSERT_EQUAL_INT(10, c2);
-  TEST_ASSERT_EQUAL_INT(-30, c3);
-}
-
-/****************************************************************************
- * Public Functions
- ****************************************************************************/
-
-/****************************************************************************
- * Name: test_svm
- ****************************************************************************/
-
-void test_svm(void)
-{
-  UNITY_BEGIN();
-
-  TEST_SEPARATOR();
-
-  /* Test 3 phase space vector modulation */
-
-  RUN_TEST(test_svm3_zero);
-  RUN_TEST(test_svm3_saturation);
-  RUN_TEST(test_svm3_s1s6);
-  RUN_TEST(test_svm3_vbase);
-  RUN_TEST(test_svm3_adc_correct);
-
-  UNITY_END();
-}
diff --git a/examples/dsptest/test_transform.c 
b/examples/dsptest/test_transform.c
deleted file mode 100644
index c7630b4..0000000
--- a/examples/dsptest/test_transform.c
+++ /dev/null
@@ -1,303 +0,0 @@
-/****************************************************************************
- * examples/dsptest/test_transform.c
- *
- *   Copyright (C) 2018 Gregory Nutt. All rights reserved.
- *   Author: Mateusz Szafoni <[email protected]>
- *
- * 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 "dsptest.h"
-
-/****************************************************************************
- * Pre-processor Definitions
- ****************************************************************************/
-
-/* Set float precision for this module */
-
-#undef UNITY_FLOAT_PRECISION
-#define UNITY_FLOAT_PRECISION (0.0001f)
-
-/****************************************************************************
- * Private Types
- ****************************************************************************/
-
-/****************************************************************************
- * Private Function Protototypes
- ****************************************************************************/
-
-/****************************************************************************
- * Private Data
- ****************************************************************************/
-
-/****************************************************************************
- * Private Functions
- ****************************************************************************/
-
-/* Feed Clarke transform with some data */
-
-static void test_transform_clarke(void)
-{
-  abc_frame_t abc;
-  ab_frame_t  ab;
-
-  /* a = 0.0, b = 0.0, c = 0.0 -> alpha = 0.0, beta = 0.0 */
-
-  abc.a = 0.0;
-  abc.b = 0.0;
-  abc.c = 0.0;
-  clarke_transform(&abc, &ab);
-
-  TEST_ASSERT_EQUAL_FLOAT(0.0, ab.a);
-  TEST_ASSERT_EQUAL_FLOAT(0.0, ab.b);
-
-  /* a = 1.0, b = -2.0, c = 1.0 -> alpha = 1.0, beta =  -1.732 */
-
-  abc.a = 1.0;
-  abc.b = -2.0;
-  abc.c = 1.0;
-  clarke_transform(&abc, &ab);
-
-  TEST_ASSERT_EQUAL_FLOAT(1.0, ab.a);
-  TEST_ASSERT_EQUAL_FLOAT(-1.7320, ab.b);
-
-  /* a = 1.0, b = 1.0, c = -2.0 -> alpha = 1.0, beta = 1.7320 */
-
-  abc.a = 1.0;
-  abc.b = 1.0;
-  abc.c = -2.0;
-  clarke_transform(&abc, &ab);
-
-  TEST_ASSERT_EQUAL_FLOAT(1.0, ab.a);
-  TEST_ASSERT_EQUAL_FLOAT(1.7320, ab.b);
-
-  /* a = -2.0, b = 1.0, c = 1.0 -> alpha = -2.0, beta = 0.0 */
-
-  abc.a = -2.0;
-  abc.b = 1.0;
-  abc.c = 1.0;
-  clarke_transform(&abc, &ab);
-
-  TEST_ASSERT_EQUAL_FLOAT(-2.0, ab.a);
-  TEST_ASSERT_EQUAL_FLOAT(0.0, ab.b);
-}
-
-/* Feed inverse Clarke transform with some data */
-
-static void test_transform_invclarke(void)
-{
-  ab_frame_t  ab;
-  abc_frame_t abc;
-
-  /* alpha = 0.0, beta = 0.0 -> a = 0.0, b = 0.0, c = 0.0 */
-
-  ab.a = 0.0;
-  ab.b = 0.0;
-  inv_clarke_transform(&ab, &abc);
-
-  TEST_ASSERT_EQUAL_FLOAT(0.0, abc.a);
-  TEST_ASSERT_EQUAL_FLOAT(0.0, abc.b);
-  TEST_ASSERT_EQUAL_FLOAT(0.0, abc.c);
-
-  /* alpha = 1.0, beta = 1.0 -> a = 1.0, b = 0.3660, c = -1.3660 */
-
-  ab.a = 1.0;
-  ab.b = 1.0;
-  inv_clarke_transform(&ab, &abc);
-
-  TEST_ASSERT_EQUAL_FLOAT(1.0, abc.a);
-  TEST_ASSERT_EQUAL_FLOAT(0.3660, abc.b);
-  TEST_ASSERT_EQUAL_FLOAT(-1.3660, abc.c);
-
-  /* alpha = -1.0, beta = -1.0 -> a = -1.0, b = -0.3660, c = 1.3660 */
-
-  ab.a = -1.0;
-  ab.b = -1.0;
-  inv_clarke_transform(&ab, &abc);
-
-  TEST_ASSERT_EQUAL_FLOAT(-1.0, abc.a);
-  TEST_ASSERT_EQUAL_FLOAT(-0.3660, abc.b);
-  TEST_ASSERT_EQUAL_FLOAT(1.3660, abc.c);
-
-  /* alpha = 1.0, beta = -1.0 -> a = 1.0, b = -1.3660, c = 0.3660 */
-
-  ab.a = 1.0;
-  ab.b = -1.0;
-  inv_clarke_transform(&ab, &abc);
-
-  TEST_ASSERT_EQUAL_FLOAT(1.0, abc.a);
-  TEST_ASSERT_EQUAL_FLOAT(-1.3660, abc.b);
-  TEST_ASSERT_EQUAL_FLOAT(0.3660, abc.c);
-}
-
-/* Feed Park transform with some data */
-
-static void test_transform_park(void)
-{
-  phase_angle_t angle;
-  ab_frame_t    ab;
-  dq_frame_t    dq;
-
-  /* angle = 0.0, alpha = 0.0, beta = 0.0 -> d = 0.0, q = 0.0 */
-
-  phase_angle_update(&angle, 0.0);
-  ab.a = 0.0;
-  ab.b = 0.0;
-  park_transform(&angle, &ab, &dq);
-
-  TEST_ASSERT_EQUAL_FLOAT(0.0, dq.d);
-  TEST_ASSERT_EQUAL_FLOAT(0.0, dq.q);
-
-  /* angle = 0.0, alpha = 1.0, beta = 1.0 -> d = 1.0, q = 1.0 */
-
-  phase_angle_update(&angle, 0.0);
-  ab.a = 1.0;
-  ab.b = 1.0;
-  park_transform(&angle, &ab, &dq);
-
-  TEST_ASSERT_EQUAL_FLOAT(1.0, dq.d);
-  TEST_ASSERT_EQUAL_FLOAT(1.0, dq.q);
-
-  /* angle = PI, alpha = 1.0, beta = 1.0 -> d = -1.0, q = -1.0 */
-
-  phase_angle_update(&angle, M_PI_F);
-  ab.a = 1.0;
-  ab.b = 1.0;
-  park_transform(&angle, &ab, &dq);
-
-  TEST_ASSERT_EQUAL_FLOAT(-1.0, dq.d);
-  TEST_ASSERT_EQUAL_FLOAT(-1.0, dq.q);
-
-  /* angle = PI, alpha = -1.0, beta = 1.0 -> d = 1.0, q = -1.0 */
-
-  phase_angle_update(&angle, M_PI_F);
-  ab.a = -1.0;
-  ab.b = 1.0;
-  park_transform(&angle, &ab, &dq);
-
-  TEST_ASSERT_EQUAL_FLOAT(1.0, dq.d);
-  TEST_ASSERT_EQUAL_FLOAT(-1.0, dq.q);
-
-  /* angle = -PI/2, alpha = 1.0, beta = 1.0 -> d = -1.0, q = 1.0 */
-
-  phase_angle_update(&angle, -M_PI_F / 2);
-  ab.a = 1.0;
-  ab.b = 1.0;
-  park_transform(&angle, &ab, &dq);
-
-  TEST_ASSERT_EQUAL_FLOAT(-1.0, dq.d);
-  TEST_ASSERT_EQUAL_FLOAT(1.0, dq.q);
-}
-
-/* Feed inverse Park transform with some data */
-
-static void test_transform_invpark(void)
-{
-  phase_angle_t angle;
-  dq_frame_t    dq;
-  ab_frame_t    ab;
-
-  /* angle = 0.0, d = 0.0, q = 0.0 -> alpha = 0.0, beta = 0.0 */
-
-  phase_angle_update(&angle, 0.0);
-  dq.d = 0.0;
-  dq.q = 0.0;
-  inv_park_transform(&angle, &dq, &ab);
-
-  TEST_ASSERT_EQUAL_FLOAT(0.0, ab.a);
-  TEST_ASSERT_EQUAL_FLOAT(0.0, ab.b);
-
-  /* angle = 0.0, d = 1.0, q = 1.0 -> alpha = 1.0, beta = 1.0 */
-
-  phase_angle_update(&angle, 0.0);
-  dq.d = 1.0;
-  dq.q = 1.0;
-  inv_park_transform(&angle, &dq, &ab);
-
-  TEST_ASSERT_EQUAL_FLOAT(1.0, ab.a);
-  TEST_ASSERT_EQUAL_FLOAT(1.0, ab.b);
-
-  /* angle = PI, d = 1.0, q = 1.0 -> alpha = 0.0, beta = 0.0 */
-
-  phase_angle_update(&angle, M_PI_F);
-  dq.d = 1.0;
-  dq.q = 1.0;
-  inv_park_transform(&angle, &dq, &ab);
-
-  TEST_ASSERT_EQUAL_FLOAT(-1.0, ab.a);
-  TEST_ASSERT_EQUAL_FLOAT(-1.0, ab.b);
-
-  /* angle = PI, d = -1.0, q = 1.0 -> alpha = 0.0, beta = 0.0 */
-
-  phase_angle_update(&angle, M_PI_F);
-  dq.d = -1.0;
-  dq.q = 1.0;
-  inv_park_transform(&angle, &dq, &ab);
-
-  TEST_ASSERT_EQUAL_FLOAT(1.0, ab.a);
-  TEST_ASSERT_EQUAL_FLOAT(-1.0, ab.b);
-
-  /* angle = -PI/2, d = 1.0, q = 1.0 -> alpha = 0.0, beta = 0.0 */
-
-  phase_angle_update(&angle, -M_PI_F / 2);
-  dq.d = 1.0;
-  dq.q = 1.0;
-  inv_park_transform(&angle, &dq, &ab);
-
-  TEST_ASSERT_EQUAL_FLOAT(1.0, ab.a);
-  TEST_ASSERT_EQUAL_FLOAT(-1.0, ab.b);
-}
-
-/****************************************************************************
- * Public Functions
- ****************************************************************************/
-
-/****************************************************************************
- * Name: test_transform
- ****************************************************************************/
-
-void test_transform(void)
-{
-  UNITY_BEGIN();
-
-  TEST_SEPARATOR();
-
-  /* Test 3 phase motor transformations */
-
-  RUN_TEST(test_transform_clarke);
-  RUN_TEST(test_transform_invclarke);
-  RUN_TEST(test_transform_park);
-  RUN_TEST(test_transform_invpark);
-
-  UNITY_END();
-}

Reply via email to