Skip to content

Commit f16c941

Browse files
andrewkozlikprusnak
authored andcommitted
legacy: fix SCA when displaying the words
1 parent 5edffb3 commit f16c941

3 files changed

Lines changed: 37 additions & 9 deletions

File tree

legacy/firmware/layout2.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -544,8 +544,9 @@ void layoutResetWord(const char *word, int pass, int word_pos, bool last) {
544544
oledDrawString(left, 0 * 9, action, FONT_STANDARD);
545545
oledDrawString(left, 2 * 9, word_pos < 10 ? index_str + 1 : index_str,
546546
FONT_STANDARD);
547-
oledDrawString(left, 3 * 9, word, FONT_STANDARD | FONT_DOUBLE);
548-
oledHLine(OLED_HEIGHT - 13);
547+
oledDrawStringCenter(OLED_WIDTH / 2, 4 * 9 - 3, word,
548+
FONT_FIXED | FONT_DOUBLE);
549+
oledSCA(4 * 9 - 3 - 2, 4 * 9 - 3 + 15 + 2, OLED_WIDTH / 2);
549550
layoutButtonYes(btnYes);
550551
oledRefresh();
551552
}

legacy/oled.c

Lines changed: 32 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,13 @@ static bool is_debug_link = 0;
7373
#define OLED_OFFSET(x, y) (OLED_BUFSIZE - 1 - (x) - ((y) / 8) * OLED_WIDTH)
7474
#define OLED_MASK(x, y) (1 << (7 - (y) % 8))
7575

76+
/*
77+
* Return the state of the pixel at x, y
78+
*/
79+
bool oledGetPixel(int x, int y) {
80+
return _oledbuffer[OLED_OFFSET(x, y)] & OLED_MASK(x, y);
81+
}
82+
7683
/*
7784
* Draws a white pixel at x, y
7885
*/
@@ -239,11 +246,11 @@ void oledDrawChar(int x, int y, char c, int font) {
239246
return;
240247
}
241248

242-
int zoom = (font & FONT_DOUBLE ? 2 : 1);
249+
int zoom = (font & FONT_DOUBLE) ? 2 : 1;
243250
int char_width = fontCharWidth(font & 0x7f, c);
244251
const uint8_t *char_data = fontCharData(font & 0x7f, c);
245252

246-
if (x <= -char_width * zoom) {
253+
if (x <= -char_width) {
247254
return;
248255
}
249256

@@ -253,7 +260,7 @@ void oledDrawChar(int x, int y, char c, int font) {
253260
if (zoom <= 1) {
254261
oledDrawPixel(x + xo, y + yo);
255262
} else {
256-
oledBox(x + xo * zoom, y + yo * zoom, x + (xo + 1) * zoom - 1,
263+
oledBox(x + xo, y + yo * zoom, x + (xo + 1) - 1,
257264
y + (yo + 1) * zoom - 1, true);
258265
}
259266
}
@@ -273,12 +280,12 @@ char oledConvertChar(const char c) {
273280

274281
int oledStringWidth(const char *text, int font) {
275282
if (!text) return 0;
276-
int size = (font & FONT_DOUBLE ? 2 : 1);
283+
int space = (font & FONT_DOUBLE) ? 2 : 1;
277284
int l = 0;
278285
for (; *text; text++) {
279286
char c = oledConvertChar(*text);
280287
if (c) {
281-
l += size * (fontCharWidth(font & 0x7f, c) + 1);
288+
l += fontCharWidth(font & 0x7f, c) + space;
282289
}
283290
}
284291
return l;
@@ -287,12 +294,12 @@ int oledStringWidth(const char *text, int font) {
287294
void oledDrawString(int x, int y, const char *text, int font) {
288295
if (!text) return;
289296
int l = 0;
290-
int size = (font & FONT_DOUBLE ? 2 : 1);
297+
int space = (font & FONT_DOUBLE) ? 2 : 1;
291298
for (; *text; text++) {
292299
char c = oledConvertChar(*text);
293300
if (c) {
294301
oledDrawChar(x + l, y, c, font);
295-
l += size * (fontCharWidth(font & 0x7f, c) + 1);
302+
l += fontCharWidth(font & 0x7f, c) + space;
296303
}
297304
}
298305
}
@@ -413,3 +420,21 @@ void oledSwipeRight(void) {
413420
oledRefresh();
414421
}
415422
}
423+
424+
/*
425+
* Mitigate SCA on lines y1-y2 by setting exactly width pixels black
426+
*/
427+
void oledSCA(int y1, int y2, int width) {
428+
y1 = MAX(y1, 0);
429+
y2 = MIN(y2, OLED_HEIGHT - 1);
430+
for (int y = y1; y <= y2; y++) {
431+
int pix = 0;
432+
for (int x = 0; x < OLED_WIDTH; x++) {
433+
pix += oledGetPixel(x, y);
434+
}
435+
pix = MAX(width - pix, 0);
436+
for (int x = 0 + (pix / 2); x < OLED_WIDTH - ((pix + 1) / 2); x++) {
437+
oledInvertPixel(x, y);
438+
}
439+
}
440+
}

legacy/oled.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ void oledInvertDebugLink(void);
3939

4040
void oledSetBuffer(uint8_t *buf);
4141
const uint8_t *oledGetBuffer(void);
42+
bool oledGetPixel(int x, int y);
4243
void oledDrawPixel(int x, int y);
4344
void oledClearPixel(int x, int y);
4445
void oledInvertPixel(int x, int y);
@@ -55,5 +56,6 @@ void oledHLine(int y);
5556
void oledFrame(int x1, int y1, int x2, int y2);
5657
void oledSwipeLeft(void);
5758
void oledSwipeRight(void);
59+
void oledSCA(int y1, int y2, int val);
5860

5961
#endif

0 commit comments

Comments
 (0)