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:
parent
e0d5d8278d
commit
6ca3faceaf
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
Loading…
Reference in New Issue