Made calls to 'display_renderRows' and 'display_render' blocking, thus not requiring anymore to busy wiat on 'display_renderingInProgress'. Modifications involved only MDx display driver, the others were already blocking.

This commit is contained in:
Silvano Seva 2020-12-12 10:16:26 +01:00
parent e0d5d8278d
commit 6ca3faceaf
3 changed files with 18 additions and 6 deletions

View File

@ -29,7 +29,8 @@
#include <hwconfig.h>
/* If battery level is below 0% draw low battery screen, wait and shutdown */
void check_battery() {
void check_battery()
{
OS_ERR os_err;
// Check battery percentage
@ -37,7 +38,8 @@ void check_battery() {
float charge = battery_getCharge(vbat);
// Draw low battery screen
if (charge <= 0) {
if (charge <= 0)
{
ui_drawLowBatteryScreen();
gfx_render();
@ -67,7 +69,6 @@ int main(void)
// Display splash screen
ui_drawSplashScreen();
gfx_render();
while(gfx_renderingInProgress());
// Wait 30ms before turning on backlight to hide random pixels on screen
OSTimeDlyHMSM(0u, 0u, 0u, 30u, OS_OPT_TIME_HMSM_STRICT, &os_err);
@ -80,7 +81,8 @@ int main(void)
create_threads();
// Auxiliary functions loop
while(true) {
while(true)
{
check_battery();
OSTimeDlyHMSM(0u, 1u, 0u, 0u, OS_OPT_TIME_HMSM_STRICT, &os_err);
}

View File

@ -87,7 +87,6 @@ static void ui_task(void *arg)
// Initial GUI draw
ui_updateGUI(last_state);
gfx_render();
while(gfx_renderingInProgress());
while(1)
{
@ -112,7 +111,6 @@ static void ui_task(void *arg)
if(renderNeeded)
{
gfx_render();
while(gfx_renderingInProgress());
}
// We don't need a delay because we lock on incoming events

View File

@ -92,12 +92,15 @@
* Pixel format is RGB565, 16 bit per pixel
*/
static uint16_t frameBuffer[SCREEN_WIDTH * SCREEN_HEIGHT];
OS_FLAG_GRP renderCompleted;
OS_ERR err;
void __attribute__((used)) DMA2_Stream7_IRQHandler()
{
OSIntEnter();
DMA2->HIFCR |= DMA_HIFCR_CTCIF7 | DMA_HIFCR_CTEIF7; /* Clear flags */
gpio_setPin(LCD_CS);
OSFlagPost(&renderCompleted, 0x01, OS_OPT_POST_FLAG_SET, &err);
OSIntExit();
}
@ -113,6 +116,9 @@ static inline __attribute__((__always_inline__)) void writeData(uint8_t val)
void display_init()
{
/* Create flag for render completion wait */
OSFlagCreate(&renderCompleted, "", 0, &err);
/* Clear framebuffer, setting all pixels to 0xFFFF makes the screen white */
memset(frameBuffer, 0xFF, SCREEN_WIDTH * SCREEN_HEIGHT * sizeof(uint16_t));
@ -321,6 +327,8 @@ void display_init()
void display_terminate()
{
OSFlagDel(&renderCompleted, OS_OPT_DEL_NO_PEND, &err);
/* Shut off FSMC and deallocate framebuffer */
RCC->AHB3ENR &= ~RCC_AHB3ENR_FSMCEN;
__DSB();
@ -386,6 +394,10 @@ void display_renderRows(uint8_t startRow, uint8_t endRow)
| DMA_SxCR_TCIE /* Transfer complete interrupt */
| DMA_SxCR_TEIE /* Transfer error interrupt */
| DMA_SxCR_EN; /* Start transfer */
OSFlagPend(&renderCompleted, 0x01, 0, OS_OPT_PEND_FLAG_SET_ANY |
OS_OPT_PEND_FLAG_CONSUME |
OS_OPT_PEND_BLOCKING, NULL, &err);
}
void display_render()