From 1d456c7ad776f8743dab24ec2f0375589b784135 Mon Sep 17 00:00:00 2001 From: Bruno Bousquet Date: Wed, 29 Jan 2020 20:38:11 -0500 Subject: [PATCH 1/4] fix CRANK_ANGLE_MAX_INJ always 360 (#313) --- speeduino/init.ino | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/speeduino/init.ino b/speeduino/init.ino index 718309bf..a0bf3ccb 100644 --- a/speeduino/init.ino +++ b/speeduino/init.ino @@ -331,8 +331,6 @@ void initialiseAll() currentStatus.nSquirts = configPage2.nCylinders / configPage2.divider; //The number of squirts being requested. This is manaully overriden below for sequential setups (Due to TS req_fuel calc limitations) if(currentStatus.nSquirts == 0) { currentStatus.nSquirts = 1; } //Safety check. Should never happen as TS will give an error, but leave incase tune is manually altered etc. - if(configPage2.strokes == FOUR_STROKE) { CRANK_ANGLE_MAX_INJ = 720 / currentStatus.nSquirts; } - else { CRANK_ANGLE_MAX_INJ = 360 / currentStatus.nSquirts; } //Calculate the number of degrees between cylinders //Swet some default values. These will be updated below if required. @@ -354,6 +352,9 @@ void initialiseAll() ignition4EndAngle = 0; ignition5EndAngle = 0; + if(configPage2.strokes == FOUR_STROKE) { CRANK_ANGLE_MAX_INJ = 720 / currentStatus.nSquirts; } + else { CRANK_ANGLE_MAX_INJ = 360 / currentStatus.nSquirts; } + switch (configPage2.nCylinders) { case 1: channel1IgnDegrees = 0; From 68f2288dd7e2c5f21a4dc7c8e97d3f94bc308e83 Mon Sep 17 00:00:00 2001 From: Bruno Bousquet Date: Thu, 30 Jan 2020 00:17:20 -0500 Subject: [PATCH 2/4] add schedule test (#312) add temp test file to gitignore improve schedule testing add check for schedule delays and pending variants move time sampling to callback methods add comments and improve pending tests --- .gitignore | 1 + platformio.ini | 1 - speeduino/scheduler.h | 32 +++---- speeduino/scheduler.ino | 17 ++++ test/tests_main.cpp | 4 +- test/tests_schedules.cpp | 202 +++++++++++++++++++++++++++++++++++++++ test/tests_schedules.h | 1 + 7 files changed, 240 insertions(+), 18 deletions(-) create mode 100644 test/tests_schedules.cpp create mode 100644 test/tests_schedules.h diff --git a/.gitignore b/.gitignore index b95dcaad..1769ffe9 100644 --- a/.gitignore +++ b/.gitignore @@ -24,3 +24,4 @@ reference/hardware/v0.4/gerbers/Archive.zip speeduino/board_samd21* reference/doxygen speeduino.ino.cpp +test/output_export.cpp diff --git a/platformio.ini b/platformio.ini index 9b48d1e7..c1fc2e7e 100644 --- a/platformio.ini +++ b/platformio.ini @@ -111,6 +111,5 @@ default_envs = megaatmega2560 ;env_default = LaunchPad_tm4c1294ncpdt ;env_default = genericSTM32F103RB ;env_default = bluepill_f103c8 -monitor_speed = 115200 diff --git a/speeduino/scheduler.h b/speeduino/scheduler.h index bf0529b8..ec2fb3c5 100644 --- a/speeduino/scheduler.h +++ b/speeduino/scheduler.h @@ -128,23 +128,23 @@ struct FuelSchedule { //Schedule *timer3Bqueue[4]; //Schedule *timer3Cqueue[4]; -FuelSchedule fuelSchedule1; -FuelSchedule fuelSchedule2; -FuelSchedule fuelSchedule3; -FuelSchedule fuelSchedule4; -FuelSchedule fuelSchedule5; -FuelSchedule fuelSchedule6; -FuelSchedule fuelSchedule7; -FuelSchedule fuelSchedule8; +extern FuelSchedule fuelSchedule1; +extern FuelSchedule fuelSchedule2; +extern FuelSchedule fuelSchedule3; +extern FuelSchedule fuelSchedule4; +extern FuelSchedule fuelSchedule5; +extern FuelSchedule fuelSchedule6; +extern FuelSchedule fuelSchedule7; +extern FuelSchedule fuelSchedule8; -Schedule ignitionSchedule1; -Schedule ignitionSchedule2; -Schedule ignitionSchedule3; -Schedule ignitionSchedule4; -Schedule ignitionSchedule5; -Schedule ignitionSchedule6; -Schedule ignitionSchedule7; -Schedule ignitionSchedule8; +extern Schedule ignitionSchedule1; +extern Schedule ignitionSchedule2; +extern Schedule ignitionSchedule3; +extern Schedule ignitionSchedule4; +extern Schedule ignitionSchedule5; +extern Schedule ignitionSchedule6; +extern Schedule ignitionSchedule7; +extern Schedule ignitionSchedule8; //IgnitionSchedule nullSchedule; //This is placed at the end of the queue. It's status will always be set to OFF and hence will never perform any action within an ISR diff --git a/speeduino/scheduler.ino b/speeduino/scheduler.ino index 13d3bff2..b5730afe 100644 --- a/speeduino/scheduler.ino +++ b/speeduino/scheduler.ino @@ -8,6 +8,23 @@ A full copy of the license may be found in the projects root directory #include "scheduler.h" #include "scheduledIO.h" +FuelSchedule fuelSchedule1; +FuelSchedule fuelSchedule2; +FuelSchedule fuelSchedule3; +FuelSchedule fuelSchedule4; +FuelSchedule fuelSchedule5; +FuelSchedule fuelSchedule6; +FuelSchedule fuelSchedule7; +FuelSchedule fuelSchedule8; + +Schedule ignitionSchedule1; +Schedule ignitionSchedule2; +Schedule ignitionSchedule3; +Schedule ignitionSchedule4; +Schedule ignitionSchedule5; +Schedule ignitionSchedule6; +Schedule ignitionSchedule7; +Schedule ignitionSchedule8; void initialiseSchedulers() { diff --git a/test/tests_main.cpp b/test/tests_main.cpp index 8245e1d0..dc644579 100644 --- a/test/tests_main.cpp +++ b/test/tests_main.cpp @@ -1,8 +1,9 @@ #include +#include #include "tests_corrections.h" #include "tests_init.h" -#include +#include "tests_schedules.h" void setup() { // NOTE!!! Wait for >2 secs @@ -22,6 +23,7 @@ void loop() { testInitialisation(); testCorrections(); + testSchedules(); UNITY_END(); // stop unit testing } \ No newline at end of file diff --git a/test/tests_schedules.cpp b/test/tests_schedules.cpp new file mode 100644 index 00000000..680400fa --- /dev/null +++ b/test/tests_schedules.cpp @@ -0,0 +1,202 @@ +#include +#include +#include +#include "tests_schedules.h" +#include "scheduler.h" + + +/* **************************************************************************** + * Static functions + * ***************************************************************************/ + +static void test_schedule_fuel_time(void); +static void test_schedule_fuel_pending(void); +static void test_schedule_ignition_time(void); +static void test_schedule_ignition_pending(void); + +static uint32_t beginTime, endTime; +static void beginCallback(void) { beginTime = micros(); } +static void endCallback(void) { endTime = micros(); } + + +/* **************************************************************************** + * Global variables + * ***************************************************************************/ + +static FuelSchedule* fuelSchedule[] = { + &fuelSchedule1, + &fuelSchedule2, + &fuelSchedule3, + &fuelSchedule4, + &fuelSchedule5, + &fuelSchedule6, + &fuelSchedule7, + &fuelSchedule8, +}; + +static Schedule* ignitionSchedule[] = { + &ignitionSchedule1, + &ignitionSchedule2, + &ignitionSchedule3, + &ignitionSchedule4, + &ignitionSchedule5, + &ignitionSchedule6, + &ignitionSchedule7, + &ignitionSchedule8, +}; + +void (*setFuelSchedule[])(unsigned long, unsigned long) = { + setFuelSchedule1, + setFuelSchedule2, + setFuelSchedule3, + setFuelSchedule4, +#if INJ_CHANNELS >= 5 + setFuelSchedule5, +#endif +#if INJ_CHANNELS >= 6 + setFuelSchedule6, +#endif +#if INJ_CHANNELS >= 7 + setFuelSchedule7, +#endif +#if INJ_CHANNELS >= 8 + setFuelSchedule8, +#endif +}; + +void (*setIgnitionSchedule[])(void (*)(), unsigned long, unsigned long, void (*)()) = { + setIgnitionSchedule1, + setIgnitionSchedule2, + setIgnitionSchedule3, + setIgnitionSchedule4, +#if IGN_CHANNELS >= 5 + setIgnitionSchedule5, +#endif +#if IGN_CHANNELS >= 6 + setIgnitionSchedule6, +#endif +#if IGN_CHANNELS >= 7 + setIgnitionSchedule7, +#endif +#if IGN_CHANNELS >= 8 + setIgnitionSchedule8, +#endif +}; + + +/* **************************************************************************** + * Test Main + * ***************************************************************************/ + +void testSchedules() +{ + RUN_TEST(test_schedule_fuel_time); + RUN_TEST(test_schedule_fuel_pending); + RUN_TEST(test_schedule_ignition_time); + RUN_TEST(test_schedule_ignition_pending); +} + + +/* **************************************************************************** + * Test Functions + * ***************************************************************************/ + +static void test_schedule_fuel_time(void) +{ + TEST_ASSERT_EQUAL(true, initialisationComplete); + + for(int i = 0; i < INJ_CHANNELS; i++) + { + TEST_ASSERT_EQUAL(OFF, fuelSchedule[i]->Status); + + uint32_t time1 = micros(); + setFuelSchedule[i](1000, 1000); + TEST_ASSERT_EQUAL(PENDING, fuelSchedule[i]->Status); + + while(fuelSchedule[i]->Status == PENDING); // wait + uint32_t time2 = micros(); + TEST_ASSERT_EQUAL(RUNNING, fuelSchedule[i]->Status); + + while(fuelSchedule[i]->Status == RUNNING); // wait + uint32_t time3 = micros(); + TEST_ASSERT_EQUAL(OFF, fuelSchedule[i]->Status); + + TEST_ASSERT_EQUAL(1016, time2 - time1); + TEST_ASSERT_EQUAL(1008, time3 - time2); + } +} + +static void test_schedule_fuel_pending(void) +{ + TEST_ASSERT_EQUAL(true, initialisationComplete); + + for(int i = 0; i < INJ_CHANNELS; i++) + { + TEST_ASSERT_EQUAL(OFF, fuelSchedule[i]->Status); + + setFuelSchedule[i](1000, 1000); + TEST_ASSERT_EQUAL(PENDING, fuelSchedule[i]->Status); + + while(fuelSchedule[i]->Status == PENDING); // wait + TEST_ASSERT_EQUAL(RUNNING, fuelSchedule[i]->Status); + setFuelSchedule[i](1500, 500); // Once running, set another schedule + + while(fuelSchedule[i]->Status == RUNNING); // wait + TEST_ASSERT_EQUAL(PENDING, fuelSchedule[i]->Status); + + while(fuelSchedule[i]->Status == PENDING); // wait + TEST_ASSERT_EQUAL(RUNNING, fuelSchedule[i]->Status); + + while(fuelSchedule[i]->Status == RUNNING); // wait + TEST_ASSERT_EQUAL(OFF, fuelSchedule[i]->Status); + } +} + +static void test_schedule_ignition_time(void) +{ + TEST_ASSERT_EQUAL(true, initialisationComplete); + + for(int i = 0; i < IGN_CHANNELS; i++) + { + TEST_ASSERT_EQUAL(OFF, ignitionSchedule[i]->Status); + + uint32_t time1 = micros(); + setIgnitionSchedule[i](beginCallback, 1000, 1000, endCallback); + TEST_ASSERT_EQUAL(PENDING, ignitionSchedule[i]->Status); + + while(ignitionSchedule[i]->Status == PENDING); // wait + TEST_ASSERT_EQUAL(RUNNING, ignitionSchedule[i]->Status); + + while(ignitionSchedule[i]->Status == RUNNING); // wait + TEST_ASSERT_EQUAL(OFF, ignitionSchedule[i]->Status); + + TEST_ASSERT_EQUAL(1012, beginTime - time1); + TEST_ASSERT_EQUAL(1012, endTime - beginTime); + } +} + +static void test_schedule_ignition_pending(void) +{ + TEST_ASSERT_EQUAL(true, initialisationComplete); + + for(int i = 0; i < IGN_CHANNELS; i++) + { + TEST_ASSERT_EQUAL(OFF, ignitionSchedule[i]->Status); + + setIgnitionSchedule[i](beginCallback, 1000, 1000, endCallback); + TEST_ASSERT_EQUAL(PENDING, ignitionSchedule[i]->Status); + + while(ignitionSchedule[i]->Status == PENDING); // wait + TEST_ASSERT_EQUAL(RUNNING, ignitionSchedule[i]->Status); + setIgnitionSchedule[i](beginCallback, 1500, 500, endCallback); // Once running, set another schedule + + while(ignitionSchedule[i]->Status == RUNNING); // wait + TEST_ASSERT_EQUAL(PENDING, ignitionSchedule[i]->Status); + + while(ignitionSchedule[i]->Status == PENDING); // wait + TEST_ASSERT_EQUAL(RUNNING, ignitionSchedule[i]->Status); + + while(ignitionSchedule[i]->Status == RUNNING); // wait + TEST_ASSERT_EQUAL(OFF, ignitionSchedule[i]->Status); + } +} \ No newline at end of file diff --git a/test/tests_schedules.h b/test/tests_schedules.h new file mode 100644 index 00000000..fe8c0519 --- /dev/null +++ b/test/tests_schedules.h @@ -0,0 +1 @@ +void testSchedules(); \ No newline at end of file From b3d7c9df9f865438831ba79a0d462f04c41d926e Mon Sep 17 00:00:00 2001 From: Josh Stewart Date: Thu, 30 Jan 2020 23:48:11 +1100 Subject: [PATCH 3/4] Better way of determining whether a commit is a PR --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 568a9984..38833838 100644 --- a/.travis.yml +++ b/.travis.yml @@ -61,7 +61,7 @@ script: - platformio run -e teensy35 -e teensy40 -e megaatmega2560 # The uploading of the firmware and doxygen files are only performed on the master branch - | - if [ "$TRAVIS_BRANCH" == "master" ]; then + if [ "$TRAVIS_PULL_REQUEST" == "false" ]; then # Upload ini and hex files to speeduino.com server curl -v https://speeduino.com:2078 || true curl -v --tlsv1.2 --ipv4 --user "speeduino_firmware@speeduino.com:$WEB_PWD" --basic -T "./.pio/build/megaatmega2560/firmware.hex" "https://speeduino.com:2078/bin/master.hex" From dad5694db68183835fd24d2e17ba08f8f3c695e1 Mon Sep 17 00:00:00 2001 From: iLeeeZi Date: Sat, 1 Feb 2020 04:17:33 +0200 Subject: [PATCH 4/4] fix 3 and 5 cylinder ignition --- speeduino/speeduino.ino | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/speeduino/speeduino.ino b/speeduino/speeduino.ino index 646d8eaf..3d344754 100644 --- a/speeduino/speeduino.ino +++ b/speeduino/speeduino.ino @@ -687,7 +687,7 @@ void loop() ignition3EndAngle = channel3IgnDegrees - currentStatus.advance; if(ignition3EndAngle > CRANK_ANGLE_MAX_IGN) {ignition3EndAngle -= CRANK_ANGLE_MAX_IGN;} - ignition3StartAngle = channel3IgnDegrees - dwellAngle; + ignition3StartAngle = ignition3EndAngle - dwellAngle; if(ignition3StartAngle < 0) {ignition3StartAngle += CRANK_ANGLE_MAX_IGN;} break; //4 cylinders @@ -744,7 +744,7 @@ void loop() ignition4StartAngle = ignition4EndAngle - dwellAngle; if(ignition4StartAngle < 0) {ignition4StartAngle += CRANK_ANGLE_MAX_IGN;} - ignition5EndAngle = channel5IgnDegrees - currentStatus.advance - dwellAngle; + ignition5EndAngle = channel5IgnDegrees - currentStatus.advance; if(ignition5EndAngle > CRANK_ANGLE_MAX_IGN) {ignition5EndAngle -= CRANK_ANGLE_MAX_IGN;} ignition5StartAngle = ignition5EndAngle - dwellAngle; if(ignition5StartAngle < 0) {ignition5StartAngle += CRANK_ANGLE_MAX_IGN;}