From 4a509d19f2040bd1b8274da7532c0f35a0d9f2d9 Mon Sep 17 00:00:00 2001 From: tx_haggis <13982343+adbancroft@users.noreply.github.com> Date: Wed, 26 Apr 2023 23:43:04 -0500 Subject: [PATCH] Unit test fuel and ignition scheduler initialisation (#1039) * Unit test fuel schedule initialisation * Move initialisation tests to their own harness Saves memory * Rename test_misc to test_tables * Rename test_misc2 to test_math * Reduce memory usage * Fill out remaining ignition init unit tests --- speeduino/scheduler.ino | 28 + test/test_init/main.cpp | 34 + test/test_init/test_fuel_schedule_init.cpp | 640 ++++++++++++++++++ .../test_init/test_ignition_schedule_init.cpp | 208 ++++++ test/test_init/tests_init.cpp | 231 +++++++ .../test_misc2.cpp => test_math/main.cpp} | 0 .../tests_crankmaths.cpp | 0 .../tests_crankmaths.h | 0 .../{test_misc2 => test_math}/tests_maths.cpp | 0 test/{test_misc2 => test_math}/tests_maths.h | 0 test/test_misc/tests_init.cpp | 181 ----- test/test_misc/tests_init.h | 13 - .../tests_misc.cpp => test_tables/main.cpp} | 2 - .../test_table2d.cpp | 0 .../{test_misc => test_tables}/test_table2d.h | 0 .../tests_tables.cpp | 0 .../{test_misc => test_tables}/tests_tables.h | 0 17 files changed, 1141 insertions(+), 196 deletions(-) create mode 100644 test/test_init/main.cpp create mode 100644 test/test_init/test_fuel_schedule_init.cpp create mode 100644 test/test_init/test_ignition_schedule_init.cpp create mode 100644 test/test_init/tests_init.cpp rename test/{test_misc2/test_misc2.cpp => test_math/main.cpp} (100%) rename test/{test_misc2 => test_math}/tests_crankmaths.cpp (100%) rename test/{test_misc2 => test_math}/tests_crankmaths.h (100%) rename test/{test_misc2 => test_math}/tests_maths.cpp (100%) rename test/{test_misc2 => test_math}/tests_maths.h (100%) delete mode 100644 test/test_misc/tests_init.cpp delete mode 100644 test/test_misc/tests_init.h rename test/{test_misc/tests_misc.cpp => test_tables/main.cpp} (91%) rename test/{test_misc => test_tables}/test_table2d.cpp (100%) rename test/{test_misc => test_tables}/test_table2d.h (100%) rename test/{test_misc => test_tables}/tests_tables.cpp (100%) rename test/{test_misc => test_tables}/tests_tables.h (100%) diff --git a/speeduino/scheduler.ino b/speeduino/scheduler.ino index 8b326f96..95488f0a 100644 --- a/speeduino/scheduler.ino +++ b/speeduino/scheduler.ino @@ -28,6 +28,7 @@ A full copy of the license may be found in the projects root directory #include "scheduler.h" #include "scheduledIO.h" #include "timers.h" +#include "schedule_calcs.h" FuelSchedule fuelSchedule1; FuelSchedule fuelSchedule2; @@ -142,6 +143,33 @@ void initialiseSchedulers(void) ignitionSchedule6.schedulesSet = 0; ignitionSchedule7.schedulesSet = 0; ignitionSchedule8.schedulesSet = 0; + + ignition1StartAngle = 0; + ignition2StartAngle = 0; + ignition3StartAngle = 0; + ignition4StartAngle = 0; + ignition5StartAngle = 0; + ignition6StartAngle = 0; + ignition7StartAngle = 0; + ignition8StartAngle = 0; + + channel1IgnDegrees = 0; /**< The number of crank degrees until cylinder 1 is at TDC (This is obviously 0 for virtually ALL engines, but there's some weird ones) */ + channel2IgnDegrees = 0; /**< The number of crank degrees until cylinder 2 (and 5/6/7/8) is at TDC */ + channel3IgnDegrees = 0; /**< The number of crank degrees until cylinder 3 (and 5/6/7/8) is at TDC */ + channel4IgnDegrees = 0; /**< The number of crank degrees until cylinder 4 (and 5/6/7/8) is at TDC */ + channel5IgnDegrees = 0; /**< The number of crank degrees until cylinder 5 is at TDC */ + channel6IgnDegrees = 0; /**< The number of crank degrees until cylinder 6 is at TDC */ + channel7IgnDegrees = 0; /**< The number of crank degrees until cylinder 7 is at TDC */ + channel8IgnDegrees = 0; /**< The number of crank degrees until cylinder 8 is at TDC */ + + channel1InjDegrees = 0; /**< The number of crank degrees until cylinder 1 is at TDC (This is obviously 0 for virtually ALL engines, but there's some weird ones) */ + channel2InjDegrees = 0; /**< The number of crank degrees until cylinder 2 (and 5/6/7/8) is at TDC */ + channel3InjDegrees = 0; /**< The number of crank degrees until cylinder 3 (and 5/6/7/8) is at TDC */ + channel4InjDegrees = 0; /**< The number of crank degrees until cylinder 4 (and 5/6/7/8) is at TDC */ + channel5InjDegrees = 0; /**< The number of crank degrees until cylinder 5 is at TDC */ + channel6InjDegrees = 0; /**< The number of crank degrees until cylinder 6 is at TDC */ + channel7InjDegrees = 0; /**< The number of crank degrees until cylinder 7 is at TDC */ + channel8InjDegrees = 0; /**< The number of crank degrees until cylinder 8 is at TDC */ } /* diff --git a/test/test_init/main.cpp b/test/test_init/main.cpp new file mode 100644 index 00000000..c77a07e7 --- /dev/null +++ b/test/test_init/main.cpp @@ -0,0 +1,34 @@ +#include +#include + +void testInitialisation(void); +void testFuelScheduleInit(void); +void testIgnitionScheduleInit(void); + +#define UNITY_EXCLUDE_DETAILS + +void setup() +{ + pinMode(LED_BUILTIN, OUTPUT); + + // NOTE!!! Wait for >2 secs + // if board doesn't support software reset via Serial.DTR/RTS + delay(2000); + + UNITY_BEGIN(); // IMPORTANT LINE! + + testInitialisation(); + testFuelScheduleInit(); + testIgnitionScheduleInit(); + + UNITY_END(); // stop unit testing +} + +void loop() +{ + // Blink to indicate end of test + digitalWrite(LED_BUILTIN, HIGH); + delay(250); + digitalWrite(LED_BUILTIN, LOW); + delay(250); +} \ No newline at end of file diff --git a/test/test_init/test_fuel_schedule_init.cpp b/test/test_init/test_fuel_schedule_init.cpp new file mode 100644 index 00000000..9bfaf9d2 --- /dev/null +++ b/test/test_init/test_fuel_schedule_init.cpp @@ -0,0 +1,640 @@ +#include +#include +#include "globals.h" +#include "init.h" +#include "schedule_calcs.h" + +extern uint16_t req_fuel_uS; + +static constexpr uint16_t reqFuel = 86; // ms * 10 + +static void assert_fuel_schedules(uint16_t crankAngle, uint16_t reqFuel, const bool enabled[], const uint16_t angle[]) +{ + char msg[32]; + + strcpy_P(msg, PSTR("CRANK_ANGLE_MAX_INJ")); + TEST_ASSERT_EQUAL_INT16_MESSAGE(crankAngle, CRANK_ANGLE_MAX_INJ, msg); + strcpy_P(msg, PSTR("req_fuel_uS")); + TEST_ASSERT_EQUAL_UINT16_MESSAGE(reqFuel, req_fuel_uS, msg); + + strcpy_P(msg, PSTR("channel1InjDegrees.isEnabled")); + TEST_ASSERT_EQUAL_MESSAGE(enabled[0], BIT_CHECK(channelInjEnabled, INJ1_CMD_BIT), msg); + strcpy_P(msg, PSTR("channel1InjDegrees")); + TEST_ASSERT_EQUAL_MESSAGE(angle[0], channel1InjDegrees, msg); + strcpy_P(msg, PSTR("channel2InjDegrees.isEnabled")); + TEST_ASSERT_EQUAL_MESSAGE(enabled[1], BIT_CHECK(channelInjEnabled, INJ2_CMD_BIT), msg); + strcpy_P(msg, PSTR("channel2InjDegrees")); + TEST_ASSERT_EQUAL_MESSAGE(angle[1], channel2InjDegrees, msg); + strcpy_P(msg, PSTR("channel3InjDegrees.isEnabled")); + TEST_ASSERT_EQUAL_MESSAGE(enabled[2], BIT_CHECK(channelInjEnabled, INJ3_CMD_BIT), msg); + strcpy_P(msg, PSTR("channel3InjDegrees")); + TEST_ASSERT_EQUAL_MESSAGE(angle[2], channel3InjDegrees, msg); + strcpy_P(msg, PSTR("channel4InjDegrees.isEnabled")); + TEST_ASSERT_EQUAL_MESSAGE(enabled[3], BIT_CHECK(channelInjEnabled, INJ4_CMD_BIT), msg); + strcpy_P(msg, PSTR("channel4InjDegrees")); + TEST_ASSERT_EQUAL_MESSAGE(angle[3], channel4InjDegrees, msg); +#if INJ_CHANNELS>=5 + strcpy_P(msg, PSTR("channel5InjDegrees.isEnabled")); + TEST_ASSERT_EQUAL_MESSAGE(enabled[4], BIT_CHECK(channelInjEnabled, INJ5_CMD_BIT), msg); + strcpy_P(msg, PSTR("channel5InjDegrees")); + TEST_ASSERT_EQUAL_MESSAGE(angle[4], channel5InjDegrees, msg); +#endif +#if INJ_CHANNELS>=6 + strcpy_P(msg, PSTR("channel6InjDegrees.isEnabled")); + TEST_ASSERT_EQUAL_MESSAGE(enabled[5], BIT_CHECK(channelInjEnabled, INJ6_CMD_BIT), msg); + strcpy_P(msg, PSTR("channel6InjDegrees")); + TEST_ASSERT_EQUAL_MESSAGE(angle[5], channel6InjDegrees, msg); +#endif +#if INJ_CHANNELS>=7 + strcpy_P(msg, PSTR("channel7InjDegrees.isEnabled")); + TEST_ASSERT_EQUAL_MESSAGE(enabled[6], BIT_CHECK(channelInjEnabled, INJ7_CMD_BIT), msg); + strcpy_P(msg, PSTR("channel7InjDegrees")); + TEST_ASSERT_EQUAL_MESSAGE(angle[6], channel7InjDegrees, msg); +#endif +#if INJ_CHANNELS>=8 + strcpy_P(msg, PSTR("channel8InjDegrees.isEnabled")); + TEST_ASSERT_EQUAL_MESSAGE(enabled[7], BIT_CHECK(channelInjEnabled, INJ8_CMD_BIT), msg); + strcpy_P(msg, PSTR("channel8InjDegrees")); + TEST_ASSERT_EQUAL_MESSAGE(angle[7], channel8InjDegrees, msg); +#endif +} + +void test_fuel_schedule_1_cylinder_4stroke(void) +{ + configPage2.nCylinders = 1; + configPage2.strokes = FOUR_STROKE; + configPage2.engineType = EVEN_FIRE; + configPage2.injTiming = true; + configPage2.reqFuel = reqFuel; + configPage2.divider = 1; + + configPage2.injLayout = INJ_SEQUENTIAL; + configPage10.stagingEnabled = false; + initialiseAll(); //Run the main initialise function + { + const bool enabled[] = {true, false, false, false, false, false, false, false}; + const uint16_t angle[] = {0,0,0,0,0,0,0,0}; + assert_fuel_schedules(720U, reqFuel * 100U, enabled, angle); + } + + configPage2.injLayout = INJ_SEMISEQUENTIAL; + configPage10.stagingEnabled = false; + initialiseAll(); //Run the main initialise function + { + const bool enabled[] = {true, false, false, false, false, false, false, false}; + const uint16_t angle[] = {0,0,0,0,0,0,0,0}; + assert_fuel_schedules(720U, reqFuel * 50U, enabled, angle); + } + + configPage2.injLayout = INJ_SEQUENTIAL; + configPage10.stagingEnabled = true; + initialiseAll(); //Run the main initialise function + { + const bool enabled[] = {true, true, false, false, false, false, false, false}; + const uint16_t angle[] = {0,0,0,0,0,0,0,0}; + assert_fuel_schedules(720U, reqFuel * 100U, enabled, angle); + } + + configPage2.injLayout = INJ_SEMISEQUENTIAL; + configPage10.stagingEnabled = true; + initialiseAll(); //Run the main initialise function + { + const bool enabled[] = {true, true, false, false, false, false, false, false}; + const uint16_t angle[] = {0,0,0,0,0,0,0,0}; + assert_fuel_schedules(720U, reqFuel * 50U, enabled, angle); + } +} + +void test_fuel_schedule_1_cylinder_2stroke(void) +{ + configPage2.nCylinders = 1; + configPage2.strokes = TWO_STROKE; + configPage2.engineType = EVEN_FIRE; + configPage2.injTiming = true; + configPage2.reqFuel = reqFuel; + configPage2.divider = 1; + + configPage2.injLayout = INJ_SEQUENTIAL; + configPage10.stagingEnabled = false; + initialiseAll(); //Run the main initialise function + { + const bool enabled[] = {true, false, false, false, false, false, false, false}; + const uint16_t angle[] = {0,0,0,0,0,0,0,0}; + assert_fuel_schedules(360U, reqFuel * 100U, enabled, angle); + } + + configPage2.injLayout = INJ_SEMISEQUENTIAL; + configPage10.stagingEnabled = false; + initialiseAll(); //Run the main initialise function + { + const bool enabled[] = {true, false, false, false, false, false, false, false}; + const uint16_t angle[] = {0,0,0,0,0,0,0,0}; + assert_fuel_schedules(360U, reqFuel * 100U, enabled, angle); + } + + configPage2.injLayout = INJ_SEQUENTIAL; + configPage10.stagingEnabled = true; + initialiseAll(); //Run the main initialise function + { + const bool enabled[] = {true, true, false, false, false, false, false, false}; + const uint16_t angle[] = {0,0,0,0,0,0,0,0}; + assert_fuel_schedules(360U, reqFuel * 100U, enabled, angle); + } + + configPage2.injLayout = INJ_SEMISEQUENTIAL; + configPage10.stagingEnabled = true; + initialiseAll(); //Run the main initialise function + { + const bool enabled[] = {true, true, false, false, false, false, false, false}; + const uint16_t angle[] = {0,0,0,0,0,0,0,0}; + assert_fuel_schedules(360U, reqFuel * 100U, enabled, angle); + } +} + + +void test_fuel_schedule_2_cylinder_4stroke(void) +{ + configPage2.nCylinders = 2; + configPage2.strokes = FOUR_STROKE; + configPage2.engineType = EVEN_FIRE; + configPage2.injTiming = true; + configPage2.reqFuel = reqFuel; + configPage2.divider = 1; + + configPage2.injLayout = INJ_SEQUENTIAL; + configPage10.stagingEnabled = false; + initialiseAll(); //Run the main initialise function + { + const bool enabled[] = {true, true, false, false, false, false, false, false}; + const uint16_t angle[] = {0,180,0,0,0,0,0,0}; + assert_fuel_schedules(720U, reqFuel * 100U, enabled, angle); + } + + configPage2.injLayout = INJ_SEMISEQUENTIAL; + configPage10.stagingEnabled = false; + initialiseAll(); //Run the main initialise function + { + const bool enabled[] = {true, true, false, false, false, false, false, false}; + const uint16_t angle[] = {0,180,0,0,0,0,0,0}; + assert_fuel_schedules(360U, reqFuel * 50U, enabled, angle); + } + + configPage2.injLayout = INJ_SEQUENTIAL; + configPage10.stagingEnabled = true; + initialiseAll(); //Run the main initialise function + { + const bool enabled[] = {true, true, true, true, false, false, false, false}; + const uint16_t angle[] = {0,180,0,180,0,0,0,0}; + assert_fuel_schedules(720U, reqFuel * 100U, enabled, angle); + } + + configPage2.injLayout = INJ_SEMISEQUENTIAL; + configPage10.stagingEnabled = true; + initialiseAll(); //Run the main initialise function + { + const bool enabled[] = {true, true, true, true, false, false, false, false}; + const uint16_t angle[] = {0,180,0,180,0,0,0,0}; + assert_fuel_schedules(360U, reqFuel * 50U, enabled, angle); + } +} + +void test_fuel_schedule_2_cylinder_2stroke(void) +{ + configPage2.nCylinders = 2; + configPage2.strokes = TWO_STROKE; + configPage2.engineType = EVEN_FIRE; + configPage2.injTiming = true; + configPage2.reqFuel = reqFuel; + configPage2.divider = 1; + + configPage2.injLayout = INJ_SEQUENTIAL; + configPage10.stagingEnabled = false; + initialiseAll(); //Run the main initialise function + { + const bool enabled[] = {true, true, false, false, false, false, false, false}; + const uint16_t angle[] = {0,180,0,0,0,0,0,0}; + assert_fuel_schedules(180U, reqFuel * 100U, enabled, angle); + } + + configPage2.injLayout = INJ_SEMISEQUENTIAL; + configPage10.stagingEnabled = false; + initialiseAll(); //Run the main initialise function + { + const bool enabled[] = {true, true, false, false, false, false, false, false}; + const uint16_t angle[] = {0,180,0,0,0,0,0,0}; + assert_fuel_schedules(180U, reqFuel * 100U, enabled, angle); + } + + configPage2.injLayout = INJ_SEQUENTIAL; + configPage10.stagingEnabled = true; + initialiseAll(); //Run the main initialise function + { + const bool enabled[] = {true, true, true, true, false, false, false, false}; + const uint16_t angle[] = {0,180,0,180,0,0,0,0}; + assert_fuel_schedules(180U, reqFuel * 100U, enabled, angle); + } + + configPage2.injLayout = INJ_SEMISEQUENTIAL; + configPage10.stagingEnabled = true; + initialiseAll(); //Run the main initialise function + { + const bool enabled[] = {true, true, true, true, false, false, false, false}; + const uint16_t angle[] = {0,180,0,180,0,0,0,0}; + assert_fuel_schedules(180U, reqFuel * 100U, enabled, angle); + } +} + +void test_fuel_schedule_3_cylinder_4stroke(void) +{ + configPage2.nCylinders = 3; + configPage2.strokes = FOUR_STROKE; + configPage2.engineType = EVEN_FIRE; + configPage2.injTiming = true; + configPage2.reqFuel = reqFuel; + configPage2.divider = 1; + + configPage2.injLayout = INJ_SEQUENTIAL; + configPage10.stagingEnabled = false; + initialiseAll(); //Run the main initialise function + { + const bool enabled[] = {true, true, true, false, false, false, false, false}; + const uint16_t angle[] = {0,240,480,0,0,0,0,0}; + assert_fuel_schedules(720U, reqFuel * 100U, enabled, angle); + } + + configPage2.injLayout = INJ_SEMISEQUENTIAL; + configPage10.stagingEnabled = false; + initialiseAll(); //Run the main initialise function + { + const bool enabled[] = {true, true, true, false, false, false, false, false}; + const uint16_t angle[] = {0,80,160,0,0,0,0,0}; + assert_fuel_schedules(240U, reqFuel * 50U, enabled, angle); + } + + configPage2.injLayout = INJ_SEQUENTIAL; + configPage10.stagingEnabled = true; + initialiseAll(); //Run the main initialise function + { +#if INJ_CHANNELS>=6 + const bool enabled[] = {true, true, true, true, true, true, false, false}; + const uint16_t angle[] = {0,240,480,0,240,480,0,0}; +#else + const bool enabled[] = {true, true, true, true, false, false, false, false}; + const uint16_t angle[] = {0,240,480,0,0,0,0,0}; +#endif + assert_fuel_schedules(720U, reqFuel * 100U, enabled, angle); + } + + configPage2.injLayout = INJ_SEMISEQUENTIAL; + configPage10.stagingEnabled = true; + initialiseAll(); //Run the main initialise function + { +#if INJ_CHANNELS>=6 + const bool enabled[] = {true, true, true, true, true, true, false, false}; + const uint16_t angle[] = {0,80,160,0,80,160,0,0}; +#else + const bool enabled[] = {true, true, true, true, false, false, false, false}; + const uint16_t angle[] = {0,80,160,0,0,0,0,0}; +#endif + assert_fuel_schedules(240U, reqFuel * 50U, enabled, angle); + } +} + + +void test_fuel_schedule_3_cylinder_2stroke(void) +{ + configPage2.nCylinders = 3; + configPage2.strokes = TWO_STROKE; + configPage2.engineType = EVEN_FIRE; + configPage2.injTiming = true; + configPage2.reqFuel = reqFuel; + configPage2.divider = 1; + + configPage2.injLayout = INJ_SEQUENTIAL; + configPage10.stagingEnabled = false; + initialiseAll(); //Run the main initialise function + { + const bool enabled[] = {true, true, true, false, false, false, false, false}; + const uint16_t angle[] = {0,80,160,0,0,0,0,0}; + assert_fuel_schedules(120U, reqFuel * 100U, enabled, angle); + } + + configPage2.injLayout = INJ_SEMISEQUENTIAL; + configPage10.stagingEnabled = false; + initialiseAll(); //Run the main initialise function + { + const bool enabled[] = {true, true, true, false, false, false, false, false}; + const uint16_t angle[] = {0,80,160,0,0,0,0,0}; + assert_fuel_schedules(120U, reqFuel * 100U, enabled, angle); + } + + configPage2.injLayout = INJ_SEQUENTIAL; + configPage10.stagingEnabled = true; + initialiseAll(); //Run the main initialise function + { +#if INJ_CHANNELS>=6 + const bool enabled[] = {true, true, true, true, true, true, false, false}; + const uint16_t angle[] = {0,80,160,0,80,160,0,0}; +#else + const bool enabled[] = {true, true, true, true, false, false, false, false}; + const uint16_t angle[] = {0,80,160,0,0,0,0,0}; +#endif + assert_fuel_schedules(120U, reqFuel * 100U, enabled, angle); + } + + configPage2.injLayout = INJ_SEMISEQUENTIAL; + configPage10.stagingEnabled = true; + initialiseAll(); //Run the main initialise function + { +#if INJ_CHANNELS>=6 + const bool enabled[] = {true, true, true, true, true, true, false, false}; + const uint16_t angle[] = {0,80,160,0,80,160,0,0}; +#else + const bool enabled[] = {true, true, true, true, false, false, false, false}; + const uint16_t angle[] = {0,80,160,0,0,0,0,0}; +#endif + assert_fuel_schedules(120U, reqFuel * 100U, enabled, angle); + } +} + + +void test_fuel_schedule_4_cylinder_4stroke(void) +{ + configPage2.nCylinders = 4; + configPage2.strokes = FOUR_STROKE; + configPage2.engineType = EVEN_FIRE; + configPage2.injTiming = true; + configPage2.reqFuel = reqFuel; + configPage2.divider = 2; + + configPage2.injLayout = INJ_SEQUENTIAL; + configPage10.stagingEnabled = false; + initialiseAll(); //Run the main initialise function + { + const bool enabled[] = {true, true, true, true, false, false, false, false}; + const uint16_t angle[] = {0,180,360,540,0,0,0,0}; + assert_fuel_schedules(720U, reqFuel * 100U, enabled, angle); + } + + configPage2.injLayout = INJ_SEMISEQUENTIAL; + configPage10.stagingEnabled = false; + initialiseAll(); //Run the main initialise function + { + const bool enabled[] = {true, true, false, false, false, false, false, false}; + const uint16_t angle[] = {0,180,0,0,0,0,0,0}; + assert_fuel_schedules(360U, reqFuel * 50U, enabled, angle); + } + + configPage2.injLayout = INJ_SEQUENTIAL; + configPage10.stagingEnabled = true; + initialiseAll(); //Run the main initialise function + { +#if INJ_CHANNELS>=8 + const bool enabled[] = {true, true, true, true, true, true, true, true}; + const uint16_t angle[] = {0,180,360,540,0,180,360,540}; +#elif INJ_CHANNELS >= 5 + const bool enabled[] = {true, true, true, true, true, false, false, false}; + const uint16_t angle[] = {0,180,360,540,0,0,0,0}; +#else + const bool enabled[] = {true, true, true, true, false, false, false, false}; + const uint16_t angle[] = {0,180,360,540,0,0,0,0}; +#endif + assert_fuel_schedules(720U, reqFuel * 100U, enabled, angle); + } + + configPage2.injLayout = INJ_PAIRED; + configPage10.stagingEnabled = true; + initialiseAll(); //Run the main initialise function + { + const bool enabled[] = {true, true, true, true, false, false, false, false}; + const uint16_t angle[] = {0,180,0,180,0,0,0,0}; + assert_fuel_schedules(360U, reqFuel * 50U, enabled, angle); + } +} + +void test_fuel_schedule_4_cylinder_2stroke(void) +{ + configPage2.nCylinders = 4; + configPage2.strokes = TWO_STROKE; + configPage2.engineType = EVEN_FIRE; + configPage2.injTiming = true; + configPage2.reqFuel = reqFuel; + configPage2.divider = 2; + + configPage2.injLayout = INJ_SEQUENTIAL; + configPage10.stagingEnabled = false; + initialiseAll(); //Run the main initialise function + { + const bool enabled[] = {true, true, false, false, false, false, false, false}; + const uint16_t angle[] = {0,180,0,0,0,0,0,0}; + assert_fuel_schedules(180U, reqFuel * 100U, enabled, angle); + } + + configPage2.injLayout = INJ_SEMISEQUENTIAL; + configPage10.stagingEnabled = false; + initialiseAll(); //Run the main initialise function + { + const bool enabled[] = {true, true, false, false, false, false, false, false}; + const uint16_t angle[] = {0,180,0,0,0,0,0,0}; + assert_fuel_schedules(180U, reqFuel * 100U, enabled, angle); + } + + configPage2.injLayout = INJ_SEQUENTIAL; + configPage10.stagingEnabled = true; + initialiseAll(); //Run the main initialise function + { +#if INJ_CHANNELS>=8 + const bool enabled[] = {true, true, true, true, true, true, true, true}; + const uint16_t angle[] = {0,180,0,0,0,180,0,0}; +#elif INJ_CHANNELS >= 5 + const bool enabled[] = {true, true, true, true, true, false, false, false}; + const uint16_t angle[] = {0,180,0,0,0,0,0,0}; +#else + const bool enabled[] = {true, true, true, true, false, false, false, false}; + const uint16_t angle[] = {0,180,0,0,0,0,0,0}; +#endif + assert_fuel_schedules(180U, reqFuel * 100U, enabled, angle); + } + + configPage2.injLayout = INJ_PAIRED; + configPage10.stagingEnabled = true; + initialiseAll(); //Run the main initialise function + { + const bool enabled[] = {true, true, true, true, false, false, false, false}; + const uint16_t angle[] = {0,180,0,180,0,0,0,0}; + assert_fuel_schedules(180U, reqFuel * 100U, enabled, angle); + } +} + + +void test_fuel_schedule_5_cylinder_4stroke(void) +{ + configPage2.nCylinders = 5; + configPage2.strokes = FOUR_STROKE; + configPage2.engineType = EVEN_FIRE; + configPage2.injTiming = true; + configPage2.reqFuel = reqFuel; + configPage2.divider = 5; + + configPage2.injLayout = INJ_SEQUENTIAL; + configPage10.stagingEnabled = false; + initialiseAll(); //Run the main initialise function + { +#if INJ_CHANNELS >= 5 + const bool enabled[] = {true, true, true, true, true, false, false, false}; + const uint16_t angle[] = {0,144,288,432,576,0,0,0}; + uint16_t expectedFuel = reqFuel * 100U; +#else + const bool enabled[] = {true, true, true, true, false, false, false, false}; + const uint16_t angle[] = {0,0,0,0,0,0,0,0}; + uint16_t expectedFuel = reqFuel * 50U; +#endif + assert_fuel_schedules(720U, expectedFuel, enabled, angle); + } + + configPage2.injLayout = INJ_SEMISEQUENTIAL; + configPage10.stagingEnabled = false; + initialiseAll(); //Run the main initialise function + { + const bool enabled[] = {true, true, true, true, false, false, false, false}; + const uint16_t angle[] = {0,72,144,216,288,0,0,0}; + assert_fuel_schedules(720U, reqFuel * 50U, enabled, angle); + } + + configPage2.injLayout = INJ_SEQUENTIAL; + configPage10.stagingEnabled = true; + initialiseAll(); //Run the main initialise function + { +#if INJ_CHANNELS >= 6 + const bool enabled[] = {true, true, true, true, true, true, false, false}; + const uint16_t angle[] = {0,144,288,432,576,0,0,0}; + uint16_t expectedFuel = reqFuel * 100U; +#else + const bool enabled[] = {true, true, true, true, false, false, false, false}; + const uint16_t angle[] = {0,0,0,0,0,0,0,0}; + uint16_t expectedFuel = reqFuel * 50U; +#endif + assert_fuel_schedules(720U, expectedFuel, enabled, angle); + } + + configPage2.injLayout = INJ_PAIRED; + configPage10.stagingEnabled = true; + initialiseAll(); //Run the main initialise function + { +#if INJ_CHANNELS >= 5 + const bool enabled[] = {true, true, true, true, true, false, false, false}; + const uint16_t angle[] = {0,72,144,216,288,0,0,0}; +#else + const bool enabled[] = {true, true, true, true, false, false, false, false}; + const uint16_t angle[] = {0,72,144,216,288,0,0,0}; +#endif + assert_fuel_schedules(720U, reqFuel * 50U, enabled, angle); + } +} + +void test_fuel_schedule_6_cylinder_4stroke(void) +{ + configPage2.nCylinders = 6; + configPage2.strokes = FOUR_STROKE; + configPage2.engineType = EVEN_FIRE; + configPage2.injTiming = true; + configPage2.reqFuel = reqFuel; + configPage2.divider = 6; + + configPage2.injLayout = INJ_SEQUENTIAL; + configPage10.stagingEnabled = false; + initialiseAll(); //Run the main initialise function + { +#if INJ_CHANNELS >= 6 + const bool enabled[] = {true, true, true, true, true, true, false, false}; + const uint16_t angle[] = {0,120,240,360,480,600,0,0}; + assert_fuel_schedules(720U, reqFuel * 100U, enabled, angle); +#else + const bool enabled[] = {true, true, true, false, false, false, false, false}; + const uint16_t angle[] = {0,0,0,0,0,0,0,0}; + assert_fuel_schedules(720U, reqFuel * 50U, enabled, angle); +#endif + } + + configPage2.injLayout = INJ_SEMISEQUENTIAL; + configPage10.stagingEnabled = false; + initialiseAll(); //Run the main initialise function + { + const bool enabled[] = {true, true, true, false, false, false, false, false}; + const uint16_t angle[] = {0,120,240,0,0,0,0,0}; + assert_fuel_schedules(720U, reqFuel * 50U, enabled, angle); + } + + configPage2.injLayout = INJ_SEQUENTIAL; + configPage10.stagingEnabled = true; + initialiseAll(); //Run the main initialise function + { +#if INJ_CHANNELS >= 8 + const bool enabled[] = {true, true, true, true, true, true, false, false}; + const uint16_t angle[] = {0,120,240,360,480,600,0,0}; + assert_fuel_schedules(720U, reqFuel * 100U, enabled, angle); +#else + const bool enabled[] = {true, true, true, false, false, false, false, false}; + const uint16_t angle[] = {0,0,0,0,0,0,0,0}; + assert_fuel_schedules(720U, reqFuel * 50U, enabled, angle); +#endif + } + + configPage2.injLayout = INJ_SEMISEQUENTIAL; + configPage10.stagingEnabled = true; + initialiseAll(); //Run the main initialise function + { +#if INJ_CHANNELS >= 8 + const bool enabled[] = {true, true, true, true, true, true, true, true}; + const uint16_t angle[] = {0,120,240,0,0,120,240,0}; +#else + const bool enabled[] = {true, true, true, false, false, false, false, false}; + const uint16_t angle[] = {0,120,240,0,0,0,0,0}; +#endif + assert_fuel_schedules(720U, reqFuel * 50U, enabled, angle); + } +} + + +void test_fuel_schedule_8_cylinder_4stroke(void) +{ + configPage2.nCylinders = 8; + configPage2.strokes = FOUR_STROKE; + configPage2.engineType = EVEN_FIRE; + configPage2.injTiming = true; + configPage2.reqFuel = reqFuel; + configPage2.divider = 8; + + configPage2.injLayout = INJ_SEQUENTIAL; + configPage10.stagingEnabled = false; + initialiseAll(); //Run the main initialise function + { +#if INJ_CHANNELS >= 8 + const bool enabled[] = {true, true, true, true, true, true, true, true}; + const uint16_t angle[] = {0,90,180,270,360,450,540,630}; + assert_fuel_schedules(720U, reqFuel * 100U, enabled, angle); +#else + const bool enabled[] = {true, true, true, true, false, false, false, false}; + const uint16_t angle[] = {0,0,0,0,0,0,0,0}; + assert_fuel_schedules(720U, reqFuel * 50U, enabled, angle); +#endif + } + + // Staging not supported on 8 cylinders +} + + +void testFuelScheduleInit() +{ + RUN_TEST(test_fuel_schedule_1_cylinder_4stroke); + RUN_TEST(test_fuel_schedule_1_cylinder_2stroke); + RUN_TEST(test_fuel_schedule_2_cylinder_4stroke); + RUN_TEST(test_fuel_schedule_2_cylinder_2stroke); + RUN_TEST(test_fuel_schedule_3_cylinder_4stroke); + RUN_TEST(test_fuel_schedule_3_cylinder_2stroke); + RUN_TEST(test_fuel_schedule_4_cylinder_4stroke); + RUN_TEST(test_fuel_schedule_4_cylinder_2stroke); + RUN_TEST(test_fuel_schedule_5_cylinder_4stroke); + RUN_TEST(test_fuel_schedule_6_cylinder_4stroke); + RUN_TEST(test_fuel_schedule_8_cylinder_4stroke); +} \ No newline at end of file diff --git a/test/test_init/test_ignition_schedule_init.cpp b/test/test_init/test_ignition_schedule_init.cpp new file mode 100644 index 00000000..4349c9e3 --- /dev/null +++ b/test/test_init/test_ignition_schedule_init.cpp @@ -0,0 +1,208 @@ +#include +#include +#include "globals.h" +#include "init.h" +#include "schedule_calcs.h" + +static void assert_ignition_schedules(uint16_t crankAngle, uint16_t expectedOutputs, uint16_t angle[]) +{ + char msg[48]; + + strcpy_P(msg, PSTR("CRANK_ANGLE_MAX_IGN")); + TEST_ASSERT_EQUAL_INT16_MESSAGE(crankAngle, CRANK_ANGLE_MAX_IGN, msg); + strcpy_P(msg, PSTR("maxIgnOutputs")); + TEST_ASSERT_EQUAL_UINT16_MESSAGE(expectedOutputs, maxIgnOutputs, msg); + + strcpy_P(msg, PSTR("channel1IgnDegrees")); + TEST_ASSERT_EQUAL_MESSAGE(angle[0], channel1IgnDegrees, msg); + strcpy_P(msg, PSTR("channel2IgnDegrees")); + TEST_ASSERT_EQUAL_MESSAGE(angle[1], channel2IgnDegrees, msg); + strcpy_P(msg, PSTR("channel3IgnDegrees")); + TEST_ASSERT_EQUAL_MESSAGE(angle[2], channel3IgnDegrees, msg); + strcpy_P(msg, PSTR("channel4IgnDegrees")); + TEST_ASSERT_EQUAL_MESSAGE(angle[3], channel4IgnDegrees, msg); +#if IGN_CHANNELS>=5 + strcpy_P(msg, PSTR("channel5IgnDegrees")); + TEST_ASSERT_EQUAL_MESSAGE(angle[4], channel5IgnDegrees, msg); +#endif +#if IGN_CHANNELS>=6 + strcpy_P(msg, PSTR("channel6IgnDegrees")); + TEST_ASSERT_EQUAL_MESSAGE(angle[5], channel6IgnDegrees, msg); +#endif +#if IGN_CHANNELS>=7 + strcpy_P(msg, PSTR("channel7IgnDegrees")); + TEST_ASSERT_EQUAL_MESSAGE(angle[6], channel7IgnDegrees, msg); +#endif +#if IGN_CHANNELS>=8 + strcpy_P(msg, PSTR("channel8IgnDegrees")); + TEST_ASSERT_EQUAL_MESSAGE(angle[7], channel8IgnDegrees, msg); +#endif +} + +static void test_ignition_schedule_1_cylinder(void) +{ + configPage2.nCylinders = 1; + configPage2.strokes = FOUR_STROKE; + configPage2.engineType = EVEN_FIRE; + + configPage4.sparkMode = IGN_MODE_SEQUENTIAL; + initialiseAll(); //Run the main initialise function + { + uint16_t angle[] = {0,0,0,0,0,0,0,0}; + assert_ignition_schedules(720U, 1U, angle); + } + + configPage4.sparkMode = IGN_MODE_WASTED; + initialiseAll(); //Run the main initialise function + { + uint16_t angle[] = {0,0,0,0,0,0,0,0}; + assert_ignition_schedules(360U, 1U, angle); + } +} + +static void test_ignition_schedule_2_cylinder(void) +{ + configPage2.nCylinders = 2; + configPage2.strokes = FOUR_STROKE; + configPage2.engineType = EVEN_FIRE; + + configPage4.sparkMode = IGN_MODE_SEQUENTIAL; + initialiseAll(); //Run the main initialise function + { + uint16_t angle[] = {0,180,0,0,0,0,0,0}; + assert_ignition_schedules(720U, 2U, angle); + } + + configPage4.sparkMode = IGN_MODE_WASTED; + initialiseAll(); //Run the main initialise function + { + uint16_t angle[] = {0,180,0,0,0,0,0,0}; + assert_ignition_schedules(360U, 2U, angle); + } +} + +static void test_ignition_schedule_3_cylinder(void) +{ + configPage2.nCylinders = 3; + configPage2.strokes = FOUR_STROKE; + configPage2.engineType = EVEN_FIRE; + + configPage4.sparkMode = IGN_MODE_SEQUENTIAL; + initialiseAll(); //Run the main initialise function + { + uint16_t angle[] = {0,240,480,0,0,0,0,0}; + assert_ignition_schedules(720U, 3U, angle); + } + + configPage4.sparkMode = IGN_MODE_WASTED; + initialiseAll(); //Run the main initialise function + { + uint16_t angle[] = {0,120,240,0,0,0,0,0}; + assert_ignition_schedules(360U, 3U, angle); + } +} + +static void test_ignition_schedule_4_cylinder(void) +{ + configPage2.nCylinders = 4; + configPage2.strokes = FOUR_STROKE; + configPage2.engineType = EVEN_FIRE; + + configPage4.sparkMode = IGN_MODE_SEQUENTIAL; + initialiseAll(); //Run the main initialise function + { + uint16_t angle[] = {0,180,360,540,0,0,0,0}; + assert_ignition_schedules(720U, 4U, angle); + } + + configPage4.sparkMode = IGN_MODE_WASTED; + initialiseAll(); //Run the main initialise function + { + uint16_t angle[] = {0,180,0,0,0,0,0,0}; + assert_ignition_schedules(360U, 2U, angle); + } +} + +static void test_ignition_schedule_5_cylinder(void) +{ + configPage2.nCylinders = 5; + configPage2.strokes = FOUR_STROKE; + configPage2.engineType = EVEN_FIRE; + + configPage4.sparkMode = IGN_MODE_SEQUENTIAL; + initialiseAll(); //Run the main initialise function + { + uint16_t angle[] = {0,144,288,432,576,0,0,0}; + assert_ignition_schedules(720U, 5U, angle); + } + + configPage4.sparkMode = IGN_MODE_WASTED; + initialiseAll(); //Run the main initialise function + { + uint16_t angle[] = {0,72,144,216,288,0,0,0}; + assert_ignition_schedules(360U, 5U, angle); + } +} + +static void test_ignition_schedule_6_cylinder(void) +{ + configPage2.nCylinders = 6; + configPage2.strokes = FOUR_STROKE; + configPage2.engineType = EVEN_FIRE; + + configPage4.sparkMode = IGN_MODE_SEQUENTIAL; + initialiseAll(); //Run the main initialise function + { +#if IGN_CHANNELS >= 6 + uint16_t angle[] = {0,120,240,360,480,540,0,0}; + assert_ignition_schedules(720U, 6U, angle); +#else + uint16_t angle[] = {0,120,240,0,0,0,0,0}; + assert_ignition_schedules(360U, 3U, angle); +#endif + } + + configPage4.sparkMode = IGN_MODE_WASTED; + initialiseAll(); //Run the main initialise function + { + uint16_t angle[] = {0,120,240,0,0,0,0,0}; + assert_ignition_schedules(360U, 3U, angle); + } +} + +static void test_ignition_schedule_8_cylinder(void) +{ + configPage2.nCylinders = 8; + configPage2.strokes = FOUR_STROKE; + configPage2.engineType = EVEN_FIRE; + + configPage4.sparkMode = IGN_MODE_SEQUENTIAL; + initialiseAll(); //Run the main initialise function + { +#if IGN_CHANNELS >= 8 + uint16_t angle[] = {0,90,180,270,360,450,540,630}; + assert_ignition_schedules(720U, 8U, angle); +#else + uint16_t angle[] = {0,90,180,270,0,0,0,0}; + assert_ignition_schedules(360U, 4U, angle); +#endif + } + + configPage4.sparkMode = IGN_MODE_WASTED; + initialiseAll(); //Run the main initialise function + { + uint16_t angle[] = {0,90,180,270,0,0,0,0}; + assert_ignition_schedules(360U, 4U, angle); + } +} + +void testIgnitionScheduleInit() +{ + RUN_TEST(test_ignition_schedule_1_cylinder); + RUN_TEST(test_ignition_schedule_2_cylinder); + RUN_TEST(test_ignition_schedule_3_cylinder); + RUN_TEST(test_ignition_schedule_4_cylinder); + RUN_TEST(test_ignition_schedule_5_cylinder); + RUN_TEST(test_ignition_schedule_6_cylinder); + RUN_TEST(test_ignition_schedule_8_cylinder); +} \ No newline at end of file diff --git a/test/test_init/tests_init.cpp b/test/test_init/tests_init.cpp new file mode 100644 index 00000000..795121eb --- /dev/null +++ b/test/test_init/tests_init.cpp @@ -0,0 +1,231 @@ +#include +#include "globals.h" +#include "init.h" + +#define UNKNOWN_PIN 0xFF + +#if !defined(NOT_A_PIN) +#define NOT_A_PIN 0 +#endif + +uint8_t getPinMode(uint8_t pin) +{ + uint8_t bit = digitalPinToBitMask(pin); + uint8_t port = digitalPinToPort(pin); + + // I don't see an option for mega to return this, but whatever... + if (NOT_A_PIN == port) return UNKNOWN_PIN; + + // Is there a bit we can check? + if (0 == bit) return UNKNOWN_PIN; + + // Is there only a single bit set? + if (bit & (bit - 1)) return UNKNOWN_PIN; + + volatile uint8_t *reg, *out; + reg = portModeRegister(port); + out = portOutputRegister(port); + + if (*reg & bit) + return OUTPUT; + else if (*out & bit) + return INPUT_PULLUP; + else + return INPUT; +} + +void test_initialisation_complete(void) +{ + initialiseAll(); //Run the main initialise function + TEST_ASSERT_EQUAL(true, initialisationComplete); +} + +void test_initialisation_ports(void) +{ + //Test that all the port values have been set + initialiseAll(); //Run the main initialise function + TEST_ASSERT_NOT_EQUAL(0, inj1_pin_port); + TEST_ASSERT_NOT_EQUAL(0, inj2_pin_port); + TEST_ASSERT_NOT_EQUAL(0, inj3_pin_port); + TEST_ASSERT_NOT_EQUAL(0, inj4_pin_port); + TEST_ASSERT_NOT_EQUAL(0, ign1_pin_port); + TEST_ASSERT_NOT_EQUAL(0, ign2_pin_port); + TEST_ASSERT_NOT_EQUAL(0, ign3_pin_port); + TEST_ASSERT_NOT_EQUAL(0, ign4_pin_port); +} + +//Test that all mandatory output pins have their mode correctly set to output +void test_initialisation_outputs_V03(void) +{ + configPage2.pinMapping = 2; //Set the board number to test + initialiseAll(); //Run the main initialise function + + char msg[32]; + strcpy_P(msg, PSTR("Coil1")); + TEST_ASSERT_EQUAL_MESSAGE(OUTPUT, getPinMode(pinCoil1), msg); + strcpy_P(msg, PSTR("Coil2")); + TEST_ASSERT_EQUAL_MESSAGE(OUTPUT, getPinMode(pinCoil2), msg); + strcpy_P(msg, PSTR("Coil3")); + TEST_ASSERT_EQUAL_MESSAGE(OUTPUT, getPinMode(pinCoil3), msg); + strcpy_P(msg, PSTR("Coil4")); + TEST_ASSERT_EQUAL_MESSAGE(OUTPUT, getPinMode(pinCoil4), msg); + strcpy_P(msg, PSTR("Injector 1")); + TEST_ASSERT_EQUAL_MESSAGE(OUTPUT, getPinMode(pinInjector1), msg); + strcpy_P(msg, PSTR("Injector 2")); + TEST_ASSERT_EQUAL_MESSAGE(OUTPUT, getPinMode(pinInjector2), msg); + strcpy_P(msg, PSTR("Injector 3")); + TEST_ASSERT_EQUAL_MESSAGE(OUTPUT, getPinMode(pinInjector3), msg); + strcpy_P(msg, PSTR("Injector 4")); + TEST_ASSERT_EQUAL_MESSAGE(OUTPUT, getPinMode(pinInjector4), msg); + strcpy_P(msg, PSTR("Tacho Out")); + TEST_ASSERT_EQUAL_MESSAGE(OUTPUT, getPinMode(pinTachOut), msg); + strcpy_P(msg, PSTR("Fuel Pump")); + TEST_ASSERT_EQUAL_MESSAGE(OUTPUT, getPinMode(pinFuelPump), msg); + strcpy_P(msg, PSTR("Fan")); + TEST_ASSERT_EQUAL_MESSAGE(OUTPUT, getPinMode(pinFan), msg); +} + +//Test that all mandatory output pins have their mode correctly set to output +void test_initialisation_outputs_V04(void) +{ + configPage2.pinMapping = 3; //Set the board number to test + + initialiseAll(); //Run the main initialise function + + char msg[32]; + strcpy_P(msg, PSTR("Coil1")); + TEST_ASSERT_EQUAL_MESSAGE(OUTPUT, getPinMode(pinCoil1), msg); + strcpy_P(msg, PSTR("Coil2")); + TEST_ASSERT_EQUAL_MESSAGE(OUTPUT, getPinMode(pinCoil2), msg); + strcpy_P(msg, PSTR("Coil3")); + TEST_ASSERT_EQUAL_MESSAGE(OUTPUT, getPinMode(pinCoil3), msg); + strcpy_P(msg, PSTR("Coil4")); + TEST_ASSERT_EQUAL_MESSAGE(OUTPUT, getPinMode(pinCoil4), msg); + strcpy_P(msg, PSTR("Injector 1")); + TEST_ASSERT_EQUAL_MESSAGE(OUTPUT, getPinMode(pinInjector1), msg); + strcpy_P(msg, PSTR("Injector 2")); + TEST_ASSERT_EQUAL_MESSAGE(OUTPUT, getPinMode(pinInjector2), msg); + strcpy_P(msg, PSTR("Injector 3")); + TEST_ASSERT_EQUAL_MESSAGE(OUTPUT, getPinMode(pinInjector3), msg); + strcpy_P(msg, PSTR("Injector 4")); + TEST_ASSERT_EQUAL_MESSAGE(OUTPUT, getPinMode(pinInjector4), msg); + strcpy_P(msg, PSTR("Tacho Out")); + TEST_ASSERT_EQUAL_MESSAGE(OUTPUT, getPinMode(pinTachOut), msg); + strcpy_P(msg, PSTR("Fuel Pump")); + TEST_ASSERT_EQUAL_MESSAGE(OUTPUT, getPinMode(pinFuelPump), msg); + strcpy_P(msg, PSTR("Fan")); + TEST_ASSERT_EQUAL_MESSAGE(OUTPUT, getPinMode(pinFan), msg); + /* + if(isIdlePWM) + { + TEST_ASSERT_EQUAL_MESSAGE(OUTPUT, getPinMode(pinIdle1), "Idle 1"); + TEST_ASSERT_EQUAL_MESSAGE(OUTPUT, getPinMode(pinIdle2), "Idle 2"); + } + else if (isIdleStepper) + { + TEST_ASSERT_EQUAL_MESSAGE(OUTPUT, getPinMode(pinStepperDir), "Stepper Dir"); + TEST_ASSERT_EQUAL_MESSAGE(OUTPUT, getPinMode(pinStepperStep), "Stepper Step"); + TEST_ASSERT_EQUAL_MESSAGE(OUTPUT, getPinMode(pinStepperEnable), "Stepper Enable"); + } + + TEST_ASSERT_EQUAL_MESSAGE(OUTPUT, getPinMode(pinFan), "Fan"); + TEST_ASSERT_EQUAL_MESSAGE(OUTPUT, getPinMode(pinBoost), "Boost"); + TEST_ASSERT_EQUAL_MESSAGE(OUTPUT, getPinMode(pinVVT_1), "VVT1"); + TEST_ASSERT_EQUAL_MESSAGE(OUTPUT, getPinMode(pinVVT_2), "VVT2"); + */ + +} + +//Test that all mandatory output pins have their mode correctly set to output +void test_initialisation_outputs_MX5_8995(void) +{ + configPage2.pinMapping = 9; //Set the board number to test + initialiseAll(); //Run the main initialise function + + char msg[32]; + strcpy_P(msg, PSTR("Coil1")); + TEST_ASSERT_EQUAL_MESSAGE(OUTPUT, getPinMode(pinCoil1), msg); + strcpy_P(msg, PSTR("Coil2")); + TEST_ASSERT_EQUAL_MESSAGE(OUTPUT, getPinMode(pinCoil2), msg); + strcpy_P(msg, PSTR("Coil3")); + TEST_ASSERT_EQUAL_MESSAGE(OUTPUT, getPinMode(pinCoil3), msg); + strcpy_P(msg, PSTR("Coil4")); + TEST_ASSERT_EQUAL_MESSAGE(OUTPUT, getPinMode(pinCoil4), msg); + strcpy_P(msg, PSTR("Injector 1")); + TEST_ASSERT_EQUAL_MESSAGE(OUTPUT, getPinMode(pinInjector1), msg); + strcpy_P(msg, PSTR("Injector 2")); + TEST_ASSERT_EQUAL_MESSAGE(OUTPUT, getPinMode(pinInjector2), msg); + strcpy_P(msg, PSTR("Injector 3")); + TEST_ASSERT_EQUAL_MESSAGE(OUTPUT, getPinMode(pinInjector3), msg); + strcpy_P(msg, PSTR("Injector 4")); + TEST_ASSERT_EQUAL_MESSAGE(OUTPUT, getPinMode(pinInjector4), msg); + strcpy_P(msg, PSTR("Tacho Out")); + TEST_ASSERT_EQUAL_MESSAGE(OUTPUT, getPinMode(pinTachOut), msg); + strcpy_P(msg, PSTR("Fuel Pump")); + TEST_ASSERT_EQUAL_MESSAGE(OUTPUT, getPinMode(pinFuelPump), msg); + strcpy_P(msg, PSTR("Fan")); + TEST_ASSERT_EQUAL_MESSAGE(OUTPUT, getPinMode(pinFan), msg); +} + +void test_initialisation_outputs_PWM_idle(void) +{ + configPage2.pinMapping = 3; //Set the board number to test (v0.4) + //Force 2 channel PWM idle + configPage6.iacChannels = 1; + configPage6.iacAlgorithm = 2; + + initialiseAll(); //Run the main initialise function + + bool isIdlePWM = (configPage6.iacAlgorithm > 0) && ((configPage6.iacAlgorithm <= 3) || (configPage6.iacAlgorithm == 6)); + + char msg[32]; + strcpy_P(msg, PSTR("Is PWM Idle")); + TEST_ASSERT_TRUE_MESSAGE(isIdlePWM, msg); + strcpy_P(msg, PSTR("Idle 1")); + TEST_ASSERT_EQUAL_MESSAGE(OUTPUT, getPinMode(pinIdle1), msg); + strcpy_P(msg, PSTR("Idle 2")); + TEST_ASSERT_EQUAL_MESSAGE(OUTPUT, getPinMode(pinIdle2), msg); +} + +void test_initialisation_outputs_stepper_idle(void) +{ + bool isIdleStepper = (configPage6.iacAlgorithm > 3) && (configPage6.iacAlgorithm != 6); + + char msg[32]; + strcpy_P(msg, PSTR("Is Stepper Idle")); + TEST_ASSERT_TRUE_MESSAGE(isIdleStepper, msg); + strcpy_P(msg, PSTR("Stepper Dir")); + TEST_ASSERT_EQUAL_MESSAGE(OUTPUT, getPinMode(pinStepperDir), msg); + strcpy_P(msg, PSTR("Stepper Step")); + TEST_ASSERT_EQUAL_MESSAGE(OUTPUT, getPinMode(pinStepperStep), msg); + strcpy_P(msg, PSTR("Stepper Enable")); + TEST_ASSERT_EQUAL_MESSAGE(OUTPUT, getPinMode(pinStepperEnable), msg); +} + +void test_initialisation_outputs_boost(void) +{ + char msg[32]; + strcpy_P(msg, PSTR("Boost")); + TEST_ASSERT_EQUAL_MESSAGE(OUTPUT, getPinMode(pinBoost), msg); +} + +void test_initialisation_outputs_VVT(void) +{ + char msg[32]; + strcpy_P(msg, PSTR("VVT1")); + TEST_ASSERT_EQUAL_MESSAGE(OUTPUT, getPinMode(pinVVT_1), msg); + strcpy_P(msg, PSTR("VVT2")); + TEST_ASSERT_EQUAL_MESSAGE(OUTPUT, getPinMode(pinVVT_2), msg); +} + +void testInitialisation() +{ + RUN_TEST(test_initialisation_complete); + RUN_TEST(test_initialisation_ports); + RUN_TEST(test_initialisation_outputs_V03); + RUN_TEST(test_initialisation_outputs_V04); + RUN_TEST(test_initialisation_outputs_MX5_8995); + RUN_TEST(test_initialisation_outputs_PWM_idle); + RUN_TEST(test_initialisation_outputs_boost); + RUN_TEST(test_initialisation_outputs_VVT); +} \ No newline at end of file diff --git a/test/test_misc2/test_misc2.cpp b/test/test_math/main.cpp similarity index 100% rename from test/test_misc2/test_misc2.cpp rename to test/test_math/main.cpp diff --git a/test/test_misc2/tests_crankmaths.cpp b/test/test_math/tests_crankmaths.cpp similarity index 100% rename from test/test_misc2/tests_crankmaths.cpp rename to test/test_math/tests_crankmaths.cpp diff --git a/test/test_misc2/tests_crankmaths.h b/test/test_math/tests_crankmaths.h similarity index 100% rename from test/test_misc2/tests_crankmaths.h rename to test/test_math/tests_crankmaths.h diff --git a/test/test_misc2/tests_maths.cpp b/test/test_math/tests_maths.cpp similarity index 100% rename from test/test_misc2/tests_maths.cpp rename to test/test_math/tests_maths.cpp diff --git a/test/test_misc2/tests_maths.h b/test/test_math/tests_maths.h similarity index 100% rename from test/test_misc2/tests_maths.h rename to test/test_math/tests_maths.h diff --git a/test/test_misc/tests_init.cpp b/test/test_misc/tests_init.cpp deleted file mode 100644 index c2d68683..00000000 --- a/test/test_misc/tests_init.cpp +++ /dev/null @@ -1,181 +0,0 @@ -#include -#include "globals.h" -#include "init.h" -#include "tests_init.h" - - -void testInitialisation() -{ - RUN_TEST(test_initialisation_complete); - RUN_TEST(test_initialisation_ports); - RUN_TEST(test_initialisation_outputs_V03); - RUN_TEST(test_initialisation_outputs_V04); - RUN_TEST(test_initialisation_outputs_MX5_8995); - RUN_TEST(test_initialisation_outputs_PWM_idle); - RUN_TEST(test_initialisation_outputs_boost); - RUN_TEST(test_initialisation_outputs_VVT); -} - -void test_initialisation_complete(void) -{ - initialiseAll(); //Run the main initialise function - TEST_ASSERT_EQUAL(true, initialisationComplete); -} - -void test_initialisation_ports(void) -{ - //Test that all the port values have been set - initialiseAll(); //Run the main initialise function - TEST_ASSERT_NOT_EQUAL(0, inj1_pin_port); - TEST_ASSERT_NOT_EQUAL(0, inj2_pin_port); - TEST_ASSERT_NOT_EQUAL(0, inj3_pin_port); - TEST_ASSERT_NOT_EQUAL(0, inj4_pin_port); - TEST_ASSERT_NOT_EQUAL(0, ign1_pin_port); - TEST_ASSERT_NOT_EQUAL(0, ign2_pin_port); - TEST_ASSERT_NOT_EQUAL(0, ign3_pin_port); - TEST_ASSERT_NOT_EQUAL(0, ign4_pin_port); -} - -//Test that all mandatory output pins have their mode correctly set to output -void test_initialisation_outputs_V03(void) -{ - configPage2.pinMapping = 2; //Set the board number to test - initialiseAll(); //Run the main initialise function - - TEST_ASSERT_EQUAL_MESSAGE(OUTPUT, getPinMode(pinCoil1), "Coil1"); - TEST_ASSERT_EQUAL_MESSAGE(OUTPUT, getPinMode(pinCoil2), "Coil2"); - TEST_ASSERT_EQUAL_MESSAGE(OUTPUT, getPinMode(pinCoil3), "Coil3"); - TEST_ASSERT_EQUAL_MESSAGE(OUTPUT, getPinMode(pinCoil4), "Coil4"); - TEST_ASSERT_EQUAL_MESSAGE(OUTPUT, getPinMode(pinInjector1), "Injector 1"); - TEST_ASSERT_EQUAL_MESSAGE(OUTPUT, getPinMode(pinInjector2), "Injector 2"); - TEST_ASSERT_EQUAL_MESSAGE(OUTPUT, getPinMode(pinInjector3), "Injector 3"); - TEST_ASSERT_EQUAL_MESSAGE(OUTPUT, getPinMode(pinInjector4), "Injector 4"); - TEST_ASSERT_EQUAL_MESSAGE(OUTPUT, getPinMode(pinTachOut), "Tacho Out"); - TEST_ASSERT_EQUAL_MESSAGE(OUTPUT, getPinMode(pinFuelPump), "Fuel Pump"); - TEST_ASSERT_EQUAL_MESSAGE(OUTPUT, getPinMode(pinFan), "Fan"); - -} - -//Test that all mandatory output pins have their mode correctly set to output -void test_initialisation_outputs_V04(void) -{ - configPage2.pinMapping = 3; //Set the board number to test - - initialiseAll(); //Run the main initialise function - - TEST_ASSERT_EQUAL_MESSAGE(OUTPUT, getPinMode(pinCoil1), "Coil1"); - TEST_ASSERT_EQUAL_MESSAGE(OUTPUT, getPinMode(pinCoil2), "Coil2"); - TEST_ASSERT_EQUAL_MESSAGE(OUTPUT, getPinMode(pinCoil3), "Coil3"); - TEST_ASSERT_EQUAL_MESSAGE(OUTPUT, getPinMode(pinCoil4), "Coil4"); - TEST_ASSERT_EQUAL_MESSAGE(OUTPUT, getPinMode(pinInjector1), "Injector 1"); - TEST_ASSERT_EQUAL_MESSAGE(OUTPUT, getPinMode(pinInjector2), "Injector 2"); - TEST_ASSERT_EQUAL_MESSAGE(OUTPUT, getPinMode(pinInjector3), "Injector 3"); - TEST_ASSERT_EQUAL_MESSAGE(OUTPUT, getPinMode(pinInjector4), "Injector 4"); - TEST_ASSERT_EQUAL_MESSAGE(OUTPUT, getPinMode(pinTachOut), "Tacho Out"); - TEST_ASSERT_EQUAL_MESSAGE(OUTPUT, getPinMode(pinFuelPump), "Fuel Pump"); - /* - if(isIdlePWM) - { - TEST_ASSERT_EQUAL_MESSAGE(OUTPUT, getPinMode(pinIdle1), "Idle 1"); - TEST_ASSERT_EQUAL_MESSAGE(OUTPUT, getPinMode(pinIdle2), "Idle 2"); - } - else if (isIdleStepper) - { - TEST_ASSERT_EQUAL_MESSAGE(OUTPUT, getPinMode(pinStepperDir), "Stepper Dir"); - TEST_ASSERT_EQUAL_MESSAGE(OUTPUT, getPinMode(pinStepperStep), "Stepper Step"); - TEST_ASSERT_EQUAL_MESSAGE(OUTPUT, getPinMode(pinStepperEnable), "Stepper Enable"); - } - - TEST_ASSERT_EQUAL_MESSAGE(OUTPUT, getPinMode(pinFan), "Fan"); - TEST_ASSERT_EQUAL_MESSAGE(OUTPUT, getPinMode(pinBoost), "Boost"); - TEST_ASSERT_EQUAL_MESSAGE(OUTPUT, getPinMode(pinVVT_1), "VVT1"); - TEST_ASSERT_EQUAL_MESSAGE(OUTPUT, getPinMode(pinVVT_2), "VVT2"); - */ - -} - -//Test that all mandatory output pins have their mode correctly set to output -void test_initialisation_outputs_MX5_8995(void) -{ - configPage2.pinMapping = 9; //Set the board number to test - initialiseAll(); //Run the main initialise function - - TEST_ASSERT_EQUAL_MESSAGE(OUTPUT, getPinMode(pinCoil1), "Coil1"); - TEST_ASSERT_EQUAL_MESSAGE(OUTPUT, getPinMode(pinCoil2), "Coil2"); - TEST_ASSERT_EQUAL_MESSAGE(OUTPUT, getPinMode(pinCoil3), "Coil3"); - TEST_ASSERT_EQUAL_MESSAGE(OUTPUT, getPinMode(pinCoil4), "Coil4"); - TEST_ASSERT_EQUAL_MESSAGE(OUTPUT, getPinMode(pinInjector1), "Injector 1"); - TEST_ASSERT_EQUAL_MESSAGE(OUTPUT, getPinMode(pinInjector2), "Injector 2"); - TEST_ASSERT_EQUAL_MESSAGE(OUTPUT, getPinMode(pinInjector3), "Injector 3"); - TEST_ASSERT_EQUAL_MESSAGE(OUTPUT, getPinMode(pinInjector4), "Injector 4"); - TEST_ASSERT_EQUAL_MESSAGE(OUTPUT, getPinMode(pinTachOut), "Tacho Out"); - TEST_ASSERT_EQUAL_MESSAGE(OUTPUT, getPinMode(pinFuelPump), "Fuel Pump"); - TEST_ASSERT_EQUAL_MESSAGE(OUTPUT, getPinMode(pinFan), "Fan"); -} - -void test_initialisation_outputs_PWM_idle(void) -{ - configPage2.pinMapping = 3; //Set the board number to test (v0.4) - //Force 2 channel PWM idle - configPage6.iacChannels = 1; - configPage6.iacAlgorithm = 2; - - initialiseAll(); //Run the main initialise function - - bool isIdlePWM = (configPage6.iacAlgorithm > 0) && ((configPage6.iacAlgorithm <= 3) || (configPage6.iacAlgorithm == 6)); - - TEST_ASSERT_TRUE_MESSAGE(isIdlePWM, "Is PWM Idle"); - TEST_ASSERT_EQUAL_MESSAGE(OUTPUT, getPinMode(pinIdle1), "Idle 1"); - TEST_ASSERT_EQUAL_MESSAGE(OUTPUT, getPinMode(pinIdle2), "Idle 2"); -} - -void test_initialisation_outputs_stepper_idle(void) -{ - bool isIdleStepper = (configPage6.iacAlgorithm > 3) && (configPage6.iacAlgorithm != 6); - - TEST_ASSERT_TRUE_MESSAGE(isIdleStepper, "Is Stepper Idle"); - TEST_ASSERT_EQUAL_MESSAGE(OUTPUT, getPinMode(pinStepperDir), "Stepper Dir"); - TEST_ASSERT_EQUAL_MESSAGE(OUTPUT, getPinMode(pinStepperStep), "Stepper Step"); - TEST_ASSERT_EQUAL_MESSAGE(OUTPUT, getPinMode(pinStepperEnable), "Stepper Enable"); -} - -void test_initialisation_outputs_boost(void) -{ - TEST_ASSERT_EQUAL_MESSAGE(OUTPUT, getPinMode(pinBoost), "Boost"); -} - -void test_initialisation_outputs_VVT(void) -{ - TEST_ASSERT_EQUAL_MESSAGE(OUTPUT, getPinMode(pinVVT_1), "VVT1"); - TEST_ASSERT_EQUAL_MESSAGE(OUTPUT, getPinMode(pinVVT_2), "VVT2"); -} - -#if !defined(NOT_A_PIN) -#define NOT_A_PIN 0 -#endif - -uint8_t getPinMode(uint8_t pin) -{ - uint8_t bit = digitalPinToBitMask(pin); - uint8_t port = digitalPinToPort(pin); - - // I don't see an option for mega to return this, but whatever... - if (NOT_A_PIN == port) return UNKNOWN_PIN; - - // Is there a bit we can check? - if (0 == bit) return UNKNOWN_PIN; - - // Is there only a single bit set? - if (bit & (bit - 1)) return UNKNOWN_PIN; - - volatile uint8_t *reg, *out; - reg = portModeRegister(port); - out = portOutputRegister(port); - - if (*reg & bit) - return OUTPUT; - else if (*out & bit) - return INPUT_PULLUP; - else - return INPUT; -} \ No newline at end of file diff --git a/test/test_misc/tests_init.h b/test/test_misc/tests_init.h deleted file mode 100644 index 84501523..00000000 --- a/test/test_misc/tests_init.h +++ /dev/null @@ -1,13 +0,0 @@ -#define UNKNOWN_PIN 0xFF - -extern void testInitialisation(); -void test_initialisation_complete(void); -void test_initialisation_ports(void); -void test_initialisation_outputs_V03(void); -void test_initialisation_outputs_V04(void); -void test_initialisation_outputs_MX5_8995(void); -void test_initialisation_outputs_PWM_idle(void); -void test_initialisation_outputs_stepper_idle(void); -void test_initialisation_outputs_boost(void); -void test_initialisation_outputs_VVT(void); -uint8_t getPinMode(uint8_t); \ No newline at end of file diff --git a/test/test_misc/tests_misc.cpp b/test/test_tables/main.cpp similarity index 91% rename from test/test_misc/tests_misc.cpp rename to test/test_tables/main.cpp index c8012e6a..560e4a88 100644 --- a/test/test_misc/tests_misc.cpp +++ b/test/test_tables/main.cpp @@ -1,7 +1,6 @@ #include #include -#include "tests_init.h" #include "tests_tables.h" #include "test_table2d.h" @@ -17,7 +16,6 @@ void setup() UNITY_BEGIN(); // IMPORTANT LINE! - testInitialisation(); testTables(); testTable2d(); diff --git a/test/test_misc/test_table2d.cpp b/test/test_tables/test_table2d.cpp similarity index 100% rename from test/test_misc/test_table2d.cpp rename to test/test_tables/test_table2d.cpp diff --git a/test/test_misc/test_table2d.h b/test/test_tables/test_table2d.h similarity index 100% rename from test/test_misc/test_table2d.h rename to test/test_tables/test_table2d.h diff --git a/test/test_misc/tests_tables.cpp b/test/test_tables/tests_tables.cpp similarity index 100% rename from test/test_misc/tests_tables.cpp rename to test/test_tables/tests_tables.cpp diff --git a/test/test_misc/tests_tables.h b/test/test_tables/tests_tables.h similarity index 100% rename from test/test_misc/tests_tables.h rename to test/test_tables/tests_tables.h