From 75098a0d4b4b88e1a1c58946427c38b409b0cf7e Mon Sep 17 00:00:00 2001 From: Andrey G Date: Sun, 10 Jan 2021 01:16:10 +0300 Subject: [PATCH] Lcd fix (I hope) (#2211) * LCD: check if settings are valid on each access * Lada Kalina: remove duplicate code All LCD pins are set to GPIO_UNASSIGNED in disableLCD() * Remove duplicate code * We still need to know when invalid gpio is used... This reverts commit 9c12c4dd44de63a2c3c2b88d6fcdadd89031d28e. --- .../config/engines/citroenBerlingoTU3JP.cpp | 12 +---- firmware/config/engines/lada_kalina.cpp | 8 ---- firmware/hw_layer/lcd/lcd_HD44780.cpp | 48 +++++++++---------- firmware/hw_layer/lcd/lcd_HD44780.h | 2 +- firmware/hw_layer/ports/stm32/stm32_pins.cpp | 3 -- 5 files changed, 27 insertions(+), 46 deletions(-) diff --git a/firmware/config/engines/citroenBerlingoTU3JP.cpp b/firmware/config/engines/citroenBerlingoTU3JP.cpp index d775304bcc..b10495c923 100644 --- a/firmware/config/engines/citroenBerlingoTU3JP.cpp +++ b/firmware/config/engines/citroenBerlingoTU3JP.cpp @@ -12,17 +12,9 @@ #include "engine_math.h" #include "thermistors.h" #include "citroenBerlingoTU3JP.h" +#include "custom_engine.h" #include "settings.h" -void setLCD(engine_configuration_s *engineConfiguration) { - engineConfiguration->HD44780_rs = GPIOE_7; - engineConfiguration->HD44780_e = GPIOE_9; - engineConfiguration->HD44780_db4 = GPIOE_11; - engineConfiguration->HD44780_db5 = GPIOE_13; - engineConfiguration->HD44780_db6 = GPIOE_15; - engineConfiguration->HD44780_db7 = GPIOB_10; -} - #if IGN_LOAD_COUNT == DEFAULT_IGN_LOAD_COUNT static const ignition_table_t default_tps_advance_table = { {/*0 engineLoad=0.00*/ /*0 800.0*/+15.00, /*1 1213.0*/+16.33, /*2 1626.0*/+17.67, /*3 2040.0*/+19.00, /*4 2453.0*/+20.33, /*5 2866.0*/+21.67, /*6 3280.0*/+23.00, /*7 3693.0*/+24.33, /*8 4106.0*/+25.67, /*9 4520.0*/+27.00, /*10 4933.0*/+28.33, /*11 5346.0*/+29.67, /*12 5760.0*/+31.00, /*13 6173.0*/+32.33, /*14 6586.0*/+33.67, /*15 7000.0*/+35.00}, @@ -118,7 +110,7 @@ void setCitroenBerlingoTU3JPConfiguration(DECLARE_CONFIG_PARAMETER_SIGNATURE) { engineConfiguration->fuelPumpPin = GPIOB_9; engineConfiguration->fuelPumpPinMode = OM_DEFAULT; - setLCD(engineConfiguration); + setFrankenso_01_LCD(engineConfiguration); // engineConfiguration->o2heaterPin = GPIOC_13; diff --git a/firmware/config/engines/lada_kalina.cpp b/firmware/config/engines/lada_kalina.cpp index d618ca168a..5fe6868666 100644 --- a/firmware/config/engines/lada_kalina.cpp +++ b/firmware/config/engines/lada_kalina.cpp @@ -37,14 +37,6 @@ void setLadaKalina(DECLARE_CONFIG_PARAMETER_SIGNATURE) { setFrankensoConfiguration(PASS_CONFIG_PARAMETER_SIGNATURE); disableLCD(engineConfiguration); - engineConfiguration->HD44780_rs = GPIO_UNASSIGNED; - engineConfiguration->HD44780_e = GPIO_UNASSIGNED; - engineConfiguration->HD44780_db4 = GPIO_UNASSIGNED; - engineConfiguration->HD44780_db5 = GPIO_UNASSIGNED; - engineConfiguration->HD44780_db6 = GPIO_UNASSIGNED; - engineConfiguration->HD44780_db7 = GPIO_UNASSIGNED; - - setOperationMode(engineConfiguration, FOUR_STROKE_CRANK_SENSOR); engineConfiguration->trigger.type = TT_TOOTHED_WHEEL_60_2; diff --git a/firmware/hw_layer/lcd/lcd_HD44780.cpp b/firmware/hw_layer/lcd/lcd_HD44780.cpp index 730d0bcb09..2062ea08d8 100644 --- a/firmware/hw_layer/lcd/lcd_HD44780.cpp +++ b/firmware/hw_layer/lcd/lcd_HD44780.cpp @@ -55,7 +55,6 @@ static const int lineStart[] = { 0, 0x40, 0x14, 0x54 }; static int BUSY_WAIT_DELAY = FALSE; static int currentRow = 0; static int currentColumn = 0; -static bool lcd_enabled = false; static void lcdSleep(int period) { if (BUSY_WAIT_DELAY) { @@ -81,6 +80,17 @@ static void writePad(const char *msg, brain_pin_e pin, int bit) { palWritePad(getHwPort(msg, pin), getHwPin(msg, pin), bit); } +static bool lcd_HD44780_is_enabled(void) { + /* check for valid LCD setting */ + return ((engineConfiguration->displayMode == DM_HD44780) && + (isBrainPinValid(CONFIG(HD44780_rs))) && + (isBrainPinValid(CONFIG(HD44780_e))) && + (isBrainPinValid(CONFIG(HD44780_db4))) && + (isBrainPinValid(CONFIG(HD44780_db5))) && + (isBrainPinValid(CONFIG(HD44780_db6))) && + (isBrainPinValid(CONFIG(HD44780_db7)))); +} + //----------------------------------------------------------------------------- static void lcd_HD44780_write(uint8_t data) { if (engineConfiguration->displayMode == DM_HD44780) { @@ -132,7 +142,7 @@ static void lcd_HD44780_write_data(uint8_t data) { //----------------------------------------------------------------------------- void lcd_HD44780_set_position(uint8_t row, uint8_t column) { - if (!lcd_enabled) + if (!lcd_HD44780_is_enabled()) return; efiAssertVoid(CUSTOM_ERR_6657, row <= engineConfiguration->HD44780height, "invalid row"); @@ -142,21 +152,21 @@ void lcd_HD44780_set_position(uint8_t row, uint8_t column) { } int getCurrentHD44780row(void) { - if (!lcd_enabled) + if (!lcd_HD44780_is_enabled()) return 0; return currentRow; } int getCurrentHD44780column(void) { - if (!lcd_enabled) + if (!lcd_HD44780_is_enabled()) return 0; return currentColumn; } void lcd_HD44780_print_char(char data) { - if (!lcd_enabled) + if (!lcd_HD44780_is_enabled()) return; if (data == '\n') { @@ -167,7 +177,7 @@ void lcd_HD44780_print_char(char data) { } void lcd_HD44780_print_string(const char* string) { - if (!lcd_enabled) + if (!lcd_HD44780_is_enabled()) return; while (*string != 0x00) @@ -193,14 +203,8 @@ void stopHD44780_pins() { efiSetPadUnused(activeConfiguration.HD44780_db7); } -int startHD44780_pins() { - if ((engineConfiguration->displayMode == DM_HD44780) && - (isBrainPinValid(CONFIG(HD44780_rs))) && - (isBrainPinValid(CONFIG(HD44780_e))) && - (isBrainPinValid(CONFIG(HD44780_db4))) && - (isBrainPinValid(CONFIG(HD44780_db5))) && - (isBrainPinValid(CONFIG(HD44780_db6))) && - (isBrainPinValid(CONFIG(HD44780_db7)))) { +void startHD44780_pins() { + if (lcd_HD44780_is_enabled()) { // initialize hardware lines efiSetPadMode("lcd RS", CONFIG(HD44780_rs), PAL_MODE_OUTPUT_PUSHPULL); efiSetPadMode("lcd E", CONFIG(HD44780_e), PAL_MODE_OUTPUT_PUSHPULL); @@ -215,14 +219,7 @@ int startHD44780_pins() { writePad("lcd", CONFIG(HD44780_db5), 0); writePad("lcd", CONFIG(HD44780_db6), 0); writePad("lcd", CONFIG(HD44780_db7), 0); - - return 0; } - - /* failed to init LCD pins, avoid writes */ - lcd_enabled = false; - - return -1; } void lcd_HD44780_init(Logging *sharedLogger) { @@ -242,7 +239,7 @@ void lcd_HD44780_init(Logging *sharedLogger) { printMsg(logger, "lcd_HD44780_init %d", engineConfiguration->displayMode); - if (startHD44780_pins() < 0) + if (!lcd_HD44780_is_enabled()) return; chThdSleepMilliseconds(20); // LCD needs some time to wake up @@ -271,11 +268,14 @@ void lcd_HD44780_init(Logging *sharedLogger) { lcd_HD44780_set_position(0, 0); printMsg(logger, "lcd_HD44780_init() done"); - - lcd_enabled = true; } void lcdShowPanicMessage(char *message) { + /* this is not a good idea to access config data + * when everything goes wrong... */ + if (!lcd_HD44780_is_enabled()) + return; + BUSY_WAIT_DELAY = TRUE; lcd_HD44780_set_position(0, 0); lcd_HD44780_print_string("PANIC\n"); diff --git a/firmware/hw_layer/lcd/lcd_HD44780.h b/firmware/hw_layer/lcd/lcd_HD44780.h index 7850a0d6d9..77a0931163 100644 --- a/firmware/hw_layer/lcd/lcd_HD44780.h +++ b/firmware/hw_layer/lcd/lcd_HD44780.h @@ -12,7 +12,7 @@ extern "C" { #endif /* __cplusplus */ -int startHD44780_pins(); +void startHD44780_pins(); void stopHD44780_pins(); void lcd_HD44780_init(Logging *sharedLogger); void lcd_HD44780_set_position(uint8_t row, uint8_t column); diff --git a/firmware/hw_layer/ports/stm32/stm32_pins.cpp b/firmware/hw_layer/ports/stm32/stm32_pins.cpp index bdc1d0663a..869c20bd74 100644 --- a/firmware/hw_layer/ports/stm32/stm32_pins.cpp +++ b/firmware/hw_layer/ports/stm32/stm32_pins.cpp @@ -122,10 +122,7 @@ int getPortPinIndex(ioportid_t port, ioportmask_t pin) { ioportid_t getHwPort(const char *msg, brain_pin_e brainPin) { if (!isBrainPinValid(brainPin)) { -/* - * https://github.com/dron0gus please help firmwareError(CUSTOM_ERR_INVALID_PIN, "%s: Invalid brain_pin_e: %d", msg, brainPin); - */ return GPIO_NULL; } return ports[(brainPin - GPIOA_0) / PORT_SIZE];