diff --git a/.gitignore b/.gitignore index 3df1e1a..eaac6e2 100644 --- a/.gitignore +++ b/.gitignore @@ -57,5 +57,6 @@ project/project.launch project/Scripts Scripts/ + project/project\ Debug.launch build/ \ No newline at end of file diff --git a/README.md b/README.md index 50b4c82..9e232ed 100644 --- a/README.md +++ b/README.md @@ -58,6 +58,7 @@ If your part needs documentation (e.g. how to use tcp cmd interface), add a mark This folder contains the following documents: - [llfs.md](docs/llfs.md): Linked List File System +- [lcd_api.md](docs/lcd_api.md): LCD API - [logger.md](docs/logger.md): Logging and Debugging Messages - [mkllfs.md](docs/mkllfs.md): Make Linked List File System - [style_guide.md](docs/style_guide.md): Style Guide diff --git a/docs/lcd_api.md b/docs/lcd_api.md index 32c46ae..4e61aca 100644 --- a/docs/lcd_api.md +++ b/docs/lcd_api.md @@ -73,9 +73,9 @@ void main(void) { ``` Display text on the LCD screen in a certain color. When text width exceeds BSP_LCD_GetXSize(), a text wrap will be performed. If the text wrap is between two will be injected. -#### Drawing a BMP (C-array) onto the screen +#### Drawing a 'raw' image onto the screen ```c -void lcd_draw_bmp(const void* p_src, uint32_t x_pos, uint32_t y_pos, uint32_t x_size, uint32_t y_size, uint32_t color_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); ``` ```c @@ -86,7 +86,68 @@ void main(void) { ... lcd_init(true); ... - lcd_draw_bmp(bmp_array, 0, 0, 50, 50, LCD_ARGB8888); + lcd_draw_raw_img(raw_img_array, 0, 0, 50, 50, LCD_ARGB8888); } ``` -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 (see LCD_* defines in header file). +Draw raw image from a C array to the LCD screen at position X, Y. In color mode ARGB8888, RGB888, RGB565 or ARGB1555 Supports ARGB8888, RGB565, RGB888 (see LCD_* defines in header file). + +Note that when an image exceeds the X or Y size of the LCD display, the image will go out of the visible LCD area. + +#### Drawing a BMP image onto the screen +```c +void lcd_draw_bmp_img(uint8_t* bmp_buff, uint32_t x_pos, uint32_t y_pos); +``` + +```c +#include "lcd_api.h" +#include "test_image.h" + +void main(void) { + ... + lcd_init(true); + ... + lcd_draw_bmp_img(bmp_array, 0, 0); + lcd_draw_bmp_img(file->data, 50, 50); +} +``` +Drawing a BMP image (either from filesystem or a C-array) to the LCD screen at position X, Y. The image size and color scheme do not have to be passed as arguments like in the `lcd_draw_raw_img(...)` function, these values are present in the BMP header. + +Note that when an image exceeds the X or Y size of the LCD display, the image will go out of the visible LCD area. + +#### Drawing a BMP from the filesystem to the LCD +```c +void lcd_draw_img_from_fs(const char* name, uint32_t x_pos, uint32_t y_pos); +``` + +```c +#include "lcd_api.h" + +void main(void) { + ... + lcd_init(true); + ... + lcd_draw_img_from_fs("st.bmp", 0, 0); +} +``` + +This function expects the name of the BMP image as argument, together with the X and Y coordinates. + +Note that this function only works for BMP images and not raw images and when an image exceeds the X or Y size of the LCD display, the image will go out of the visible LCD area. + +#### Clearing the LCD screen +```c +void lcd_clear(uint32_t color); +``` + +```c +#include "lcd_api.h" + +void main(void) { + ... + lcd_init(true); + ... + lcd_clear(LCD_BLACK); +} +``` + +Clears the LCD screen to the specified color. diff --git a/project/Core/Inc/lcd_api.h b/project/Core/Inc/lcd_api.h index dee9190..02715f5 100644 --- a/project/Core/Inc/lcd_api.h +++ b/project/Core/Inc/lcd_api.h @@ -13,6 +13,7 @@ #define LOGGER_LEVEL_ALL #include "log.h" #include "../../Drivers/BSP/STM32746G-Discovery/stm32746g_discovery_lcd.h" +#include "llfs.h" #define LCD_BLUE LCD_COLOR_BLUE #define LCD_GREEN LCD_COLOR_GREEN @@ -46,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; @@ -93,7 +94,29 @@ void lcd_display_text(uint8_t* text, uint16_t x_pos, uint16_t y_pos, uint32_t co * @param[in] y_size Height of image * @param[in] color_mode Color mode (see defined color modes above in file) */ -void lcd_draw_bmp(const void* p_src, uint32_t x_pos, uint32_t y_pos, uint32_t x_size, uint32_t y_size, uint32_t color_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); + +/** + * @brief Draw BMP image on screen + * 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 + */ +void lcd_draw_bmp_img(uint8_t* bmp_buff, uint32_t x_pos, uint32_t y_pos); + +/** + * @brief Draw BMP image on screen by specifying the name, the BMP image has in the file system + * 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 + */ +void lcd_draw_img_from_fs(const char* name, uint32_t x_pos, uint32_t y_pos); /** * @brief Clear LCD screen diff --git a/project/Core/Src/lcd_api.c b/project/Core/Src/lcd_api.c index 431a79f..8a6c316 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); @@ -23,10 +22,10 @@ void lcd_init(bool bl_on) { if (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); + return; } + 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) { @@ -43,33 +42,33 @@ 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; + } else { + BSP_LCD_DisplayChar(x_pos, y_pos, text[i]); } x_pos = 0; y_pos += font->Height; - } else { - BSP_LCD_DisplayChar(x_pos, y_pos, text[i]); - x_pos += font->Width; + continue; } + BSP_LCD_DisplayChar(x_pos, y_pos, text[i]); + x_pos += font->Width; } - } else { - BSP_LCD_DisplayStringAt(x_pos, y_pos, text, LEFT_MODE); + return; } - + BSP_LCD_DisplayStringAt(x_pos, y_pos, text, LEFT_MODE); } -void lcd_draw_bmp(const void* p_src, uint32_t x_pos, uint32_t y_pos, uint32_t x_size, uint32_t y_size, uint32_t color_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)); + 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.Init.OutputOffset = BSP_LCD_GetXSize() - x_size; hDma2dHandler2.LayerCfg[1].AlphaMode = DMA2D_NO_MODIF_ALPHA; hDma2dHandler2.LayerCfg[1].InputAlpha = 0xFF; @@ -96,6 +95,19 @@ void lcd_draw_bmp(const void* p_src, uint32_t x_pos, uint32_t y_pos, uint32_t x_ HAL_DMA2D_PollForTransfer(&hDma2dHandler2, 10); } +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(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); + return; + } + LOG_WARN(TAG, "File \"%s\" not found", file->name); +} + void lcd_clear(uint32_t color) { BSP_LCD_Clear(color); } diff --git a/project/project Debug.launch b/project/project Debug.launch deleted file mode 100644 index ccaf85d..0000000 --- a/project/project Debug.launch +++ /dev/null @@ -1,80 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -