From ac75872b2c78d681a50e493bda1fb87837adea03 Mon Sep 17 00:00:00 2001 From: Hinerk Date: Fri, 23 Aug 2019 11:34:58 +0200 Subject: [PATCH 01/10] select fonts in Display.print implementing a new epic method epic_disp_print_adv and improving display.print with new font parameter. epic_disp_print_adv behaves like epic_disp_print but also takes a new key font, which takes a number to select the font. The font name is verbalized using a new typedef enum FontName. The enum names correlate to the fonts under gfx/fonts. On MicroPython side, in the display module constants were defined in order to provide names instead of numbers --- epicardium/epicardium.h | 36 +++++++++++++++++++++++++++++ epicardium/modules/display.c | 41 +++++++++++++++++++++++++++++++++ pycardium/modules/py/display.py | 25 ++++++++++++++++++-- pycardium/modules/qstrdefs.h | 1 + pycardium/modules/sys_display.c | 25 ++++++++++++++++++++ 5 files changed, 126 insertions(+), 2 deletions(-) diff --git a/epicardium/epicardium.h b/epicardium/epicardium.h index 043b0e4b..8827b1b2 100644 --- a/epicardium/epicardium.h +++ b/epicardium/epicardium.h @@ -54,6 +54,7 @@ typedef _Bool bool; #define API_DISP_PIXEL 0x28 #define API_DISP_FRAMEBUFFER 0x29 #define API_DISP_BACKLIGHT 0x2a +#define API_DISP_PRINT_ADV 0x2b /* API_BATTERY_VOLTAGE 0x30 */ #define API_BATTERY_CURRENT 0x31 @@ -1223,6 +1224,29 @@ API(API_DISP_PRINT, uint16_t bg) ); +/** + * Prints a string into the display framebuffer with font type selectable + * + * :param fontName: number of font, use FontName enum + * :param posx: x position to print to. 0 <= x <= 160 + * :param posy: y position to print to. 0 <= y <= 80 + * :param pString: string to print + * :param fg: foreground color in rgb565 + * :param bg: background color in rgb565 + * :return: ``0`` on success or a negative value in case of an error: + * + * - ``-EBUSY``: Display was already locked from another task. + */ +API(API_DISP_PRINT_ADV, + int epic_disp_print_adv( + uint8_t fontName, + uint16_t posx, + uint16_t posy, + const char *pString, + uint16_t fg, + uint16_t bg) + ); + /** * Fills the whole screen with one color * @@ -1626,4 +1650,16 @@ API_ISR(EPIC_INT_RTC_ALARM, epic_isr_rtc_alarm); */ API(API_TRNG_READ, int epic_trng_read(uint8_t *dest, size_t size)); +/* + * Font Selection + */ +typedef enum +{ + fn_font12, + fn_font16, + fn_font20, + fn_font24, + fn_font8 +} FontName; + #endif /* _EPICARDIUM_H */ diff --git a/epicardium/modules/display.c b/epicardium/modules/display.c index c8dc5149..6a85d91e 100644 --- a/epicardium/modules/display.c +++ b/epicardium/modules/display.c @@ -37,6 +37,47 @@ int epic_disp_print( } } +int epic_disp_print_adv( + uint8_t fontName, + uint16_t posx, + uint16_t posy, + const char *pString, + uint16_t fg, + uint16_t bg +) { + sFONT *font; + int cl = check_lock(); + if (cl < 0) { + return cl; + } else { + /* + * this likely can be established with much less effort or at least + * sexier, but I do not know C-Language + */ + switch (fontName) { + case fn_font12: + font = &Font12; + break; + case fn_font16: + font = &Font16; + break; + case fn_font20: + font = &Font20; + break; + case fn_font24: + font = &Font24; + break; + case fn_font8: + font = &Font8; + break; + default: + return -1; + } + gfx_puts(font, &display_screen, posx, posy, pString, fg, bg); + return 0; + } +} + int epic_disp_clear(uint16_t color) { int cl = check_lock(); diff --git a/pycardium/modules/py/display.py b/pycardium/modules/py/display.py index e957977d..bf806628 100644 --- a/pycardium/modules/py/display.py +++ b/pycardium/modules/py/display.py @@ -1,6 +1,13 @@ import sys_display import color +# font enumeration +FONT12 = 0 +FONT16 = 1 +FONT20 = 2 +FONT24 = 3 +FONT8 = 4 + class Display: """ @@ -61,7 +68,7 @@ class Display: sys_display.clear(col) return self - def print(self, text, *, fg=None, bg=None, posx=0, posy=0): + def print(self, text, *, fg=None, bg=None, posx=0, posy=0, font=FONT20): """ Prints a string on the display. Font size is locked to 20px @@ -70,11 +77,25 @@ class Display: :param bg: Background color (expects RGB triple) :param posx: X-Position of the first character, 0 <= posx <= 160 :param posy: Y-Position of the first character, 0 <= posy <= 80 + :param font: 0 <= font <= 4 (currently) selects a font + + avaiable Fonts: + + - display.FONT8 + - display.FONT12 + - display.FONT16 + - display.FONT20 + - display.FONT24 + + >>> with display.open() as d: + ... d.clear() + ... d.print('Hello Earth!', font=display.FONT24) + ... d.update() """ fg = fg or color.WHITE bg = bg or color.BLACK - sys_display.print(text, posx, posy, fg, bg) + sys_display.print_adv(text, posx, posy, fg, bg, font) return self def pixel(self, x, y, *, col=None): diff --git a/pycardium/modules/qstrdefs.h b/pycardium/modules/qstrdefs.h index d789c873..521e5c59 100644 --- a/pycardium/modules/qstrdefs.h +++ b/pycardium/modules/qstrdefs.h @@ -85,6 +85,7 @@ Q(read_thermistor_voltage) Q(sys_display) Q(display) Q(print) +Q(print_adv) Q(pixel) Q(backlight) Q(line) diff --git a/pycardium/modules/sys_display.c b/pycardium/modules/sys_display.c index f5523d54..4f92ab92 100644 --- a/pycardium/modules/sys_display.c +++ b/pycardium/modules/sys_display.c @@ -53,6 +53,30 @@ static MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN( display_print_obj, 5, 5, mp_display_print ); +/* print something on the display */ +static mp_obj_t mp_display_print_adv(size_t n_args, const mp_obj_t *args) +{ + if (!mp_obj_is_str_or_bytes(args[0])) { + mp_raise_TypeError("input text must be a string"); + } + GET_STR_DATA_LEN(args[0], print, print_len); + uint32_t posx = mp_obj_get_int(args[1]); + uint32_t posy = mp_obj_get_int(args[2]); + uint32_t fg = get_color(args[3]); + uint32_t bg = get_color(args[4]); + uint8_t fontName = mp_obj_get_int(args[5]); + int res = epic_disp_print_adv( + fontName, posx, posy, (const char *)print, fg, bg + ); + if (res < 0) { + mp_raise_OSError(-res); + } + return mp_const_none; +} +static MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN( + display_print_adv_obj, 6, 6, mp_display_print_adv +); + /* draw pixel on the display */ static mp_obj_t mp_display_pixel(size_t n_args, const mp_obj_t *args) { @@ -234,6 +258,7 @@ static const mp_rom_map_elem_t display_module_globals_table[] = { { MP_ROM_QSTR(MP_QSTR_open), MP_ROM_PTR(&display_open_obj) }, { MP_ROM_QSTR(MP_QSTR_close), MP_ROM_PTR(&display_close_obj) }, { MP_ROM_QSTR(MP_QSTR_print), MP_ROM_PTR(&display_print_obj) }, + { MP_ROM_QSTR(MP_QSTR_print_adv), MP_ROM_PTR(&display_print_adv_obj) }, { MP_ROM_QSTR(MP_QSTR_pixel), MP_ROM_PTR(&display_pixel_obj) }, { MP_ROM_QSTR(MP_QSTR_backlight), MP_ROM_PTR(&display_backlight_obj) }, { MP_ROM_QSTR(MP_QSTR_line), MP_ROM_PTR(&display_line_obj) }, -- GitLab From c3dd02530ac58edb9abccaad3c0c7ae1a22e89de Mon Sep 17 00:00:00 2001 From: Hinerk Date: Fri, 23 Aug 2019 15:24:10 +0200 Subject: [PATCH 02/10] adjust module help text to match ReST --- pycardium/modules/py/display.py | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/pycardium/modules/py/display.py b/pycardium/modules/py/display.py index bf806628..f0a46fc6 100644 --- a/pycardium/modules/py/display.py +++ b/pycardium/modules/py/display.py @@ -79,18 +79,22 @@ class Display: :param posy: Y-Position of the first character, 0 <= posy <= 80 :param font: 0 <= font <= 4 (currently) selects a font - avaiable Fonts: - - - display.FONT8 - - display.FONT12 - - display.FONT16 - - display.FONT20 - - display.FONT24 - - >>> with display.open() as d: - ... d.clear() - ... d.print('Hello Earth!', font=display.FONT24) - ... d.update() + Avaiable Fonts: + + - :py:data:`display.FONT8` + - :py:data:`display.FONT12` + - :py:data:`display.FONT16` + - :py:data:`display.FONT20` + - :py:data:`display.FONT24` + + **Example:** + + .. code-block:: python + + with display.open() as d: + d.clear() + d.print('Hello Earth!', font=display.FONT24) + d.update() """ fg = fg or color.WHITE bg = bg or color.BLACK -- GitLab From 1fb264c92f6f70b5a5d921ee1d0560622959de1c Mon Sep 17 00:00:00 2001 From: Hinerk Date: Fri, 23 Aug 2019 15:34:09 +0200 Subject: [PATCH 03/10] no typedef and fonts to MACRO_CASE --- epicardium/epicardium.h | 37 ++++++++++++++++++------------------ epicardium/modules/display.c | 10 +++++----- 2 files changed, 23 insertions(+), 24 deletions(-) diff --git a/epicardium/epicardium.h b/epicardium/epicardium.h index 8827b1b2..c1c2d97f 100644 --- a/epicardium/epicardium.h +++ b/epicardium/epicardium.h @@ -1224,6 +1224,17 @@ API(API_DISP_PRINT, uint16_t bg) ); +/* + * Font Selection + */ +enum disp_font_name { + DISP_FONT12, + DISP_FONT16, + DISP_FONT20, + DISP_FONT24, + DISP_FONT8 +}; + /** * Prints a string into the display framebuffer with font type selectable * @@ -1238,14 +1249,14 @@ API(API_DISP_PRINT, * - ``-EBUSY``: Display was already locked from another task. */ API(API_DISP_PRINT_ADV, - int epic_disp_print_adv( + int epic_disp_print_adv( uint8_t fontName, - uint16_t posx, - uint16_t posy, - const char *pString, - uint16_t fg, - uint16_t bg) - ); + uint16_t posx, + uint16_t posy, + const char *pString, + uint16_t fg, + uint16_t bg) +); /** * Fills the whole screen with one color @@ -1650,16 +1661,4 @@ API_ISR(EPIC_INT_RTC_ALARM, epic_isr_rtc_alarm); */ API(API_TRNG_READ, int epic_trng_read(uint8_t *dest, size_t size)); -/* - * Font Selection - */ -typedef enum -{ - fn_font12, - fn_font16, - fn_font20, - fn_font24, - fn_font8 -} FontName; - #endif /* _EPICARDIUM_H */ diff --git a/epicardium/modules/display.c b/epicardium/modules/display.c index 6a85d91e..213fbac0 100644 --- a/epicardium/modules/display.c +++ b/epicardium/modules/display.c @@ -55,19 +55,19 @@ int epic_disp_print_adv( * sexier, but I do not know C-Language */ switch (fontName) { - case fn_font12: + case DISP_FONT12: font = &Font12; break; - case fn_font16: + case DISP_FONT16: font = &Font16; break; - case fn_font20: + case DISP_FONT20: font = &Font20; break; - case fn_font24: + case DISP_FONT24: font = &Font24; break; - case fn_font8: + case DISP_FONT8: font = &Font8; break; default: -- GitLab From 1a8485332cc9e5dfde25ce5a9849038a77e47743 Mon Sep 17 00:00:00 2001 From: Hinerk Date: Fri, 23 Aug 2019 18:07:46 +0200 Subject: [PATCH 04/10] render all sFONT uses const --- epicardium/epicardium.h | 2 +- epicardium/modules/display.c | 39 ++++++++++++------------------------ 2 files changed, 14 insertions(+), 27 deletions(-) diff --git a/epicardium/epicardium.h b/epicardium/epicardium.h index c1c2d97f..2c6ec974 100644 --- a/epicardium/epicardium.h +++ b/epicardium/epicardium.h @@ -1250,7 +1250,7 @@ enum disp_font_name { */ API(API_DISP_PRINT_ADV, int epic_disp_print_adv( - uint8_t fontName, + uint8_t font, uint16_t posx, uint16_t posy, const char *pString, diff --git a/epicardium/modules/display.c b/epicardium/modules/display.c index 213fbac0..ff5c6faa 100644 --- a/epicardium/modules/display.c +++ b/epicardium/modules/display.c @@ -37,43 +37,30 @@ int epic_disp_print( } } +static const sFONT *font_map[] = { + [DISP_FONT12] = &Font12, + [DISP_FONT16] = &Font16, + [DISP_FONT20] = &Font20, + [DISP_FONT24] = &Font24, + [DISP_FONT8] = &Font8, +}; + int epic_disp_print_adv( - uint8_t fontName, + uint8_t font, uint16_t posx, uint16_t posy, const char *pString, uint16_t fg, uint16_t bg ) { - sFONT *font; int cl = check_lock(); + if (font >= sizeof(font_map)) { + return -EINVAL; + } if (cl < 0) { return cl; } else { - /* - * this likely can be established with much less effort or at least - * sexier, but I do not know C-Language - */ - switch (fontName) { - case DISP_FONT12: - font = &Font12; - break; - case DISP_FONT16: - font = &Font16; - break; - case DISP_FONT20: - font = &Font20; - break; - case DISP_FONT24: - font = &Font24; - break; - case DISP_FONT8: - font = &Font8; - break; - default: - return -1; - } - gfx_puts(font, &display_screen, posx, posy, pString, fg, bg); + gfx_puts(font_map[font], &display_screen, posx, posy, pString, fg, bg); return 0; } } -- GitLab From cf8169e5f225e5c1a8f047f7a0c93055198af502 Mon Sep 17 00:00:00 2001 From: Hinerk Date: Fri, 23 Aug 2019 18:16:19 +0200 Subject: [PATCH 05/10] satisfying annoyatron ... ... and adding to forgotten files --- epicardium/modules/display.c | 16 +++++++++++----- lib/gfx/gfx.c | 6 +++--- lib/gfx/gfx.h | 4 ++-- 3 files changed, 16 insertions(+), 10 deletions(-) diff --git a/epicardium/modules/display.c b/epicardium/modules/display.c index ff5c6faa..405e8d59 100644 --- a/epicardium/modules/display.c +++ b/epicardium/modules/display.c @@ -38,10 +38,8 @@ int epic_disp_print( } static const sFONT *font_map[] = { - [DISP_FONT12] = &Font12, - [DISP_FONT16] = &Font16, - [DISP_FONT20] = &Font20, - [DISP_FONT24] = &Font24, + [DISP_FONT12] = &Font12, [DISP_FONT16] = &Font16, + [DISP_FONT20] = &Font20, [DISP_FONT24] = &Font24, [DISP_FONT8] = &Font8, }; @@ -60,7 +58,15 @@ int epic_disp_print_adv( if (cl < 0) { return cl; } else { - gfx_puts(font_map[font], &display_screen, posx, posy, pString, fg, bg); + gfx_puts( + font_map[font], + &display_screen, + posx, + posy, + pString, + fg, + bg + ); return 0; } } diff --git a/lib/gfx/gfx.c b/lib/gfx/gfx.c index 55f1debf..5aaff518 100644 --- a/lib/gfx/gfx.c +++ b/lib/gfx/gfx.c @@ -33,7 +33,7 @@ struct gfx_region gfx_screen(struct framebuffer *fb) return r; } -static inline int letter_bit(sFONT *font, char c, int x, int y) +static inline int letter_bit(const sFONT *font, char c, int x, int y) { if (x < 0 || y < 0) return 0; @@ -53,7 +53,7 @@ static inline int letter_bit(sFONT *font, char c, int x, int y) } void gfx_putchar( - sFONT *font, + const sFONT *font, struct gfx_region *r, int x, int y, @@ -78,7 +78,7 @@ void gfx_putchar( } void gfx_puts( - sFONT *font, + const sFONT *font, struct gfx_region *r, int x, int y, diff --git a/lib/gfx/gfx.h b/lib/gfx/gfx.h index 428b196c..0f64a429 100644 --- a/lib/gfx/gfx.h +++ b/lib/gfx/gfx.h @@ -14,9 +14,9 @@ struct gfx_region { void gfx_setpixel(struct gfx_region *r, int x, int y, Color c); struct gfx_region gfx_screen(struct framebuffer *fb); -void gfx_putchar(sFONT *font, struct gfx_region *reg, int x, int y, char ch, +void gfx_putchar(const sFONT *font, struct gfx_region *reg, int x, int y, char ch, Color fg, Color bg); -void gfx_puts(sFONT *font, struct gfx_region *reg, int x, int y, +void gfx_puts(const sFONT *font, struct gfx_region *reg, int x, int y, const char *str, Color fg, Color bg); Color gfx_color_rgb_f(struct gfx_region *reg, float r, float g, float b); Color gfx_color_rgb(struct gfx_region *reg, uint8_t r, uint8_t g, uint8_t b); -- GitLab From 0425c29dc9778eb4e9896901651fcedf928e8d56 Mon Sep 17 00:00:00 2001 From: Hinerk Date: Fri, 23 Aug 2019 18:24:52 +0200 Subject: [PATCH 06/10] explicit numbering in disp_font_name enum --- epicardium/epicardium.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/epicardium/epicardium.h b/epicardium/epicardium.h index 2c6ec974..94ab4e81 100644 --- a/epicardium/epicardium.h +++ b/epicardium/epicardium.h @@ -1228,11 +1228,11 @@ API(API_DISP_PRINT, * Font Selection */ enum disp_font_name { - DISP_FONT12, - DISP_FONT16, - DISP_FONT20, - DISP_FONT24, - DISP_FONT8 + DISP_FONT12 = 0, + DISP_FONT16 = 1, + DISP_FONT20 = 2, + DISP_FONT24 = 3, + DISP_FONT8 = 4 }; /** -- GitLab From 7558f5dc6722d6cc5afc318a78e25828fd89bbca Mon Sep 17 00:00:00 2001 From: Hinerk Date: Fri, 23 Aug 2019 18:34:57 +0200 Subject: [PATCH 07/10] fixed the integrity check --- epicardium/modules/display.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/epicardium/modules/display.c b/epicardium/modules/display.c index 405e8d59..dcf48bfb 100644 --- a/epicardium/modules/display.c +++ b/epicardium/modules/display.c @@ -52,7 +52,7 @@ int epic_disp_print_adv( uint16_t bg ) { int cl = check_lock(); - if (font >= sizeof(font_map)) { + if (font >= (sizeof(font_map) / sizeof(sFONT*))) { return -EINVAL; } if (cl < 0) { -- GitLab From de8885c75d2f6048e37da11dfd3c3bfedce6070a Mon Sep 17 00:00:00 2001 From: Hinerk Date: Fri, 23 Aug 2019 18:41:25 +0200 Subject: [PATCH 08/10] c'mon annoyatron --- epicardium/modules/display.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/epicardium/modules/display.c b/epicardium/modules/display.c index dcf48bfb..d58fd7de 100644 --- a/epicardium/modules/display.c +++ b/epicardium/modules/display.c @@ -52,7 +52,7 @@ int epic_disp_print_adv( uint16_t bg ) { int cl = check_lock(); - if (font >= (sizeof(font_map) / sizeof(sFONT*))) { + if (font >= (sizeof(font_map) / sizeof(sFONT *))) { return -EINVAL; } if (cl < 0) { -- GitLab From 2d5ca00f83f48b27cfdeb77b2c7f867c9df64f70 Mon Sep 17 00:00:00 2001 From: Hinerk Date: Sat, 24 Aug 2019 20:31:18 +0200 Subject: [PATCH 09/10] make epic_disp_print a call to epic_disp_print_adv --- epicardium/modules/display.c | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/epicardium/modules/display.c b/epicardium/modules/display.c index d58fd7de..67569c6b 100644 --- a/epicardium/modules/display.c +++ b/epicardium/modules/display.c @@ -28,13 +28,7 @@ int epic_disp_print( uint16_t fg, uint16_t bg ) { - int cl = check_lock(); - if (cl < 0) { - return cl; - } else { - gfx_puts(&Font20, &display_screen, posx, posy, pString, fg, bg); - return 0; - } + return epic_disp_print_adv(DISP_FONT20, posx, posy, pString, fg, bg); } static const sFONT *font_map[] = { -- GitLab From 87846bbe55f8f9f74bb47d58f3f05ac609a2553b Mon Sep 17 00:00:00 2001 From: Hinerk Date: Sat, 24 Aug 2019 20:43:14 +0200 Subject: [PATCH 10/10] change font numbering --- epicardium/epicardium.h | 10 +++++----- epicardium/modules/display.c | 6 +++--- pycardium/modules/py/display.py | 10 +++++----- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/epicardium/epicardium.h b/epicardium/epicardium.h index 94ab4e81..983428bc 100644 --- a/epicardium/epicardium.h +++ b/epicardium/epicardium.h @@ -1228,11 +1228,11 @@ API(API_DISP_PRINT, * Font Selection */ enum disp_font_name { - DISP_FONT12 = 0, - DISP_FONT16 = 1, - DISP_FONT20 = 2, - DISP_FONT24 = 3, - DISP_FONT8 = 4 + DISP_FONT8 = 0, + DISP_FONT12 = 1, + DISP_FONT16 = 2, + DISP_FONT20 = 3, + DISP_FONT24 = 4, }; /** diff --git a/epicardium/modules/display.c b/epicardium/modules/display.c index 67569c6b..4cb74f40 100644 --- a/epicardium/modules/display.c +++ b/epicardium/modules/display.c @@ -32,9 +32,9 @@ int epic_disp_print( } static const sFONT *font_map[] = { - [DISP_FONT12] = &Font12, [DISP_FONT16] = &Font16, - [DISP_FONT20] = &Font20, [DISP_FONT24] = &Font24, - [DISP_FONT8] = &Font8, + [DISP_FONT8] = &Font8, [DISP_FONT12] = &Font12, + [DISP_FONT16] = &Font16, [DISP_FONT20] = &Font20, + [DISP_FONT24] = &Font24, }; int epic_disp_print_adv( diff --git a/pycardium/modules/py/display.py b/pycardium/modules/py/display.py index f0a46fc6..7b51cef3 100644 --- a/pycardium/modules/py/display.py +++ b/pycardium/modules/py/display.py @@ -2,11 +2,11 @@ import sys_display import color # font enumeration -FONT12 = 0 -FONT16 = 1 -FONT20 = 2 -FONT24 = 3 -FONT8 = 4 +FONT8 = 0 +FONT12 = 1 +FONT16 = 2 +FONT20 = 3 +FONT24 = 4 class Display: -- GitLab