rusefi-1/firmware/controllers/bench_test.cpp

336 lines
9.0 KiB
C++
Raw Normal View History

2015-07-10 06:01:56 -07:00
/**
* @file bench_test.cpp
* @brief Utility methods related to bench testing.
2015-07-10 06:01:56 -07:00
*
*
* @date Sep 8, 2013
2020-01-13 18:57:43 -08:00
* @author Andrey Belomutskiy, (c) 2012-2020
2015-07-10 06:01:56 -07:00
*
* This file is part of rusEfi - see http://rusefi.com
*
* rusEfi is free software; you can redistribute it and/or modify it under the terms of
* the GNU General Public License as published by the Free Software Foundation; either
* version 3 of the License, or (at your option) any later version.
*
* rusEfi is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
* even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with this program.
* If not, see <http://www.gnu.org/licenses/>.
*/
// todo: rename this file
2018-09-16 19:26:57 -07:00
#include "global.h"
2015-07-10 06:01:56 -07:00
2019-04-12 19:07:03 -07:00
#if EFI_ENGINE_CONTROL
#if !EFI_UNIT_TEST
2015-07-10 06:01:56 -07:00
#include "flash_main.h"
#include "bench_test.h"
2015-07-10 06:01:56 -07:00
#include "io_pins.h"
#include "main_trigger_callback.h"
#include "engine_configuration.h"
#include "pin_repository.h"
2019-03-29 06:11:13 -07:00
#include "efi_gpio.h"
2017-07-25 19:00:39 -07:00
#include "settings.h"
2019-01-13 16:41:39 -08:00
#include "idle_thread.h"
#include "periodic_thread_controller.h"
2019-04-29 22:21:09 -07:00
#include "tps.h"
2020-03-24 16:50:04 -07:00
#include "cj125.h"
#include "malfunction_central.h"
2019-09-05 07:30:27 -07:00
#if EFI_PROD_CODE
#include "rusefi.h"
2019-08-03 16:58:38 -07:00
#include "mpu_util.h"
#endif /* EFI_PROD_CODE */
2015-07-10 06:01:56 -07:00
2019-09-05 07:30:27 -07:00
#if (BOARD_TLE8888_COUNT > 0)
#include "gpio/tle8888.h"
#endif
EXTERN_ENGINE;
2015-07-10 06:01:56 -07:00
2016-03-14 20:01:43 -07:00
static Logging * logger;
2016-01-11 14:01:33 -08:00
static bool isRunningBench = false;
2015-07-10 06:01:56 -07:00
2016-01-11 14:01:33 -08:00
bool isRunningBenchTest(void) {
2015-07-10 06:01:56 -07:00
return isRunningBench;
}
static void runBench(brain_pin_e brainPin, OutputPin *output, float delayMs, float onTimeMs, float offTimeMs,
int count) {
2019-01-28 17:00:17 -08:00
int delaySt = delayMs < 1 ? 1 : TIME_MS2I(delayMs);
int onTimeSt = onTimeMs < 1 ? 1 : TIME_MS2I(onTimeMs);
int offTimeSt = offTimeMs < 1 ? 1 : TIME_MS2I(offTimeMs);
2015-07-10 06:01:56 -07:00
if (delaySt < 0) {
2018-01-23 09:05:14 -08:00
scheduleMsg(logger, "Invalid delay %.2f", delayMs);
2015-07-10 06:01:56 -07:00
return;
}
if (onTimeSt <= 0) {
2018-01-23 09:05:14 -08:00
scheduleMsg(logger, "Invalid onTime %.2f", onTimeMs);
2015-07-10 06:01:56 -07:00
return;
}
if (offTimeSt <= 0) {
2018-01-23 09:05:14 -08:00
scheduleMsg(logger, "Invalid offTime %.2f", offTimeMs);
2015-07-10 06:01:56 -07:00
return;
}
2018-01-23 09:05:14 -08:00
scheduleMsg(logger, "Running bench: ON_TIME=%.2f ms OFF_TIME=%.2fms Counter=%d", onTimeMs, offTimeMs, count);
2016-03-14 20:01:43 -07:00
scheduleMsg(logger, "output on %s", hwPortname(brainPin));
2015-07-10 06:01:56 -07:00
if (delaySt != 0) {
chThdSleep(delaySt);
}
isRunningBench = true;
for (int i = 0; i < count; i++) {
output->setValue(true);
chThdSleep(onTimeSt);
output->setValue(false);
chThdSleep(offTimeSt);
}
2016-03-14 20:01:43 -07:00
scheduleMsg(logger, "Done!");
2015-07-10 06:01:56 -07:00
isRunningBench = false;
}
2017-07-24 16:38:00 -07:00
static volatile bool isBenchTestPending = false;
2015-07-10 06:01:56 -07:00
static float onTime;
static float offTime;
static float delayMs;
static int count;
static brain_pin_e brainPin;
static OutputPin* pinX;
static void pinbench(const char *delayStr, const char *onTimeStr, const char *offTimeStr, const char *countStr,
OutputPin* pinParam, brain_pin_e brainPinParam) {
delayMs = atoff(delayStr);
onTime = atoff(onTimeStr);
offTime = atoff(offTimeStr);
count = atoi(countStr);
brainPin = brainPinParam;
pinX = pinParam;
2017-07-24 17:40:01 -07:00
isBenchTestPending = true; // let's signal bench thread to wake up
2015-07-10 06:01:56 -07:00
}
2016-03-14 21:01:37 -07:00
static void doRunFuel(int humanIndex, const char *delayStr, const char * onTimeStr, const char *offTimeStr,
const char *countStr) {
if (humanIndex < 1 || humanIndex > engineConfiguration->specs.cylindersCount) {
scheduleMsg(logger, "Invalid index: %d", humanIndex);
return;
}
brain_pin_e b = CONFIG(injectionPins)[humanIndex - 1];
2016-03-14 21:01:37 -07:00
pinbench(delayStr, onTimeStr, offTimeStr, countStr, &enginePins.injectors[humanIndex - 1], b);
}
2015-07-10 06:01:56 -07:00
/**
* delay 100, cylinder #2, 5ms ON, 1000ms OFF, repeat 2 times
* fuelbench2 100 2 5 1000 2
*/
static void fuelbench2(const char *delayStr, const char *indexStr, const char * onTimeStr, const char *offTimeStr,
const char *countStr) {
int index = atoi(indexStr);
2016-03-14 21:01:37 -07:00
doRunFuel(index, delayStr, onTimeStr, offTimeStr, countStr);
2015-07-10 06:01:56 -07:00
}
2017-07-24 17:40:01 -07:00
static void fanBenchExt(const char *durationMs) {
pinbench("0", durationMs, "100", "1", &enginePins.fanRelay, CONFIG(fanPin));
2017-07-24 17:40:01 -07:00
}
2015-07-10 06:01:56 -07:00
void fanBench(void) {
2017-07-24 17:40:01 -07:00
fanBenchExt("3000");
2015-07-10 06:01:56 -07:00
}
2019-01-13 16:41:39 -08:00
/**
* we are blinking for 16 seconds so that one can click the button and walk around to see the light blinking
*/
2015-07-10 06:01:56 -07:00
void milBench(void) {
pinbench("0", "500", "500", "16", &enginePins.checkEnginePin, CONFIG(malfunctionIndicatorPin));
2015-07-10 06:01:56 -07:00
}
2020-03-29 14:21:17 -07:00
void starterRelayBench(void) {
pinbench("0", "6000", "100", "1", &enginePins.starterControl, CONFIG(starterControlPin));
}
2016-01-07 18:02:35 -08:00
void fuelPumpBenchExt(const char *durationMs) {
pinbench("0", durationMs, "100", "1", &enginePins.fuelPumpRelay, CONFIG(fuelPumpPin));
2016-01-07 18:02:35 -08:00
}
2019-09-14 14:56:17 -07:00
void acRelayBench(void) {
pinbench("0", "1000", "100", "1", &enginePins.acRelay, CONFIG(acRelayPin));
2019-09-14 14:56:17 -07:00
}
2015-07-10 06:01:56 -07:00
void fuelPumpBench(void) {
2016-01-07 18:02:35 -08:00
fuelPumpBenchExt("3000");
2015-07-10 06:01:56 -07:00
}
// fuelbench 5 1000 2
static void fuelbench(const char * onTimeStr, const char *offTimeStr, const char *countStr) {
fuelbench2("0", "1", onTimeStr, offTimeStr, countStr);
}
2016-03-14 21:01:37 -07:00
static void doRunSpark(int humanIndex, const char *delayStr, const char * onTimeStr, const char *offTimeStr,
const char *countStr) {
if (humanIndex < 1 || humanIndex > engineConfiguration->specs.cylindersCount) {
scheduleMsg(logger, "Invalid index: %d", humanIndex);
return;
}
brain_pin_e b = CONFIG(ignitionPins)[humanIndex - 1];
2016-03-14 21:01:37 -07:00
pinbench(delayStr, onTimeStr, offTimeStr, countStr, &enginePins.coils[humanIndex - 1], b);
}
2015-07-10 06:01:56 -07:00
/**
* sparkbench2 0 1 5 1000 2
*/
static void sparkbench2(const char *delayStr, const char *indexStr, const char * onTimeStr, const char *offTimeStr,
const char *countStr) {
int index = atoi(indexStr);
2016-03-14 21:01:37 -07:00
doRunSpark(index, delayStr, onTimeStr, offTimeStr, countStr);
2015-07-10 06:01:56 -07:00
}
/**
* sparkbench 5 400 2
* 5 ms ON, 400 ms OFF, two times
*/
static void sparkbench(const char * onTimeStr, const char *offTimeStr, const char *countStr) {
sparkbench2("0", "1", onTimeStr, offTimeStr, countStr);
}
2017-04-24 19:35:16 -07:00
void dizzyBench(void) {
pinbench("300", "5", "400", "3", &enginePins.dizzyOutput, engineConfiguration->dizzySparkOutputPin);
}
2019-02-10 20:54:41 -08:00
class BenchController : public PeriodicController<UTILITY_THREAD_STACK_SIZE> {
public:
2019-02-11 12:09:24 -08:00
BenchController() : PeriodicController("BenchThread") { }
2019-02-10 20:54:41 -08:00
private:
void PeriodicTask(efitick_t nowNt) override {
UNUSED(nowNt);
2019-04-25 15:49:16 -07:00
setPeriod(50 /* ms */);
2017-04-24 19:35:16 -07:00
2017-07-24 16:38:00 -07:00
// naive inter-thread communication - waiting for a flag
2019-02-10 20:54:41 -08:00
if (isBenchTestPending) {
isBenchTestPending = false;
runBench(brainPin, pinX, delayMs, onTime, offTime, count);
2015-07-10 06:01:56 -07:00
}
}
2019-02-10 20:54:41 -08:00
};
static BenchController instance;
2015-07-10 06:01:56 -07:00
2019-04-23 20:20:14 -07:00
static void handleCommandX14(uint16_t index) {
switch (index) {
case 1:
// cmd_test_fuel_pump
fuelPumpBench();
return;
2019-04-29 22:21:09 -07:00
case 2:
grabTPSIsClosed();
return;
case 3:
grabTPSIsWideOpen();
return;
2019-09-05 07:30:27 -07:00
// case 4: tps2_closed
// case 5: tps2_wot
case 6:
2019-04-30 15:46:39 -07:00
grabPedalIsUp();
return;
2019-09-05 07:30:27 -07:00
case 7:
2019-04-30 15:46:39 -07:00
grabPedalIsWideOpen();
return;
2019-09-05 07:30:27 -07:00
case 8:
#if (BOARD_TLE8888_COUNT > 0)
requestTLE8888initialization();
#endif
return;
2019-09-14 14:56:17 -07:00
case 9:
acRelayBench();
return;
2020-03-29 14:21:17 -07:00
case 0xA:
// cmd_write_config
#if EFI_PROD_CODE
writeToFlashNow();
#endif /* EFI_PROD_CODE */
return;
2020-03-29 14:21:17 -07:00
case 0xB:
starterRelayBench();
return;
2019-04-23 20:20:14 -07:00
}
2019-04-29 22:21:09 -07:00
2019-04-23 20:20:14 -07:00
}
// todo: this is probably a wrong place for this method now
2019-03-12 17:33:13 -07:00
void executeTSCommand(uint16_t subsystem, uint16_t index) {
2016-03-14 20:01:43 -07:00
scheduleMsg(logger, "IO test subsystem=%d index=%d", subsystem, index);
2020-03-24 16:21:20 -07:00
if (subsystem == 0x11) {
clearWarnings();
} else if (subsystem == 0x12) {
2016-03-14 21:01:37 -07:00
doRunSpark(index, "300", "4", "400", "3");
} else if (subsystem == 0x13) {
2016-03-15 10:01:47 -07:00
doRunFuel(index, "300", "4", "400", "3");
} else if (subsystem == 0x14) {
2019-04-23 20:20:14 -07:00
handleCommandX14(index);
2016-03-15 10:01:47 -07:00
} else if (subsystem == 0x15) {
fanBench();
} else if (subsystem == 0x16) {
2019-01-13 16:41:39 -08:00
// cmd_test_check_engine_light
2016-03-15 10:01:47 -07:00
milBench();
} else if (subsystem == 0x17) {
2019-01-13 16:41:39 -08:00
// cmd_test_idle_valve
2019-04-12 19:07:03 -07:00
#if EFI_IDLE_CONTROL
2019-01-13 16:41:39 -08:00
startIdleBench();
2020-03-24 16:50:04 -07:00
#endif /* EFI_IDLE_CONTROL */
2020-03-24 16:21:20 -07:00
} else if (subsystem == 0x18) {
2020-03-24 16:50:04 -07:00
#if EFI_CJ125
2020-03-24 16:21:20 -07:00
cjCalibrate();
2020-03-24 16:50:04 -07:00
#endif /* EFI_CJ125 */
2017-05-01 19:33:20 -07:00
} else if (subsystem == 0x20 && index == 0x3456) {
2017-07-25 19:00:39 -07:00
// call to pit
setCallFromPitStop(30000);
2020-03-29 14:21:17 -07:00
} else if (subsystem == 0x21) {
2019-01-20 19:17:06 -08:00
} else if (subsystem == 0x30) {
setEngineType(index);
2019-03-12 17:33:13 -07:00
} else if (subsystem == 0x31) {
setEngineType(DEFAULT_ENGINE_TYPE);
2019-03-12 11:35:49 -07:00
} else if (subsystem == 0x79) {
2019-01-05 20:33:04 -08:00
scheduleStopEngine();
} else if (subsystem == 0xba) {
#if EFI_PROD_CODE
jump_to_bootloader();
#endif /* EFI_PROD_CODE */
} else if (subsystem == 0xbb) {
2019-06-23 06:46:14 -07:00
#if EFI_PROD_CODE
rebootNow();
#endif /* EFI_PROD_CODE */
2016-03-14 21:01:37 -07:00
}
2016-03-14 20:01:43 -07:00
}
void initBenchTest(Logging *sharedLogger) {
2016-03-14 20:01:43 -07:00
logger = sharedLogger;
2015-07-10 06:01:56 -07:00
addConsoleAction("fuelpumpbench", fuelPumpBench);
2019-09-14 14:56:17 -07:00
addConsoleAction("acrelaybench", acRelayBench);
2016-01-07 18:02:35 -08:00
addConsoleActionS("fuelpumpbench2", fuelPumpBenchExt);
2015-07-10 06:01:56 -07:00
addConsoleAction("fanbench", fanBench);
2017-07-24 17:40:01 -07:00
addConsoleActionS("fanbench2", fanBenchExt);
2017-04-24 19:43:29 -07:00
addConsoleAction("dizzybench", dizzyBench); // this is useful for tach output testing
2015-07-10 06:01:56 -07:00
2020-03-29 14:21:17 -07:00
addConsoleAction("starterbench", starterRelayBench);
2015-07-10 06:01:56 -07:00
addConsoleAction("milbench", milBench);
addConsoleActionSSS("fuelbench", fuelbench);
addConsoleActionSSS("sparkbench", sparkbench);
addConsoleActionSSSSS("fuelbench2", fuelbench2);
addConsoleActionSSSSS("sparkbench2", sparkbench2);
2019-02-10 20:54:41 -08:00
instance.setPeriod(200 /*ms*/);
instance.Start();
2015-07-10 06:01:56 -07:00
}
#endif /* EFI_UNIT_TEST */
2015-07-10 06:01:56 -07:00
#endif