diff --git a/firmware/console/status_loop.cpp b/firmware/console/status_loop.cpp index 99601b595e..101e301a5a 100644 --- a/firmware/console/status_loop.cpp +++ b/firmware/console/status_loop.cpp @@ -64,6 +64,7 @@ #include "rusefi.h" #include "pin_repository.h" #include "flash_main.h" +#include "max31855.h" #endif extern Engine engine; @@ -374,6 +375,8 @@ void updateTunerStudioState(TunerStudioOutputChannels *tsOutputChannels) { tsOutputChannels->manifold_air_pressure = getMap(); tsOutputChannels->checkEngine = hasErrorCodes(); #if EFI_PROD_CODE + tsOutputChannels->egtValues.values[0] = getEgtValue(boardConfiguration, 0); + tsOutputChannels->needBurn = getNeedToWriteConfiguration(); tsOutputChannels->hasSdCard = isSdCardAlive(); tsOutputChannels->isFuelPumpOn = getOutputPinValue(FUEL_PUMP_RELAY); diff --git a/firmware/console/tunerstudio/tunerstudio_configuration.h b/firmware/console/tunerstudio/tunerstudio_configuration.h index fe223d00ed..703d1a82f0 100644 --- a/firmware/console/tunerstudio/tunerstudio_configuration.h +++ b/firmware/console/tunerstudio/tunerstudio_configuration.h @@ -14,7 +14,13 @@ /** * this is used to confirm that firmware and TunerStudio are using the same rusefi.ini version */ -#define TS_FILE_VERSION 20140917 +#define TS_FILE_VERSION 20140920 + +#define EGT_CHANNEL_COUNT 8 + +typedef struct { + uint16_t values[EGT_CHANNEL_COUNT]; +} egt_values_s; /** * please be aware that 'float' (F32) type requires TunerStudio version 2.6 and later @@ -61,7 +67,8 @@ typedef struct { unsigned int isMapError : 1; // bit 2 unsigned int isIatError : 1; // bit 3 int tsConfigVersion; - int unused[7]; + egt_values_s egtValues; + int unused[3]; } TunerStudioOutputChannels; #endif /* TUNERSTUDIO_CONFIGURATION_H_ */ diff --git a/firmware/controllers/settings.cpp b/firmware/controllers/settings.cpp index 04d2c1854e..14dcb49805 100644 --- a/firmware/controllers/settings.cpp +++ b/firmware/controllers/settings.cpp @@ -439,6 +439,11 @@ static void setWholeFuelMapCmd(float value) { } #if EFI_PROD_CODE + +static void setEgtSpi(int spi) { + boardConfiguration->max31855spiDevice = (spi_device_e) spi; +} + static void setPotSpi(int spi) { boardConfiguration->digitalPotentiometerSpiDevice = (spi_device_e) spi; } @@ -798,7 +803,10 @@ void initSettings(engine_configuration_s *engineConfiguration) { addConsoleActionSS("set_ignition_pin", setIgnitionPin); addConsoleActionSS("set_trigger_input_pin", setTriggerInputPin); addConsoleActionSS("set_trigger_simulator_pin", setTriggerSimulatorPin); + addConsoleActionSSP("set_egt_cs_pin", (VoidCharPtrCharPtrVoidPtr)setEgtCSPin, boardConfiguration); + addConsoleActionI("set_egt_spi", setEgtSpi); + addConsoleActionSS("set_trigger_simulator_mode", setTriggerSimulatorMode); addConsoleActionS("set_fuel_pump_pin", setFuelPumpPin); addConsoleActionS("set_idle_pin", setIdlePin); diff --git a/firmware/hw_layer/hardware.cpp b/firmware/hw_layer/hardware.cpp index a46b1e9812..b12b852359 100644 --- a/firmware/hw_layer/hardware.cpp +++ b/firmware/hw_layer/hardware.cpp @@ -270,20 +270,23 @@ void initHardware(Logging *logger, Engine *engine) { } SPIDriver * getSpiDevice(spi_device_e spiDevice) { + if (spiDevice == SPI_NONE) { + return NULL; + } #if STM32_SPI_USE_SPI1 || defined(__DOXYGEN__) - if (spiDevice == SPI_DEVICE_1) { + if (spiDevice == SPI_DEVICE_1) { return &SPID1; - } + } #endif #if STM32_SPI_USE_SPI2 || defined(__DOXYGEN__) - if (spiDevic e== SPI_DEVICE_2) { - return &SPID2; - } + if (spiDevic e== SPI_DEVICE_2) { + return &SPID2; + } #endif #if STM32_SPI_USE_SPI3 || defined(__DOXYGEN__) - if (spiDevice == SPI_DEVICE_3) { + if (spiDevice == SPI_DEVICE_3) { return &SPID3; - } + } #endif firmwareError("Unexpected SPI device: %d", spiDevice); return NULL; diff --git a/firmware/hw_layer/max31855.c b/firmware/hw_layer/max31855.c index f26a7dad10..f3415289f1 100644 --- a/firmware/hw_layer/max31855.c +++ b/firmware/hw_layer/max31855.c @@ -21,6 +21,8 @@ #if EFI_MAX_31855 +#define EGT_ERROR_VALUE -1000 + static Logging logger; static SPIConfig spiConfig[MAX31855_CS_COUNT]; @@ -28,6 +30,8 @@ static SPIConfig spiConfig[MAX31855_CS_COUNT]; static void showEgtInfo(board_configuration_s *boardConfiguration) { printSpiState(&logger, boardConfiguration); + scheduleMsg(&logger, "EGT spi: %d", boardConfiguration->max31855spiDevice); + for (int i = 0; i < MAX31855_CS_COUNT; i++) { if (boardConfiguration->max31855_cs[i] != GPIO_NONE) { scheduleMsg(&logger, "%d ETG @ %s", i, hwPortname(boardConfiguration->max31855_cs[i])); @@ -37,8 +41,6 @@ static void showEgtInfo(board_configuration_s *boardConfiguration) { } } -static uint32_t rx_buff; - // bits D17 and D3 are always expected to be zero #define MC_RESERVED_BITS 0x20008 #define MC_OPEN_BIT 1 @@ -64,44 +66,72 @@ static const char * getMcCode(max_32855_code code) { } } -static void egtRead(board_configuration_s *boardConfiguration) { +static max_32855_code getResultCode(uint32_t egtPacket) { + if ((egtPacket & MC_RESERVED_BITS) != 0) { + return MC_INVALID; + } else if ((egtPacket & MC_OPEN_BIT) != 0) { + return MC_OPEN; + } else if ((egtPacket & MC_GND_BIT) != 0) { + return MC_SHORT_GND; + } else if ((egtPacket & MC_VCC_BIT) != 0) { + return MC_SHORT_VCC; + } else { + return MC_OK; + } +} - scheduleMsg(&logger, "Reading egt"); +uint32_t readEgtPacket(board_configuration_s *boardConfiguration, int egtChannel) { + uint32_t egtPacket; + SPIDriver *driver = getSpiDevice(boardConfiguration->max31855spiDevice); + if (driver == NULL) { + return 0xFFFFFFFF; + } - SPIDriver *driver = getSpiDevice(SPI_DEVICE_3); - - spiStart(driver, &spiConfig[0]); + spiStart(driver, &spiConfig[egtChannel]); spiSelect(driver); - spiReceive(driver, 4, &rx_buff); + spiReceive(driver, 4, &egtPacket); spiUnselect(driver); spiStop(driver); + egtPacket = SWAP_UINT32(egtPacket); + return egtPacket; +} - rx_buff = SWAP_UINT32(rx_buff); +#define GET_TEMPERATURE_C(x) (((x) >> 18) / 4) - max_32855_code code; - - if ((rx_buff & MC_RESERVED_BITS) != 0) { - code = MC_INVALID; - } else if ((rx_buff & MC_OPEN_BIT) != 0) { - code = MC_OPEN; - } else if ((rx_buff & MC_GND_BIT) != 0) { - code = MC_SHORT_GND; - } else if ((rx_buff & MC_VCC_BIT) != 0) { - code = MC_SHORT_VCC; +uint16_t getEgtValue(board_configuration_s *boardConfiguration, int egtChannel) { + uint32_t packet = readEgtPacket(boardConfiguration, egtChannel); + max_32855_code code = getResultCode(packet); + if (code != MC_OK) { + return EGT_ERROR_VALUE + code; } else { - code = MC_OK; + return GET_TEMPERATURE_C(packet); + } +} + +static void egtRead(board_configuration_s *boardConfiguration) { + + if (boardConfiguration->max31855spiDevice == SPI_NONE) { + scheduleMsg(&logger, "No SPI selected for EGT"); + return; } - scheduleMsg(&logger, "egt %x code=%d %s", rx_buff, code, getMcCode(code)); + scheduleMsg(&logger, "Reading egt"); + + uint32_t egtPacket = readEgtPacket(boardConfiguration, 0); + + max_32855_code code = getResultCode(egtPacket); + + scheduleMsg(&logger, "egt %x code=%d %s", egtPacket, code, getMcCode(code)); if (code != MC_INVALID) { - int refBits = ((rx_buff & 0xFFFF) / 16); // bits 15:4 + int refBits = ((egtPacket & 0xFFFF) / 16); // bits 15:4 float refTemp = refBits / 16.0; scheduleMsg(&logger, "reference temperature %f", refTemp); - } + scheduleMsg(&logger, "EGT temperature %d", GET_TEMPERATURE_C(egtPacket)); + } } void initMax31855(board_configuration_s *boardConfiguration) { diff --git a/firmware/hw_layer/max31855.h b/firmware/hw_layer/max31855.h index 267c64a9c3..4ab1efcfc4 100644 --- a/firmware/hw_layer/max31855.h +++ b/firmware/hw_layer/max31855.h @@ -17,6 +17,7 @@ extern "C" #endif /* __cplusplus */ void initMax31855(board_configuration_s *boardConfiguration); +uint16_t getEgtValue(board_configuration_s *boardConfiguration, int egtChannel); #ifdef __cplusplus } diff --git a/firmware/tunerstudio/rusefi.ini b/firmware/tunerstudio/rusefi.ini index 06266910be..fc7f27aa15 100644 --- a/firmware/tunerstudio/rusefi.ini +++ b/firmware/tunerstudio/rusefi.ini @@ -317,7 +317,8 @@ enable2ndByteCanID = false [OutputChannels] -fileVersion = { 20140917 } +; see TS_FILE_VERSION in firmware code +fileVersion = { 20140920 } ochGetCommand = "O" @@ -370,6 +371,8 @@ fileVersion = { 20140917 } ind_map_error = bits, U32, 80, [2:2], "true", "false"; ind_iat_error = bits, U32, 80, [3:3], "true", "false"; firmwareTsVersion = scalar,U32, 84, "version", 1, 0 + egt0 = scalar, S16, 88, "°C", 1, 0 + egt1 = scalar, S16, 90, "°C", 1, 0 time = { timeNow } engineLoad = { fuelAlgorithm == 0 ? MAF : TPS } @@ -481,6 +484,7 @@ fileVersion = { 20140917 } ; warmupEnrichGauge = warmupEnrich, "Warmup Enrichment", "%", 100, 150, -1, -1, 101, 105, 0, 0 ; accelEnrichGauge = accDecEnrich, "Accel Enrich", "%", 50, 150, -1, -1, 999, 999, 0, 0 dwellGauge = sparkDwell, "Dwell", "mSec", 0, 10, 0.5, 1.0, 6.0, 8.0, 1, 1 + egt0Gauge = egt0, "EGT#0", "C", 0, 2000 [FrontPage] ; Gauges are numbered left to right, top to bottom.