Commit 965904ea authored by Hinerk's avatar Hinerk Committed by Rahix
Browse files

feat(display): Add API-call to print with different fonts

parent 69b55ee7
...@@ -54,6 +54,7 @@ typedef _Bool bool; ...@@ -54,6 +54,7 @@ typedef _Bool bool;
#define API_DISP_PIXEL 0x28 #define API_DISP_PIXEL 0x28
#define API_DISP_FRAMEBUFFER 0x29 #define API_DISP_FRAMEBUFFER 0x29
#define API_DISP_BACKLIGHT 0x2a #define API_DISP_BACKLIGHT 0x2a
#define API_DISP_PRINT_ADV 0x2b
/* API_BATTERY_VOLTAGE 0x30 */ /* API_BATTERY_VOLTAGE 0x30 */
#define API_BATTERY_CURRENT 0x31 #define API_BATTERY_CURRENT 0x31
...@@ -1239,6 +1240,40 @@ API(API_DISP_PRINT, ...@@ -1239,6 +1240,40 @@ API(API_DISP_PRINT,
uint16_t bg) uint16_t bg)
); );
/*
* Font Selection
*/
enum disp_font_name {
DISP_FONT8 = 0,
DISP_FONT12 = 1,
DISP_FONT16 = 2,
DISP_FONT20 = 3,
DISP_FONT24 = 4,
};
/**
* 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 font,
uint16_t posx,
uint16_t posy,
const char *pString,
uint16_t fg,
uint16_t bg)
);
/** /**
* Fills the whole screen with one color * Fills the whole screen with one color
* *
......
...@@ -27,12 +27,40 @@ int epic_disp_print( ...@@ -27,12 +27,40 @@ int epic_disp_print(
const char *pString, const char *pString,
uint16_t fg, uint16_t fg,
uint16_t bg uint16_t bg
) {
return epic_disp_print_adv(DISP_FONT20, posx, posy, pString, fg, bg);
}
static const sFONT *font_map[] = {
[DISP_FONT8] = &Font8, [DISP_FONT12] = &Font12,
[DISP_FONT16] = &Font16, [DISP_FONT20] = &Font20,
[DISP_FONT24] = &Font24,
};
int epic_disp_print_adv(
uint8_t font,
uint16_t posx,
uint16_t posy,
const char *pString,
uint16_t fg,
uint16_t bg
) { ) {
int cl = check_lock(); int cl = check_lock();
if (font >= (sizeof(font_map) / sizeof(sFONT *))) {
return -EINVAL;
}
if (cl < 0) { if (cl < 0) {
return cl; return cl;
} else { } else {
gfx_puts(&Font20, &display_screen, posx, posy, pString, fg, bg); gfx_puts(
font_map[font],
&display_screen,
posx,
posy,
pString,
fg,
bg
);
return 0; return 0;
} }
} }
......
...@@ -33,7 +33,7 @@ struct gfx_region gfx_screen(struct framebuffer *fb) ...@@ -33,7 +33,7 @@ struct gfx_region gfx_screen(struct framebuffer *fb)
return r; 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) if (x < 0 || y < 0)
return 0; return 0;
...@@ -53,7 +53,7 @@ static inline int letter_bit(sFONT *font, char c, int x, int y) ...@@ -53,7 +53,7 @@ static inline int letter_bit(sFONT *font, char c, int x, int y)
} }
void gfx_putchar( void gfx_putchar(
sFONT *font, const sFONT *font,
struct gfx_region *r, struct gfx_region *r,
int x, int x,
int y, int y,
...@@ -78,7 +78,7 @@ void gfx_putchar( ...@@ -78,7 +78,7 @@ void gfx_putchar(
} }
void gfx_puts( void gfx_puts(
sFONT *font, const sFONT *font,
struct gfx_region *r, struct gfx_region *r,
int x, int x,
int y, int y,
......
...@@ -14,9 +14,9 @@ struct gfx_region { ...@@ -14,9 +14,9 @@ struct gfx_region {
void gfx_setpixel(struct gfx_region *r, int x, int y, Color c); void gfx_setpixel(struct gfx_region *r, int x, int y, Color c);
struct gfx_region gfx_screen(struct framebuffer *fb); 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); 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); 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_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); Color gfx_color_rgb(struct gfx_region *reg, uint8_t r, uint8_t g, uint8_t b);
......
import sys_display import sys_display
import color import color
# font enumeration
FONT8 = 0
FONT12 = 1
FONT16 = 2
FONT20 = 3
FONT24 = 4
class Display: class Display:
""" """
...@@ -61,7 +68,7 @@ class Display: ...@@ -61,7 +68,7 @@ class Display:
sys_display.clear(col) sys_display.clear(col)
return self 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 Prints a string on the display. Font size is locked to 20px
...@@ -70,11 +77,29 @@ class Display: ...@@ -70,11 +77,29 @@ class Display:
:param bg: Background color (expects RGB triple) :param bg: Background color (expects RGB triple)
:param posx: X-Position of the first character, 0 <= posx <= 160 :param posx: X-Position of the first character, 0 <= posx <= 160
:param posy: Y-Position of the first character, 0 <= posy <= 80 :param posy: Y-Position of the first character, 0 <= posy <= 80
:param font: 0 <= font <= 4 (currently) selects a font
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 fg = fg or color.WHITE
bg = bg or color.BLACK 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 return self
def pixel(self, x, y, *, col=None): def pixel(self, x, y, *, col=None):
......
...@@ -85,6 +85,7 @@ Q(read_thermistor_voltage) ...@@ -85,6 +85,7 @@ Q(read_thermistor_voltage)
Q(sys_display) Q(sys_display)
Q(display) Q(display)
Q(print) Q(print)
Q(print_adv)
Q(pixel) Q(pixel)
Q(backlight) Q(backlight)
Q(line) Q(line)
......
...@@ -53,6 +53,30 @@ static MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN( ...@@ -53,6 +53,30 @@ static MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(
display_print_obj, 5, 5, mp_display_print 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 */ /* draw pixel on the display */
static mp_obj_t mp_display_pixel(size_t n_args, const mp_obj_t *args) 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[] = { ...@@ -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_open), MP_ROM_PTR(&display_open_obj) },
{ MP_ROM_QSTR(MP_QSTR_close), MP_ROM_PTR(&display_close_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), 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_pixel), MP_ROM_PTR(&display_pixel_obj) },
{ MP_ROM_QSTR(MP_QSTR_backlight), MP_ROM_PTR(&display_backlight_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) }, { MP_ROM_QSTR(MP_QSTR_line), MP_ROM_PTR(&display_line_obj) },
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment