rusEFI
The most advanced open source ECU
Loading...
Searching...
No Matches
bench_test.cpp
Go to the documentation of this file.
1/**
2 * @file bench_test.cpp
3 * @brief Utility methods related to bench testing.
4 *
5 *
6 * @date Sep 8, 2013
7 * @author Andrey Belomutskiy, (c) 2012-2020
8 *
9 * This file is part of rusEfi - see http://rusefi.com
10 *
11 * rusEfi is free software; you can redistribute it and/or modify it under the terms of
12 * the GNU General Public License as published by the Free Software Foundation; either
13 * version 3 of the License, or (at your option) any later version.
14 *
15 * rusEfi is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
16 * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License along with this program.
20 * If not, see <http://www.gnu.org/licenses/>.
21 */
22
23#include "pch.h"
24#include "tunerstudio.h"
26#include "long_term_fuel_trim.h"
27#include "can_common.h"
28#include "can_rx.h"
29#include "value_lookup.h"
30#include "can_msg_tx.h"
31#include "gm_sbc.h" // setStepperHw
32
33#include "fw_configuration.h"
34#include "board_overrides.h"
35
36static bool isRunningBench = false;
38
40 return isRunningBench;
41}
42
46
47#if !EFI_UNIT_TEST
48
49#include "flash_main.h"
50#include "bench_test.h"
53#include "electronic_throttle.h"
55#include "malfunction_central.h"
57#include "vvt.h"
58#include "microsecond_timer.h"
59#include "rusefi_wideband.h"
60
61#if EFI_PROD_CODE
62#include "rusefi.h"
63#include "mpu_util.h"
64#endif /* EFI_PROD_CODE */
65
66#if (BOARD_TLE8888_COUNT > 0)
67#include "gpio/tle8888.h"
68#endif // BOARD_TLE8888_COUNT
69
70#if EFI_FILE_LOGGING
71#include "mmc_card.h"
72#endif
73
76
77#if EFI_SIMULATOR
78static int savedPinToggleCounter = 0;
79static uint32_t savedDurationsInStateMs[2] = { 0, 0 };
80#endif // EFI_SIMULATOR
81
82
83#define BENCH_MSG "bench"
84
85static void benchOn(OutputPin* output) {
86 output->setValue(BENCH_MSG, true, /*isForce*/ true);
87}
88
89static void benchOff(OutputPin* output) {
90#if EFI_PROD_CODE && (BOARD_EXT_GPIOCHIPS > 0)
91 static char pin_error[64];
92
93 brain_pin_diag_e diag = output->getDiag();
94 if (diag == PIN_UNKNOWN) {
95 efiPrintf("No Diag on this pin");
96 } else {
97 pinDiag2string(pin_error, sizeof(pin_error), diag);
98 efiPrintf("Diag says %s", pin_error);
99 }
100#endif // EFI_PROD_CODE
101 output->setValue(BENCH_MSG, false, /*isForce*/ true);
102}
103
104static void runBench(OutputPin *output, float onTimeMs, float offTimeMs, int count, bool swapOnOff) {
105 int onTimeUs = MS2US(std::max(0.1f, onTimeMs));
106 int offTimeUs = MS2US(std::max(0.1f, offTimeMs));
107
108 if (onTimeUs > TOO_FAR_INTO_FUTURE_US) {
109 firmwareError(ObdCode::CUSTOM_ERR_BENCH_PARAM, "onTime above limit %dus", TOO_FAR_INTO_FUTURE_US);
110 return;
111 }
112
113 efiPrintf("Running bench: ON_TIME=%d us OFF_TIME=%d us Counter=%d", onTimeUs, offTimeUs, count);
114 efiPrintf("output on %s", hwPortname(output->brainPin));
115
116 isRunningBench = true;
117 outputOnTheBenchTest = output;
118
119 for (int i = 0; isRunningBench && i < count; i++) {
121 efitick_t nowNt = getTimeNowNt();
122 // start in a short time so the scheduler can precisely schedule the start event
123 efitick_t startTime = nowNt + US2NT(50);
124 efitick_t endTime = startTime + US2NT(onTimeUs);
125
126 auto const bstartAction{ swapOnOff ? action_s::make<benchOff>(output) : action_s::make<benchOn>(output) };
127 auto const bendAction{ swapOnOff ? action_s::make<benchOn>(output) : action_s::make<benchOff>(output) };
128
129 // Schedule both events
130 engine->scheduler.schedule("bstart", &benchSchedStart, startTime, bstartAction);
131 engine->scheduler.schedule("bend", &benchSchedEnd, endTime, bendAction);
132
133 // Wait one full cycle time for the event + delay to happen
134 chThdSleepMicroseconds(onTimeUs + offTimeUs);
135 }
136 /* last */
138
139#if EFI_SIMULATOR
140 // save the current counters and durations after the test while the pin is still controlled
144#endif // EFI_SIMULATOR
145
146 efiPrintf("Done!");
147 outputOnTheBenchTest = nullptr;
148 isRunningBench = false;
149}
150
151// todo: migrate to smarter getOutputOnTheBenchTest() approach?
152static volatile bool isBenchTestPending = false;
153static bool widebandUpdatePending = false;
154static uint8_t widebandUpdateHwId = 0;
155static float globalOnTimeMs;
156static float globalOffTimeMs;
157static int globalCount;
159static bool swapOnOff = false;
160
161static chibios_rt::CounterSemaphore benchSemaphore(0);
162
163static void pinbench(float ontimeMs, float offtimeMs, int iterations,
164 OutputPin* pinParam, bool p_swapOnOff = false)
165{
166 globalOnTimeMs = ontimeMs;
167 globalOffTimeMs = offtimeMs;
168#if EFI_SIMULATOR
169 globalCount = maxI(2, iterations);
170#else
171 globalCount = iterations;
172#endif // EFI_SIMULATOR
173 pinX = pinParam;
174 swapOnOff = p_swapOnOff;
175 // let's signal bench thread to wake up
176 isBenchTestPending = true;
177 benchSemaphore.signal();
178}
179
180static void cancelBenchTest() {
181 isRunningBench = false;
182}
183
184static void doRunFuelInjBench(size_t humanIndex, float onTimeMs, float offTimeMs, int count) {
185 if (humanIndex < 1 || humanIndex > engineConfiguration->cylindersCount) {
186 efiPrintf("Invalid index: %d", humanIndex);
187 return;
188 }
189 pinbench(onTimeMs, offTimeMs, count,
190 &enginePins.injectors[humanIndex - 1]);
191}
192
193static void doRunSparkBench(size_t humanIndex, float onTime, float offTime, int count) {
194 if (humanIndex < 1 || humanIndex > engineConfiguration->cylindersCount) {
195 efiPrintf("Invalid index: %d", humanIndex);
196 return;
197 }
198 pinbench(onTime, offTime, count, &enginePins.coils[humanIndex - 1]);
199}
200
201static void doRunSolenoidBench(size_t humanIndex, float onTime, float offTime, int count) {
202 if (humanIndex < 1 || humanIndex > TCU_SOLENOID_COUNT) {
203 efiPrintf("Invalid index: %d", humanIndex);
204 return;
205 }
206 pinbench(onTime, offTime, count, &enginePins.tcuSolenoids[humanIndex - 1]);
207}
208
209static void doRunBenchTestLuaOutput(size_t humanIndex, float onTimeMs, float offTimeMs, int count) {
210 if (humanIndex < 1 || humanIndex > LUA_PWM_COUNT) {
211 efiPrintf("Invalid index: %d", humanIndex);
212 return;
213 }
214 pinbench(onTimeMs, offTimeMs, count,
215 &enginePins.luaOutputPins[humanIndex - 1]);
216}
217
218/**
219 * cylinder #2, 5ms ON, 1000ms OFF, repeat 3 times
220 * fuelInjBenchExt 2 5 1000 3
221 */
222static void fuelInjBenchExt(float humanIndex, float onTimeMs, float offTimeMs, float count) {
223 doRunFuelInjBench((int)humanIndex, onTimeMs, offTimeMs, (int)count);
224}
225
226/**
227 * fuelbench 5 1000 2
228 */
229static void fuelInjBench(float onTimeMs, float offTimeMs, float count) {
230 fuelInjBenchExt(1, onTimeMs, offTimeMs, count);
231}
232
233/**
234 * sparkbench2 1 5 1000 2
235 */
236static void sparkBenchExt(float humanIndex, float onTime, float offTimeMs, float count) {
237 doRunSparkBench((int)humanIndex, onTime, offTimeMs, (int)count);
238}
239
240/**
241 * sparkbench 5 400 2
242 * 5 ms ON, 400 ms OFF, two times
243 */
244static void sparkBench(float onTime, float offTimeMs, float count) {
245 sparkBenchExt(1, onTime, offTimeMs, count);
246}
247
248/**
249 * solenoid #2, 1000ms ON, 1000ms OFF, repeat 3 times
250 * tcusolbench 2 1000 1000 3
251 */
252static void tcuSolenoidBench(float humanIndex, float onTime, float offTimeMs, float count) {
253 doRunSolenoidBench((int)humanIndex, onTime, offTimeMs, (int)count);
254}
255
256static void fanBenchExt(float onTimeMs) {
257 pinbench(onTimeMs, 100.0, 1, &enginePins.fanRelay);
258}
259
260void fanBench() {
261 fanBenchExt(BENCH_FAN_DURATION);
262}
263
264void fan2Bench() {
265 pinbench(3000.0, 100.0, 1, &enginePins.fanRelay2);
266}
267
268/**
269 * we are blinking for 16 seconds so that one can click the button and walk around to see the light blinking
270 */
271void milBench() {
272 pinbench(500.0, 500.0, 16, &enginePins.checkEnginePin);
273}
274
276 pinbench(BENCH_STARTER_DURATION, 100.0, 1, &enginePins.starterControl);
277}
278
279static void fuelPumpBenchExt(float durationMs) {
280 pinbench(durationMs, 100.0, 1,
282}
283
285 pinbench(BENCH_AC_RELAY_DURATION, 100.0, 1, &enginePins.acRelay);
286}
287
288static void mainRelayBench() {
289 pinbench(BENCH_MAIN_RELAY_DURATION, 100.0, 1, &enginePins.mainRelay, true);
290}
291
296
298 fuelPumpBenchExt(BENCH_FUEL_PUMP_DURATION);
299}
300
301static void vvtValveBench(int vvtIndex) {
302#if EFI_VVT_PID
303 pinbench(BENCH_VVT_DURATION, 100.0, 1, getVvtOutputPin(vvtIndex));
304#endif // EFI_VVT_PID
305}
306
307static void requestWidebandUpdate(int hwIndex)
308{
309 widebandUpdateHwId = hwIndex;
311 benchSemaphore.signal();
312}
313
314class BenchController : public ThreadController<UTILITY_THREAD_STACK_SIZE> {
315public:
316 BenchController() : ThreadController("BenchTest", PRIO_BENCH_TEST) { }
317private:
318 void ThreadTask() override {
319 while (true) {
320 benchSemaphore.wait();
321
322 assertStackVoid("Bench", ObdCode::STACK_USAGE_MISC, EXPECTED_REMAINING_STACK);
323
324 if (isBenchTestPending) {
325 isBenchTestPending = false;
327 }
328
330 #if EFI_WIDEBAND_FIRMWARE_UPDATE && EFI_CAN_SUPPORT
332 #endif
333 widebandUpdatePending = false;
334 }
335 }
336 }
337};
338
339static BenchController instance;
340
341static void auxOutBench(int index) {
342 // todo!
343 UNUSED(index);
344}
345
346#if EFI_HD_ACR
347static void hdAcrBench(int index) {
349 pinbench(BENCH_AC_RELAY_DURATION, 100.0, 1, pin);
350}
351#endif // EFI_HD_ACR
352
353int luaCommandCounters[LUA_BUTTON_COUNT] = {};
354
355void handleBenchCategory(uint16_t index) {
356 switch(index) {
357 case BENCH_VVT0_VALVE:
358 vvtValveBench(0);
359 return;
360 case BENCH_VVT1_VALVE:
361 vvtValveBench(1);
362 return;
363 case BENCH_VVT2_VALVE:
364 vvtValveBench(2);
365 return;
366 case BENCH_VVT3_VALVE:
367 vvtValveBench(3);
368 return;
369 case BENCH_AUXOUT0:
370 auxOutBench(0);
371 return;
372 case BENCH_AUXOUT1:
373 auxOutBench(1);
374 return;
375 case BENCH_AUXOUT2:
376 auxOutBench(2);
377 return;
378 case BENCH_AUXOUT3:
379 auxOutBench(3);
380 return;
381 case BENCH_AUXOUT4:
382 auxOutBench(4);
383 return;
384 case BENCH_AUXOUT5:
385 auxOutBench(5);
386 return;
387 case BENCH_AUXOUT6:
388 auxOutBench(6);
389 return;
390 case BENCH_AUXOUT7:
391 auxOutBench(7);
392 return;
393 case LUA_COMMAND_1:
395 return;
396 case LUA_COMMAND_2:
398 return;
399 case LUA_COMMAND_3:
401 return;
402 case LUA_COMMAND_4:
404 return;
405#if EFI_LTFT_CONTROL
406 case LTFT_RESET:
408 return;
409 case LTFT_APPLY_TO_VE:
411 return;
412 case LTFT_DEV_POKE:
414 return;
415#endif // EFI_LTFT_CONTROL
416#if EFI_HD_ACR
417 case HD_ACR:
418 hdAcrBench(0);
419 return;
420 case HD_ACR2:
421 hdAcrBench(1);
422 return;
423#endif // EFI_HD_ACR
424 case BENCH_HPFP_VALVE:
426 return;
427 case BENCH_FUEL_PUMP:
428 // cmd_test_fuel_pump
430 return;
431 case BENCH_MAIN_RELAY:
433 return;
436 return;
438 // cmd_test_check_engine_light
439 milBench();
440 return;
442 acRelayBench();
443 return;
444 case BENCH_FAN_RELAY:
445 fanBench();
446 return;
447 case BENCH_IDLE_VALVE:
448 // cmd_test_idle_valve
449#if EFI_IDLE_CONTROL
451#endif /* EFI_IDLE_CONTROL */
452 return;
454 fan2Bench();
455 return;
456 case BENCH_CANCEL:
458 return;
459 default:
460 criticalError("Unexpected bench function %d", index);
461 }
462}
463
464int getSavedBenchTestPinStates(uint32_t durationsInStateMs[2]) {
465#if EFI_SIMULATOR
466 durationsInStateMs[0] = savedDurationsInStateMs[0];
467 durationsInStateMs[1] = savedDurationsInStateMs[1];
469#else
470 UNUSED(durationsInStateMs);
471 return 0;
472#endif // EFI_SIMULATOR
473}
474
475static void handleCommandX14(uint16_t index) {
476 switch (index) {
478 setStepperHw();
480 return;
481 case TS_GRAB_PEDAL_UP:
483 return;
486 return;
489 return;
490 case TS_GRAB_TPS_OPEN:
492 return;
493 case TS_RESET_TLE8888:
494 #if (BOARD_TLE8888_COUNT > 0)
496 #endif
497 return;
498 case TS_RESET_MC33810:
499 #if EFI_PROD_CODE && (BOARD_MC33810_COUNT > 0)
501 #endif
502 return;
503#if EFI_SHAFT_POSITION_INPUT
505 // this is different from starter relay bench test!
507 return;
508#endif // EFI_SHAFT_POSITION_INPUT
509 case TS_WRITE_FLASH:
510 // cmd_write_config
511 #if EFI_CONFIGURATION_STORAGE
513 #endif /* EFI_CONFIGURATION_STORAGE */
514 return;
516 #if EFI_EMULATE_POSITION_SENSORS == TRUE
518 #endif /* EFI_EMULATE_POSITION_SENSORS == TRUE */
519 return;
521 #if EFI_EMULATE_POSITION_SENSORS == TRUE
523 #endif /* EFI_EMULATE_POSITION_SENSORS == TRUE */
524 return;
526 #if EFI_EMULATE_POSITION_SENSORS == TRUE
528 #endif /* EFI_EMULATE_POSITION_SENSORS == TRUE */
529 return;
530/*
531 case TS_ETB_RESET:
532 #if EFI_ELECTRONIC_THROTTLE_BODY == TRUE
533 #if EFI_PROD_CODE
534 etbPidReset();
535 #endif
536 #endif // EFI_ELECTRONIC_THROTTLE_BODY
537 return;
538*/
539#if EFI_ELECTRONIC_THROTTLE_BODY
540 case TS_ETB_AUTOCAL_0:
541 etbAutocal(DC_Throttle1);
542 return;
543 case TS_ETB_AUTOCAL_1:
544 etbAutocal(DC_Throttle2);
545 return;
547 etbAutocal(DC_Throttle1, false);
548 return;
550 etbAutocal(DC_Throttle2, false);
551 return;
553 engine->etbAutoTune = true;
554 return;
556 engine->etbAutoTune = false;
557 #if EFI_TUNER_STUDIO
559 #endif // EFI_TUNER_STUDIO
560 return;
563 return;
564 case TS_EWG_AUTOCAL_0:
565 etbAutocal(DC_Wastegate);
566 return;
568 etbAutocal(DC_Wastegate, false);
569 return;
570#endif // EFI_ELECTRONIC_THROTTLE_BODY
572 // broadcast, for old WBO FWs
574 return;
576 return;
577
578#if EFI_PROD_CODE && EFI_FILE_LOGGING
579 case TS_SD_MOUNT_PC:
581 return;
582 case TS_SD_MOUNT_ECU:
584 return;
585 case TS_SD_UNMOUNT:
587 return;
588 case TS_SD_FORMAT:
590 return;
593 return;
594#endif // EFI_FILE_LOGGING
595
596 default:
597 criticalError("Unexpected bench x14 %d", index);
598 }
599}
600
601extern bool rebootForPresetPending;
602
603static void applyPreset(int index) {
604 setEngineType(index);
605#if EFI_TUNER_STUDIO
607#endif // EFI_TUNER_STUDIO
608}
609
610// placeholder to force custom_board_ts_command migration
611void boardTsAction(uint16_t index) { UNUSED(index); }
612
613#if EFI_CAN_SUPPORT
614/**
615 * for example to bench test injector 1
616 * 0x77000C 0x66 0x00 ?? ?? ?? ??
617 * 0x77000C 0x66 0x00 0x14 0x00 0x09 0x00 start/stop engine
618 *
619 * See also more complicated ISO-TP CANBus wrapper of complete TS protocol
620 */
621static void processCanUserControl(const CANRxFrame& frame) {
622 // reserved data8[1]
623 uint16_t subsystem = getTwoBytesLsb(frame, 2);
624 uint16_t index = getTwoBytesLsb(frame, 4);
625 executeTSCommand(subsystem, index);
626}
627
628 union FloatIntBytes {
629 float f;
630 int i;
631 uint8_t bytes[sizeof(float)];
632 };
633
634static void processCanSetCalibration(const CANRxFrame& frame) {
635 // todo allow changes of scalar settings via CANbus
636 UNUSED(frame);
637}
638/**
639 * CANbus protocol to query scalar calibrations using hash keys
640 *
641 * see fields_api.txt for well-known fields
642 * see generated_fields_api_header.h for corresponding hashes
643 */
644static void processCanRequestCalibration(const CANRxFrame& frame) {
645#if EFI_LUA_LOOKUP
646 int hash = getFourBytesLsb(frame, 2);
647 efiPrintf("processCanRequestCalibration=%x", hash);
648 FloatIntBytes fb;
649 fb.f = getConfigValueByHash(hash);
650
651 CanTxMessage msg(CanCategory::BENCH_TEST, (int)bench_test_packet_ids_e::ECU_GET_CALIBRATION, 8, /*bus*/0, /*isExtended*/true);
652 for (size_t i = 0;i<sizeof(float);i++) {
653 msg[4 + i] = fb.bytes[i];
654 }
655
656 fb.i = hash;
657 // first half of the packed is copy of that hash value so that recipients know what they are processing
658 for (size_t i = 0;i<sizeof(float);i++) {
659 msg[i] = fb.bytes[i];
660 }
661#endif // EFI_LUA_LOOKUP
662}
663
665 if (frame.data8[0] != (int)bench_test_magic_numbers_e::BENCH_HEADER) {
666 return;
667 }
668
669 int eid = CAN_EID(frame);
670 if (eid == (int)bench_test_packet_ids_e::ECU_SET_CALIBRATION) {
672 } else if (eid == (int)bench_test_packet_ids_e::ECU_REQ_CALIBRATION) {
674 } else if (eid == (int)bench_test_packet_ids_e::ECU_CAN_BUS_USER_CONTROL) {
676 }
677}
678
679#endif // EFI_CAN_SUPPORT
680
681std::optional<setup_custom_board_ts_command_override_type> custom_board_ts_command;
682
683void executeTSCommand(uint16_t subsystem, uint16_t index) {
684 efiPrintf("IO test subsystem=%d index=%d", subsystem, index);
685
687
688 switch (subsystem) {
691 break;
692
693 case TS_DEBUG_MODE:
695 break;
696
698 if (!running) {
701 }
702 break;
703
705 if (!running) {
708 }
709 break;
710
712 if (!running) {
713 doRunSolenoidBench(index, 1000.0,
715 }
716 break;
717
719 if (!running) {
720 doRunBenchTestLuaOutput(index, 4.0,
722 }
723 break;
724
725 case TS_X14:
726 handleCommandX14(index);
727 break;
728#if EFI_CAN_SUPPORT
729 case TS_WIDEBAND:
730 setWidebandOffset(0xff, index);
731 break;
733 {
734 uint8_t hwIndex = index >> 8;
735 uint8_t canIndex = index & 0xff;
736
737 // Hack until we fix canReWidebandHwIndex and set "Broadcast" to 0xff
738 // TODO:
739 hwIndex = hwIndex < 8 ? hwIndex : 0xff;
740 setWidebandOffset(hwIndex, canIndex);
741 }
742 break;
744 {
745 uint8_t hwIndex = index >> 8;
746 uint8_t sensType = index & 0xff;
747
748 // Hack until we fix canReWidebandHwIndex and set "Broadcast" to 0xff
749 // TODO:
750 hwIndex = hwIndex < 8 ? hwIndex : 0xff;
751 setWidebandSensorType(hwIndex, sensType);
752 }
753 break;
755 pingWideband(index >> 8);
756 break;
757
759 {
760 uint8_t hwIndex = index >> 8;
761
762 // Hack until we fix canReWidebandHwIndex and set "Broadcast" to 0xff
763 // TODO:
764 widebandUpdateHwId = hwIndex < 8 ? hwIndex : 0xff;
766 }
767 break;
768#endif // EFI_CAN_SUPPORT
770 handleBenchCategory(index);
771 break;
772
774 applyPreset(index);
775 break;
776
777 case TS_BOARD_ACTION:
778 // TODO: use call_board_override
779 if (custom_board_ts_command.has_value()) {
780 custom_board_ts_command.value()(subsystem, index);
781 }
782 break;
783
785 applyPreset((int)DEFAULT_ENGINE_TYPE);
786 break;
787
788 case TS_STOP_ENGINE:
790 break;
791
792 case 0xba:
793#if EFI_PROD_CODE && EFI_DFU_JUMP
795#endif /* EFI_DFU_JUMP */
796 break;
797
798 case REBOOT_COMMAND:
799#if EFI_PROD_CODE
800 rebootNow();
801#endif /* EFI_PROD_CODE */
802 break;
803
804#if EFI_USE_OPENBLT
805 case 0xbc:
806 /* Jump to OpenBLT if present */
808 break;
809#endif
810
811 default:
812 criticalError("Unexpected bench subsystem %d %d", subsystem, index);
813 }
814}
815
817 // default values if configuration was not specified
820 }
821
824 }
825
828 }
829}
830
832 addConsoleAction("fuelpumpbench", fuelPumpBench);
833 addConsoleActionF("fuelpumpbench2", fuelPumpBenchExt);
834
835 addConsoleActionFFF(CMD_FUEL_BENCH, fuelInjBench);
837
838 addConsoleActionFFF(CMD_SPARK_BENCH, sparkBench);
839 addConsoleActionFFFF("sparkbench2", sparkBenchExt);
840
842
843 addConsoleAction(CMD_AC_RELAY_BENCH, acRelayBench);
844
845 addConsoleAction(CMD_FAN_BENCH, fanBench);
846 addConsoleAction(CMD_FAN2_BENCH, fan2Bench);
847 addConsoleActionF("fanbench2", fanBenchExt);
848
849 addConsoleAction("mainrelaybench", mainRelayBench);
850
851#if EFI_CAN_SUPPORT
852#if EFI_WIDEBAND_FIRMWARE_UPDATE
853 addConsoleActionI("update_wideband", requestWidebandUpdate);
854#endif // EFI_WIDEBAND_FIRMWARE_UPDATE
855 addConsoleActionII("set_wideband_index", [](int hwIndex, int index) { setWidebandOffset(hwIndex, index); });
856#endif // EFI_CAN_SUPPORT
857
858 addConsoleAction(CMD_STARTER_BENCH, starterRelayBench);
859 addConsoleAction(CMD_MIL_BENCH, milBench);
860 addConsoleAction(CMD_HPFP_BENCH, hpfpValveBench);
861
862#if EFI_CAN_SUPPORT
863 addConsoleActionI("ping_wideband", [](int index) {
864 pingWideband(index);
865 });
866#endif // EFI_CAN_SUPPORT
867
868#if EFI_LUA
869 // this commands facilitates TS Lua Button scripts development
870 addConsoleActionI("lua_button", [](int index) {
871 if (index < 0 || index > LUA_BUTTON_COUNT)
872 return;
873 luaCommandCounters[index - 1]++;
874 });
875 addConsoleActionFFFF("luabench2", [](float humanIndex, float onTime, float offTimeMs, float count) {
876 doRunBenchTestLuaOutput((int)humanIndex, onTime, offTimeMs, (int)count);
877 });
878#endif // EFI_LUA
879 instance.start();
881}
882
883#endif /* EFI_UNIT_TEST */
void jump_to_openblt()
void jump_to_bootloader()
int luaCommandCounters[LUA_BUTTON_COUNT]
static void processCanRequestCalibration(const CANRxFrame &frame)
static int globalCount
static void requestWidebandUpdate(int hwIndex)
static float globalOnTimeMs
static scheduling_s benchSchedStart
void executeTSCommand(uint16_t subsystem, uint16_t index)
static void runBench(OutputPin *output, float onTimeMs, float offTimeMs, int count, bool swapOnOff)
static void sparkBenchExt(float humanIndex, float onTime, float offTimeMs, float count)
static volatile bool isBenchTestPending
int getSavedBenchTestPinStates(uint32_t durationsInStateMs[2])
void fanBench()
static void benchOff(OutputPin *output)
static void doRunFuelInjBench(size_t humanIndex, float onTimeMs, float offTimeMs, int count)
void milBench()
static void handleCommandX14(uint16_t index)
static void doRunSolenoidBench(size_t humanIndex, float onTime, float offTime, int count)
static void sparkBench(float onTime, float offTimeMs, float count)
void processCanEcuControl(const CANRxFrame &frame)
std::optional< setup_custom_board_ts_command_override_type > custom_board_ts_command
static void processCanSetCalibration(const CANRxFrame &frame)
static void cancelBenchTest()
static void fanBenchExt(float onTimeMs)
static void doRunSparkBench(size_t humanIndex, float onTime, float offTime, int count)
static uint8_t widebandUpdateHwId
static void pinbench(float ontimeMs, float offtimeMs, int iterations, OutputPin *pinParam, bool p_swapOnOff=false)
void starterRelayBench()
void initBenchTest()
static bool isRunningBench
static chibios_rt::CounterSemaphore benchSemaphore(0)
static void hdAcrBench(int index)
static void hpfpValveBench()
void boardTsAction(uint16_t index)
void onConfigurationChangeBenchTest()
static float globalOffTimeMs
bool isRunningBenchTest()
static void mainRelayBench()
static void doRunBenchTestLuaOutput(size_t humanIndex, float onTimeMs, float offTimeMs, int count)
static uint32_t savedDurationsInStateMs[2]
static void auxOutBench(int index)
static OutputPin * outputOnTheBenchTest
bool rebootForPresetPending
const OutputPin * getOutputOnTheBenchTest()
void fan2Bench()
static bool widebandUpdatePending
static void fuelInjBench(float onTimeMs, float offTimeMs, float count)
void fuelPumpBench()
static bool swapOnOff
static void processCanUserControl(const CANRxFrame &frame)
static void fuelInjBenchExt(float humanIndex, float onTimeMs, float offTimeMs, float count)
void acRelayBench()
void handleBenchCategory(uint16_t index)
static OutputPin * pinX
static int savedPinToggleCounter
static scheduling_s benchSchedEnd
static void vvtValveBench(int vvtIndex)
static void tcuSolenoidBench(float humanIndex, float onTime, float offTimeMs, float count)
static void benchOn(OutputPin *output)
static BenchController instance
static void fuelPumpBenchExt(float durationMs)
static void applyPreset(int index)
Utility methods related to bench testing.
uint16_t getTwoBytesLsb(const CANRxFrame &frame, int offset)
Definition can_rx.cpp:126
uint32_t getFourBytesLsb(const CANRxFrame &frame, int offset)
Definition can_rx.cpp:119
bool etbAutoTune
Definition engine.h:296
bool etbIgnoreJamProtection
Definition engine.h:297
SingleTimerExecutor scheduler
Definition engine.h:271
RpmCalculator rpmCalculator
Definition engine.h:306
TunerStudioOutputChannels outputChannels
Definition engine.h:109
RegisteredOutputPin harleyAcr2
Definition efi_gpio.h:96
RegisteredNamedOutputPin harleyAcr
Definition efi_gpio.h:95
RegisteredOutputPin mainRelay
Definition efi_gpio.h:76
OutputPin tcuSolenoids[TCU_SOLENOID_COUNT]
Definition efi_gpio.h:132
RegisteredOutputPin fanRelay
Definition efi_gpio.h:86
RegisteredOutputPin starterControl
Definition efi_gpio.h:82
OutputPin luaOutputPins[LUA_PWM_COUNT]
Definition efi_gpio.h:100
RegisteredOutputPin fanRelay2
Definition efi_gpio.h:87
InjectorOutputPin injectors[MAX_CYLINDER_COUNT]
Definition efi_gpio.h:127
RegisteredOutputPin fuelPumpRelay
Definition efi_gpio.h:91
RegisteredOutputPin acRelay
Definition efi_gpio.h:90
IgnitionOutputPin coils[MAX_CYLINDER_COUNT]
Definition efi_gpio.h:129
RegisteredOutputPin checkEnginePin
Definition efi_gpio.h:118
RegisteredNamedOutputPin hpfpValve
Definition efi_gpio.h:80
Single output pin reference and state.
Definition efi_output.h:49
brain_pin_diag_e getDiag() const
Definition efi_gpio.cpp:678
uint32_t durationsInStateMs[2]
Definition efi_output.h:81
void setValue(const char *msg, int logicValue, bool isForce=false)
Definition efi_gpio.cpp:604
int pinToggleCounter
Definition efi_output.h:76
brain_pin_e brainPin
Definition efi_output.h:86
bool isStopped() const override
void schedule(const char *msg, scheduling_s *scheduling, efitick_t timeNt, action_s const &action) override
Schedule an action to be executed in the future.
A base class for a controller that requires its own thread.
virtual void ThreadTask()=0
void addConsoleActionF(const char *token, VoidFloat callback)
void addConsoleAction(const char *token, Void callback)
Register console action without parameters.
void addConsoleActionII(const char *token, VoidIntInt callback)
Register a console command with two Integer parameters.
void addConsoleActionI(const char *token, VoidInt callback)
Register a console command with one Integer parameter.
void addConsoleActionFFFF(const char *token, VoidFloatFloatFloatFloat callback)
void addConsoleActionFFF(const char *token, VoidFloatFloatFloat callback)
EnginePins enginePins
Definition efi_gpio.cpp:24
efitick_t getTimeNowNt()
Definition efitime.cpp:19
void etbAutocal(dc_function_e function, bool reportToTs)
static EngineAccessor engine
Definition engine.h:413
static constexpr engine_configuration_s * engineConfiguration
debug_mode_e
@ TS_GRAB_TPS_CLOSED
@ TS_TRIGGER_STIMULATOR_ENABLE
@ TS_ETB_STOP_AUTOTUNE
@ TS_WRITE_FLASH
@ TS_ETB_DISABLE_JAM_DETECT
@ TS_SD_FORMAT
@ TS_SD_MOUNT_PC
@ TS_GRAB_PEDAL_UP
@ TS_ETB_AUTOCAL_0_FAST
@ TS_START_STOP_ENGINE
@ TS_SD_UNMOUNT
@ TS_ETB_AUTOCAL_0
@ TS_RESET_TLE8888
@ TS_ETB_AUTOCAL_1
@ TS_TRIGGER_STIMULATOR_DISABLE
@ TS_SD_MOUNT_ECU
@ TS_RESET_MC33810
@ TS_EWG_AUTOCAL_0_FAST
@ TS_EWG_AUTOCAL_0
@ TS_ETB_START_AUTOTUNE
@ TS_GRAB_PEDAL_WOT
@ TS_GRAB_TPS_OPEN
@ TS_SD_DELETE_REPORTS
@ COMMAND_X14_UNUSED_15
@ TS_ETB_AUTOCAL_1_FAST
@ TS_SET_STEPPER_IDLE
@ TS_EXTERNAL_TRIGGER_STIMULATOR_ENABLE
@ TS_WIDEBAND_UPDATE
@ LUA_COMMAND_3
@ BENCH_AC_COMPRESSOR_RELAY
@ LUA_COMMAND_2
@ BENCH_FAN_RELAY
@ BENCH_CANCEL
@ BENCH_VVT0_VALVE
@ BENCH_AUXOUT4
@ BENCH_AUXOUT2
@ LUA_COMMAND_1
@ BENCH_MAIN_RELAY
@ BENCH_AUXOUT7
@ HD_ACR2
@ BENCH_IDLE_VALVE
@ LTFT_APPLY_TO_VE
@ LTFT_DEV_POKE
@ HD_ACR
@ BENCH_AUXOUT3
@ BENCH_CHECK_ENGINE_LIGHT
@ BENCH_VVT3_VALVE
@ BENCH_AUXOUT5
@ LUA_COMMAND_4
@ BENCH_AUXOUT1
@ BENCH_VVT1_VALVE
@ BENCH_AUXOUT0
@ BENCH_FAN_RELAY_2
@ LTFT_RESET
@ BENCH_HPFP_VALVE
@ BENCH_FUEL_PUMP
@ BENCH_AUXOUT6
@ BENCH_STARTER_ENABLE_RELAY
@ BENCH_VVT2_VALVE
@ TS_WIDEBAND_SET_IDX_BY_ID
@ TS_WIDEBAND
@ TS_CLEAR_WARNINGS
@ TS_BOARD_ACTION
@ TS_SOLENOID_CATEGORY
@ TS_LUA_OUTPUT_CATEGORY
@ TS_DEBUG_MODE
@ TS_SET_ENGINE_TYPE
@ TS_X14
@ TS_IGNITION_CATEGORY
@ TS_BENCH_CATEGORY
@ TS_WIDEBAND_SET_SENS_BY_ID
@ TS_WIDEBAND_PING_BY_ID
@ TS_WIDEBAND_FLASH_BY_ID
@ TS_SET_DEFAULT_ENGINE
@ TS_INJECTOR_CATEGORY
@ TS_STOP_ENGINE
void firmwareError(ObdCode code, const char *fmt,...)
void writeToFlashNow()
void setStepperHw()
Definition gm_sbc.cpp:15
void startIdleBench(void)
UNUSED(samplingTimeSeconds)
void applyLongTermFuelTrimToVe()
void resetLongTermFuelTrim()
void devPokeLongTermFuelTrim()
Main logic header.
void clearWarnings(void)
This data structure holds current malfunction codes.
void mc33810_req_init()
Definition mc33810.cpp:993
void sdCardRemoveReportFiles()
void sdCardRequestMode(SD_MODE mode)
@ SD_MODE_UNMOUNT
Definition mmc_card.h:20
@ SD_MODE_PC
Definition mmc_card.h:19
@ SD_MODE_ECU
Definition mmc_card.h:18
@ SD_MODE_FORMAT
Definition mmc_card.h:21
@ STACK_USAGE_MISC
@ CUSTOM_ERR_BENCH_PARAM
void pinDiag2string(char *buffer, size_t size, brain_pin_diag_e pin_diag)
const char * hwPortname(brain_pin_e brainPin)
void rebootNow()
Definition rusefi.cpp:150
brain_pin_diag_e
void setWidebandSensorType(uint8_t hwIndex, uint8_t type)
void pingWideband(uint8_t hwIndex)
void setWidebandOffset(uint8_t hwIndex, uint8_t index)
void updateWidebandFirmware(uint8_t hwIndex)
running("running", SensorCategory.SENSOR_INPUTS, FieldType.INT, 888, 1.0, -1.0, -1.0, "")
void setEngineType(int value, bool isWriteToFlash)
Definition settings.cpp:739
void doScheduleStopEngine(StopRequestedReason reason)
void startStopButtonToggle()
brain_pin_e pin
Definition stm32_adc.cpp:15
uint8_t data8[8]
Frame data.
Definition can_mocks.h:55
void tle8888_req_init()
Definition tle8888.cpp:1272
void grabPedalIsUp()
Definition tps.cpp:31
void grapTps1PrimaryIsClosed()
Definition tps.cpp:45
void grapTps1PrimaryIsOpen()
Definition tps.cpp:50
void grabPedalIsWideOpen()
Definition tps.cpp:39
void disableTriggerStimulator()
void enableExternalTriggerStimulator()
void enableTriggerStimulator(bool incGlobalConfiguration)
void onApplyPreset()
uint16_t count
Definition tunerstudio.h:1
maintainConstantValue implementation header
float getConfigValueByHash(const int hash)
OutputPin * getVvtOutputPin(int index)
Definition vvt.cpp:153