rusefi-1/firmware/controllers/bench_test.cpp

537 lines
14 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
#include "pch.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 "os_access.h"
#include "flash_main.h"
#include "bench_test.h"
2015-07-10 06:01:56 -07:00
#include "main_trigger_callback.h"
2019-01-13 16:41:39 -08:00
#include "idle_thread.h"
#include "periodic_thread_controller.h"
#include "electronic_throttle.h"
2020-03-24 16:50:04 -07:00
#include "cj125.h"
#include "malfunction_central.h"
#include "trigger_emulator_algo.h"
2021-03-11 19:42:59 -08:00
#include "microsecond_timer.h"
2019-09-05 07:30:27 -07:00
#if EFI_WIDEBAND_FIRMWARE_UPDATE
#include "rusefi_wideband.h"
2021-03-11 19:42:59 -08:00
#endif // EFI_WIDEBAND_FIRMWARE_UPDATE
#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"
2021-03-11 19:42:59 -08:00
#endif // BOARD_TLE8888_COUNT
2019-09-05 07:30:27 -07:00
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 scheduling_s benchSchedStart;
static scheduling_s benchSchedEnd;
void benchOn(OutputPin* output) {
output->setValue(true);
}
void benchOff(OutputPin* output) {
output->setValue(false);
}
2015-07-10 06:01:56 -07:00
static void runBench(brain_pin_e brainPin, OutputPin *output, float delayMs, float onTimeMs, float offTimeMs,
int count) {
int delayUs = MS2US(maxF(0.1, delayMs));
int onTimeUs = MS2US(maxF(0.1, onTimeMs));
int offTimeUs = MS2US(maxF(0.1, offTimeMs));
if (onTimeUs > TOO_FAR_INTO_FUTURE_US) {
firmwareError(CUSTOM_ERR_6703, "onTime above limit %dus", TOO_FAR_INTO_FUTURE_US);
return;
}
efiPrintf("Running bench: ON_TIME=%d us OFF_TIME=%d us Counter=%d", onTimeUs, offTimeUs, count);
efiPrintf("output on %s", hwPortname(brainPin));
2015-07-10 06:01:56 -07:00
chThdSleepMicroseconds(delayUs);
2015-07-10 06:01:56 -07:00
isRunningBench = true;
2015-07-10 06:01:56 -07:00
for (int i = 0; i < count; i++) {
efitick_t nowNt = getTimeNowNt();
// start in a short time so the scheduler can precisely schedule the start event
efitick_t startTime = nowNt + US2NT(50);
efitick_t endTime = startTime + US2NT(onTimeUs);
// Schedule both events
engine->executor.scheduleByTimestampNt("bstart", &benchSchedStart, startTime, {benchOn, output});
engine->executor.scheduleByTimestampNt("bend", &benchSchedEnd, endTime, {benchOff, output});
// Wait one full cycle time for the event + delay to happen
chThdSleepMicroseconds(onTimeUs + offTimeUs);
2015-07-10 06:01:56 -07:00
}
efiPrintf("Done!");
2015-07-10 06:01:56 -07:00
isRunningBench = false;
}
2017-07-24 16:38:00 -07:00
static volatile bool isBenchTestPending = false;
static bool widebandUpdatePending = 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
}
static void doRunFuel(size_t humanIndex, const char *delayStr, const char * onTimeStr, const char *offTimeStr,
2016-03-14 21:01:37 -07:00
const char *countStr) {
if (humanIndex < 1 || humanIndex > engineConfiguration->specs.cylindersCount) {
efiPrintf("Invalid index: %d", humanIndex);
2016-03-14 21:01:37 -07:00
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);
}
static void doTestSolenoid(int humanIndex, const char *delayStr, const char * onTimeStr, const char *offTimeStr,
const char *countStr) {
if (humanIndex < 1 || humanIndex > TCU_SOLENOID_COUNT) {
efiPrintf("Invalid index: %d", humanIndex);
return;
}
brain_pin_e b = CONFIG(tcu_solenoid)[humanIndex - 1];
pinbench(delayStr, onTimeStr, offTimeStr, countStr, &enginePins.tcuSolenoids[humanIndex - 1], b);
}
static void doBenchTestFsio(int humanIndex, const char *delayStr, const char * onTimeStr, const char *offTimeStr,
const char *countStr) {
if (humanIndex < 1 || humanIndex > FSIO_COMMAND_COUNT) {
efiPrintf("Invalid index: %d", humanIndex);
return;
}
brain_pin_e b = CONFIG(fsioOutputPins)[humanIndex - 1];
pinbench(delayStr, onTimeStr, offTimeStr, countStr, &enginePins.fsioOutputs[humanIndex - 1], b);
}
2015-07-10 06:01:56 -07:00
/**
* delay 100, cylinder #2, 5ms ON, 1000ms OFF, repeat 3 times
* fuelbench2 100 2 5 1000 3
2015-07-10 06:01:56 -07:00
*/
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
}
/**
* delay 100, solenoid #2, 1000ms ON, 1000ms OFF, repeat 3 times
* tcusolbench 100 2 1000 1000 3
*/
static void tcusolbench(const char *delayStr, const char *indexStr, const char * onTimeStr, const char *offTimeStr,
const char *countStr) {
int index = atoi(indexStr);
doTestSolenoid(index, delayStr, onTimeStr, offTimeStr, countStr);
}
/**
* delay 100, channel #1, 5ms ON, 1000ms OFF, repeat 3 times
* fsiobench2 100 1 5 1000 3
*/
static void fsioBench2(const char *delayStr, const char *indexStr, const char * onTimeStr, const char *offTimeStr,
const char *countStr) {
int index = atoi(indexStr);
doBenchTestFsio(index, delayStr, onTimeStr, offTimeStr, countStr);
}
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
}
2021-06-23 14:16:11 -07:00
void fan2Bench(void) {
pinbench("0", "3000", "100", "1", &enginePins.fanRelay2, CONFIG(fan2Pin));
}
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
}
void mainRelayBench(void) {
2021-01-10 20:46:50 -08:00
// main relay is usually "ON" via FSIO thus bench testing that one is pretty unusual
engine->mainRelayBenchStartNt = getTimeNowNt();
}
2020-11-21 21:09:36 -08:00
void hpfpValveBench(void) {
2020-11-22 09:43:28 -08:00
pinbench(/*delay*/"1000", /* onTime */"20", /*oftime*/"500", "3", &enginePins.hpfpValve, CONFIG(hpfpValvePin));
2020-11-21 21:09:36 -08: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);
}
static void doRunSpark(size_t humanIndex, const char *delayStr, const char * onTimeStr, const char *offTimeStr,
2016-03-14 21:01:37 -07:00
const char *countStr) {
if (humanIndex < 1 || humanIndex > engineConfiguration->specs.cylindersCount) {
efiPrintf("Invalid index: %d", humanIndex);
2016-03-14 21:01:37 -07:00
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);
}
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
validateStack("Bench", STACK_USAGE_BENCH, 128);
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
}
if (widebandUpdatePending) {
#if EFI_WIDEBAND_FIRMWARE_UPDATE && EFI_CAN_SUPPORT
updateWidebandFirmware();
#endif
widebandUpdatePending = false;
}
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
static void handleBenchCategory(uint16_t index) {
switch(index) {
case CMD_TS_BENCH_MAIN_RELAY:
mainRelayBench();
return;
2020-11-21 21:13:55 -08:00
case CMD_TS_BENCH_HPFP_VALVE:
hpfpValveBench();
return;
case CMD_TS_BENCH_FUEL_PUMP:
// cmd_test_fuel_pump
fuelPumpBench();
return;
case CMD_TS_BENCH_STARTER_ENABLE_RELAY:
starterRelayBench();
return;
case CMD_TS_BENCH_CHECK_ENGINE_LIGHT:
// cmd_test_check_engine_light
milBench();
return;
case CMD_TS_BENCH_AC_COMPRESSOR_RELAY:
acRelayBench();
return;
case CMD_TS_BENCH_FAN_RELAY:
fanBench();
return;
case CMD_TS_BENCH_FAN_RELAY_2:
2021-06-23 14:16:11 -07:00
fan2Bench();
return;
default:
firmwareError(OBD_PCM_Processor_Fault, "Unexpected bench function %d", index);
}
}
2019-04-23 20:20:14 -07:00
static void handleCommandX14(uint16_t index) {
switch (index) {
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)
Tle8888 big update 1 (#1892) * smart gpio: fix tle8888 direct pin mapping for MRE * MRE: use TLE8888 pins instead of MCU gpios that drives TLE8888 * TLE8888: cleanup * TLE8888: do not reset driver private data on WD/undervoltage reset * TLE8888: diagnostic updates * TLE8888 driver: BIG driver rework * TLE8888: check SPI answers for abnormal states Reply with other than requested register can be a sign of: -Power-On-Reset, then OpStat0 will be replyed -WatchDog reset, then FWDStat1 will be replyed -Invalid communication frame, then Diag0 will be replyed Keep tracking last accessed register and check with the next reply. * TLE8888: debug clean-up * TLE8888: implement spi array write This reduce CS inactive state time between two consequent accesses from 8.8 uS to 1.4 uS * TLE8888: fix PP outputs in OD mode * TLE8888: cleanup register definitions * TLE8888: run separate driver thread for each chip instance Calculating poll interval for few chips become more complex, avoid this running thread for each device. * TLE8888: fix cypress and kinetic compilation Both platforms define its own MAX and cause redifination error if common.h is included in driver. * MRE: update mapping.yaml and fix direct pin mapping for TLE8888 * TLE8888: diagnnostic: disable switch off in case of overcurrent For all output, use current limiting instead * TLE8888: check for overvoltage on OUT8..OUT13 * TLE8888: add TODO note about how to recover from failure condition Currently TLE8888 automaticly recovers only from overcurrent and (may be) overtemperature conditions. Short to bat cause output disable (bit in OECONFIG is reset) and needs driver/host intervention. * TLE8888: save few bytes of RAM * TLE8888: Lada Kalina is test mule for IDLE stepper on TLE8888 Don't forget to enable PP mode for TLE8888 outputs 21..24: uncomment line 1087 in tle8888.c * TLE8888: reorder code, cleanup * TLE8888: mode all debug/statisctic to per-chip struct * TLE8888: rework poll interval calculation * MRE: use TLE8888 pins instead of MCU gpios that drives TLE8888 #2
2020-10-23 09:25:30 -07:00
tle8888_req_init();
2019-09-05 07:30:27 -07:00
#endif
return;
2020-03-29 14:21:17 -07:00
case 0xA:
// cmd_write_config
#if EFI_INTERNAL_FLASH
writeToFlashNow();
#endif /* EFI_INTERNAL_FLASH */
return;
#if EFI_EMULATE_POSITION_SENSORS
case 0xD:
enableTriggerStimulator();
return;
case 0xF:
disableTriggerStimulator();
return;
case 0x13:
enableExternalTriggerStimulator();
return;
#endif // EFI_EMULATE_POSITION_SENSORS
#if EFI_ELECTRONIC_THROTTLE_BODY
case 0xE:
etbAutocal(0);
return;
case 0x11:
etbAutocal(1);
return;
case 0xC:
engine->etbAutoTune = true;
return;
case 0x10:
engine->etbAutoTune = false;
2020-07-26 15:24:02 -07:00
#if EFI_TUNER_STUDIO
2020-07-26 15:39:26 -07:00
tsOutputChannels.calibrationMode = TsCalMode::None;
2020-07-26 15:24:02 -07:00
#endif // EFI_TUNER_STUDIO
return;
#endif
case 0x12:
widebandUpdatePending = true;
return;
2021-07-20 10:20:34 -07:00
case 0x14:
#ifdef STM32F7
void sys_dual_bank(void);
2021-07-20 11:23:45 -07:00
/**
* yes, this would instantly cause a hard fault as a random sequence of bytes is decoded as instructions
* and that's the intended behavious - the point is to set flash properly and to re-flash once in proper configuration
*/
2021-07-20 10:20:34 -07:00
sys_dual_bank();
2021-07-20 11:23:45 -07:00
rebootNow();
2021-07-20 10:20:34 -07:00
#else
firmwareError(OBD_PCM_Processor_Fault, "Unexpected dbank command", index);
#endif
return;
default:
firmwareError(OBD_PCM_Processor_Fault, "Unexpected bench x14 %d", index);
2019-04-23 20:20:14 -07:00
}
}
extern bool rebootForPresetPending;
static void fatalErrorForPresetApply() {
rebootForPresetPending = true;
firmwareError(OBD_PCM_Processor_Fault,
"\n\nTo complete preset apply:\n"
" 1. Close TunerStudio\n"
" 2. Power cycle ECU\n"
" 3. Open TunerStudio and reconnect\n\n");
}
2019-03-12 17:33:13 -07:00
void executeTSCommand(uint16_t subsystem, uint16_t index) {
efiPrintf("IO test subsystem=%d index=%d", subsystem, index);
2016-03-14 20:01:43 -07:00
bool running = !ENGINE(rpmCalculator).isStopped();
switch (subsystem) {
case 0x11:
clearWarnings();
break;
case CMD_TS_IGNITION_CATEGORY:
if (!running) {
doRunSpark(index, "300", "4", "400", "3");
}
break;
case CMD_TS_INJECTOR_CATEGORY:
if (!running) {
doRunFuel(index, "300", "4", "400", "3");
}
break;
case CMD_TS_SOLENOID_CATEGORY:
if (!running) {
doTestSolenoid(index, "300", "1000", "1000", "3");
}
break;
case CMD_TS_FSIO_CATEGORY:
if (!running) {
doBenchTestFsio(index, "300", "4", "400", "3");
}
break;
case CMD_TS_X14:
2019-04-23 20:20:14 -07:00
handleCommandX14(index);
break;
#ifdef EFI_WIDEBAND_FIRMWARE_UPDATE
case 0x15:
setWidebandOffset(index);
break;
#endif // EFI_WIDEBAND_FIRMWARE_UPDATE
case CMD_TS_BENCH_CATEGORY:
handleBenchCategory(index);
break;
case CMD_TS_X17:
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 */
break;
case 0x18:
2020-04-08 20:14:21 -07:00
#if EFI_CJ125 && HAL_USE_SPI
2020-05-01 17:22:49 -07:00
cjStartCalibration();
2020-03-24 16:50:04 -07:00
#endif /* EFI_CJ125 */
break;
case 0x20:
if (index == 0x3456) {
// call to pit
setCallFromPitStop(30000);
}
break;
case 0x30:
fatalErrorForPresetApply();
2019-01-20 19:17:06 -08:00
setEngineType(index);
break;
case CMD_TS_X31:
fatalErrorForPresetApply();
2019-03-12 17:33:13 -07:00
setEngineType(DEFAULT_ENGINE_TYPE);
break;
case 0x79:
2019-01-05 20:33:04 -08:00
scheduleStopEngine();
break;
case 0xba:
#if EFI_PROD_CODE
jump_to_bootloader();
#endif /* EFI_PROD_CODE */
break;
case 0xbb:
2019-06-23 06:46:14 -07:00
#if EFI_PROD_CODE
rebootNow();
#endif /* EFI_PROD_CODE */
break;
default:
firmwareError(OBD_PCM_Processor_Fault, "Unexpected bench subsystem %d %d", subsystem, index);
2016-03-14 21:01:37 -07:00
}
2016-03-14 20:01:43 -07:00
}
void initBenchTest() {
2015-07-10 06:01:56 -07:00
addConsoleAction("fuelpumpbench", fuelPumpBench);
2021-06-23 14:16:11 -07:00
addConsoleAction(CMD_AC_RELAY_BENCH, acRelayBench);
2016-01-07 18:02:35 -08:00
addConsoleActionS("fuelpumpbench2", fuelPumpBenchExt);
2021-06-23 14:16:11 -07:00
addConsoleAction(CMD_FAN_BENCH, fanBench);
addConsoleAction(CMD_FAN2_BENCH, fan2Bench);
2021-01-10 17:30:08 -08:00
addConsoleAction("mainrelaybench", mainRelayBench);
2017-07-24 17:40:01 -07:00
addConsoleActionS("fanbench2", fanBenchExt);
#if EFI_WIDEBAND_FIRMWARE_UPDATE
addConsoleAction("update_wideband", []() { widebandUpdatePending = true; });
addConsoleActionI("set_wideband_index", [](int index) { setWidebandOffset(index); });
#endif // EFI_WIDEBAND_FIRMWARE_UPDATE
2015-07-10 06:01:56 -07:00
2020-08-19 18:05:08 -07:00
addConsoleAction(CMD_STARTER_BENCH, starterRelayBench);
addConsoleAction(CMD_MIL_BENCH, milBench);
addConsoleActionSSS(CMD_FUEL_BENCH, fuelbench);
2021-06-23 14:16:11 -07:00
addConsoleActionSSS(CMD_SPARK_BENCH, sparkbench);
2020-11-21 21:47:43 -08:00
addConsoleAction(CMD_HPFP_BENCH, hpfpValveBench);
2015-07-10 06:01:56 -07:00
addConsoleActionSSSSS("fuelbench2", fuelbench2);
addConsoleActionSSSSS("tcusolbench", tcusolbench);
addConsoleActionSSSSS("fsiobench2", fsioBench2);
2015-07-10 06:01:56 -07:00
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