rusefi/unit_tests/tests/test_pwm_generator.cpp

152 lines
4.7 KiB
C++

/*
* test_pwm_generator.cpp
*
* @date Dec 8, 2018
* @author Andrey Belomutskiy, (c) 2012-2020
*/
#include "pch.h"
#define LOW_VALUE 0
#define HIGH_VALUE 1
static int expectedTimeOfNextEvent;
static void assertNextEvent(const char *msg, int expectedPinState, TestExecutor *executor, OutputPin& pin) {
printf("PWM_test: Asserting event [%s]\r\n", msg);
// only one action expected in queue
ASSERT_EQ( 1, executor->size()) << "PWM_test: schedulingQueue size";
// move time to next event timestamp
setTimeNowUs(expectedTimeOfNextEvent);
// execute pending actions and assert that only one action was executed
ASSERT_EQ(1, executor->executeAll(getTimeNowUs())) << msg << " executed";
ASSERT_EQ(expectedPinState, pin.currentLogicValue) << msg << " pin state";
// assert that we have one new action in queue
ASSERT_EQ(1, executor->size()) << "PWM_test: queue.size";
}
static void test100dutyCycle() {
printf("*************************************** test100dutyCycle\r\n");
expectedTimeOfNextEvent = 0;
setTimeNowUs(0);
OutputPin pin;
SimplePwm pwm("test PWM1");
TestExecutor executor;
startSimplePwm(&pwm, "unit_test",
&executor,
&pin,
1000 /* frequency */,
1.0 /* duty cycle */);
expectedTimeOfNextEvent += 1000;
ASSERT_EQ(expectedTimeOfNextEvent, executor.getForUnitTest(0)->getMomentUs()) << "1@1000/100";
assertNextEvent("exec@100", HIGH_VALUE, &executor, pin);
expectedTimeOfNextEvent += 1000;
assertNextEvent("exec2@100", HIGH_VALUE, &executor, pin);
expectedTimeOfNextEvent += 1000;
assertNextEvent("exec3@100", HIGH_VALUE, &executor, pin);
}
static void testSwitchToNanPeriod() {
printf("*************************************** testSwitchToNanPeriod\r\n");
expectedTimeOfNextEvent = 0;
setTimeNowUs(0);
OutputPin pin;
SimplePwm pwm("test PWM1");
TestExecutor executor;
startSimplePwm(&pwm, "unit_test",
&executor,
&pin,
1000 /* frequency */,
0.60 /* duty cycle */);
expectedTimeOfNextEvent += 600;
ASSERT_EQ(expectedTimeOfNextEvent, executor.getForUnitTest(0)->getMomentUs()) << "1@1000/70";
assertNextEvent("exec@70", LOW_VALUE, &executor, pin);
ASSERT_EQ(600, getTimeNowUs()) << "time1";
expectedTimeOfNextEvent += 400;
assertNextEvent("exec2@70", HIGH_VALUE, &executor, pin);
pwm.setFrequency(NAN);
expectedTimeOfNextEvent += 600;
ASSERT_EQ(expectedTimeOfNextEvent, executor.getForUnitTest(0)->getMomentUs()) << "1@1000/NAN";
assertNextEvent("exec2@NAN", LOW_VALUE, &executor, pin);
expectedTimeOfNextEvent += MS2US(NAN_FREQUENCY_SLEEP_PERIOD_MS);
ASSERT_EQ(expectedTimeOfNextEvent, executor.getForUnitTest(0)->getMomentUs()) << "2@1000/NAN";
assertNextEvent("exec3@NAN", LOW_VALUE, &executor, pin);
}
TEST(PWM, testPwmGenerator) {
test100dutyCycle();
testSwitchToNanPeriod();
expectedTimeOfNextEvent = 0;
setTimeNowUs(0);
OutputPin pin;
SimplePwm pwm("test PWM3");
TestExecutor executor;
startSimplePwm(&pwm,
"unit_test",
&executor,
&pin,
1000 /* frequency */,
0.80 /* duty cycle */);
expectedTimeOfNextEvent += 800;
ASSERT_EQ(expectedTimeOfNextEvent, executor.getForUnitTest(0)->getMomentUs()) << "1@1000/80";
assertNextEvent("exec@0", LOW_VALUE, &executor, pin);
ASSERT_EQ(800, getTimeNowUs()) << "time1";
expectedTimeOfNextEvent += 200;
ASSERT_EQ(expectedTimeOfNextEvent, executor.getForUnitTest(0)->getMomentUs()) << "2@1000/80";
// above we had vanilla duty cycle, now let's handle a special case
pwm.setSimplePwmDutyCycle(0);
ASSERT_EQ(expectedTimeOfNextEvent, executor.getForUnitTest(0)->getMomentUs()) << "2@1000/0";
assertNextEvent("exec@1", LOW_VALUE, &executor, pin);
ASSERT_EQ(1000, getTimeNowUs()) << "time2";
expectedTimeOfNextEvent += 1000;
ASSERT_EQ(expectedTimeOfNextEvent, executor.getForUnitTest(0)->getMomentUs()) << "3@1000/0";
assertNextEvent("exec@2", LOW_VALUE /* pin value */, &executor, pin);
ASSERT_EQ(2000, getTimeNowUs()) << "time3";
expectedTimeOfNextEvent += 1000;
ASSERT_EQ(expectedTimeOfNextEvent, executor.getForUnitTest(0)->getMomentUs()) << "4@1000/0";
assertNextEvent("exec@3", LOW_VALUE /* pin value */, &executor, pin);
ASSERT_EQ(3000, getTimeNowUs()) << "time4";
expectedTimeOfNextEvent += 1000;
ASSERT_EQ(expectedTimeOfNextEvent, executor.getForUnitTest(0)->getMomentUs()) << "5@1000/0";
assertNextEvent("exec@4", LOW_VALUE /* pin value */, &executor, pin);
expectedTimeOfNextEvent += 1000;
ASSERT_EQ(expectedTimeOfNextEvent, executor.getForUnitTest(0)->getMomentUs()) << "6@1000/0";
assertNextEvent("exec@5", LOW_VALUE /* pin value */, &executor, pin);
expectedTimeOfNextEvent += 1000;
ASSERT_EQ(5000, getTimeNowUs()) << "time4";
ASSERT_EQ(expectedTimeOfNextEvent, executor.getForUnitTest(0)->getMomentUs()) << "7@1000/0";
assertNextEvent("exec@6", LOW_VALUE /* pin value */, &executor, pin);
}