fix: prevent Serial.printf from blocking when USB disconnected
All checks were successful
CI / build (push) Successful in 2m23s
All checks were successful
CI / build (push) Successful in 2m23s
On ESP32-C3 with USB CDC, Serial.printf() blocks indefinitely when USB is not connected. This caused device freezes when booted without USB. Solution: Call Serial.setTxTimeoutMs(0) after Serial.begin() to make all Serial output non-blocking. Also added if (Serial) guards to high-traffic logging paths in EpubReaderActivity as belt-and-suspenders protection. Includes documentation of the debugging process and Serial call inventory. Also applies clang-format to fix pre-existing formatting issues.
This commit is contained in:
@@ -5,13 +5,9 @@
|
||||
// Global high contrast mode flag
|
||||
static bool g_highContrastMode = false;
|
||||
|
||||
void setHighContrastMode(bool enabled) {
|
||||
g_highContrastMode = enabled;
|
||||
}
|
||||
void setHighContrastMode(bool enabled) { g_highContrastMode = enabled; }
|
||||
|
||||
bool isHighContrastMode() {
|
||||
return g_highContrastMode;
|
||||
}
|
||||
bool isHighContrastMode() { return g_highContrastMode; }
|
||||
|
||||
// Brightness/Contrast adjustments:
|
||||
constexpr bool USE_BRIGHTNESS = false; // true: apply brightness/gamma adjustments
|
||||
|
||||
@@ -327,7 +327,8 @@ void GfxRenderer::drawBitmap(const Bitmap& bitmap, const int x, const int y, con
|
||||
// Calculate screen Y position
|
||||
const int screenYStart = y + static_cast<int>(std::floor(logicalY * scale));
|
||||
// For upscaling, calculate the end position for this source row
|
||||
const int screenYEnd = isUpscaling ? (y + static_cast<int>(std::floor((logicalY + 1) * scale))) : (screenYStart + 1);
|
||||
const int screenYEnd =
|
||||
isUpscaling ? (y + static_cast<int>(std::floor((logicalY + 1) * scale))) : (screenYStart + 1);
|
||||
|
||||
// Draw to all Y positions this source row maps to (for upscaling, this fills gaps)
|
||||
for (int screenY = screenYStart; screenY < screenYEnd; screenY++) {
|
||||
@@ -340,7 +341,8 @@ void GfxRenderer::drawBitmap(const Bitmap& bitmap, const int x, const int y, con
|
||||
// Calculate screen X position
|
||||
const int screenXStart = x + static_cast<int>(std::floor(srcX * scale));
|
||||
// For upscaling, calculate the end position for this source pixel
|
||||
const int screenXEnd = isUpscaling ? (x + static_cast<int>(std::floor((srcX + 1) * scale))) : (screenXStart + 1);
|
||||
const int screenXEnd =
|
||||
isUpscaling ? (x + static_cast<int>(std::floor((srcX + 1) * scale))) : (screenXStart + 1);
|
||||
|
||||
const uint8_t val = outputRow[bmpX / 4] >> (6 - ((bmpX * 2) % 8)) & 0x3;
|
||||
|
||||
@@ -409,7 +411,8 @@ void GfxRenderer::drawBitmap1Bit(const Bitmap& bitmap, const int x, const int y,
|
||||
// Calculate screen Y position
|
||||
const int screenYStart = y + static_cast<int>(std::floor(logicalY * scale));
|
||||
// For upscaling, calculate the end position for this source row
|
||||
const int screenYEnd = isUpscaling ? (y + static_cast<int>(std::floor((logicalY + 1) * scale))) : (screenYStart + 1);
|
||||
const int screenYEnd =
|
||||
isUpscaling ? (y + static_cast<int>(std::floor((logicalY + 1) * scale))) : (screenYStart + 1);
|
||||
|
||||
// Draw to all Y positions this source row maps to (for upscaling, this fills gaps)
|
||||
for (int screenY = screenYStart; screenY < screenYEnd; screenY++) {
|
||||
@@ -420,7 +423,8 @@ void GfxRenderer::drawBitmap1Bit(const Bitmap& bitmap, const int x, const int y,
|
||||
// Calculate screen X position
|
||||
const int screenXStart = x + static_cast<int>(std::floor(bmpX * scale));
|
||||
// For upscaling, calculate the end position for this source pixel
|
||||
const int screenXEnd = isUpscaling ? (x + static_cast<int>(std::floor((bmpX + 1) * scale))) : (screenXStart + 1);
|
||||
const int screenXEnd =
|
||||
isUpscaling ? (x + static_cast<int>(std::floor((bmpX + 1) * scale))) : (screenXStart + 1);
|
||||
|
||||
// Get 2-bit value (result of readNextRow quantization)
|
||||
const uint8_t val = outputRow[bmpX / 4] >> (6 - ((bmpX * 2) % 8)) & 0x3;
|
||||
@@ -998,26 +1002,38 @@ int mapPhysicalToLogicalEdge(int bezelEdge, GfxRenderer::Orientation orientation
|
||||
return bezelEdge;
|
||||
case GfxRenderer::LandscapeClockwise:
|
||||
switch (bezelEdge) {
|
||||
case 0: return 2; // Physical bottom -> logical left
|
||||
case 1: return 3; // Physical top -> logical right
|
||||
case 2: return 1; // Physical left -> logical top
|
||||
case 3: return 0; // Physical right -> logical bottom
|
||||
case 0:
|
||||
return 2; // Physical bottom -> logical left
|
||||
case 1:
|
||||
return 3; // Physical top -> logical right
|
||||
case 2:
|
||||
return 1; // Physical left -> logical top
|
||||
case 3:
|
||||
return 0; // Physical right -> logical bottom
|
||||
}
|
||||
break;
|
||||
case GfxRenderer::PortraitInverted:
|
||||
switch (bezelEdge) {
|
||||
case 0: return 1; // Physical bottom -> logical top
|
||||
case 1: return 0; // Physical top -> logical bottom
|
||||
case 2: return 3; // Physical left -> logical right
|
||||
case 3: return 2; // Physical right -> logical left
|
||||
case 0:
|
||||
return 1; // Physical bottom -> logical top
|
||||
case 1:
|
||||
return 0; // Physical top -> logical bottom
|
||||
case 2:
|
||||
return 3; // Physical left -> logical right
|
||||
case 3:
|
||||
return 2; // Physical right -> logical left
|
||||
}
|
||||
break;
|
||||
case GfxRenderer::LandscapeCounterClockwise:
|
||||
switch (bezelEdge) {
|
||||
case 0: return 3; // Physical bottom -> logical right
|
||||
case 1: return 2; // Physical top -> logical left
|
||||
case 2: return 0; // Physical left -> logical bottom
|
||||
case 3: return 1; // Physical right -> logical top
|
||||
case 0:
|
||||
return 3; // Physical bottom -> logical right
|
||||
case 1:
|
||||
return 2; // Physical top -> logical left
|
||||
case 2:
|
||||
return 0; // Physical left -> logical bottom
|
||||
case 3:
|
||||
return 1; // Physical right -> logical top
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -1074,23 +1090,34 @@ void GfxRenderer::getOrientedViewableTRBL(int* outTop, int* outRight, int* outBo
|
||||
*outLeft = getViewableMarginLeft();
|
||||
break;
|
||||
case LandscapeClockwise:
|
||||
*outTop = BASE_VIEWABLE_MARGIN_LEFT + (mapPhysicalToLogicalEdge(bezelEdge, orientation) == 1 ? bezelCompensation : 0);
|
||||
*outRight = BASE_VIEWABLE_MARGIN_TOP + (mapPhysicalToLogicalEdge(bezelEdge, orientation) == 3 ? bezelCompensation : 0);
|
||||
*outBottom = BASE_VIEWABLE_MARGIN_RIGHT + (mapPhysicalToLogicalEdge(bezelEdge, orientation) == 0 ? bezelCompensation : 0);
|
||||
*outLeft = BASE_VIEWABLE_MARGIN_BOTTOM + (mapPhysicalToLogicalEdge(bezelEdge, orientation) == 2 ? bezelCompensation : 0);
|
||||
*outTop =
|
||||
BASE_VIEWABLE_MARGIN_LEFT + (mapPhysicalToLogicalEdge(bezelEdge, orientation) == 1 ? bezelCompensation : 0);
|
||||
*outRight =
|
||||
BASE_VIEWABLE_MARGIN_TOP + (mapPhysicalToLogicalEdge(bezelEdge, orientation) == 3 ? bezelCompensation : 0);
|
||||
*outBottom =
|
||||
BASE_VIEWABLE_MARGIN_RIGHT + (mapPhysicalToLogicalEdge(bezelEdge, orientation) == 0 ? bezelCompensation : 0);
|
||||
*outLeft =
|
||||
BASE_VIEWABLE_MARGIN_BOTTOM + (mapPhysicalToLogicalEdge(bezelEdge, orientation) == 2 ? bezelCompensation : 0);
|
||||
break;
|
||||
case PortraitInverted:
|
||||
*outTop = BASE_VIEWABLE_MARGIN_BOTTOM + (mapPhysicalToLogicalEdge(bezelEdge, orientation) == 1 ? bezelCompensation : 0);
|
||||
*outRight = BASE_VIEWABLE_MARGIN_LEFT + (mapPhysicalToLogicalEdge(bezelEdge, orientation) == 3 ? bezelCompensation : 0);
|
||||
*outBottom = BASE_VIEWABLE_MARGIN_TOP + (mapPhysicalToLogicalEdge(bezelEdge, orientation) == 0 ? bezelCompensation : 0);
|
||||
*outLeft = BASE_VIEWABLE_MARGIN_RIGHT + (mapPhysicalToLogicalEdge(bezelEdge, orientation) == 2 ? bezelCompensation : 0);
|
||||
*outTop =
|
||||
BASE_VIEWABLE_MARGIN_BOTTOM + (mapPhysicalToLogicalEdge(bezelEdge, orientation) == 1 ? bezelCompensation : 0);
|
||||
*outRight =
|
||||
BASE_VIEWABLE_MARGIN_LEFT + (mapPhysicalToLogicalEdge(bezelEdge, orientation) == 3 ? bezelCompensation : 0);
|
||||
*outBottom =
|
||||
BASE_VIEWABLE_MARGIN_TOP + (mapPhysicalToLogicalEdge(bezelEdge, orientation) == 0 ? bezelCompensation : 0);
|
||||
*outLeft =
|
||||
BASE_VIEWABLE_MARGIN_RIGHT + (mapPhysicalToLogicalEdge(bezelEdge, orientation) == 2 ? bezelCompensation : 0);
|
||||
break;
|
||||
case LandscapeCounterClockwise:
|
||||
*outTop = BASE_VIEWABLE_MARGIN_RIGHT + (mapPhysicalToLogicalEdge(bezelEdge, orientation) == 1 ? bezelCompensation : 0);
|
||||
*outRight = BASE_VIEWABLE_MARGIN_BOTTOM + (mapPhysicalToLogicalEdge(bezelEdge, orientation) == 3 ? bezelCompensation : 0);
|
||||
*outBottom = BASE_VIEWABLE_MARGIN_LEFT + (mapPhysicalToLogicalEdge(bezelEdge, orientation) == 0 ? bezelCompensation : 0);
|
||||
*outLeft = BASE_VIEWABLE_MARGIN_TOP + (mapPhysicalToLogicalEdge(bezelEdge, orientation) == 2 ? bezelCompensation : 0);
|
||||
*outTop =
|
||||
BASE_VIEWABLE_MARGIN_RIGHT + (mapPhysicalToLogicalEdge(bezelEdge, orientation) == 1 ? bezelCompensation : 0);
|
||||
*outRight =
|
||||
BASE_VIEWABLE_MARGIN_BOTTOM + (mapPhysicalToLogicalEdge(bezelEdge, orientation) == 3 ? bezelCompensation : 0);
|
||||
*outBottom =
|
||||
BASE_VIEWABLE_MARGIN_LEFT + (mapPhysicalToLogicalEdge(bezelEdge, orientation) == 0 ? bezelCompensation : 0);
|
||||
*outLeft =
|
||||
BASE_VIEWABLE_MARGIN_TOP + (mapPhysicalToLogicalEdge(bezelEdge, orientation) == 2 ? bezelCompensation : 0);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -94,10 +94,10 @@ class GfxRenderer {
|
||||
// Handles current render mode (BW, GRAYSCALE_MSB, GRAYSCALE_LSB)
|
||||
void fillRectGray(int x, int y, int width, int height, uint8_t grayLevel) const;
|
||||
void drawImage(const uint8_t bitmap[], int x, int y, int width, int height) const;
|
||||
void drawImageRotated(const uint8_t bitmap[], int x, int y, int width, int height,
|
||||
ImageRotation rotation, bool invert = false) const;
|
||||
void drawBitmap(const Bitmap& bitmap, int x, int y, int maxWidth, int maxHeight, float cropX = 0,
|
||||
float cropY = 0, bool invert = false) const;
|
||||
void drawImageRotated(const uint8_t bitmap[], int x, int y, int width, int height, ImageRotation rotation,
|
||||
bool invert = false) const;
|
||||
void drawBitmap(const Bitmap& bitmap, int x, int y, int maxWidth, int maxHeight, float cropX = 0, float cropY = 0,
|
||||
bool invert = false) const;
|
||||
void drawBitmap1Bit(const Bitmap& bitmap, int x, int y, int maxWidth, int maxHeight, bool invert = false) const;
|
||||
void fillPolygon(const int* xPoints, const int* yPoints, int numPoints, bool state = true) const;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user