diff --git a/project/Core/Inc/lcd_api.h b/project/Core/Inc/lcd_api.h index 77a297f..bf37e9d 100644 --- a/project/Core/Inc/lcd_api.h +++ b/project/Core/Inc/lcd_api.h @@ -47,11 +47,11 @@ #define LCD_RGB565 0x00000002U #define LCD_ARGB1555 0x00000003U -#define LCD_FONT8 &Font8 -#define LCD_FONT12 &Font12 -#define LCD_FONT16 &Font16 -#define LCD_FONT20 &Font20 -#define LCD_FONT24 &Font24 +#define LCD_FONT8 (&Font8) +#define LCD_FONT12 (&Font12) +#define LCD_FONT16 (&Font16) +#define LCD_FONT20 (&Font20) +#define LCD_FONT24 (&Font24) extern LTDC_HandleTypeDef hLtdcHandler; @@ -101,9 +101,9 @@ void lcd_draw_raw_img(const void* p_src, uint32_t x_pos, uint32_t y_pos, uint32_ * Draw BMP image from C array to the LCD screen at position X, Y. In color mode ARGB8888, RGB888, RGB565 or ARGB1555 * Supports ARGB8888, RGB565, RGB888 * + * @param[in] bmp_buff BMP file data * @param[in] x_pos X-position * @param[in] y_pos Y-position - * @param[in] BMP file data */ void lcd_draw_bmp_img(uint8_t* bmp_buff, uint32_t x_pos, uint32_t y_pos); @@ -112,9 +112,9 @@ void lcd_draw_bmp_img(uint8_t* bmp_buff, uint32_t x_pos, uint32_t y_pos); * Draw BMP image from C array to the LCD screen at position X, Y by specifying the BMP image name on the filesystem * Supports ARGB8888, RGB565, RGB888 * + * @param[in] name Name of image on filesystem * @param[in] x_pos X-position * @param[in] y_pos Y-position - * @param[in] BMP file data */ void lcd_draw_img_from_fs_with_name(const char* name, uint32_t x_pos, uint32_t y_pos); diff --git a/project/Core/Src/lcd_api.c b/project/Core/Src/lcd_api.c index 740e0c7..310b558 100644 --- a/project/Core/Src/lcd_api.c +++ b/project/Core/Src/lcd_api.c @@ -2,7 +2,6 @@ * @file lcd_api.c * @brief LCD API implementation * @author Tim S. - * @todo Implement function to read images from fs */ #include "lcd_api.h" @@ -15,7 +14,7 @@ void lcd_init(bool bl_on) { BSP_LCD_Init(); BSP_LCD_LayerDefaultInit(1, LCD_FB_START_ADDRESS); - BSP_LCD_LayerDefaultInit(0, LCD_FB_START_ADDRESS + (BSP_LCD_GetXSize() * BSP_LCD_GetYSize() * 4)); + BSP_LCD_LayerDefaultInit(0, LCD_FB_START_ADDRESS + (BSP_LCD_GetXSize()*BSP_LCD_GetYSize()*4)); BSP_LCD_SelectLayer(0); BSP_LCD_Clear(LCD_COLOR_BLACK); BSP_LCD_SelectLayer(1); @@ -24,12 +23,12 @@ void lcd_init(bool bl_on) { HAL_GPIO_WritePin(GPIOK, GPIO_PIN_3, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOI, GPIO_PIN_12, GPIO_PIN_SET); } else { - HAL_GPIO_WritePin(GPIOK, GPIO_PIN_3, GPIO_PIN_RESET); - HAL_GPIO_WritePin(GPIOI, GPIO_PIN_12, GPIO_PIN_RESET); + HAL_GPIO_WritePin(GPIOK, GPIO_PIN_3, GPIO_PIN_RESET); + HAL_GPIO_WritePin(GPIOI, GPIO_PIN_12, GPIO_PIN_RESET); } } -void lcd_display_text(uint8_t* text, uint16_t x_pos, uint16_t y_pos, uint32_t color, uint32_t bg_color, sFONT* font) { +void lcd_display_text(uint8_t* text, uint16_t x_pos, uint16_t y_pos, uint32_t color, uint32_t bg_color, sFONT *font) { LOG_INFO(TAG, "Display text: %s @x=%d,y=%d", text, x_pos, y_pos); uint16_t tot_length = x_pos + (strlen(text) * font->Width); @@ -43,8 +42,8 @@ void lcd_display_text(uint8_t* text, uint16_t x_pos, uint16_t y_pos, uint32_t co if (tot_length > BSP_LCD_GetXSize()) { for (int i = 0; i < strlen(text); i++) { - if ((x_pos) > BSP_LCD_GetXSize() - (font->Width) * 2) { - if (isalpha(text[i - 1]) && isalpha(text[i])) { + if ((x_pos) > BSP_LCD_GetXSize() - (font->Width)*2) { + if (isalpha(text[i-1]) && isalpha(text[i])) { BSP_LCD_DisplayChar(x_pos, y_pos, '-'); i -= 1; } @@ -55,23 +54,21 @@ void lcd_display_text(uint8_t* text, uint16_t x_pos, uint16_t y_pos, uint32_t co x_pos += font->Width; } } - return; + } else { + BSP_LCD_DisplayStringAt(x_pos, y_pos, text, LEFT_MODE); } - BSP_LCD_DisplayStringAt(x_pos, y_pos, text, LEFT_MODE); + } -void lcd_draw_raw_img(const void* p_src, - uint32_t x_pos, - uint32_t y_pos, - uint32_t x_size, - uint32_t y_size, - uint32_t color_mode) { - uint32_t address = hLtdcHandler.LayerCfg[1].FBStartAdress + (((BSP_LCD_GetXSize() * y_pos) + x_pos) * (4)); - void* p_dst = (void*)address; +void lcd_draw_raw_img(const void* p_src, uint32_t x_pos, uint32_t y_pos, uint32_t x_size, uint32_t y_size, uint32_t color_mode) { - hDma2dHandler2.Init.Mode = DMA2D_M2M_PFC; - hDma2dHandler2.Init.ColorMode = DMA2D_ARGB8888; - hDma2dHandler2.Init.OutputOffset = BSP_LCD_GetXSize() - x_size; + uint32_t address = hLtdcHandler.LayerCfg[1].FBStartAdress + (((BSP_LCD_GetXSize()*y_pos) + x_pos)*(4)); + void *p_dst = (void *)address; + + + hDma2dHandler2.Init.Mode = DMA2D_M2M_PFC; + hDma2dHandler2.Init.ColorMode = DMA2D_ARGB8888; + hDma2dHandler2.Init.OutputOffset = BSP_LCD_GetXSize()-x_size; hDma2dHandler2.LayerCfg[1].AlphaMode = DMA2D_NO_MODIF_ALPHA; hDma2dHandler2.LayerCfg[1].InputAlpha = 0xFF; @@ -86,7 +83,7 @@ void lcd_draw_raw_img(const void* p_src, } LOG_INFO(TAG, "DMA2D config layer"); if (HAL_DMA2D_ConfigLayer(&hDma2dHandler2, 1) != HAL_OK) { - LOG_CRIT(TAG, "HAL_DMA2D_ConfigLayer error"); + LOG_CRIT(TAG, "HAL_DMA2D_ConfigLayer error"); return; } LOG_INFO(TAG, "DMA2D start"); @@ -98,11 +95,11 @@ void lcd_draw_raw_img(const void* p_src, HAL_DMA2D_PollForTransfer(&hDma2dHandler2, 10); } -void lcd_draw_bmp_img(uint8_t* bmp_buff, uint32_t x_pos, uint32_t y_pos) { +void lcd_draw_bmp_img(uint8_t* bmp_buff, uint32_t x_pos, uint32_t y_pos){ BSP_LCD_DrawBitmap(x_pos, y_pos, bmp_buff); } -void lcd_draw_img_from_fs_with_name(const char* name, uint32_t x_pos, uint32_t y_pos) { +void lcd_draw_img_from_fs_with_name(const char* name, uint32_t x_pos, uint32_t y_pos){ llfs_file_t* file = llfs_file_open(name); if (file != NULL) { BSP_LCD_DrawBitmap(x_pos, y_pos, file->data); @@ -111,6 +108,6 @@ void lcd_draw_img_from_fs_with_name(const char* name, uint32_t x_pos, uint32_t y } } -void lcd_clear(uint32_t color) { +void lcd_clear(uint32_t color){ BSP_LCD_Clear(color); }