prevent heap fragmentation

This commit is contained in:
2026-01-11 21:58:52 +01:00
parent da6db59e27
commit aa76dd5780
3 changed files with 40 additions and 58 deletions

View File

@@ -3153,7 +3153,6 @@ int16_t TFT_eSPI::drawString(const char *string, int32_t poX, int32_t poY, uint8
} }
} }
int8_t xo = 0; int8_t xo = 0;
uint16_t len = strlen(string); uint16_t len = strlen(string);
@@ -3275,7 +3274,7 @@ int16_t TFT_eSPI::drawFloat(float floatNumber, uint8_t dp, int32_t poX, int32_t
void TFT_eSPI::setTextFont(uint8_t f) void TFT_eSPI::setTextFont(uint8_t f)
{ {
textfont = (f > 8) ? 1 : f; // Don't allow font > 8 textfont = (f > 7) ? 1 : f; // Don't allow font > 7
} }
SPIClass& TFT_eSPI::getSPIinstance() SPIClass& TFT_eSPI::getSPIinstance()

View File

@@ -350,8 +350,7 @@ class TFT_eSPI { friend class TFT_eSprite;
uint16_t maxDescent; // Maximum descent found in font uint16_t maxDescent; // Maximum descent found in font
} fontMetrics; } fontMetrics;
fontMetrics gFonts[8] = { fontMetrics gFonts[7] = {
{ nullptr, 0, 0, 0, 0, 0, 0, 0 },
{ nullptr, 0, 0, 0, 0, 0, 0, 0 }, { nullptr, 0, 0, 0, 0, 0, 0, 0 },
{ nullptr, 0, 0, 0, 0, 0, 0, 0 }, { nullptr, 0, 0, 0, 0, 0, 0, 0 },
{ nullptr, 0, 0, 0, 0, 0, 0, 0 }, { nullptr, 0, 0, 0, 0, 0, 0, 0 },
@@ -362,13 +361,13 @@ class TFT_eSPI { friend class TFT_eSprite;
}; };
// These are for the metrics for each individual glyph (so we don't need to seek this in file and waste time) // These are for the metrics for each individual glyph (so we don't need to seek this in file and waste time)
uint16_t* gUnicode[8] = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}; //UTF-16 code, the codes are searched so do not need to be sequential uint16_t* gUnicode[7] = {NULL, NULL, NULL, NULL, NULL, NULL, NULL}; //UTF-16 code, the codes are searched so do not need to be sequential
uint8_t* gHeight[8] = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}; //cheight uint8_t* gHeight[7] = {NULL, NULL, NULL, NULL, NULL, NULL, NULL}; //cheight
uint8_t* gWidth[8] = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}; //cwidth uint8_t* gWidth[7] = {NULL, NULL, NULL, NULL, NULL, NULL, NULL}; //cwidth
uint8_t* gxAdvance[8] = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}; //setWidth uint8_t* gxAdvance[7] = {NULL, NULL, NULL, NULL, NULL, NULL}; //setWidth
int16_t* gdY[8] = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}; //topExtent int16_t* gdY[7] = {NULL, NULL, NULL, NULL, NULL, NULL, NULL}; //topExtent
int8_t* gdX[8] = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}; //leftExtent int8_t* gdX[7] = {NULL, NULL, NULL, NULL, NULL, NULL, NULL}; //leftExtent
uint32_t* gBitmap[8] = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}; //file pointer to greyscale bitmap uint32_t* gBitmap[7] = {NULL, NULL, NULL, NULL, NULL, NULL, NULL}; //file pointer to greyscale bitmap
uint8_t getTouchRaw(uint16_t *x, uint16_t *y); uint8_t getTouchRaw(uint16_t *x, uint16_t *y);
uint16_t getTouchRawZ(void); uint16_t getTouchRawZ(void);

View File

