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 9c12c4dd44.
This commit is contained in:
Andrey G 2021-01-10 01:16:10 +03:00 committed by GitHub
parent 9fc02afe4a
commit 75098a0d4b
5 changed files with 27 additions and 46 deletions

View File

@ -12,17 +12,9 @@
#include "engine_math.h" #include "engine_math.h"
#include "thermistors.h" #include "thermistors.h"
#include "citroenBerlingoTU3JP.h" #include "citroenBerlingoTU3JP.h"
#include "custom_engine.h"
#include "settings.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 #if IGN_LOAD_COUNT == DEFAULT_IGN_LOAD_COUNT
static const ignition_table_t default_tps_advance_table = { 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}, {/*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->fuelPumpPin = GPIOB_9;
engineConfiguration->fuelPumpPinMode = OM_DEFAULT; engineConfiguration->fuelPumpPinMode = OM_DEFAULT;
setLCD(engineConfiguration); setFrankenso_01_LCD(engineConfiguration);
// engineConfiguration->o2heaterPin = GPIOC_13; // engineConfiguration->o2heaterPin = GPIOC_13;

View File

@ -37,14 +37,6 @@ void setLadaKalina(DECLARE_CONFIG_PARAMETER_SIGNATURE) {
setFrankensoConfiguration(PASS_CONFIG_PARAMETER_SIGNATURE); setFrankensoConfiguration(PASS_CONFIG_PARAMETER_SIGNATURE);
disableLCD(engineConfiguration); 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); setOperationMode(engineConfiguration, FOUR_STROKE_CRANK_SENSOR);
engineConfiguration->trigger.type = TT_TOOTHED_WHEEL_60_2; engineConfiguration->trigger.type = TT_TOOTHED_WHEEL_60_2;

View File

@ -55,7 +55,6 @@ static const int lineStart[] = { 0, 0x40, 0x14, 0x54 };
static int BUSY_WAIT_DELAY = FALSE; static int BUSY_WAIT_DELAY = FALSE;
static int currentRow = 0; static int currentRow = 0;
static int currentColumn = 0; static int currentColumn = 0;
static bool lcd_enabled = false;
static void lcdSleep(int period) { static void lcdSleep(int period) {
if (BUSY_WAIT_DELAY) { 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); 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) { static void lcd_HD44780_write(uint8_t data) {
if (engineConfiguration->displayMode == DM_HD44780) { 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) { void lcd_HD44780_set_position(uint8_t row, uint8_t column) {
if (!lcd_enabled) if (!lcd_HD44780_is_enabled())
return; return;
efiAssertVoid(CUSTOM_ERR_6657, row <= engineConfiguration->HD44780height, "invalid row"); 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) { int getCurrentHD44780row(void) {
if (!lcd_enabled) if (!lcd_HD44780_is_enabled())
return 0; return 0;
return currentRow; return currentRow;
} }
int getCurrentHD44780column(void) { int getCurrentHD44780column(void) {
if (!lcd_enabled) if (!lcd_HD44780_is_enabled())
return 0; return 0;
return currentColumn; return currentColumn;
} }
void lcd_HD44780_print_char(char data) { void lcd_HD44780_print_char(char data) {
if (!lcd_enabled) if (!lcd_HD44780_is_enabled())
return; return;
if (data == '\n') { if (data == '\n') {
@ -167,7 +177,7 @@ void lcd_HD44780_print_char(char data) {
} }
void lcd_HD44780_print_string(const char* string) { void lcd_HD44780_print_string(const char* string) {
if (!lcd_enabled) if (!lcd_HD44780_is_enabled())
return; return;
while (*string != 0x00) while (*string != 0x00)
@ -193,14 +203,8 @@ void stopHD44780_pins() {
efiSetPadUnused(activeConfiguration.HD44780_db7); efiSetPadUnused(activeConfiguration.HD44780_db7);
} }
int startHD44780_pins() { void startHD44780_pins() {
if ((engineConfiguration->displayMode == DM_HD44780) && if (lcd_HD44780_is_enabled()) {
(isBrainPinValid(CONFIG(HD44780_rs))) &&
(isBrainPinValid(CONFIG(HD44780_e))) &&
(isBrainPinValid(CONFIG(HD44780_db4))) &&
(isBrainPinValid(CONFIG(HD44780_db5))) &&
(isBrainPinValid(CONFIG(HD44780_db6))) &&
(isBrainPinValid(CONFIG(HD44780_db7)))) {
// initialize hardware lines // initialize hardware lines
efiSetPadMode("lcd RS", CONFIG(HD44780_rs), PAL_MODE_OUTPUT_PUSHPULL); efiSetPadMode("lcd RS", CONFIG(HD44780_rs), PAL_MODE_OUTPUT_PUSHPULL);
efiSetPadMode("lcd E", CONFIG(HD44780_e), 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_db5), 0);
writePad("lcd", CONFIG(HD44780_db6), 0); writePad("lcd", CONFIG(HD44780_db6), 0);
writePad("lcd", CONFIG(HD44780_db7), 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) { void lcd_HD44780_init(Logging *sharedLogger) {
@ -242,7 +239,7 @@ void lcd_HD44780_init(Logging *sharedLogger) {
printMsg(logger, "lcd_HD44780_init %d", engineConfiguration->displayMode); printMsg(logger, "lcd_HD44780_init %d", engineConfiguration->displayMode);
if (startHD44780_pins() < 0) if (!lcd_HD44780_is_enabled())
return; return;
chThdSleepMilliseconds(20); // LCD needs some time to wake up 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); lcd_HD44780_set_position(0, 0);
printMsg(logger, "lcd_HD44780_init() done"); printMsg(logger, "lcd_HD44780_init() done");
lcd_enabled = true;
} }
void lcdShowPanicMessage(char *message) { 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; BUSY_WAIT_DELAY = TRUE;
lcd_HD44780_set_position(0, 0); lcd_HD44780_set_position(0, 0);
lcd_HD44780_print_string("PANIC\n"); lcd_HD44780_print_string("PANIC\n");

View File

@ -12,7 +12,7 @@ extern "C"
{ {
#endif /* __cplusplus */ #endif /* __cplusplus */
int startHD44780_pins(); void startHD44780_pins();
void stopHD44780_pins(); void stopHD44780_pins();
void lcd_HD44780_init(Logging *sharedLogger); void lcd_HD44780_init(Logging *sharedLogger);
void lcd_HD44780_set_position(uint8_t row, uint8_t column); void lcd_HD44780_set_position(uint8_t row, uint8_t column);

View File

@ -122,10 +122,7 @@ int getPortPinIndex(ioportid_t port, ioportmask_t pin) {
ioportid_t getHwPort(const char *msg, brain_pin_e brainPin) { ioportid_t getHwPort(const char *msg, brain_pin_e brainPin) {
if (!isBrainPinValid(brainPin)) { if (!isBrainPinValid(brainPin)) {
/*
* https://github.com/dron0gus please help
firmwareError(CUSTOM_ERR_INVALID_PIN, "%s: Invalid brain_pin_e: %d", msg, brainPin); firmwareError(CUSTOM_ERR_INVALID_PIN, "%s: Invalid brain_pin_e: %d", msg, brainPin);
*/
return GPIO_NULL; return GPIO_NULL;
} }
return ports[(brainPin - GPIOA_0) / PORT_SIZE]; return ports[(brainPin - GPIOA_0) / PORT_SIZE];