2017-03-24 10:41:36 -07:00
|
|
|
/**
|
|
|
|
* @file status_loop.cpp
|
|
|
|
* @brief Human-readable protocol status messages
|
|
|
|
*
|
2019-05-02 14:52:48 -07:00
|
|
|
* http://rusefi.com/forum/viewtopic.php?t=263 rusEfi console overview
|
2017-03-24 10:41:36 -07:00
|
|
|
* http://rusefi.com/forum/viewtopic.php?t=210 Commands overview
|
|
|
|
*
|
|
|
|
*
|
|
|
|
* @date Mar 15, 2013
|
2020-01-13 18:57:43 -08:00
|
|
|
* @author Andrey Belomutskiy, (c) 2012-2020
|
2017-03-24 10:41:36 -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/>.
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
2018-09-16 19:26:57 -07:00
|
|
|
#include "global.h"
|
2017-03-24 10:41:36 -07:00
|
|
|
#include "status_loop.h"
|
2019-04-01 14:04:49 -07:00
|
|
|
#include "hip9011_logic.h"
|
2019-01-11 16:08:15 -08:00
|
|
|
#include "engine_controller.h"
|
2017-03-24 10:41:36 -07:00
|
|
|
|
|
|
|
#include "adc_inputs.h"
|
2019-12-03 22:11:10 -08:00
|
|
|
#if EFI_LOGIC_ANALYZER
|
|
|
|
#include "logic_analyzer.h"
|
|
|
|
#endif /* EFI_LOGIC_ANALYZER */
|
2017-03-24 10:41:36 -07:00
|
|
|
|
|
|
|
#include "trigger_central.h"
|
2019-05-27 15:58:43 -07:00
|
|
|
#include "allsensors.h"
|
2019-09-21 11:33:38 -07:00
|
|
|
#include "sensor_reader.h"
|
2017-03-24 10:41:36 -07:00
|
|
|
#include "io_pins.h"
|
2019-03-29 06:11:13 -07:00
|
|
|
#include "efi_gpio.h"
|
2017-03-24 10:41:36 -07:00
|
|
|
#include "mmc_card.h"
|
|
|
|
#include "console_io.h"
|
|
|
|
#include "malfunction_central.h"
|
|
|
|
#include "speed_density.h"
|
|
|
|
|
|
|
|
#include "advance_map.h"
|
|
|
|
#include "tunerstudio.h"
|
|
|
|
#include "fuel_math.h"
|
|
|
|
#include "main_trigger_callback.h"
|
|
|
|
#include "engine_math.h"
|
|
|
|
#include "spark_logic.h"
|
|
|
|
#include "idle_thread.h"
|
|
|
|
#include "engine_configuration.h"
|
2019-07-06 17:15:49 -07:00
|
|
|
#include "os_util.h"
|
2017-03-24 10:41:36 -07:00
|
|
|
#include "svnversion.h"
|
|
|
|
#include "engine.h"
|
|
|
|
#include "lcd_controller.h"
|
|
|
|
#include "settings.h"
|
2018-01-29 16:41:39 -08:00
|
|
|
#include "can_hw.h"
|
2019-07-08 00:35:41 -07:00
|
|
|
#include "periodic_thread_controller.h"
|
2019-01-03 21:16:08 -08:00
|
|
|
#include "cdm_ion_sense.h"
|
2020-05-21 12:52:58 -07:00
|
|
|
#include "binary_logging.h"
|
2017-03-24 10:41:36 -07:00
|
|
|
|
|
|
|
extern bool main_loop_started;
|
|
|
|
|
2019-04-12 19:10:57 -07:00
|
|
|
#if EFI_PROD_CODE
|
2017-03-24 10:41:36 -07:00
|
|
|
// todo: move this logic to algo folder!
|
|
|
|
#include "rtc_helper.h"
|
|
|
|
#include "lcd_HD44780.h"
|
|
|
|
#include "rusefi.h"
|
|
|
|
#include "pin_repository.h"
|
|
|
|
#include "flash_main.h"
|
|
|
|
#include "max31855.h"
|
|
|
|
#include "vehicle_speed.h"
|
2019-03-29 06:11:13 -07:00
|
|
|
#include "single_timer_executor.h"
|
2019-07-13 07:24:23 -07:00
|
|
|
#include "periodic_task.h"
|
2020-03-08 05:57:21 -07:00
|
|
|
extern int icuRisingCallbackCounter;
|
|
|
|
extern int icuFallingCallbackCounter;
|
2017-12-16 21:17:55 -08:00
|
|
|
#endif /* EFI_PROD_CODE */
|
|
|
|
|
2019-04-12 19:10:57 -07:00
|
|
|
#if EFI_CJ125
|
2019-04-01 14:04:49 -07:00
|
|
|
#include "cj125.h"
|
2018-11-03 08:44:57 -07:00
|
|
|
#endif /* EFI_CJ125 */
|
|
|
|
|
2018-02-06 13:21:41 -08:00
|
|
|
#if EFI_MAP_AVERAGING
|
|
|
|
#include "map_averaging.h"
|
|
|
|
#endif
|
|
|
|
|
2019-04-12 19:10:57 -07:00
|
|
|
#if EFI_FSIO
|
2017-12-16 21:17:55 -08:00
|
|
|
#include "fsio_impl.h"
|
|
|
|
#endif /* EFI_FSIO */
|
2017-03-24 10:41:36 -07:00
|
|
|
|
2019-10-31 13:06:34 -07:00
|
|
|
#if (BOARD_TLE8888_COUNT > 0)
|
|
|
|
#include "tle8888.h"
|
|
|
|
#endif /* BOARD_TLE8888_COUNT */
|
|
|
|
|
2019-07-13 07:36:31 -07:00
|
|
|
#if EFI_ENGINE_SNIFFER
|
|
|
|
#include "engine_sniffer.h"
|
|
|
|
extern WaveChart waveChart;
|
|
|
|
#endif /* EFI_ENGINE_SNIFFER */
|
|
|
|
|
2017-03-24 10:41:36 -07:00
|
|
|
int warningEnabled = true;
|
|
|
|
|
2018-09-17 18:42:04 -07:00
|
|
|
extern int maxTriggerReentraint;
|
|
|
|
extern uint32_t maxLockedDuration;
|
2019-12-21 17:35:13 -08:00
|
|
|
|
2017-03-24 10:41:36 -07:00
|
|
|
|
2019-04-12 19:10:57 -07:00
|
|
|
#if !defined(STATUS_LOGGING_BUFFER_SIZE)
|
2019-03-29 07:29:01 -07:00
|
|
|
#define STATUS_LOGGING_BUFFER_SIZE 1800
|
|
|
|
#endif /* STATUS_LOGGING_BUFFER_SIZE */
|
2019-01-03 21:16:08 -08:00
|
|
|
|
2019-03-29 07:29:01 -07:00
|
|
|
static char LOGGING_BUFFER[STATUS_LOGGING_BUFFER_SIZE] CCM_OPTIONAL;
|
2017-03-24 10:41:36 -07:00
|
|
|
static Logging logger("status loop", LOGGING_BUFFER, sizeof(LOGGING_BUFFER));
|
|
|
|
|
|
|
|
static void setWarningEnabled(int value) {
|
|
|
|
warningEnabled = value;
|
|
|
|
}
|
|
|
|
|
2019-04-12 19:10:57 -07:00
|
|
|
#if EFI_FILE_LOGGING
|
2017-05-03 18:24:18 -07:00
|
|
|
// this one needs to be in main ram so that SD card SPI DMA works fine
|
2020-05-21 12:52:58 -07:00
|
|
|
static char sdLogBuffer[2048] MAIN_RAM;
|
|
|
|
static uint64_t binaryLogCount = 0;
|
2019-11-05 17:07:55 -08:00
|
|
|
|
2017-03-24 10:41:36 -07:00
|
|
|
#endif /* EFI_FILE_LOGGING */
|
|
|
|
|
2020-03-29 16:06:03 -07:00
|
|
|
EXTERN_ENGINE;
|
2017-03-24 10:41:36 -07:00
|
|
|
|
|
|
|
static char buf[6];
|
|
|
|
|
|
|
|
/**
|
|
|
|
* This is useful if we are changing engine mode dynamically
|
|
|
|
* For example http://rusefi.com/forum/viewtopic.php?f=5&t=1085
|
|
|
|
*/
|
2017-05-15 20:28:49 -07:00
|
|
|
static int packEngineMode(DECLARE_ENGINE_PARAMETER_SIGNATURE) {
|
2017-03-24 10:41:36 -07:00
|
|
|
return (engineConfiguration->fuelAlgorithm << 4) +
|
|
|
|
(engineConfiguration->injectionMode << 2) +
|
|
|
|
engineConfiguration->ignitionMode;
|
|
|
|
}
|
|
|
|
|
2019-09-20 16:38:19 -07:00
|
|
|
static float getAirFlowGauge(DECLARE_ENGINE_PARAMETER_SIGNATURE) {
|
|
|
|
return hasMafSensor() ? getRealMaf(PASS_ENGINE_PARAMETER_SIGNATURE) : engine->engineState.airFlow;
|
|
|
|
}
|
|
|
|
|
2020-05-21 12:52:58 -07:00
|
|
|
void writeLogLine() {
|
2019-11-05 17:07:55 -08:00
|
|
|
#if EFI_FILE_LOGGING
|
2020-05-21 12:52:58 -07:00
|
|
|
if (!main_loop_started)
|
2018-01-24 18:31:42 -08:00
|
|
|
return;
|
2017-03-24 10:41:36 -07:00
|
|
|
|
2020-05-21 12:52:58 -07:00
|
|
|
size_t length = efi::size(sdLogBuffer);
|
2017-03-24 10:41:36 -07:00
|
|
|
|
2020-05-21 12:52:58 -07:00
|
|
|
if (binaryLogCount == 0) {
|
|
|
|
memset(sdLogBuffer, 0xAA, length);
|
|
|
|
writeHeader(sdLogBuffer);
|
|
|
|
} else {
|
|
|
|
updateTunerStudioState(&tsOutputChannels);
|
|
|
|
length = writeBlock(sdLogBuffer);
|
2017-03-24 10:41:36 -07:00
|
|
|
}
|
|
|
|
|
2020-05-21 12:52:58 -07:00
|
|
|
appendToLog(sdLogBuffer, length);
|
2017-05-15 17:23:45 -07:00
|
|
|
|
2020-05-21 12:52:58 -07:00
|
|
|
binaryLogCount++;
|
2017-03-24 10:41:36 -07:00
|
|
|
#endif /* EFI_FILE_LOGGING */
|
|
|
|
}
|
|
|
|
|
|
|
|
static int prevCkpEventCounter = -1;
|
|
|
|
|
|
|
|
static LoggingWithStorage logger2("main event handler");
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Time when the firmware version was reported last time, in seconds
|
|
|
|
* TODO: implement a request/response instead of just constantly sending this out
|
|
|
|
*/
|
|
|
|
static systime_t timeOfPreviousPrintVersion = (systime_t) -1;
|
|
|
|
|
2019-04-12 19:10:57 -07:00
|
|
|
#if EFI_PROD_CODE
|
2017-03-24 10:41:36 -07:00
|
|
|
static void printOutPin(const char *pinName, brain_pin_e hwPin) {
|
|
|
|
if (hwPin != GPIO_UNASSIGNED) {
|
2019-08-18 09:14:33 -07:00
|
|
|
appendPrintf(&logger, "%s%s%s@%s%s", PROTOCOL_OUTPIN, DELIMETER, pinName, hwPortname(hwPin), DELIMETER);
|
2017-03-24 10:41:36 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
#endif /* EFI_PROD_CODE */
|
|
|
|
|
2018-04-01 20:49:57 -07:00
|
|
|
void printOverallStatus(systime_t nowSeconds) {
|
2019-07-13 07:36:31 -07:00
|
|
|
#if EFI_ENGINE_SNIFFER
|
|
|
|
waveChart.publishIfFull();
|
|
|
|
#endif /* EFI_ENGINE_SNIFFER */
|
|
|
|
|
2017-03-24 10:41:36 -07:00
|
|
|
/**
|
|
|
|
* we report the version every 4 seconds - this way the console does not need to
|
|
|
|
* request it and we will display it pretty soon
|
|
|
|
*/
|
|
|
|
if (overflowDiff(nowSeconds, timeOfPreviousPrintVersion) < 4) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
timeOfPreviousPrintVersion = nowSeconds;
|
2019-01-11 16:08:15 -08:00
|
|
|
int seconds = getTimeNowSeconds();
|
2019-07-13 11:08:08 -07:00
|
|
|
printCurrentState(&logger, seconds, getConfigurationName(engineConfiguration->engineType), FIRMWARE_ID);
|
2019-04-12 19:10:57 -07:00
|
|
|
#if EFI_PROD_CODE
|
2019-12-11 14:48:55 -08:00
|
|
|
printOutPin(PROTOCOL_CRANK1, CONFIG(triggerInputPins)[0]);
|
|
|
|
printOutPin(PROTOCOL_CRANK2, CONFIG(triggerInputPins)[1]);
|
2019-08-18 12:04:02 -07:00
|
|
|
printOutPin(PROTOCOL_VVT_NAME, engineConfiguration->camInputs[0]);
|
2019-12-11 14:48:55 -08:00
|
|
|
printOutPin(PROTOCOL_HIP_NAME, CONFIG(hip9011IntHoldPin));
|
|
|
|
printOutPin(PROTOCOL_TACH_NAME, CONFIG(tachOutputPin));
|
2019-08-18 12:04:02 -07:00
|
|
|
printOutPin(PROTOCOL_DIZZY_NAME, engineConfiguration->dizzySparkOutputPin);
|
2019-12-03 22:11:10 -08:00
|
|
|
#if EFI_LOGIC_ANALYZER
|
2019-12-11 14:48:55 -08:00
|
|
|
printOutPin(PROTOCOL_WA_CHANNEL_1, CONFIG(logicAnalyzerPins)[0]);
|
|
|
|
printOutPin(PROTOCOL_WA_CHANNEL_2, CONFIG(logicAnalyzerPins)[1]);
|
2019-12-03 22:11:10 -08:00
|
|
|
#endif /* EFI_LOGIC_ANALYZER */
|
2017-03-24 10:41:36 -07:00
|
|
|
|
|
|
|
for (int i = 0; i < engineConfiguration->specs.cylindersCount; i++) {
|
2019-12-11 14:48:55 -08:00
|
|
|
printOutPin(enginePins.coils[i].getShortName(), CONFIG(ignitionPins)[i]);
|
2017-03-24 10:41:36 -07:00
|
|
|
|
2019-12-11 14:48:55 -08:00
|
|
|
printOutPin(enginePins.injectors[i].getShortName(), CONFIG(injectionPins)[i]);
|
2017-03-24 10:41:36 -07:00
|
|
|
}
|
2017-11-27 18:49:58 -08:00
|
|
|
for (int i = 0; i < AUX_DIGITAL_VALVE_COUNT;i++) {
|
2019-08-18 12:27:10 -07:00
|
|
|
printOutPin(enginePins.auxValve[i].getShortName(), engineConfiguration->auxValves[i]);
|
2017-11-27 18:49:58 -08:00
|
|
|
}
|
|
|
|
|
2017-03-24 10:41:36 -07:00
|
|
|
#endif /* EFI_PROD_CODE */
|
2018-04-01 20:49:57 -07:00
|
|
|
scheduleLogging(&logger);
|
2017-03-24 10:41:36 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
static systime_t timeOfPreviousReport = (systime_t) -1;
|
|
|
|
|
|
|
|
/**
|
2019-05-02 14:52:48 -07:00
|
|
|
* @brief Sends all pending data to rusEfi console
|
2018-04-01 20:29:00 -07:00
|
|
|
*
|
|
|
|
* This method is periodically invoked by the main loop
|
2020-06-13 19:46:10 -07:00
|
|
|
* todo: is this mostly dead code?
|
2017-03-24 10:41:36 -07:00
|
|
|
*/
|
2017-04-09 19:26:11 -07:00
|
|
|
void updateDevConsoleState(void) {
|
2018-04-01 20:29:00 -07:00
|
|
|
// todo: make SWO work
|
|
|
|
// char *msg = "hello\r\n";
|
|
|
|
// for(int i=0;i<strlen(msg);i++) {
|
|
|
|
// ITM_SendChar(msg[i]);
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
|
|
|
2017-03-24 10:41:36 -07:00
|
|
|
if (!isCommandLineConsoleReady()) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2019-04-12 19:10:57 -07:00
|
|
|
#if EFI_PROD_CODE
|
2017-03-24 10:41:36 -07:00
|
|
|
// todo: unify with simulator!
|
|
|
|
if (hasFirmwareError()) {
|
2020-03-28 18:28:32 -07:00
|
|
|
scheduleMsg(&logger, "%s error: %s", CRITICAL_PREFIX, getFirmwareError());
|
2017-03-24 10:41:36 -07:00
|
|
|
warningEnabled = false;
|
|
|
|
scheduleLogging(&logger);
|
|
|
|
return;
|
|
|
|
}
|
2019-06-16 14:13:11 -07:00
|
|
|
#endif /* EFI_PROD_CODE */
|
2017-03-24 10:41:36 -07:00
|
|
|
|
2019-06-16 14:13:11 -07:00
|
|
|
#if HAL_USE_ADC
|
2017-03-24 10:41:36 -07:00
|
|
|
printFullAdcReportIfNeeded(&logger);
|
2019-06-16 14:13:11 -07:00
|
|
|
#endif /* HAL_USE_ADC */
|
2017-03-24 10:41:36 -07:00
|
|
|
|
|
|
|
systime_t nowSeconds = getTimeNowSeconds();
|
|
|
|
|
2019-04-12 19:10:57 -07:00
|
|
|
#if EFI_ENGINE_CONTROL && EFI_SHAFT_POSITION_INPUT
|
2019-02-02 23:47:20 -08:00
|
|
|
int currentCkpEventCounter = engine->triggerCentral.triggerState.getTotalEventCounter();
|
2017-03-24 10:41:36 -07:00
|
|
|
if (prevCkpEventCounter == currentCkpEventCounter && timeOfPreviousReport == nowSeconds) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
timeOfPreviousReport = nowSeconds;
|
|
|
|
|
|
|
|
prevCkpEventCounter = currentCkpEventCounter;
|
|
|
|
#else
|
|
|
|
chThdSleepMilliseconds(200);
|
|
|
|
#endif
|
|
|
|
|
2019-12-03 22:11:10 -08:00
|
|
|
#if EFI_LOGIC_ANALYZER
|
2017-03-24 10:41:36 -07:00
|
|
|
printWave(&logger);
|
2019-12-03 22:11:10 -08:00
|
|
|
#endif /* EFI_LOGIC_ANALYZER */
|
2017-03-24 10:41:36 -07:00
|
|
|
|
|
|
|
scheduleLogging(&logger);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* command example:
|
|
|
|
* sfm 3500 400
|
|
|
|
* that would be 'show fuel for rpm 3500 maf 4.0'
|
|
|
|
*/
|
|
|
|
|
|
|
|
static void showFuelInfo2(float rpm, float engineLoad) {
|
|
|
|
|
2020-07-30 21:20:10 -07:00
|
|
|
float baseFuelMs = 0; // TODO
|
2017-03-24 10:41:36 -07:00
|
|
|
|
2020-07-22 13:11:07 -07:00
|
|
|
float magicAir = SpeedDensityBase::getAirmassImpl(1, 100, convertCelsiusToKelvin(20) PASS_ENGINE_PARAMETER_SUFFIX);
|
2017-03-24 10:41:36 -07:00
|
|
|
|
2018-01-23 09:05:14 -08:00
|
|
|
scheduleMsg(&logger, "inj flow %.2fcc/min displacement %.2fL", engineConfiguration->injector.flow,
|
2017-03-24 10:41:36 -07:00
|
|
|
engineConfiguration->specs.displacement);
|
|
|
|
|
|
|
|
scheduleMsg(&logger2, "algo=%s/pump=%s", getEngine_load_mode_e(engineConfiguration->fuelAlgorithm),
|
|
|
|
boolToString(enginePins.fuelPumpRelay.getLogicValue()));
|
|
|
|
|
2020-07-20 23:11:48 -07:00
|
|
|
scheduleMsg(&logger2, "injection phase=%.2f/global fuel correction=%.2f", getInjectionOffset(rpm, getFuelingLoad()), engineConfiguration->globalFuelCorrection);
|
2017-03-24 10:41:36 -07:00
|
|
|
|
2018-01-23 09:05:14 -08:00
|
|
|
scheduleMsg(&logger2, "baro correction=%.2f", engine->engineState.baroCorrection);
|
2017-03-24 10:41:36 -07:00
|
|
|
|
2019-04-12 19:10:57 -07:00
|
|
|
#if EFI_ENGINE_CONTROL
|
2018-01-23 09:05:14 -08:00
|
|
|
scheduleMsg(&logger, "base cranking fuel %.2f", engineConfiguration->cranking.baseFuel);
|
2020-06-17 14:15:04 -07:00
|
|
|
scheduleMsg(&logger2, "cranking fuel: %.2f", ENGINE(engineState.cranking.fuel));
|
2017-03-24 10:41:36 -07:00
|
|
|
|
2020-09-05 15:49:42 -07:00
|
|
|
if (!engine->rpmCalculator.isStopped()) {
|
2019-08-26 20:41:04 -07:00
|
|
|
float iatCorrection = engine->engineState.running.intakeTemperatureCoefficient;
|
|
|
|
float cltCorrection = engine->engineState.running.coolantTemperatureCoefficient;
|
|
|
|
floatms_t injectorLag = engine->engineState.running.injectorLag;
|
2018-01-23 09:05:14 -08:00
|
|
|
scheduleMsg(&logger2, "rpm=%.2f engineLoad=%.2f", rpm, engineLoad);
|
|
|
|
scheduleMsg(&logger2, "baseFuel=%.2f", baseFuelMs);
|
2017-03-24 10:41:36 -07:00
|
|
|
|
2018-01-23 09:05:14 -08:00
|
|
|
scheduleMsg(&logger2, "iatCorrection=%.2f cltCorrection=%.2f injectorLag=%.2f", iatCorrection, cltCorrection,
|
2017-03-24 10:41:36 -07:00
|
|
|
injectorLag);
|
|
|
|
|
2017-05-15 20:28:49 -07:00
|
|
|
float value = getRunningFuel(baseFuelMs PASS_ENGINE_PARAMETER_SUFFIX);
|
2018-01-23 09:05:14 -08:00
|
|
|
scheduleMsg(&logger2, "injection pulse width: %.2f", value);
|
2017-03-24 10:41:36 -07:00
|
|
|
}
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
2019-04-12 19:10:57 -07:00
|
|
|
#if EFI_ENGINE_CONTROL
|
2017-03-24 10:41:36 -07:00
|
|
|
static void showFuelInfo(void) {
|
2020-07-28 12:13:55 -07:00
|
|
|
showFuelInfo2((float) GET_RPM(), getFuelingLoad(PASS_ENGINE_PARAMETER_SIGNATURE));
|
2017-03-24 10:41:36 -07:00
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
2019-11-05 17:07:55 -08:00
|
|
|
static OutputPin *leds[] = { &enginePins.warningLedPin, &enginePins.runningLedPin,
|
2018-07-26 12:51:06 -07:00
|
|
|
&enginePins.errorLedPin, &enginePins.communicationLedPin, &enginePins.checkEnginePin };
|
2017-03-24 10:41:36 -07:00
|
|
|
|
|
|
|
static void initStatusLeds(void) {
|
2018-07-26 12:51:06 -07:00
|
|
|
enginePins.communicationLedPin.initPin("led: comm status", engineConfiguration->communicationLedPin);
|
2017-03-24 10:41:36 -07:00
|
|
|
// we initialize this here so that we can blink it on start-up
|
2020-03-29 16:07:07 -07:00
|
|
|
enginePins.checkEnginePin.initPin("Check engine light", CONFIG(malfunctionIndicatorPin), &CONFIG(malfunctionIndicatorPinMode));
|
2017-04-21 14:50:28 -07:00
|
|
|
|
2019-04-28 20:04:52 -07:00
|
|
|
enginePins.warningLedPin.initPin("led: warning status", engineConfiguration->warningLedPin);
|
2018-07-26 12:51:06 -07:00
|
|
|
enginePins.runningLedPin.initPin("led: running status", engineConfiguration->runningLedPin);
|
2019-11-10 09:39:47 -08:00
|
|
|
|
2019-12-11 14:48:55 -08:00
|
|
|
enginePins.debugTriggerSync.initPin("debug: sync", CONFIG(debugTriggerSync));
|
2020-08-23 23:01:50 -07:00
|
|
|
#if EFI_GPIO_HARDWARE && EFI_SHAFT_POSITION_INPUT
|
|
|
|
enginePins.triggerDecoderErrorPin.initPin("led: trigger debug", CONFIG(triggerErrorPin),
|
|
|
|
&CONFIG(triggerErrorPinMode));
|
|
|
|
#endif /* EFI_GPIO_HARDWARE */
|
2017-03-24 10:41:36 -07:00
|
|
|
}
|
|
|
|
|
2019-04-12 19:10:57 -07:00
|
|
|
#if EFI_PROD_CODE
|
2017-03-24 10:41:36 -07:00
|
|
|
|
|
|
|
static bool isTriggerErrorNow() {
|
2019-04-12 19:10:57 -07:00
|
|
|
#if EFI_ENGINE_CONTROL && EFI_SHAFT_POSITION_INPUT
|
2019-12-21 18:18:38 -08:00
|
|
|
bool justHadError = (getTimeNowNt() - engine->triggerCentral.triggerState.lastDecodingErrorTime) < MS2NT(200);
|
2017-03-24 10:41:36 -07:00
|
|
|
return justHadError || isTriggerDecoderError();
|
2019-01-31 14:55:23 -08:00
|
|
|
#else
|
|
|
|
return false;
|
|
|
|
#endif /* EFI_ENGINE_CONTROL && EFI_SHAFT_POSITION_INPUT */
|
2017-03-24 10:41:36 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
extern bool consoleByteArrived;
|
|
|
|
|
2019-07-13 08:06:03 -07:00
|
|
|
class CommunicationBlinkingTask : public PeriodicTimerController {
|
2017-03-24 10:41:36 -07:00
|
|
|
|
2019-07-13 07:24:23 -07:00
|
|
|
int getPeriodMs() override {
|
|
|
|
return counter % 2 == 0 ? onTimeMs : offTimeMs;
|
|
|
|
}
|
2017-03-24 10:41:36 -07:00
|
|
|
|
2019-07-13 07:24:23 -07:00
|
|
|
void setAllLeds(int value) {
|
2020-03-28 18:28:32 -07:00
|
|
|
// make sure we do not turn the critical LED off if already have
|
|
|
|
// critical error by now
|
2019-07-13 11:08:08 -07:00
|
|
|
for (uint32_t i = 0; !hasFirmwareError() && i < sizeof(leds) / sizeof(leds[0]); i++) {
|
2019-07-13 07:24:23 -07:00
|
|
|
leds[i]->setValue(value);
|
|
|
|
}
|
|
|
|
}
|
2017-03-24 10:41:36 -07:00
|
|
|
|
2019-07-13 07:24:23 -07:00
|
|
|
void PeriodicTask() override {
|
|
|
|
counter++;
|
2020-05-12 22:17:48 -07:00
|
|
|
|
|
|
|
bool lowVBatt = getVBatt(PASS_ENGINE_PARAMETER_SIGNATURE) < LOW_VBATT;
|
|
|
|
|
2019-07-13 07:24:23 -07:00
|
|
|
if (counter == 1) {
|
|
|
|
// first invocation of BlinkingTask
|
|
|
|
setAllLeds(1);
|
|
|
|
} else if (counter == 2) {
|
|
|
|
// second invocation of BlinkingTask
|
|
|
|
setAllLeds(0);
|
|
|
|
} else if (counter % 2 == 0) {
|
|
|
|
enginePins.communicationLedPin.setValue(0);
|
2020-05-20 19:15:47 -07:00
|
|
|
#if HW_CHECK_MODE
|
|
|
|
// we have to do anything possible to help users notice FACTORY MODE
|
|
|
|
enginePins.errorLedPin.setValue(1);
|
|
|
|
enginePins.runningLedPin.setValue(1);
|
|
|
|
#endif // HW_CHECK_MODE
|
2020-05-12 22:17:48 -07:00
|
|
|
if (!lowVBatt) {
|
|
|
|
enginePins.warningLedPin.setValue(0);
|
|
|
|
}
|
2019-07-13 07:24:23 -07:00
|
|
|
} else {
|
2020-06-13 10:23:34 -07:00
|
|
|
#define BLINKING_PERIOD_MS 33
|
|
|
|
|
2019-07-13 07:24:23 -07:00
|
|
|
if (hasFirmwareError()) {
|
2020-03-28 18:28:32 -07:00
|
|
|
// special behavior in case of critical error - not equal on/off time
|
2019-07-13 07:24:23 -07:00
|
|
|
// this special behaviour helps to notice that something is not right, also
|
2020-03-28 18:28:32 -07:00
|
|
|
// differentiates software firmware error from critical interrupt error with CPU halt.
|
2019-07-13 07:24:23 -07:00
|
|
|
offTimeMs = 50;
|
|
|
|
onTimeMs = 450;
|
2020-06-13 10:23:34 -07:00
|
|
|
} else if (consoleByteArrived) {
|
|
|
|
consoleByteArrived = false;
|
|
|
|
offTimeMs = 100;
|
|
|
|
onTimeMs = 33;
|
|
|
|
#if EFI_INTERNAL_FLASH
|
|
|
|
} else if (getNeedToWriteConfiguration()) {
|
|
|
|
offTimeMs = onTimeMs = 500;
|
|
|
|
#endif // EFI_INTERNAL_FLASH
|
2019-07-13 07:24:23 -07:00
|
|
|
} else {
|
|
|
|
onTimeMs = is_usb_serial_ready() ? 3 * BLINKING_PERIOD_MS : BLINKING_PERIOD_MS;
|
2020-06-13 10:23:34 -07:00
|
|
|
offTimeMs = 0.6 * onTimeMs;
|
2019-07-13 07:24:23 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
enginePins.communicationLedPin.setValue(1);
|
2020-05-20 19:15:47 -07:00
|
|
|
#if HW_CHECK_MODE
|
|
|
|
// we have to do anything possible to help users notice FACTORY MODE
|
|
|
|
enginePins.errorLedPin.setValue(0);
|
|
|
|
enginePins.runningLedPin.setValue(0);
|
|
|
|
#endif // HW_CHECK_MODE
|
|
|
|
|
2019-07-13 07:24:23 -07:00
|
|
|
#if EFI_ENGINE_CONTROL
|
2020-06-13 10:23:34 -07:00
|
|
|
if (lowVBatt || isTriggerErrorNow() || isIgnitionTimingError()) {
|
|
|
|
// todo: at the moment warning codes do not affect warning LED?!
|
2019-07-13 07:24:23 -07:00
|
|
|
enginePins.warningLedPin.setValue(1);
|
|
|
|
}
|
|
|
|
#endif /* EFI_ENGINE_CONTROL */
|
2017-03-24 10:41:36 -07:00
|
|
|
}
|
2019-07-13 07:24:23 -07:00
|
|
|
}
|
2019-02-05 18:29:55 -08:00
|
|
|
|
2019-07-13 07:24:23 -07:00
|
|
|
private:
|
|
|
|
int counter = 0;
|
|
|
|
int onTimeMs = 100;
|
|
|
|
int offTimeMs = 100;
|
|
|
|
};
|
2017-03-24 10:41:36 -07:00
|
|
|
|
2019-07-13 08:06:03 -07:00
|
|
|
static CommunicationBlinkingTask communicationsBlinkingTask;
|
2017-03-24 10:41:36 -07:00
|
|
|
|
|
|
|
#endif /* EFI_PROD_CODE */
|
|
|
|
|
2019-04-12 19:10:57 -07:00
|
|
|
#if EFI_LCD
|
2019-02-11 12:09:24 -08:00
|
|
|
class LcdController : public PeriodicController<UTILITY_THREAD_STACK_SIZE> {
|
|
|
|
public:
|
2019-12-14 06:12:37 -08:00
|
|
|
LcdController() : PeriodicController("LCD") { }
|
2019-02-11 12:09:24 -08:00
|
|
|
private:
|
2019-12-21 18:11:09 -08:00
|
|
|
void PeriodicTask(efitick_t nowNt) override {
|
2019-02-21 02:44:45 -08:00
|
|
|
UNUSED(nowNt);
|
2020-06-13 19:46:10 -07:00
|
|
|
setPeriod(NOT_TOO_OFTEN(10 /* ms */, 300));
|
2019-12-11 14:48:55 -08:00
|
|
|
if (engineConfiguration->useLcdScreen) {
|
2017-03-24 10:41:36 -07:00
|
|
|
#if EFI_HD44780_LCD
|
2017-05-08 05:15:46 -07:00
|
|
|
updateHD44780lcd();
|
2017-03-24 10:41:36 -07:00
|
|
|
#endif
|
|
|
|
}
|
|
|
|
}
|
2019-02-11 12:09:24 -08:00
|
|
|
};
|
|
|
|
|
|
|
|
static LcdController lcdInstance;
|
2019-03-29 07:29:01 -07:00
|
|
|
#endif /* EFI_LCD */
|
2017-03-24 10:41:36 -07:00
|
|
|
|
2019-04-12 19:10:57 -07:00
|
|
|
#if EFI_HIP_9011
|
2019-01-07 20:55:56 -08:00
|
|
|
extern HIP9011 instance;
|
2017-04-09 19:07:41 -07:00
|
|
|
#endif /* EFI_HIP_9011 */
|
|
|
|
|
2019-09-20 16:38:19 -07:00
|
|
|
|
2019-04-12 19:10:57 -07:00
|
|
|
#if EFI_TUNER_STUDIO
|
2017-03-24 10:41:36 -07:00
|
|
|
|
2017-05-15 20:28:49 -07:00
|
|
|
void updateTunerStudioState(TunerStudioOutputChannels *tsOutputChannels DECLARE_ENGINE_PARAMETER_SUFFIX) {
|
2019-04-12 19:10:57 -07:00
|
|
|
#if EFI_SHAFT_POSITION_INPUT
|
2019-01-21 18:48:58 -08:00
|
|
|
int rpm = GET_RPM();
|
2019-01-03 21:16:08 -08:00
|
|
|
#else /* EFI_SHAFT_POSITION_INPUT */
|
2017-03-24 10:41:36 -07:00
|
|
|
int rpm = 0;
|
2019-01-03 21:16:08 -08:00
|
|
|
#endif /* EFI_SHAFT_POSITION_INPUT */
|
2017-03-24 10:41:36 -07:00
|
|
|
|
2019-04-12 19:10:57 -07:00
|
|
|
#if EFI_PROD_CODE
|
2017-06-07 19:55:05 -07:00
|
|
|
executorStatistics();
|
2019-01-03 21:16:08 -08:00
|
|
|
#endif /* EFI_PROD_CODE */
|
2017-06-07 19:55:05 -07:00
|
|
|
|
2020-08-05 22:15:41 -07:00
|
|
|
#if EFI_SIMULATOR
|
|
|
|
tsOutputChannels->sd_status = 1 + 4;
|
|
|
|
#endif
|
|
|
|
|
2017-03-24 10:41:36 -07:00
|
|
|
// header
|
|
|
|
tsOutputChannels->tsConfigVersion = TS_FILE_VERSION;
|
|
|
|
|
2019-09-20 16:38:19 -07:00
|
|
|
// offset 0
|
2017-03-24 10:41:36 -07:00
|
|
|
tsOutputChannels->rpm = rpm;
|
2020-04-14 22:12:07 -07:00
|
|
|
|
|
|
|
SensorResult clt = Sensor::get(SensorType::Clt);
|
|
|
|
tsOutputChannels->coolantTemperature = clt.Value;
|
|
|
|
tsOutputChannels->isCltError = !clt.Valid;
|
|
|
|
|
|
|
|
SensorResult iat = Sensor::get(SensorType::Iat);
|
|
|
|
tsOutputChannels->intakeAirTemperature = iat.Value;
|
|
|
|
tsOutputChannels->isIatError = !iat.Valid;
|
2020-02-07 01:05:16 -08:00
|
|
|
|
2020-04-07 13:07:09 -07:00
|
|
|
SensorResult auxTemp1 = Sensor::get(SensorType::AuxTemp1);
|
|
|
|
tsOutputChannels->auxTemp1 = auxTemp1.Value;
|
|
|
|
|
|
|
|
SensorResult auxTemp2 = Sensor::get(SensorType::AuxTemp2);
|
|
|
|
tsOutputChannels->auxTemp2 = auxTemp2.Value;
|
|
|
|
|
2020-02-27 00:28:49 -08:00
|
|
|
SensorResult tps1 = Sensor::get(SensorType::Tps1);
|
|
|
|
tsOutputChannels->throttlePosition = tps1.Value;
|
|
|
|
tsOutputChannels->isTpsError = !tps1.Valid;
|
2020-06-01 10:09:48 -07:00
|
|
|
tsOutputChannels->tpsADC = convertVoltageTo10bitADC(Sensor::getRaw(SensorType::Tps1Primary));
|
2020-02-07 01:05:16 -08:00
|
|
|
|
2020-02-27 00:28:49 -08:00
|
|
|
SensorResult tps2 = Sensor::get(SensorType::Tps2);
|
|
|
|
tsOutputChannels->throttle2Position = tps2.Value;
|
|
|
|
|
2020-03-22 14:09:46 -07:00
|
|
|
SensorResult pedal = Sensor::get(SensorType::AcceleratorPedal);
|
|
|
|
tsOutputChannels->pedalPosition = pedal.Value;
|
2020-04-23 21:10:19 -07:00
|
|
|
// Only report fail if you have one (many people don't)
|
2020-05-30 18:50:57 -07:00
|
|
|
tsOutputChannels->isPedalError = !pedal.Valid && Sensor::hasSensor(SensorType::AcceleratorPedalPrimary);
|
2020-02-27 00:28:49 -08:00
|
|
|
|
2020-04-16 17:32:07 -07:00
|
|
|
// Set raw sensors
|
2020-05-30 18:50:57 -07:00
|
|
|
tsOutputChannels->rawTps1Primary = Sensor::getRaw(SensorType::Tps1Primary);
|
|
|
|
tsOutputChannels->rawPpsPrimary = Sensor::getRaw(SensorType::AcceleratorPedalPrimary);
|
2020-08-21 05:53:23 -07:00
|
|
|
tsOutputChannels->rawPpsSecondary = Sensor::getRaw(SensorType::AcceleratorPedalSecondary);
|
2020-04-16 17:32:07 -07:00
|
|
|
tsOutputChannels->rawClt = Sensor::getRaw(SensorType::Clt);
|
|
|
|
tsOutputChannels->rawIat = Sensor::getRaw(SensorType::Iat);
|
|
|
|
tsOutputChannels->rawOilPressure = Sensor::getRaw(SensorType::OilPressure);
|
|
|
|
|
2019-09-20 16:38:19 -07:00
|
|
|
// offset 16
|
2019-07-09 23:14:47 -07:00
|
|
|
tsOutputChannels->massAirFlowVoltage = hasMafSensor() ? getMafVoltage(PASS_ENGINE_PARAMETER_SIGNATURE) : 0;
|
2017-08-28 19:32:29 -07:00
|
|
|
|
2020-09-01 13:22:31 -07:00
|
|
|
// offset 20
|
|
|
|
tsOutputChannels->airFuelRatio = Sensor::get(SensorType::Lambda).value_or(0) * 14.7f;
|
|
|
|
|
2019-09-20 16:38:19 -07:00
|
|
|
// offset 24
|
2020-07-05 13:25:19 -07:00
|
|
|
tsOutputChannels->engineLoad = getEngineLoadT(PASS_ENGINE_PARAMETER_SIGNATURE);
|
|
|
|
|
|
|
|
tsOutputChannels->fuelingLoad = getFuelingLoad(PASS_ENGINE_PARAMETER_SIGNATURE);
|
|
|
|
tsOutputChannels->ignitionLoad = getIgnitionLoad(PASS_ENGINE_PARAMETER_SIGNATURE);
|
2020-04-04 04:42:14 -07:00
|
|
|
|
2020-04-04 06:31:56 -07:00
|
|
|
// KLUDGE? we always show VBatt because Proteus board has VBatt input sensor hardcoded
|
2020-04-04 04:42:14 -07:00
|
|
|
// offset 28
|
|
|
|
tsOutputChannels->vBatt = getVBatt(PASS_ENGINE_PARAMETER_SIGNATURE);
|
2020-02-07 01:05:16 -08:00
|
|
|
|
2019-09-20 16:38:19 -07:00
|
|
|
// offset 36
|
2019-04-12 19:10:57 -07:00
|
|
|
#if EFI_ANALOG_SENSORS
|
2017-03-24 10:41:36 -07:00
|
|
|
tsOutputChannels->baroPressure = hasBaroSensor() ? getBaroPressure() : 0;
|
|
|
|
#endif /* EFI_ANALOG_SENSORS */
|
2019-09-20 16:38:19 -07:00
|
|
|
// 48
|
|
|
|
tsOutputChannels->fuelBase = engine->engineState.baseFuel;
|
|
|
|
// 64
|
|
|
|
tsOutputChannels->actualLastInjection = ENGINE(actualLastInjection);
|
2017-05-18 12:57:55 -07:00
|
|
|
|
2019-09-20 16:38:19 -07:00
|
|
|
|
2019-09-22 04:37:36 -07:00
|
|
|
// 104
|
2019-09-22 04:49:26 -07:00
|
|
|
tsOutputChannels->rpmAcceleration = engine->rpmCalculator.getRpmAcceleration();
|
2019-09-20 16:38:19 -07:00
|
|
|
// offset 108
|
|
|
|
// For air-interpolated tCharge mode, we calculate a decent massAirFlow approximation, so we can show it to users even without MAF sensor!
|
2019-12-16 19:45:46 -08:00
|
|
|
tsOutputChannels->massAirFlow = getAirFlowGauge(PASS_ENGINE_PARAMETER_SIGNATURE);
|
2019-09-20 16:38:19 -07:00
|
|
|
// offset 116
|
|
|
|
// TPS acceleration
|
|
|
|
tsOutputChannels->deltaTps = engine->tpsAccelEnrichment.getMaxDelta();
|
2019-12-25 12:57:47 -08:00
|
|
|
// 128
|
|
|
|
tsOutputChannels->totalTriggerErrorCounter = engine->triggerCentral.triggerState.totalTriggerErrorCounter;
|
2019-09-20 16:38:19 -07:00
|
|
|
// 132
|
2019-12-25 12:57:47 -08:00
|
|
|
tsOutputChannels->orderingErrorCounter = engine->triggerCentral.triggerState.orderingErrorCounter;
|
|
|
|
// 68
|
2017-03-24 10:41:36 -07:00
|
|
|
tsOutputChannels->baroCorrection = engine->engineState.baroCorrection;
|
2019-09-20 16:38:19 -07:00
|
|
|
// 140
|
2020-02-26 15:16:35 -08:00
|
|
|
#if EFI_ENGINE_CONTROL
|
2019-09-20 16:38:19 -07:00
|
|
|
tsOutputChannels->injectorDutyCycle = getInjectorDutyCycle(rpm PASS_ENGINE_PARAMETER_SUFFIX);
|
2020-02-26 15:16:35 -08:00
|
|
|
#endif
|
2019-09-20 16:38:19 -07:00
|
|
|
// 148
|
|
|
|
tsOutputChannels->fuelTankLevel = engine->sensors.fuelTankLevel;
|
|
|
|
// 160
|
2020-07-20 00:55:45 -07:00
|
|
|
const auto& wallFuel = ENGINE(injectionEvents.elements[0].wallFuel);
|
|
|
|
tsOutputChannels->wallFuelAmount = wallFuel.getWallFuel();
|
2019-09-20 16:38:19 -07:00
|
|
|
// 168
|
2020-07-20 00:55:45 -07:00
|
|
|
tsOutputChannels->wallFuelCorrection = wallFuel.wallFuelCorrection;
|
2020-07-20 01:03:13 -07:00
|
|
|
|
|
|
|
// 164
|
|
|
|
tsOutputChannels->iatCorrection = ENGINE(engineState.running.intakeTemperatureCoefficient);
|
2019-09-20 16:38:19 -07:00
|
|
|
// 184
|
|
|
|
tsOutputChannels->cltCorrection = ENGINE(engineState.running.coolantTemperatureCoefficient);
|
|
|
|
// 188
|
|
|
|
tsOutputChannels->fuelRunning = ENGINE(engineState.running.fuel);
|
|
|
|
// 196
|
|
|
|
tsOutputChannels->injectorLagMs = ENGINE(engineState.running.injectorLag);
|
|
|
|
// 224
|
|
|
|
efitimesec_t timeSeconds = getTimeNowSeconds();
|
|
|
|
tsOutputChannels->timeSeconds = timeSeconds;
|
2020-02-26 15:16:35 -08:00
|
|
|
|
|
|
|
#if EFI_SHAFT_POSITION_INPUT
|
2019-09-20 16:38:19 -07:00
|
|
|
// 248
|
2020-01-30 22:49:10 -08:00
|
|
|
tsOutputChannels->vvtPosition = engine->triggerCentral.getVVTPosition();
|
2020-02-26 15:16:35 -08:00
|
|
|
#endif
|
|
|
|
|
2019-09-20 16:38:19 -07:00
|
|
|
// 252
|
|
|
|
tsOutputChannels->engineMode = packEngineMode(PASS_ENGINE_PARAMETER_SIGNATURE);
|
2019-12-25 11:15:44 -08:00
|
|
|
// 120
|
2019-09-20 16:38:19 -07:00
|
|
|
tsOutputChannels->firmwareVersion = getRusEfiVersion();
|
|
|
|
// 268
|
2020-05-31 13:59:05 -07:00
|
|
|
tsOutputChannels->shortTermFuelTrim = 100.0f * (ENGINE(engineState.running.pidCorrection) - 1.0f);
|
2019-12-16 19:45:46 -08:00
|
|
|
// 276
|
|
|
|
tsOutputChannels->accelerationX = engine->sensors.accelerometer.x;
|
|
|
|
// 278
|
|
|
|
tsOutputChannels->accelerationY = engine->sensors.accelerometer.y;
|
|
|
|
// 280
|
|
|
|
tsOutputChannels->oilPressure = Sensor::get(SensorType::OilPressure).Value;
|
|
|
|
// 288
|
|
|
|
tsOutputChannels->injectionOffset = engine->engineState.injectionOffset;
|
2019-09-20 16:38:19 -07:00
|
|
|
|
2020-09-06 16:06:32 -07:00
|
|
|
// offset 112
|
|
|
|
tsOutputChannels->veValue = engine->engineState.currentVe;
|
|
|
|
tsOutputChannels->currentTargetAfr = ENGINE(engineState.targetAFR);
|
|
|
|
|
2019-09-20 16:38:19 -07:00
|
|
|
if (hasMapSensor(PASS_ENGINE_PARAMETER_SIGNATURE)) {
|
|
|
|
float mapValue = getMap(PASS_ENGINE_PARAMETER_SIGNATURE);
|
|
|
|
// offset 40
|
|
|
|
tsOutputChannels->manifoldAirPressure = mapValue;
|
|
|
|
}
|
|
|
|
|
2020-08-28 18:13:50 -07:00
|
|
|
//tsOutputChannels->knockCount = engine->knockCount;
|
|
|
|
//tsOutputChannels->knockLevel = engine->knockVolts;
|
2017-03-24 10:41:36 -07:00
|
|
|
|
2020-05-20 19:15:47 -07:00
|
|
|
#if HW_CHECK_MODE
|
|
|
|
tsOutputChannels->hasCriticalError = 1;
|
|
|
|
#else
|
2020-03-28 18:28:32 -07:00
|
|
|
tsOutputChannels->hasCriticalError = hasFirmwareError();
|
2020-05-20 19:15:47 -07:00
|
|
|
#endif // HW_CHECK_MODE
|
2017-03-24 10:41:36 -07:00
|
|
|
|
2019-01-11 06:58:48 -08:00
|
|
|
tsOutputChannels->isWarnNow = engine->engineState.warnings.isWarningNow(timeSeconds, true);
|
2019-04-12 19:10:57 -07:00
|
|
|
#if EFI_HIP_9011
|
2019-01-07 20:55:56 -08:00
|
|
|
tsOutputChannels->isKnockChipOk = (instance.invalidHip9011ResponsesCount == 0);
|
2018-05-30 21:32:44 -07:00
|
|
|
#endif /* EFI_HIP_9011 */
|
2017-03-24 10:41:36 -07:00
|
|
|
|
2020-03-24 16:55:12 -07:00
|
|
|
#if EFI_LAUNCH_CONTROL
|
|
|
|
tsOutputChannels->launchTriggered = engine->isLaunchCondition;
|
|
|
|
#endif
|
2019-09-20 16:38:19 -07:00
|
|
|
|
|
|
|
tsOutputChannels->tpsAccelFuel = engine->engineState.tpsAccelEnrich;
|
|
|
|
// engine load acceleration
|
|
|
|
if (hasMapSensor(PASS_ENGINE_PARAMETER_SIGNATURE)) {
|
|
|
|
tsOutputChannels->engineLoadAccelExtra = engine->engineLoadAccelEnrichment.getEngineLoadEnrichment(PASS_ENGINE_PARAMETER_SIGNATURE) * 100 / getMap(PASS_ENGINE_PARAMETER_SIGNATURE);
|
|
|
|
}
|
|
|
|
tsOutputChannels->engineLoadDelta = engine->engineLoadAccelEnrichment.getMaxDelta();
|
|
|
|
|
|
|
|
tsOutputChannels->checkEngine = hasErrorCodes();
|
|
|
|
|
|
|
|
#if HAL_USE_ADC
|
|
|
|
tsOutputChannels->internalMcuTemperature = getMCUInternalTemperature();
|
|
|
|
#endif /* HAL_USE_ADC */
|
|
|
|
|
|
|
|
#if EFI_MAX_31855
|
|
|
|
for (int i = 0; i < EGT_CHANNEL_COUNT; i++)
|
|
|
|
tsOutputChannels->egtValues.values[i] = getEgtValue(i);
|
|
|
|
#endif /* EFI_MAX_31855 */
|
|
|
|
|
|
|
|
#if EFI_IDLE_CONTROL
|
|
|
|
tsOutputChannels->idlePosition = getIdlePosition();
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#if EFI_PROD_CODE
|
|
|
|
tsOutputChannels->isTriggerError = isTriggerErrorNow();
|
|
|
|
|
|
|
|
#if EFI_INTERNAL_FLASH
|
|
|
|
tsOutputChannels->needBurn = getNeedToWriteConfiguration();
|
|
|
|
#endif /* EFI_INTERNAL_FLASH */
|
|
|
|
|
|
|
|
#if EFI_FILE_LOGGING
|
|
|
|
tsOutputChannels->hasSdCard = isSdCardAlive();
|
|
|
|
#endif /* EFI_FILE_LOGGING */
|
|
|
|
|
|
|
|
tsOutputChannels->isFuelPumpOn = enginePins.fuelPumpRelay.getLogicValue();
|
|
|
|
tsOutputChannels->isFanOn = enginePins.fanRelay.getLogicValue();
|
|
|
|
tsOutputChannels->isO2HeaterOn = enginePins.o2heater.getLogicValue();
|
|
|
|
tsOutputChannels->isIgnitionEnabled = engineConfiguration->isIgnitionEnabled;
|
|
|
|
tsOutputChannels->isInjectionEnabled = engineConfiguration->isInjectionEnabled;
|
|
|
|
tsOutputChannels->isCylinderCleanupEnabled = engineConfiguration->isCylinderCleanupEnabled;
|
|
|
|
tsOutputChannels->isCylinderCleanupActivated = engine->isCylinderCleanupMode;
|
|
|
|
tsOutputChannels->secondTriggerChannelEnabled = engineConfiguration->secondTriggerChannelEnabled;
|
|
|
|
#if EFI_VEHICLE_SPEED
|
|
|
|
float vehicleSpeed = getVehicleSpeed();
|
|
|
|
tsOutputChannels->vehicleSpeedKph = vehicleSpeed;
|
|
|
|
tsOutputChannels->speedToRpmRatio = vehicleSpeed / rpm;
|
|
|
|
|
|
|
|
#endif /* EFI_VEHICLE_SPEED */
|
|
|
|
#endif /* EFI_PROD_CODE */
|
|
|
|
|
|
|
|
tsOutputChannels->fuelConsumptionPerHour = engine->engineState.fuelConsumption.perSecondConsumption;
|
|
|
|
|
|
|
|
tsOutputChannels->warningCounter = engine->engineState.warnings.warningCounter;
|
|
|
|
tsOutputChannels->lastErrorCode = engine->engineState.warnings.lastErrorCode;
|
|
|
|
for (int i = 0; i < 8;i++) {
|
|
|
|
tsOutputChannels->recentErrorCodes[i] = engine->engineState.warnings.recentWarnings.get(i);
|
|
|
|
}
|
|
|
|
|
|
|
|
tsOutputChannels->knockNowIndicator = engine->knockCount > 0;
|
|
|
|
tsOutputChannels->knockEverIndicator = engine->knockEver;
|
|
|
|
|
|
|
|
tsOutputChannels->clutchUpState = engine->clutchUpState;
|
|
|
|
tsOutputChannels->clutchDownState = engine->clutchDownState;
|
|
|
|
tsOutputChannels->brakePedalState = engine->brakePedalState;
|
|
|
|
tsOutputChannels->acSwitchState = engine->acSwitchState;
|
|
|
|
|
2020-02-26 15:16:35 -08:00
|
|
|
#if EFI_ENGINE_CONTROL
|
2019-09-20 16:38:19 -07:00
|
|
|
// tCharge depends on the previous state, so we should use the stored value.
|
|
|
|
tsOutputChannels->tCharge = ENGINE(engineState.sd.tCharge);
|
|
|
|
float timing = engine->engineState.timingAdvance;
|
|
|
|
tsOutputChannels->ignitionAdvance = timing > 360 ? timing - 720 : timing;
|
|
|
|
// 60
|
|
|
|
tsOutputChannels->sparkDwell = ENGINE(engineState.sparkDwell);
|
2020-06-17 14:15:04 -07:00
|
|
|
tsOutputChannels->crankingFuelMs = ENGINE(engineState.cranking.fuel);
|
2019-09-20 16:38:19 -07:00
|
|
|
tsOutputChannels->chargeAirMass = engine->engineState.sd.airMassInOneCylinder;
|
|
|
|
|
2020-02-26 15:16:35 -08:00
|
|
|
tsOutputChannels->coilDutyCycle = getCoilDutyCycle(rpm PASS_ENGINE_PARAMETER_SUFFIX);
|
|
|
|
#endif // EFI_ENGINE_CONTROL
|
2019-09-20 16:38:19 -07:00
|
|
|
|
2017-12-03 04:42:44 -08:00
|
|
|
switch (engineConfiguration->debugMode) {
|
2020-03-23 07:32:41 -07:00
|
|
|
case DBG_START_STOP:
|
|
|
|
tsOutputChannels->debugIntField1 = engine->startStopStateToggleCounter;
|
|
|
|
break;
|
2017-12-17 10:14:39 -08:00
|
|
|
case DBG_STATUS:
|
2018-12-23 20:58:40 -08:00
|
|
|
tsOutputChannels->debugFloatField1 = timeSeconds;
|
2017-12-17 10:14:39 -08:00
|
|
|
tsOutputChannels->debugIntField1 = atoi(VCS_VERSION);
|
|
|
|
break;
|
2018-09-17 18:42:04 -07:00
|
|
|
case DBG_METRICS:
|
2019-04-12 19:10:57 -07:00
|
|
|
#if EFI_CLOCK_LOCKS
|
2018-09-17 18:42:04 -07:00
|
|
|
tsOutputChannels->debugIntField1 = maxLockedDuration;
|
|
|
|
tsOutputChannels->debugIntField2 = maxTriggerReentraint;
|
|
|
|
#endif /* EFI_CLOCK_LOCKS */
|
|
|
|
break;
|
2017-12-03 04:42:44 -08:00
|
|
|
case DBG_TPS_ACCEL:
|
2017-03-24 10:41:36 -07:00
|
|
|
tsOutputChannels->debugIntField1 = engine->tpsAccelEnrichment.cb.getSize();
|
2017-12-03 04:42:44 -08:00
|
|
|
break;
|
|
|
|
case DBG_SR5_PROTOCOL: {
|
|
|
|
const int _10_6 = 100000;
|
2017-03-26 19:45:19 -07:00
|
|
|
tsOutputChannels->debugIntField1 = tsState.textCommandCounter * _10_6 + tsState.totalCounter;
|
|
|
|
tsOutputChannels->debugIntField2 = tsState.outputChannelsCommandCounter * _10_6 + tsState.writeValueCommandCounter;
|
|
|
|
tsOutputChannels->debugIntField3 = tsState.readPageCommandsCounter * _10_6 + tsState.burnCommandCounter;
|
2017-12-03 04:42:44 -08:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
case DBG_AUX_VALVES:
|
2017-11-27 18:10:49 -08:00
|
|
|
tsOutputChannels->debugFloatField1 = engine->engineState.auxValveStart;
|
|
|
|
tsOutputChannels->debugFloatField2 = engine->engineState.auxValveEnd;
|
2017-12-03 04:42:44 -08:00
|
|
|
break;
|
2019-08-07 19:20:16 -07:00
|
|
|
case DBG_TRIGGER_COUNTERS:
|
2017-03-24 10:41:36 -07:00
|
|
|
tsOutputChannels->debugIntField1 = engine->triggerCentral.getHwEventCounter((int)SHAFT_PRIMARY_FALLING);
|
|
|
|
tsOutputChannels->debugIntField2 = engine->triggerCentral.getHwEventCounter((int)SHAFT_SECONDARY_FALLING);
|
2020-04-10 10:19:54 -07:00
|
|
|
// no one uses shaft so far tsOutputChannels->debugIntField3 = engine->triggerCentral.getHwEventCounter((int)SHAFT_3RD_FALLING);
|
2019-11-11 19:19:35 -08:00
|
|
|
#if EFI_PROD_CODE && HAL_USE_ICU == TRUE
|
2020-04-10 10:19:54 -07:00
|
|
|
tsOutputChannels->debugIntField3 = icuRisingCallbackCounter + icuFallingCallbackCounter;
|
2019-09-02 18:02:08 -07:00
|
|
|
tsOutputChannels->debugIntField4 = engine->triggerCentral.vvtEventRiseCounter;
|
|
|
|
tsOutputChannels->debugIntField5 = engine->triggerCentral.vvtEventFallCounter;
|
2019-08-07 16:49:13 -07:00
|
|
|
#endif /* EFI_PROD_CODE */
|
2017-03-24 10:41:36 -07:00
|
|
|
|
|
|
|
tsOutputChannels->debugFloatField1 = engine->triggerCentral.getHwEventCounter((int)SHAFT_PRIMARY_RISING);
|
|
|
|
tsOutputChannels->debugFloatField2 = engine->triggerCentral.getHwEventCounter((int)SHAFT_SECONDARY_RISING);
|
2020-04-10 10:19:54 -07:00
|
|
|
|
|
|
|
tsOutputChannels->debugIntField4 = engine->triggerCentral.triggerState.currentCycle.eventCount[0];
|
|
|
|
tsOutputChannels->debugIntField5 = engine->triggerCentral.triggerState.currentCycle.eventCount[1];
|
|
|
|
|
|
|
|
// debugFloatField6 used
|
|
|
|
// no one uses shaft so far tsOutputChannels->debugFloatField3 = engine->triggerCentral.getHwEventCounter((int)SHAFT_3RD_RISING);
|
2017-12-03 04:42:44 -08:00
|
|
|
break;
|
|
|
|
case DBG_FSIO_ADC:
|
2017-03-24 10:41:36 -07:00
|
|
|
// todo: implement a proper loop
|
|
|
|
if (engineConfiguration->fsioAdc[0] != EFI_ADC_NONE) {
|
|
|
|
strcpy(buf, "adcX");
|
2019-09-22 07:02:07 -07:00
|
|
|
tsOutputChannels->debugFloatField1 = getVoltage("fsio", engineConfiguration->fsioAdc[0] PASS_ENGINE_PARAMETER_SUFFIX);
|
2017-03-24 10:41:36 -07:00
|
|
|
}
|
2017-12-03 04:42:44 -08:00
|
|
|
break;
|
2020-07-04 18:32:12 -07:00
|
|
|
case DBG_FSIO_EXPRESSION_1_7:
|
|
|
|
#if EFI_FSIO
|
2017-12-16 21:17:55 -08:00
|
|
|
tsOutputChannels->debugFloatField1 = getFsioOutputValue(0 PASS_ENGINE_PARAMETER_SUFFIX);
|
|
|
|
tsOutputChannels->debugFloatField2 = getFsioOutputValue(1 PASS_ENGINE_PARAMETER_SUFFIX);
|
|
|
|
tsOutputChannels->debugFloatField3 = getFsioOutputValue(2 PASS_ENGINE_PARAMETER_SUFFIX);
|
|
|
|
tsOutputChannels->debugFloatField4 = getFsioOutputValue(3 PASS_ENGINE_PARAMETER_SUFFIX);
|
|
|
|
tsOutputChannels->debugFloatField5 = getFsioOutputValue(4 PASS_ENGINE_PARAMETER_SUFFIX);
|
|
|
|
tsOutputChannels->debugFloatField6 = getFsioOutputValue(5 PASS_ENGINE_PARAMETER_SUFFIX);
|
|
|
|
tsOutputChannels->debugFloatField7 = getFsioOutputValue(6 PASS_ENGINE_PARAMETER_SUFFIX);
|
|
|
|
break;
|
2020-07-04 18:32:12 -07:00
|
|
|
case DBG_FSIO_EXPRESSION_8_14:
|
|
|
|
tsOutputChannels->debugFloatField1 = getFsioOutputValue(7 PASS_ENGINE_PARAMETER_SUFFIX);
|
|
|
|
tsOutputChannels->debugFloatField2 = getFsioOutputValue(8 PASS_ENGINE_PARAMETER_SUFFIX);
|
|
|
|
tsOutputChannels->debugFloatField3 = getFsioOutputValue(9 PASS_ENGINE_PARAMETER_SUFFIX);
|
|
|
|
tsOutputChannels->debugFloatField4 = getFsioOutputValue(10 PASS_ENGINE_PARAMETER_SUFFIX);
|
|
|
|
tsOutputChannels->debugFloatField5 = getFsioOutputValue(11 PASS_ENGINE_PARAMETER_SUFFIX);
|
|
|
|
tsOutputChannels->debugFloatField6 = getFsioOutputValue(12 PASS_ENGINE_PARAMETER_SUFFIX);
|
|
|
|
tsOutputChannels->debugFloatField7 = getFsioOutputValue(13 PASS_ENGINE_PARAMETER_SUFFIX);
|
|
|
|
break;
|
|
|
|
case DBG_FSIO_SPECIAL:
|
|
|
|
tsOutputChannels->debugFloatField1 = ENGINE(fsioState.fsioIdleOffset);
|
|
|
|
tsOutputChannels->debugFloatField2 = ENGINE(fsioState.fsioIdleMinValue);
|
2020-07-04 18:40:56 -07:00
|
|
|
break;
|
2020-07-04 18:32:12 -07:00
|
|
|
#endif /* EFI_FSIO */
|
2017-12-03 04:42:44 -08:00
|
|
|
case DBG_VEHICLE_SPEED_SENSOR:
|
2017-05-21 20:17:08 -07:00
|
|
|
tsOutputChannels->debugIntField1 = engine->engineState.vssEventCounter;
|
2017-12-03 04:42:44 -08:00
|
|
|
break;
|
|
|
|
case DBG_CRANKING_DETAILS:
|
2017-03-24 10:41:36 -07:00
|
|
|
tsOutputChannels->debugIntField1 = engine->rpmCalculator.getRevolutionCounterSinceStart();
|
2017-12-03 04:42:44 -08:00
|
|
|
break;
|
2019-04-12 19:10:57 -07:00
|
|
|
#if EFI_HIP_9011
|
2017-12-03 04:42:44 -08:00
|
|
|
case DBG_KNOCK:
|
2019-01-07 20:55:56 -08:00
|
|
|
// todo: maybe extract hipPostState(tsOutputChannels);
|
|
|
|
tsOutputChannels->debugIntField1 = instance.correctResponsesCount;
|
|
|
|
tsOutputChannels->debugIntField2 = instance.invalidHip9011ResponsesCount;
|
2017-12-03 04:42:44 -08:00
|
|
|
break;
|
2017-04-09 19:07:41 -07:00
|
|
|
#endif /* EFI_HIP_9011 */
|
2019-04-12 19:10:57 -07:00
|
|
|
#if EFI_CJ125 && HAL_USE_SPI
|
2018-01-28 10:04:19 -08:00
|
|
|
case DBG_CJ125:
|
|
|
|
cjPostState(tsOutputChannels);
|
|
|
|
break;
|
2019-02-01 20:16:34 -08:00
|
|
|
#endif /* EFI_CJ125 && HAL_USE_SPI */
|
2018-02-06 13:21:41 -08:00
|
|
|
#if EFI_MAP_AVERAGING
|
|
|
|
case DBG_MAP:
|
|
|
|
postMapState(tsOutputChannels);
|
|
|
|
break;
|
|
|
|
#endif /* EFI_MAP_AVERAGING */
|
2019-04-12 19:10:57 -07:00
|
|
|
#if EFI_CAN_SUPPORT
|
2018-01-29 16:41:39 -08:00
|
|
|
case DBG_CAN:
|
|
|
|
postCanState(tsOutputChannels);
|
|
|
|
break;
|
|
|
|
#endif /* EFI_CAN_SUPPORT */
|
2019-04-25 05:32:20 -07:00
|
|
|
case DBG_ANALOG_INPUTS:
|
2019-09-22 06:56:06 -07:00
|
|
|
tsOutputChannels->debugFloatField1 = (engineConfiguration->vbattAdcChannel != EFI_ADC_NONE) ? getVoltageDivided("vbatt", engineConfiguration->vbattAdcChannel PASS_ENGINE_PARAMETER_SUFFIX) : 0.0f;
|
2020-02-07 01:05:16 -08:00
|
|
|
tsOutputChannels->debugFloatField2 = Sensor::getRaw(SensorType::Tps1);
|
2019-09-22 06:56:06 -07:00
|
|
|
tsOutputChannels->debugFloatField3 = (engineConfiguration->mafAdcChannel != EFI_ADC_NONE) ? getVoltageDivided("maf", engineConfiguration->mafAdcChannel PASS_ENGINE_PARAMETER_SUFFIX) : 0.0f;
|
|
|
|
tsOutputChannels->debugFloatField4 = (engineConfiguration->map.sensor.hwChannel != EFI_ADC_NONE) ? getVoltageDivided("map", engineConfiguration->map.sensor.hwChannel PASS_ENGINE_PARAMETER_SUFFIX) : 0.0f;
|
|
|
|
tsOutputChannels->debugFloatField5 = (engineConfiguration->clt.adcChannel != EFI_ADC_NONE) ? getVoltageDivided("clt", engineConfiguration->clt.adcChannel PASS_ENGINE_PARAMETER_SUFFIX) : 0.0f;
|
|
|
|
tsOutputChannels->debugFloatField6 = (engineConfiguration->iat.adcChannel != EFI_ADC_NONE) ? getVoltageDivided("iat", engineConfiguration->iat.adcChannel PASS_ENGINE_PARAMETER_SUFFIX) : 0.0f;
|
|
|
|
tsOutputChannels->debugFloatField7 = (engineConfiguration->afr.hwChannel != EFI_ADC_NONE) ? getVoltageDivided("ego", engineConfiguration->afr.hwChannel PASS_ENGINE_PARAMETER_SUFFIX) : 0.0f;
|
2017-12-03 04:42:44 -08:00
|
|
|
break;
|
2019-04-25 05:32:20 -07:00
|
|
|
case DBG_ANALOG_INPUTS2:
|
2020-08-23 22:26:33 -07:00
|
|
|
// TPS 1 pri/sec split
|
2020-05-18 11:32:00 -07:00
|
|
|
tsOutputChannels->debugFloatField1 = Sensor::get(SensorType::Tps1Primary).value_or(0) - Sensor::get(SensorType::Tps1Secondary).value_or(0);
|
2020-08-23 22:26:33 -07:00
|
|
|
// TPS 2 pri/sec split
|
2020-05-18 11:32:00 -07:00
|
|
|
tsOutputChannels->debugFloatField2 = Sensor::get(SensorType::Tps2Primary).value_or(0) - Sensor::get(SensorType::Tps2Secondary).value_or(0);
|
2020-08-23 22:26:33 -07:00
|
|
|
// TPS1 - TPS2 split
|
|
|
|
tsOutputChannels->debugFloatField3 = Sensor::get(SensorType::Tps1).value_or(0) - Sensor::get(SensorType::Tps2).value_or(0);
|
|
|
|
// Pedal pri/sec split
|
|
|
|
tsOutputChannels->debugFloatField4 = Sensor::get(SensorType::AcceleratorPedalPrimary).value_or(0) - Sensor::get(SensorType::AcceleratorPedalSecondary).value_or(0);
|
2019-04-25 05:32:20 -07:00
|
|
|
break;
|
2017-12-16 21:17:55 -08:00
|
|
|
case DBG_INSTANT_RPM:
|
2017-12-05 20:49:39 -08:00
|
|
|
{
|
2017-12-13 18:08:34 -08:00
|
|
|
float instantRpm = engine->triggerCentral.triggerState.instantRpm;
|
2017-12-05 20:49:39 -08:00
|
|
|
tsOutputChannels->debugFloatField1 = instantRpm;
|
2020-09-03 16:29:15 -07:00
|
|
|
tsOutputChannels->debugFloatField2 = instantRpm / GET_RPM();
|
2017-12-05 20:49:39 -08:00
|
|
|
}
|
|
|
|
break;
|
2019-01-03 21:16:08 -08:00
|
|
|
case DBG_ION:
|
2019-05-05 14:21:36 -07:00
|
|
|
#if EFI_CDM_INTEGRATION
|
|
|
|
ionPostState(tsOutputChannels);
|
|
|
|
#endif /* EFI_CDM_INTEGRATION */
|
2019-01-03 21:16:08 -08:00
|
|
|
break;
|
2019-10-31 13:06:34 -07:00
|
|
|
case DBG_TLE8888:
|
|
|
|
#if (BOARD_TLE8888_COUNT > 0)
|
2019-12-22 05:12:45 -08:00
|
|
|
tle8888PostState(tsOutputChannels->getDebugChannels());
|
2019-10-31 13:06:34 -07:00
|
|
|
#endif /* BOARD_TLE8888_COUNT */
|
|
|
|
break;
|
2017-12-03 04:42:44 -08:00
|
|
|
default:
|
|
|
|
;
|
|
|
|
}
|
2017-03-24 10:41:36 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
void prepareTunerStudioOutputs(void) {
|
|
|
|
// sensor state for EFI Analytics Tuner Studio
|
2017-05-15 20:28:49 -07:00
|
|
|
updateTunerStudioState(&tsOutputChannels PASS_ENGINE_PARAMETER_SUFFIX);
|
2017-03-24 10:41:36 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
#endif /* EFI_TUNER_STUDIO */
|
|
|
|
|
2017-04-09 19:26:11 -07:00
|
|
|
void initStatusLoop(void) {
|
2017-03-24 10:41:36 -07:00
|
|
|
addConsoleActionI("warn", setWarningEnabled);
|
|
|
|
|
2019-04-12 19:10:57 -07:00
|
|
|
#if EFI_ENGINE_CONTROL
|
2017-03-24 10:41:36 -07:00
|
|
|
addConsoleActionFF("fuelinfo2", (VoidFloatFloat) showFuelInfo2);
|
|
|
|
addConsoleAction("fuelinfo", showFuelInfo);
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
2017-04-09 19:26:11 -07:00
|
|
|
void startStatusThreads(void) {
|
2017-03-24 10:41:36 -07:00
|
|
|
// todo: refactoring needed, this file should probably be split into pieces
|
2019-04-12 19:10:57 -07:00
|
|
|
#if EFI_PROD_CODE
|
2017-03-24 10:41:36 -07:00
|
|
|
initStatusLeds();
|
2019-07-13 08:06:03 -07:00
|
|
|
communicationsBlinkingTask.Start();
|
2017-03-24 10:41:36 -07:00
|
|
|
#endif /* EFI_PROD_CODE */
|
2019-07-13 07:24:23 -07:00
|
|
|
|
2019-04-12 19:10:57 -07:00
|
|
|
#if EFI_LCD
|
2019-02-11 12:09:24 -08:00
|
|
|
lcdInstance.Start();
|
2019-03-29 07:29:01 -07:00
|
|
|
#endif /* EFI_LCD */
|
2017-03-24 10:41:36 -07:00
|
|
|
}
|