diff --git a/openrtx/src/main.c b/openrtx/src/main.c index accd6322..39f0314b 100644 --- a/openrtx/src/main.c +++ b/openrtx/src/main.c @@ -29,7 +29,8 @@ #include /* 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); } diff --git a/openrtx/src/threads.c b/openrtx/src/threads.c index e0371ab8..17f499dd 100644 --- a/openrtx/src/threads.c +++ b/openrtx/src/threads.c @@ -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 diff --git a/platform/drivers/display/HX83XX_MDx.c b/platform/drivers/display/HX83XX_MDx.c index 14bad57c..a599fa19 100644 --- a/platform/drivers/display/HX83XX_MDx.c +++ b/platform/drivers/display/HX83XX_MDx.c @@ -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()