@@ -1236,11 +1236,7 @@ void setup() {
tft.init(); tft.init();
tft.initDMA(); tft.initDMA();
tft.loadFont(FONT16, 0); tft.loadFont(FONT48, 2);
tft.loadFont(FONT16_CHS, 1);
tft.loadFont(FONT28, 2);
tft.loadFont(FONT28_CHS, 3);
tft.loadFont(FONT48, 4);
doTheme(); doTheme();
@@ -1289,16 +1285,10 @@ void setup() {
FrequencySprite.loadFont(FREQFONT3, 3); FrequencySprite.loadFont(FREQFONT3, 3);
FrequencySprite.loadFont(FREQFONT4, 4); FrequencySprite.loadFont(FREQFONT4, 4);
FrequencySprite.loadFont(FREQFONT5, 5); FrequencySprite.loadFont(FREQFONT5, 5);
FrequencySprite.loadFont(FONT16, 6);
FrequencySprite.loadFont(FONT16_CHS, 7);
GeneralTextSprite.createSprite(308, 28); GeneralTextSprite.createSprite(308, 28);
GeneralTextSprite.setSwapBytes(true); GeneralTextSprite.setSwapBytes(true);
GeneralTextSprite.loadFont(FONT16, 0); GeneralTextSprite.loadFont(FONT48, 2);
GeneralTextSprite.loadFont(FONT16_CHS, 1);
GeneralTextSprite.loadFont(FONT28, 2);
GeneralTextSprite.loadFont(FONT28_CHS, 3);
GeneralTextSprite.loadFont(FONT48, 4);
PSSprite.createSprite(150, 32); PSSprite.createSprite(150, 32);
PSSprite.setSwapBytes(true); PSSprite.setSwapBytes(true);
@@ -1309,18 +1299,12 @@ void setup() {
SquelchSprite.createSprite(27, 19); SquelchSprite.createSprite(27, 19);
SquelchSprite.setSwapBytes(true); SquelchSprite.setSwapBytes(true);
SquelchSprite.loadFont(FONT16, 0);
SquelchSprite.loadFont(FONT16_CHS, 1);
FullLineSprite.createSprite(308, 19); FullLineSprite.createSprite(308, 19);
FullLineSprite.setSwapBytes(true); FullLineSprite.setSwapBytes(true);
FullLineSprite.loadFont(FONT16, 0);
FullLineSprite.loadFont(FONT16_CHS, 1);
OneBigLineSprite.createSprite(270, 30); OneBigLineSprite.createSprite(270, 30);
OneBigLineSprite.setSwapBytes(true); OneBigLineSprite.setSwapBytes(true);
OneBigLineSprite.loadFont(FONT28, 0);
OneBigLineSprite.loadFont(FONT28_CHS, 1);
SignalSprite.createSprite(80, 48); SignalSprite.createSprite(80, 48);
SignalSprite.loadFont(FONT28, 0); SignalSprite.loadFont(FONT28, 0);
@@ -3304,9 +3288,9 @@ void doSquelch() {
if (!BWtune && !menu && (Squelch > Squelchold + 2 || Squelch < Squelchold - 2)) { if (!BWtune && !menu && (Squelch > Squelchold + 2 || Squelch < Squelchold - 2)) {
SquelchSprite.setTextColor(PrimaryColor, PrimaryColorSmooth, false); SquelchSprite.setTextColor(PrimaryColor, PrimaryColorSmooth, false);
SquelchSprite.fillSprite(BackgroundColor); SquelchSprite.fillSprite(BackgroundColor);
if (Squelch == -100) SquelchSprite.drawString("--", 0, 0, (language == LANGUAGE_CHS) ? 1 : 0); if (Squelch == -100) SquelchSprite.drawString("--", 0, 0);
else if (Squelch == 920) SquelchSprite.drawString("ST", 0, 0, (language == LANGUAGE_CHS) ? 1 : 0); else if (Squelch == 920) SquelchSprite.drawString("ST", 0, 0);
else SquelchSprite.drawString(String(SquelchShow), 0, 0, (language == LANGUAGE_CHS) ? 1 : 0); else SquelchSprite.drawString(String(SquelchShow), 0, 0);
SquelchSprite.pushSprite(223, 147); SquelchSprite.pushSprite(223, 147);
Squelchold = Squelch; Squelchold = Squelch;
} }
@@ -3341,9 +3325,9 @@ void doSquelch() {
SquelchSprite.setTextColor(PrimaryColor, PrimaryColorSmooth, false); SquelchSprite.setTextColor(PrimaryColor, PrimaryColorSmooth, false);
SquelchSprite.fillSprite(BackgroundColor); SquelchSprite.fillSprite(BackgroundColor);
if (Squelch == -1) SquelchSprite.drawString("ST", 0, 0, (language == LANGUAGE_CHS) ? 1 : 0); if (Squelch == -1) SquelchSprite.drawString("ST", 0, 0);
else if (Squelch == 0) SquelchSprite.drawString("--", 0, 0, (language == LANGUAGE_CHS) ? 1 : 0); else if (Squelch == 0) SquelchSprite.drawString("--", 0, 0);
else SquelchSprite.drawString(String(SquelchShow), 0, 0, (language == LANGUAGE_CHS) ? 1 : 0); else SquelchSprite.drawString(String(SquelchShow), 0, 0);
if (Squelch != Squelchold) SquelchSprite.pushSprite(223, 147); if (Squelch != Squelchold) SquelchSprite.pushSprite(223, 147);
Squelchold = Squelch; Squelchold = Squelch;
} }
@@ -3846,14 +3830,9 @@ void read_encoder() {
void tftReplace(int8_t offset, const String & textold, const String & text, int16_t x, int16_t y, int color, int smoothcolor, int background, uint8_t fontsize) { void tftReplace(int8_t offset, const String & textold, const String & text, int16_t x, int16_t y, int color, int smoothcolor, int background, uint8_t fontsize) {
uint8_t selectedFont = 0; uint8_t selectedFont = 0;
if (language == LANGUAGE_CHS) { if (fontsize == 16) selectedFont = 0;
if (fontsize == 16) selectedFont = 1; else if (fontsize == 28) selectedFont = 1;
else if (fontsize == 28) selectedFont = 3; else if (fontsize == 48) selectedFont = 2;
} else {
if (fontsize == 16) selectedFont = 0;
else if (fontsize == 28) selectedFont = 2;
}
if (fontsize == 48) selectedFont = 4;
tft.setTextColor(background, background, false); tft.setTextColor(background, background, false);
@@ -3880,14 +3859,9 @@ void tftReplace(int8_t offset, const String & textold, const String & text, int1
void tftPrint(int8_t offset, const String & text, int16_t x, int16_t y, int color, int smoothcolor, uint8_t fontsize) { void tftPrint(int8_t offset, const String & text, int16_t x, int16_t y, int color, int smoothcolor, uint8_t fontsize) {
uint8_t selectedFont = 0; uint8_t selectedFont = 0;
if (language == LANGUAGE_CHS) { if (fontsize == 16) selectedFont = 0;
if (fontsize == 16) selectedFont = 1; else if (fontsize == 28) selectedFont = 1;
else if (fontsize == 28) selectedFont = 3; else if (fontsize == 48) selectedFont = 2;
} else {
if (fontsize == 16) selectedFont = 0;
else if (fontsize == 28) selectedFont = 2;
}
if (fontsize == 48) selectedFont = 4;
tft.setTextColor(color, smoothcolor, (fontsize == 52 ? true : false)); tft.setTextColor(color, smoothcolor, (fontsize == 52 ? true : false));
@@ -3906,14 +3880,24 @@ void tftPrint(int8_t offset, const String & text, int16_t x, int16_t y, int colo
void UpdateFonts() { void UpdateFonts() {
if (language == LANGUAGE_CHS) { if (language == LANGUAGE_CHS) {
if (menu) PSSprite.setTextFont(1); else PSSprite.setTextFont(3); if (menu) PSSprite.setTextFont(1); else PSSprite.setTextFont(3);
OneBigLineSprite.setTextFont(1); OneBigLineSprite.loadFont(FONT28_CHS, 0);
GeneralTextSprite.setTextFont(1); FullLineSprite.loadFont(FONT16_CHS, 0);
FullLineSprite.setTextFont(1); GeneralTextSprite.loadFont(FONT16_CHS, 0);
GeneralTextSprite.loadFont(FONT28_CHS, 1);
FrequencySprite.loadFont(FONT16_CHS, 6);
tft.loadFont(FONT16_CHS, 0);
tft.loadFont(FONT28_CHS, 1);
SquelchSprite.loadFont(FONT16, 0);
} else { } else {
if (menu) PSSprite.setTextFont(0); else PSSprite.setTextFont(2); if (menu) PSSprite.setTextFont(0); else PSSprite.setTextFont(2);
OneBigLineSprite.setTextFont(0); OneBigLineSprite.loadFont(FONT28, 0);
GeneralTextSprite.setTextFont(0); FullLineSprite.loadFont(FONT16, 0);
FullLineSprite.setTextFont(0); GeneralTextSprite.loadFont(FONT16, 0);
GeneralTextSprite.loadFont(FONT28, 1);
FrequencySprite.loadFont(FONT16, 6);
tft.loadFont(FONT16, 0);
tft.loadFont(FONT28, 1);
SquelchSprite.loadFont(FONT16_CHS, 0);
} }
} }
@@ -4007,7 +3991,7 @@ uint8_t doAutoMemory(uint16_t startfreq, uint16_t stopfreq, uint8_t startmem, ui
SignalSprite.pushSprite(120, 125); SignalSprite.pushSprite(120, 125);
SquelchSprite.setTextColor(PrimaryColor, PrimaryColorSmooth, false); SquelchSprite.setTextColor(PrimaryColor, PrimaryColorSmooth, false);
SquelchSprite.drawString(String(counter), 0, 0, (language == LANGUAGE_CHS) ? 1 : 0); SquelchSprite.drawString(String(counter), 0, 0);
SquelchSprite.pushSprite(200, 155); SquelchSprite.pushSprite(200, 155);
tft.fillRect(60, 110, 2 * percent, 6, BarInsignificantColor); tft.fillRect(60, 110, 2 * percent, 6, BarInsignificantColor);