feat(bw128): add option to invert LCD/OLED display (#4933)

This commit is contained in:
philmoz
2024-06-06 07:52:45 +10:00
committed by GitHub
parent fb2188cacd
commit 65e05085a4
15 changed files with 275 additions and 191 deletions
@@ -261,6 +261,8 @@ Node convert<GeneralSettings>::encode(const GeneralSettings& rhs)
node["labelSingleSelect"] = rhs.labelSingleSelect;
node["labelMultiMode"] = rhs.labelMultiMode;
node["favMultiMode"] = rhs.favMultiMode;
} else if (fw->getCapability(LcdWidth) == 128) {
node["invertLCD"] = (int)rhs.invertLCD;
}
Node serialPort;
@@ -513,6 +515,7 @@ bool convert<GeneralSettings>::decode(const Node& node, GeneralSettings& rhs)
node["backgroundVolume"] >> ioffset_int(rhs.backgroundVolume, 2);
node["modelQuickSelect"] >> rhs.modelQuickSelect;
node["dontPlayHello"] >> rhs.dontPlayHello;
node["invertLCD"] >> rhs.invertLCD;
// depreciated v2.7 replaced by serialPort
if (node["auxSerialMode"]) {
@@ -318,6 +318,8 @@ class GeneralSettings {
int labelMultiMode;
int favMultiMode;
bool invertLCD;
// v 2.10 ADC refactor
// earlier version data is read into legacy structs to maintain older version compatibility
// post reading the legacy structs are manipulated into the new structs
@@ -533,6 +533,13 @@ void GeneralSetupPanel::setValues()
ui->label_favMultiMode->hide();
ui->favMultiMode_CB->hide();
}
if (firmware->getCapability(LcdWidth) == 128) {
ui->invertLCD_CB->setChecked(generalSettings.invertLCD);
} else {
ui->invertLCD_label->hide();
ui->invertLCD_CB->hide();
}
}
void GeneralSetupPanel::showLabelSelectOptions()
@@ -928,3 +935,9 @@ void GeneralSetupPanel::on_startSoundCB_stateChanged(int)
generalSettings.dontPlayHello = !ui->startSoundCB->isChecked();
emit modified();
}
void GeneralSetupPanel::on_invertLCD_CB_stateChanged(int)
{
generalSettings.invertLCD = ui->invertLCD_CB->isChecked();
emit modified();
}
+1
View File
@@ -100,6 +100,7 @@ class GeneralSetupPanel : public GeneralPanel
void on_labelSingleSelect_CB_currentIndexChanged(int);
void on_labelMultiMode_CB_currentIndexChanged(int);
void on_favMultiMode_CB_currentIndexChanged(int);
void on_invertLCD_CB_stateChanged(int);
private:
Ui::GeneralSetup *ui;
+199 -185
View File
@@ -7,7 +7,7 @@
<x>0</x>
<y>0</y>
<width>858</width>
<height>992</height>
<height>1018</height>
</rect>
</property>
<property name="windowTitle">
@@ -554,105 +554,13 @@
</item>
<item row="0" column="3">
<layout class="QGridLayout" name="gridLayout_3" columnstretch="0,0">
<item row="24" column="0">
<widget class="QLabel" name="label_labelSingleSelect">
<item row="21" column="1">
<widget class="QComboBox" name="voiceLang_CB"/>
</item>
<item row="21" column="0">
<widget class="QLabel" name="VoiceLang_label">
<property name="text">
<string>Label selection mode</string>
</property>
</widget>
</item>
<item row="25" column="0">
<widget class="QLabel" name="label_labelMultiMode">
<property name="text">
<string>Label matching</string>
</property>
</widget>
</item>
<item row="11" column="0">
<widget class="QLabel" name="label_OFFBright">
<property name="text">
<string>Backlight OFF Brightness</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QSpinBox" name="volume_SB">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximum">
<number>23</number>
</property>
</widget>
</item>
<item row="23" column="1">
<widget class="QComboBox" name="modelSelectLayout_CB">
<item>
<property name="text">
<string>Large image (2 columns)</string>
</property>
</item>
<item>
<property name="text">
<string>Small image (3 columns)</string>
</property>
</item>
<item>
<property name="text">
<string>Name only (2 columns)</string>
</property>
</item>
<item>
<property name="text">
<string>Name only (1 column)</string>
</property>
</item>
</widget>
</item>
<item row="0" column="1">
<widget class="QComboBox" name="soundModeCB">
<item>
<property name="text">
<string>Beeper</string>
</property>
</item>
<item>
<property name="text">
<string>Speaker</string>
</property>
</item>
<item>
<property name="text">
<string>BeeperVoice</string>
</property>
</item>
<item>
<property name="text">
<string>SpeakerVoice</string>
</property>
</item>
</widget>
</item>
<item row="15" column="0">
<widget class="QLabel" name="stickReverseLB">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Minimum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Stick reverse</string>
</property>
</widget>
</item>
<item row="20" column="1">
<widget class="QLineEdit" name="registrationId">
<property name="maxLength">
<number>8</number>
<string>Voice Language</string>
</property>
</widget>
</item>
@@ -752,23 +660,122 @@
</item>
</layout>
</item>
<item row="18" column="0">
<item row="26" column="0">
<widget class="QLabel" name="label_labelSingleSelect">
<property name="text">
<string>Label selection mode</string>
</property>
</widget>
</item>
<item row="27" column="0">
<widget class="QLabel" name="label_labelMultiMode">
<property name="text">
<string>Label matching</string>
</property>
</widget>
</item>
<item row="12" column="0">
<widget class="QLabel" name="label_OFFBright">
<property name="text">
<string>Backlight OFF Brightness</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QSpinBox" name="volume_SB">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximum">
<number>23</number>
</property>
</widget>
</item>
<item row="25" column="1">
<widget class="QComboBox" name="modelSelectLayout_CB">
<item>
<property name="text">
<string>Large image (2 columns)</string>
</property>
</item>
<item>
<property name="text">
<string>Small image (3 columns)</string>
</property>
</item>
<item>
<property name="text">
<string>Name only (2 columns)</string>
</property>
</item>
<item>
<property name="text">
<string>Name only (1 column)</string>
</property>
</item>
</widget>
</item>
<item row="0" column="1">
<widget class="QComboBox" name="soundModeCB">
<item>
<property name="text">
<string>Beeper</string>
</property>
</item>
<item>
<property name="text">
<string>Speaker</string>
</property>
</item>
<item>
<property name="text">
<string>BeeperVoice</string>
</property>
</item>
<item>
<property name="text">
<string>SpeakerVoice</string>
</property>
</item>
</widget>
</item>
<item row="17" column="0">
<widget class="QLabel" name="stickReverseLB">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Minimum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Stick reverse</string>
</property>
</widget>
</item>
<item row="22" column="1">
<widget class="QLineEdit" name="registrationId">
<property name="maxLength">
<number>8</number>
</property>
</widget>
</item>
<item row="20" column="0">
<widget class="QLabel" name="label_timezone">
<property name="text">
<string>Timeshift from UTC</string>
</property>
</widget>
</item>
<item row="19" column="0">
<widget class="QLabel" name="VoiceLang_label">
<item row="15" column="1">
<widget class="QCheckBox" name="keysBl_ChkB">
<property name="text">
<string>Voice Language</string>
<string/>
</property>
</widget>
</item>
<item row="19" column="1">
<widget class="QComboBox" name="voiceLang_CB"/>
</item>
<item row="9" column="0">
<widget class="QLabel" name="blAlarm_LB">
<property name="text">
@@ -776,13 +783,6 @@
</property>
</widget>
</item>
<item row="13" column="1">
<widget class="QCheckBox" name="keysBl_ChkB">
<property name="text">
<string/>
</property>
</widget>
</item>
<item row="10" column="0">
<widget class="QLabel" name="label_BLBright">
<property name="text">
@@ -790,13 +790,6 @@
</property>
</widget>
</item>
<item row="6" column="0">
<widget class="QLabel" name="varioR0_label">
<property name="text">
<string>Vario repeat at zero</string>
</property>
</widget>
</item>
<item row="5" column="0">
<widget class="QLabel" name="varioPMax_label">
<property name="text">
@@ -804,13 +797,54 @@
</property>
</widget>
</item>
<item row="23" column="0">
<item row="6" column="0">
<widget class="QLabel" name="varioR0_label">
<property name="text">
<string>Vario repeat at zero</string>
</property>
</widget>
</item>
<item row="25" column="0">
<widget class="QLabel" name="label_modelSelectLayout">
<property name="text">
<string>Manage Models layout</string>
</property>
</widget>
</item>
<item row="16" column="1">
<widget class="QComboBox" name="re_CB"/>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_volume">
<property name="text">
<string>Speaker Volume</string>
</property>
</widget>
</item>
<item row="22" column="0">
<widget class="QLabel" name="label_registrationId">
<property name="text">
<string>Owner Registration ID</string>
</property>
</widget>
</item>
<item row="23" column="0">
<widget class="QLabel" name="rotEncMode_label">
<property name="text">
<string>Rotary Encoder Mode</string>
</property>
</widget>
</item>
<item row="23" column="1">
<widget class="QComboBox" name="rotEncMode_CB"/>
</item>
<item row="24" column="0">
<widget class="QLabel" name="label_modelQuickSelect">
<property name="text">
<string>Model quick select</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QSpinBox" name="speakerPitchSB">
<property name="toolTip">
@@ -838,41 +872,7 @@ p, li { white-space: pre-wrap; }
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_volume">
<property name="text">
<string>Speaker Volume</string>
</property>
</widget>
</item>
<item row="20" column="0">
<widget class="QLabel" name="label_registrationId">
<property name="text">
<string>Owner Registration ID</string>
</property>
</widget>
</item>
<item row="14" column="1">
<widget class="QComboBox" name="re_CB"/>
</item>
<item row="21" column="0">
<widget class="QLabel" name="rotEncMode_label">
<property name="text">
<string>Rotary Encoder Mode</string>
</property>
</widget>
</item>
<item row="21" column="1">
<widget class="QComboBox" name="rotEncMode_CB"/>
</item>
<item row="22" column="0">
<widget class="QLabel" name="label_modelQuickSelect">
<property name="text">
<string>Model quick select</string>
</property>
</widget>
</item>
<item row="22" column="1">
<item row="24" column="1">
<widget class="QCheckBox" name="modelQuickSelect_CB">
<property name="toolTip">
<string>Enable this to quickly change model on the model select page (a long press can then be used to open the model edit menu).</string>
@@ -882,7 +882,7 @@ p, li { white-space: pre-wrap; }
</property>
</widget>
</item>
<item row="27" column="0">
<item row="29" column="0">
<spacer name="verticalSpacer_3">
<property name="orientation">
<enum>Qt::Vertical</enum>
@@ -895,7 +895,7 @@ p, li { white-space: pre-wrap; }
</property>
</spacer>
</item>
<item row="17" column="1">
<item row="19" column="1">
<widget class="QComboBox" name="countrycode_CB">
<item>
<property name="text">
@@ -933,20 +933,6 @@ p, li { white-space: pre-wrap; }
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QLabel" name="varioP0_label">
<property name="text">
<string>Vario pitch at zero</string>
</property>
</widget>
</item>
<item row="14" column="0">
<widget class="QLabel" name="re_label">
<property name="text">
<string>RotEnc Navigation</string>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QSpinBox" name="varioP0_SB">
<property name="suffix">
@@ -966,7 +952,21 @@ p, li { white-space: pre-wrap; }
</property>
</widget>
</item>
<item row="15" column="1">
<item row="4" column="0">
<widget class="QLabel" name="varioP0_label">
<property name="text">
<string>Vario pitch at zero</string>
</property>
</widget>
</item>
<item row="16" column="0">
<widget class="QLabel" name="re_label">
<property name="text">
<string>RotEnc Navigation</string>
</property>
</widget>
</item>
<item row="17" column="1">
<layout class="QHBoxLayout" name="horizontalLayout_3">
<item>
<widget class="QCheckBox" name="stickReverse1">
@@ -1016,7 +1016,7 @@ p, li { white-space: pre-wrap; }
</property>
</widget>
</item>
<item row="17" column="0">
<item row="19" column="0">
<widget class="QLabel" name="countrycode_label">
<property name="text">
<string>Country Code</string>
@@ -1058,7 +1058,7 @@ p, li { white-space: pre-wrap; }
</property>
</widget>
</item>
<item row="18" column="1">
<item row="20" column="1">
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="TimezoneEdit" name="timezoneLE"/>
@@ -1092,7 +1092,7 @@ p, li { white-space: pre-wrap; }
</property>
</widget>
</item>
<item row="16" column="0">
<item row="18" column="0">
<widget class="QLabel" name="label_faimode">
<property name="text">
<string>FAI Mode</string>
@@ -1118,7 +1118,7 @@ p, li { white-space: pre-wrap; }
</property>
</widget>
</item>
<item row="16" column="1">
<item row="18" column="1">
<widget class="QCheckBox" name="faimode_CB">
<property name="toolTip">
<string>If you enable FAI, only RSSI and RxBt sensors will keep working. This function cannot be disabled by the radio.</string>
@@ -1128,14 +1128,14 @@ p, li { white-space: pre-wrap; }
</property>
</widget>
</item>
<item row="12" column="0">
<item row="13" column="0">
<widget class="QLabel" name="backlightColor_label">
<property name="text">
<string>Backlight color</string>
</property>
</widget>
</item>
<item row="12" column="1">
<item row="13" column="1">
<layout class="QHBoxLayout" name="backlightColor_Layout">
<item>
<widget class="QLabel" name="backlightColor1_label">
@@ -1187,14 +1187,14 @@ p, li { white-space: pre-wrap; }
</property>
</widget>
</item>
<item row="13" column="0">
<item row="15" column="0">
<widget class="QLabel" name="label_KeysBl">
<property name="text">
<string>Keys Backlight</string>
</property>
</widget>
</item>
<item row="11" column="1">
<item row="12" column="1">
<widget class="QSpinBox" name="OFFBright_SB">
<property name="minimum">
<number>5</number>
@@ -1204,14 +1204,14 @@ p, li { white-space: pre-wrap; }
</property>
</widget>
</item>
<item row="26" column="0">
<item row="28" column="0">
<widget class="QLabel" name="label_favMultiMode">
<property name="text">
<string>Favorites matching</string>
</property>
</widget>
</item>
<item row="24" column="1">
<item row="26" column="1">
<widget class="QComboBox" name="labelSingleSelect_CB">
<item>
<property name="text">
@@ -1225,7 +1225,7 @@ p, li { white-space: pre-wrap; }
</item>
</widget>
</item>
<item row="25" column="1">
<item row="27" column="1">
<widget class="QComboBox" name="labelMultiMode_CB">
<item>
<property name="text">
@@ -1239,7 +1239,7 @@ p, li { white-space: pre-wrap; }
</item>
</widget>
</item>
<item row="26" column="1">
<item row="28" column="1">
<widget class="QComboBox" name="favMultiMode_CB">
<item>
<property name="text">
@@ -1253,6 +1253,20 @@ p, li { white-space: pre-wrap; }
</item>
</widget>
</item>
<item row="14" column="0">
<widget class="QLabel" name="invertLCD_label">
<property name="text">
<string>Invert LCD</string>
</property>
</widget>
</item>
<item row="14" column="1">
<widget class="QCheckBox" name="invertLCD_CB">
<property name="text">
<string/>
</property>
</widget>
</item>
</layout>
</item>
<item row="0" column="0" colspan="2">
+4 -1
View File
@@ -979,8 +979,11 @@ PACK(struct RadioData {
#if defined(COLORLCD)
NOBACKUP(uint8_t space:7 SKIP);
#elif LCD_W == 128
uint8_t invertLCD:1; // Invert B&W LCD display
NOBACKUP(uint8_t spare:4 SKIP);
#else
NOBACKUP(uint8_t space:5 SKIP);
NOBACKUP(uint8_t spare:5 SKIP);
#endif
NOBACKUP(uint8_t getBrightness() const
@@ -80,6 +80,10 @@ enum {
ITEM_RADIO_HARDWARE_JITTER_FILTER,
ITEM_RADIO_HARDWARE_RAS,
ITEM_RADIO_HARDWARE_SPORT_UPDATE_POWER,
#if (defined(BACKLIGHT_GPIO) || defined(OLED_SCREEN)) && (LCD_W == 128)
ITEM_RADIO_HARDWARE_SCREEN_LABEL,
ITEM_RADIO_HARDWARE_SCREEN_INVERT,
#endif
ITEM_RADIO_HARDWARE_DEBUG,
#if defined(FUNCTION_SWITCHES)
ITEM_RADIO_HARDWARE_DEBUG_FS,
@@ -211,6 +215,11 @@ static void _init_menu_tab_array(uint8_t* tab, size_t len)
tab[ITEM_RADIO_HARDWARE_SPORT_UPDATE_POWER] = HIDDEN_ROW;
}
#if (defined(BACKLIGHT_GPIO) || defined(OLED_SCREEN)) && (LCD_W == 128)
tab[ITEM_RADIO_HARDWARE_SCREEN_LABEL] = READONLY_ROW;
tab[ITEM_RADIO_HARDWARE_SCREEN_INVERT] = 0;
#endif
tab[ITEM_RADIO_HARDWARE_DEBUG] = 1;
#if defined(FUNCTION_SWITCHES)
tab[ITEM_RADIO_HARDWARE_DEBUG_FS] = 0;
@@ -425,6 +434,21 @@ void menuRadioHardware(event_t event)
}
break;
#if (defined(BACKLIGHT_GPIO) || defined(OLED_SCREEN)) && (LCD_W == 128)
case ITEM_RADIO_HARDWARE_SCREEN_LABEL:
lcdDrawTextAlignedLeft(y, STR_SCREEN);
break;
case ITEM_RADIO_HARDWARE_SCREEN_INVERT:
{
lcdDrawText(INDENT_WIDTH, y, STR_MENU_INVERT);
bool inv = g_eeGeneral.invertLCD;
g_eeGeneral.invertLCD = editCheckBox(g_eeGeneral.invertLCD, HW_SETTINGS_COLUMN2, y, nullptr, attr, event);
if (inv != g_eeGeneral.invertLCD)
lcdSetInvert(g_eeGeneral.invertLCD);
}
break;
#endif
case ITEM_RADIO_HARDWARE_DEBUG:
lcdDrawTextAlignedLeft(y, STR_DEBUG);
lcdDrawText(HW_SETTINGS_COLUMN2, y, STR_ANALOGS_BTN, menuHorizontalPosition == 0 ? attr : 0);
+5 -1
View File
@@ -611,5 +611,9 @@ const char * restoreModel(uint8_t idx, char *model_name)
bool storageReadRadioSettings(bool checks)
{
if (!sdMounted()) sdInit();
return loadRadioSettingsYaml(checks) == nullptr;
bool rv = loadRadioSettingsYaml(checks) == nullptr;
#if LCD_W == 128
lcdSetInvert(g_eeGeneral.invertLCD);
#endif
return rv;
}
@@ -358,7 +358,8 @@ static const struct YamlNode struct_RadioData[] = {
YAML_UNSIGNED( "modelCustomScriptsDisabled", 1 ),
YAML_UNSIGNED( "modelTelemetryDisabled", 1 ),
YAML_UNSIGNED( "disableTrainerPoweroffAlarm", 1 ),
YAML_PADDING( 5 ),
YAML_UNSIGNED( "invertLCD", 1 ),
YAML_PADDING( 4 ),
YAML_END
};
static const struct YamlNode struct_unsigned_8[] = {
@@ -358,7 +358,8 @@ static const struct YamlNode struct_RadioData[] = {
YAML_UNSIGNED( "modelCustomScriptsDisabled", 1 ),
YAML_UNSIGNED( "modelTelemetryDisabled", 1 ),
YAML_UNSIGNED( "disableTrainerPoweroffAlarm", 1 ),
YAML_PADDING( 5 ),
YAML_UNSIGNED( "invertLCD", 1 ),
YAML_PADDING( 4 ),
YAML_END
};
static const struct YamlNode struct_unsigned_8[] = {
@@ -358,7 +358,8 @@ static const struct YamlNode struct_RadioData[] = {
YAML_UNSIGNED( "modelCustomScriptsDisabled", 1 ),
YAML_UNSIGNED( "modelTelemetryDisabled", 1 ),
YAML_UNSIGNED( "disableTrainerPoweroffAlarm", 1 ),
YAML_PADDING( 5 ),
YAML_UNSIGNED( "invertLCD", 1 ),
YAML_PADDING( 4 ),
YAML_END
};
static const struct YamlNode struct_unsigned_8[] = {
@@ -361,7 +361,8 @@ static const struct YamlNode struct_RadioData[] = {
YAML_UNSIGNED( "modelCustomScriptsDisabled", 1 ),
YAML_UNSIGNED( "modelTelemetryDisabled", 1 ),
YAML_UNSIGNED( "disableTrainerPoweroffAlarm", 1 ),
YAML_PADDING( 5 ),
YAML_UNSIGNED( "invertLCD", 1 ),
YAML_PADDING( 4 ),
YAML_END
};
static const struct YamlNode struct_unsigned_8[] = {
+6
View File
@@ -426,6 +426,12 @@ void lcdSetRefVolt(uint8_t val)
}
#endif
#if LCD_W == 128
void lcdSetInvert(bool invert)
{
}
#endif
void boardInit()
{
}
+3
View File
@@ -371,6 +371,9 @@ void lcdRefresh();
void lcdRefresh(bool wait=true); // TODO uint8_t wait to simplify this
#endif
void lcdSetRefVolt(unsigned char val);
#if LCD_W == 128
void lcdSetInvert(bool invert);
#endif
#ifdef __cplusplus
void lcdSetContrast(bool useDefault = false);
#endif
@@ -411,3 +411,10 @@ void lcdSetRefVolt(uint8_t val)
lcdWriteCommand(0x81); // Set Vop
lcdWriteCommand(val+LCD_CONTRAST_OFFSET); // 0-255
}
#if LCD_W == 128
void lcdSetInvert(bool invert)
{
lcdWriteCommand(invert ? 0xA7 : 0xA6);
}
#endif